¿Cómo obtener IDs de posts desde WP_Query?
¿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.

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

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.

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.

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


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

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.

¿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";
}
