Введите часть искомого слова, названия или фразы...
↑ ↓
  1. Новые темы озаглавленные с маленькой буквы - удаляются без предупреждения!
  2. Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!

Отображение специфических ценников в WooCommerce

Тема в разделе "Вопросы, советы и доработки.", создана пользователем D&B, 18 янв 2016.

  1. D&B

    D&B Администратор Команда форума Местный

    Сообщения:
    3.279
    Симпатии:
    726
    Баллы:
    113
    Скажем, вы торгуете шашлыком из элитных сортов говядины, и в килограмме у вас определенное количество шампуров. Покупатель может выбрать количество шампуров, но вы хотите выводить именно цену за килограмм, чтоб покупатель мог сравнить цены. Если вас волнует подобный вопрос или вы хотите узнать, как можно вывести другие специфические ценники, то в этой статье вы найдете ответы на все свои вопросы.

    Вы можете изменить отображение цен, что облегчит покупателям процесс сравнивания средних цен на ваши товары. Для изменения выводимых ценников, вам понадобятся следующие важные фильтры:

    • woocommerce_get_price_html: изменяет то, как отображается цена на странице товара и страницах магазина
    • woocommerce_cart_item_price: изменяет то, как отображаются цены, которые отображаются в списке товаров корзины (не на странице оформления заказа, так как там отображается только количество товаров и общая цена, а не средняя).

    WooCommerce-фильтр для отображения цен на все товары.

    Допустим, вы хотите сделать в конце ценника пометку: «за упаковку». Вы можете добавить эту приписку к ценнику с помощью фильтров цен товаров и корзины:

    Код:
    <?php
    // only copy opening php tag if needed
    // Adds "per package" after each product price throughout the shop
    function sv_change_product_price_display( $price ) {
        $price .= ' per package';
        return $price;
    }
    add_filter( 'woocommerce_get_price_html', 'sv_change_product_price_display' );
    add_filter( 'woocommerce_cart_item_price', 'sv_change_product_price_display' );
    Фильтр woocommerce_get_price_html изменяет этот показатель на страницах магазина:

    woocommerce-change-all-product-price-display-1.jpg

    И на единичных страницах товаров:

    woocommerce-price-label-added-2.jpg

    Фильтр woocommerce_cart_item_price так же добавит это отображение для корзины:

    woocommerce-cart-price-label-added-3.jpg

    WooCommerce-фильтр отображения цены для единичного товара.

    Что делать, если вы хотите изменить отображение цены для определенного товара? Вы можете сделать это с помощью тех же фильтров, так как они также позволяют использовать дополнительные аргументы, чтоб изменить цену согласно каким-то условиям. Вернемся к «нашим» шашлыкам: вы продаете шампур за 150 рублей, но хотите вывести ценник «1 125 рублей за кг», чтоб покупатель мог сравнить разные товары.

    woocommerce-price-display 4.jpg

    На этот раз мы разделим эти фильтры и используем 2 функции, чтоб модифицировать цену на товар и цену для корзины. Сначала нам нужно узнать ID товара, затем заменить отображение цены только для этого товара.

    Код:
    function sv_change_product_html( $price_html, $product ) {
        if ( 337 === $product->id ) {
            $price_html = '<span class="amount">$15.00 per kg</span>';   
        }
       
        return $price_html;
    }
    add_filter( 'woocommerce_get_price_html', 'sv_change_product_html', 10, 2 );
    
    
    function sv_change_product_price_cart( $price, $cart_item, $cart_item_key ) {
        if ( 337 === $cart_item['product_id'] ) {
            $price = '$15.00 per kg<br>(7-8 skewers per kg)';
        }
        return $price;
    }   
    add_filter( 'woocommerce_cart_item_price', 'sv_change_product_price_cart', 10, 3 );
    Первая функция изменит страницу «моего товара»:

    woocommerce-price-display 5.jpg

    Вместе с отображением в магазине:

    woocommerce-price-display 6.jpg

    В то время как вторая функция добавит новый прайсинг к «моей корзине»:

    woocommerce-price-display 7.jpg

    Но как бы то ни было, если у вас много товаров со средней ценой, данный метод может быть проблематичным для применения, так как вам, вряд ли, захочется проделывать данную операцию для ID каждого товара. Вместо этого советуется, использовать кастомное поле товара, чтоб добавить расширение ценника.

    WooCommerce-фильтр для отображения цены на основе поля товара.

    Если вам нужно изменить отображение ценника для некоторых товаров, но не для всех, или вы решили, что каждый товар будет иметь разную среднюю цену, то использование кастомного поля даст вам возможность внедрить очень простой сниппет: мы можем добавить данное поле для каждого товара, а затем просто модифицировать его сниппетом.

    Вы можете добавить кастомное поле unit_price для каждого продукта, которому это требуется, а затем в нем прописать значение средней цены.

    woocommerce-price-display 8.jpg

    После его добавления, вы можете задать среднюю цену. После того, как вы задали среднюю цену, добавьте отображение прайсинга, чтоб использовать эту среднюю цену и кастомный ценник:

    Код:
    <?php
    // only copy the opening php tag if needed
    // Change the shop / product prices if a unit_price is set
    function sv_change_product_html( $price_html, $product ) {
        $unit_price = get_post_meta( $product->id, 'unit_price', true );
        if ( ! empty( $unit_price ) ) {
            $price_html = '<span class="amount">' . wc_price( $unit_price ) . ' per kg</span>';   
        }
       
        return $price_html;
    }
    add_filter( 'woocommerce_get_price_html', 'sv_change_product_html', 10, 2 );
    // Change the cart prices if a unit_price is set
    function sv_change_product_price_cart( $price, $cart_item, $cart_item_key ) {
        $unit_price = get_post_meta( $cart_item['product_id'], 'unit_price', true );
        if ( ! empty( $unit_price ) ) {
            $price = wc_price( $unit_price ) . ' per kg';   
        }
        return $price;
    }   
    add_filter( 'woocommerce_cart_item_price', 'sv_change_product_price_cart', 10, 3 );
    wc_price() – это маленькая полезная функция, которая поможет отформатировать цифры с помощью настроек отображения прайсинга магазина.

    В этом случае отображение цен на страницах товара или магазина можно будет изменять при установленной средней цене. Если таковой не установлено, то цена останется прежней:

    woocommerce-price-display 9.jpg

    То же самое случится и с товарами в корзине – WooCommerce-отображение цены будет добавлено, если у товара заявлен сет unit_price в кастомном поле.

    woocommerce-price-display 10.jpg

    Оригинал здесь