✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

Aktualizacja kolejnych wydarzeń we wpisach w kalendarzu wydarzeń

13

To naprawdę zniuansowany przypadek, ale pomyślałem, że warto spróbować uogólnić post dla każdego, kto może pracować z przyszłymi wydarzeniami z Kalendarzem wydarzeń Modern Tribe.

Załóżmy, że konfigurujesz wydarzenie cykliczne i w jego treści (a właściwie w post_content) chcesz powiedzieć coś takiego:

Minęło N lat od [tego wydarzenia].

Rzecz w tym, że każde kolejne wydarzenie będzie oczywiście o rok dłuższe niż poprzednie. Nie można więc na stałe zakodować wartości w wydarzeniach bez umieszczania jej w treści wpisu każdego wydarzenia.

Więc jaki jest jeden sposób na poradzenie sobie z tym?

Aktualizacja kolejnych wydarzeń

Podobnie jak w przypadku większości rzeczy, będzie to zależeć od konfiguracji bazy kodu, ale zakładając, że pracujesz ze zdarzeniami serii, nie jest to takie złe.

W tym poście zakładam:

  1. masz wydarzenia ustawione w taki sposób, że masz pierwsze wydarzenie z serii, a potem masz kolejne wydarzenia),
  2. nie masz nic przeciwko uruchamianiu podstawowych zapytań przy użyciu $wpdb ,
  3. znasz się na podstawowych wyrażeniach regularnych,
  4. znasz wp_update_post

Ogólny proces, dzięki któremu możesz zaktualizować każde zdarzenie, aby odzwierciedlało odpowiednią liczbę lat w ramach post_content, będzie wyglądał mniej więcej tak:

  1. korzystając z pierwszego wydarzenia z serii, znajdź wszystkie kolejne posty,
  2. zlokalizuj numer w post_content i zwiększ go o jeden,
  3. zaktualizuj post.

Całkiem proste, prawda? Oto jak to zrobić.

1 Znajdź kolejne wydarzenia

Aby aktualizować kolejne wydarzenia, ważne jest posiadanie identyfikatora wydarzenia głównego. Zwykle jest to łatwe do uzyskania, jeśli wydarzenie zostało już utworzone programowo, ponieważ tribe_create_event zwraca identyfikator posta.

W przeciwnym razie możesz na przykład znaleźć post po tytule lub coś podobnego. A kiedy już masz ten post, możesz pobrać jego identyfikator.

Gdy skończysz, napisz szybkie zapytanie, aby pobrać wszystkie posty z początkowym identyfikatorem posta jako nadrzędnym :

<?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;
}

Oczywiście wolę umieścić to w jego funkcji, aby móc wywoływać go w wielu miejscach w aplikacji, debugować go w razie potrzeby i izolować jego odpowiedzialność.

Możesz chcieć zwrócić wyniki jako kolekcję obiektów lub dodać więcej kwalifikatorów do zapytania, aby ograniczyć typ zwracanych wyników. Niezależnie od tego, głównym wnioskiem z tego kodu jest to, że pobierasz identyfikatory i post_content wszystkich kolejnych postów w serii opartej na identyfikatorze początkowego wydarzenia.

2 Zaktualizuj zawartość posta

Po zwróceniu zdarzeń można skonfigurować pętlę, aby przejść przez nie. W zależności od tego, jak zdefiniujesz pętlę, określi to, jak ustawisz licznik, ale jednym z najbardziej podstawowych sposobów, aby to zrobić, jest:

  1. zdefiniować wartość, zaczynając od jednego, którą możesz dodawać i zwiększać podczas każdej iteracji,
  2. dodaj to do cyfry znalezionej w poście.

Jeśli więc użyjesz  pętli foreach, kod może wyglądać mniej więcej tak :

<?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.
  }
}

Będzie to trochę bardziej skomplikowane, jeśli masz wiele cyfr w treści swojego posta, ale to wystarczy, aby dać wyobrażenie o tym, jak pracować z co najmniej jedną (jak w przykładzie na górze postu).

3 Zaktualizuj post

Wreszcie, gdy post_content zostanie zaktualizowany, tak naprawdę wystarczy wywołać API WordPressa, aby zaktualizować treść posta.

<?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'],
    ));
  }
}

Oczywiście, jak wspomniano w całym poście, twój kod może wyglądać inaczej, aspekty wydajnościowe mogą być inne lub wymagać innych rozważań (które omówię za chwilę).

Ale jeśli nic więcej, to jest przynajmniej punkt wyjścia.

Inne względy

Mogą się zdarzyć sytuacje, w których treść posta zawiera wiele liczb lub mogą wystąpić tysiące kolejnych zdarzeń. W każdym z tych przypadków powyższe podejście może nie pasować do rachunku.

Oznacza to, że nadal możesz wykonać te kroki, ale mogą one nie być najskuteczniejsze, jak napisano. W takim przypadku może być konieczne skonfigurowanie procesu wsadowego do obsługi lub wykonanie go poza godzinami pracy przy użyciu zadania cron lub jednego z kilku innych sposobów rozwiązania problemu.

Wyżej wymienione podejścia wykraczają poza zakres tego postu, ale podejście trzyetapowe pozostaje takie samo. Bardziej chodzi o dzielenie i zwyciężanie, aby rozwiązać problem, niż o to, jak to zrobić.

Źródło nagrywania: tommcfarlin.com

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów