web-dev-qa-db-ja.com

ドラフトをwp_dropdown_pagesリストに表示するにはどうすればいいですか?

私は自分のサイトのバックエンドでwp_dropdown_pagesを使って特定の基準に従ってページのリストを生成しています。

リストには、公開された投稿のみが表示され、両方の公開された投稿を表示したいドラフト

標準のワードプレスのドロップダウンでこれを達成する方法を示す他のStack Exchangeスレッドを見つけましたが、これはwp_dropdown_pagesにまで及ぶようには見えません。

標準のドロップダウンで下書きを表示するために使用しているのは、これです。

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

上記はうまくいきます。 wp_dropdown_pagesを使って生成されたカスタムフィールドについても全く同じことをしたいのです。明確にするために、バックエンドでは、私は次のコードを使用してドロップダウンリストを生成しています。

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

上の例では、下書きなしで、私が望む通りのページのドロップダウンリストを生成します。

3

更新

Birgireが以下の彼の回答で指摘しているように、WP function wp_dropdown_pages()で直接これを行うことができるようです: https://wordpress.stackexchange.com/a/240275/ 102371


この解決方法はもっと長く、get_posts()を使って特定の投稿ステータスを取得します。

$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

あなたは使えるはずです

'post_status' => 'publish,draft',

wp_dropdown_pages()では、get_pages()のラッパーであるため、ポストステータスタイプのカンマ区切りのリストを持つpost_status引数をサポートします。

get_pages()のドキュメントについて:

get_pages()post_status引数に関するドキュメントは十分正確ではないようです。それは言います:

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

しかし実際には配列もサポートしているので、次のように書くことができます。

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

私はそれに対処するためにチケット #38136 を提出しました。

1
birgire