WordPress är ett CMS och därför är innehållsmanipulation en av huvudpelarna i verktyget. I det här inlägget kommer du att förstå processen som används av WP för att hämta vad som behöver visas och hur det är möjligt att ändra denna process.
syftet med denna text är inte på något sätt en ersättning för officiell dokumentation, som alltid bör konsulteras. Ditt mål är att sätta på ett ställe vad nybörjare bör veta innan de börjar söka efter mer information.
- Vad är en WordPress-fråga?
- vad är WP_Query?
- villkorliga taggar och WP_Query
- skapa dina egna slingor: WP_Query och get_posts ()
- skapa en slinga med WP_Query
- skapa en slinga med get_posts ()
- skillnad mellan WP_Query och get_posts()
- global WordPress wp_query och WordPress wp_the_query
- varför ska inte query_posts() användas i temafiler?
- Hur ändrar jag huvudfrågan? Använd pre_get_posts
- ett annat exempel: ta bort en kategori från listan över blogginlägg
- slutsats
Vad är en WordPress-fråga?
fråga på engelska betyder fråga och är vanligtvis termen som används för att hänvisa till ett uttalande i SQL (Structured Query Language). I WordPress kallar vi frågor frågorna för innehåll som görs via WP_Query-klassen.
vad är WP_Query?
WP_Query är PHP-klassen bakom alla sökningar efter innehåll i WordPress. Den accepterar flera parametrar i sin konstruktion, inklusive posttyper, metadata, taxonomier och datum, samt gör det möjligt att skapa anpassade parametrar.
WP_Query-klassen utlöses på alla förfrågningar som görs till din webbplats, med undantag för kanske mycket sällsynta undantag för Plugin-kontrollerade adresser som avbryter det normala flödet. Varje gång vi kallar en sida, ett inlägg, en taxonomi term och etc. WordPress tolkar den begärda adressen via rewrite API och skapar en WP_Query baserat på de tolkade argumenten.
villkorliga taggar och WP_Query
skapa dina egna slingor: WP_Query och get_posts ()
när vi hänvisar till slingan i WordPress talar vi om iteration (utan n) av de valda inläggen. Vanligtvis har vi bara en slinga, som alltid liknar koden nedan:
om det finns inlägg, iterera över dem. Det första uttalandet inuti while
är the_post()
, som berättar för WordPress att sätta variablerna i nästa inlägg i slingan i den globala variabeln $post
, via setup_postdata()
– metoden i WP_Query-klassen.
detta är utseendet på huvudslingan, det vill säga iterationen av den uppsättning inlägg som WordPress hittade vid avkodning av begäran och sökning efter motsvarande innehåll. Om vi behöver en annan uppsättning inlägg (relaterat innehåll, innehåll i en viss kategori utanför din fil eller inlägg publicerade efter det som visas, till exempel) kan vi göra det på två sätt: skapa ett nytt WP_Query-objekt eller anropa get_posts () – funktionen. De båda gör samma sak, men de kommer att återvända till dig olika saker.
skapa en slinga med WP_Query
ett enkelt exempel på hur man skapar en slinga med WP_Query:
Lägg märke till hur testet och iterationen på have_posts()
förblir där, precis som the_post()
, men den här gången som metoder för variabeln vi skapade.
funktionen wp_reset_postdata () tjänar till att återställa den globala variabeln $post
till dess tillstånd före vår fråga, det vill säga den kommer att sätta tillbaka i global $post
posten global $wp_query
, som vi kommer att se senare.
skapa en slinga med get_posts ()
samma exempel med funktion get_posts()
:
funktionen get_the_title () accepterar som en parameter ett inlägg som skiljer sig från vad som finns i den globala variabeln $post
. Om du behöver använda funktionen_content () måste du till exempel ändra den globala, enligt följande:
skillnad mellan WP_Query och get_posts()
den grundläggande skillnaden är vad du har tillgång till. Med WP_Query har du tillgång till antalet inlägg som finns totalt ($query->found_posts
) och antalet möjliga sidor ($query->max_num_pages
), till exempel. Funktionen get_posts()
å andra sidan ger några redan fyllda argument förutom att de som standard är något snabbare: den passerar parametern no_found_rows
som sant, vilket förhindrar att den slutliga frågan har alternativet SQL_CALC_FOUND_ROWS
och därmed undantar MySQL från att passera den totala mängden rader som hittats.
global WordPress wp_query och WordPress wp_the_query
i denna process för att tolka begäran och generera WP_Query-klassobjektet skapar WordPress två globala variabler: $wp_query
, som du förmodligen har sett någonstans, och $wp_the_query
, som alltid kommer att vara den ursprungliga kopian av vad som begärdes av användaren. Om någon bråkar med $wp_query
, kan vi åtminstone få tillbaka det till sitt normala tillstånd med $wp_the_query
. Det här är exakt vad wp_reset_query () – funktionen gör.
varför ska inte query_posts() användas i temafiler?
detta är standardflödet för en begäran till en adress på din webbplats utanför instrumentpanelen:
du bör inte använda query_posts () eftersom det har kallats tidigare. Genom att ringa det igen kommer du att duplicera behandlingen (be WordPress att göra en annan fråga) och dessutom potentiellt ignorera vad vissa plugins redan har använt.
personsökning är ett annat exempel på hur användning av query_posts()
kan störa ditt arbete. Om du vill visa 15 inlägg per sida i en viss kategori och försöka skriva över standard WP-beloppet genom query_posts()
kommer du att ha en situation där det första objektet på den andra sidan ska vara den 16: e, men i själva verket är det bara den 11: e.
Hur ändrar jag huvudfrågan? Använd pre_get_posts
att använda query_posts()
har varit oanvändbart under en tid. Sedan dess har många förklarat varför och uppmuntrat utvecklare att använda action pre_get_posts, med särskild tonvikt på Leo Bahiano, som kärleksfullt smeknamnet action preguetinho (användningen av ordlekar med preguetinho do Leo Bahiano är tillåten i kommentarerna).
användningen är enkel. För att eliminera personsökning i sökningen kan du till exempel använda följande kod i ditt temas functions.php
:
koden tilldelar sin funktion till hook pre_get_posts
, så dess funktion kommer att utföras varje gång en fråga behandlas. Inom det måste vi se till att vi bara kommer att arbeta med nödvändiga frågor, så vi testar om vi verkligen befinner oss i den ”främre” delen av webbplatsen (på detta sätt stör vi ingenting från panelen), om vi är i sidans huvudfråga, det vill säga om frågan i fråga är $wp_the_query
och om allt detta är sant ändrar vi attributet posts_per_page
till -1
, vilket betyder ingen gräns för inlägg.
ett annat exempel: ta bort en kategori från listan över blogginlägg
om du behöver många ändringar kan du gå med dem alla i en enda funktion: