使用代码片段自动删除特定分类下的旧文章
修复代码:自动删除特定分类下的旧文章
你的代码没生效是几个关键错误导致的,下面逐个修正并说明:
核心错误与修正点
- 分类法参数写错:
tax_query里的taxonomy字段填成了slug,默认文章分类的分类法是category,这是导致筛选不到目标分类文章的核心问题。 - 钩子选择不合理:用
wp钩子会在前台每次加载时触发,既拖慢性能,还可能因为当前用户权限不足(比如访客访问)无法执行删除。换成admin_init仅在后台执行,或者用定时任务更稳妥。 - 日期查询优化:虽然
"$days days ago"能被解析,但用strtotime生成明确的时间戳更可靠,避免日期格式解析异常。 - 显式指定文章状态:加上
post_status => 'publish',确保只处理已发布的旧文章,不会误删草稿或待审内容。
修正后的完整代码
// 自动删除特定分类下发布超过1天的文章 function delete_old_posts() { $target_category_id = 62; // 目标分类ID $days_threshold = 1; // 超过这个天数的文章会被删除 // 计算截止时间:当前时间往前推N天 $cutoff_date = strtotime("-$days_threshold days"); $args = array( 'post_type' => 'post', 'posts_per_page' => -1, // 获取所有符合条件的文章 'post_status' => 'publish', // 仅处理已发布文章 'date_query' => array( array( 'before' => date('Y-m-d H:i:s', $cutoff_date), 'inclusive' => true, 'column' => 'post_date', // 指定按发布时间筛选 ), ), 'tax_query' => array( array( 'taxonomy' => 'category', // 正确的文章分类法 'field' => 'term_id', // 用分类ID筛选,写'id'也兼容,但'term_id'更标准 'terms' => $target_category_id, // 目标分类ID ), ), ); $old_posts = new WP_Query($args); // 调试用:输出查询到的文章数量,确认筛选逻辑(上线后可删除) // error_log('待删除旧文章数量:' . $old_posts->found_posts); if ($old_posts->have_posts()) { while ($old_posts->have_posts()) { $old_posts->the_post(); // 第二个参数为true直接删除不进回收站,为false则先入回收站 wp_delete_post(get_the_ID(), true); } } wp_reset_postdata(); } // 仅在后台初始化时执行,避免前台触发 add_action('admin_init', 'delete_old_posts'); // 【推荐】如果要定时自动执行,替换上面的add_action为以下代码: // add_action('wp', function() { // if (!wp_next_scheduled('daily_old_posts_cleanup')) { // wp_schedule_event(time(), 'daily', 'daily_old_posts_cleanup'); // } // }); // add_action('daily_old_posts_cleanup', 'delete_old_posts');
使用说明
- 将代码添加到主题的
functions.php或代码片段插件中即可。 - 若使用定时任务版本,首次需访问后台触发定时任务注册(WordPress定时任务依赖站点访问,低访问量站点可配合服务器定时任务调用
wp-cron.php)。 - 调试阶段可以开启
error_log行,查看是否查询到符合条件的文章,确认逻辑正确后再关闭。
内容的提问来源于stack exchange,提问作者Ahmed Alnaqa
相关产品推荐
相关产品推荐

