Получить почтовые идентификаторы из 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 );

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

Богатый
источник
Рик, твой вопрос неоднозначен. Пожалуйста, будьте очень ясны, что вы хотите, прежде чем отправлять вопрос. Это спасет всех от ответов на неуместные вещи. Вам на самом деле нужны идентификаторы сообщений, возвращаемые в строке, а не в массиве
Pieter Goosen
1
Вы wp_reset_postdataдолжны быть внутри, а не вне оператора if, иначе вы можете сбросить данные поста, если они не были изменены
Том Дж. Новелл
1
Если вам нужны только идентификаторы, вы должны серьезно рассмотреть ответ s_ha_dum. Это вернет идентификаторы без извлечения большого количества других данных из базы данных, которую вы затем выбрасываете.
Крис Рей

Ответы:

43

Пытаться

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

Читать wp_list_pluck

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

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

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);
s_ha_dum
источник
12
Это должен быть принятый ответ, так как он только запрашивает идентификаторы, что делает его намного быстрее, чем запросы к каждому и чем «собирает» (зацикливает и перезаписывает) его в новом массиве.
Барри Коой
Возможно, вам нужно получить идентификаторы ПОСЛЕ того, как обычно wp_query уже был выполнен, например, когда вы объединяете два запроса впоследствии и нуждаетесь в идентификаторах, чтобы исключить результаты из предыдущего запроса.
trainoasis
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, сделает работу.

прости
источник