Estoy haciendo una solicitud AJAX usando admin-ajax.php mediante el cual filtro las publicaciones según la casilla de verificación marcada. Está funcionando muy bien, aunque estoy luchando por encontrar una manera de devolver los meta detalles de cada publicación.
Solo estoy usando query_posts para obtener mis datos de la siguiente manera:
function ajax_get_latest_posts($tax){
$args= array(
'post_type'=>'course',
'tax_query' => array(
array(
'taxonomy' => 'subject',
'field' => 'slug',
'terms' => $tax
)
)
);
$posts=query_posts( $args);
return $posts;
}
¿Cómo modificaría esto para que también devuelva metadatos? Sé que puedo filtrar las publicaciones por metadatos usando meta_query, pero solo quiero mostrar los datos en mis publicaciones.
Nikolá Ivanov Nikolov
EDITAR:
Además de la solución descrita a continuación, si está usando WordPress >= 3.5 (como debería ser :)), simplemente puede utilizar los métodos mágicos del objeto WP_Post.
Básicamente, el objeto WP_Post (que es en lo que consiste la matriz de publicaciones de casi todos los resultados de consulta que provienen de WP_Query) está usando PHP __get()
y __isset()
métodos mágicos. Estos métodos le permiten usar propiedades de un objeto que no están definidas en el objeto mismo.
Aquí hay un ejemplo.
foreach ( $posts as $key => $post ) {
// This:
echo $post->key1;
// is the same as this:
echo get_post_meta( $post->ID, 'key1', true );
}
si haces un print_r( $post )
o var_dump( $post )
no verá la propiedad “key1” del $post
objeto. Pero la función __obtener() le permite acceder a esa propiedad.
================================================== =========
En mi opinión, tiene dos opciones generales: recorrer las publicaciones y obtener los datos que necesita, así (este código irá justo después $posts = query_posts( $args );
):
foreach ( $posts as $key => $post ) {
$posts[ $key ]->key1 = get_post_meta( $post->ID, 'key1', true );
$posts[ $key ]->key2 = get_post_meta( $post->ID, 'key2', true );
}
O enganchar a la the_posts
filtre el gancho y haga lo mismo allí (más trabajo, pero si tiene varias funciones que necesitan agregar esos datos a cada publicación, podría ser más fácil). Este código iría a su functions.php o a los archivos de su complemento (si está creando un complemento):
function my_the_posts_filter( $posts ) {
foreach ( $posts as $key => $post ) {
$posts[ $key ]->key1 = get_post_meta( $post->ID, 'key1', true );
$posts[ $key ]->key2 = get_post_meta( $post->ID, 'key2', true );
}
return $posts;
}
Y luego cambiarías tu
$posts=query_posts( $args);
línea a esto:
add_filter( 'the_posts', 'my_the_posts_filter', 10 );
$posts = query_posts( $args );
remove_filter( 'the_posts', 'my_the_posts_filter', 10 );
Teniendo en cuenta el hecho de que esto sucedería dentro de una solicitud AJAX, técnicamente puede deshacerse del remove_filter()
call, pero es bueno tenerlo en caso de que vaya a realizar otras consultas posteriores en su código.
-
respuesta perfecta, terminé usando la primera solución, pero la segunda también es excelente ya que desconocía este método. gracias me ahorraste horas
– gris
28/10/2013 a las 19:56
-
Actualicé mi respuesta. Me olvidé por completo de los métodos mágicos del objeto WP_Post. Son mucho más fáciles de usar :). Básicamente, solo puede acceder a las teclas meta como una propiedad del objeto. Siéntase libre de mirar el código aquí – core.trac.wordpress.org/browser/tags/3.7/src/wp-includes/… y vea a qué otras cosas puede acceder de esa manera (por ejemplo
$post->page_template
😉 )– Nikolá Ivanov Nikolov
28/10/2013 a las 22:11
-
¡muchas gracias! Todavía no he usado WP_Post, parece un poco más simple. gracias por la modificación, buena suerte con Paiyak
– gris
29/10/2013 a las 10:32
codex.wordpress.org/Class_Reference/WP_Query ir allí y buscar
meta_query
– Príncipe Singh
28/10/2013 a las 17:34