Überprüfen Sie, ob ein Benutzer/Gast bestimmte Produkte in WooCommerce gekauft hat

Lesezeit: 12 Minuten

Benutzer-Avatar
alegjos

Ich muss überprüfen, ob ein Kunde ein bestimmtes Produkt früher in WooCommerce gekauft hat.

Der Fall ist folgender: Der Kunde kann das Produkt „c“, „d“, „e“ nicht erwerben, es sei denn, er hat zu einem früheren Zeitpunkt das Produkt „a“ oder „b“ erworben.

Wenn der Kunde zuvor Produkt „a“ oder „b“ gekauft hat, wird die Kaufschaltfläche von Produkt „c“, „d“ und „e“ aktiviert und er darf sie kaufen.

Wenn sie “a” oder “b” nicht früher gekauft haben, können sie “c”, “d”, “e” nicht kaufen und die Schaltfläche “Kaufen” wird deaktiviert.

Wie kann ich das erreichen?

Danke.

  • Ich habe mir die wc_customer_bought_product_function angesehen, ich habe auch einen ähnlichen Beitrag unter stackoverflow.com/questions/27306828/… gefunden, bin mir aber nicht ganz sicher, wie ich es weiterführen würde, damit mein Beispiel funktioniert.

    – alegjos

    4. August 2016 um 14:41 Uhr

  • Danke @LoicTheAztec, ich werde es später heute testen und Ihnen Feedback geben.

    – alegjos

    5. August 2016 um 4:48 Uhr

  • Ich habe eine neue Antwort mit einer viel leichteren und schnelleren Funktion, die dasselbe tun wird … Wenn Sie es testen und mir ein Feedback geben könnten. Danke.

    – LoicTheAztec

    14. September 2017 um 12:56 Uhr

Benutzer-Avatar
LoicTheAztec

Leichtere und verbesserte Codeversion in HERE, die mehrere Produkt-IDs verarbeitet

Aktualisiert (Kompatibilität für Woocommerce 3+)

Ja, es ist möglich, eine bedingte Funktion zu schreiben, die “true” zurückgibt, wenn der aktuelle Kunde bereits spezifische definierte Produkt-IDs gekauft hat. Dieser Code wird in die function.php-Datei Ihres aktiven untergeordneten Designs oder Designs eingefügt.

Hier ist die Bedingungsfunktion:

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;
}

Dieser Code ist getestet und funktioniert.


VERWENDUNGSZWECK:

Zum Beispiel können Sie es in einigen verwenden WooCommerce-Vorlagen die Sie zuvor in Ihr aktives untergeordnetes Thema oder Thema kopiert haben:

Hier ist ein Beispiel, das Sie in diesen Vorlagen verwenden könnten (Oben):

// 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
}

Und hier das komplette Anwendungsbeispiel zu add-to-cart Schaltflächenvorlage ein Shop-Seite:

<?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="https://stackoverflow.com/questions/38769888/%s" data-quantity="https://stackoverflow.com/questions/38769888/%s" data-product_id="https://stackoverflow.com/questions/38769888/%s" data-product_sku="https://stackoverflow.com/questions/38769888/%s" class="https://stackoverflow.com/questions/38769888/%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 );

}

Sie gestalten die inaktive Schaltfläche mit greyed_button Klasse in der style.css Datei deines aktiven Child-Themes oder Themes. Dasselbe gilt für die Nachricht mit greyed_button-message Klasse.

  • Danke @LoicTheAztec, es funktioniert wie erwartet! Ich weiß Ihre Hilfe wirklich zu schätzen, nochmals vielen Dank.

    – alegjos

    5. August 2016 um 15:18 Uhr


  • @loictheaztec weißt du, wie man überprüft, wie oft ein Produkt von einem Kunden gekauft wurde?

    – Feuernebel

    27. Oktober 2016 um 12:32 Uhr


Benutzer-Avatar
LoicTheAztec

Aktualisierung 2020: Behandelt jetzt Gastbenutzer von ihrer Rechnungs-E-Mail.

Neue Version kompakt, leichter, schneller und mit allen WooCommerce-Versionen kompatibel (ab Version 2.4 und höher)

Dies ist eine neue verbesserte und leichtere bedingte Funktion, die teilweise auf der integrierten Woocommerce-Funktion basiert wc_customer_bought_product Quellcode.

Es gibt 2 optionale Argumente:

  • $user_var ermöglicht Ihnen:
  • Geben Sie eine definierte Benutzer-ID an (wenn nicht für aktuell angemeldeten Benutzer verwendet)
  • oder die Rechnungs-E-Mail für Gastbenutzer;
  • $product_ids (Reihe) ermöglicht es, eine oder mehrere zu prüfende Produkt-IDs anzugeben

Hier ist dieser Code:

