ようこそのお運びで、厚く御礼申し上げます。
36日目です。今回は前回までのSQLの処理を使って、プラグインを作ります
いらなくなったカスタムフィールドの変数と値を、選択して一括削除する。
今回は、使わなくなったカスタムフィールドの変数(キー)を、一覧からチェックボックスで選択して、値共々削除したいと思います。
前回、少し書きましたが、このカスタムフィールドの変数(キー)一覧は、今のところ(WordPress3.8)にはその機能はありません。その部分はSQLを実行して変数一覧を取得します。
なので、まず設定のしたに、「カスタムフィールドの変数を削除する」というメニューを作ります
「現在使われていない」、また「削除したい変数」を選択して削除を実行します。
あとは、削除を実行すると完了メッセージを表示します。
まずは、function.phpに書いてみます。
では、function.phpに以下のコードを書きました。
//オブジェクトを生成 new Paka3CustomFieldDeleteKey; //クラス定義 class Paka3CustomFieldDeleteKey{ //コンストラクタ function __construct() { //################### global $wpdb; $this->paka3_sql="SELECT meta_key FROM {$wpdb->postmeta} GROUP BY meta_key HAVING meta_key NOT LIKE %s"; //################### add_action('admin_menu', array($this, 'adminAddMenu')); } //管理メニューの設定 function adminAddMenu() { add_submenu_page("options-general.php", 'カスタムフィールド削除', 'カスタムフィールドの変数を削除する', 'add_users', 'customField_delete', array($this,'paka3_sql_page')); } //表示する内容と処理 function paka3_sql_page() { if(isset($_POST['meta_key']) && $_POST['meta_key'] && check_admin_referer('paka3sql')){ $meta_keys = $_POST['meta_key']; foreach($_POST['meta_key'] as $key){ //カスタムフィールド変数:paka3cssをすべて削除 //echo $key; $a = delete_post_meta_by_key($key); } //更新メッセージ if($a){ echo '<div class="updated fade"><p><strong>'; _e('Custom field deleted.'); echo "</strong></p></div>"; }else{ //失敗or値がない } } global $wpdb; $paka3_sql=$this->paka3_sql; //**管理画面SQL文を実行する(select文のみ)の処理 $r = $wpdb->get_col( $wpdb->prepare($paka3_sql,'\_%') ); $paka3_sql_result =$r; $wp_n = wp_nonce_field('paka3sql'); //表示する内容(HTML) echo <<<EOS <style type="text/css"><!-- .paka3form b, --></style> <div class="wrap"> <h2>カスタムフィールドのキー(変数)を削除する</h2> <form method="post" action="" class="paka3form"> {$wp_n} 削除するカスタムフィールドの変数にチェックを入れてください。<br /> <b>注意:その変数と値が削除されます、一度削除するともとに戻すことはできません</b> EOS; foreach($paka3_sql_result as $key){ echo <<<EOS <ul> <li><label> <input type="checkbox" name="meta_key[]" value="{$key}" {$checked}/> {$key} </label></li> </ul> EOS; } echo <<<EOS <p class="submit"><input type="submit" name="Submit" class="button-primary" value="削除を実行する" /></p> </form> EOS; } }
ポイントはどこ?
今回もデータベースからデータを取得するので、こちらをまずwpdbクラスについて見ておきましょう。(WordPress Codex日本語版:wpdb Class)
削除をするということなので、処理を気をつけてスクリプトを書いていきます。
- 呼び出し:クラスオブジェクトを生成します。
//オブジェクトを生成 new Paka3CustomFieldDeleteKey;
クラスを定義します
//クラス定義 class Paka3CustomFieldDeleteKey{ //コンストラクタ(オブジェクト生成時呼出) function __construct() { //・SQL文の設定 //・管理メニューの呼び出し } //管理メニュー function adminAddMenu() { //・管理メニューの設定 } //表示する内容と処理 function paka3_sql_page() { //・削除が実行されたときの処理 //・削除が実行された場合はメッセージを入れる //・グローバル変数 $wpdb //データベースに接続しますよ!って設定された変数 global $wpdb; //・$wpdbを使って、SQL分を実行してデータを取得 //・表示する内容(HTML) echo <<<EOS //ここに表示内容を記入 EOS; } }
- 削除処理は値と認証キーが正しいときにおこなう。
削除はdelete_post_meta_by_key()を使っておこなう。引数は変数名(キー名)です。$a = delete_post_meta_by_key($key);
- データベースから変数(キー)を取得する場合は、$wpdbを利用しておこないます。
前回までの説明をご覧ください。
また、SQLインジェクション等の対策というのもあるので、$wpdb->prepareという命令も使います。こちらの使い方はsprintfとほぼ同じです(WordPress Codex日本語版:wpdb Class)。global $wpdb; $paka3_sql=$this->paka3_sql; //**管理画面SQL文を実行する(select文のみ)の処理 $r = $wpdb->get_col( $wpdb->prepare($paka3_sql,'\_%') ); $paka3_sql_result =$r;
- セキュリティ対策:以下のふたつは組み合わせて使う
1.check_admin_refererは管理画面から正しく更新されているか、またnoticeに正当性があるかチェック
2.wp_notice_fieldは他のサイトからではないということを認証する(form内に記述)
WordPress Codex日本語版:wp_notice_field
コードをプラグイン用のファイルにします
それではfunction.phpに書いたコードを消して、
「Paka3 Custom Field Delete KEY.php」というファイルを作成し、以下のコードを記入します。
このファイルを[wp-content]>「plugins」ディレクトリに入れ、管理画面で有効にして完了です。
今回のまとめ
今回はカスタムフィールドの変数と値を削除するプラグインを作成しました。実際には開発時にたくさん作ったカスタムフィールドを削除したい!というが目的だったので、比較的シンプルに書けたと老います。ちなみに似たようなプラグインは探せばありますよ!