web-dev-qa-db-ja.com

アンインストール時のカスタム投稿とメタデータの削除

私のuninstall.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();

編集:

私は代わりにSQLクエリを使用しようとしましたが、これもまた正しく動作しません。私はマルチサイト設定で作業しています、そして投稿と投稿メタデータはMAINサイト(wp_)で削除されています。しかし、2番目のサイト(wp_4_)は機能していません。何も削除されません。

これをマルチサイトで機能させるために欠けているものは何ですか?フォームにドロップダウンフィールドを動的に設定するためにメインプラグインファイルに別の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'");

編集2:

$ wpdbを使用する代わりに2番目のサイトのプレフィックス(wp_4_)をハードコーディングすると、データベース内の投稿とメタデータは削除されます。しかし、明らかにそれをハードコーディングすることはできません。

ここで何が起こっているのかについてのアイデアはありますか?私は本当に困惑しています。

1
CourtFantinato

私は検索でこれに出くわしたし、あなたがこれを理解していない場合に備えて私は返信すると思いました。

私はこれに取り組むための最善の方法を100%確信しているわけではありませんが、役に立つかもしれないいくつかの情報を提供することができます。

$ wpdbはprefixとbase_prefixの両方のメンバを持っているので、あなたは$ wpdb->接頭辞を参照してそれをクエリの中で使うことで 'wp_4_'を得ることができます。

あなたが持っているものを考えれば、$ postmeta_tableと$ posts_tableで文字列置換をすることができるので、それらがあなたの接頭辞の代わりにwp_にセットされているなら(この場合 'wp_4_')それからそれを置換しそしてあなたの問い合わせを実行します。

それは次のようになります。

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'");    

繰り返しますが、これが最善の方法であるかどうかはわかりませんが、目的の場所に行くことができます。

参考文献:

1