web-dev-qa-db-fra.com

Comment afficher des brouillons dans la liste wp_dropdown_pages?

J'utilise wp_dropdown_pages dans le backend de mon site pour générer une liste de pages en fonction d'un ensemble de critères spécifique.

La liste ne montre queposts publiésoù j'aimerais afficher les deux articles publiéset les brouillons.

J'ai trouvé d'autres threads Stack Exchange qui montrent comment y parvenir dans les menus déroulants wordpress standard, mais cela ne semble pas s'étendre à wp_dropdown_pages.

Voici ce que j'utilise pour afficher les brouillons dans les listes déroulantes standard:

<?php
    /* Show drafts in dropdown lists */
    add_filter('page_attributes_dropdown_pages_args', 'my_attributes_dropdown_pages_args', 1, 1);
    add_filter('quick_edit_dropdown_pages_args', 'my_attributes_dropdown_pages_args', 1, 1);

    function my_attributes_dropdown_pages_args($dropdown_args) {
        $dropdown_args['post_status'] = array('publish','draft');
        return $dropdown_args;
    }
?>

Ce qui précède fonctionne très bien. Je souhaite faire exactement la même chose pour les champs personnalisés générés à l'aide de wp_dropdown_pages. Pour clarifier, dans le backend, je génère une liste déroulante en utilisant le code suivant:

<?php
    $dropdown_args_food = array(
        'depth'         => '2',
        'selected'      => $selectedFoodType,
        'post_type'     => 'page',
        'name'          => 'selected-food-type',
        'id'            => 'selected-food-type',
        'echo'          => 1,
        'meta_key'      => 'category',
        'meta_value'    => 'food',
        'hierarchical'  => 1,
        'show_option_none'      => ' ',
    );
    wp_dropdown_pages( $dropdown_args_food );
?>

Ce qui précède génère une liste déroulante de pages exactement comme je le souhaite, mais sans brouillons.

3
yyyyyyyyyyyyyyyyy

Mettre à jour

Il semble que vous puissiez le faire directement avec WP function wp_dropdown_pages(), comme le souligne birgire dans sa réponse ci-dessous: https://wordpress.stackexchange.com/a/240275/102371


Cette solution est plus longue et utilise get_posts () pour récupérer des statuts de publication spécifiques.

$pages = get_posts( array( 'post_type' => 'page', 'post_parent' => 0, 'post_status' => array( 'draft', 'publish' ) ) );

echo '<select name="selected-food-type" id="selected-food-type">';
foreach( $pages as $page ) {
    echo '<option value="' . $page->ID . '">' . get_the_title( $page->ID ) . '</option>';
    $children = get_children( 'post_parent='. $page->ID );
    foreach( $children as $subpage ) {
        echo '<option value="' . $subpage->ID . '">&nbsp;&nbsp;&nbsp;' . get_the_title( $subpage->ID ) . '</option>';
    }
}
echo '</select>';
1
Ahmed Fouad

Vous devriez pouvoir utiliser

'post_status' => 'publish,draft',

dans wp_dropdown_pages() puisqu'il s'agit d'un wrapper pour get_pages() qui prend en charge l'argument post_status avec une liste de types d'état de publication séparés par des virgules.

À propos de la documentation de get_pages():

Il semble que la documentation de l'argument post_status de get_pages() ne soit pas assez précise. Ça dit:

* @type string  $post_status  A comma-separated list of post statuses types to include.

Mais il supporte également un tableau, nous pouvons donc écrire:

'post_status' => [ 'publish', 'draft' ],

J'ai classé ticket # 38136 pour résoudre ce problème.

1
birgire