web-dev-qa-db-ja.com

カスタムメニューページにadd_settings_errorを実装するにはどうすればいいですか?

Professional WordPress Plugin Development bookでは、Settings APIの適切な使用方法について詳細に説明しています。また、MenusとSubmenusを追加する方法も示していますが、残念ながらこれを組み合わせた例は提供されていません。私はそれをうまく動かすことができましたが、カスタムメニューページにadd_settings_errorを正しく実装する方法を私は理解することができません。これが私のコードです:

function settings_main_validate( $input ) {
$valid['text_string'] = preg_replace( '/[^a-zA-Z]/', '', $input['text_string'] );

if ( $valid['text_string'] != $input['text_string'] ) {
    //add_setting_error: $title, $id, $error_message, $class
    add_settings_error( 'fields_main_input', 'texterror', 'Incorrect value entered!', 'error' );
}   

return $valid;
}                  

上記の検証はadd_options_pageを使用してレンダリングされた設定ではうまく機能しますが、add_menu_pageを使用してレンダリングされたページでは設定エラーを表示しません。

8
jnthnclrk

エラー/通知の作成および表示プロセスには、いくつかの構成要素があります。

  1. add_settings_error() スタックに項目を追加するための呼び出し(グローバル$wp_settings_errors変数)。
  2. エラーがページからページへ移動しても存続できるように、エラーを保持するsettings_errors transient。
  3. settings_errors() function get_settings_errors() メモリまたは一時的なエラーからエラーを取得して表示します。

これらはSettings APIの魅力のように機能しますが、残念ながら一般的な用途には設定されていません。一方、それを回避するのは簡単です。

プラグインのページでsettings_errors()admin_noticesにフックし、エラーコードを渡して自分のものだけを表示するようにします。

手動でエラーをsettings_errors transientに保存します(単にそのグローバル変数をそれに詰め込みます)。

get_settings_errors()はGETパラメータ($_GET['settings-updated'])がメモリではなく一時的なものをチェックするというヒントを期待しているので、それを提供するか、一時的なものからエラーを取得してsettings_errors()を呼び出す前にグローバル変数に保存することができます。

更新

あなたはこれを複数の質問を伴うちょっとした混乱に変えているので、ここであなたの懸念に対処しようと思います。

Settings API doesは管理ページで動作します。管理ページは基本的にSettingsセクションを使用しません。あなたの本当の問題はその場合エラー/通知報告が機能しないことです。

まず最初に、Settings APIで設定したフォームを投稿するとどうなりますか。

  1. データは特別なoptions.phpページに投稿されます。
  2. コールバックを使用してデータがサニタイズ/検証されます。
  3. サニタイズ/検証中に発生したエラー/通知はすべて収集され、一時的に保存されます。
  4. あなたはどこから来た場所でもにリダイレクトされます。

管理ページをロードすると、このページがSettingsセクションに属している場合 _がチェックされ、その場合に小さなoptions-head.phpファイルが含まれていると、エラー通知の取得と表示が行われます。

したがって、他のページで「機能していない」唯一のものはこの後者のステップです。これは上記の関連関数の概要を理解するのには自明です(一時的なものについては詳しく説明しすぎます。基本的な場合は不要です)。

8
Rarst

少し遅れましたが、私はこれを通過しました。 OPのコードに基づいて、私が見つけた最良の解決策はこのコードを挿入することです:

function your_admin_notices_action() {
    settings_errors( 'fields_main_input' );
}
add_action( 'admin_notices', 'your_admin_notices_action' );

これにより、add_menu_pageを使用してレンダリングされた管理ページに管理通知表示が追加されます。

0
Bev