如何配置WordPress Cron实现每小时更新4篇关联自定义字段的文章
实现步骤
1. 完整实现代码
你可以把以下代码添加到当前主题的functions.php文件,或者自定义插件的主文件中:
// 注册每小时执行的Cron事件 add_action('wp', 'custom_content_update_cron_schedule'); function custom_content_update_cron_schedule() { if (!wp_next_scheduled('hourly_content_update_task')) { wp_schedule_event(time(), 'hourly', 'hourly_content_update_task'); } } // 停用主题/插件时清除Cron任务,避免残留 add_action('switch_theme', 'clear_custom_content_cron'); register_deactivation_hook(__FILE__, 'clear_custom_content_cron'); function clear_custom_content_cron() { $timestamp = wp_next_scheduled('hourly_content_update_task'); if ($timestamp) { wp_unschedule_event($timestamp, 'hourly_content_update_task'); } } // Cron执行的核心处理逻辑 add_action('hourly_content_update_task', 'batch_update_post_content'); function batch_update_post_content() { // 每次处理4篇已发布的公开文章 $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 4, 'orderby' => 'meta_value_num', 'meta_key' => 'last_processed_time', 'order' => 'ASC', // 优先取最久未处理的文章,全部处理完自动从头循环 'no_found_rows' => true, // 优化查询性能,不需要分页总数 'update_post_meta_cache' => false, 'update_post_term_cache' => false ); $posts = get_posts($args); // 如果还没有文章标记过处理时间,就取最早发布的4篇 if (empty($posts)) { $args['orderby'] = 'date'; $args['order'] = 'ASC'; unset($args['meta_key']); $posts = get_posts($args); } foreach ($posts as $single_post) { // 临时移除save_post钩子,避免调用wp_update_post时触发原逻辑死循环 remove_action('save_post', 'update_content'); $custom_field_val = get_post_meta($single_post->ID, 'customfield', true); if (empty($custom_field_val)) { // 没有自定义字段值的跳过处理 continue; } $update_data = array( 'ID' => $single_post->ID, 'post_content' => $custom_field_val, 'post_title' => $custom_field_val ); wp_update_post($update_data); // 更新本次处理时间,用于下次排序 update_post_meta($single_post->ID, 'last_processed_time', time()); // 恢复原save_post钩子 add_action('save_post', 'update_content'); } }
2. 补充说明
- 原有的挂载在
save_post上的update_content函数可以保留,不影响手动更新文章时的触发逻辑 - 如果你的自定义字段名不是
customfield,可以自行替换代码中对应位置的字段名 - 如果需要修改每次处理的文章数量,修改
posts_per_page的参数值即可 - WordPress默认的WP-Cron依赖站点访问触发,如果站点访问量较低导致Cron执行不准,可以配置服务器系统Cron每小时访问一次站点的
wp-cron.php文件提升准确度
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

