如何最好地处理自定义插件页面操作?

时间:2011-02-26 作者:wyrfel

我经常遇到同样的烦恼,所以我想看看是否有什么想法或经验。。。

我创建了一个插件,它使用自己的管理页面。这是必须的。现在我整理好了WP\\u List\\u Table()的内容,我必须说它很棒。。。但是

自定义插件页面始终加载为admin.php?page=... 除非我想直接从插件目录加载它们,而我不这样做。现在如果我从该页面执行“操作”,我需要以某种方式处理该操作,然后重定向回没有操作参数的页面。不管我是发GET还是发帖,真的。

在所有的内部页面上,WP在同一页面上执行此操作,它检查是否有操作,如果有,则对其进行处理,然后重定向到自身而不执行该操作。这是可能的,因为在这些页面上admin-header 还没有加载。

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

如果我加载一个单独的页面,我必须手动包括wp-load.php 我在我的类之外,这很烦人,而且在我的特殊情况下,我特别讨厌,因为我只是匿名实例化我的插件类,这样就没有人可以从外部访问它。

所以在这漫长的故事之后。。。是否有人想出了一个好的解决方案,可以通过回调加载另一个页面,而不必在其周围设置整个管理界面?

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

谢谢

3 个回复
最合适的回答,由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
}

SO网友:Russell Jamieson

我的做法略有不同,只需将noheader=true添加到用户提交操作的页面上的操作url中

然后,我的处理程序执行操作(通常是添加、更新或删除),然后通过wp\\u redirect()完成下一个页面操作(例如添加页面->编辑页面、删除页面->列表页面、编辑页面->编辑页面)。我还会在URL上传递消息,以便显示更新成功或失败等状态。

这种方法将所有操作:list、add、edit、delete、bulk delete等保持在同一个类中,并使用相同的管理slug,因此很容易维护和理解。

SO网友:simonthesorcerer

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

<input type="hidden" name="page" value="your-page-slug" />
这样,WordPress似乎可以自动处理重定向。

结束

相关推荐

如何更改wp-admin后端的措辞?

我不想为了改变用户输入新帖子的页面而编辑核心文件,所以有没有一种方法可以在一个主题中,或者在函数中这样做。php。。?具体来说,我正在尝试将“设置特色图像”文本的措辞更改为类似“设置特色图像-50像素乘以50像素”