gpt4 book ai didi

wordpress - 如何在 WooCommerce 结账期间向之前购买订单状态为 'processing' 的产品的客户显示自定义消息

转载 作者:行者123 更新时间:2023-12-05 02:35:26 25 4
gpt4 key购买 nike

我想在结帐页面上显示一条消息,通知客户他们过去购买过该产品(他们即将购买的产品),但只有满足这些条件时才应运行此消息。

  1. 客户必须登录
  2. 用户角色是管理员或客户
  3. 之前购买的产品的订单状态应仍为“处理中”。

到目前为止,我已经能够很好地满足前两个条件:

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' );

注意:我使用 foreach 的原因是用户一次只能购买一种产品(在购物车)

但是我不知道如何处理第三个条件。有什么建议吗?

最佳答案

您的前 2 个步骤确实有效,对于第 3 个步骤,您将必须使用一个自定义函数,它只检查订单状态“正在处理”。

此自定义函数的优势在于,与遍历所有现有订单相比,它更快更轻便。

所以你得到:

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' );

结果:一般消息

enter image description here


可选:您可以使用 woocommerce_checkout_cart_item_quantity Hook ,而不是显示一般消息,而是按产品单独显示

所以你会得到:

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

结果:按产品分别显示

enter image description here


注意has_bought_items() 函数基于Check if a user has purchased specific products in WooCommerce答案代码

相关: Display message below product name on WooCommerce cart page if user has bought product before

关于wordpress - 如何在 WooCommerce 结账期间向之前购买订单状态为 'processing' 的产品的客户显示自定义消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70563307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com