Отображение пользовательского сообщения на основе зоны доставки и категорий товаров в Woocommerce

Я использую Woocommerce, чтобы попытаться написать функцию PHP (как новичок взломать вещи из других постов здесь и в других местах) …

🙂 Кажется, я наконец-то справился с этим (еще до того, как кто-то ответил на мой пост!), Так что здесь, в случае, если он окажется полезным для всех — не стесняйтесь сообщать мне о любых улучшениях, я действительно не PHP- человек!

Функция ниже будет отображать уведомление в верхней части корзины / оформления заказа только когда продукты категории «А» находятся в заказе а также клиент не в Великобритании или ЕС.

add_action( 'woocommerce_before_checkout_form' , 'shipping_zone_targeted_postcodes_custom_notice' );
add_action( 'woocommerce_before_cart_table', 'shipping_zone_targeted_postcodes_custom_notice' );
function shipping_zone_targeted_postcodes_custom_notice() {
// HERE DEFINE YOUR SHIPPING ZONE NAME(S)
$targeted_zones_names = array('UK', 'EU'); // <======  <======  <======  <======  <======

// Get the customer shipping zone name
$chosen_methods    = WC()->session->get( 'chosen_shipping_methods' ); // The chosen shipping mehod
$chosen_method     = explode(':', reset($chosen_methods) );
$shipping_zone     = WC_Shipping_Zones::get_zone_by( 'instance_id', $chosen_method[1] );
$current_zone_name = $shipping_zone->get_zone_name();

// set your special category name, slug or ID here:
$special_cat = '(CATEGORY 'A')';
$bool = false;
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$item = $cart_item['data'];
if ( has_term( $special_cat, '(CATEGORY 'A')', $item->id ) )
$bool = true;
}

if( !in_array( $current_zone_name, $targeted_zones_names ) && $bool ){
echo '<p class="message-text">(CUSTOM TEXT)</p>';
}
}

Мой код в основном сделан из этой ветки ответов:
Отображать пользовательское сообщение в зависимости от зоны доставки клиентов в Woocommerce.

1

Решение

В вашем коде есть ошибки и ошибки, такие как:

  • это $special_cat = '(CATEGORY 'A')'; сделать ошибку и должно быть вместо:

    $special_cat = "(CATEGORY 'A')";
    
  • В if ( has_term( $special_cat, '(CATEGORY 'A')', $item->id ) ) $item->id должен быть вместо $item->get_id()
    а также '(CATEGORY 'A')' нужно заменить на правильная категория продукта таксономия который 'product_cat', так:

    if ( has_term( $special_cat, 'product_cat', $item->get_id() ) )
    

Но для товарных категорий вы будете использовать вместо (обрабатывать вариации продукта тоже):

if ( has_term( $special_cat, 'product_cat', $cart_item['product_id'] ) )

Таким образом, функциональный полный код должен быть:

add_action( 'woocommerce_before_checkout_form', 'shipping_zone_targeted_postcodes_custom_notice' );
add_action( 'woocommerce_before_cart_table', 'shipping_zone_targeted_postcodes_custom_notice' );
function shipping_zone_targeted_postcodes_custom_notice() {

// HERE DEFINE YOUR SHIPPING ZONE NAME(S)
$targeted_zones_names = array('UK', 'EU'); // <======  <======  <======  <======

// Get the customer shipping zone name
$chosen_methods    = WC()->session->get( 'chosen_shipping_methods' ); // The chosen shipping mehod
$chosen_method     = explode(':', reset($chosen_methods) );
$shipping_zone     = WC_Shipping_Zones::get_zone_by( 'instance_id', $chosen_method[1] );
$current_zone_name = $shipping_zone->get_zone_name();

// Set your special category name, slug or ID here:
$special_cat = "(CATEGORY 'A')";
$bool = false;

// Loop through cart items
foreach ( WC()->cart->get_cart() as $cart_item ) {
if ( has_term( $special_cat, 'product_cat', $cart_item['product_id'] ) )
$bool = true;
}

if( ! in_array( $current_zone_name, $targeted_zones_names ) && $bool ){
echo '<p class="message-text">(CUSTOM TEXT)</p>';
}
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

Связанные с:
Отображать пользовательское сообщение в зависимости от зоны доставки клиентов в Woocommerce.

0

Другие решения

Других решений пока нет …