Combinatie van WP_Query met de hoofdquery

Tot nu toe in deze serie heb je geleerd hoe te gebruiken WP_Query om aangepaste queries te maken voor gebruik in uw thema of plug-ins.

In de meeste gevallen gebruik je WP_Query met een geheel nieuwe set argumenten die los staan ​​van die in de hoofdquery, maar wat als je de hoofdquery in je argumenten wilt opnemen?

Voorbeelden van wanneer u dit wilt doen zijn:

  • op een categorie- of taxonomiepagina, waarbij alleen berichten van één berichttype worden weergegeven
  • op een categoriepagina, berichten weergeven met de huidige categorie en een andere categorie of een tag- of taxonomieterm
  • op een pagina voor een berichttype, alleen berichten met bepaalde metadata weergeven

Ik kan doorgaan - er zijn voldoende mogelijkheden om de hoofdquery te combineren met uw eigen aangepaste query.

Ik ga dit demonstreren met drie voorbeelden: de eerste zal een eenvoudig voorbeeld zijn met één lus; de tweede zal gebruiken foreach om meerdere lussen uit te voeren, één voor elk berichttype; en de derde zal twee berichttypen in een categoriearchief uitvoeren met behulp van twee afzonderlijke query's.

Een variabele definiëren op basis van de hoofdquery

Je gaat je hoofdvraag echter combineren met WP_Query, u moet het huidige query-object opslaan op een manier die het eenvoudig te gebruiken maakt in uw WP_Query argumenten. De eenvoudigste manier om dit te doen is door het aan een variabele toe te wijzen.

U doet dit voordat u uw WP_Query argumenten, zoals zo:

$ mainquery = get_queried_object ();

De get_queried_object () functie retourneert het momenteel opgevraagde object, wat dat ook moge zijn. Bij een enkele post retourneert deze het post-object, terwijl in een archief de categorie, tag, term-object of welk object dan ook gerelateerd is aan het archief. Het geeft de ID van het opgevraagde object als resultaat.

Je kunt dit dan gebruiken $ mainquery variabele in uw WP_Query argumenten. Laten we nu eens enkele voorbeelden bekijken.

Voorbeeld 1: Alleen berichten van een berichttype weergeven op een categoriepagina

Laten we zeggen dat uw site een aangepast berichttype heeft toegevoegd en u hebt categorieën voor dat aangepaste berichttype ingeschakeld. In het categoriearchief voor elke categorie, wil je geen berichten weergeven: in plaats daarvan wil je berichten van je nieuwe berichttype weergeven - laten we het noemen artikel.

Uw zoekopdracht kan er ongeveer zo uitzien:

 $ mainquery-> slug, 'post_type' => 'product'); // Aangepaste zoekopdracht. $ query = new WP_Query ($ args); // Controleer of we queryresultaten hebben. if ($ query-> have_posts ()) // Begin met lus over de queryresultaten. while ($ query-> have_posts ()) $ query-> the_post (); // Inhoud van de opgevraagde resultaten van de post ga hier naartoe.  // Oorspronkelijke berichtgegevens herstellen. wp_reset_postdata (); ?>

Omdat het categorie naam De parameter die ik hierboven heb gebruikt, neemt de categorie slug als argument, u moet toevoegen -> slug na de variabele om de categorie slug uit te voeren.

Dit geeft je een query waarmee berichten van de. Worden opgehaald artikel berichttype uit de database met de momenteel opgevraagde categorie. Je zou het gebruiken op de category.php paginasjabloon.

Opmerking: u kunt dit resultaat ook bereiken met behulp van de pre_get_posts haak om de hoofdvraag aan te passen, gecombineerd met een voorwaardelijke functie om te controleren op categoriearchieven.

Voorbeeld 2: Combineer de hoofdquery met WP_Query en foreach tot Output Multiple Loops

In het volgende voorbeeld worden alle berichten voor de huidige categoriepagina weergegeven, maar in plaats van ze allemaal in één blok weer te geven, worden ze gescheiden op basis van het berichttype.

Dit betekent dat u uw berichttypen kunt sorteren in blokken of kolommen op uw pagina met behulp van CSS, of ze eenvoudig kunt scheiden in verschillende lijsten.

Om dit te doen, zou je de volgende code gebruiken:

 $ mainquery-> slug, 'post_type' => $ post_type); // Aangepaste zoekopdracht. $ query = new WP_Query ($ args); // Controleer of we queryresultaten hebben. if ($ query-> have_posts ()) // Begin met lus over de queryresultaten. while ($ query-> have_posts ()) $ query-> the_post (); // Inhoud van de opgevraagde resultaten van de post ga hier naartoe.  // Oorspronkelijke berichtgegevens herstellen. wp_reset_postdata (); ?>

Dit gebruikt de $ mainquery variabele die we eerder hebben gebruikt, maar er wordt ook een toegevoegd $ post_types variabele om alle op de site geregistreerde berichttypen op te slaan, en a $ post_type variabele om elk individueel berichttype om beurten op te slaan.

Voorbeeld 3: twee afzonderlijke query's voor twee berichttypen

Het laatste voorbeeld is vergelijkbaar met de tweede, maar scheidt de berichttypen in twee afzonderlijke query's, elk met zijn eigen afzonderlijke lus. Dit geeft je meer controle over wat er voor elk wordt weergegeven, zodat je berichten anders dan producten kunt weergeven, inclusief een uitgelichte afbeelding voor producten of ze een andere lay-out geven.

Laten we zeggen dat uw site de artikel berichttype geregistreerd, met categorieën die hiervoor zijn ingeschakeld en je schrijft ook blogposts met dezelfde categorieën. Op elke categoriearchiefpagina wilt u de tien meest recente berichten weergeven en vervolgens wilt u een lijst met alle producten in dezelfde categorie weergeven.

Om dit te doen, zou je iets als deze code gebruiken:

 $ mainquery-> slug, 'post_type' => 'post', 'posts_per_page' => '10'); // Aangepaste zoekopdracht. $ query = new WP_Query ($ args); // Controleer of we queryresultaten hebben. if ($ query-> have_posts ()) // Begin met lus over de queryresultaten. while ($ query-> have_posts ()) $ query-> the_post (); // Inhoud van de opgevraagde resultaten van de post ga hier naartoe.  // Oorspronkelijke berichtgegevens herstellen. wp_reset_postdata (); // Tweede zoekopdrachtargumenten voor producten. $ args = array ('category_name' => $ mainquery-> slug, 'post_type' => 'product', 'posts_per_page' => '-1'); // Aangepaste zoekopdracht. $ query = new WP_Query ($ args); // Controleer of we queryresultaten hebben. if ($ query-> have_posts ()) // Begin met lus over de queryresultaten. while ($ query-> have_posts ()) $ query-> the_post (); // Inhoud van de opgevraagde resultaten van de post ga hier naartoe.  // Oorspronkelijke berichtgegevens herstellen. wp_reset_postdata (); ?>

Vervolgens schrijft u elke lus anders om verschillende gegevens uit te geven voor elk berichttype.

Samenvatting

Zoals je aan de voorbeelden hierboven kunt zien, is het mogelijk om te gebruiken WP_Query niet alleen om volledig aangepaste query's apart van de hoofdquery te maken, maar ook om het momenteel bevraagde object op te nemen en krachtigere query's op archiefpagina's te maken.

De bovenstaande voorbeelden kunnen ook met andere archetypen worden gebruikt: voor taxonomieën, auteurs, datums en meer. Kijk of je meer mogelijkheden kunt bedenken!