Получить ID записей из WP_Query?
Есть ли способ получить массив 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 ); // Преобразование в строку
Извините за нечеткий вопрос.

Используйте аргумент 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);

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

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

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


Предлагаю такое решение:
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

Использование решения от @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
справится с задачей.

Почему бы не использовать функцию 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 = "записи не найдены";
}
