标题听起来违反直觉,但请耐心等待。 :)
我有选项页面,使用 Settings API 制作。 当用户输入无效数据时,我想显示错误通知 add_settings_error()
称呼。
但! 要确定数据无效,我需要进行远程 API 调用。 该调用依赖于保存的数据。 所以我不能在清理回调(这是抛出此类通知的推荐位置)中执行此操作,因为我的数据尚未保存。
相反,我试图将我的支票挂钩到 admin_notices
. 除了一种(也是最重要的)情况外,它在大多数情况下都可以正常工作-保存设置后,它们总是紧随其后 本国的 设置已保存。 通知和我的自定义通知被完全忽略 因为某些原因。
那么即使 WP 认为一切都很好,我该如何抛出错误通知呢?
编辑
更集中的问题 – 为什么 设置已保存。 胜过任何其他通知?
PS 我可以尝试让 API 调用有选择地将数据作为参数,而不是从保存的选项中读取数据,但到目前为止,我认为这会使参数过于庞大。
好的,我想我知道发生了什么。
-
要显示的通知列表由以下方式检索
get_settings_errors()
( 来源 )。 -
此函数从全局读取通知
$wp_settings_errors
除非 有settings_errors
瞬态集,胜过全局变量。 -
保存设置时,检查是否有设置错误,如果有 设置已保存。 通知生成。 之后(在任何一种情况下)错误被保存到
settings_errors
瞬态(我假设在重定向时保留它们)(来源)。
基本上无论您在代码中生成什么通知 – 当设置瞬态时它们将被忽略,并且它总是在保存设置后设置。
对于我来说,将 transient 与全局变量连接起来而不是将其连接起来是有意义的 独占或 选择。
而且我想在设置瞬态时显示自定义通知我需要弄乱那个瞬态,这可能不值得麻烦。
我猜你可以做的一件事是:
- 在您的验证回调中,读取当前设置(无论如何您都可以这样做?)并将它们存储在一个变量中
- 首先检查所有其他值
- 如果它们无效,则返回错误,不检查临界值
- 如果是,将它们存储在数据库中(在您的验证函数中)
- 做你的远程API调用
- 验证棘手的价值
- 如果有效,请返回整串并且一切正常
- 如果没有,将您在开始时获得的旧设置存储回数据库,通过以下方式输出错误
add_settings_error()
当然,这在某种程度上破坏/滥用了设置 API,但它可能是一种方式。
编辑:“设置已保存”消息并不会胜过您的其他通知,它只会显示,因为您的其他通知已经(出于某种原因)从内部 settings_error 存储中被擦除。 我不知道为什么会这样,但是当且仅当它为空时,“设置已保存”消息才会被添加到错误存储中。 可能导致您陷入困境的是,每当读取设置错误存储时(通过 get_settings_errors()
) 它也会被擦除。