Не получается вывести черновики с помощью WP_Query, используя параметр post_status

16 февр. 2012 г., 02:02:25
Просмотры: 15K
Голосов: 1

У меня не получается вывести черновики с помощью 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);

Может быть, я что-то упускаю? Не понимаю, почему черновик в этом типе записи не отображается в запросе выше.

6
Комментарии

что вы получите, если выполните print_r( $query )? Интересно, мешает ли have_posts() или the_post() отображать черновики...

mor7ifer mor7ifer
16 февр. 2012 г. 03:57:00

Вот результат вывода запроса: http://pastebin.com/MpZK2vPf

supertrue supertrue
16 февр. 2012 г. 09:15:48

И это результат print_r() для $query?!? Похоже, что запрос не выполняется... смотрите мой ответ.

mor7ifer mor7ifer
16 февр. 2012 г. 12:35:05

Пробовали ли вы заменить p на post__in?

mrwweb mrwweb
23 мая 2012 г. 19:59:37

Ваш запрос — первый в вашем вопросе — работает у меня с несколькими разными типами записей. Я подозреваю, что у вас есть плагин или что-то в вашей теме, что изменяет ваши запросы таким образом, что ломает этот. Отключите ваши плагины и переключитесь на стандартную тему, чтобы посмотреть, что произойдет.

s_ha_dum s_ha_dum
4 нояб. 2012 г. 17:43:40

@supertrue вы нашли решение для этой проблемы?

Capiedge Capiedge
3 апр. 2017 г. 19:36:36
Показать остальные 1 комментариев
Все ответы на вопрос 3
3

Попробуйте передать его в виде массива.

Например

$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')
    // опубликовано, на рассмотрении, черновик, авто-черновик, запланировано, приватно, наследуется, в корзине
);
16 февр. 2012 г. 02:19:42
Комментарии

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

supertrue supertrue
16 февр. 2012 г. 02:55:01

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

Jase Whatson Jase Whatson
11 дек. 2012 г. 00:32:16

Я только что провел тест с версией 4.7.2, используя 'post_type' как массив со значением 'any' и текстовую строку 'any' [то есть 'post_type' => array('any') 'post_type' => 'any' ] и оба параметра смогли получить посты-черновики

Rick Hellewell Rick Hellewell
17 февр. 2017 г. 00:49:16
0

Я только что столкнулся с точно такой же ситуацией. По моему мнению, это должно работать, но когда я попробовал комбинацию '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 );
// ... и т.д.
18 окт. 2017 г. 17:44:02
5

Похоже, у вас может быть странная ошибка. Попробуйте заменить однострочный WP_Query на следующий код:

$query = new WP_Query();
$posts = $query->query( $args );
16 февр. 2012 г. 12:36:48
Комментарии

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

supertrue supertrue
16 февр. 2012 г. 16:21:12

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

mor7ifer mor7ifer
17 февр. 2012 г. 03:46:32

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

supertrue supertrue
17 февр. 2012 г. 20:44:54

Да, попробуй вызвать метод query() и посмотри, что получится.

mor7ifer mor7ifer
18 февр. 2012 г. 06:54:05

Есть решение этой проблемы?

Ben Racicot Ben Racicot
7 мар. 2015 г. 18:30:08