WP_Query Argument Status, Order och Pagination

I den här delen av serien om Mastering WP_Query, Du lär dig om några av de argument du kan använda med WP_Query klass, nämligen dem för

  • status
  • ordning
  • paginering

Du kan använda dessa argument för att hämta schemalagda inlägg från databasen, att fråga bilagor, ändra hur inlägg beställs och vad de beställs av, för att ange hur många inlägg som visas och mycket mer

Men innan du kan göra det måste du förstå hur argument fungerar WP_Query.

Ett sammanfattning om hur argument fungerar i WP_Query

Innan vi börjar, låt oss få en snabb omgång om hur argument fungerar WP_Query. När du kodar WP_Query i dina teman eller plugins måste du inkludera fyra huvudelement:

  • Argumenten för frågan, med parametrar som kommer att omfattas av denna handledning
  • själva frågan
  • loopen
  • avslutas: stänger om och under taggar och återställer postdata

I praktiken kommer det att se ut som följande:

have_posts ()) // Starta looping över sökresultatet. medan ($ query-> have_posts ()) $ query-> the_post (); // Innehållet i de efterfrågade postresultaten går här.  // Återställ ursprungliga postdata. wp_reset_postdata (); ?>

Argumenten är vad som säger WordPress vilka data som hämtas från databasen och det är de som jag täcker här. Så allt vi fokuserar på här är den första delen av koden:

