Aggiornamento degli eventi successivi nei post del calendario degli eventi
Questo è un caso davvero sfumato, ma ho pensato che valesse la pena provare a generalizzare per un post per chiunque possa lavorare con eventi futuri con il Calendario degli eventi di Modern Tribe.
Supponiamo che tu stia impostando un evento ricorrente e all’interno del corpo dell’evento (o, più appropriatamente, post_content) vuoi dire qualcosa del tipo:
Sono passati N-anni da quando [questo evento] si è verificato.
Il fatto è che ogni evento successivo sarà ovviamente un anno maggiore di quello precedente. Quindi non puoi necessariamente codificare il valore negli eventi senza che venga inserito nel contenuto del post di ogni evento.
Allora, qual è un modo per affrontare questo?
Aggiornamento di eventi successivi
Come per la maggior parte delle cose, questo dipenderà da come è impostata la tua base di codice, ma supponendo che tu stia lavorando con eventi di serie, non è male.
Per questo post presumo:
- hai eventi impostati in modo tale da avere il primo evento di una serie e poi gli eventi successivi),
- ti senti a tuo agio nell’eseguire query di base usando $wpdb ,
- sei a tuo agio con le espressioni regolari di base,
- hai familiarità con wp_update_post
Il processo generale mediante il quale puoi aggiornare ogni evento per riflettere il numero corretto di anni all’interno del suo post_content sarà simile a questo:
- utilizzando il primo evento della serie, trova tutti i post successivi,
- individua il numero nel post_content e incrementalo di uno,
- aggiorna il post.
Abbastanza semplice, giusto? Ecco come farlo.
1 Trova eventi successivi
Per aggiornare gli eventi successivi, è importante avere l’ID dell’evento principale. Questo è solitamente facile da ottenere se hai già creato l’evento a livello di codice perché tribù_create_event restituisce l’ID del post.
Altrimenti, puoi fare qualcosa come trovare un post in base al titolo o qualcosa di simile. E una volta che hai quel post, puoi prendere il suo ID.
Una volta terminato, scrivi una query rapida per recuperare tutti i post con l’ID post iniziale come genitore :
<?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;
}
Ovviamente, preferisco inserirlo nella sua funzione in modo da poterlo chiamare più posti nell’applicazione, eseguirne il debug secondo necessità e isolarne la responsabilità.
Potresti voler restituire i risultati come una raccolta di oggetti o aggiungere più qualificatori alla query per limitare il tipo di risultati che vengono restituiti. Indipendentemente da ciò, il principale risultato di questo codice è che stai acquisendo gli ID e i post_content di tutti i post successivi di una serie in base all’ID dell’evento iniziale.
2 Aggiorna il contenuto del post
Una volta che gli eventi sono stati restituiti, è possibile impostare un ciclo per iterarli. A seconda di come definisci il ciclo, determinerà come impostare un contatore, ma uno dei modi più semplici per farlo è:
- definire un valore, a partire da uno, che puoi aggiungere e incrementare durante ogni iterazione,
- aggiungi questo alla cifra trovata nel post.
Quindi, se dovessi usare un ciclo foreach, il codice potrebbe assomigliare a questo :
<?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.
}
}
Questo sarà un po’ più complicato se hai più cifre nel corpo del tuo post, ma questo è sufficiente per dare l’idea di come lavorare con almeno uno (come nell’esempio in cima al post).
3 Aggiorna il post
Infine, una volta che post_content è stato aggiornato, si tratta semplicemente di chiamare un’API di WordPress per aggiornare il contenuto del post.
<?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'],
));
}
}
Ovviamente, come accennato in tutto il post, il tuo codice potrebbe avere un aspetto diverso, gli aspetti relativi alle prestazioni di questo potrebbero essere diversi o richiedere alcune altre considerazioni (che tratterò momentaneamente).
Ma, se non altro, questo è almeno un punto di partenza.
altre considerazioni
Potrebbero esserci momenti in cui il contenuto del post contiene più numeri o potrebbero esserci migliaia di eventi successivi. In ciascuno di questi casi, l’approccio di cui sopra potrebbe non adattarsi al conto.
Cioè, puoi ancora seguire questi passaggi, ma potrebbero non essere i più performanti come scritti. In tal caso, potrebbe essere necessario impostare un processo batch per gestirlo o eseguirlo durante le ore di riposo utilizzando un lavoro cron o uno dei tanti altri modi per affrontare il problema.
Gli approcci summenzionati esulano dallo scopo di questo post, ma l’approccio in tre fasi rimane lo stesso. Si tratta più di dividere e conquistare per affrontare il problema che di come farlo.