Не получается вывести черновики с помощью WP_Query, используя параметр post_status
У меня не получается вывести черновики с помощью WP_Query, даже когда post_status установлен в 'any' или 'draft'
$args = array(
'p' => 1234,
'post_type' => 'any',
'post_status' => 'any'
);
$query = new WP_Query( $args );
while ( $query->have_posts() ) : $query->the_post();
// отображаем запись
endwhile;
wp_reset_postdata();
Если я публикую запись 1234, WP_Query успешно её находит. Но когда запись находится в статусе черновика, ни параметр any
, ни draft
не работают.
Я читал, что параметр exclude_from_search
в register_post_type()
может предотвращать отображение записей в WP_Query, поэтому я установил его в false для типа записи, с которым работаю:
$args = array(
'labels' => $labels,
'description' => '',
'public' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'show_ui' => true,
'menu_position' => 60,
'menu_icon' => null,
'capability_type' => post,
'hierarchical' => false,
'supports' => array('title', 'editor', 'author', 'excerpt', 'trackbacks', 'custom-fields', 'revisions'),
'rewrite' => true,
'query_var' => true,
'can_export' => true,
'show_in_nav_menus' => true,
);
register_post_type('chart', $args);
Может быть, я что-то упускаю? Не понимаю, почему черновик в этом типе записи не отображается в запросе выше.

Попробуйте передать его в виде массива.
Например
$args = array(
'p' => 1234,
'post_type' => 'any',
'post_status' => array('draft') // черновик
);
Или для всех типов
$args = array(
'p' => 1234,
'post_type' => 'any',
'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash')
// опубликовано, на рассмотрении, черновик, авто-черновик, запланировано, приватно, наследуется, в корзине
);

К сожалению, это не сработало. Согласно кодексу и треку, post_status должен одинаково хорошо принимать строку, массив или строку с разделителями-запятыми.

Могу подтвердить, что это сработало у меня, когда мне нужно было получить ожидающие и черновики. Спасибо

Я только что столкнулся с точно такой же ситуацией. По моему мнению, это должно работать, но когда я попробовал комбинацию 'p' => 123
и 'post_status' => 'any'
, запись со статусом черновика не возвращалась.
Мне удалось обойти эту проблему, используя 'post__in' => array( 123 )
вместо этого. Вот так:
$args = array(
'post__in' => array( 123 ),
'post_type' => 'any',
'post_status' => 'any',
);
$query = new WP_Query( $args );
// ... и т.д.

Должен ли я также изменить $query на $posts в $query->have_posts()
и $query->the_post()
?

Да, хотя ты можешь назвать мой $query
как $my_query
, а мой $posts
как $query
, и это не будет иметь особой разницы. По сути, проблема, которую я пытаюсь обойти, это сбой в обработке запроса... кстати, куда ты поместил тот print_r()
, который сделал?

Я поместил его после WP_Query и перед циклом, вот так: $query = new WP_Query( $args ); print_r($query); while ( $query->have_posts() ) : $query->the_post();
.
