问题描述

Professional WordPress Plugin Development 书籍详细介绍了如何正确使用 Settings API,并且还演示了如何添加菜单和子菜单,但不幸的是,它不提供任何 joined-up 的示例。虽然我已经设法使大部分工作正常,但我无法弄清楚如何在自定义菜单页面上正确实施 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 呈现的页面上的设置错误。

最佳解决方案

错误/通知创建和显示过程有几个组件:

  1. add_settings_error()调用将项目添加到堆栈 (全局 $wp_settings_errors 变量) 。

  2. settings_errors 瞬态保持错误,使他们生存下来从一页到另一页。

  3. settings_errors()功能 get_settings_errors()从内存或瞬态中检索错误,然后显示它们。

这些工作类似于 「设置」API 的魅力,但不幸的是,它们不能设置为通用。另一方面,这是微不足道的。

settings_errors()钩到 admin_notices 插件的页面上,将错误代码传递给它,以便它只显示您的东西。

手动将错误保存到 settings_errors 瞬态 (将全局变量填入其中) 。

由于 get_settings_errors()希望提供 GET 参数 ($_GET['settings-updated']),它应该检查瞬态而不是内存,您可以自己提供或从瞬态中获取错误,并在 settings_errors()调用之前将其保存回全局变量。

更新

你正在把它变成一个混乱的多个问题,所以我会尝试在这里解决你的疑虑。

设置 API 与管理页面配合使用,不会将 「设置」 部分用作基础。你真正的问题是,在这种情况下,错误/通知报告不起作用。

首先,当您发布表单时,使用 Settings API 设置会发生什么:

  1. 数据发布到特殊的 options.php 页面。

  2. 有数据使用回调进行消毒/验证。

  3. 在清理/验证过程中出现的任何错误/通知都将被收集并保存在瞬时状态。

  4. 你被重定向到你来的地方。

现在当您加载管理页面时,它会检查此页面是否属于 「设置」 部分,如果该情况包含微小的 options-head.php 文件,则会处理检索和显示错误通知。

所以”not working” 在其他页面上唯一的事情是后一个步骤,这对你自己来说很简单,上面介绍了相关的功能 (我可能会介绍过多的细节,你不需要这个基本的情况) 。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。