我正在开发一个插件,我想添加一个菜单项,强制文件下载(CSV)。
在这个论坛和互联网上有一些帖子使用了类似的解决方案,所有这些帖子都很老了,这个解决方案似乎不再有效了。
这是我目前的做法(基于上述帖子)。这确实会强制下载文件,但该文件实际上是一个生成的HTML,包含所有WP admin菜单和所有内容。
MyPlugin::__construct()
$capability = \'manage_options\';
$menu_slug = \'myplugin-data-export\';
$function = [$this, \'exportCSVdata\'];
add_submenu_page(null, \'\', \'\', $capability, $menu_slug, $function);
MyPlugin::exportCSVdata()
public function exportCSVdata()
{
header("Content-type: application/x-msdownload");
header("Content-Disposition: attachment; filename=data.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo \'data\';
exit();
}
输入URL时执行此函数
http://example.com/wp-admin/admin.php?page=myplugin-data-export所以,问题可能是,
如何在我的插件类中创建一个生成裸页的函数?没有标题,包括所有可湿性粉剂html的东西?
在ohter的一些帖子中,我看到了一个使用admin-post.php
而不是admin.php
但也不起作用。
EDIT插件正在按如下方式运行:
if ( !class_exists( \'MyPlugin\' ) ) {
class MyPlugin
{
static $instance = false;
public static function getInstance()
{
if ( !self::$instance )
self::$instance = new self;
return self::$instance;
}
public function __construct()
{
register_activation_hook( __FILE__, [$this, \'mypluginInstall\']);
add_action(\'admin_menu\', [$this, \'adminMenuEntries\']);
}
public function adminMenuEntries()
{
//... some stuff
$capability = \'manage_options\';
$menu_slug = \'myplugin-data-export\';
$function = [$this, \'exportCSVdata\'];
add_submenu_page(null, \'\', \'\', $capability, $menu_slug, $function);
}
}
}
最合适的回答,由SO网友:Sally CJ 整理而成
如何在插件类中创建一个生成标记页面的函数?没有标题,包括所有可湿性粉剂html的东西?
有很多方法可以做到这一点,例如使用admin_post
hook 就像你看到的@fuxia\'s answer here (这在WordPress 5.8.1中对您要做的事情起作用),或者parse_request
hook 正如你所看到的my answer here (用于输出图像数据)-WordPress REST API也使用相同的挂钩。
但你说:
我正在开发一个插件,我想添加一个菜单项,强制下载文件(CSV)。
因此,如果必须使用标准的管理页面URL,如http://example.com/wp-admin/admin.php?page=myplugin-data-export
, 然后你就可以exportCSVdata()
上的函数load-<page hook>
hook, 在你的情况下<page hook>
值将是返回的挂钩名称add_submenu_page()
:
$hook = add_submenu_page(\'<parent slug>, \'\', \'<menu title>\', $capability, $menu_slug, $function);
add_action( "load-$hook", [ $this, \'exportCSVdata\' ] );
然后单击菜单项将强制下载文件,(CSV)文件也将具有有效数据(并且页面上没有显示管理菜单HTML)。
但是你可以把菜单链接到http://example.com/wp-admin/admin-post.php?action=print.csv
通过传递空字符串(\'\'
) 作为的第6个参数add_submenu_page()
, and 将菜单slug设置为admin-post.php?action=print.csv
:
add_submenu_page(\'<parent slug>, \'\', \'<menu title>\', $capability, \'admin-post.php?action=print.csv\', \'\');
那样的话,我敢打赌
admin_post
挂钩将按预期工作。
例如,在类构造函数中,可以添加add_action( \'admin_post_print.csv\', [ $this, \'exportCSVdata\' ] );
.