使用wordpress自带的定时发布文章,经常会失败。前面说过一些方法《
WordPress 解决文章定时发布失败问题》,但都是在WP-CRON的基础上寻求解决办法,下面分享一个完全不依赖 WordPress 自带的定时任务(WP-Cron),最古老、最暴力、最能绕过所有 WP-Cron 限制的修复方案,直接绕开全部,把 WP 自带定时发布功能强行关闭。
一、主要功能
定时发布文章,解决原生自带定时发布文章失败问题!
二、工作原理
它用「每一次页面访问」来检查并发布,只要有人打开你的网站,它就会:
plain
1、查数据库:有没有到时间但没发布的文章
2、有就直接强制发布
3、5 分钟内只执行一次,不重复跑
三、直接上代码
php
<?php
// 防止直接访问文件
if (!defined('ABSPATH')) {
exit;
}
// WP Missed Schedule 修复(终极稳定版)
function wpms_log() {
echo "\n<!-- WP Missed Schedule Fix Active -->";
}
add_action('wp_head', 'wpms_log');
add_action('wp_footer', 'wpms_log');
define('WPMS_DELAY', 5);
define('WPMS_OPTION', 'wp_missed_schedule');
// 禁用原生定时发布(容易失败)
remove_action('publish_future_post', 'check_and_publish_future_post');
function wpms_init() {
global $wpdb;
// 5分钟内只执行一次
$last = get_option(WPMS_OPTION, false);
if ($last !== false && $last > (time() - (WPMS_DELAY * 60))) {
return;
}
update_option(WPMS_OPTION, time());
// 查询并发布错过的定时文章
$scheduledIDs = $wpdb->get_col("
SELECT ID FROM {$wpdb->posts}
WHERE (
(post_date > 0 AND post_date <= CURRENT_TIMESTAMP()) OR
(post_date_gmt > 0 AND post_date_gmt <= UTC_TIMESTAMP())
)
AND post_status = 'future'
LIMIT 5
");
if (!empty($scheduledIDs)) {
foreach ($scheduledIDs as $scheduledID) {
if ($scheduledID) {
wp_publish_post($scheduledID);
}
}
}
}
add_action('init', 'wpms_init', 0);
// 禁用清理
register_deactivation_hook(__FILE__, function() {
delete_option(WPMS_OPTION);
});
?>
四、总结
「页面触发 + 直接查库发布」的方法能稳定工作。