我经常遇到同样的烦恼,所以我想看看是否有什么想法或经验。。。
我创建了一个插件,它使用自己的管理页面。这是必须的。现在我整理好了WP\\u List\\u Table()的内容,我必须说它很棒。。。但是
自定义插件页面始终加载为admin.php?page=...
除非我想直接从插件目录加载它们,而我不这样做。现在如果我从该页面执行“操作”,我需要以某种方式处理该操作,然后重定向回没有操作参数的页面。不管我是发GET还是发帖,真的。
在所有的内部页面上,WP在同一页面上执行此操作,它检查是否有操作,如果有,则对其进行处理,然后重定向到自身而不执行该操作。这是可能的,因为在这些页面上admin-header
还没有加载。
但是,如果您尝试在自己的页面上执行此操作,一半的管理界面已经发送到浏览器,因此无法再重定向。显然,解决方案是直接发布/获取到另一个页面,在该页面上加载WP框架,进行处理,然后重定向回原始页面。。。但是这有点烦人,因为。。。我的原始页面是通过回调加载的,因此它在我的类的方法中运行。真漂亮。
如果我加载一个单独的页面,我必须手动包括wp-load.php
我在我的类之外,这很烦人,而且在我的特殊情况下,我特别讨厌,因为我只是匿名实例化我的插件类,这样就没有人可以从外部访问它。
所以在这漫长的故事之后。。。是否有人想出了一个好的解决方案,可以通过回调加载另一个页面,而不必在其周围设置整个管理界面?
(我知道一种解决方法……我可以将函数挂接到load-....
它检查动作参数并进行处理和重定向。但我想知道是否有更好的方法。)
谢谢
最合适的回答,由SO网友:Jan Fabry 整理而成
根据经验,您应该对大多数操作使用POST请求,以确保它们不是executed by accident. 但是,在POST请求后重定向到正常页面也是一种很好的做法,以防止用户刷新页面时重复执行。
所以流程是这样的:
带有POST表单的插件页面,该表单向处理请求的页面提交,该页面重定向到插件页面,该页面显示操作的结果。中间页面不一定是插件页面。这意味着您可以使用"generic POST handler" 这是三年前的事了,the \'admin_action_\' . $_REQUEST[\'action\']
hook in admin.php
.
示例用户是the Akismet plugin. 如果你想可靠地使用它,you have to submit to admin.php
directly, 而不是另一个碰巧包含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
}