首页 文章

无法在Cpanel上设置cron作业

提问于
浏览
0

尝试在Cpanel上添加一个cron作业,每5分钟运行一次 . 我将此添加到命令输入(从URL中删除了个人详细信息)

/usr/bin/php -q /home/my_name/public_html/staging/the_web_site/wp-content/themes/my_child_theme/functions.php updateproducts

然后在 functions.php ,我有这个:

if (!empty($argv[1])) {
    switch ($argv[1]) {
        case "updateproducts":
            update_products(); 
            break;
    }
}

如果我使用管理页面上的按钮触发它, update_products() 函数会手动运行而不会出现任何错误 . 但是,无论我在cronjob选项卡上做什么,它都不会运行 .

任何的想法?

function update_products() {
   global $wpdb;
   $groups = get_groups_from_cron_jobs(100);
   foreach ( $groups as $group ) {
       $name = $group->group_name;
       $sql = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}products WHERE name='%s'", $name);
       $products = $wpdb->get_results($sql);
       if ( !empty($products) ){
           $post_id = get_post_id_from_products($products);
           //if there isn't a parent_id then create a new product
           if ( !$post_id && $name != '' ) {
               $post_id = create_a_new_product($name);
           }
           // make sure that all products will have now a parent_id
           add_parent_id_on_products($name, $post_id);
           insert_product_attributes($post_id, $products);
           insert_product_variations($post_id, $products);
           delete_group_from_cron_jobs($name);
       }

   }
}

编辑:基于答案/评论,我做了额外的研究,发现我可以在任何脚本上加载$ wpdb . 我做的是这样的:

if (!empty($argv[1])) {
    switch ($argv[1]) {
        case "updateproducts":
            $path = $_SERVER['DOCUMENT_ROOT'];
            require( $path . '/staging/the_web_site/wp-load.php' );
            update_products(); 
            break;
    }
}

但是,我仍然收到电子邮件错误:

Status: 500 Internal Server Error
X-Powered-By: PHP/5.6.31
Content-type: text/html; charset=UTF-8

1 回答

  • 1

    我担心对于网络环境和控制台环境如何互操作存在一些误解 .

    简而言之,您的函数期望WordPress存在 . 它期望用户通过WordPress应用程序访问该函数,并且存在诸如 $wpdb 之类的全局变量(以及其他内容) . 如果您通过管理页面访问此功能,那么这一切都是正确的,并且该功能正常工作 .

    但是如果你通过控制台(命令行)访问这个功能,这都不是真的 . WordPress在该请求的上下文中不存在 . global $wpdb 不存在,因为该功能尚未通过WordPress访问,而是通过直接命令访问 .

    如果希望此函数在命令行上运行,则需要重写它以在该环境中工作 . 这意味着没有特定于WordPress的帮助器或功能 .

    或者,您可以使用 WordPress Crons ,它们不是真正的Cron作业,而是在访问站点时(在其定义的时间范围内)运行 . 因此,如果您的cron必须每五分钟运行一次,但每隔几分钟您就不会有可靠的新访问者,这些将不适合您的需求,但它们是一种选择 .

    http://www.wpbeginner.com/plugins/how-to-view-and-control-wordpress-cron-jobs/

相关问题