¿Cómo obtener una matriz de datos de publicación del resultado de wp_query?

35

Cuando ejecuté una consulta con el método WP_Query, obtuve un objeto. Entiendo que puedo hacer el ciclo para mostrar cosas. Pero, mi objetivo no es mostrar nada, en cambio, quiero obtener algunos datos de publicación haciendo algo como "foreach ...". ¿Cómo puedo obtener una matriz de datos de publicación que pueda recorrer y obtener datos?

Jenny
fuente
2
Una diferencia importante a tener en cuenta entre el acceso directo a los datos de publicación versus el uso de etiquetas de plantilla es que los filtros no se aplican a los datos y algunas funciones pueden romperse.
Milo

Respuestas:

73

Debe leer la referencia de función para WP_Query en el códice de WordPress. Ahí tienes muchos ejemplos para mirar. Si no desea recorrer el conjunto de resultados utilizando a while, puede obtener todas las publicaciones devueltas por la consulta con WP_Queryen la propiedad posts.

Por ejemplo

$query = new WP_Query( array( 'post_type' => 'page' ) );
$posts = $query->posts;

foreach($posts as $post) {
    // Do your stuff, e.g.
    // echo $post->post_name;
}
rofflox
fuente
1
Sin embargo, ninguno de los ejemplos a los que se vincula muestra cómo procesar publicaciones. Entonces es bueno que hayas respondido, lástima que no lo tengan en la documentación. Otro consejo: si está haciendo una coincidencia en una publicación única, puede usar una función como esta en 'posts_per_page'=>1in args. 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; }
Henrik Erlandsson
@rofflox: ¡Eres un santo! Excelente para eludir get_the_title / ID / younameit.
Vial
8
En su $query->postslugar, debe usar , $query->get_posts()activará una repetición del análisis de consultas y consultas adicionales innecesarias de la base de datos
Tom J Nowell
$ consulta-> get_posts (); No funciona como se esperaba. No estoy seguro de por qué, pero devuelve menos publicaciones que la consulta. Ver aquí: stackoverflow.com/questions/25395299/…
Laxmana
1
Esta respuesta es completamente incorrecta, cuando crea una nueva WP_Query con algunos argumentos, el método get_posts () se llama internamente de inmediato y ¡NO DEBE LLAMARLO DE NUEVO! Si lo vuelve a llamar como se muestra en el ejemplo anterior, ejecutará una consulta DIFERENTE, dependiendo de los argumentos y resultados de la ejecución inicial (conjunto de indicadores internos, etc.), y potencialmente puede devolver un conjunto de resultados diferente (más pequeño) o no hay resultados en absoluto. Como TomJNowell y Laxmana sugirieron anteriormente, uno debe usar $ query-> posts para obtener los datos de la publicación.
ivanhoe
11

En realidad, no necesita negarse a usar el while()bucle. El mismo objeto WP_Post ya está almacenado en la postpropiedad:

        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {

            while ( $query->have_posts() ) {

                $query->the_post();

                // now $query->post is WP_Post Object, use:
                // $query->post->ID, $query->post->post_title, etc.

            }

        }
vladkras
fuente
2
ifes redundante
Akkumulator
2
No, ifno es redundante. En este caso exacto lo es, pero en la mayoría de las situaciones de producción, tiene que ejecutar un código entre el if y el while.
magi182
2
@ magi182 Lo que lo hace redundante, en este caso exacto. La gente debería aprender cuándo usar esto.
frodeborli
44
@frodeborli, Lo bueno de las declaraciones que comienzan con "la gente debería" es que casi siempre puedes sustituir "la gente no lo hará" y la declaración sigue siendo cierta.
magi182
1
@ magi182 Probablemente podría hacer cien buenas líneas de código para complementar el código anterior.
frodeborli
-1

también puedes usar en get_posts( $args )lugar de wp_Query(), lo que te dará una lista de publicaciones

Alon Gouldman
fuente