web-dev-qa-db-ja.com

プラグインのアンインストール中にユーザーのメタデータを削除するための最善の方法は?

プラグインがusermetaテーブルにデータを格納する場合、uninstall.phpのすべてのユーザーに対してこれらのエントリを削除するための最善の方法は何ですか?データベースに直接アクセスできますが、別の方法はありますか?

4
Matthew Hui

可能であれば、データベースに直接アクセスしないでください。これには主に2つの理由があります。

  • データベース構造が変更された場合(ほとんどありません)、クエリが古くなっている可能性があります。 delete_user_meta()のような関数を使うことはあなたの問い合わせがその関数をサポートするすべてのWordPressバージョン(過去、現在、そして未来)のためにきちんと働くべきであることを保証するでしょう。

  • キャッシング。データを削除した後にキャッシュをクリーンアップしないと、問題が発生する可能性があります。データを手動で削除した場合は、キャッシュも手動でクリーンアップする必要があります。自動的にこれを行う組み込み関数を使用することは間違いなくより良い考えです。

メタデータ(ユーザーのメタフィールドなど)を削除するには、 delete_metadata() 関数を使用することをお勧めします。この関数には5番目のパラメータがあり、これをtrueに設定すると、すべてのオブジェクト(この場合はユーザー)に対して指定されたmeta_keyを持つメタデータを削除できます。例:

$meta_type  = 'user';
$user_id    = 0; // This will be ignored, since we are deleting for all users.
$meta_key   = 'your_meta_key';
$meta_value = ''; // Also ignored. The meta will be deleted regardless of value.
$delete_all = true;

delete_metadata( $meta_type, $user_id, $meta_key, $meta_value, $delete_all );

あなたのプラグインが使う各メタキーについてそれを繰り返すことができます。

8
J.D.

ベストプラクティスは、あなたのプラグインが入力したメタデータに接頭辞を付けることです。こうすることで、すべてのmeta_keyを検索するような単純なことができます。

$wpdb->query( 
    $wpdb->prepare( 
        "
        DELETE FROM $wpdb->usermeta
        WHERE meta_key LIKE `_prefix_%`
        "
        )
);
3
bgallagh3r

特にDELETEステートメントを発行するときは、データベースと直接対話しないことが最善です。単一のタイプミスによって意図しないデータが破壊される可能性があるからです。代わりに、WordPressの機能を使用してすべてのユーザーIDのリストを取得してから、次のように各ユーザーのユーザーメタフィールドを個別に削除します。

$all_user_ids = get_users( 'fields=ID' );
foreach ( $all_user_ids as $user_id ) {
    delete_user_meta( $user_id, 'your_meta_key_to_delete' );
}

機能リファレンス

http://codex.wordpress.org/Function_Reference/get_usershttp://codex.wordpress.org/ Function_Reference/delete_user_meta

3
figureone
  • DBに直接アクセスしないでください。
  • DBを変更するにはWPラッパー関数を使用する必要があります。
  • プラグインのアンインストール時にDBからプラグイン関連のデータを削除しないでください。テスト目的のためにあなたのプラグインをアンインストールしなければならないときはWPに非常に多くの場合があるので。
  • プラグイン削除時は必ずDBからプラグイン関連データを削除してください。チェック http://codex.wordpress.org/Function_Reference/register_deactivation_hook

サンプルコード

register_uninstall_hook( __FILE__, 'plugin_uninstall' );

function plugin_uninstall () {
    //usermeta data delete code
}
1
Manish