投稿タイプのカスタムフィールドを定義する関数があります。フィールドが「サブヘッド」であるとします。
投稿が保存されたら、入力に対して何らかの検証を行い、必要に応じて投稿編集画面にエラーメッセージを表示します。何かのようなもの:
// Handle post updating
function wpse_update_post_custom_values($post_id, $post) {
// Do some checking...
if($_POST['subhead'] != 'value i expect') {
// Add an error here
$errors->add('oops', 'There was an error.');
}
return $errors;
}
add_action('save_post','wpse_update_post_custom_values',1,2);
これをsave_postアクションにフックしようとしていますが、エラーの処理方法がわかりません。関数に渡されたエラーオブジェクトは存在しないようで、独自のWP_Error objを作成してそれを返す場合、ポスト編集ページでエラーを吐き出すメカニズムによって尊重されません。
現在、カスタムメタボックス内にページ上のエラーメッセージがありますが、これは理想的とは言えません。WPが通常表示するような、大きくて赤くて上部にエラーがあります。
何か案は?
更新:
@Denisの回答に基づいて、いくつかの異なることを試しました。エラーをグローバルとして保存することは機能しませんでした。これは、Wordpressがsave_postプロセス中にリダイレクトを行うため、グローバルを表示する前に強制終了するためです。
私はそれらをメタフィールドに保存することになりました。これに伴う問題は、それらをクリアする必要があることです。そうしないと、別のページに移動しても消えないため、エラーをクリアするだけのadmin_footerに追加された別の関数を追加する必要がありました。
非常に一般的なもの(投稿の更新)のエラー処理がこれほど不格好になるとは思いませんでした。明らかな何かを見逃していますか、これが最良のアプローチですか?
// Handle post updating
function wpse_5102_update_post_custom_values($post_id, $post) {
// To keep the errors in
$errors = false;
// Do some validation...
if($_POST['subhead'] != 'value i expect') {
// Add an error here
$errors .= 'whoops...there was an error.';
}
update_option('my_admin_errors', $errors);
return;
}
add_action('save_post','wpse_5102_update_post_custom_values',1,2);
// Display any errors
function wpse_5102_admin_notice_handler() {
$errors = get_option('my_admin_errors');
if($errors) {
echo '<div class="error"><p>' . $errors . '</p></div>';
}
}
add_action( 'admin_notices', 'wpse_5102_admin_notice_handler' );
// Clear any errors
function wpse_5102__clear_errors() {
update_option('my_admin_errors', false);
}
add_action( 'admin_footer', 'wpse_5102_clear_errors' );
update_option('my_admin_errors', false);
、末尾のifステートメントの直後に実行する方がわずかに効率的wpse_5102_admin_notice_handler()
でしょうか?
admin_footer
通知ハンドラー関数の最後でエラーをクリアすると、フックを取り除くことができると思います。物事を少し簡素化します。