Come codificare loop multipli mentre solo interrogando il database una volta

Sono un grande fan di WP_Query classe: lo uso in molti dei miei siti client per eseguire query e generare contenuti in modi personalizzati.

Se vuoi eseguire più loop su una pagina, il modo più semplice per farlo è quello di eseguire WP_Query ogni volta che è necessario eseguire un ciclo. Ma c'è uno svantaggio: ogni volta che WordPress esegue una query, invia richieste al database, che richiede tempo e può rallentare il sito. E se stai usando WP_Query invece della query principale per l'output del contenuto, rende la query principale ridondante, che è uno spreco di risorse.

Quindi qui ti mostrerò come utilizzare una query per eseguire più di un ciclo. Puoi farlo con la query principale (che è quello che farò perché è più efficiente) oppure puoi usare la stessa tecnica con WP_Query.

Ci sono tre parti in questo:

  • Crea un tema figlio e un file modello.
  • Creare una parte modello per i contenuti del ciclo.
  • Crea i nostri loop.

Quindi iniziamo!

Cosa ti serve

Per seguire, avrai bisogno di:

  • Un'installazione di sviluppo di WordPress.
  • Un editor di codice.
  • Post nel tuo sito con più categorie assegnate: utilizzo i dati di test dell'unità tematica di WordPress.
  • Il tema dei ventisei anni installato sul tuo sito.
  • Un tema bambino di ventisei anni installato e attivato - Tratterò brevemente la creazione del tema bambino qui.

Non devi usare ventisei anni con un tema per bambini: puoi adattare questa tecnica per il tuo tema. Ma userò un figlio di ventisei anni.

Creazione del tema figlio

Per prima cosa creiamo il tema del bambino di ventisei anni. Lo sto facendo perché non voglio modificare il tema dei ventisei anni.

Nel tuo wp-content / themes directory, creare una nuova cartella vuota. Sto chiamando il mio tutsplus-uno-query-due-loops.

In quella cartella, crea un file chiamato style.css e aggiungilo a questo:

/ * Nome del tema: Tutsplus Query a più cicli URI del tema: http: //.tutsplus.com/tutorials/how-to-code-multiple-loops-while-only-querying-the-database-once--cms-25703 Descrizione: Tema per supportare Esercitazione sull'esecuzione di cicli multipli durante l'interrogazione del database una sola volta. Tema infantile per il tema Twenty Sixteen. Autore: Rachel McCollin Autore URI: http://rachelmccollin.co.uk/ Template: twentysixteen Versione: 1.0 * / @import url ("... /twentysixteen/style.css");

Ora salva quel file e attiva il tuo nuovo tema.

Il prossimo passo è creare un file modello per categorie, che è quello con cui lavoreremo.

Crea una copia di archive.php file da ventisei nel tuo nuovo tema. Non spostarlo, ma copialo. Rinominalo category.php. Questo è ora il file modello per le categorie sul tuo sito.

Creazione di un nuovo file di parti del modello

Il primo passo è quello di impostare un nuovo file di template template nel nostro tema che conterrà una versione modificata del loop da ventisei.

Nella cartella del tema, creare una sottocartella chiamata include. Al suo interno, crea un nuovo file chiamato loop-category.php.

Ora apri il template-componenti / content.php file dal file twentyteen e trova questo codice (che è la maggior parte del file):

> ', esc_url (get_permalink ())),''); ?>
"%S"',' twentysixteen '), get_the_title ())); wp_link_pages (array ('before' => '
'. __ ('Pagine:', 'twentysixteen'). '',' dopo '=>'
',' link_before '=>'',' link_after '=>'',' pagelink '=>''. __ ('Pagina', 'twentysixteen'). ' % ',' separator '=>', ',)); ?>
"%S"',' twentysixteen '), get_the_title ()),'',''); ?>

Copia quello nel tuo nuovo file.

Modifica della parte del modello

Il loop da ventisei mostra più di quanto ne ho bisogno per questo archivio, quindi ho intenzione di modificarlo. Voglio solo visualizzare l'estratto e non il contenuto, quindi lo rimuoveremo.

Nel tuo nuovo loop-category.php file, trova questo codice ed eliminalo:

"%S"',' twentysixteen '), get_the_title ())); wp_link_pages (array ('before' => '
'. __ ('Pagine:', 'twentysixteen'). '',' dopo '=>'
',' link_before '=>'',' link_after '=>'',' pagelink '=>''. __ ('Pagina', 'twentysixteen'). ' % ',' separator '=>', ',)); ?>

L'altro passo è sostituire il twenty_sixteen_excerpt () funziona con lo standard the_excerpt () funzione, in quanto la versione ventiduesima non include un collegamento al post completo.

