问题描述
我不断地遇到同样的烦恼,所以我想我会看到有没有任何想法或经验在那里…
我创建了一个使用自己的管理页面的插件。它必须现在我整理了 WP_List_Table() 的东西,我必须说这是伟大的… 但….
自定义插件页面总是加载为 admin.php?page=...
,除非我想直接从插件目录加载它们,我不这样做。现在,如果我从该页面执行’action’,我需要以某种方式处理,然后重定向到没有 action 参数的页面。不管我是做一个 GET 还是 POST,真的。
在所有内部页面 WP WP 在同一页面上,它会检查是否有一个操作,如果是这样处理它,然后重定向到自己没有动作。这是可能的,因为在这些页面上,尚未加载 admin-header
。
如果您尝试在自己的页面上执行此操作,那么管理界面的一半已经被发送到浏览器,所以重定向不再可能了。显然,解决方案是将 POST /GET 直接发送到另一个页面,加载 WP 框架,进行处理,然后重定向到原始页面… 但… 这有点烦人,因为… 我的原始页面通过回调加载,因此它在我的类的方法中运行。那好美丽。
如果我加载一个单独的页面,我必须手动包括 wp-load.php
,并且在我的课外,这是恼人的,在我的特殊情况下,我特别是错误,因为我只是以匿名方式来组织我的插件类,以便 no-one 可以访问它外。
所以在这个漫长的故事之后… 有没有人提出了一个很好的解决方案来加载另一个页面通过回调没有整个管理界面已经设置在它周围?
(我知道一个解决方法… 我可以挂起一个功能到 load-....
检查动作参数,并进行处理和重定向,但我想知道是否有更好的方法。)
谢谢。
最佳解决方案
作为经验法则,您应该对大多数操作使用 POST 请求,以确保它们不是 executed by accident 。但是,POST 请求后重定向到正常页面也是一个很好的做法,以防止用户刷新页面时重复执行。
所以流程是这样的:
-
您的 POST 表单的插件页面,提交给
-
一个处理请求的页面,重定向到
-
您的插件页面,显示操作的结果
中间页面不一定是您的插件页面。这意味着您可以使用三年前提供的“generic POST handler”,admin.php
中的'admin_action_' . $_REQUEST['action']
钩子。
示例用户是 the Akismet plugin 。如果您想要可靠地使用它,您必须直接提交给 admin.php
,而不是提交给包含 admin.php
的另一个页面。
这是一个非常基本的如何使用它的例子:
add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' );
function wpse10500_admin_action()
{
// Do your stuff here
wp_redirect( $_SERVER['HTTP_REFERER'] );
exit();
}
add_action( 'admin_menu', 'wpse10500_admin_menu' );
function wpse10500_admin_menu()
{
add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' );
}
function wpse10500_do_page()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
<input type="hidden" name="action" value="wpse10500" />
<input type="submit" value="Do it!" />
</form>
<?php
}
次佳解决方案
我通过简单地添加 noheader = true 到用户提交的页面上的动作 URL 执行操作而略微不同
然后,我的处理程序执行操作 (即通常是添加,更新或删除),然后使用 wp_redirect() 完成下一页操作 (例如添加页面 – > 编辑页面,删除页面 – > 列表页面,编辑页面 – > 编辑页面) 。我也在 URL 上传递一条消息,以便我可以显示一个状态,例如更新成功或失败。
这种方法保持所有的操作:列出,添加,编辑,删除,bulk-delete 等在同一个类中,并使用相同的管理块,这样很容易维护和理解。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。