如何使用cron作业执行unctions.php中的函数?

时间:2018-08-03 作者:Ragnaboy

我的函数中有一个函数。php文件,该文件用于在过期后更新我的帖子状态。我在测试中调用此函数。php文件,它也是一个带有url/测试搜索结果/的模板页面。如果我通过浏览器访问此url,该函数将启动并执行它应该执行的操作。

我想创建一个服务器端cronjob来实现这一点,但我似乎无法正确实现这一点。我已经联系了我的主机,他们确认路径正确,cron正在执行si。问题一定是我的脚本。

请有人告诉我,为了让cronjob执行脚本,我必须对脚本进行哪些更改。

函数在我的函数中。php文件:

    function expire_posts () {
    $args = array (
                \'post_type\' => \'post\',
                \'meta_key\' => \'Expiry Date\',
                \'meta_value\' => date(\'Y-m-d\'),
                \'meta_compare\' => \'<\',
                );
    $query = new WP_Query($args);

    if( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); 

        $post_id = get_the_ID();
        $post_data = array(
                    \'ID\' => $post_id,
                    \'post_type\' => \'post\',
                    \'post_status\' => \'expired\',
                    \'post_modified\' => current_time ( \'mysql\' ),
                    );
        wp_update_post($post_data);

    endwhile; 
        wp_reset_postdata();
    endif;
  }
我在测试中调用该函数。php文件如下:

expire_posts();
我的cronjob遵循的路径是:

/home/userID/public_html/wp-content/themes/twentyseventeen-child/test.php
我希望有人能解释为什么我的脚本没有通过cronjob执行。

2 个回复
SO网友:TheDeadMedic

当您使用*nix cron运行这样的PHP文件时,不会加载WordPress。您可以手动加载,但更好的方法是使用WordPress自己的cron API.

在您的functions.php:

if ( ! wp_next_scheduled( \'expire_posts\' ) ) {
    wp_schedule_event( time(), \'hourly\', \'expire_posts\' );
}
我用过hourly, 其他可用默认值包括daily &;twicedaily (more on scheduling).

现在让我们把你的expire_posts 功能到我们新创建的expire_posts 事件:

add_action( \'expire_posts\', \'expire_posts\' );
塔达!

注意:WordPress cron依赖于一个请求(即用户或访问站点的机器人),其频率至少与您的日程安排相同,以确保运行顺利。如果您的站点处于安静状态,我们可以使用*nix cron每隔15分钟触发WordPress cron API,并让WordPress处理自己的内部事件。

首先,在中禁用默认的基于请求的cron行为wp-config.php:

define( \'DISABLE_WP_CRON\', true );
现在设置*nix cron以触发WordPress的cron:

/15 * * * wget -q -O - http://yourdomain.com/wp-cron.php?doing_wp_cron

SO网友:Kaperto

使用WP cron,您可以每天、每天两次或每小时启动一个操作:
https://codex.wordpress.org/Function_Reference/wp_schedule_event

如果需要另一个句点,可以使用过滤器定义它cron_schedules 就像这样:

// execute the function "expire_posts" when the action "MyPlugin__cron_clean_post" is launched
add_action("MyPlugin__cron_clean_post", "expire_posts");

add_action("wp_loaded", function () {

    // launch the action "MyPlugin__cron_clean_post" every 15 minutes
    if (!wp_next_scheduled("MyPlugin__cron_clean_post")) {
        wp_schedule_event(1, "15_minutes", "MyPlugin__cron_clean_post");
    }

});


add_filter("cron_schedules", function ($cron_schedules) {

    $cron_schedules["15_minutes"] = [
        "display" => "15 minutes",
        "interval" => 15 * MINUTE_IN_SECONDS,
    ];

    return $cron_schedules;

});

结束