Pat*_*ser 5 php wordpress cron
我创建了一个插件,可以以编程方式将产品添加到 WooCommerce。该插件运行良好,但现在我需要创建一个每 5 分钟运行一次的 cron 作业来更新库存。
我已经编写了所有脚本,但我需要在这个 php 文件中包含对 get_option() 的调用,以获取用户输入的某些插件值。但是,我不能只包含get_option()在这个文件中,因为它在 Wordpress 核心之外。所以我的想法是把require( 'path/to/wp-load.php' );我知道你不应该做的放进去。无论如何,如果您通过网络浏览器请求点击页面,它会解决问题。但是,在包含此文件的那一刻,cron 作业失败了,因为在 wp-load.php 的某个地方它正在发送 HTTP_Header 请求。
任何想法或解决方案?我试图在define('WP_USE_THEMES', false);wp-load.php 要求的正上方添加 ,但它仍然导致 cron 作业失败。
啰嗦我知道,但是您如何将get_option()请求包含在将通过 PHP cron 作业访问的外部 PHP 脚本中。
非常感谢。
问题可能是您尝试从错误的路径包含wp-load.php 。在 CLI 环境中,路径与您对文件发出 HTTP 请求时的路径不同。因此,您应该解决您的问题:
require(dirname(__FILE__) . '/../../../wp-config.php');
Run Code Online (Sandbox Code Playgroud)
根据 cale_b 评论和他链接的这篇文章,有一种非常正确的方法可以通过执行Wordpress Cron 作业来实现。
首先在您的插件中添加一个函数,其中包含需要执行的代码,我们将其命名为my_cron_job()。您最终可以只包含在此函数中已经编写的脚本。然后添加以下内容以安排每 5 分钟执行一次:
// Define a new interval (5 minutes)
add_filter('cron_schedules', 'fively_interval');
function fively_interval($interval) {
$interval['fively'] = array('interval' => 5*60, 'display' => 'Once 5 minutes');
return $interval;
}
// Register the hook on plugin activation
register_activation_hook(__FILE__, 'my_cron_job_activation');
add_action('my_cron_event', 'my_cron_job');
function my_cron_job_activation() {
wp_schedule_event(time(), 'fively', 'my_cron_event');
}
// Unregister the hook on plugin deactivation
register_deactivation_hook( __FILE__, 'my_cron_job_deactivation' );
function my_cron_job_deactivation(){
wp_clear_scheduled_hook( 'my_cron_event' );
}
Run Code Online (Sandbox Code Playgroud)
然后将您的 cron 设置为每 5 分钟执行一次wp-cron.php:
*/5 * * * * php-cli -f [path to your WP]/wp-cron.php
Run Code Online (Sandbox Code Playgroud)
首先,当选择使用服务器 cron执行wp-cron.php的选项时,您应该禁用默认的 WP Cron 行为(通过 Web 访问执行 cron):
define('DISABLE_WP_CRON', true);
Run Code Online (Sandbox Code Playgroud)
其次,至于你关于 WP Cron 可靠性的问题,我确实看到了一个潜在的缺陷。我不能 100% 确定这一点,但我认为有可能wp_schedule_event与服务器 cron 不同步,因为只有在时间间隔过去后作业才会执行。因为它会根据脚本的执行时间重新安排,这与服务器 cron 时间略有不同。
例如:
require(dirname(__FILE__) . '/../../../wp-config.php');
Run Code Online (Sandbox Code Playgroud)
当然这是理论,也许并不准确。我建议做一些测试,看看它的表现如何。如果它确实像我想象的那样,我建议使用简单的解决方法将间隔更改wp_schedule_event为较低的间隔 - 例如 4 分钟。
add_filter('cron_schedules', 'fourly_interval');
function fourly_interval($interval) {
$interval['fourly'] = array('interval' => 4*60, 'display' => 'Once 4 minutes');
return $interval;
}
Run Code Online (Sandbox Code Playgroud)
所以我们会有以下内容:
// Define a new interval (5 minutes)
add_filter('cron_schedules', 'fively_interval');
function fively_interval($interval) {
$interval['fively'] = array('interval' => 5*60, 'display' => 'Once 5 minutes');
return $interval;
}
// Register the hook on plugin activation
register_activation_hook(__FILE__, 'my_cron_job_activation');
add_action('my_cron_event', 'my_cron_job');
function my_cron_job_activation() {
wp_schedule_event(time(), 'fively', 'my_cron_event');
}
// Unregister the hook on plugin deactivation
register_deactivation_hook( __FILE__, 'my_cron_job_deactivation' );
function my_cron_job_deactivation(){
wp_clear_scheduled_hook( 'my_cron_event' );
}
Run Code Online (Sandbox Code Playgroud)
禁用默认的 WP Cron 行为后,它应该可以完美地工作。