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.

6
Commenti

Devi mostrarci il tuo codice del loop.

Wyck Wyck
28 ago 2014 17:19:30

Non sono sicuro di aver capito la tua domanda. Vuoi recuperare il post meta nella query principale in modo che il suo valore sia memorizzato nell'oggetto $post usato in il loop? Penso che non sia possibile usando WP Query, quindi non puoi farlo nell'hook di azione preg_get_posts.

cybmeta cybmeta
28 ago 2014 19:36:52

Sì, è esattamente quello che voglio.

pixeline pixeline
28 ago 2014 19:48:43

Per accedere ai metadati usa get_post_meta( get_the_ID(), '_staff_purpose', true ); nel tuo loop. Nota anche che il doppio ordinamento funzionerà in questo caso poiché stai ordinando in modo ASC.

bonger bonger
28 ago 2014 23:21:36

@bonger questo attiverebbe una query SQL per ogni voce nel loop. È proprio quello che voglio evitare. Alla fine, ho usato una query SQL diretta con get_results().

pixeline pixeline
29 ago 2014 00:02:08

No, controintuitivamente, non lo fa, poiché WP memorizza nella cache tutti i metadati dietro le quinte quando esegui una query, quindi usare get_post_meta è il modo de rigueur di fare le cose in WP.

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

28 ago 2014 18:18:40
Commenti

Posso fare a meno del doppio ordinamento. Quello che mi interessa sapere è come includere meta_key nei risultati SQL. Ho incluso la query SQL grezza che vorrei esprimere nella logica delle query di WordPress.

pixeline pixeline
28 ago 2014 19:26:25