function has_bought_items( $user_var = 0,  $product_ids = 0 ) {
    global $wpdb;
    
    // Based on user ID (registered users)
    if ( is_numeric( $user_var) ) { 
        $meta_key     = '_customer_user';
        $meta_value   = $user_var == 0 ? (int) get_current_user_id() : (int) $user_var;
    } 
    // Based on billing email (Guest users)
    else { 
        $meta_key     = '_billing_email';
        $meta_value   = sanitize_email( $user_var );
    }
    
    $paid_statuses    = array_map( 'esc_sql', wc_get_is_paid_statuses() );
    $product_ids      = is_array( $product_ids ) ? implode(',', $product_ids) : $product_ids;

    $line_meta_value  = $product_ids !=  ( 0 || '' ) ? 'AND woim.meta_value IN ('.$product_ids.')' : 'AND woim.meta_value != 0';

    // Count the number of products
    $count = $wpdb->get_var( "
        SELECT COUNT(p.ID) 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-", $paid_statuses ) . "' )
        AND pm.meta_key = '$meta_key'
        AND pm.meta_value="$meta_value"
        AND woim.meta_key IN ( '_product_id', '_variation_id' ) $line_meta_value 
    " );

    // Return true if count is higher than 0 (or false)
    return $count > 0 ? true : false;
}

Code geht in die functions.php-Datei Ihres aktiven Child-Themes (oder Themes) oder auch in jede Plugin-Datei.

Dieser Code wurde auf WooCommerce 3+ getestet und funktioniert (er sollte auch auf früheren Versionen funktionieren).


ANWENDUNGSBEISPIELE:

Beispiel 1 (eingeloggter Kunde): Erkennen, ob der aktuelle Benutzer eines der definierten Produkte gekauft hat (Produkt-IDs müssen ein Array sein)

// Define the targeted Products IDs
$product_ids = array( 38, 41, 85, 95 );

if( has_bought_items( '', $product_ids ) )
    echo "<p>You have already purchased one of this products</p>";
else
    echo "<p>You have not yet purchased one of this products</p>";

Beispiel 2 (für eine definierte Benutzer-ID) Erkennen, ob der definierte Benutzer eines der definierten Produkte gekauft hat (Produkt-IDs müssen in einem Array festgelegt werden)

// Define the user ID
$user_id = 85;

// Define the targeted Products IDs
$product_ids = array( 38, 41, 85, 95 );

if( has_bought_items( $user_id, $product_ids ) )
    echo "<p>This user have already purchased one of this products</p>";
else
    echo "<p>This user have not yet purchased one of this products</p>";

Wenn die $user_id nicht definiert ist und der aktuelle Benutzer nicht angemeldet ist, wird diese Funktion zurückgegeben false.

Beispiel 3 (zum Gast Benutzer) Erkennen ob Gastbenutzer eines der definierten Produkte von ihm gekauft hat Abrechnung per E-Mail (Produkt-IDs müssen in einem Array festgelegt werden)

// Define guest Billing email (string)
$user_email="louis.fourteen@gmail.com";

// Define the targeted Products IDs
$product_ids = array( 38, 41, 85, 95 );

if( has_bought_items( $user_email, $product_ids ) )
    echo "<p>This user have already purchased one of this products</p>";
else
    echo "<p>This user have not yet purchased one of this products</p>";

Wenn die $user_id nicht definiert ist und der aktuelle Benutzer nicht angemeldet ist, wird diese Funktion zurückgegeben false.

Beispiel 4 (eingeloggter Kunde): Erkennen, ob aktueller Benutzer hat bereits eingekauft

if( has_bought_items() )
    echo '<p>You have already made a purchase</p>';
else
    echo '<p>Welcome, for your first purchase you will get a discount of 10%</p>';

Beispiel 5 (Definition der Benutzer-ID) – Erkennen, ob der definierte Benutzer bereits einen Kauf getätigt hat

// Define the user ID
$user_id = 85;

if( has_bought_items( $user_id ) )
        echo '<p>customer have already made a purchase</p>';
    else
        echo '<p>Customer with 0 purshases</p>';

Nun, wenn die Benutzer-ID gleich 0 und der aktuelle Benutzer ist ist nicht eingeloggtwird diese Funktion zurückgegeben false (wenn keine Rechnungs-E-Mail für Gastbenutzer definiert ist).

  • Loic Ich benutze dieses Snippet schon eine Weile, aber es scheint in der neuesten Version von WooCommerce kaputt gegangen zu sein. Es scheint immer ein falsches Ergebnis zu ergeben, wissen Sie zufällig, was das Problem wäre?

    – Bowe Frankema

    18. Juli 2019 um 12:26 Uhr

  • @BoweFrankema Neue aktualisierte Version, die Gastkunden behandelt und in der letzten Version von WC 4.1+ funktioniert.

    – LoicTheAztec

    5. Juni 2020 um 14:39 Uhr

  • für diejenigen, die diese Methode derzeit verwenden, für angemeldete Benutzer verwenden Sie bitte has_bought_items(0, [1, 12, 3] ); Anstatt eine leere Zeichenfolge bereitzustellen, die die Überprüfung von is_numeric () nicht bestanden hat.

    – Stanley Alo

    28. August 2021 um 6:42 Uhr


Die eingebaute Woocommerce-Funktion wc_customer_bought_product kann auch in diesem Fall verwendet werden.

Siehe Funktionsverwendung Hier.

Benutzer-Avatar
Silber-

Ich würde es so machen;

Dies wird keine WooCommerce-Vorlagenänderung vornehmen, sondern nur den Filter verwenden woocommerce_is_purchasable

Das sind alle Funktionen,

  1. Prüfen Sie, ob die aktuelle Produkt-ID bereits vom Kunden mitgebracht wurde. In Version 2.6 + hat WooCommerce die Funktion implementiert wc_customer_bought_product Um zu überprüfen, ob der Kunde das Produkt bereits mitgebracht hat, habe ich es noch nie zuvor verwendet, aber basierend auf den Dokumenten können Sie eine Funktion wie unten erstellen, um ein Array von Produkt-IDs zu überprüfen, wenn eine davon bereits mitgebracht wurde;

    function cmk_check_product_brought( $ids=array() ) {
        if ( ! $ids ) return false;
        foreach ( $ids as $product => $id ) {
            if ( wc_customer_bought_product( wp_get_current_user()->user_email, get_current_user_id(), $id ) ) {
                return true;
            }
        }
    }
    

Die vorherige Methode, mit der ich prüfe, ob der Kunde bereits eine bestimmte Produkt-ID mitgebracht hat, ist unten aufgeführt, sodass Sie jede dieser Funktionen verwenden können, obwohl die von mir erstellte nicht für Arrays von IDs vorgesehen ist

function cmk_product_ordered( $id ) {
    // Get All order of current user
    $orders = get_posts( array(
        'numberposts' => -1,
        'meta_key'    => '_customer_user',
        'meta_value'  => get_current_user_id(),
        'post_type'   => wc_get_order_types( 'view-orders' ),
        'post_status' => array_keys( wc_get_order_statuses() )
    ) );

    if ( !$orders ) return false; // return if no order found

    $all_ordered_product = array(); // store all products ordered by ID in an array

    foreach ( $orders as $order => $data ) { // Loop through each order
        $order_data = new WC_Order( $data->ID ); // create new object for each order
        foreach ( $order_data->get_items() as $key => $item ) {  // loop through each order item
            // store in array with product ID as key and order date a value
            $all_ordered_product[ $item['product_id'] ] = $data->post_date; 
        }
    }
    // check if defined ID is found in array
    if ( isset( $all_ordered_product[ $id ] ) ) return true;
    else return false;
}
  1. Jetzt, wo wir überprüfen können, ob die Produkt-ID bereits gebracht wurde oder nicht, können wir einfach einen Filter hinzufügen woocommerce_is_purchasable Um unsere eigene Bedingung zu erstellen, ist diese Funktion unten ein einfaches Beispiel dafür, was Sie erreichen möchten.

habe gerade die geändert $required_purchased und $conditional_purchase Werte.

function cmk_disable_product_purchase( $purchasable, $product ) {

    // array of products required to be purchase first
    $required_purchased = array( 1, 2);

    // array of restricted/conditional products to be purchase
    $conditional_purchase = array( 3,4,5);

    // Get the ID for the current product
    $product_id = $product->is_type( 'variation' ) ? $product->variation_id : $product->id;

    //return default $purchasable if current product ID is not in restricted array
    if ( !in_array($product_id, $conditional_purchase)) return $purchasable;

    /**
     ** Check if one required products has been purchase;
     **/

    // using cmk_check_product_brought() function, return false if product is not purchase
    if ( ! cmk_check_product_brought( $required_purchased ) ) $purchasable = false;

    // using cmk_product_ordered() function, you can use this instead
    /*if ( cmk_product_ordered( 1 )  || cmk_product_ordered( 2 ) ) {
        $purchasable = $purchasable; //return default if one product is purchased
    } else {
        $purchasable = false;
    }*/

    // Double-check for variations: if parent is not purchasable, then variation is not
    if ( $purchasable && $product->is_type( 'variation' ) ) {
        $purchasable = $product->parent->is_purchasable();
    }

    return $purchasable;
}
add_filter( 'woocommerce_variation_is_purchasable', 'cmk_disable_product_purchase', 10, 2 );
add_filter( 'woocommerce_is_purchasable', 'cmk_disable_product_purchase', 10, 2 );

Und das sollte das Produkt als nicht käuflich festlegen (die Schaltfläche „In den Warenkorb“ wird automatisch ausgeblendet). Wenn Sie jetzt eine Nachricht für ein nicht käufliches Produkt hinzufügen möchten, können Sie einfach die gleiche Bedingung von verwenden cmk_disable_product_purchasefügen Sie Ihre Nachricht hinzu und schließen Sie sie einfach an woocommerce_single_product_summary oder wo immer Sie es anzeigen möchten.

1005550cookie-checkÜberprüfen Sie, ob ein Benutzer/Gast bestimmte Produkte in WooCommerce gekauft hat

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy