WordPress

いらなくなったカスタムフィールドの変数と値を一括削除する。:【36日目】WordPress1日1プラグイン

更新日:

ようこそのお運びで、厚く御礼申し上げます。
36日目です。今回は前回までのSQLの処理を使って、プラグインを作ります

いらなくなったカスタムフィールドの変数と値を、選択して一括削除する。

今回は、使わなくなったカスタムフィールドの変数(キー)を、一覧からチェックボックスで選択して、値共々削除したいと思います。

前回、少し書きましたが、このカスタムフィールドの変数(キー)一覧は、今のところ(WordPress3.8)にはその機能はありません。その部分はSQLを実行して変数一覧を取得します。

なので、まず設定のしたに、「カスタムフィールドの変数を削除する」というメニューを作ります
140224-0001

「現在使われていない」、また「削除したい変数」を選択して削除を実行します
140224-0007

あとは、削除を実行すると完了メッセージを表示します。
140224-0008

まずは、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」ディレクトリに入れ、管理画面で有効にして完了です。

今回のまとめ

今回はカスタムフィールドの変数と値を削除するプラグインを作成しました。実際には開発時にたくさん作ったカスタムフィールドを削除したい!というが目的だったので、比較的シンプルに書けたと老います。ちなみに似たようなプラグインは探せばありますよ!

-WordPress
-, , , ,

Copyright© アルパカ@ラボ , 2019 All Rights Reserved Powered by AFFINGER5.