与WPDP相关的函数看起来可以工作,但实际上并非如此

时间:2015-09-10 作者:Jim

我有一个自定义数据库表,名为wp_wcpl_user_packages 其中包含以下列:

id | user_id | product_id | ..irrelevant columns... | package_limit | package_timestamp | package_dduration
示例行为:

1 | 1 | 44 | .... | 3 | 2015-09-08 22:18:44 | 90
我需要的是每小时运行一次cron作业,并设置package_limit-1 如果NOW 以及package_timestamp 是>=的package_dduration.

因此,我有以下两个功能:

function get_wp_cron_get_expired_packages() {
    global $wpdb;
    $packages = $wpdb->get_results("SELECT * FROM  {$wpdb->prefix}wcpl_user_packages");
    $expired = array();

    foreach ($packages as $key => $package) {
        $retArray = $wpdb->get_row("SELECT * FROM  {$wpdb->prefix}wcpl_user_packages
                WHERE DATEDIFF(NOW(), \'package_timestamp\') >= \'package_dduration\'
                  AND id = {$package->id}
                  AND \'package_limit\' <> \'-1\'");
        if($retArray != null) {
            array_push($expired, $retArray);
        }
    }

    return $expired;
}
以及

function wp_cron_jobs_docleanup() {
    global $wpdb;
    wp_cron_jobs_logMessages(\'wp cron job started at \'. current_time(\'timestamp\'));
    $packages = get_wp_cron_get_expired_packages();
    wp_cron_jobs_logMessages(\'Found \'.count($packages).\' to expire.\');

    if(!empty($packages)) {
        foreach ($packages as $key => $package) {
            $wpdb->update("{$wpdb->prefix}wcpl_user_packages",
                    array(
                        \'package_limit\' => \'-1\',
                    ),
                    array(
                        \'user_id\' => $package->user_id,
                        \'id\'      => $package->id,
                    ),
                    array( \'%d\' ),
                    array( \'%d\', \'%d\' )
            );
            wp_cron_jobs_logMessages($package);
        }
        return true;
    } else {
        wp_cron_jobs_logMessages(\'No Packages found to mark as expired, Exiting!\');
    }   
}
日志总是说它没有找到任何要过期的包。因此,cron运行良好,但上述函数之一可能有问题。

我认为它肯定是在检查是否有任何包必须过期的函数中。我尝试了各种不同的方法来写WHERE部分,但从来没有得到任何运气。

求你了,如果有人有哪怕是最细微的暗示,这对我都会非常有帮助。此外,如果您认为这是一个PHP问题,那么不要关闭它,只需给我一个提示或其他东西。

1 个回复
最合适的回答,由SO网友:totels 整理而成

在此处正式确定评论答案:

根据您提供的代码,问题可能是您在SQL中使用的是文字字符串,而不是插值。回击之间有很大的区别` 和单引号\'.

尝试以下操作:

$retArray = $wpdb->get_row("SELECT * FROM  {$wpdb->prefix}wcpl_user_packages
    WHERE DATEDIFF(NOW(), package_timestamp) >= package_dduration
      AND id = {$package->id}
      AND package_limit <> -1");
或者这个

$retArray = $wpdb->get_row("SELECT * FROM  {$wpdb->prefix}wcpl_user_packages
    WHERE DATEDIFF(NOW(), `package_timestamp`) >= `package_dduration`
      AND `id` = {$package->id}
      AND `package_limit` <> -1");