Получить ID записей из WP_Query?

21 окт. 2014 г., 18:01:37
Просмотры: 94.9K
Голосов: 49

Есть ли способ получить массив ID записей из следующего запроса:

$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 для получения массива ID записей:

$post_ids = wp_list_pluck( $latest->posts, 'ID' ); // Извлечение ID записей

Затем преобразовал массив в строку с помощью функции implode:

$post_ids_string = implode( ',', $post_ids ); // Преобразование в строку

Извините за нечеткий вопрос.

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

Рик, ваш вопрос неоднозначен. Пожалуйста, четко укажите, что именно вам нужно, прежде чем задавать вопрос. Это избавит всех от необходимости отвечать на нерелевантные вещи. Вам действительно нужны ID записей, возвращаемые в виде строки, а не массива.

Pieter Goosen Pieter Goosen
21 окт. 2014 г. 19:01:11

Ваш wp_reset_postdata должен быть внутри оператора if, а не снаружи, иначе вы можете сбросить данные поста, когда они не были изменены.

Tom J Nowell Tom J Nowell
21 окт. 2014 г. 19:19:20

Если вам нужны только ID, вам стоит серьезно рассмотреть ответ s_ha_dum. Это вернет ID без необходимости получения множества других данных из базы данных, которые вы затем просто отбросите.

Chris Rae Chris Rae
27 февр. 2015 г. 23:51:03
Все ответы на вопрос 5
4
135

Используйте аргумент fields в вашем запросе.

fields (string) - Какие поля возвращать. По умолчанию возвращаются все поля. Есть два других варианта: - 'ids' - Возвращает массив ID записей. - 'id=>parent' - Возвращает ассоциативный массив [ parent => ID, … ].

https://developer.wordpress.org/reference/classes/wp_query/#return-fields-parameter

$latest = new WP_Query( array (
    'orderby'               => 'rand',
    'posts_per_page'        => 3,
    'fields' => 'ids'
));
var_dump($latest->posts);
21 окт. 2014 г. 18:23:00
Комментарии

Этот ответ должен быть принятым, так как он запрашивает только ID, что делает его намного быстрее, чем запрос всех данных с последующим "извлечением" (цикл и пересохранение) в новый массив.

Barry Kooij Barry Kooij
5 февр. 2016 г. 18:31:24

Возможно, вам нужно получить ID ПОСЛЕ того, как обычный wp_query уже был выполнен, например, когда вы объединяете два запроса и вам нужны ID, чтобы исключить результаты из предыдущего запроса.

trainoasis trainoasis
5 авг. 2019 г. 12:09:10

Спасибо за этот решение, среди ответов на данный вопрос оно наиболее эффективное.

Marcos Buarque Marcos Buarque
26 нояб. 2020 г. 16:36:23

Это должно быть принятым ответом на 100%

MikeeeG MikeeeG
11 июл. 2023 г. 14:15:34
1
59

Попробуйте

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

Читайте wp_list_pluck

21 окт. 2014 г. 18:16:56
Комментарии

Это может быть полезно, если вам также нужны все данные для каждой записи, а не только идентификаторы записей. В противном случае я бы выбрал решение от @s-ha-dum.

Marian Marian
31 мар. 2017 г. 11:09:45
0

Предлагаю такое решение:

get_posts([
  'posts_per_page' => -1, // Получить все записи
  'post_status' => 'publish', // Только опубликованные записи
  'post_type' => 'some-custom-post-type', // Указать тип записи
  'fields' => 'ids', // Получить только ID записей
]);

В результате вы получите массив с ID записей:

array (size=5)
  0 => int 81002
  1 => int 77885
  2 => int 77180
  3 => int 74722
  4 => int 73312
3 сент. 2020 г. 11:23:32
0

Использование решения от @s-ha-dum экономично, если вам нужно получить только ID и у вас нет ранее установленного объекта запроса.

Вот почему:

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', вы получите только ID.

Если вы выберете вариант 'fields' => 'id=>parent' (выглядит забавно), вы также получите ID родительских элементов.

Любой другой способ использования аргумента 'fields' не окажет никакого эффекта, начиная с WordPress версии 4.7.

Но если у вас есть запрос, как в примере, wp_list_pluck справится с задачей.

28 дек. 2016 г. 02:01:02
1

Почему бы не использовать функцию get_the_ID()? Просто приведу код цикла, который показывает все ID записей в запросе.

// Цикл
    if ( $the_query->have_posts() ) {
        while ( $the_query->have_posts() ) {
            $the_query->the_post();     
                    
            echo '<li>' . get_the_ID() . '</li>';
        }
    } else {
        // записи не найдены
        $string = "записи не найдены";
    }
12 июл. 2021 г. 22:27:41
Комментарии

Думаю, цель, скорее всего, была получить ID в массиве, чтобы сделать что-то еще с ними, а не просто отобразить. Использование цикла для этого кажется избыточным.

Rup Rup
13 июл. 2021 г. 01:47:13