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:
Quindi iniziamo!
Per seguire, avrai bisogno di:
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.
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.
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 '=>', ',)); ?>
Copia quello nel tuo nuovo file.
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.
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:
Tra ognuna di queste, userò rewind_posts ()
per riavvolgere i post senza reimpostare la query: stiamo ancora lavorando con la query principale ogni volta.
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;
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.
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.
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:
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.