Как Получить Все Сообщения с состоянием сообщения?

Я создаю панель инструментов фронтэнда, где я должен показать все сообщения текущего пользователя. Так, я должен показать сообщения во всех состояниях, главным образом published, trashed и pending. Я теперь использую простой запрос, но он возвращает только опубликованные сообщения.

$query = array(
    'post_type' => 'my-post-type',
    'post_author' => $current_user->ID              
    );
    query_posts($query);

Кто-либо может помочь? Что еще я должен сделать?

42
13.11.2015, 04:10
3 ответа

Можно использовать post_status параметр:

* 'publish' - a published post or page
* 'pending' - post is pending review
* 'draft' - a post in draft status
* 'auto-draft' - a newly created post, with no content
* 'future' - a post to publish in the future
* 'private' - not visible to users who are not logged in
* 'inherit' - a revision. see get_children.
* 'trash' - post is in trashbin. added with Version 2.9. 

Я не уверен, что это принимает 'любого', так используйте массив со всеми состояниями, которые Вы хотите:

$args = array(
    'post_type' => 'my-post-type',
    'post_author' => $current_user->ID,
    'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash')    
);
$query = new WP_Query($args);

while ( $query->have_posts() ) : $query->the_post();
70
19.02.2020, 21:54
  • 1
    Вы могли также использовать get_post_stati() получить все состояния, включая пользовательские. –  fuxia♦ 31.01.2013, 13:52
  • 2
    потраченная впустую возможность уничтожить a query_posts звоните... –  Tom J Nowell♦ 16.04.2013, 15:45
  • 3
    слишком плохо мы не можем сделать чего-то вроде этого 'post_status' => array( '!inherit' ); (для указания на любой post_status кроме наследовались), –  aequalsb 03.01.2017, 03:17
  • 4
    @aequalsb что относительно 'post_status' => array_diff(get_post_stati(), ['inherit']); –  Cheslab 29.10.2018, 15:05
  • 5
    вне темы. 'любой' - реальная вещь на самом деле. Документы: developer.wordpress.org/reference/classes/wp_query / … –  kirillrocks 20.01.2020, 16:26

WP_Query метод класса ->query() принимает any аргумент в пользу post_status. Посмотрите wp_get_associated_nav_menu_items() для доказательства.

То же идет для get_posts() (который является просто оберткой для вышеупомянутого вызова).

6
19.02.2020, 21:54
  • 1
    Из документов WP_Query: 'любой' - получает любое состояние кроме тех, которые от типов сообщения с набором 'exclude_from_search' к истинному. (Существует опечатка там, они на самом деле имеют в виду состояния сообщения вместо типов сообщения.) Это означает состояния auto-draft и trash исключены. –  Tamlyn 15.04.2013, 15:50
  • 2
    @Tamlyn Afaik, это не опечатка. Это получает любое состояние от типов сообщения, которые общедоступны. Состояние является просто условиями. Они не получили общественной или частной собственности сами. Вы могли отключить таксономию с отключением query_var... по любой причине можно было бы сделать это. Заметка на полях: множественное число состояния сообщения...., –  kaiser 15.04.2013, 17:30
  • 3
    Если Вы прослеживаете через код (часто легче, чем чтение документов, я нахожу), Вы видите это WP_Query#get_posts() вызовы get_post_stati() который фильтрует $wp_post_statuses для значений, где exclude_from_search верно затем, что это исключает сообщения с этими состояниями от запроса. Существует подобный процесс для типов сообщения, когда post_type установлен на 'любого'. –  Tamlyn 16.04.2013, 14:15
  • 4
    @Tamlyn После проверки содержания $wp_post_statuses свойство, я должен признать, что Вы - правильный :) –  kaiser 16.04.2013, 15:07
  • 5
    не работает на состояние мусора. –  Maxwell s.c 10.12.2018, 22:56

Существует простой путь, как получить все сообщения с любым состоянием:

$articles = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any',
  'post_type' => get_post_types('', 'names'),
 )
);

Теперь можно выполнить итерации всюду по всем сообщениям:

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}
10
19.02.2020, 21:54
  • 1
    и $post конфликтуют с собственными именами переменной Wordpress. Если Вы будете использовать этот код, чтобы вставить что-то кроме основного устройства (основное содержание) отделение, то это перезапишет то, что показали бы в основном. Если Ваше намерение действительно состоит в том, чтобы полностью заменить результаты исходного запроса, это - то, что Вы хотите, конечно. Но это - все еще хорошая идея переименовать переменные $posts и $post. –  Henrik Erlandsson 03.02.2014, 09:54
  • 2
    @Henrik я не намереваюсь уменьшить Ваш комментарий вообще (Ваша логика является здравой и безопасной), но я рассматриваю использование $post/$posts как совершенно приемлемого в функции без доступа к глобальным переменным $post/$posts - потому что это помогает мне поддержать логику во время разработки. –  aequalsb 03.01.2017, 03:14

Теги

Похожие вопросы