Obter IDs de postagem do WP_Query?

27

Existe uma maneira de recuperar uma matriz de IDs de postagem consultados a partir do seguinte:

$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();

Acompanhamento:

Eu costumava wp_list_pluckrecuperar uma matriz de IDs de postagem:

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

Em seguida, converteu o array em uma string usando a função implode:

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

Desculpe pela pergunta ambígua.

Rico
fonte
Rick, sua pergunta é ambígua. Seja muito claro o que você deseja antes de postar uma pergunta. Isso evitará que todos respondam coisas irrelevantes. Você realmente precisa do ID pós retornou em uma string, não um array
Pieter Goosen
11
Seu wp_reset_postdatadeve estar dentro e não fora a instrução if, caso contrário você pode redefinir dados de postagem quando ele não foi alterado
Tom J Nowell
11
Se você deseja apenas os IDs, considere seriamente a resposta de s_ha_dum. Isso retornará os IDs sem também recuperar muitos outros dados do banco de dados que você joga fora.
22815 Chris Rae

Respostas:

43

Experimentar

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

Ler wp_list_pluck

shanebp
fonte
5
Isso pode ser útil se você também precisar de todos os dados de cada postagem, não apenas dos IDs das postagens. Caso contrário, eu usaria a solução do @ s-ha-dum.
Marian
74

Use o fieldsargumento na sua consulta.

fields (string) - Quais campos retornar. Todos os campos são retornados por
padrão. Existem duas outras opções: - 'ids' - Retorna uma matriz de IDs de postagem. - 'id => parent' - Retorna uma matriz associativa [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
fonte
12
Essa deve ser a resposta aceita, pois apenas consulta os IDs, tornando-os muito mais rápidos do que consultar tudo e do que 'arrancar' (repetir e re-armazenar) em uma nova matriz.
Barry Kooij 05/02
Talvez você precise obter IDs APÓS o normal wp_query já foi executado, por exemplo, quando você mescla duas consultas posteriormente e precisa de IDs para excluir resultados da consulta anterior.
trainoasis
2

Usar a solução de @ s-ha-dum é econômico se você precisar apenas obter os IDs e não tiver o conjunto de objetos de consulta anterior.

Aqui está o porquê:

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.*";

Porque, no caso, você apenas especifica 'fields' => 'ids'nada mais do que os IDs.

Se você escolher 'fields' => 'id=>parent'(parece realmente engraçado), também receberá os IDs dos pais.

Qualquer outra maneira de usar o 'fields'argumento não terá nenhum impacto a partir do WordPress v4.7.

Mas caso você tenha a consulta, como no exemplo wp_list_pluck, fará o trabalho.

prosti
fonte