web-dev-qa-db-fra.com

ajouter une page statique aux paramètres de lecture pour le type de publication personnalisé

J'ai créé un type de publication personnalisé et je veux laisser l'utilisateur choisir la page statique de la page d'archive. Par exemple, sous la page Publier. J'aimerais ajouter une page de projets: [Dropdown]

Est-il possible d'ajouter une autre option de page statique à la page des paramètres de lecture? Existe-t-il un crochet pour le modifier?

 reading settings 

De même, existe-t-il un moyen de marquer la page sélectionnée de cette manière dans Pages?

 enter image description here 

Mise à jour:

En regardant /wp/wp-admin/includes/template.php:1768

/**
 * Filters the default post display states used in the posts list table.
 *
 * @since 2.8.0
 * @since 3.6.0 Added the `$post` parameter.
 *
 * @param array   $post_states An array of post display states.
 * @param WP_Post $post        The current post object.
 */
$post_states = apply_filters( 'display_post_states', $post_states, $post );

if ( ! empty($post_states) ) {
    $state_count = count($post_states);
    $i = 0;
    echo ' — ';
    foreach ( $post_states as $state ) {
        ++$i;
        ( $i == $state_count ) ? $sep = '' : $sep = ', ';
        echo "<span class='post-state'>$state$sep</span>";
    }
}

Il semble qu'il y ait des points d'ancrage pour le post_state, mais comment le configurez-vous?

Aussi, en regardant /wp-admin/options-reading.php:83

Est-il possible de modifier le paramètre Lecture sans modifier réellement le fichier?

4
YarGnawh

Je ne sais pas s'il est possible d'ajouter un nouveau champ directement sous le champ déroulant "Page des messages". Au moins, je n'ai trouvé aucun moyen de le faire.

Mais vous pouvez simplement ajouter un autre menu déroulant à la page des paramètres de lecture. Ce sera sur le bas tu.

Pour ce faire, nous devons d’abord register notre nouveau paramètre et add a new settings field à la page WordPress reading par défaut:

/**
 * Register and define the settings
 */
add_action('admin_init', 'prfx_admin_init');
function prfx_admin_init(){

    // register our setting
    $args = array(
        'type' => 'string', 
        'sanitize_callback' => 'sanitize_text_field',
        'default' => NULL,
    );
    register_setting( 
        'reading', // option group "reading", default WP group
        'my_project_archive_page', // option name
        $args 
    );

    // add our new setting
    add_settings_field(
        'my_project_archive_page', // ID
        __('Project Archive Page', 'textdomain'), // Title
        'prfx_setting_callback_function', // Callback
        'reading', // page
        'default', // section
        array( 'label_for' => 'my_project_archive_page' )
    );
}

Nous pouvons maintenant créer la fonction de rappel pour notre champ personnalisé, qui contiendra notre balise HTML:

/**
 * Custom field callback
 */
function prfx_setting_callback_function($args){
    // get saved project page ID
    $project_page_id = get_option('my_project_archive_page');

    // get all pages
    $args = array(
        'posts_per_page'   => -1,
        'orderby'          => 'name',
        'order'            => 'ASC',
        'post_type'        => 'page',
    );
    $items = get_posts( $args );

    echo '<select id="my_project_archive_page" name="my_project_archive_page">';
    // empty option as default
    echo '<option value="0">'.__('— Select —', 'wordpress').'</option>';

    // foreach page we create an option element, with the post-ID as value
    foreach($items as $item) {

        // add selected to the option if value is the same as $project_page_id
        $selected = ($project_page_id == $item->ID) ? 'selected="selected"' : '';

        echo '<option value="'.$item->ID.'" '.$selected.'>'.$item->post_title.'</option>';
    }

    echo '</select>';
}

Après cela, vous avez maintenant un nouveau champ déroulant sous Settings> Reading.
Le champ est rempli avec toutes les pages, vous pouvez en sélectionner une et enregistrer le réglage.


Alors maintenant, vous voulez mark cette page sélectionnée dans la liste des pages dans admin. Ces marquages ​​s'appellent state/s. WordPress utilise un filtre pour ajouter ces textes au titre appelé display_post_states.

/**
 * Add custom state to post/page list
 */
add_filter('display_post_states', 'prfx_add_custom_post_states');

function prfx_add_custom_post_states($states) {
    global $post;

    // get saved project page ID
    $project_page_id = get_option('my_project_archive_page');

    // add our custom state after the post title only,
    // if post-type is "page",
    // "$post->ID" matches the "$project_page_id",
    // and "$project_page_id" is not "0"
    if( 'page' == get_post_type($post->ID) && $post->ID == $project_page_id && $project_page_id != '0') {
        $states[] = __('My state', 'textdomain');
    }

    return $states;
}
4
LWS-Mo