フォームからGETで送信すると、クエリ文字が無視されてしまう!?
<form method="get" action="?page=mylist">
これで送信すると、
$page = isset($_GET['page']) ? (string)$_GET['page'] : '';
$_GET['page'] は取得できない。
<input type="hidden" name="p" value="del" /> ...
フォームにこんなのがあったら、$_GET['p']は取得出来るのに。
おかしいな、URIのパラメータは無視されてしまう。
うまく取得できてないんだろうか、しらべる。
$qs = $_SERVER['QUERY_STRING'];
クエリ文字列からは「page=mylist」が取得出来ました。
フォームで送信すると、クエリ文字は無視されてしまう!!!
気づかなかった!
なんとなくダメっぽい。諦めましたorz
ハマったきっかけ
add_options_page(
"マイリスト管理画面",
"マイリスト",
'manage_options',
'mylist',
function() use ($table)
{
echo '<form method="get" action="?page=mylist">';
$table->search_box('検索する', 'items');
$table->display();
echo '</form>';
}
);
WordPressでこんなコード書いてました(一部省略)。
http://wordpress/wp-admin/options-general.php?page=mylist
↑オプションメニューのページからフォームをGETで送信する(hostsにて「wordpress」を仮想設定)。
オプションページのリンクはこのようにpageにスラグを貼り付けているわけで。
ここが無視されると当然ちゃんとしたページが表示されない。
なぜPOSTではなくGETで送ろうとした・・・!?
ワードプレス管理画面の「投稿」では、POSTはGETで送信してる。
http://wordpress/wp-admin/edit.php
でも送信先は「edit.php」だからクエリ文字使わないためきちんとうごく。
add_options_page(
"マイリスト管理画面",
"マイリスト",
'manage_options',
'mylist',
function() use ($table)
{
$page = esc_attr(isset($_GET['page']) ? (string)$_GET['page'] : '');
echo '<form method="get">';
echo sprintf('<input type="hidden" name="page" value="%s" />', $page); // ←しゃーない
$table->search_box('検索する', 'items');
$table->display();
echo '</form>';
}
);
仕方ないのでhiddenに入れておく。
もっといい方法とかあったら教えてください!
結局WordPressがわの問題ではなかったorz
次はWordPressのリストテーブルについて書きます。