Оновлення наступних подій у публікаціях календаря подій
Це дуже складний випадок, але я подумав, що варто спробувати узагальнити для публікації для тих, хто, можливо, працює з майбутніми подіями з календарем подій Modern Tribe.
Скажімо, ви встановлюєте певну повторювану подію та в тілі події (або, точніше, post_content) ви хочете сказати щось на зразок:
Минуло N років з моменту [ця подія].
Справа в тому, що кожна наступна подія, очевидно, буде на рік більшою за попередню. Таким чином, ви не можете жорстко закодувати значення в події, не розміщуючи його у вмісті публікації кожної події.
Тож який спосіб вирішити цю проблему?
Оновлення наступних подій
Як і в більшості речей, це залежатиме від того, як налаштовано вашу кодову базу, але якщо припустити, що ви працюєте з подіями серії, це не так вже й погано.
Для цієї публікації я припускаю:
- у вас є події, налаштовані таким чином, що у вас є перша подія в серії, а потім у вас є наступні події),
- вам зручно виконувати базові запити за допомогою $wpdb ,
- вам зручно користуватися основними регулярними виразами,
- ви знайомі з wp_update_post
Загальний процес, за допомогою якого ви можете оновити кожну подію, щоб відобразити правильну кількість років у її post_content, виглядатиме приблизно так:
- використовуючи першу подію в серії, знайти всі наступні публікації,
- знайдіть число в post_content і збільште його на одиницю,
- оновити пост.
Досить просто, правда? Ось як це зробити.
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 Оновіть вміст публікації
Після повернення подій можна налаштувати цикл для їхнього проходження. Залежно від того, як ви визначаєте цикл, визначатиметься, як ви налаштуєте лічильник, але один із найпростіших способів зробити це:
- визначте значення, починаючи з одиниці, яке ви можете додавати та збільшувати під час кожної ітерації,
- додайте це до цифри, знайденої в дописі.
Отже, якщо ви використовуєте цикл 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 або одним із кількох інших способів вирішення проблеми.
Вищезазначені підходи виходять за рамки цієї публікації, але триетапний підхід залишається незмінним. Щоб вирішити проблему, це більше стосується принципу «розділяй і володарюй», ніж того, як це зробити.