it-swarm.com.de

Wie kann ich Entwürfe in der Liste wp_dropdown_pages anzeigen?

Ich benutze wp_dropdown_pages im Backend meiner Site, um eine Liste von Seiten nach bestimmten Kriterien zu generieren.

Die Liste zeigt nurveröffentlichte Beiträgean, wo ich möchte, dass sowohl veröffentlichte Beiträgeals auch Entwürfeangezeigt werden.

Ich habe andere Stack Exchange-Threads gefunden, die zeigen, wie dies in den Standard-WordPress-Dropdowns erreicht werden kann, aber dies scheint sich nicht auf wp_dropdown_pages zu erstrecken.

Was ich verwende, um Entwürfe in den Standard-Dropdowns anzuzeigen, ist Folgendes:

<?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;
    }
?>

Das oben genannte funktioniert großartig. Ich möchte genau das Gleiche für benutzerdefinierte Felder tun, die mit wp_dropdown_pages erstellt wurden. Zur Verdeutlichung generiere ich im Backend eine Dropdown-Liste mit folgendem Code:

<?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 );
?>

Das Obige erzeugt eine Dropdown-Liste von Seiten genau so, wie ich es möchte, nur ohne Entwürfe.

3

Aktualisieren

Es scheint, dass Sie dies direkt mit WP function wp_dropdown_pages() tun können, wie Birgire in seiner Antwort unten ausführt: https://wordpress.stackexchange.com/a/240275/102371


Diese Lösung ist länger und verwendet get_posts (), um bestimmte Post-Status abzurufen.

$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

Sie sollten verwenden können

'post_status' => 'publish,draft',

in wp_dropdown_pages(), da es sich um einen Wrapper für get_pages() handelt, der das Argument post_status mit einer durch Kommas getrennten Liste von Post-Statustypen unterstützt.

Über die Dokumentation von get_pages():

Es sieht so aus, als ob die Dokumentation für das Argument post_status von get_pages() nicht genau genug ist. Es sagt:

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

Aber es unterstützt tatsächlich auch ein Array, so dass wir schreiben können:

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

Ich habe Ticket # 38136 eingereicht, um das zu adressieren.

1
birgire