WordPress get_option во внешнем файле PHP

Я создал плагин, который программно добавляет продукты в WooCommerce. Плагин отлично работает, но теперь мне нужно сделать задание cron, которое каждые 5 минут запускается для обновления инвентаря.

У меня есть сценарий, все написаны, но мне нужно включить вызовы get_option () в этот php-файл, чтобы получить определенные значения плагина, которые пользователь ввел. Однако я не могу просто включить 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-скрипта, к которому можно получить доступ через задание PHP cron.

Большое спасибо.

Related of "WordPress get_option во внешнем файле PHP"

Быстрый и легкий способ

Вероятно, проблема заключается в том, что вы пытаетесь включить 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 для выполнения wp-cron.php каждые 5 минут:

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

Обновить

Сначала, выбирая вариант выполнения wp-cron.php с сервером cron, вы должны отключить поведение WP Cron по умолчанию (выполнение 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 на более низкий интервал – например, 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 отключено, оно должно работать безупречно.