gpt4 book ai didi

php - 外部 PHP 文件中的 Wordpress get_option

转载 作者:可可西里 更新时间:2023-10-31 23:29:14 25 4
gpt4 key购买 nike

我创建了一个插件,可以通过编程方式将产品添加到 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 作业失败。

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

非常感谢。

最佳答案

快速简便的方法

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

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

正确但更长的方法

基于 cale_b 评论和 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 的选项时,应禁用默认的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
<b>00:05:00:100 The job is planned for 00:05:00:200, no execution !</b>
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
<b>00:05:00:100 The job is planned for 00:04:00:200, so let it run!</b>
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 行为的情况下,它应该可以完美地工作。

关于php - 外部 PHP 文件中的 Wordpress get_option,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34293363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com