✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

Guide: Hur man frågar efter inlägg i WordPress

48

Vilka metoder finns tillgängliga för att göra en anpassad inläggsfråga, och när är de bäst att använda? Det här inlägget syftar till att skapa en solid förståelse för två metoder för att fråga inlägg, hur man kommer åt resultaten, hur man bygger argument och slutligen hur man städar efter det. De två metoderna vi ska titta på är get_posts()och WP_Query.

När det gäller att göra en ny inläggsfråga finns det egentligen två alternativ (i skrivande stund). Valet beror egentligen bara på dina preferenser (och någon mindre prestandaeffekt). Ett alternativ har potential att förstöra den globala loopen/frågan som du för närvarande befinner dig i, om du inte hanterar den på rätt sätt. Med det ena alternativet hanterar du objekt och i det andra alternativet hanterar du en array. Argumenten för att anpassa efterfrågan är dock identiska.

Global fråga?

Om du är osäker på vad jag menar med att "röra till den globala frågan" är det denna. WordPress gör alltid en global fråga, beroende på vilken sida du befinner dig på. Om en besökare besöker ett kategoriarkiv har WordPress gjort en inläggsfråga för detta Temat skulle normalt komma åt inlägg i frågan med hjälp av "slingan".När vi gör en ny fråga med en egen loop inuti denna loop måste vi se till att WordPress globala fråga och vår fråga hanteras separat.

Men om du vill ändra WordPress inläggsfråga är det en annan historia. Jag har ett annat inlägg som går på djupet om hur man gör det.

Låt oss titta på de två alternativen vi har och hur vi hanterar dem. Efter det ska vi titta på argumenten för att anpassa frågan. Tänk på att argumenten är identiska för båda.

De två metoderna att fråga efter inlägg

Du kan fråga inlägg med antingen funktionen get_posts()eller skapa en ny instans av WP_Query.Det första alternativet returnerar en array av inlägg och i det andra hanterar du ett objekt. Eftersom get_posts()returnerar en uppsättning av bara inläggen är det vanligtvis enklare att använda detta var du vill. Men om du vill paginera din fråga bör du definitivt satsa på att skapa en WP_Queryinstans.

Funktionen get_postsär en omslagsfunktion för WP_Queryvilket betyder att den accepterar samma argument, men get_postshar några ytterligare "alias"-argument. WordPress dokumentationssida för get_posts listar inte möjliga argument (förutom aliasargumenten), utan hänvisar till dokumentationssidan för WP_Query för argumenten. Vi ska titta närmare på argumenten senare.

Om prestanda är ett problem (dvs. webbplatsen har många inlägg), get_postsär det snabbare än att använda WP_Queryeftersom det hoppar över beräkningen för sidnumrering.

Metoden för att gå igenom din anpassade inläggsfråga skiljer sig beroende på vilken metod du väljer. Du bör vara bekant med den vanliga WordPress-loopen som används i nästan alla temamallar:

if (have_posts()) {
    while (have_posts()): the_post();
        // Access to each post; you can use template tags here
    endwhile;
}

Loopar med WP_Query

Att loopa resultaten från användningen WP_Queryär exakt samma, förutom att vi specifikt refererar till instansobjektet i loopen. Vi måste också komma ihåg att "återställa tillståndet" efter att vi är klara med looping så att det globala postobjektet återställs till vad det var tidigare. För att göra det använder vi wp_reset_postdata().

$custom_query = new WP_Query([/ Arguments here /]);
if ($custom_query->have_posts()) {
    while ($custom_query->have_posts()): $custom_query->the_post();
        // Access to each post; you can use template tags here
    endwhile;
    wp_reset_postdata();
}

Om du dumpar objektet instansierat av WP_Query( $custom_queryi exemplet ovan) hittar du hela frågan och argumenten som används. De intressanta delarna här är egenskaperna ’ found_posts’ och ’ posts’. Egenskapen ’ posts’ innehåller resultatet av postobjekt som slingan kommer att gå igenom. Antalet inlägg som matchade din fråga returneras i ’ found_posts’ och är användbart om du vill göra en anpassad sidnumrering. Dela det här värdet med WordPress-inställningen för antal inlägg per sida för att ta reda på hur många sidor du behöver för din fråga, eller hänvisa helt enkelt till egenskapen ’ max_num_pages’.

Obs: När du använder get_postsWordPress returnerar endast postsegenskapen ’ ’ (som är en array) från WP_Queryobjektet.

Loopar med get_posts

Genom att använda använder get_postsvi inte den vanliga "WordPress-loopen", istället använder vi en normal PHP-arrayslinga. Varje element i arrayen är postobjekt, och ingen återställning är nödvändig efter att du är klar med looping. Tänk på att malltaggar (som the_title(), the_permalink()etc) inte är tillgängliga i denna loop. Du måste hänvisa till postobjektets egenskaper (t.ex. $custom_post->ID).

$custom_query = get_posts([/ Arguments here /]);
foreach ($custom_query as $custom_post) {
    // Template tags are not available here, refer to the post object properties, for example:
    echo $custom_post->post_title;
}

Jag rekommenderar att du döper dina inläggsobjekt till något annat än $post. Du kan stöta på problem när du försöker komma åt inläggsegenskaper (det kan hänvisa till det globala postobjektet och inte posten i slingan).

Om du vill använda malltaggar för att lättare komma åt inläggsinformation (som the_title()och the_permalink()), kan du göra det. Gör detta genom att säga åt WordPress att ställa in det globala postobjektet i slingan med setup_postdata(). Om du gör detta måste du återställa tillståndet med wp_reset_postdata()efter loopen.

