
本文详解如何通过 php 脚本自动识别并删除 wordpress 中“源已失效”的文章(如汽车库存下架),核心是利用唯一标识(如 sku)比对 api 响应与本地数据库,精准定位冗余内容并安全移除,支持手动触发或定时任务执行。
本文详解如何通过 php 脚本自动识别并删除 wordpress 中“源已失效”的文章(如汽车库存下架),核心是利用唯一标识(如 sku)比对 api 响应与本地数据库,精准定位冗余内容并安全移除,支持手动触发或定时任务执行。
在构建基于外部数据源(如汽车经销商 API、产品目录服务)的 WordPress 站点时,单向导入(Import Only)极易导致数据漂移:当 API 中某款汽车被下架或删除后,其对应的 WordPress 文章却长期滞留,造成信息过期、SEO 污染与管理混乱。真正的同步不是“只增不减”,而是实现闭环生命周期管理——即“API 删除 → WordPress 自动清理”。
✅ 实现原理:唯一标识 + 差集比对
关键前提:每篇导入文章必须持久化存储一个来自 API 的唯一标识字段(如 car_sku、external_id 或 api_reference)。推荐使用 WordPress 自定义字段(Post Meta)存储,例如:
// 导入时保存唯一标识(示例:$car_data['sku'] 来自 API 响应) wp_insert_post([ 'post_title' => $car_data['name'], 'post_content' => $car_data['description'], 'post_status' => 'publish', 'post_type' => 'car' ]); $imported_post_id = wp_insert_post(/** ... **/); update_post_meta($imported_post_id, '_car_api_sku', $car_data['sku']); // ✅ 关键:持久化唯一键
? 同步删除脚本(完整可运行)
以下是一个健壮、安全、可复用的 PHP 同步清理函数,适用于主题 functions.php 或独立插件:
Word报告自动生成神器。自动生成专业Word文档报告,支持模板填充、目录生成、表格/图表插入、页眉页脚、多级标题、样式主题、批量邮件合并。当用户需要生成Word报告、创建合同文档、批量生成通知/证书、填充Word模板、制作商业计划书时触发。
/**
* 同步删除已从外部 API 移除的文章(以 car post_type 为例)
* @param string $meta_key 存储唯一标识的 meta key(如 '_car_api_sku')
* @param string $post_type 目标文章类型(如 'car')
* @return array ['deleted' => int, 'skipped' => int, 'errors' => array]
*/
function sync_delete_orphaned_posts($meta_key = '_car_api_sku', $post_type = 'car') {
// 1️⃣ 获取当前 API 中所有有效 SKU(模拟调用)
$api_skus = [];
$api_response = wp_remote_get('https://api.example.com/cars?status=active');
if (is_wp_error($api_response) || wp_remote_retrieve_response_code($api_response) !== 200) {
error_log('API fetch failed in sync_delete_orphaned_posts');
return ['deleted' => 0, 'skipped' => 0, 'errors' => ['api_fetch_failed']];
}
$data = json_decode(wp_remote_retrieve_body($api_response), true);
foreach ($data['cars'] ?? [] as $car) {
if (!empty($car['sku'])) {
$api_skus[] = $car['sku'];
}
}
$api_skus = array_unique($api_skus);
// 2️⃣ 查询 WordPress 中所有已导入文章的 SKU
$all_local_posts = get_posts([
'post_type' => $post_type,
'post_status' => 'any', // 包含 draft/publish/private
'posts_per_page' => -1,
'meta_query' => [[ 'key' => $meta_key ]],
'fields' => 'ids'
]);
$local_skus = [];
foreach ($all_local_posts as $post_id) {
$sku = get_post_meta($post_id, $meta_key, true);
if ($sku) {
$local_skus[$post_id] = $sku;
}
}
// 3️⃣ 计算差集:本地有但 API 已无的 SKU → 待删除文章 ID
$orphaned_ids = array_keys(
array_filter($local_skus, function($sku) use ($api_skus) {
return !in_array($sku, $api_skus, true);
})
);
// 4️⃣ 批量安全删除(移至回收站,避免误删)
$deleted_count = 0;
$errors = [];
foreach ($orphaned_ids as $post_id) {
if (wp_trash_post($post_id)) {
$deleted_count++;
// 可选:记录日志
error_log("Trashed orphaned post #{$post_id} (SKU: {$local_skus[$post_id]})");
} else {
$errors[] = "Failed to trash post {$post_id}";
}
}
return [
'deleted' => $deleted_count,
'skipped' => count($all_local_posts) - count($orphaned_ids),
'errors' => $errors,
'orphaned' => $orphaned_ids
];
}
// ? 手动触发示例(如添加到管理页面按钮)
if (isset($_GET['sync_delete_orphans']) && current_user_can('manage_options')) {
check_admin_referer('sync_delete_orphans');
$result = sync_delete_orphaned_posts('_car_api_sku', 'car');
wp_die("<h3>同步清理完成</h3>
<p>已移至回收站:{$result['deleted']} 篇</p>
<p>跳过保留:{$result['skipped']} 篇</p>"
. (!empty($result['errors']) ? "<p style='color:red'>错误:".implode(', ', $result['errors'])."</p>" : ''));
}⚙️ 部署方式二选一
-
手动触发:在管理页添加带 nonce 的链接(如
<a href="<?php%20echo%20wp_nonce_url(admin_url('admin.php?sync_delete_orphans=1'),%20'sync_delete_orphans');%20?>">同步清理下架车辆</a>); -
定时任务(推荐):使用 WP-Cron 每日自动执行:
if (!wp_next_scheduled('car_sync_cleanup_event')) { wp_schedule_event(time(), 'daily', 'car_sync_cleanup_event'); } add_action('car_sync_cleanup_event', function() { sync_delete_orphaned_posts('_car_api_sku', 'car'); });
⚠️ 关键注意事项
-
绝不硬删除:始终优先调用
wp_trash_post()(移入回收站),而非wp_delete_post(..., true)。回收站提供 30 天恢复窗口,是生产环境的安全底线; -
权限与 nonce:前端触发必须校验
current_user_can()和check_admin_referer(),防止越权操作; -
性能优化:若文章量超 5000+,建议分批处理(
posts_per_page=100+offset或使用WP_Query迭代器),避免内存溢出; -
日志审计:将删除行为写入
error_log()或专用日志表,便于追溯与合规审查; -
缓存刷新:若使用对象缓存(Redis/Memcached)或全站缓存(Cloudflare/WP Rocket),删除后建议调用
wp_cache_flush()或清除对应缓存键。
通过该方案,你的 WordPress 不再是静态数据仓库,而成为与外部系统实时联动的动态节点——数据有进有出,状态始终可信。

















