强制从插件下载文件(更改输出http标头)

时间:2021-09-23 作者:user761076

我正在开发一个插件,我想添加一个菜单项,强制文件下载(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);
        }
    }
}

1 个回复
最合适的回答,由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\' ] );.

相关推荐