Obtener meta datos de posts en la misma consulta que el bucle principal

28 ago 2014, 16:59:22
Vistas: 129
Votos: 0

Tengo un tipo de post personalizado "staff" y cada uno tiene un campo personalizado "_staff_purpose" (que describe su función).

Me gustaría que la plantilla archive-staff.php muestre todos los miembros del personal, ordenados por su _staff_purpose, para poder recorrer el resultado usando _staff_purpose como encabezado. El resultado que quiero obtener es así:

ID  |   post_title    |  _staff_purpose
-----------------------------------------
1   |   Tracy Chap.   |  administrator
-----------------------------------------
2   |   John Doe.     |  teacher
-----------------------------------------
3   |   Robert Smith  |  teacher
-----------------------------------------

El SQL crudo debería ser este:

SELECT * FROM `bj_posts` p

LEFT JOIN (
    SELECT post_id, meta_value as purpose
    FROM `bj_postmeta` pm 
    WHERE  `meta_key`='purpose'
    ) pm ON p.ID=pm.post_id
WHERE p.`post_type`='staff' AND p.`post_status`='publish'
ORDER BY purpose ASC, post_title ASC

He intentado esto:

add_action( 'pre_get_posts', 'fetch_staff_people' );

function fetch_staff_people( $query )
{
    // Verifica si es la plantilla correcta y la consulta principal
    if ( is_page_template('archive-staff.php') && $query->is_main_query() )
    {
        $query->set( 'post_per_page', '-1' );
        $query->set( 'meta_key', '_staff_purpose' );
        $query->set('orderby', 'meta_value title'); // ordenar por propósito, luego por nombre
        $query->set( 'order', 'ASC ASC' );

    } else { 
        return;
    }

    return $query;
}

La consulta parece funcionar pero el valor del campo personalizado no aparece en el bucle.

6
Comentarios

Necesitas mostrarnos tu código del bucle (loop).

Wyck Wyck
28 ago 2014 17:19:30

No estoy seguro de entender tu pregunta. ¿Quieres obtener los metadatos del post en la consulta principal para que su valor se almacene en el objeto $post que se usa en el bucle? Creo que no puedes hacerlo usando WP Query, por lo que no puedes hacerlo en el gancho de acción preg_get_posts.

cybmeta cybmeta
28 ago 2014 19:36:52

Sí, eso es exactamente lo que quiero.

pixeline pixeline
28 ago 2014 19:48:43

Para acceder a los metadatos usa get_post_meta( get_the_ID(), '_staff_purpose', true ); en tu bucle. Ten en cuenta que el doble ordenamiento funcionará en este caso ya que estás ordenando ASC.

bonger bonger
28 ago 2014 23:21:36

@bonger eso dispararía una consulta SQL por cada entrada en el bucle. Eso es lo que quiero evitar. Al final, usé una consulta SQL directa con get_results().

pixeline pixeline
29 ago 2014 00:02:08

No, contra intuitivamente, no lo hace, ya que WP almacena en caché todos los metadatos detrás de escena cuando haces una consulta, por lo que usar get_post_meta es la forma estándar de hacer las cosas en WP.

bonger bonger
29 ago 2014 00:10:10
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 1
1

No puedes usar la opción de doble ordenación. Puedes probar este código una vez:

add_action( 'pre_get_posts', 'fetch_staff_people' );
function fetch_staff_people( $query )
{
  if ( is_post_type_archive('staff') && $query->is_main_query() )
  {
    $query->set( 'post_per_page', '-1' );
    $query->set( 'meta_key', '_staff_purpose' );
    $query->set('orderby', 'meta_value_num'); // ordenar por propósito, luego por nombre del personal.
    $query->set( 'order', 'ASC' );
  }
}

Nota: Usé la función is_post_type_archive() en la etiqueta condicional. Está verificando la página de archivo. Consulta el Codex

28 ago 2014 18:18:40
Comentarios

puedo vivir sin el doble ordenamiento. Es la inclusión del meta_key en los resultados SQL lo que busco saber cómo hacer. Ahora he incluido el SQL crudo que me gustaría expresar en la lógica de consulta de Wordpress.

pixeline pixeline
28 ago 2014 19:26:25