ようこそのお運びで、厚く御礼申し上げます。
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が先に定義されているからだなとわかったのですが、その後どうすれば良いか悩みました。
今回はコンストラクタ→メニュー定義→条件処理(アクションフック)としましたが、デバック出力のみでソースを追っていないのでまだ自信がないです。権限下で大丈夫っぽかったけど、まだ変更の余地がありそうな気がします。