卸载时删除自定义帖子和元数据

时间:2012-04-20 作者:CourtFantinato

我的卸载。php文件不会在卸载时删除我的自定义帖子以及与之相关的元数据。插件文件被删除,但数据库中没有任何内容。

如果有人能看看这张照片,看看我是不是做错了什么,还是遗漏了什么,我将不胜感激。

谢谢

// If uninstall is not called from WordPress, or the current user doesn\'t have the capability to delete plugins
if ( !defined( \'WP_UNINSTALL_PLUGIN\' ) || !current_user_can_for_blog( $GLOBALS[\'blog_id\'], \'delete_plugins\' ) ) {
    exit();
}

// Remove posts of the \'mrlpt_client\' type from DB and the post meta

function mrlpt_delete_plugin() {

    $mrlpt_client_posts = get_posts( array(
        \'numberposts\' => -1,
        \'post_type\' => \'mrlpt_client\',
        \'post_status\' => \'any\' ) );

    foreach ( $mrlpt_client_posts as $mrlpt_client_post ) {
        delete_post_meta( $mrlpt_client_post->ID, \'_mrlpt_client_email\' );
        delete_post_meta( $mrlpt_client_post->ID, \'_mrlpt_client_phone_num\' );
        wp_delete_post( $mrlpt_client_post->ID, true );
    }

}

mrlpt_delete_plugin();

Edit:

我尝试过使用sql查询,但它仍然不能正常工作。我在一个多站点设置中工作,并且帖子和帖子元数据在主站点(wp\\)上被删除。但是,第二个站点(wp\\u 4\\u)不工作,未删除任何内容。

在多站点工作时,我缺少什么?这很奇怪,因为我的主插件文件中有另一个sql查询,可以动态填充表单中的下拉字段,而且效果很好。

global $wpdb; // Must have this or else!

$postmeta_table = $wpdb->postmeta;
$posts_table = $wpdb->posts;

$wpdb->query("DELETE FROM " . $postmeta_table . " WHERE meta_key = \'_mrlpt_client_email\'");
$wpdb->query("DELETE FROM " . $postmeta_table . " WHERE meta_key = \'_mrlpt_client_phone_num\'");
$wpdb->query("DELETE FROM " . $posts_table . " WHERE post_type = \'mrlpt_client\'");

Edit 2:

在第二个站点(wp\\u 4\\u2)的前缀中进行硬编码,而不是使用$wpdb,然后它会删除数据库中的帖子和元数据。但是,显然我不能硬编码。

你知道这里发生了什么吗?我真的被难住了。

1 个回复
SO网友:MagicalCodeMonkey

我只是在搜索中发现了这个,我想我会回复,以防你没弄明白。

我不是百分之百确定最好的方法,但我可以提供一些可能有用的信息。

$wpdb同时具有prefix和base\\u prefix成员,因此您可以通过引用$wpdb->prefix并在查询中使用它来获取“wp\\u 4\\u”。

根据您所拥有的资源,您可以对$Posteta\\u表和$posts\\u表执行字符串替换,这样,如果将它们设置为wp\\uu而不是前缀(在本例中为“wp\\u4”),则可以替换它并运行查询。

可能是这样的:

global $wpdb; // Must have this or else!

$postmeta_table = $wpdb->postmeta;
$posts_table = $wpdb->posts;

$postmeta_table = str_replace($wpdb->base_prefix, $wpdb->prefix, $postmeta_table);
$postmeta_table = str_replace($wpdb->base_prefix, $wpdb->prefix, $postmeta_table);

$wpdb->query("DELETE FROM " . $postmeta_table . " WHERE meta_key = \'_mrlpt_client_email\'");
$wpdb->query("DELETE FROM " . $postmeta_table . " WHERE meta_key = \'_mrlpt_client_phone_num\'");
$wpdb->query("DELETE FROM " . $posts_table . " WHERE post_type = \'mrlpt_client\'");    
再说一次,我不确定这是最好的方式,但它应该能让你达到你想要去的地方。

参考文献:

结束

相关推荐