$custom_query = get_posts([/ Arguments here /]);
foreach ($custom_query as $post) {
    setup_postdata($post);
    // Template tags are available here, for example:
    the_title();
}
wp_reset_postdata();

Tänk på att setup_postdataobjekten du går igenom (asdelen " " i varje loop) måste namnges $post! I det första exemplet namngav jag postobjekten $custom_postoch detta skulle inte fungera med setup_postdata().

Men om du bara behöver tillgång till grundläggande inläggsinformation kan du lika gärna hoppa över inställningen av det globala postobjektet och hellre använda motsvarande " get_"-malltaggar och inläggs-ID. Taggen the_permalink()fungerar till exempel bara korrekt om det globala postobjektet är inställt, men du kan begära postpermalänken utan det globala postobjektet helt enkelt genom att använda echo get_the_permalink($custom_post->ID).

Fråga argument

Du kan hitta den fullständiga listan över alla möjliga argument på WP_Querys dokumentationssida. Exempel på parametrar är inlägg med specifika term(er) från en taxonomi, postmetavärden, inläggstyper, inkludering eller exkludering av specifika inlägg och en hel rad alternativ för att sortera resultaten. Det finns för många för att gå igenom var och en i detalj, men här är några vanliga exempel på argument för att fråga inlägg.

Exempel 1: Relaterade inlägg från samma kategori

Låt oss säga att du vill visa ett "relaterade inlägg" i slutet av ett enskilt inlägg. Den ska visa ett slumpmässigt urval av 3 inlägg som är i samma kategori som det aktuella inlägget, och det ska utesluta det aktuella inlägget från resultatet.

$post_id = get_the_ID();  // current post ID
$custom_query = new WP_Query([
    'post_type' => 'post',
    'posts_per_page' => 3,
    'category__in' => wp_get_post_categories($post_id),
    'post__not_in' => [$post_id],
    'orderby' => 'rand'
]);

Argumenten är ganska självförklarande. Jag ber om endast ’ post’ i ’ post_type’ och max 3 inlägg i ’ posts_per_page'.

För att söka efter inlägg i kategorier kan du bygga en tax_query eller använda det enklare ’ category__in’ (OBS: Fungerar endast för postkategori). I exemplet ovan använder jag wp_get_post_categories()för att få en uppsättning term-ID:n tilldelade det angivna inlägget, och använder detta för argumentet ’ category__in’.

Du kan utesluta inläggs-ID:n med ’ post__not_in’ medan jag angav det aktuella inläggs-ID:n. Till slut bad jag om en slumpmässig ordning av inlägg genom att ställa in ’ rand’ i ’ orderby’. Du kan ange t.ex. ’ title’ eller ’ date’ för att beställa dem på ett annat sätt. Ta en titt på dokumentationen för beställning för att se vad som är möjligt.

Exempel 2: Alla inlägg från en anpassad inläggstyp med flera ordningsargument

I det här exemplet antar vi att du har en anpassad inläggstyp ’ book’ och i en anpassad sidmall vill du visa alla publicerade böcker. Du vill beställa inläggen i första hand efter menu_order (sidattributet, det är ett nummer du kan ställa in per post), och i andra hand posttitel.

$custom_query = new WP_Query([
    'post_type' => 'book',
    'posts_per_page' => -1,
    'orderby' => ['meny_order' => 'ASC', 'title' => 'DESC']
]);

Återigen är argumenten ganska självförklarande. Jag begär inläggstyp ’ book’ som ’ post_type’. När du ställer in ’ posts_per_page’ till -1 kommer det att hämta alla (publicerade inlägg, om du inte anger något annat i ’ post_status’ argument). Slutligen tillhandahåller jag en array till ’ orderby’ för att berätta för WordPress att sortera inläggen i första hand efter menyordning i stigande ordning, och för det andra postrubrik i fallande ordning.

Exempel 3: Inlägg med anpassad metadata

Låt oss anta att du har en anpassad inläggstyp ’ book’ och du vill fråga alla böcker som antingen är opublicerade eller en bok som publicerats mellan åren 1990 och 2019.

$custom_query = new WP_Query([
    'post_type' => 'book',
    'posts_per_page' => -1,
    'meta_query' => [
        'relation' => 'OR',
        [
            'key' => 'book_status',
            'value' => 'unpublished',
            'compare' => '='
        ],
        [
            'key' => 'year_published',
            'value' => [1990, 2019],
            'type' => 'numeric',
            'compare' => 'BETWEEN'
        ]
    ]
]);

Att bygga en fråga genom att använda post-meta görs bäst med meta_query(för mycket enkla meta-argument kan du använda meta_keyoch meta_valuedirekt). Argumentet ’ meta_query’ kräver en array, där varje argument är en array. Du kan styra relationen mellan varje argument med ’ relation’, som jag satte till ’ OR’ i exemplet ovan.

Jag tillhandahåller två metadataargument till ’ meta_query’. Den första jämför helt enkelt meta-nyckeln ’ book_status’ med texten ’ unpublished’, och om den är lika kommer den att inkluderas. I det andra argumentet säger jag åt WordPress att få vilket värde som helst i meta-nyckeln ’ year_published’ som är mellan siffrorna 1990 och 2019.

Slutsats

Du bör nu ha en grundläggande förståelse för de två metoderna för att fråga inlägg. Det är ingen stor skillnad eftersom du kan skapa samma fråga med båda, men sättet att hantera de två är olika. De tre exemplen på frågeargument berör bara ytan av vilka frågor du kan skapa. Se WP_Query-dokumentationen för en fullständig översikt med massor av exempel.

Om du är nyfiken på hur du ändrar den globala frågan som WordPress utför, har jag ett separat inlägg som går in på djupet om det.

Inspelningskälla: awhitepixel.com

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer