我经常遇到同样的麻烦,所以我想我会看看是否有任何想法或经验...

我创建了一个使用自己的管理页面的插件。它必须。现在我已经整理出WP_List_Table()的内容,我必须说这很棒...但是....

自定义插件页面始终以admin.php?page=...加载,除非我想直接从插件目录中加载它们,我不知道。现在,如果我从该页面执行“操作”,则需要以某种方式进行处理,然后不使用action参数将其重定向回该页面。不管我真的执行GET还是POST。

在所有内部页面上WP都在同一页面上执行此操作,它检查是否有操作,是否处理该操作然后重定向到自身而无需那个行动。这是可能的,因为尚未在这些页面上加载admin-header

如果您尝试在自己的页面上进行操作,则一半的管理界面已发送到浏览器,因此无法再进行重定向。显然,解决方案是直接POST / GET到另一个页面,在该页面上加载WP框架,进行处理,然后重定向回原始页面...但是...有点烦人,因为...我的原始页面是通过回调加载的,因此它在我的类的方法中运行。太好了。

如果我加载一个单独的页面,我必须手动添加wp-load.php,而且我不在我的课上,这很烦人,在我的情况下,我尤其讨厌我,因为我只是在实例化我的插件类是匿名的,因此没有人可以从外部访问它。

(我知道一种解决方法...我可以将函数挂接到load-....中,该函数检查操作参数并进行处理和重定向。但是我想知道如果有更好的方法。)

谢谢。

评论

为什么用[plugin-wp-pagenavi]标记? [plugin-development]当然在这里很受欢迎。

@Jan Fabry:不确定用于plugin-wp-pagenavi是什么...我假设它用于处理插件和管理菜单之间的相关性。由于我的问题与此有关,因此我选择了该标签。

WP-PageNavi是一个具有前端更高级页面导航功能的插件。您可以在此处使用[admin-menu],但我认为这与之无关。我将标签更改为我认为合适的标签,您当然可以再次对其进行编辑。

@Jan Fabry:感谢您进行重新标记...对整个标记池还不是很熟悉,(显然)。

#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- '钩子可以正常工作...它在页面加载之前被调用...但是admin_action _...概念似乎要好得多而且更具体。另外,请注意,如果您执行POST并且不想在重新加载时重新发布,则错误消息仍然是有问题的,但这是不同的主题。

– 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

#3 楼

另一种不同的方法是在表单中添加一个隐藏的输入字段: