Obtener ID de publicación de WP_Query?

27

¿Hay alguna manera de recuperar una serie de identificadores de publicación consultados a partir de lo siguiente:

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

Seguir:

Solía wp_list_pluckrecuperar una serie de identificadores de publicación:

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

Luego convirtió la matriz en una cadena usando la función implode:

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

Perdón por la pregunta ambigua.

Rico
fuente
Rick, tu pregunta es ambigua. Sea muy claro lo que quiere antes de publicar una pregunta. Esto evitará que todos respondan cosas irrelevantes. En realidad, necesita que la ID de la publicación se devuelva en una cadena, no en una matriz
Pieter Goosen el
1
Su wp_reset_postdatadebe estar dentro y no fuera de la sentencia if, de lo contrario podría restablecer los datos de correos cuando no se ha cambiado
Tom J Nowell
1
Si solo desea las ID, debe considerar seriamente la respuesta de s_ha_dum. Eso devolverá los ID sin también recuperar muchos otros datos de la base de datos que luego descartarás.
Chris Rae

Respuestas:

43

Tratar

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

Leer wp_list_pluck

shanebp
fuente
55
Esto puede ser útil si también necesita todos los datos para cada publicación, no solo los identificadores de las publicaciones. De lo contrario, iría con la solución de @ s-ha-dum.
Marian
74

Use el fieldsargumento en su consulta.

fields (string): qué campos devolver. Todos los campos se devuelven por
defecto. Hay otras dos opciones: - 'ID' - Devuelve una matriz de ID de publicaciones. - 'id => parent' - Devuelve una matriz asociativa [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
fuente
12
Esta debería ser la respuesta aceptada, ya que solo consulta los ID, lo que lo hace mucho más rápido que consultar todo y que 'extraer' (bucle y volver a almacenar) en una nueva matriz.
Barry Kooij
Quizás necesite obtener identificadores DESPUÉS de que wp_query normal ya se haya ejecutado, por ejemplo, cuando combina dos consultas después y necesita identificadores para excluir resultados de consultas anteriores.
trainoasis
2

Usar la solución de @ s-ha-dum es económico si solo necesita obtener los ID y no tiene un conjunto de objetos de consulta anterior.

Aquí es por qué:

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 en el caso solo especificas 'fields' => 'ids' nada más obtendrás a cambio que los ID.

Si quisieras ir con 'fields' => 'id=>parent' (se ve muy divertido) obtendrá también la identificación de los padres.

Cualquier otra forma de usar 'fields' argumentos no tendrá ningún impacto a partir de WordPress v4.7.

Pero en caso de que tenga la consulta como en el ejemplo wp_list_pluck, hará el trabajo.

prosti
fuente