应该如何在自定义菜单页面上实现ADD_SETTINGS_ERROR?

时间:2011-07-21 作者:jnthnclrk

这个Professional WordPress Plugin Development 这本书详细解释了如何正确使用设置API,还演示了如何添加菜单和子菜单,但遗憾的是,它没有提供任何相关的示例。虽然我已经设法使大部分功能正常工作,但我不知道如何在自定义菜单页上正确实现add\\u settings\\u 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.

3 个回复
最合适的回答,由SO网友:Rarst 整理而成

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

  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\']) 它应该检查transient而不是内存,您可以提供它,也可以自己从transient中获取错误,并在settings_errors() 呼叫

Update

你把这个问题弄得一团糟,有多个问题,所以我将在这里尝试解决你的担忧。

设置APIdoes 使用不使用设置部分作为基础的管理页面。您真正的问题是,在这种情况下,错误/通知报告不起作用。

首先,以下是使用设置API发布表单时发生的情况:

将数据发布到特殊options.php 第页

  • 您被重定向回wherever you came from.
  • 现在,当您加载管理页面时,它会检查if this page belongs to Settings section 如果这个案子包括tinyoptions-head.php 文件,用于检索和显示错误通知。

    因此,在其他页面上唯一“不起作用”的是后一步,通过上面的相关函数概述,您可以轻松地完成这一步(我可能对transient进行了太多的详细介绍,对于基本情况,您不需要这样做)。

    SO网友:Bev

    有点晚了,但我刚刚经历了这一切。根据OP的代码,我找到的最佳解决方案是插入以下代码:

    function your_admin_notices_action() {
        settings_errors( \'fields_main_input\' );
    }
    add_action( \'admin_notices\', \'your_admin_notices_action\' );
    
    这会将管理通知显示添加到使用add\\u menu\\u page呈现的管理页面

    SO网友:James Smartt

    只需添加

    include_once \'options-head.php\'; 
    
    对于我的自定义菜单页,在自定义菜单页上显示错误消息时,$函数似乎工作得很好。

    结束

    相关推荐

    Displaying oEmbed errors?

    有时,通过oEmbed嵌入项目是不可能的,例如,当YouTube视频已禁用嵌入时。The oEmbed service will return a 401 Unauthorized, 并且不会转换代码。有没有办法通知用户这一点?当前的工作流是非直观的(至少对我来说),我更喜欢在WordPress页面上,或者更好的是,在编辑器中显示一条消息,说明对象无法嵌入。