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

Anpassade arkivmallar: En kort guide

28

När du arbetar med arkivmallar i WordPress listas inlägg vanligtvis efter datum i fallande ordning. Det vill säga, de senaste inläggen listas överst, och sedan går det därifrån.

På sistone har jag arbetat med några projekt som integreras med tredjeparts API:er. Dessa API:er returnerar datum – ibland två datum, ett startdatum och ett slutdatum – för en given händelse och kunder vill använda den informationen för att lista inlägg snarare än datumet för inlägget. Det vill säga att de vill ha anpassade arkivmallar.

Det är inte så svårt att göra det här, men innan du gör det tycker jag att det är viktigt att ge lite bakgrundsinformation om hur projektet är byggt så att det finns lite mer sammanhang kring varför, till exempel, en anpassad fråga behövs och varför du kan eller kanske behöver inte titta på pre_get_posts.

Jag börjar dock med en TL;DR först. På så sätt kan du få idén innan du läser det hela.

Anpassade arkivmallar

Så TL;DR bakom det hela är detta:

  • datuminformationen som tillhandahålls av tredje parts API sparas i post-metadatatabellen,
  • nyckeln är startdatumet och värdet är det faktiska datumet,
  • Jag beställer innehållet i fallande ordning och efter metavärdet.

Paginering kan vara lite av ett problem, och om du använder en anpassad inläggstyp behöver du några extra parametrar, men det finns den allmänna idén.

Nu till hela upplägget.

Anpassade inläggstyper

När det kommer till gränssnitt med tredje parts API:er är jag ett stort fan av anpassade inläggstyper eftersom jag tenderar att tänka på dem som en hybrid mellan modeller och vyer.

  • Modellkomponenten inkluderar allt som är tangentiellt relaterat och kan skrivas till databasen. Detta innebär all taxonomiinformation eller postmetadata.
  • View-komponenten är i allmänhet allt som går in i mallen som kan utnyttja alla redan existerande malltaggar är allt som kan behöva skapas som också läser information från databasen.

För det här inlägget kommer jag att använda acme-event som den anpassade posttypen.

Lägg upp metadata

Jag ställer in datumen i inläggets metadata snarare än i själva inlägget, för om något kommer att hända i framtiden och data ställs in på själva postposten, kommer WordPress att behandla det som ett schemalagt inlägg som är opublicerat .

Istället vill jag hellre ha inlägget publicerat och sedan ändra hur metadata visas i mallen.

Paginering

WordPress gör en subtil skillnad med paginering i sin kodbas. Det vill säga att frågevariabeln för webbplatser utan en statisk hemsida använder paged och det motsatta fallet använder page.

Anpassade arkivmallar: En kort guide

Det här spelar roll när du konstruerar argumenten för frågan som jag kommer till ett ögonblick.

Endast arkivsidor

Kom ihåg att när du introducerar sidnumrering vill du bara ändra frågan när du är på den faktiska arkivsidan.

Det betyder att du inte bryr dig om fall när du är i det administrativa området för WordPress och du inte vill ändra frågan för arkiv av icke-anpassad posttyp. För det ändamålet vill du se till att du ställer in frågevariabeln korrekt i pre_get_posts-återuppringningen.

Observera att jag kan visa en funktion för hur man gör detta, men på grund av hur vi skriver kod i WordPress – det vill säga vissa skriver procedurkod, andra skriver objektorienterad kod – så visar jag det helt enkelt i procedurkod.

Att föra ihop allt

Först ska jag bygga frågan:

<?php

$eventQuery = new WP_Query([
    'post_type' => 'acme-events',
    'post_status' => 'publish',
    'orderby' => 'meta_value',
    'order' => 'desc',
    'meta_key' => 'acme-event-start-date-time',
    'posts_per_archive_page' => 5,
    'paged' => get_query_var('paged')? get_query_var('paged'): 1
]);

Observera att i koden ovan finns ett argument för paged. Jag ska prata om koden för detta ett ögonblick.

Då kommer mallen att innehålla all information du väljer att visa. Jag väljer att inte dela koden för min mall i det här inlägget eftersom det är irrelevant för den större idén som finns.

Dessutom har du allt du behöver för att visa innehållet.

Därefter ska jag ställa in paginering. Först måste jag göra detta med pre_get_posts-kroken för att se till att rätt frågevariabel är inställd :

<?php

add_action('pre_get_posts', 'setCustomQueryVariable');
public function setCustomQueryVariable($query)
{
    if (is_admin() || !is_archive()) {
        return;
    }

    if ($query->is_archive('acme-events')) {
        set_query_var('posts_per_page', 5);
    }
}

Sedan implementerar jag pagineringen med hjälp av den anpassade frågan:

<?php

<a class="next page-numbers" href="<?php echo esc_attr(get_next_posts_page_link($eventQuery->max_num_pages)); ?>">
    Next Page
</a>

<a class="prev page-numbers" href="<?php echo esc_attr(get_previous_posts_page_link()); ?>">
    Previous Page
</a>

Och efter det kommer jag att återställa den globala $post-variabeln med wp_reset_postdata() ifall någonting från det ursprungliga inlägget behöver användas.

<?php wp_reset_postdata(); ?>

Detta anses generellt sett vara bra hushållning när du använder en anpassad fråga i alla fall.

Användbara länkar

Nedan finns en lista över funktioner, sidor och referenser som du kan ha nytta av när det gäller koden ovan eller eventuellt framtida arbete du kan göra.

Om du har arbetat med WordPress länge kan vissa av dessa verka överflödiga. I andra fall kan det verka nytt, eller så kan det kasta ljus över delar av WordPress API:er som du inte visste fanns (åtminstone var det fallet för mig).

Varför bry sig om allt detta?

Det här kan se ut som ett långt inlägg för en till synes enkel uppgift, men informationen är lite spridd över hela webben när det gäller att göra något sådant här.

Så jag ville försöka få ihop det hela med förklaringar, exempelkod och länkar till sidor som kan vara av intresse beroende på hur implementeringen går till.

När allt kommer omkring använder många av oss WordPress utöver grundläggande innehållshantering vid det här laget, men det betyder inte att vi inte bör utnyttja dess inbyggda funktioner och API:er när det är möjligt.

Inspelningskälla: tommcfarlin.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