Избегайте обновления цены товаров в корзине для определенных категорий товаров в Woocommerce - PullRequest
0 голосов
/ 25 октября 2018

Я использую приведенный ниже скрипт в моей дочерней теме 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, но не смог найти идеальное решение.

1 Ответ

0 голосов
/ 25 октября 2018

В вашем коде есть ошибки и ошибки ... Поскольку $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 checks for parent product categories
function has_product_categories( $product_id, $categories ) {
     // Initializing
    $parent_term_ids = $categories_ids = array();
    $taxonomy        = 'product_cat';

    // Convert categories term names and slugs to categories term ids
    foreach ( $categories as $category ){
        if( is_numeric( $category ) ) {
            $categories_ids[] = (int) $category;
        } elseif ( term_exists( sanitize_title( $category ), $taxonomy ) ) {
            $categories_ids[] = get_term_by( 'slug', sanitize_title( $category ), $taxonomy )->term_id;
        }
    }

    // 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 вашей активной дочерней темы (или активной темы).Это должно работать.


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...