为何卸载WordPress插件ledproperty后旧帖子未删除?
解决WordPress插件卸载时彻底删除自定义帖子的问题
现有代码的问题
你当前的卸载代码中,wp_delete_post($post->ID, false) 的第二个参数为 false,这只会将自定义类型帖子移到回收站,而非彻底删除。WordPress 不会自动清理回收站内容,所以重新安装插件后,这些帖子仍会存在(或可从回收站恢复),导致旧内容再次出现。
修正方案
1. 彻底删除所有自定义类型帖子
将 wp_delete_post 的第二个参数改为 true,强制彻底删除帖子,跳过回收站环节:
if (!defined('WP_UNINSTALL_PLUGIN')) exit; // 获取所有ledproperty类型的帖子,包含所有状态(草稿、私密、已发布等) $ledproperty_args = array( 'post_type' => 'ledproperty', 'posts_per_page' => -1, 'post_status' => 'any' // 确保覆盖所有状态的帖子,避免遗漏 ); $ledproperty_posts = get_posts($ledproperty_args); foreach ($ledproperty_posts as $post) { wp_delete_post($post->ID, true); // true表示彻底删除,不保留回收站记录 }
2. 额外清理关联内容(可选但建议)
如果你的自定义帖子使用了自定义字段、自定义分类/标签或关联附件,建议一并清理,避免残留无效数据:
清理自定义字段
global $wpdb; // 删除所有ledproperty帖子关联的自定义字段 $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE post_id IN (SELECT ID FROM $wpdb->posts WHERE post_type = 'ledproperty')" );
清理自定义分类/术语(如果有注册)
假设你注册了名为ledproperty_category的自定义分类:
// 获取该分类下的所有术语 $terms = get_terms(array( 'taxonomy' => 'ledproperty_category', 'hide_empty' => false )); foreach ($terms as $term) { wp_delete_term($term->term_id, 'ledproperty_category'); }
清理关联附件
自定义帖子可能绑定了媒体附件,可一并删除:
// 获取所有关联ledproperty帖子的附件 $attachments = get_posts(array( 'post_type' => 'attachment', 'posts_per_page' => -1, 'post_parent__in' => wp_list_pluck($ledproperty_posts, 'ID') )); foreach ($attachments as $attachment) { wp_delete_attachment($attachment->ID, true); }
3. 多站点环境适配(如果需要)
如果是WordPress多站点,需循环处理每个站点的内容:
if (is_multisite()) { global $wpdb; $blog_ids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs"); foreach ($blog_ids as $blog_id) { switch_to_blog($blog_id); // 执行上述所有删除逻辑 restore_current_blog(); } }
注意事项
- 测试前请务必备份网站数据,避免误删重要内容。
- 确保卸载代码放在插件根目录的
uninstall.php文件中,WordPress会在插件卸载时自动执行该文件。
内容的提问来源于stack exchange,提问作者Kira Dresst
相关产品推荐
相关产品推荐

