最近几乎每天都在更新WordPress自动问答插件,用到了一些计划任务,包括单次计划任务用于异步作答,重复性计划任务用于自动提问。对WordPress自动问答插件感兴趣的,可以访问文章:《WordPress自动问答插件,对接OpenAi ChatGPT》。
今天,重写了下授权,发现了计划任务的一个坑。计划任务无法读取网站域名,尤其使用异步作答时,无法传递网站域名,导致授权失败。后来各种找记录,各种找AI。最终确定,需要在计划任务开始前加载一下wp-load.php文件,这里定义了很多参数,包括了网站域名。当然,不排除我还是不知道wp-load.php的具体用途,下面是Ai关于这个文件的描述:《WordPress的wp-load.php文件有什么用》。
wp-load.php文件是WordPress的核心文件之一,主要作用是加载WordPress核心文件和初始化WordPress环境。可以理解为WordPress的入口文件。该文件包含了WordPress的所有函数和类。
在开发过程中,有时候必须加载wp-load.php文件,例如在编写自定义脚本或插件时,需要调用WordPress的函数或使用WordPress的数据。如果不加载wp-load.php文件,则无法访问到这些WordPress的功能和数据。
在WordPress中加载wp-load.php文件需要非常注意,因为该文件可以直接访问WordPress的数据库。如果在不安全的环境下使用该文件,可能会导致安全问题。因此,使用wp-load.php文件时必须格外小心,同时确保只有授权用户可以访问。
而我在授权时,需要获取一下网站的域名,需要用到:get_site_url()
。然后,计划任务可能为了轻便,直接不包含这个函数,就算你自己定义一下函数,也是因为计划任务本身导致无法使用。最终,我知道需要加载一下wp-load.php文件。
这个时候又来一个坑,比如,我直接从插件文件往上数三层,到达WordPress根目录,获取wp-load.php文件的路径,最终发现计划任务连它自己所在的插件文件位置都不知道。
即,如下代码无法使用
require_once('../../../wp-load.php');
后来,我又尝试了以下代码,也是无法使用
$dir = dirname(dirname(dirname(__FILE__))); // 获取当前文件所在目录的上级目录的上级目录的绝对路径
require_once $dir . '/wp-load.php'; // 使用相对路径加载wp-load.php文件
有那么一刻,我突然反应过来,计划任务肯定知道执行它的wp-cron.php文件位置,只需要在同目录找wp-load.php文件即可。没想到误打误撞,拿到了如下代码,成功解决了问题。即,如下代码可以在计划任务中成功加载wp-load.php文件,进而通过get_site_url()
获取网站域名。
require_once ABSPATH . 'wp-load.php'; // 使用绝对路径加载wp-load.php文件
其实,上面的代码是获取到了WordPress安装目录,仔细想想也对,WordPress的计划任务再轻便,也得知道WordPress的安装目录。于是,成功获取了wp-load.php文件。
问题最终得到解决。
原创文章,作者:古哥,转载需经过作者授权同意,并附上原文链接:https://iymark.com/articles/6516.html