Отримати ідентифікатори публікацій від WP_Query?


27

Чи можу я отримати масив ідентифікаторів публікацій, запитуваних із наступного:

$latest = new WP_Query( array (
    'orderby'               => 'rand',
    'posts_per_page'        => 3
));

if ( $latest -> have_posts() ) : while ( $latest -> have_posts() ) : $latest -> the_post();

    get_template_part( 'templates/content', 'post' );

endwhile; endif; wp_reset_postdata();

Слідувати:

Я використовував wp_list_pluckдля отримання масиву ідентифікаторів публікацій:

$post_ids = wp_list_pluck( $latest->posts, 'ID' );

Потім перетворимо масив у рядок за допомогою функції implode:

$post_ids_string = implode( ',', $post_ids );

Вибачте за неоднозначне запитання.


Рік, ваше питання неоднозначне. Будьте зрозумілі, що ви хочете, перш ніж ставити запитання. Це вбереже всіх від відповіді на неактуальні речі. Вам дійсно потрібні повернення ідентифікатора публікації в рядку, а не масив
Пітер Гусен

1
Ви wp_reset_postdataповинні бути всередині, а не за викладом if, в іншому випадку ви можете скинути дані публікації, коли вони не були змінені
Tom J Nowell

1
Якщо ви хочете лише посвідчення особи, слід серйозно розглянути відповідь s_ha_dum. Це поверне ідентифікатори, не отримавши також багато інших даних із бази даних, які ви потім викинете.
Кріс Рай

Відповіді:


43

Спробуйте

$post_ids = wp_list_pluck( $latest->posts, 'ID' );

Прочитайте wp_list_pluck


5
Це може бути корисно, якщо вам також потрібні цілі дані для кожної публікації, а не лише ідентифікатори публікацій. Інакше я б пішов із рішенням @ s-ha-dum.
Маріан

74

Використовуйте fieldsаргумент у своєму запиті.

поля (рядок) - які поля повернути. Усі поля повертаються за
замовчуванням. Є ще два варіанти: - 'ids' - Повернення масиву ідентифікаторів публікацій. - 'id => parent' - Повернення асоціативного масиву [parent => ID,…].

http://codex.wordpress.org/Class_Reference/WP_Query#Return_Fields_Parameter

$latest = new WP_Query( array (
    'orderby'               => 'rand',
    'posts_per_page'        => 3,
    'fields' => 'ids'
));
var_dump($latest->posts);

12
Це має бути прийнятою відповіддю, оскільки вона лише запитує ідентифікатор, що робить його набагато швидше, ніж запитувати щонайменше і ніж «вищипувати» (цикл та повторне зберігання) у новому масиві.
Barry Kooij

Можливо, вам потрібно отримати ідентифікатори ПІСЛЯ звичайного wp_query вже виконано, наприклад, коли ви зливаєте два запити після цього і вам потрібні ідентифікатори, щоб виключити результати попереднього запиту.
траїноз

2

Використання рішення від @ s-ha-dum економічно, якщо вам потрібно лише отримати ідентифікатори, і у вас немає попереднього об'єкта запиту.

Ось чому:

switch ( $q['fields'] ) {
    case 'ids':
        $fields = "$wpdb->posts.ID";
        break;
    case 'id=>parent':
        $fields = "$wpdb->posts.ID, $wpdb->posts.post_parent";
        break;
    default:
        $fields = "$wpdb->posts.*";

Тому що, якщо ви 'fields' => 'ids'не вкажете лише нічого, ви отримаєте взамін, ніж посвідчення особи.

Якщо ви підете з 'fields' => 'id=>parent'(виглядає дуже смішно), ви отримаєте також ідентифікатори батьків.

Будь-який інший спосіб використання 'fields'аргументу не матиме жодного впливу на WordPress v4.7.

Але у випадку, якщо у вас є запит, як у прикладі, wp_list_pluckви зробите свою роботу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.