So zeigen Sie Kunden, die zuvor Produkte mit dem Bestellstatus „in Bearbeitung“ gekauft haben, eine benutzerdefinierte Nachricht während der WooCommerce-Kaufabwicklung an

Lesezeit: 6 Minuten

Benutzer-Avatar
jbxxnn

Ich möchte eine Nachricht auf der Checkout-Seite anzeigen, die die Kunden darüber informiert, dass sie dieses Produkt in der Vergangenheit gekauft haben (das Produkt, das sie kaufen werden), aber diese Nachricht sollte nur angezeigt werden, wenn diese Bedingungen erfüllt sind.

  1. Kunde muss eingeloggt sein
  2. Die Benutzerrolle ist Administrator oder Kunde
  3. Das zuvor gekaufte Produkt sollte immer noch den Bestellstatus „in Bearbeitung“ haben.

Bisher konnte ich die ersten 2 Bedingungen zum Laufen bringen:

function user_logged_in_product_already_bought() {

    global $woocommerce;

    if ( ! is_user_logged_in() ) return;
            

    $items = $woocommerce->cart->get_cart();

    $has_bought = false;

    foreach($items as $item => $values) { 
        if ( wc_customer_bought_product( '', get_current_user_id(), $values['data']->get_id() ) ) {
            $has_bought = true;
            break;
        }
    } 


    
    $user = wp_get_current_user();
$allowed_roles = array( 'administrator', 'customer' );
if ( array_intersect( $allowed_roles, $user->roles ) ) {
    
    if( $has_bought ){
        wc_print_notice( "You purchased this in the past. Buy again?", 'success' );
    }
}
        


}
add_action( 'woocommerce_before_checkout_form', 'user_logged_in_product_already_bought' );

Notiz: der Grund, warum ich die benutze foreach ist, dass Benutzer jeweils nur ein Produkt kaufen (kann nicht mehr als ein einzelnes Terminprodukt im Warenkorb haben)

Aber ich weiß nicht, wie ich mit der dritten Bedingung umgehen soll. Irgendein Rat?

Benutzer-Avatar
7uc1f3r

Ihre ersten 2 Schritte funktionieren tatsächlich, für den 3. Schritt müssen Sie eine benutzerdefinierte Funktion verwenden, die nur den Bestellstatus “Bearbeitung” prüft.

Der Vorteil dieser benutzerdefinierten Funktion ist, dass sie im Vergleich zum Durchsuchen aller vorhandenen Bestellungen viel schneller und leichter ist.

Sie erhalten also:

function has_bought_items( $user_id = 0, $product_ids = 0 ) {
    // When empty, return false
    if ( empty ( $product_ids ) ) return false;

    global $wpdb;
    
    $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-processing' )
        AND pm.meta_key = '_customer_user'
        AND pm.meta_value="$user_id"
        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;
}
 
function action_woocommerce_before_checkout_form() {
    // Customer must be logged in
    if ( ! is_user_logged_in() ) return;
    
    // Get current user
    $user = wp_get_current_user();
    
    // Allowed user roles
    $allowed_roles = array( 'administrator', 'customer' );
    
    // Compare
    if ( array_intersect( $allowed_roles, $user->roles ) ) {
        // WC Cart NOT null
        if ( ! is_null( WC()->cart ) ) {
            // Initialize
            $product_ids = array();
            
            // Loop through cart contents
            foreach ( WC()->cart->get_cart_contents() as $cart_item ) {
                // Get product ID and push to array
                $product_ids[] = $cart_item['variation_id'] > 0 ? $cart_item['variation_id'] : $cart_item['product_id'];
            }
            
            // Call function, and if true
            if ( has_bought_items( $user->ID, $product_ids ) ) {
                // Notice
                wc_print_notice( __( 'You purchased this in the past. Buy again?', 'woocommerce' ), 'success' );
            }
        }
    }
}
add_action( 'woocommerce_before_checkout_form', 'action_woocommerce_before_checkout_form' );

Ergebnis: eine allgemeine Nachricht

