Uppdatering av efterföljande händelser i händelsekalenderinlägg
Det här är ett riktigt nyanserat fall men jag tänkte att det kan vara värt att försöka generalisera för ett inlägg för alla som kanske jobbar med framtida evenemang med Modern Tribe’s Event Calendar.
Säg att du ställer in någon återkommande händelse och inom evenemangets brödtext (eller, mer lämpligt, post_content) vill du säga något i stil med:
Det har gått N-år sedan [den här händelsen] inträffade.
Saken är den att varje efterföljande händelse uppenbarligen kommer att vara ett år längre än den före den. Så du kan inte nödvändigtvis hårdkoda värdet i händelserna utan att det placeras i postinnehållet för varje händelse.
Så vad är ett sätt att tackla detta?
Uppdatering av efterföljande händelser
Som med de flesta saker kommer detta att bero på hur din kodbas är inställd, men om du antar att du arbetar med seriehändelser är det inte så illa.
För det här inlägget utgår jag från:
- du har evenemang inrättade på ett sådant sätt att du har den första händelsen i en serie, och sedan har du efterföljande händelser),
- du är bekväm med att köra grundläggande frågor med $wpdb ,
- du är bekväm med grundläggande reguljära uttryck,
- du är bekant med wp_update_post
Den allmänna processen genom vilken du kan uppdatera varje händelse för att återspegla rätt antal år inom dess post_content kommer att se ut så här:
- genom att använda den första händelsen i serien, hitta alla efterföljande inlägg,
- hitta numret i post_content och öka det med ett,
- uppdatera inlägget.
Ganska okomplicerat, eller hur? Så här gör du.
1 Hitta efterföljande händelser
För att uppdatera efterföljande händelser är det viktigt att ha ID för huvudevenemanget. Detta är vanligtvis lätt att få tag på om du redan har skapat händelsen programmatiskt eftersom tribe_create_event returnerar post-ID:t.
Annars kan du göra något som att hitta ett inlägg efter dess titel eller något liknande. Och när du väl har det inlägget kan du hämta dess ID.
När du är klar skriver du en snabbfråga för att hämta alla inlägg med det ursprungliga inläggs-ID :t som dess förälder :
<?php
private function find_all_events( $event_id) {
global $wpdb;
$events = $wpdb->get_results(
$wpdb->prepare("
SELECT ID, post_content
FROM $wpdb->posts
WHERE post_parent = '%d'
AND post_status = 'publish'
", $event_id),
ARRAY_A
);
return $events;
}
Uppenbarligen föredrar jag att sätta detta i dess funktion så att jag kan kalla det flera ställen i programmet, felsöka det efter behov och isolera dess ansvar.
Du kanske vill returnera resultaten som en samling objekt eller lägga till fler kvalificerare i frågan för att begränsa typen av resultat som returneras. Oavsett vilket, det viktigaste med den här koden är att du tar tag i ID :n och post_content för alla efterföljande inlägg i en serie baserat på ID:t för den första händelsen.
2 Uppdatera inläggets innehåll
När händelserna har returnerats kan en loop ställas in för att iterera genom dem. Beroende på hur du definierar slingan avgör hur du ställer in en räknare, men ett av de mest grundläggande sätten att göra detta är att:
- definiera ett värde, som börjar med ett, som du kan lägga till och öka under varje iteration,
- lägg till detta till siffran som finns i inlägget.
Så om du skulle använda en foreach loop, kan koden se ut ungefär så här :
<?php
public function update_future_events( $event_id) {
$events = $this->find_all_events( $event_id );
$iteration = 1;
foreach ($events as $event) {
preg_match_all( '/(d+)/', $anniversary['post_content'], $matches );
$original_year = $matches[0];
$original_year = intval( $original_year[0] );
$new_year = ($original_year + $iteration );
$iteration++;
// See forth-coming gist.
}
}
Detta kommer att bli lite mer komplicerat om du har flera siffror i brödtexten i ditt inlägg, men detta räcker för att ge en idé om hur man arbetar med minst en (som i exemplet överst i inlägget).
3 Uppdatera inlägget
Slutligen, när post_content har uppdaterats, är det en fråga om att egentligen bara ringa ett WordPress-API för att uppdatera inläggets innehåll.
<?php
public function update_future_events( $event_id) {
$events = $this->find_all_events( $event_id );
$iteration = 1;
foreach ($events as $event) {
// See previous gist.
$event['post_content'] = str_ireplace( $original_year, $new_year, $event['post_content'] );
wp_update_post(array(
'ID' => $event['ID'],
'post_content' => $event['post_content'],
));
}
}
Naturligtvis, som nämnts i hela inlägget, kan din kod se annorlunda ut, prestandaaspekterna av detta kan vara annorlunda eller kräva några andra överväganden (som jag kommer att täcka ett ögonblick).
Men om inte annat är detta åtminstone en utgångspunkt.
Andra överväganden
Det kan finnas tillfällen då inläggets innehåll innehåller flera nummer, eller det kan finnas tillfällen då det kan finnas tusentals efterföljande händelser. I vart och ett av dessa fall kanske ovanstående tillvägagångssätt inte passar räkningen.
Det vill säga, du kan fortfarande följa dessa steg, men de kanske inte är de mest presterande som skrivits. I så fall kan du behöva ställa in en batchprocess för att hantera det eller göra det under lediga timmar med hjälp av ett cron-jobb, eller ett av flera andra sätt att ta itu med problemet.
De ovannämnda tillvägagångssätten ligger utanför ramen för detta inlägg, men trestegsmetoden förblir densamma. Det handlar mer om dela-och-härska för att ta itu med problemet än hur det görs.