Як отримати всі повідомлення з будь-яким статусом допису?


38

Я створюю інформаційну панель переднього кінця, де мені потрібно показати всі публікації поточного користувача. Отже, мені потрібно показувати посади в усіх штатах, головним чином published, trashedі в pending. Зараз я використовую простий запит, але він повертає лише опубліковані публікації.

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

Хтось може допомогти? Що ще мені потрібно зробити?


4
Ви пробували використовувати post_statusпараметр , тобто 'post_status' => 'any'?
t31os

2
Я настійно рекомендую використовувати WP_Query pre_get_postsабо get_postsзамість query_posts. Ніколи не використовуйтеquery_posts
Tom J Nowell

@TomJNowell: це був шлях назад :) Я зараз використовую WP_Query більшість випадків ..
Sisir

1
@Sisir, будьте обережні, використовуйте WP_Queryдля передових get_postsзапитів та адміністративних запитів, оскільки з цим виникає проблема wp_reset_postdata(див. Примітку та квиток до цього питання).
Авроврата

Відповіді:


65

Ви можете використовувати параметр 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. 

Я не впевнений, що він приймає "будь-яке", тому використовуйте та масивуйте всі потрібні типи:

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

while ( $loop->have_posts() ) : $loop->the_post();

7
Ви також можете використовувати get_post_stati()всі статуси, включаючи власні.
fuxia

5
Втрачена можливість вбити query_postsдзвінок ...
Том Дж. Ноуелл

занадто погано, що ми не можемо зробити щось подібне 'post_status' => array( '!inherit' );(щоб вказати будь-який пост_стат, крім спадщини)
aequalsb

@aequalsb про що'post_status' => array_diff(get_post_stati(), ['inherit']);
Чеслаб

9

Простий спосіб отримати всі повідомлення з будь-яким статусом:

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

Тепер ви можете повторювати всі записи:

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}

2
$ posts та $ post суперечать власним іменам змінних Wordpress . Якщо ви використовуєте цей код, щоб вставити щось інше, ніж первинний (основний вміст) div, це замінить те, що було б показано в основному. Якщо ви дійсно маєте намір повністю замінити вихідні результати запитів, звичайно, це саме те, що ви хочете. Але все ж хороша ідея перейменувати змінні $ posts та $ post.
Генрік Ерландссон

5
@Henrik Я не маю наміру взагалі зменшувати ваш коментар (ваша логіка є надійною і безпечною), але я вважаю використання $ posts / $ posts як цілком прийнятним усередині функції без доступу до глобальних змінних $ post / $ posts - тому що це допомагає мені підтримувати логіку під час розвитку.
aequalsb

6

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

Те саме стосується get_posts()(що є лише обгорткою для вищезгаданого дзвінка).


3
З документів WP_Query: 'будь-який' - витягує будь-який статус, за винятком типів публікацій, для яких значення "виключити_from_search" встановлено на істинне. (Там є помилка друку, вони фактично означають статуси публікації замість типів публікацій.) Це означає статуси auto-draftі trashвони виключаються.
Тамлін

@Tamlyn Afaik, це не помилка. Він отримує будь-який статус із загальнодоступних типів публікацій . Статус - це лише терміни. Вони не отримали ні державної, ні приватної власності. Ви можете вимкнути таксономію, відключивши query_var... з будь-якої причини, хто б це зробив. Sidenote: Множинний пост статусу є ... .
кайзер

1
Якщо простежити код (часто простіше, ніж читати документи, я вважаю), ви можете побачити, що WP_Query#get_posts()викликає, get_post_stati()який фільтрує $wp_post_statusesзначення, де exclude_from_searchправда, тоді він виключає повідомлення з цими статусами з запиту. Існує подібний процес для типів публікацій, коли для параметра post_type встановлено значення "будь-яке".
Тамлін

@Tamlyn Після перевірки вмісту об'єкта $wp_post_statusesнерухомості я маю визнати, що ти маєш рацію :)
kaiser

не працює для статусу кошика.
Максвелл sc

2

У більшості випадків ви можете використовувати get_posts()з 'any'параметром для цього:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any',
  'post_type' => 'my-post-type',
 )
);

Але таким чином ви не отримаєте повідомлення зі статусом trashі auto-draft. Потрібно надати їх чітко, як-от так:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any, trash, auto-draft',
  'post_type' => 'my-post-type',
 )
);

Або ви можете скористатися функцією get_post_stati (), щоб надати всі існуючі статуси явно:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => get_post_stati(),
  'post_type' => 'my-post-type',
 )
);

1

Навіть якщо ви пройдете anyяк post_status, ви все одно не отримаєте публікацію в результаті, якщо виконано всі наступні умови:

  1. Одне повідомлення запитується. Прикладом цього може бути запит name, тобто слимак.
  2. Повідомлення має статус публікації, який не є загальнодоступним.
  3. У клієнта немає активного сеансу адміністрування, тобто ви зараз не ввійшли в систему.

Рішення

Запит явно для кожного статусу. Наприклад, для запиту статистів, яких немає trashабо auto-draft(це малоймовірно, що ви хочете таких), ви можете зробити щось подібне:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.