¿Cómo obtener un array de datos de publicaciones del resultado de wp_query?
Cuando ejecuto una consulta con el método WP_Query, obtengo un objeto. Entiendo que puedo usar el loop para mostrar elementos. Sin embargo, mi objetivo no es mostrar nada, en su lugar, quiero obtener algunos datos de las publicaciones haciendo algo como "foreach...". ¿Cómo puedo obtener un array de datos de publicaciones que pueda recorrer y obtener información?

Deberías leer la referencia de funciones para WP_Query en el codex de WordPress. Allí tienes muchos ejemplos para revisar. Si no deseas iterar sobre el conjunto de resultados usando un while
, podrías obtener todas las publicaciones devueltas por la consulta con WP_Query
en la propiedad posts
.
Por ejemplo
$query = new WP_Query( array( 'post_type' => 'page' ) );
$posts = $query->posts;
foreach($posts as $post) {
// Haz lo que necesites, por ejemplo:
// echo $post->post_name;
}

Ninguno de los ejemplos que enlazas demuestra cómo procesar posts, sin embargo. Así que es bueno que hayas respondido, lástima que no lo tengan en la documentación. Otro consejo: Si estás haciendo una coincidencia en un post único puedes usar una función como esta con 'posts_per_page'=>1
en los argumentos. function wp_queryfirstpost($args) {
$q=new WP_Query($args);
$pp=$q->get_posts();
$firstpost=false;if ($pp) $firstpost=$pp[0];
wp_reset_postdata();
return $firstpost;
}

Deberías usar $query->posts
en su lugar, $query->get_posts()
volverá a ejecutar el análisis de la consulta y realizará consultas a la base de datos adicionales innecesarias

$query->get_posts(); no funciona como se esperaba. No estoy seguro por qué pero devuelve menos publicaciones que la consulta. Ver aquí: https://stackoverflow.com/questions/25395299/how-do-i-get-wordpress-wp-query-get-posts-on-multiple-categories-to-work

Esta respuesta es completamente incorrecta, cuando creas una nueva WP_Query con algunos argumentos, el método get_posts() se llama internamente de inmediato y ¡NO DEBES LLAMARLO NUEVAMENTE! Si lo llamas nuevamente como se muestra en el ejemplo anterior, ejecutará una CONSULTA DIFERENTE, dependiendo de los argumentos y resultados del ejecución inicial (banderas internas establecidas, etc.), y puede devolver un conjunto de resultados diferente (más pequeño) o ningún resultado en absoluto. Como sugirieron TomJNowell y Laxmana anteriormente, se debe usar $query->posts para obtener los datos de la publicación.

En realidad, no necesitas dejar de usar el bucle while()
. El mismo objeto WP_Post ya está almacenado en la propiedad post
:
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
// algún código aquí si lo deseas.
while ( $query->have_posts() ) {
$query->the_post();
// ahora $query->post es un objeto WP_Post, puedes usar:
// $query->post->ID, $query->post->post_title, etc.
}
}

No, if
no es redundante. En este caso exacto sí lo es, pero en la mayoría de situaciones de producción, tienes código para ejecutar entre el if y el while.

@magi182 Lo cual lo hace redundante, en este caso exacto. La gente debería aprender cuándo usar esto.

@frodeborli, Lo bueno de las declaraciones que comienzan con "la gente debería" es que casi siempre puedes sustituirlo por "la gente no lo hará" y la declaración sigue siendo cierta.

@magi182 Probablemente podría hacer cien líneas de código deseables para complementar el código anterior.
