¿Cómo obtener IDs de posts desde WP_Query?

21 oct 2014, 18:01:37
Vistas: 94.9K
Votos: 49

¿Hay alguna manera de obtener un array de IDs de posts consultados desde 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();

Seguimiento:

Utilicé wp_list_pluck para obtener un array de IDs de posts:

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

Luego convertí el array en una cadena usando la función implode:

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

Disculpen por la pregunta ambigua.

3
Comentarios

rick, tu pregunta es ambigua. Por favor, sé muy claro sobre lo que quieres antes de publicar una pregunta. Esto evitará que todos respondan cosas irrelevantes. Lo que realmente necesitas son los IDs de los posts devueltos en una cadena, no un array

Pieter Goosen Pieter Goosen
21 oct 2014 19:01:11

Tu wp_reset_postdata debería estar dentro, no fuera de la declaración if, de lo contrario podrías restablecer los datos del post cuando no han sido cambiados

Tom J Nowell Tom J Nowell
21 oct 2014 19:19:20

Si solo quieres los IDs, deberías considerar seriamente la respuesta de s_ha_dum. Eso devolverá los IDs sin necesidad de recuperar muchos otros datos de la base de datos que luego descartarás.

Chris Rae Chris Rae
27 feb 2015 23:51:03
Todas las respuestas a la pregunta 5
4
135

Utiliza el argumento fields en tu consulta.

fields (string) - Qué campos devolver. Todos los campos se devuelven por
defecto. Hay otras dos opciones: - 'ids' - Devuelve un array de IDs de entradas. - 'id=>parent' - Devuelve un array asociativo [ 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 oct 2014 18:23:00
Comentarios

Esta debería ser la respuesta aceptada ya que solo consulta los ID's, lo que la hace mucho más rápida que consultar todo y luego 'extraer' (recorrer y volver a almacenar) en un nuevo array.

Barry Kooij Barry Kooij
5 feb 2016 18:31:24

Quizás necesites obtener los ID's DESPUÉS de que una consulta normal de wp_query ya se haya ejecutado, por ejemplo cuando combinas dos consultas posteriormente y necesitas los ID's para excluir resultados de la consulta previa.

trainoasis trainoasis
5 ago 2019 12:09:10

Gracias por compartir esta solución, entre las respuestas a esta pregunta, esta es la más eficiente.

Marcos Buarque Marcos Buarque
26 nov 2020 16:36:23

Esta debería ser la respuesta aceptada al 100%

MikeeeG MikeeeG
11 jul 2023 14:15:34
1
59

Prueba

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

Lee sobre wp_list_pluck

21 oct 2014 18:16:56
Comentarios

Esto puede ser útil si también necesitas todos los datos de cada publicación, no solo los IDs de las publicaciones. De lo contrario, optaría por la solución de @s-ha-dum.

Marian Marian
31 mar 2017 11:09:45
0

Te sugiero esta solución

get_posts([
  'posts_per_page' => -1,
  'post_status' => 'publish',
  'post_type' => 'some-custom-post-type',
  'fields' => 'ids',
]);

y como retorno obtendrás un array con los IDs dentro ;)

array (size=5)
  0 => int 81002
  1 => int 77885
  2 => int 77180
  3 => int 74722
  4 => int 73312
3 sept 2020 11:23:32
0

Usar la solución de @s-ha-dum es económico si solo necesitas obtener los IDs y no tienes un objeto de consulta previo configurado.

Aquí está el 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 en el caso de que solo especifiques 'fields' => 'ids' no obtendrás nada más que los IDs en el resultado.

Si usaras 'fields' => 'id=>parent' (se ve bastante curioso) también obtendrías los IDs de los padres.

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

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

28 dic 2016 02:01:02
1

¿Por qué no usar la función get_the_ID()? Solo compartiendo el código del loop y muestra todos los IDs de los posts en la consulta.

// El Loop
    if ( $the_query->have_posts() ) {
        while ( $the_query->have_posts() ) {
            $the_query->the_post();     
                    
            echo '<li>' . get_the_ID() . '</li>';
        }
    } else {
        // no se encontraron posts
        $string = "no posts found";
    }
12 jul 2021 22:27:41
Comentarios

Creo que el objetivo probablemente era obtener los IDs en un array para hacer algo más con ellos, no mostrarlos realmente. Usar el bucle para eso parece excesivo.

Rup Rup
13 jul 2021 01:47:13