繁体   English   中英

外部PHP文件中的Wordpress get_option

[英]Wordpress get_option in External PHP file

我创建了一个插件,以编程方式将产品添加到WooCommerce。 该插件运行良好,但现在我需要创建一个每5分钟运行一次的cron作业来更新库存。

我已经编写了所有脚本,但是我需要在这个php文件中包含对get_option()的调用,以获取用户输入的某些插件值。 但是,我不能只在这个文件中包含get_option() ,因为它在Wordpress核心之外。 所以我的想法是放入require( 'path/to/wp-load.php' ); 我知道你不应该这样做。 无论如何,如果您通过Web浏览器请求点击该页面,它将解决该问题。 但是,cron作业在包含此文件的那一刻失败,因为在某个地方使用wp-load.php它正在发送HTTP_Header请求。

任何想法或解决方案? 我试着添加define('WP_USE_THEMES', false); 正好在wp-load.php的要求之上,但它仍然导致cron作业失败。

我知道,但是如何在外部PHP脚本中包含get_option()请求,这些脚本将通过PHP cron作业进行访问。

非常感谢。

快捷方便

问题可能是您尝试从错误的路径中包含wp-load.php 在CLI环境中,路径与对文件执行HTTP请求时的路径不同。 所以,你应该修复你的问题:

require(dirname(__FILE__) . '/../../../wp-config.php');

适当但更长的方式

基于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' );
}

然后设置你的cron每5分钟执行一次wp-cron.php

*/5 * * * * php-cli -f [path to your WP]/wp-cron.php

更新

首先,当选择使用服务器cron执行wp-cron.php的选项时,您应该禁用默认的WP Cron行为(通过Web访问执行cron):

define('DISABLE_WP_CRON', true);

其次,至于你关于WP Cron可靠性的问题,我确实看到了一个潜在的缺陷。 我不是百分之百确定,但我认为wp_schedule_event可能与服务器cron wp_schedule_event同步,因为只有在间隔过去时才会执行作业。 因为它将根据脚本的执行时间重新调度,这与服务器cron时间略有不同。

例如:

00:00:00:000    Server cron execute wp-cron.php
00:00:00:100    The job can be executed, so let it run
00:00:00:200    Wordpress finished to execute the job - it schedule the event in 5min
00:05:00:000    Server cron execute wp-cron.php
00:05:00:100 The job is planned for 00:05:00:200, no execution !
00:10:00:000    Server cron execute wp-cron.php
00:10:00:100    The job is executed

这当然是理论 ,也许这不准确。 我建议做一些测试,看看它是如何表现的。 如果它确实表现得像我认为的那样,我建议将wp_schedule_event更改为更低的间隔 - 例如4 wp_schedule_event

add_filter('cron_schedules', 'fourly_interval');
function fourly_interval($interval) {
    $interval['fourly'] = array('interval' => 4*60, 'display' => 'Once 4 minutes');
    return $interval;
}

所以我们将有以下内容:

00:00:00:000    Server cron execute wp-cron.php
00:00:00:100    The job can be executed, so let it run
00:00:00:200    Wordpress finished to execute the job - it schedule the event in 4min
00:05:00:000    Server cron execute wp-cron.php
00:05:00:100 The job is planned for 00:04:00:200, so let it run!
00:10:00:000    Server cron execute wp-cron.php
00:00:00:200    Wordpress finished to execute the job - it schedule the event in 4min
00:10:00:100    The job is executed (planned for 00:09:00:200)

禁用默认的WP Cron行为后,它应该完美无缺。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM