✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Обновление последующих событий в сообщениях календаря событий

12

Это действительно сложный случай, но я подумал, что, возможно, стоит попытаться обобщить сообщение для всех, кто может работать с будущими событиями с календарем событий Modern Tribe.

Допустим, вы настраиваете какое-то повторяющееся событие и в теле события (или, что более уместно, в post_content) хотите сказать что-то вроде:

Прошло N лет с тех пор, как произошло [это событие].

Дело в том, что каждое последующее событие, очевидно, будет на год больше, чем предыдущее. Таким образом, вы не можете обязательно жестко закодировать значение в событиях, не помещая его в содержимое публикации каждого события.

Итак, как решить эту проблему?

Обновление последующих событий

Как и в большинстве случаев, это будет зависеть от того, как настроена ваша кодовая база, но если вы работаете с последовательными событиями, это не так уж плохо.

Для этого поста я предполагаю:

  1. у вас есть события, настроенные таким образом, что у вас есть первое событие в серии, а затем у вас есть последующие события),
  2. вам удобно выполнять базовые запросы, используя $wpdb ,
  3. вы знакомы с основными регулярными выражениями,
  4. вы знакомы с wp_update_post

Общий процесс, с помощью которого вы можете обновить каждое событие, чтобы отразить правильное количество лет в его post_content, будет выглядеть примерно так:

  1. по первому событию в серии найти все последующие посты,
  2. найдите число в post_content и увеличьте его на единицу,
  3. обновить пост.

Довольно просто, правда? Вот как это сделать.

1 Найдите последующие события

Для обновления последующих событий важно иметь идентификатор основного события. Обычно это легко получить, если вы уже программно создали событие, потому что Tribe_create_event возвращает идентификатор сообщения.

В противном случае вы можете сделать что-то вроде поиска поста по его названию или что-то подобное. И когда у вас есть этот пост, вы можете получить его идентификатор.

После этого напишите быстрый запрос для получения всех сообщений с исходным идентификатором сообщения в качестве его родителя :

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

Очевидно, я предпочитаю помещать это в его функцию, чтобы я мог вызывать его в нескольких местах приложения, отлаживать его по мере необходимости и изолировать его ответственность.

Вы можете захотеть вернуть результаты в виде коллекции объектов или добавить в запрос дополнительные квалификаторы, чтобы ограничить тип возвращаемых результатов. Несмотря на это, основной вывод из этого кода заключается в том, что вы получаете идентификаторы и post_content всех последующих сообщений в серии на основе идентификатора исходного события.

2 Обновите содержимое поста

После того, как события были возвращены, можно настроить цикл для их повторения. В зависимости от того, как вы определите цикл, будет зависеть, как вы настроите счетчик, но один из самых основных способов сделать это:

  1. определить значение, начиная с единицы, которое вы можете добавлять и увеличивать во время каждой итерации,
  2. добавьте это к цифре, найденной в сообщении.

Итак, если бы вы использовали  цикл foreach, код мог бы выглядеть примерно так :

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

Это будет немного сложнее, если у вас есть несколько цифр в теле вашего сообщения, но этого достаточно, чтобы дать представление о том, как работать хотя бы с одной (как в примере вверху сообщения).

3 Обновить пост

Наконец, после обновления post_content достаточно просто вызвать WordPress API для обновления содержимого записи.

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

Конечно, как упоминалось в посте, ваш код может выглядеть по-другому, его аспекты производительности могут отличаться или требовать некоторых других соображений (о которых я сейчас расскажу).

Но, по крайней мере, это отправная точка.

Другие соображения

Могут быть случаи, когда контент публикации содержит несколько номеров, или могут быть случаи, когда могут быть тысячи последующих событий. В каждом из этих случаев описанный выше подход может не соответствовать всем требованиям.

То есть вы все еще можете выполнить эти шаги, но они могут быть не самыми производительными, как написано. В этом случае вам может потребоваться настроить пакетный процесс для его обработки или сделать это в нерабочее время, используя задание cron, или один из нескольких других способов решения проблемы.

Вышеупомянутые подходы выходят за рамки этого поста, но трехэтапный подход остается прежним. Это больше о том, чтобы решить проблему по принципу «разделяй и властвуй», чем о том, как это делается.

Источник записи: tommcfarlin.com

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее