如何从命令行执行包含PHP引入、依赖WordPress类的自定义脚本
你遇到的问题本质是WordPress核心文件(包括admin.php)依赖Web请求上下文的全局变量、路径解析逻辑,CLI模式下默认缺失这些参数,同时你当前的执行配置也存在路径和拼写问题,按以下步骤修改即可正常执行:
1. 修复PHP脚本的WordPress核心引入逻辑
不要直接引入admin.php作为入口,它本身是给Web端后台请求设计的,会做登录态校验,CLI模式下无登录用户会直接中断执行,改用WP官方兼容CLI的加载方式:
<?php // 替换原有的admin.php引入代码 // 定位WordPress根目录,脚本放在/wp-admin目录时往上跳2层就是根目录,路径不对可自行调整层数 $wp_root = dirname(__DIR__, 2); require_once $wp_root . '/wp-load.php'; // 多站点环境必须手动指定站点上下文,填入你要查询的站点ID即可 switch_to_blog(1); // 如需用到admin端的工具函数,可额外引入admin的核心工具文件 require_once ABSPATH . 'wp-admin/includes/admin.php'; // 原有的业务逻辑(查询文章队列、发送邮件等)放在下方即可
2. 修复执行脚本的路径和拼写问题
首先核对文件名拼写:你提供的sh脚本中写的文件名是my-sites-notifier-laucnh.php,和你实际创建的my-sites-notifier.php不一致,先确认是否为手误。
然后修改sh脚本,先切换工作目录再执行PHP,避免cron默认工作目录不对导致相对路径加载文件失败,同时增加日志输出方便排查问题:
#!/bin/bash # 切换到当前sh脚本所在的/wp-admin目录 cd "$(dirname "$0")" || exit # 执行PHP脚本,把正常输出和错误输出都写入日志文件 php -d display_errors=on my-sites-notifier.php > /tmp/wp-notifier-log.log 2>&1
你也可以不用sh脚本,直接在crontab中使用绝对路径执行:
# 按你的定时需求调整执行周期,以下为每分钟执行一次的示例 * * * * * /usr/bin/php -d display_errors=on /你服务器的完整站点路径/wp-admin/my-sites-notifier.php > /tmp/wp-notifier-log.log 2>&1
3. 多站点特殊处理
如果需要遍历所有站点执行检查,在加载完wp-load.php后增加遍历逻辑即可:
$sites = get_sites(); foreach ($sites as $site) { switch_to_blog($site->blog_id); // 执行单站点的业务检查逻辑 restore_current_blog(); }
执行过程中如果出现问题,可以直接查看/tmp/wp-notifier-log.log文件获取具体报错信息定位问题。
内容的提问来源于stack exchange,提问作者jimj
相关产品推荐
相关产品推荐

