WordPress

お問い合わせフォームの管理画面を作ってみる(削除と条件分岐):【65日目】WordPress1日1プラグイン

更新日:

ようこそのお運びで、厚く御礼申し上げます。
65日目です。今回は作成してきたお問い合わせの管理画面に削除を付けます(今回は条件分岐も修正しています)

お問い合わせフォームの管理画面を作成し、一覧画面を表示に、各々の削除ボタンを作成し、クリックすると削除を実行する

お問い合わせ管理画面の一覧に、削除ボタンをつけて削除を実行。

前回までの流れです。


今回は削除処理を作ります。

今回の仕様

  • 一覧に削除へのボタンを追加する
  • 削除を実行
  • 実行後、一覧画面にリダイレクト

一覧画面にボタンを追加

140324-0001

クリックすると削除されます。
140324-0002

※今回は確認のアラート等は省略。

プラグインのファイルに、管理画面用のコードを書きます。

今回も引き続き、前回までのプラグインファイルに、コードを追加していきます(ここでは一部省略:コード全文は文末のgistを参照)

//管理画面用:オブジェクトを生成
new Paka3_ContactAdmin;

class Paka3_ContactAdmin{
  //public $paka3Data;
  function __construct() {
    
    global $wpdb;
    //データベースのテーブル名
    $this->table_name = $wpdb->prefix . 'paka3Table';
    //管理メニュー
    add_action('admin_menu', array($this, 'adminAddMenu'));
    //条件分岐(権限下で実行するのでフックする)
    add_action('admin_init', array($this,'paka3_contents'));
   }

  //管理メニューの設定と分岐
  function adminAddMenu() {
    $page = add_submenu_page("options-general.php", 'Paka3の問合せ', 'Paka3の問合せ',  'edit_themes', 'paka3ContactList', array($this,'paka3_page'));
    add_action( 'admin_print_styles-'.$page,array($this,'paka3_post_css'));
  }
  //条件分岐
  function paka3_contents(){
    //メニューからだと条件分岐でヘッダーの再定義になるので
    //コンストラクタ下で実行する
    if(isset($_GET[paka3Contact_id]) && $_GET['delete']){
       $this->paka3_delete();
    }elseif(isset($_GET[paka3Contact_id])){
       $this->paka3_view();
    }else{
       $this->paka3_list();
    }
  }
  //出力
  function paka3_page() {
    echo $this->paka3Data;
  }
 //削除
 function paka3_delete() {
     global $wpdb;
     $paka3_sql="DELETE FROM ".$this->table_name." where id = ".$wpdb->escape($_GET[paka3Contact_id]);
     
     $wpdb->query($paka3_sql);
     //再読み込みを防ぐためリダイレクト
     $uri=  add_query_arg( array( 'completed' => 1,
                                  'delete'=>false,
                                  'paka3Contact_id'=>false ) );
     wp_redirect( $uri );
     exit();
  }
  
  
  //一覧表示
  function paka3_list() {
     //(省略)一覧表示のHTMLを作成
     //削除するリンクにはdelete=1のパラメータ追加
  }
  //閲覧
  function paka3_view() {
   //(省略)閲覧表示のHTMLを作成
  }
}
 

ポイントはどこ?

今回のポイントは2つ。delete文の実行とリダイレクト処理です。

  • 削除関数を作成します。SQLは$wpdb->queryで実行
     function paka3_delete() {
         global $wpdb;
         $paka3_sql="DELETE FROM ".$this->table_name." where id = ".$wpdb->escape($_GET[paka3Contact_id]);
    
         $wpdb->query($paka3_sql);
         exit();
      }
    
  • paka3_delete関数でSQLを実行後、ページ移動及び再読み込み防止のため、wp_redirectを使って、リダイレクトを実行。
    add_query_argはGETパラメータをもったURLを生成します。

         //再読み込みを防ぐためリダイレクト
         $uri=  add_query_arg( array( 'completed' => 1,
                                      'delete'=>false,
                                      'paka3Contact_id'=>false ) );
         wp_redirect( $uri );
    
  • また、リダイレクト処理を行う場合、WordPressがheaderを出力する前に定義する必要があります(結構、重要!)。

条件分岐の見直し(再検討の余地まだあり)。

削除、一覧、閲覧など分岐処理を行う部分を修正しています。
リダイレクトはメニューから実行すると、実行されないのでコンストラクタの流れで実行します・・・この部分はちょっと自信がないです。

  •   function __construct() {
    
        global $wpdb;
        //データベースのテーブル名
        $this->table_name = $wpdb->prefix . 'paka3Table';
        //管理メニュー
        add_action('admin_menu', array($this, 'adminAddMenu'));
        //条件分岐(権限下で実行するのでフックする)
        add_action('admin_init', array($this,'paka3_contents'));
       }
    
      //管理メニューの設定と分岐
      function adminAddMenu() {
        $page = add_submenu_page("options-general.php", 'Paka3の問合せ', 'Paka3の問合せ',  'edit_themes', 'paka3ContactList', array($this,'paka3_page'));
        add_action( 'admin_print_styles-'.$page,array($this,'paka3_post_css'));
      }
      //条件分岐
      function paka3_contents(){
        //メニューからだと条件分岐でヘッダーの再定義になるので
        //コンストラクタ下で実行する
        if(isset($_GET[paka3Contact_id]) && $_GET['delete']){
           $this->paka3_delete();
        }elseif(isset($_GET[paka3Contact_id])){
           $this->paka3_view();
        }else{
           $this->paka3_list();
        }
      }
      //出力
      function paka3_page() {
        echo $this->paka3Data;
      }
    
    

    CakePHPとか、Ruby on Railsとかはあるここら辺は考えなくて良いのですが、今回はWordPress状の定義に載って自作する必要があるので、試行錯誤です。

コードをプラグイン用のファイルにします

それではfunction.phpに書いたコードを消して、
Paka3_Contact.php」というファイルを作成し、以下のコードを記入します。

このファイルを[wp-content]>「plugins」ディレクトリに入れ、管理画面で有効にして完了です。

今回のまとめ

今回は、リダイレクト処理でハマってしまいました。メニューから条件分岐を実行して、リダイレクトすると飛ばない・・・headerが先に定義されているからだなとわかったのですが、その後どうすれば良いか悩みました。
今回はコンストラクタ→メニュー定義→条件処理(アクションフック)としましたが、デバック出力のみでソースを追っていないのでまだ自信がないです。権限下で大丈夫っぽかったけど、まだ変更の余地がありそうな気がします。

-WordPress
-, , , ,

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