ようこそのお運びで、厚く御礼申し上げます。
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」ディレクトリに入れ、管理画面で有効にして完了です。
今回のまとめ
今回はカスタムフィールドの変数と値を削除するプラグインを作成しました。実際には開発時にたくさん作ったカスタムフィールドを削除したい!というが目的だったので、比較的シンプルに書けたと老います。ちなみに似たようなプラグインは探せばありますよ!