Obținerea metadatelor postării în aceeași interogare ca bucla principală
28 aug. 2014, 16:59:22
Vizualizări: 129
Voturi: 0
Am un tip de postare personalizat "staff" și fiecare are un câmp personalizat "_staff_purpose" (care descrie funcția acestuia).
Doresc ca șablonul archive-staff.php să afișeze toți membrii echipei, sortați după _staff_purpose, astfel încât să pot parcurge rezultatul folosind _staff_purpose ca titlu. Rezultatul dorit ar arăta astfel:
ID | post_title | _staff_purpose
-----------------------------------------
1 | Tracy Chap. | administrator
-----------------------------------------
2 | John Doe. | teacher
-----------------------------------------
3 | Robert Smith | teacher
-----------------------------------------
Interogarea SQL brută ar trebui să fie:
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
Am încercat acest cod:
add_action( 'pre_get_posts', 'fetch_staff_people' );
function fetch_staff_people( $query )
{
// Verifică dacă este șablonul corect și interogarea principală
if ( is_page_template('archive-staff.php') && $query->is_main_query() )
{
$query->set( 'post_per_page', '-1' ); // Obține toate postările
$query->set( 'meta_key', '_staff_purpose' ); // Setează cheia meta
$query->set('orderby', 'meta_value title'); // Sortează după scop, apoi după nume
$query->set( 'order', 'ASC ASC' );
} else {
return;
}
return $query;
}
Interogarea pare să funcționeze, dar valoarea câmpului personalizat nu apare în buclă.

pixeline
2.88K
Comentarii
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare
1
1
Nu puteți utiliza opțiunea de sortare dublă. Puteți încerca acest cod o singură dată:
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'); // sortează după scop, apoi după numele angajatului.
$query->set( 'order', 'ASC' );
}
}
Notă: Am folosit funcția is_post_type_archive()
în eticheta condițională. Aceasta verifică pagina de arhivă. Consultați Codex

Chinmoy Kumar Paul
943
28 aug. 2014 18:18:40
Întrebări similare
15
răspunsuri
12
răspunsuri
4
răspunsuri