Trova questa linea:

Sostituiscilo con questo:

Dobbiamo anche apportare qualche modifica ai tag di intestazione.

Nella parte modello, modifica la linea:

', esc_url (get_permalink ())),''); ?>

Cambiare il h2 tag a h3:

', esc_url (get_permalink ())),''); ?>

Salva il tuo file di parte del modello. Ora torna al tuo category.php file e continuare a lavorare in questo. 

Creare i nostri loop

Per prima cosa rimuoviamo la chiamata alla ventesima parte del modello dal nostro file category.php, poiché dovremo usare il nuovo file.

Nel tuo category.php file trova questo codice:

get_template_part ('template-parts / content', get_post_format ());

Cancellalo.

Ora creeremo i loop.

In questo esempio ho intenzione di elencare tutti i post con il tag 'content' prima, usando il has_tag () tag condizionale.

Ciò significa che dovrò eseguire tre cicli:

  • Il primo controlla se la query ha restituito tutti i post con questo tag.
  • In tal caso, il secondo emette post con questo tag.
  • Un terzo produce post senza questo tag.

Tra ognuna di queste, userò rewind_posts () per riavvolgere i post senza reimpostare la query: stiamo ancora lavorando con la query principale ogni volta.

Il primo ciclo: verifica dei post

Nel tuo category.php file, trova l'inizio del ciclo:

while (have_posts ()): the_post ();

Sopra questa linea, definire una nuova variabile chiamata count $:

$ count = 0;

Ora all'interno di quel ciclo, aggiungi questo codice:

// controlla se ci sono post con "tag $ tag = 'contenuto'; if (has_tag ($ tag)) $ count + = 1;

Controlla se i post hanno il tag "content" e poi aggiunge 1 al conteggio se così.

Il tuo loop ora sarà simile a questo:

// Controlla i post nel primo ciclo. $ count = 0; while (have_posts ()): the_post (); // controlla se ci sono post con "tag $ tag = 'contenuto'; if (has_tag ($ tag)) $ count + = 1; endwhile;

The Second Loop: output dei post con il tag

Il prossimo passo è eseguire un ciclo per generare messaggi con quel tag, ma solo se ce ne sono, cioè se il valore di count $ è più grande di 0.

Aggiungi questo sotto il tuo primo ciclo:

if ($ count> 0) rewind_posts (); eco '

Post taggati con '. $ tag. '

'; while (have_posts ()): the_post (); if (has_tag ($ tag)) get_template_part ('includes / loop', 'category'); // Termina il ciclo. ENDWHILE;

Questo controlla che count $ è maggiore di zero e, in caso affermativo, riavvolge i messaggi ed esegue nuovamente il ciclo. Per ogni post controlla se il post ha il nostro tag e, in tal caso, chiama la parte del modello che abbiamo appena creato.

The Third Loop: Outputting the Rest of Our Post

Il ciclo finale produrrà i post rimanenti. Se questa categoria non ha alcun post con il tag "content", allora genererà tutti i post nella categoria.

Sotto il tuo secondo ciclo, aggiungi questo:

rewind_posts (); // Second Loop - post non con il tag 'content' while (have_posts ()): the_post (); if (! has_tag ($ tag)) get_template_part ('includes / loop', 'category');  // Termina il ciclo. ENDWHILE; ?>

Questo riavvolge i post (che farai per la prima volta se non ci fossero messaggi con il tag o la seconda volta se ce ne fossero), quindi eseguirà nuovamente il ciclo. Questa volta controlla se un post non lo fa avere il tag "content" e quindi inviarlo usando la nostra parte template.

L'archivio finito

Ora prova la pagina di archivio delle categorie sul tuo sito.

Se stai utilizzando i dati dell'unità di test di WordPress come me, scoprirai che la categoria 'Markup' ha post con il tag 'content'. Ecco la pagina di archivio delle categorie per la categoria 'Markup' sul mio sito:

Sommario

L'esecuzione di loop multipli da una query non è complicata. Invece di resettare la query e crearne una nuova, si usa la rewind_posts () funzione per riavvolgere la query ed eseguirla di nuovo. E invece di definire nuovi parametri di query, si usano tag condizionali per specificare quali messaggi vengono emessi.

Nota importante: non essere tentato di usare query_posts () per modificare la query principale quando lo fai. Questo rallenterà il tuo sito più che se avessi usato più query.

In questo esempio abbiamo eseguito due cicli in base alla query principale, che consente di salvare l'utilizzo WP_Query eseguire due query aggiuntive e ridurrà il carico del server. È possibile applicare questa tecnica con una query definita dall'utente WP_Query oppure con la query principale su altre pagine di archivio, modificando il file modello appropriato.