Recuperare post meta nella stessa query del main loop in WordPress
28 ago 2014, 16:59:22
Visualizzazioni: 129
Voti: 0
Ho un custom post type "staff" e ognuno ha un campo personalizzato "_staff_purpose" (che descrive la sua funzione).
Vorrei che il template archive-staff.php mostri tutti i membri dello staff, ordinati per il loro _staff_purpose, così da poter ciclare attraverso i risultati usando _staff_purpose come intestazione. Il risultato che vorrei ottenere è questo:
ID | post_title | _staff_purpose
-----------------------------------------
1 | Tracy Chap. | administrator
-----------------------------------------
2 | John Doe. | teacher
-----------------------------------------
3 | Robert Smith | teacher
-----------------------------------------
La query SQL grezza dovrebbe essere questa:
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
Ho provato questo:
add_action( 'pre_get_posts', 'fetch_staff_people' );
function fetch_staff_people( $query )
{
// Controlla se siamo nel template archive-staff.php e nella query principale
if ( is_page_template('archive-staff.php') && $query->is_main_query() )
{
$query->set( 'post_per_page', '-1' ); // Mostra tutti i post
$query->set( 'meta_key', '_staff_purpose' ); // Imposta il meta_key
$query->set('orderby', 'meta_value title'); // Ordina per scopo, poi per nome
$query->set( 'order', 'ASC ASC' );
} else {
// Se non siamo nel template corretto, esci
return;
}
return $query;
}
La query sembra funzionare ma il valore del campo personalizzato non appare nel loop.

pixeline
2.88K
Commenti
Mostra i restanti 1 commenti
Tutte le risposte alla domanda
1
1
Non puoi utilizzare l'opzione di doppio ordinamento. Puoi provare questo codice una volta:
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'); // ordina per scopo, poi per nome del personale.
$query->set( 'order', 'ASC' );
}
}
Nota: Ho utilizzato la funzione is_post_type_archive()
nel tag condizionale. Sta verificando la pagina archivio. Vedi il Codex

Chinmoy Kumar Paul
943
28 ago 2014 18:18:40
Domande correlate
4
risposte