【问题标题】:Wordpress get_option in External PHP file外部 PHP 文件中的 Wordpress get_option
【发布时间】:2016-03-21 11:42:39
【问题描述】:

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

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

有什么想法或解决方案吗?我试图在 wp-load.php 的要求上方添加define('WP_USE_THEMES', false);,但它仍然导致 cron 作业失败。

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

非常感谢。

【问题讨论】:

  • 你不想那样做。使用内置的 WP Cron 系统。如果您需要一个可靠的 5 分钟 cron 作业,那么您实际上设置了一个触发内置 WP cron 系统的 cron 作业:Schedule Events Using WP Cron
  • 我想无论出于何种原因,都无法将此文件放入 wordpress 文件夹结构中?
  • @Theavonguy - 这不是这样做的方法。我一直在这条路上(很多经验)。您可以在不运行前端的情况下“引导”WP,但这不是挂钩/触发 WP 插件的 cron 作业的正确方法。
  • @cale_b 我​​不同意,WP cron 系统对于这类工作并不可靠,因为它取决于是否有人每 5 分钟访问一次您的网站。对于这种情况,包括 wp-load.php 来获取 WP 内核是正确的方法。
  • @vard - 曾经是我也很担心,但是您可以设置一个真正的 cron 作业来触发 wp_cron。阅读我链接的文章,这是讨论的。

标签: php wordpress cron


【解决方案1】:

快速简便的方法

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

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

正确但更长的方法

基于他链接的cale_b cmets 和this article,通过Wordpress Cron job 有一个更合适的方法。

首先在您的插件中添加一个包含需要执行的代码的函数,我们称之为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 em>的选项时,您应该禁用默认的WP CRON行为(通过Web访问的Cron执行):

define('DISABLE_WP_CRON', true);

其次,至于您关于 WP Cron 可靠性的问题,我确实看到了一个潜在的缺陷。我不是 100% 确定这一点,但我认为 wp_schedule_event 可能与服务器 cron 不同步,因为只有在间隔过去时才会执行作业。因为它将根据与服务器 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分钟。

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 行为后,它应该可以完美运行。

【讨论】:

  • 我现在正在尝试通过 wp_cron 设置 cron。我将托管环境中的 cron 路径更改为每 5 分钟点击一次 wp-cron.php。我添加了这个代码puu.sh/lWFWm/e757147b17.png。当我在浏览器中点击 wp-cron.php 时,它应该打印出来吗?
  • 我也确实在该 cron 文件的顶部有 chdir(dirname(__FILE__)); require( '../../../wp-load.php' );。仍在调查为什么它不起作用。
  • 好吧,我明白了为什么原来的 cron 作业在我的 wp-config.php 文件中不起作用我有这个代码 define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']); define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']); define('DOMAIN_CURRENT_SITE', $_SERVER['HTTP_HOST']); 当我硬编码这些值时,原来的 cron 开始工作了。引用 wp-load.php 的那个。但我仍然有兴趣让它与 wp-cron.php 一起工作,所以让我知道我的其他 cmets。非常感谢。
  • 好吧,我知道我的函数上面的代码出了什么问题,我的函数必须被称为my_cron_job(),就像你说的那样,我出于某种原因将它命名为my_cron_event()所以现在我要做的就是是否将我的 cron 作业设置为每 5 分钟点击一次 wp-cron.php?我的 cron 会向我发送一封结果电子邮件。是否会有任何来自 cron 的“结果”,例如我在 cron 作业中打印的文本或任何内容,或者没有返回?
  • 好吧,我建议用output buffering 封装您的代码,以捕获在您的 cron 期间正在回显的所有内容,并通过邮件发送此缓冲区结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2012-02-11
  • 2020-05-23
相关资源
最近更新 更多