我创建了一个使用自己的管理页面的插件。它必须。现在我已经整理出WP_List_Table()的内容,我必须说这很棒...但是....
自定义插件页面始终以
admin.php?page=...
加载,除非我想直接从插件目录中加载它们,我不知道。现在,如果我从该页面执行“操作”,则需要以某种方式进行处理,然后不使用action参数将其重定向回该页面。不管我真的执行GET还是POST。在所有内部页面上WP都在同一页面上执行此操作,它检查是否有操作,是否处理该操作然后重定向到自身而无需那个行动。这是可能的,因为尚未在这些页面上加载
admin-header
。如果您尝试在自己的页面上进行操作,则一半的管理界面已发送到浏览器,因此无法再进行重定向。显然,解决方案是直接POST / GET到另一个页面,在该页面上加载WP框架,进行处理,然后重定向回原始页面...但是...有点烦人,因为...我的原始页面是通过回调加载的,因此它在我的类的方法中运行。太好了。
如果我加载一个单独的页面,我必须手动添加
wp-load.php
,而且我不在我的课上,这很烦人,在我的情况下,我尤其讨厌我,因为我只是在实例化我的插件类是匿名的,因此没有人可以从外部访问它。 (我知道一种解决方法...我可以将函数挂接到
load-....
中,该函数检查操作参数并进行处理和重定向。但是我想知道如果有更好的方法。)谢谢。
#1 楼
根据经验,大多数操作都应使用POST请求,以确保它们不会意外执行。但是,在POST请求之后重定向到普通页面也是一个好习惯,以防止用户刷新页面时重复执行。因此流程如下: />
您的带有POST表单的插件页面,提交给
处理请求的页面,该页面重定向到
您的插件页面,其中显示操作的结果
中间页面不必是您的插件页面。这意味着您可以使用三年前附带的“通用POST处理程序”,即
'admin_action_' . $_REQUEST['action']
中的admin.php
钩子。示例用户是Akismet插件。如果要可靠地使用它,则必须直接提交给
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
}
评论
嘿,我将再次查看代码,我显然没有看到,但是只是为了确认...所以,您要说的是,如果我直接调用admin.php而没有页面参数,则会跳过所有页面加载,只是进行一些初始化并运行钩子?太棒了…………(我仍然不明白为什么他们没有在页面加载之前放钩子)。
– wyrfel
2011-2-28在22:27
@wyrfel:是的,直接调用admin.php是Akismet消息源教我的“技巧”。您在显示表单时是正确的,并希望在出现错误的情况下再次显示它:如果目标位置是您的插件页面,但是钩子位于开始位置,则很容易(因此,如果成功,您可以重定向或显示再次显示错误消息(如果没有)。也许建议在Trac票中?
– Jan Fabry
2011年3月1日在8:14
我要出票。作为一种解决方法,我发现'load-
– wyrfel
2011年3月1日,9:50
@wyrfel:为什么错误消息仍然有问题?如果出现错误消息,请停留在页面上并再次显示带有消息的表单(当然,刷新在这里没有多大意义-但这也不会造成任何危害,因为错误仍然存在,并且不会采取任何措施被执行)。如果没有错误,请执行操作并重定向到“安全”概述页面。这将起作用-如果将admin_action_钩子移到插件页面加载器之前。
– Jan Fabry
2011年3月1日10:23在
好吧...我觉得太复杂了。
– wyrfel
2011年3月1日上午10:57
#2 楼
我通过在用户提交的页面上的操作URL上添加noheader = true来执行操作,对此方法略有不同。然后以wp_redirect()结束下一个页面动作(例如,添加页面->编辑页面,删除页面->列表页面,编辑页面->编辑页面)。我还在URL上传递了一条消息,因此我可以显示更新成功或失败之类的状态。这种方法可以将所有操作(列表,添加,编辑,删除,批量删除等)保留在同一类中,并且具有相同的管理标记,因此非常易于维护和理解。 br />
评论
天哪,你真是天才!我已经连续挣扎了两天,看来我所需要的只是“ noheader = true”部分。谢谢!
–r00m
2014年4月9日在10:37
评论
为什么用[plugin-wp-pagenavi]标记? [plugin-development]当然在这里很受欢迎。@Jan Fabry:不确定用于plugin-wp-pagenavi是什么...我假设它用于处理插件和管理菜单之间的相关性。由于我的问题与此有关,因此我选择了该标签。
WP-PageNavi是一个具有前端更高级页面导航功能的插件。您可以在此处使用[admin-menu],但我认为这与之无关。我将标签更改为我认为合适的标签,您当然可以再次对其进行编辑。
@Jan Fabry:感谢您进行重新标记...对整个标记池还不是很熟悉,(显然)。