$ args = array (// Arguments for your query.);

Som du kan se finns argumenten i en array. Du lär dig hur du kodar dem när du arbetar genom den här handledningen.

Kodning av dina argument

Det finns ett visst sätt att koda argumenten i arrayen, vilket är enligt följande:

$ args = array ('parameter1' => 'värde', 'parameter2' => 'värde', 'parameter3' => 'värde');

Du måste bifoga parametrarna och deras värden i enskilda citattecken, använd => mellan dem och separera dem med ett komma. Om du får fel kan WordPress inte lägga till alla dina argument på frågan eller du kan få en vit skärm.

Statusparametrar

Som du vet om du någonsin har konverterat ett inläggs status från Utkast till Publicerat, eller kanske lägger det i papperskorgen, tilldelar WordPress en status till varje inlägg. Du kan använda post_status parameter för att fråga efter inlägg med en eller flera statuser.

De tillgängliga argumenten är:

  • publicera: En publicerad post eller sida.
  • avvaktan: Inlägget väntar på granskning.
  • förslag: Ett inlägg i utkaststillstånd.
  • auto-utkast: Ett nyskapat inlägg, utan innehåll.
  • framtida: Ett inlägg att publicera i framtiden.
  • privat: Ej synlig för användare som inte är inloggade.
  • ärva: En revision.
  • skräp: Inlägget finns i trashbin.
  • några: Hämtar någon status utom de från poststatuserna med 'Exclude_from_search' satt till true (dvs.. skräp och auto-utkast).

Om du inte anger en status i dina sökargument, kommer WordPress som standard till publicera; Om den nuvarande användaren är inloggad kommer den också att innehålla inlägg med status för privat. Om du kör en fråga på adminsidorna kommer WordPress även att inkludera de skyddade statuserna, som är framtidaförslag och avvaktan som standard.

Så låt oss säga att du kör en händelsessida och du använder en anpassad posttyp av händelse, med publiceringsdatum som det datum händelsen äger rum. Som standard kommer WordPress inte visa några händelser som inte har hänt än: trots att du har planerat dem, är deras schemalagda datum i framtiden så deras poststatus är framtiden.

För att komma runt detta använder du helt enkelt dessa argument:

$ args = array ('post_type' => 'händelse', 'post_status' => 'framtid');

Detta visar bara de händelser som inte har hänt än, eftersom de kommer att ha publicera status. Men om du också vill visa händelser som har hänt kan du använda en rad poststatuser som inkluderar mer än en:

$ args = array ('post_type' => 'event', 'post_status' => array ('future', 'publicera'));

De post_status parameter är viktigt när du frågar efter bilagor. Detta beror på att de har status av ärva, inte publicera. Så att fråga om alla bilagor, skulle du använda det här:

$ args = array ('post_type' => 'attachment', 'post_status' => 'ärva');

Alternativt kan du ersätta ärva med några vilket skulle ha samma effekt.

Orderparametrar

Det finns två parametrar du använder för att beställa inlägg som hämtas av WP_Query: ordning och sortera efter. Som du förväntar dig, ordning definierar den ordning i vilken inlägg kommer att matas ut i slingan och sortera efter definierar vilket fält i databasen de ska sorteras efter.

Låt oss börja med att titta på argumenten för ordning.

Ordningsparametern

Det finns bara två argument du kan använda för detta:

  • ASC: stigande ordning från lägsta till högsta värden (1, 2, 3; a, b, c).
  • DESC: fallande ordning från högsta till lägsta värden (3, 2, 1, c, b, a).

Dessa är ganska självförklarande. Om du inte innehåller ett argument för ordning, WordPress kommer som standard till DESC.

Orderby Parameter

Du kan sortera dina inlägg med en rad olika fält:

  • ingen: Ingen order (tillgänglig med Version 2.8).
  • ID: Beställ via post id. Notera kapitaliseringen.
  • författare: Beställ av författare.
  • titel: Sortera efter titel.
  • namn: Sortera efter post slug.
  • typ: Beställ enligt posttyp.
  • datum: Beställ efter datum.
  • ändrad: Beställ efter senast ändrat datum.
  • förälder: Beställ via post / sida föräldra id.
  • rand: Slumpmässig ordning.
  • COMMENT_COUNT: Beställ efter antal kommentarer.
  • menu_order: Beställ efter sidord. Används oftast för sidor (med det värde du lägger till i metaboxen på skärmen Redigera sidor) och för bilagor (med heltalsfälten i dialogrutan Infoga / ladda upp medias galleri) men kan användas för alla posttyper med menu_order aktiverad.
  • meta_value: Sortera efter värdet för en metatangent (eller anpassat fält). Detta fungerar bara om du även innehåller en meta_key parameter i dina argument. Meta-värden sorteras alfabetiskt och inte numeriskt (så 34 kommer före 4). 
  • meta_value_num: Sortera efter numeriskt metavärde. Som med meta_value, du måste också inkludera a meta_key argument i din fråga.
  • post__in: Bevara post-ID-order som ges i post__in array.

Standard är datum, d.v.s. det datum ett inlägg publicerades.

Så till exempel om du vill sortera dina inlägg efter titel i stigande ordning, skulle du använda dessa argument:

$ args = array ('orderby' => 'title', 'order' => 'ASC');

Beställa av flera fält

Du behöver inte hålla fast vid ett fält för att sortera dina inlägg av. För att sortera efter flera fält använder du en matris med sortera efter parameter och (valfritt) med ordning parameter om du vill sortera varje fält i en annan ordning.

Så låt oss säga att du har ett anpassat fält för betyg som du vill använda för att sortera på en e-handelsplats. Du kan sortera efter betyg och sedan titel, både i stigande ordning, så här:

$ args = array ('orderby' => array ('meta_value_num', 'title'), 'order' => 'ASC', 'meta_key' => 'rating');

Observera att jag har inkluderat meta_key argument att låta WordPress veta vilket anpassat fält jag använder. Du gör detta på grund av det sätt som WordPress lagrar efter metadata: inte i wp_posts bord, men i wp_postmeta tabell.

Men vad händer om du ville beställa genom betyg i fallande ordning och sedan titel i stigande ordning? Du använder helt enkelt en annan matris:

$ args = array ('orderby' => array ('meta_value_num', 'title'), 'order' => array ('DESC', 'ASC'), 'meta_key' => 'rating');

Du kan också sortera efter flera fält när du inte använder postmetadata, till exempel att sortera efter posttyp och sedan datum:

$ args = array ('orderby' => array ('typ', 'datum'), 'order' => array ('ASC', 'DESC'));

Detta skulle sortera per posttyp i stigande ordning och sedan inom varje posttyp, efter datum i fallande ordning.

Paginationsparametrar

Nästa uppsättning parametrar vi kommer till är för pagination. Dessa hjälper dig att definiera hur många inlägg som kommer att ställas och hur paginering ska fungera när de utmatas.

De tillgängliga parametrarna är:

  • nopaging (boolean): Visa alla inlägg eller använd paginering. Standard är 'falsk', d.v.s. användningspaginering.
  • posts_per_page (int): Antal inlägg som ska visas per sida.
  • posts_per_archive_page (int): Antal inlägg som endast ska visas per ark på arkivsidor.
  • offset (int): Antal inlägg till förflytta eller passera över.
  • paged (int): Sidan i arkivet vilka inlägg visas från.
  • sida (int): Antal sidor för en statisk frontsida. Visa inlägg som normalt skulle dyka upp precis på sidan X på en statisk startsida.
  • ignore_sticky_posts (boolean): Ignorera efterklibbar-standard till falsk.

Låt oss ta en titt på några exempel. 

Antal inlägg och avräkningsposter

Till exempel, för att visa de fem senaste inläggen:

$ args = array ('posts_per_page' => '5');

Eller för att visa fem senaste inlägg utom den senaste:

$ args = array ('posts_per_page' => '5', 'offset' => '1');

Observera att även om du hämtar inlägg från de senaste sex inläggen i databasen, använder du fortfarande 'posts_per_page' => '5' som det är antalet inlägg som kommer att utföras.

Med detta lite längre kan du skriva två frågor: en för att visa senaste inlägget och en sekund för att visa tio fler inlägg, exklusive det här inlägget:

$ args = array ('posts_per_page' => '1'); // Fråga och loop gå här samt återställa inlägg. $ args = array ('posts_per_page' => '10', 'offset' => '1'); // Andra fråga, slinga och återställning gå hit.

Du kan också använda posts_per_page att visa Allt inlägg:

$ args = array ('posts_per_page' => '-1');

Klibbiga inlägg

Normalt visas dina klibbiga inlägg först i alla frågor: Om du vill åsidosätta detta, använd ignore_sticky_posts:

$ args = array ('posts_per_page' => '5', 'ignore_sticky_posts' => true);

Ovanstående argument kommer att returnera de senaste fem inläggna oavsett om de är klibbiga eller inte.

Observera att om du bara vill visa klibbiga inlägg måste du använda get_option () funktion och post__in argument som följer:

$ klibbig = get_option ('sticky_posts'); $ args = array ('posts_per_page' => '5', 'post__in' => $ klibbigt);

Ovanstående skulle visa de sista fem klibbiga inläggen: om det finns mindre än fem (t ex tre) klibbiga inlägg, kommer det inte att visa icke klibbiga inlägg men bara de senaste tre klibbiga inläggen.

Pagination i arkiv

Förutom att definiera hur många inlägg som hämtas från databasen kan du också använda paginationsparametrar för att definiera hur de resulterande inläggen kommer att pagineras på arkiv och söksidor.

Så till exempel på en arkivsida kan du använda den här koden för att visa 20 inlägg per sida i arkivet:

$ args = array ('posts_per_archive_page' => '20');

Notera posts_per_archive_page argumentet kommer att åsidosättas posts_per_page.

Du kan också välja att bara skriva ut de sidor som skulle visas på en given sida i paginerade sidor. Så om du till exempel vill visa de 20 inlägg som skulle visas på den tredje sidan i exemplet ovan skulle du använda det här:

$ args = array ('posts_per_archive_page' => '20', 'paged' => '3');

Ett alternativt sätt att fråga samma inlägg skulle vara att använda offset argument:

$ args = array ('posts_per_page' => '20', 'offset' => '40');

Detta hoppar över de första 40 inläggen (som skulle vara på de två första arkivsidorna) och hämtar de 20 följande inläggen (som skulle vara på den tredje arkivsidan. En av de saker jag älskar om WordPress är hur det ofta ger dig mer än ett sätt att uppnå något!

Du kan också stänga av paginering helt och hållet för att se till att alla inlägg visas på samma sida:

$ args = array ('nopaging' => true);

Sammanfattning

De WP_Query klass ger dig mycket flexibilitet när det gäller att bestämma hur många inlägg du vill fråga, vilken ordning du vill visa dem och vilken status post du vill visa.

Några av dessa argument är nödvändiga för att fråga vissa typer av inlägg (till exempel 'post_status' => 'ärvt' för bilagor), medan andra helt enkelt ger dig större kontroll över hur dina frågor kör.

Genom att använda dessa parametrar kan du skapa anpassade frågor som gör mycket mer än att helt enkelt lägga ut de senaste publicerade inläggen.