我正在开发一些插件,需要在其中启用自定义URL重写。我想通过设置API来编辑自定义URL,所以基本上我做了验证和更新选项所需的一切。在注册自定义帖子类型时,重写URL选项已经在插件激活时传递,所以我需要在选项更新后以某种方式对其进行更改。存在的主要问题是,如何在验证重写URL的值是否已实际更改后刷新\\u rewrite\\u rules()。
我在init操作上注册自定义的post类型,我正在写的validate设置为admin\\u init操作中的register\\u设置。保存设置更改后,验证功能运行一次,然后请求重定向回选项页。
我尝试了下面的代码,但URL只有在第二次更新后才会更改(我必须单击“保存更改”按钮两次):
function my_plugin_name_validate_options($args) {
foreach($args as $key => $value) {
switch ($key) {
case \'rewrite_url\':
flush_rewrite_rules();
break;
case \'other\':
// code for other cases... too long to post here
break;
}
}
}
这段代码只是一个示例,在这里我刷新重写规则,它实际上没有被使用,但我像这样验证每个选项字段。
问题是在验证/更新选项后,我应该在哪里运行flush\\u rewrite\\u rules()来更新更改?
最合适的回答,由SO网友:Otto 整理而成
我在init操作上注册自定义的post类型,我正在写的validate设置为admin\\u init操作中的register\\u设置。
这是你问题的关键。您正在注册自定义帖子类型,可能您正在该注册中设置重写规则。
当你打电话的时候flush_rewrite_rules()
, 此时,规则将立即重建。因此,在验证函数中,尚未保存重写规则的新设置,也未使用新规则更新自定义帖子类型注册。
注意:添加的清理/验证函数回调使用register_setting
在将设置保存到数据库之前而不是之后运行。
基本上,您需要更好地处理更改。可以在验证函数中执行此操作,但可能需要先修改已注册的CPT。基本上,用更改再次注册它。然后,当您刷新重写规则时,它应该通过您的修改正确地重建它们。
在第二次尝试时,这对您有效的原因是因为您保存和刷新的方式。第一次刷新,但重写规则没有更改。然后,保存您的选项。在下一次加载时,CPT将使用您的新信息注册,因此您的新规则已经存在,但您尚未刷新。再次保存会导致第二次刷新,现在您的规则生效。