fredag 27 mars 2009

Visa tid och datum på rätt sätt i ditt WordPress-tema

Som jag tidigare antytt så anser jag att WordPress-API:t kunde vara snyggare designat. Ett härligt exempel är när man loopar igenom en uppsättning med blogginlägg och skriver ut respektive publiceringsdatum - en uppgift som i princip varje tema måste göra eftersom det är relevant information på alla sidor som listar inlägg.

Tittar man i dokumentationen efter en lämplig funktion för att skriva ut datumet hittar man snabbt den lovande the_date(). Beskrivningen börjar bra:
Displays or returns the date of a post, or a set of posts if published on the same day.
Tilläggas bör att funktionen anropas en gång per post, inuti en loop vars "inre" kontext är "ett inlägg". Men vad menar de med slutet av meningen, "...or a set of posts if published on the same day"? Det är väl självklart att den kommer ge samma resultat för alla inlägg som är publicerade på samma dag...eller? Icke! Läser man vidare i dokumentationen så hittar man detta:
SPECIAL NOTE: When there are multiple posts on a page published under the SAME DAY, the_date() only displays the date for the first post (that is, the first instance of the_date()). To repeat the date for posts published under the same day, you should use the Template Tag the_time() with a date-specific format string.
What now? Bäst att testa...och resultatet visar sig vara att om man har två inlägg som visas upp på samma sida och är publicerade samma dag så returnerar the_date() tom sträng för alla anrop efter det första, tills loopen kommit till ett inlägg som har ett annat datum. Helt intuitivt...eller? Man skulle ju kunna tycka att det är upp till temautvecklaren (användaren av API:t) att avgöra om inlägg ska grupperas ihop eller inte...men men.

Det slutar dock inte där. En bra grej med the_date() är att den använder den datumformatering som blogganvändaren (författaren/administratören) själv har valt i administrationsgränssnittet som default. Det är möjligt att skicka in en annan formatsträng om man vill, men det skulle kunna uppfattas som förvirrande om blogganvändaren ställer in ett format och sedan visas ett helt annat som temautvecklaren hårdkodat, eller hur? Funktionen the_time() fungerar på samma sätt, fast med tidsformat istället för datum förstås. Så om rekommendationen om man vill skriva ut datumet för alla inlägg på en och samma sida (där flera inlägg kan ha samma datum) är att använda the_time(), då måste man ju skicka in en formatsträng. Väldigt många temautvecklare verkar "lösa" problemet genom att koda in en datumformatsträng de anser lämplig direkt i temat. Och det är precis vad WordPress-utvecklarna själva gör i sitt officiella default-tema, som de rekommenderar temautvecklare att ha som referens.

Det är faktiskt möjligt att få fram de datum- och tidsformatsträngar som blogganvändaren ställt in i adminsystemet, och det är vad jag tycker borde vara självklart i alla teman (förutom att the_date() borde skrivas om så att den beter sig konsekvent förstås). Jag kikade lite i källkoden för WordPress och hittade funktionen get_option(). Den tar ett parameternamn som argument och returnerar motsvarande systeminställning.

get_option('date_format'); // Returnerar datumformatsträngen
get_option('time_format'); // Returnerar tidsformatsträngen

Alltså: för att visa publiceringsdatum per inlägg på en sida där flera inlägg kan vara publicerade samma dag bör man använda:
the_time(get_option('date_format'));

2 kommentarer:

  1. När jag läser om det här känner jag mig ganska nöjd med att hålla fingrarna borta från WordPress :)

    SvaraRadera
  2. Jo, det ligger något i det...

    SvaraRadera