当前位置: 首页 > 面试题库 >

检查客户是否在WooCommerce中购买了特定产品

龚浩宕
2023-03-14
问题内容

我需要检查客户是否在WooCommerce之前购买了特定产品。

情况是这样的:除非他们较早购买了产品“ a”或“ b”,否则客户将不能购买产品“ c”,“ d”,“ e”。

如果客户较早购买了产品“ a”或“ b”,则激活产品“ c”,“ d”和“ e”的购买按钮,并允许他们购买产品。

如果他们之前没有购买过“ a”或“ b”,则将不允许他们购买“ c”,“ d”,“ e”,并且禁用了购买按钮。

我该如何实现?

谢谢。


问题答案:

已更新 (适用于Woocommerce 3+)

是的,如果当前客户已经购买了特定定义的产品ID,则可以编写一个条件函数返回“ true”。
此代码位于您的活动子主题或主题的function.php文件中

这是条件函数:

function has_bought_items() {
    $bought = false;

    // Set HERE ine the array your specific target product IDs
    $prod_arr = array( '21', '67' );

    // 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"
    ) );
    foreach ( $customer_orders as $customer_order ) {
        // Updated compatibility with WooCommerce 3+
        $order_id = method_exists( $order, 'get_id' ) ? $order->get_id() : $order->id;
        $order = wc_get_order( $customer_order );

        // Iterating through each current customer products bought in the order
        foreach ($order->get_items() as $item) {
            // WC 3+ compatibility
            if ( version_compare( WC_VERSION, '3.0', '<' ) ) 
                $product_id = $item['product_id'];
            else
                $product_id = $item->get_product_id();

            // Your condition related to your 2 specific products Ids
            if ( in_array( $product_id, $prod_arr ) ) 
                $bought = true;
        }
    }
    // return "true" if one the specifics products have been bought before by customer
    return $bought;
}

此代码已经过测试并且可以工作。

用法:
例如,您可以在一些 WooCommerce模板 中使用它,这些 模板 先前已复制到您的活动子主题或主题:

  • 商店”页面上add-to-cart 按钮有关的模板是loop/add-to-cart.php
  • 有关按钮的“ 产品”页面 的模板 add-to-cart 位于single-product/add-to-cart文件夹中,具体取决于您的产品类型。

这是您可以在 上面的 模板中使用的示例:

// Replace the numbers by your special restricted products IDs
$restricted_products = array( '20', '32', '75' );

// compatibility with WC +3
$product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;

// customer has NOT already bought a specific product for this restricted products
if ( !has_bought_items() && in_array( $product_id, $restricted_products ) ) {

    // Displaying an INACTIVE add-to-cart button (With a custom text, style and without the link).
    // (AND optionally) an explicit message for example.

// ALL OTHER PRODUCTS OR RESTRICTED PRODUCTS IF COSTUMER HAS ALREADY BOUGHT SPECIAL PRODUCTS
} else {

    // place for normal Add-To-Cart button code here
}

这里 完整的应用实例 ,以 add-to-cart 按钮模板 店铺页

<?php
/**
 * Loop Add to Cart
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/loop/add-to-cart.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template files and you
 * (the theme developer) will need to copy the new files to your theme to
 * maintain compatibility. We try to do this as little as possible, but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see         https://docs.woocommerce.com/document/template-structure/
 * @author      WooThemes
 * @package     WooCommerce/Templates
 * @version     2.5.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

global $product;

// Replace the numbers by your special restricted products IDs
$restricted_products = array( '37', '53', '70' );

// compatibility with WC +3
$product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;

if ( !has_bought_items() && in_array( $product_id, $restricted_products ) ) {

    echo '<a class="button greyed_button">' . __("Disabled", "your_theme_slug") . '</a>';
    echo '<br><span class="greyed_button-message">' . __("Your message goes here…", "your_theme_slug") . '</span>';

} else {

echo apply_filters( 'woocommerce_loop_add_to_cart_link',
    sprintf( '<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>',
        esc_url( $product->add_to_cart_url() ),
        esc_attr( isset( $quantity ) ? $quantity : 1 ),
        esc_attr( $product_id ),
        esc_attr( $product->get_sku() ),
        esc_attr( isset( $class ) ? $class : 'button' ),
        esc_html( $product->add_to_cart_text() )
    ),
$product );

}

您将 greyed_buttonstyle.css 活动子主题或主题的文件中使用class 设置非活动按钮的样式。与
greyed_button-message 类消息相同。



 类似资料:
  • 问题内容: 我想创建一个WooCommerce插件,为有购买历史记录的客户添加一些优惠。 如何检查用户之前购买过的东西? 谢谢。 问题答案: 是的,可以 创建一个 条件函数,当 客户已经完成至少一个订单 且状态 已完成 时 返回 该 条件函数 。 这是此条件函数的代码: 此代码已经过测试并且可以工作。 这段代码在您的活动子主题或主题的function.php文件中,或在插件php文件中。 用法 (

  • 在开发一个将自定义产品添加到购物车的WooCommerce插件时,我正在使用函数内部的。但更新伍科姆尔斯到最新版本后,我收到了错误。 对不起,此产品无法购买。 因为在函数中,

  • 问题内容: 在woocommerce中,当客户已经购买了当前产品时,我使用wc_customer_bought_product()函数在单个产品页面中显示自定义文本消息。但我想检查购买的产品是否处于“已完成”状态的订单上。 除非满足以下条件,否则不应显示该消息: 1)用户已登录2)用户已经购买了产品3)当前产品的至少一个下订单已设置为完成(我不知道该如何完成)。 这是我的代码: 我尝试添加,但是没

  • 问题内容: 我很难提出一个查询,该查询将找到同时购买了PROD1和PROD2的所有客户。 这是一个伪查询,看起来像我想要做的:(显然这是行不通的) 因此,基本上,我正在尝试对表中有product_id’ ‘和’ ‘事务的不同用户ID的数量进行计数。每个事务都存储在表中的一行中。 问题答案: 我通过以下方式进行这种类型的查询: @najmeddine显示的解决方案还会产生您想要的答案,但在MySQL

  • 我需要一个代码来检查woocommerce产品类型是否不是“变量” 为了检查某物是否是可变产品,我通常使用这个: 但我需要检查它是否不是一个变量产品,所以我认为我应该这样做,但这会导致PHP错误。。。 编辑:我得到以下错误:"致命错误:未捕获错误:调用成员函数is_type()在空" 我以为我的代码有问题。但后来我在其他模板文件中测试了它,它成功了。我想在functions.php中使用我的php

  • 问题内容: 我正在尝试检查给定目录中的特定文件。我不需要代码,但我想修复已有的代码。这个问题的唯一区别是,我正在寻找带有扩展名的文件。 我已经准备好代码:- 但是由于某些原因,它不起作用。我不明白为什么,有人可以在这里找到任何错误吗? 问题答案: 您希望temp.MOD文件位于当前目录(运行应用程序的目录)中,还是希望它位于“目录”文件夹中?在后一种情况下,尝试以这种方式创建文件: 还要检查文件权