DBのwp_usermetaをクエリで操作(削除)
-
DBの任意のフィールドをクエリで操作する件ですが、
1:
$wpdb->query( "DELETE FROM {$wpdb->users} WHERE user_login not in ('admin') ”)
とすると、管理者を除く全ユーザーを一括削除できるのに対して、
2:
`$wpdb->query( “DELETE FROM {$wpdb->usermeta}
WHERE user_id not in (‘1’)`としてもまったく削除されず変化がありません(myphpadminでテーブルを確認しました)
なぜこれを削除したいかと申しますと(仮に登録ユーザーが購読者20名いたとして)
上記1で管理者を除く全ユーザーのwp_usersを削除しても
wp_usermetaのほうにそれらの削除済みユーザーのmeta情報が残っているままなので、管理画面で「ユーザーの一覧」ページをみると
タイトル下の総数(count)のところが
すべて(21名)管理者(1名)購読者(20名)
となったままなのです。一覧表には管理者しかいないので、ここを
すべて(1名)管理者(1名)
としたいのですが、それにはwp_usermetaのuser_idを削除したらよいのか?と思いました。基本的なことかと思い恐縮ですが、
クエリでwp_usermetaの削除操作ができるのかという点と、
管理画面「ユーザーの一覧」ページの総数が実際の一覧に表示される人数と一致したい点を
ご指導いただけないでしょうか。
よろしくお願いいたします。
-
user_id は数値型なので、クォートは不要です。
ユーザー数の表示は、usermeta テーブルから取得しているようなので、お考えのように usermeta テーブルの整合させれば、ユーザー数も直るはずです。
ちなみに、ユーザーの削除や記事の削除などについても、DBで直接削除することは、よく構造を理解していないと、一部キャッシュデータが残って整合性がとれなくなったりするので、極力、WordPress の関数を用いて削除処理を行ったほうが安全です。
jim912様
ありがとうございました。返信にお時間がかかってしまい申し訳ありません。
いただいたアドバイスに従い、関数で処理してご報告を。と思って取り組みましたが
むずかしいことをしているのか、方法を知らないだけなのか、
時間だけが過ぎてしまいました。特定のユーザー(今回は管理者)を除く全ユーザーを削除
という条件なので、イメージとしては
特定のユーザーのuser_idを取得して
$nodeleteInfo = get_user_by( ‘login’, ‘admin’ );
$nodeleteID = $nodeleteInfo->ID;テーブルwp_usermetaの全ユーザをforeach文で回し、
wp_delete_user( $id, $nodeleteID );
ただし$nodeleteIDの場合スキップ
という感じじゃないかと思うのですが。。$wpdb->postsのpost_authorに他のユーザIDが入っていないのであれば、こんなのはどうでしょうか?
MySQLはDELETEに複数テーブルを指定できるので、
$wpdb->query("DELETE wp_users, wp_usermeta FROM wp_users, wp_usermeta WHERE wp_users.ID=wp_usermeta.user_id AND wp_users.user_login NOT IN ('admin'));
ということができます。ループなしで、一気に削除です。
- トピック「DBのwp_usermetaをクエリで操作(削除)」には新たに返信することはできません。