Тугой в этом плане движок весьма. Якобы проблема в крон запусках, а они зависят от посещаемости ресурса, их цикл останавливается. Но это не так. Проверено, принудительно стартовал по системному крону 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. Хм… странная всё таки какашка вордпресс.