Geben Sie hier die Bildbeschreibung ein


Optional: Anstatt eine allgemeine Nachricht anzuzeigen, sondern diese pro Produkt separat anzuzeigendu kannst den … benutzen woocommerce_checkout_cart_item_quantity Haken

Sie würden also bekommen:

function has_bought_items( $user_id = 0, $product_ids = 0 ) {
    // When empty, return false
    if ( empty ( $product_ids ) ) return false;

    global $wpdb;
    
    $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-processing' )
        AND pm.meta_key = '_customer_user'
        AND pm.meta_value="$user_id"
        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;
}
 
function filter_woocommerce_checkout_cart_item_quantity( $item_qty, $cart_item, $cart_item_key ) {
    // Customer must be logged in
    if ( ! is_user_logged_in() ) return;
    
    // Get current user
    $user = wp_get_current_user();
    
    // Allowed user roles
    $allowed_roles = array( 'administrator', 'customer' );
    
    // Initialize
    $message="";
    
    // Compare
    if ( array_intersect( $allowed_roles, $user->roles ) ) {
        // Get product id
        $product_id = $cart_item['variation_id'] > 0 ? $cart_item['variation_id'] : $cart_item['product_id'];
        
        // Call function, and if true
        if ( has_bought_items( $user->ID, $product_id ) ) {
            $message="<p>" . __( 'You purchased this in the past. Buy again?', 'woocommerce' ) . '</p>';
        }
    }

    // Return
    return $item_qty . $message;
}
add_filter( 'woocommerce_checkout_cart_item_quantity', 'filter_woocommerce_checkout_cart_item_quantity', 10, 3 );

Ergebnis: getrennt nach Produkt anzeigen

Geben Sie hier die Bildbeschreibung ein


Notiz: das has_bought_items() Die Funktion basiert auf dem WooCommerce-Antwortcode Überprüfen, ob ein Benutzer bestimmte Produkte gekauft hat

Verwandt: Zeigen Sie die Nachricht unter dem Produktnamen auf der WooCommerce-Warenkorbseite an, wenn der Benutzer das Produkt zuvor gekauft hat

Benutzer-Avatar
behzad m salehi

demzufolge Artikel:

Sie können ein solches Login wie folgt implementieren:

$customer_orders = get_posts( array(
    'numberposts' => -1,
    'meta_key'    => '_customer_user',
    'meta_value'  =>  $user->ID,
    'post_type'   => wc_get_order_types(),
    'post_status' => array_keys( wc_get_is_paid_statuses() ),
) );

// LOOP THROUGH ORDERS AND GET PRODUCT IDS
if ( ! $customer_orders ) return;

$product_ids = array();
foreach($items as $item) { 
   foreach ( $customer_orders as $customer_order ) {
       $order = wc_get_order( $customer_order->ID );
       $orderItems = $order->get_items();
       foreach ( $orderItems as $orderItem ) {
          if ($orderItem->get_product_id() == $item->get_product_id() )
             $has_bought = true;
             break;
       }
   }
} 

Benutzer-Avatar
Ash0ur

Bezüglich Punkt 3 können Sie die Kundenbearbeitungsaufträge einfach nutzen wc_get_orders()

$user              = wp_get_current_user();
$processing_orders = wc_get_orders(
    array(
       'customer' => $user->ID,
       'status'   => 'wc-processing',
    )
);

Sie können prüfen, ob die Bearbeitungsaufträge leer sind oder nicht. und Sie können die Bestellprodukte durchlaufen, um Details zu jedem Produkt zu erhalten.

foreach ( $processing_orders as $p_order ) {
   $order_products = $p_order->get_items();
   foreach ( $order_products as $product_item ) {
      $product_id = $product_item->get_id();
   }
}

1081650cookie-checkSo zeigen Sie Kunden, die zuvor Produkte mit dem Bestellstatus „in Bearbeitung“ gekauft haben, eine benutzerdefinierte Nachricht während der WooCommerce-Kaufabwicklung an

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

Privacy policy