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ă.

6
Comentarii

Trebuie să ne arăți codul tău de buclă.

Wyck Wyck
28 aug. 2014 17:19:30

Nu sunt sigur dacă am înțeles întrebarea ta. Vrei să obții metadatele postului în interogarea principală, astfel încât valoarea lor să fie stocată în obiectul $post folosit în buclă? Cred că nu poți face asta folosind WP Query, deci nu poți face asta în hook-ul de acțiune preg_get_posts.

cybmeta cybmeta
28 aug. 2014 19:36:52

Da, exact asta vreau să fac.

pixeline pixeline
28 aug. 2014 19:48:43

Pentru a accesa metadatele, folosește get_post_meta( get_the_ID(), '_staff_purpose', true ); în bucla ta. De asemenea, observă că sortarea dublă va funcționa în acest caz, deoarece sortezi ASC.

bonger bonger
28 aug. 2014 23:21:36

@bonger asta ar declanșa o interogare SQL pentru fiecare intrare din buclă. Tocmai asta încerc să evit. În final, am folosit o interogare SQL directă cu get_results().

pixeline pixeline
29 aug. 2014 00:02:08

Nu, contrar așteptărilor, nu se întâmplă asta, deoarece WP stochează în cache toate metadatele în spatele tău când faci o interogare, așa că folosirea get_post_meta este metoda standard de lucru în WP.

bonger bonger
29 aug. 2014 00:10:10
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

28 aug. 2014 18:18:40
Comentarii

sortarea dublă pot să trăiesc fără. Este includerea meta_key în rezultatele SQL pe care încerc să aflu cum să o fac. Acum am inclus SQL-ul brut pe care aș dori să-l exprim în logica de interogare a Wordpress.

pixeline pixeline
28 aug. 2014 19:26:25