WooCommerce计划任务中error_log()函数失效问题求助
问题原因与修复方案:WooCommerce计划任务中error_log()失效
问题原因
WooCommerce的续订订单是通过WordPress计划任务(WP Cron)触发的,而计划任务通常以CLI模式或后台静默请求模式运行,和前端用户请求使用的PHP环境配置存在差异:
- 多数服务器上,CLI模式的PHP默认未配置
error_log的输出路径,或者日志文件权限不足,导致error_log()无法写入日志内容。 - 新订单由前端请求触发,使用web环境的PHP配置,
error_log()能正常输出;续订订单走计划任务流程,就会出现error_log()失效的情况。
修复方案
方案一:使用WordPress内置日志函数替代
WordPress自带的wp_debug_log()会把日志写入wp-content/debug.log文件(需先在wp-config.php中开启相关配置),在计划任务环境中稳定性更强,直接替换代码里的error_log()即可:
wp_debug_log('RUNNING woocommerce_subscription_payment_complete');
开启WP_DEBUG_LOG的配置代码(添加到wp-config.php中):
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false);
方案二:完善自定义日志函数
确保你的custom_log函数指定了可写入的日志路径,并处理好文件权限问题,示例代码:
function custom_log($message) { $log_path = WP_CONTENT_DIR . '/woocommerce-subscription-logs.log'; // 确保文件存在且具备写入权限 if (!file_exists($log_path)) { touch($log_path); chmod($log_path, 0644); } $log_content = '[' . current_time('Y-m-d H:i:s') . '] ' . $message . PHP_EOL; file_put_contents($log_path, $log_content, FILE_APPEND); }
方案三:调整CLI模式的PHP配置
- 找到CLI模式使用的php.ini文件:执行
php -i | grep php.ini命令查看具体路径 - 编辑该文件,设置
error_log参数为PHP进程可写入的文件路径:
error_log = /var/log/php-cli-error.log
- 修正日志文件权限:比如执行
chown www-data:www-data /var/log/php-cli-error.log(根据服务器实际用户组调整)
修改后的完整代码示例
add_action( 'woocommerce_subscription_payment_complete', function( $subscription ) { wp_debug_log('RUNNING woocommerce_subscription_payment_complete'); custom_log('RUNNING woocommerce_subscription_payment_complete'); $user_id = $subscription->get_user_id(); $user = new WP_User($user_id); $user->set_role( 'customer' ); wp_debug_log('WOO-SUBSCRIPTION-PAYMENT-COMPLETE...ROLE SET TO CUSTOMER: ' . $user_id); custom_log('WOO-SUBSCRIPTION-PAYMENT-COMPLETE...ROLE SET TO CUSTOMER: ' . $user_id); $current_order = $subscription->get_last_order( 'all', 'any' ); if ($current_order) { // 增加空值判断,避免出现报错 $current_order->update_status( 'completed' ); } }, 100);
内容的提问来源于stack exchange,提问作者l_r
相关产品推荐
相关产品推荐

