検索フィールドを持ち、WP_List_Tableを使用するプラグインを開発しようとしています。このプラグインは厳密にはバックエンド用であり、データベース内のユーザーを検索し、それらを追加のプラグインからの他のメタと一緒に返します。
ユーザーを検索すると、_wpnonceと_wp_http_refererの隠し入力フィールドがURLストリングに追加されます。 _wpnonceはそれほど大きな問題ではありませんが、_wp_http_refererは問題です。
プラグインを使用している人が複数の検索を続けている場合、_wp_http_referer文字列がURL内で非常に長くなり、エラーになります。Request-URI Too Large要求されたURLの長さがこのサーバーの制限を超えています。
では、検索ボタンがクリックされるたびに、隠し値がURLに表示されないようにするか、_wp_http_refererをリセットする方法を教えてください。
この問題は、いくつかの問題が原因で発生します。
1)WP_List_Table::search_box()
は、wp_nonce_field()
を使用してデフォルトの_wpnonce
および_wp_http_referer
フィールドを上書きする機能を提供せずに「私はもう一回だけフィールドに感謝します」と言って挿入する。
WP_List_Table::print_column_headers()
は現在のGET
およびorderby
パラメータについてのみWP_List_Table
をチェックし、そのヘッダリンクを構築するために$_GET
を使用するため、$_SERVER['REQUEST_URI']
をサブクラス化するときは、フォーム送信の方法としてorder
を使用する必要があります。フォームメソッドとしてGET
を使用しない場合は、列をソートするときに検索パラメータを失います。
Request-URI Too Large The requested URL's length exceeds the capacity limit for this server
エラーを回避する方法は2つあります。
A)すべてのnonceチェック関数は_wp_http_referer
リクエストフィールドまたは参照元の適切なヘッダーへのフォールバックのいずれかを使用できるため、処理の早い段階で_wp_http_referer
クエリ引数を削除できます。
したがって、この問題を解決する簡単な方法は、あなたのWP_List_Table
サブクラスのprepare_items()
関数に以下の非常に早い段階で追加することです。
$_SERVER['REQUEST_URI'] = remove_query_arg( '_wp_http_referer', $_SERVER['REQUEST_URI'] );
B)間違いなくもっと安全で確実な方法は、prepare_items()
が期待通りに機能するように、いったんそれらをコンパイルしたら、POST
フォーム投稿メソッドに切り替えてWP_List_Table::print_column_headers()
の$_SERVER['REQUEST_URI']
をあなたが気にするすべてのパラメータで更新することです。
$options = array(
'blog_id' => $blog_id,
's' => $search,
'record_type' => $record_type,
'orderby' => $orderby,
'order' => $order,
);
// Update the current URI with the new options.
$_SERVER['REQUEST_URI'] = add_query_arg( $options, $_SERVER['REQUEST_URI'] );