检查客户是否已经在WooCommerce中购买了东西

Mos*_*ani 4 php wordpress product orders woocommerce

我想创建一个WooCommerce插件,为客户添加一些优惠(有购买历史记录).

我怎样才能检查用户之前买过的东西?

谢谢.

Loi*_*tec 9

更新:此处新增了更新,更轻,更快的版本


是的,可以创建一个条件函数,true客户已经完成至少一个已完成状态的订单返回条件函数.

以下是此条件函数的代码:

function has_bought() {
    // Get all customer orders
    $customer_orders = get_posts( array(
        'numberposts' => -1,
        'meta_key'    => '_customer_user',
        'meta_value'  => get_current_user_id(),
        'post_type'   => 'shop_order', // WC orders post type
        'post_status' => 'wc-completed' // Only orders with status "completed"
    ) );

    // return "true" when customer has already at least one order (false if not)
   return count($customer_orders) > 0 ? true : false; 
}
Run Code Online (Sandbox Code Playgroud)

此代码经过测试和运行.

此代码位于活动子主题或主题的function.php文件中,或者插入到php文件中.


用法(作为条件):

  • 您可以在以前复制到活动子主题或主题的某些WooCommerce模板使用它.
  • 在你的主题php文件中.
  • 在插件php文件中.
  • 任何PHP功能或WordPress/WooCommerce.

参考


Loi*_*tec 6

这是一个轻巧,快捷的条件函数,如果客户已经进行了购买,则该函数将返回true。

有一个可选参数$user_id,它将允许您指定已定义的用户ID:

function has_bought( $user_id = 0 ) {
    global $wpdb;
    $customer_id = $user_id == 0 ? get_current_user_id() : $user_id;
    $paid_order_statuses = array_map( 'esc_sql', wc_get_is_paid_statuses() );

    $results = $wpdb->get_col( "
        SELECT p.ID FROM {$wpdb->prefix}posts AS p
        INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
        WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $paid_order_statuses ) . "' )
        AND p.post_type LIKE 'shop_order'
        AND pm.meta_key = '_customer_user'
        AND pm.meta_value = $customer_id
    " );

    // Count number of orders and return a boolean value depending if higher than 0
    return count( $results ) > 0 ? true : false;
}
Run Code Online (Sandbox Code Playgroud)

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

该代码已在Woocommerce 3+上进行了测试,并且可以正常工作(它也应在以前的版本中工作)。

对于多种产品: 检查客户是否在WooCommerce中购买了特定产品


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

if( has_bought() )
    echo '<p>You have already maid a purchase</p>';
else
    echo '<p>Welcome, for your first purchase you will get a discount of 10%</p>';
Run Code Online (Sandbox Code Playgroud)

使用示例2 (设置$ user_id)

// Define the user ID
$user_id = 85;

if( has_bought( $user_id ) )
        echo '<p>customer have already maid a purchase</p>';
    else
        echo '<p>Customer with 0 purchases</p>';
Run Code Online (Sandbox Code Playgroud)

如果$user_id未定义,并且当前用户未登录,则此函数将返回false

该函数的代码部分基于内置的WooCommerce函数wc_customer_bought_product源代码。