【问题标题】:WooCommerce - Check if user purchased a product in the past 60 daysWooCommerce - 检查用户是否在过去 60 天内购买了产品
【发布时间】:2018-03-26 17:48:16
【问题描述】:

我是 WooCommerce 的新手,想检查用户在过去 60 天内是否购买了特定产品(产品 ID #514)。这是我让人们每月购买的产品,所以它会经常出现。我想看看他们是否购买了最近的(我认为是活跃的)

我现在的想法是:

  1. 获取用户的所有订单
  2. 对于每个订单,检查它是否在过去 60 天内发生 并获取此订单的所有产品
  3. 对于每个产品,查看id是否为x

虽然我确信这会起作用,但我有一种有趣的感觉,有一个非常简洁的 get_posts(apply_filters() 查询可以节省我一些循环时间。

有人愿意分享一些想法或解决方案吗?

谢谢!

【问题讨论】:

    标签: php sql wordpress woocommerce orders


    【解决方案1】:

    这里是部分基于内置woocommerce函数wc_customer_bought_product源码查询的条件函数:

    有 3 个可选参数 $user_id$product_ids$days

    • $user_id 将允许您指定定义的用户 ID(当不用于当前登录用户时);
    • $product_ids(字符串或数组)将允许指定要检查的已定义产品 ID
    • $days将允许您指定搜索的天数(或您喜欢的时间段)...

    代码功能:

    function has_bought_multi( $user_id = 0,  $product_ids = 0, $days = 0 ) {
        global $wpdb;
        $customer_id = $user_id == 0 || $user_id == '' ? get_current_user_id() : $user_id;
        $statuses      = array_map( 'esc_sql', wc_get_is_paid_statuses() );
        $date = date('Y-m-d H:i:s', strtotime("-$days day") );
    
        if ( is_array( $product_ids ) )
            $product_ids = implode(',', $product_ids);
    
        if ( $product_ids !=  ( 0 || '' ) )
            $query_line = "AND woim.meta_value IN ($product_ids)";
        else
            $query_line = "AND woim.meta_value != 0";
    
        // Count the number of products
        $product_count_query = $wpdb->get_col( "
            SELECT COUNT(woim.meta_value) FROM {$wpdb->prefix}posts AS p
            INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
            INNER JOIN {$wpdb->prefix}woocommerce_order_items AS woi ON p.ID = woi.order_id
            INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
            WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
            AND p.post_date > '$date'
            AND pm.meta_key = '_customer_user'
            AND pm.meta_value = $customer_id
            AND woim.meta_key IN ( '_product_id', '_variation_id' )
            $query_line
        " );
        // Set the count in a string
        $count = reset($product_count_query);
    
        // Return a boolean value if count is higher than 0
        return $count > 0 ? true : false;
    }
    

    代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

    此代码在 Woocommerce 3+ 上经过测试并且可以正常工作。

    类似答案:Check if a customer has purchased a specific products in WooCommerce


    使用示例(客户已登录):

    检测当前用户在过去 60 天内是否购买了您的产品 id #514:

    if( has_bought_multi( '', 514, 60 ) ){
        echo "<p>Customer has bought product id # 514 in past 60 days</p>";
        // do something
    } else {
        echo "<p>Customer <strong>HAS NOT</strong> bought product id # 514 in past 60 days</p>";
        // do something else
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 2015-04-13
      • 2021-01-27
      • 2016-09-19
      相关资源
      最近更新 更多