Wordpress get_option in External PHP file

后端 未结 1 1074
小鲜肉
小鲜肉 2021-01-13 11:16

I have created a plugin that adds products programatically to WooCommerce. The plugin is working great, but now I need to make a cron job that runs every 5 minutes to updat

相关标签:
1条回答
  • 2021-01-13 11:44

    The quick and easy way

    The problem is probably that you try to include wp-load.php from a wrong path. In a CLI environment, the path would not be the same as when you do an HTTP request to the file. So with this you should fixed your issue:

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

    The proper but longer way

    Based on cale_b comments and this article he linked, there is a much proper way to go by doing a Wordpress Cron job.

    First in your plugin add a function that will contain the code needed to be executed, let's call it my_cron_job(). You can eventually just include the script you already wrote in this function. Then add the following to schedule the execution of this every 5min:

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

    Then set up your cron to execute wp-cron.php every 5 minutes:

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

    Update

    First when choosing the option of executing wp-cron.php with a server cron you should disable the default WP Cron behaviour (execution of cron through web visits):

    define('DISABLE_WP_CRON', true);
    

    Secondly, as for your question about WP Cron reliability I see a potential flaw indeed. I'm not 100% sure of that, but I think it is possible that wp_schedule_event get desynchronized with the server cron, as the job get executed only if the interval is past. As it will be re-scheduled depending of the execution time of the script which is slightly different with the server cron time.

    For example:

    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

    That's theory of course, maybe this is not accurate. I suggest doing some test and see how it behave. If it indeed behave like I think it did, I suggest as easy workaround to change the wp_schedule_event to a lower interval - 4min for example.

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

    So we'll have the following:

    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)

    With the default WP Cron behaviour disabled it should work flawlessly.

    0 讨论(0)
提交回复
热议问题