ようこそのお運びで、厚く御礼申し上げます。
65日目です。今回は作成してきたお問い合わせの管理画面に削除を付けます(今回は条件分岐も修正しています)。
お問い合わせフォームの管理画面を作成し、一覧画面を表示に、各々の削除ボタンを作成し、クリックすると削除を実行する
お問い合わせ管理画面の一覧に、削除ボタンをつけて削除を実行。
前回までの流れです。
今回は削除処理を作ります。
今回の仕様
- 一覧に削除へのボタンを追加する
 - 削除を実行
 - 実行後、一覧画面にリダイレクト
 
一覧画面にボタンを追加

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

※今回は確認のアラート等は省略。
プラグインのファイルに、管理画面用のコードを書きます。
今回も引き続き、前回までのプラグインファイルに、コードを追加していきます(ここでは一部省略:コード全文は文末の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が先に定義されているからだなとわかったのですが、その後どうすれば良いか悩みました。
今回はコンストラクタ→メニュー定義→条件処理(アクションフック)としましたが、デバック出力のみでソースを追っていないのでまだ自信がないです。権限下で大丈夫っぽかったけど、まだ変更の余地がありそうな気がします。