Принудительная публикация запланированных просроченных записей(постов) в wordpress

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

Полез за плагинами, Missed Schedule Post Publisher частично решает эту проблему. Но почему то лишь частично. Не специалист по вордпресс, и становиться им не собираюсь, но пришлось прибегать к хирургическому пути.

На примере ниже, код для 1 итерации цикла, для одного контейнера там фиксится по 1 просроченному посту, если он находится. Решаю так для пула контейнеров, это просто пример 1 итерации, которую не проблема переписать и сделать нормальный плагин.

<?php

$search_code = 'date_default_timezone_set(\"Europe/Moscow\");
\$args = array(
    \"post_status\"    => \"future\",
    \"posts_per_page\" => 1,
    \"date_query\"     => array(
        array(
            \"before\" => date(\"Y-m-d H:i:s\")
        )
    ),
    \"orderby\"        => \"date\",
    \"order\"          => \"ASC\"
);

\$query = new WP_Query(\$args);

if (\$query->have_posts()) {
    \$query->the_post();
    \$post->post_status = \"publish\";
    var_dump(\$post);
    wp_update_post(\$post);
    wp_reset_postdata();
}';

$search_code = str_replace("\n", "", $search_code);

echo shell_exec('docker exec wp_container_name bash -c "php -r \'require \"wp-load.php\";' . $search_code . '\';"');

Тут конечно при большом количестве постов всё туго и нагрузочно будет. Но можно пойти иным путем, какая то тайна для меня великая есть, почему нельзя оптимизировать ключами простенький запрос типа:

SELECT ID FROM `wp_posts` WHERE `post_status` = 'future' AND `post_date` BETWEEN '0000-00-00 00:00:00' AND NOW();

дергать ID, получать объекты просроченных записей, чем он там получается по ID, смотреть не буду сейчас и публиковать их уже через wp_update_post. Хм… странная всё таки какашка вордпресс.

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *