• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Решено Собственный шорткод цены

Image CMS

Stork.71

Гуру
Местный
#1
Придумалась мне интересная штука. Захотелось реализовать для товара таблицу модификаций (вариантов) в тексте описания товара. В нее хочется вставить цену. Но хочется сделать это не просто вписав циферки, а автоматизировав процесс, чтобы в случае изменения цены товара поменялась и эта цена в табличке.
Думаю, красиво, цивильно было бы, чтобы можно было просто вставить в текст описания какой-нибудь шорткод типа [product_price id="000" sku="000"] , который бы все делал дальше за нас, а нам оставалось только вписать нужный id или артикул. На выходе нужен просто кусок текста. Оформить это и вручную можно (цвет, размер и т.д.). Хотя в идеале...
Только вот для этого надо как-то добавить такой шорткод в движок. Как это сделать, кто знает?
 

searchingman

Гуру
Местный
#2
Пример шорткода вывода цены товара по id товара, т.е. [product_price id="99"]
Цена выводиться с учетом скидки (перечеркнутая и действующая), т.е. также как в "карточке" товара.

Вставляем следующий код в functions.php своей темы.
PHP:
function price_shortcode_callback( $atts ) {
    $atts = shortcode_atts( array(
        'id' => null,
    ), $atts, 'bartag' );

    $html = '';

    if( intval( $atts['id'] ) > 0 && function_exists( 'wc_get_product' ) ){
         $_product = wc_get_product( $atts['id'] );
         $html = $_product->get_price_html();
    }
    return $html;
}
add_shortcode( 'product_price', 'price_shortcode_callback' );
 
Последнее редактирование:

Stork.71

Гуру
Местный
#3
Спасибо большое, вроде работает!
Вопрос по доработке этого кода. Очень хотелось бы в некоторых случаях не выводить зачеркнутую цену до скидки - есть необходимость использовать шорткод в таблицах наподобие прайса, и там лишние цифры перечеркнутые совершенно ни к чему.
Можно ли добавить какой-нибудь аргумент к шорткоду, который по умолчанию будет "no", но можно прописать вручную 'yes', чтобы цена выводилась с учетом старой перечеркнутой (доскидочной).
например:
[product_price id="99"] или [product_price id="99" bsprice="no"] - если есть только обычная цена, то выводится обычная цена; если есть цена со скидкой, то выводится только цена со скидкой.
[product_price id="99" bsprice="yes"] - если есть только обычная цена, то выводится обычная цена; если есть цена со скидкой, то выводится перечеркнутая обычная цена и актуальная цена со скидкой.
Ну суть такая, но там уж как лучше логику сделать - на no или yes.
 
Последнее редактирование:

searchingman

Гуру
Местный
#4
Спасибо большое, вроде работает!
Вопрос по доработке этого кода. Очень хотелось бы в некоторых случаях не выводить зачеркнутую цену до скидки - есть необходимость использовать шорткод в таблицах наподобие прайса, и там лишние цифры перечеркнутые совершенно ни к чему.
Можно ли добавить какой-нибудь аргумент к шорткоду, который по умолчанию будет "no", но можно прописать вручную 'yes', чтобы цена выводилась с учетом старой перечеркнутой (доскидочной).
например:
[product_price id="99"] или [product_price id="99" bsprice="no"] - если есть только обычная цена, то выводится обычная цена; если есть цена со скидкой, то выводится только цена со скидкой.
[product_price id="99" bsprice="yes"] - если есть только обычная цена, то выводится обычная цена; если есть цена со скидкой, то выводится перечеркнутая обычная цена и актуальная цена со скидкой.
Ну суть такая, но там уж как лучше логику сделать - на no или yes.
Поправил шорткод.
[product_price id="72" old_price="yes"] - вывести с перечеркнутой ценой
[product_price id="72"] - вывести без перечеркнутой цены
PHP:
// шорткод [product_price id="ID_product" old_price="no/yes"]
// id - обязательный атрибут ID товара
// old_price - "no" (по умолчанию) : не выводить старую цену, "yes" : выводить старую перечеркнутую цену
function price_shortcode_callback( $atts ) {
    $atts = shortcode_atts( array(
        'id' => null,
        'old_price' => "no"
    ), $atts, 'bartag' );

    $html = '';

    if( intval( $atts['id'] ) > 0 && function_exists( 'wc_get_product' ) ){
         $_product = wc_get_product( $atts['id'] );
         if ($atts['old_price'] == 'yes')
             $html = $_product->get_price_html();
         else
             $html = wc_price($_product->get_price());
    }
    return $html;
}
add_shortcode( 'product_price', 'price_shortcode_callback' );
 

vipsite

Опытный
#5
А никто не знает как например можно вставить шорткод цены под миниатюрой категории, например есть сайт у которого категория это товар, а товары это цвета/оттенки, вот пример http://frilanser.pp.ua/category/dekorativnaya-kosmetika/blesk-dlya-gub так вот можно под миниатюрой разместить цену (она у всех товаров цветов/оттенков одинаковая)?

Я так понимаю реализуется это по такому алгоритму: "ищем любой товар для категории", "и потом прописуем его через переменную в шорт код".. Только вот как бы это сделать по проще и не сильно громоздко...

Есть у кого идеи?
 

vipsite

Опытный
#6
Вот разместил тут /тема_шаблон/woocommerce/content-product_cat.php и решил сделать так:
PHP:
<?php

    $args = array(
        'posts_per_page'=>-1,
        'post_type'=>'product',
        'orderby'=>'meta_value_num',
        'order'=>'DESC',
        'tax_query'=> array(
            array(
                'taxonomy'=>'product_cat',
                'field'=>'slug',
                'terms'=> $category,
                'operator'=>'IN'
            )
        ),
        'meta_query'=> array(
            array(
                'key'=>'_price',
            )
        )    
    );


    $loop =new WP_Query($args);

    echo "Цена товаров в категории :" get_post_meta($loop->posts[0]->ID,'_price',true);
?>
Но к сожалению НЕ РАБОТАЕТ , что не так? может кто подсказать?
 
Последнее редактирование:

vipsite

Опытный
#7
Вот смог вывести только таким кАстыльным методом(((
PHP:
<?php
    $theCatId = get_term_by( 'slug', $category->slug, 'product_cat' );
    $theCatId = $theCatId->term_id;

    if($theCatId == 39) {
    echo do_shortcode('[product_price id="1061"]');
    }
    if($theCatId == 40) {
    echo do_shortcode('[product_price id="1073"]');
    }
    if($theCatId == 41) {
    echo do_shortcode('[product_price id="1089"]');
    }
    if($theCatId == 42) {
    echo do_shortcode('[product_price id="1103"]');
    }
    if($theCatId == 43) {
    echo do_shortcode('[product_price id="1107"]');
    }
    if($theCatId == 44) {
    echo do_shortcode('[product_price id="1241"]');
    }
    if($theCatId == 45) {
    echo do_shortcode('[product_price id="1291"]');
    }
    if($theCatId == 46) {
    echo do_shortcode('[product_price id="1297"]');
    }
    if($theCatId == 47) {
    echo do_shortcode('[product_price id="1419"]');
    }
    ?>
но вот теперь бы доработать, а именно все сделать так чтобы в [product_price id="1419"] значение ID товара формировалось исходя из ID категории этого продукта..

я так понимаю надо вытянуть массив ID'шников товаров категории, и из этого массива например взять первое значение.. может у кого есть по лучше решение???

Аууу!!! Что-то все спят, хоть скажите что-то...((
 

g-o-d

Новичок
#8
Пример шорткода вывода цены товара по id товара, т.е. [product_price id="99"]
Цена выводиться с учетом скидки (перечеркнутая и действующая), т.е. также как в "карточке" товара.

Вставляем следующий код в functions.php своей темы.
PHP:
function price_shortcode_callback( $atts ) {
    $atts = shortcode_atts( array(
        'id' => null,
    ), $atts, 'bartag' );

    $html = '';

    if( intval( $atts['id'] ) > 0 && function_exists( 'wc_get_product' ) ){
         $_product = wc_get_product( $atts['id'] );
         $html = $_product->get_price_html();
    }
    return $html;
}
add_shortcode( 'product_price', 'price_shortcode_callback' );
Отлично работает. А можно ли сделать так чтобы не зачеркнутая цена была, допустим, красного цвета и без подчеркивания? (Как ни пытался прописывать стили, везде цвета меняются, а вот там где поставил цену с помощью этого кода и шорткода - не меняется)
 

g-o-d

Новичок
#9
Отлично работает. А можно ли сделать так чтобы не зачеркнутая цена была, допустим, красного цвета и без подчеркивания? (Как ни пытался прописывать стили, везде цвета меняются, а вот там где поставил цену с помощью этого кода и шорткода - не меняется)
Всё, решение найдено. Надо в стили темы добавить вот такой код:
ins {
font-size: 34px;
color: red;
text-decoration: none;
}
 
Сверху Снизу