Избегайте обновления цен на товары в корзине для определенных категорий товаров в Woocommerce

Я использую сценарий ниже в моей дочерней теме WordPress functions.php, чтобы перезаписать цену, но приведенный ниже код влияет на все продукты.

Не могли бы вы помочь мне «не запускать» нижеприведенный код, если продукт относится к определенной категории «рубашки», «игры»?

function calculate_cart_total( $cart_object ) {

    foreach ( WC()->cart->get_cart() as $key => $value ) {
        if (is_array($valueArray)) {
            foreach ( $valueArray as $k => $value ) {
                if ($value['wccpf_cost']) {
                    $additionalPrice = $value['wccpf_cost']['user_val'];
                }
            }
        }
    }

    $additionalPrice = $value['wccpf_cost']['user_val'];

    foreach ( WC()->cart->get_cart() as $key => $value ) {
        if ( method_exists( $value['data'], "set_price" ) ) {
            $value['data']->set_price( $additionalPrice );
        } else {
            $value['data']->price = ($additionalPrice );
        }     
    }
}
add_action( 'woocommerce_before_calculate_totals', 'calculate_cart_total', 99 );

Приведенный выше код работает без сбоев для всех продуктов, но я не хочу запускать этот код для всех продуктов, так как этот код требуется.

Я пробовал условные теги, такие как is_product_category( array( 'shirts', 'games' ) ), но они не работают.

Или есть какой-то конкретный способ в WordPress вместо functions.php, чтобы я мог запускать приведенный выше код для определенных продуктов или категорий только там, где это требуется?

Я также выполнил поиск в Google, но не смог найти идеального решения.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
149
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем коде есть некоторые ошибки и ошибки ... Поскольку $valueArray не определен в вашем коде, первый цикл foreach не имеет никакого эффекта, и код становится активным после него. Чтобы настроить таргетинг на категории товаров в корзине, вы можете использовать условную функцию WordPress has_term().

Попробуйте вместо этого (для Woocommerce 3+):

// Updating cart item prices conditionally
add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 100, 1 );
function custom_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;
    
    // Your product categories to avoid
    $categories = array("shirts", "games");

    foreach ( $cart->get_cart() as $cart_item ) {
        if ( isset($cart_item['wccpf_cost']['user_val']) && ! has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
            $cart_item['data']->set_price($cart_item['wccpf_cost']['user_val']);
        }
    }
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). Должно сработать.


Но если вы хотите настроить таргетинг на родительские категории продуктов, вам нужно будет вместо этого использовать в своем коде настраиваемую условную функцию has_product_categories():

// Custom conditional function that handle parent product categories too
function has_product_categories( $categories, $product_id = 0 ) {
    $parent_term_ids = $categories_ids = array(); // Initializing
    $taxonomy        = 'product_cat';
    $product_id      = $product_id == 0 ? get_the_id() : $product_id;

    if ( is_string( $categories ) ) {
        $categories = (array) $categories; // Convert string to array
    }

    // Convert categories term names and slugs to categories term ids
    foreach ( $categories as $category ){
        $result = (array) term_exists( $category, $taxonomy );
        if ( ! empty( $result ) ) {
            $categories_ids[] = reset($result);
        }
    }

    // Loop through the current product category terms to get only parent main category term
    foreach( get_the_terms( $product_id, $taxonomy ) as $term ){
        if ( $term->parent > 0 ){
            $parent_term_ids[] = $term->parent; // Set the parent product category
            $parent_term_ids[] = $term->term_id; // (and the child)
        } else {
            $parent_term_ids[] = $term->term_id; // It is the Main category term and we set it.
        }
    }
    return array_intersect( $categories_ids, array_unique($parent_term_ids) ) ? true : false;
}

// Updating cart item prices conditionally
add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 100, 1 );
function custom_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;
    
    // Your product categories to avoid
    $categories = array("shirts", "games");

    foreach ( $cart->get_cart() as $cart_item ) {
        if ( isset($cart_item['wccpf_cost']['user_val']) && ! has_product_categories( $cart_item['product_id'], $categories ) ) {
            $cart_item['data']->set_price($cart_item['wccpf_cost']['user_val']);
        }
    }
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). Должно сработать.


Связанные темы:

Большое спасибо за предоставленный обновленный окончательный код, так как у меня не так много знаний о php, это действительно полезно. Спасибо, что исправили и обновили пост :)

Group Of Oceninfo 26.10.2018 02:50

Другие вопросы по теме