gpt4 book ai didi

php - WooCommerce 购物车 - 条件项目类别验证

转载 作者:可可西里 更新时间:2023-11-01 01:16:11 24 4
gpt4 key购买 nike

我们有一个独家类别 X 和其他常规类别 Y。我想要什么:

  • 当有人从类别 X 订购任何商品时,其他类别的商品将无法添加到购物车,并应显示警告
  • Y 类 产品不应与X 混合。

我怎样才能做到这一点?

我从其他帖子得到这段代码,但它已经过时且不令人满意:

<?php

// Enforce single parent category items in cart at a time based on first item in cart
function get_product_top_level_category ( $product_id ) {

$product_terms = get_the_terms ( $product_id, 'product_cat' );
$product_category = $product_terms[0]->parent;
$product_category_term = get_term ( $product_category, 'product_cat' );
$product_category_parent = $product_category_term->parent;
$product_top_category = $product_category_term->term_id;

while ( $product_category_parent != 0 ) {
$product_category_term = get_term ( $product_category_parent, 'product_cat' );
$product_category_parent = $product_category_term->parent;
$product_top_category = $product_category_term->term_id;
}

return $product_top_category;
}

add_filter ( 'woocommerce_before_cart', 'restrict_cart_to_single_category' );
function restrict_cart_to_single_category() {
global $woocommerce;
$cart_contents = $woocommerce->cart->get_cart( );
$cart_item_keys = array_keys ( $cart_contents );
$cart_item_count = count ( $cart_item_keys );

// Do nothing if the cart is empty
// Do nothing if the cart only has one item
if ( ! $cart_contents || $cart_item_count == 1 ) {
return null;
}

// Multiple Items in cart
$first_item = $cart_item_keys[0];
$first_item_id = $cart_contents[$first_item]['product_id'];
$first_item_top_category = get_product_top_level_category ( $first_item_id );
$first_item_top_category_term = get_term ( $first_item_top_category, 'product_cat' );
$first_item_top_category_name = $first_item_top_category_term->name;

// Now we check each subsequent items top-level parent category
foreach ( $cart_item_keys as $key ) {
if ( $key == $first_item ) {
continue;
}
else {
$product_id = $cart_contents[$key]['product_id'];
$product_top_category = get_product_top_level_category( $product_id );

if ( $product_top_category != $first_item_top_category ) {
$woocommerce->cart->set_quantity ( $key, 0, true );
$mismatched_categories = 1;
}
}
}

// we really only want to display this message once for anyone, including those that have carts already prefilled
if ( isset ( $mismatched_categories ) ) {
echo '<p class="woocommerce-error">Only one category allowed in cart at a time.<br />You are currently allowed only <strong>'.$first_item_top_category_name.'</strong> items in your cart.<br />To order a different category empty your cart first.</p>';
}
}
?>

谢谢

最佳答案

更新(2019)

就像一切都在围绕您的专属类别 category X 进行,您需要为此类别使用条件。

你有机会,因为有一个特殊的功能可以与 woocommerce 产品类别结合使用。假设 **cat_x** 是您专属类别的 slug,如您所知 product_cat 是获取产品类别的参数.

因此对于 has_term () 条件函数,您将使用:

if ( has_term ('cat_x', 'product_cat', $item_id ) ) { // or $product_id
// doing something when product item has 'cat_x'
} else {
// doing something when product item has NOT 'cat_x'
}

我们需要在 foreach 循环中运行购物车商品 2 次:

  • 检测那辆车里是否有 cat_x 元素。
  • 如果检测到购物车中的一件商品 cat_x 并触发正确的消息,则删除其他商品。

在下面的代码中,我换了一个更有用的钩子(Hook)。此 Hook 将检查您购物车中的商品。这个想法是在购物车中添加了“cat_x”项目时删除购物车中的其他类别项目。

代码有很好的注释。最后你会发现不同的通知被解雇了。您需要在每个文本中放入您的真实文本。

add_action( 'woocommerce_check_cart_items', 'checking_cart_items' );
function checking_cart_items() {
// Set your product category slug
$category = 'cat_x';

$number_of_items = sizeof( WC()->cart->get_cart() );
$found = false; // Initializing
$notice = ''; // Initializing

if ( $number_of_items > 0 ) {

// Loop through cart items
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
$product_id = $cart_item['product_id'];

// Detecting if the defined category is in cart
if ( has_term( $category, 'product_cat', $product_id ) ) {
$found = true;
break; // Stop the loop
}
}

// Re-loop through cart items
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
$product_id = $cart_item['product_id'];

if ( $found ) // If the defined product category is in cart
{
if ( $number_of_items == 1 ) { // only one defined product category
if ( empty( $notice ) ){
$notice = '1';
}
}
if ( $number_of_items >= 2 ) { // The defined product category + other categories in cart

// removing other categories items from cart
if ( ! has_term( $category, 'product_cat', $product_id ) ) {
WC()->cart->remove_cart_item( $cart_item_key ); // removing item from cart
if ( empty( $notice ) || $notice == '1' ){
$notice = '2';
}
}
}
} else { // Only other categories items

if ( empty( $notice ) ){
$notice = '3';
}
}
}

// Firing woocommerce notices
if ( $notice == '1' ) { // message for an 'cat_x' item only (alone)
wc_add_notice( sprintf( '<p class="woocommerce-error">bla bla bla one category X item in the cart</p>' ), 'success' );
} elseif ( $notice == '2' ) { // message for an 'cat_x' item and other ones => removed other ones
wc_add_notice( sprintf( '<p class="woocommerce-error">bla bla bla ther is already category X in the cart => Other category items has been removed</p>' ), 'error' );
} elseif ( $notice == '3' ) { // message for other categories items (if needed)
wc_add_notice( sprintf( '<p class="woocommerce-error">bla bla bla NOT category X in the cart</p>' ), 'success' );
}
}
}

我不可能真正测试这段代码(但它不会抛出错误)......


@edit

我们可以使用通知以外的东西……一切皆有可能。但这是一个很好的起始解决方案,需要进行微调。

您需要将 'cat_x' 替换为您的真实类别 slug (在开始时)...

关于php - WooCommerce 购物车 - 条件项目类别验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38390058/

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