【问题标题】:Wordpress Plugin that creates a .json file创建 .json 文件的 Wordpress 插件
【发布时间】:2019-12-21 22:11:10
【问题描述】:

我目前正在创建一个 Wordpress 插件,用于读取该站点的 SQL 表并将它们转换为 JSON 格式。

我还可以在上述插件的管理页面中输出该数据。但是,我无法将该数据输入 .json 文件并下载。基本上这个文件不会运行:

file_put_contents("$db.json", json_encode($import));

我得到了一些提示:

添加以下标题:

header("Content-Description: File Transfer"); 
header("Content-Type: text/plain"); 
header("Content-Disposition: attachment; filename=\"test.json\""); 

但是,我不能这样做,因为它给了我一个错误,即在初始化过程结束后我无法添加其他标题(HTML 已加载到页面上)。

有人可以就这个问题给我一些指导吗?

高概述是:

  1. 插件已下载。
  2. 用户提供用户名/密码和数据库名称以便访问 SQL 表(通过表单)。
  3. 提交表单,一旦表单与该数据一起提交,脚本就会使用它来输出 JSON 文件。

如果您需要更多信息,请询问。

谢谢,

【问题讨论】:

    标签: wordpress


    【解决方案1】:

    为此我要做的是创建一个单独的 PHP 文件,该文件在调用时仅返回 JSON 内容(对于以管理员身份登录或具有特定功能的用户)。如果您只想访问 WordPress 数据库,而不是其他数据库,您甚至不需要询问数据库凭据。您可以在插件目录中创建一个名为export.php 的文件(例如,如果您的插件名为my-plugin,则为/wp-content/plugins/my-plugin/export.php):

    <?php
    
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');
    global $wpdb; // in case you need the WP database to query stuff
    
    header("Content-type: application/json; charset=utf-8");
    header('Content-Disposition: attachment; filename="export.json"');
    
    if(current_user_can('administrator')) {
        // use $wpdb to query the WP database?
        $result = ["result" => ["data" => "here"]];
    } else {
        $result = [];
    }
    echo json_encode($result);
    

    用您自己想要的 JSON 结果内容替换“此处的结果数据”行,无论它是什么。

    除了需要“管理员”功能之外,您还可以使其依赖于任何其他权限。如果您不想使用 WP 角色/功能,还有其他访问控制机制的方法。

    接下来,您可以在管理页面中创建一个表单,将适当的 URL 放置到您的 export.php,如下所示:

            <form name="export" action="<?php echo plugin_dir_url(__FILE__)?>export.php" method="post">
                <input type="submit" name="submit" value="Download">
            </form>
    

    单击“下载”将触发 export.php 的请求,然后开始文件下载。不需要任何其他输入字段,除非您希望它们在那里。对于require_once($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');$_SERVER['DOCUMENT_ROOT'] 确保从您的 WP 安装的根文件夹中调用它。 wp-load.php 加载整个 WordPress 核心,包括 wp-config.php 设置、WP 数据库连接和插件,因此理论上您可以在 export.php 中使用整个插件 API(例如,如果站点使用 ACF )。

    【讨论】:

    • 您好 Damocles,关于您的回答的几个问题......因为我无法得到适当的结果。 a) wp-load.php 是一个允许访问数据库的文件(我在根文件夹中看到一个这样命名的文件)? b) 当我提交表单时,我收到找不到对象的错误。由于这是一个插件,并且会从一个站点移动到另一个站点,所以我认为我无法访问根文件夹(即使我把它放在那里也不起作用)。你在那里有什么想法?感谢您的帮助。
    • 嗨。 wp-load.php 是加载整个 WordPress 核心的文件。这通常由 WP 本身完成 - 每当您查看站点或 wp-admin 中的任何内容时,它都已加载。对于您希望通过 URL 直接调用的 WordPress 目录中任何位置的 PHP 文件,例如https://example.com/wp-content/plugins/my-plugin/export.php,您必须手动加载 WP 核心(通过要求 wp-load.php) - 只有这样您才能使用其 API 和数据库等功能。我已经修改了我的示例,因此您可以将 export.php 放在您的插件文件夹中,以便插件随附。
    • 答案正确并返回相应的结果。然而,我不得不做的一项调整(出于纯粹的巧合,它起作用了): action="FILE) . 'export.php'?>" 将整个路径移到了PHP 标签。
    • 很高兴它起作用了 :) 只有一条评论:它起作用并非纯属巧合。 export.php 跟在 plugin_dir_url() 路径后面的 plugin_dir_url() 是一个固定字符串,因此它既可以被回显,也可以在关闭的 &lt;?php ?&gt; 标记之后直接硬编码 - 将产生完全相同的 HTML 输出。结果是(方括号内的部分由 echo 输出,文本外部作为常规输出)“[...example.com/wp-content/plugins/my-plugin/export.php]”与“[... example.com/wp-content/plugins/my-plugin/]export.php”。客户端的浏览器最终永远不会知道区别。
    猜你喜欢
    • 2016-10-24
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多