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.

pixeline
2.88K
Comentarios
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

Chinmoy Kumar Paul
943
28 ago 2014 18:18:40
Preguntas relacionadas
15
respuestas
12
respuestas
6
respuestas
4
respuestas