Используйте атрибут продукта в условном теге

Вопрос или проблема

У меня есть следующий код, который добавляет цену рядом с каждой вариацией:

//Добавить цены к вариациям
add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name' );

function display_price_in_variation_option_name( $term ) {
global $wpdb, $product;

$result = $wpdb->get_col( "SELECT slug FROM {$wpdb->prefix}terms WHERE name="$term"" );

$term_slug = ( !empty( $result ) ) ? $result[0] : $term;

$query = "SELECT postmeta.post_id AS product_id
FROM {$wpdb->prefix}postmeta AS postmeta
LEFT JOIN {$wpdb->prefix}posts AS products ON ( products.ID = postmeta.post_id )
WHERE postmeta.meta_key LIKE 'attribute_%'
AND postmeta.meta_value="$term_slug"
AND products.post_parent = $product->id";

$variation_id = $wpdb->get_col( $query );

$parent = wp_get_post_parent_id( $variation_id[0] );

if ( $parent > 0 ) {
$_product = new WC_Product_Variation( $variation_id[0] );

//здесь вы можете настроить, как отображается цена
return $term . ' <span>(' . woocommerce_price( $_product->get_price() ) . ')</span>';
}
return $term;

}

Этот код работает идеально. Однако я хотел бы, чтобы этот код применялся только к конкретному атрибуту продукта (слаг — training-level). Это возможно с помощью условия if и условных тегов?

Я также попробовал добавить следующее сразу под global $wpdb, $product;, но это не сработало:

$product_name = $product->get_attribute( 'training-level' );

Пожалуйста, помогите.

Вы должны быть в состоянии обернуть секцию “возврат с ценой”, если переменная $term соответствует определенному значению.

Я не уверен, что именно содержит $term, но это должно сработать. Если нет, вы можете изменить значения в операторе if.

//Добавить цены к вариациям
add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name' );
function display_price_in_variation_option_name( $term ) {
    global $wpdb, $product;

    $result = $wpdb->get_col( "SELECT slug FROM {$wpdb->prefix}terms WHERE name="$term"" );

    $term_slug = ( !empty( $result ) ) ? $result[0] : $term;

    $query = "SELECT postmeta.post_id AS product_id
        FROM {$wpdb->prefix}postmeta AS postmeta
        LEFT JOIN {$wpdb->prefix}posts AS products ON ( products.ID = postmeta.post_id )
        WHERE postmeta.meta_key LIKE 'attribute_%'
        AND postmeta.meta_value="$term_slug"
        AND products.post_parent = $product->id";

    $variation_id = $wpdb->get_col( $query );

    $parent = wp_get_post_parent_id( $variation_id[0] );

    if( $parent > 0 ){
        $_product = new WC_Product_Variation( $variation_id[0] );

        if( $term == 'Уровень начинающего' || $term == 'Уровень среднего' || $term == 'Уровень продвинутого' ){
            //здесь вы можете настроить, как отображается цена
            return $term . ' <span>(' . woocommerce_price( $_product->get_price() ) . ')</span>';
        } else {
            return $term;
        }
    }
    return $term;
}

Ответ или решение

Вопрос, который вы задали, касается добавления цен к вариациям продуктов в WooCommerce, с условием применения этого функционала только к определенному атрибуту продукта, в вашем случае — «training-level». Давайте рассмотрим, как можно добиться желаемого результата с использованием условных конструкций.

Решение проблемы

Для начала следует ограничить выполнение вашего кода только для вариаций с определенными значениями атрибута. В вашем коде мы можем использовать условие if, чтобы проверить, соответствует ли $term нужному значению перед тем, как отображать цену.

Ниже приведен модифицированный код, который учитывает ваше требование:

// Добавление цен к вариациям
add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name' );

function display_price_in_variation_option_name( $term ) {
    global $wpdb, $product;

    // Получаем слаг термина
    $result = $wpdb->get_col( "SELECT slug FROM {$wpdb->prefix}terms WHERE name='$term'" );
    $term_slug = ( !empty( $result ) ) ? $result[0] : $term;

    // Запрос для получения ID вариаций
    $query = "SELECT postmeta.post_id AS product_id
              FROM {$wpdb->prefix}postmeta AS postmeta
              LEFT JOIN {$wpdb->prefix}posts AS products ON ( products.ID = postmeta.post_id )
              WHERE postmeta.meta_key LIKE 'attribute_%'
              AND postmeta.meta_value='$term_slug'
              AND products.post_parent = $product->id";

    $variation_id = $wpdb->get_col( $query );
    $parent = wp_get_post_parent_id( $variation_id[0] );

    if ( $parent > 0 ) {
        $_product = new WC_Product_Variation( $variation_id[0] );

        // Условие для проверки атрибута
        if ( $product->get_attribute( 'training-level' ) ) {
            return $term . ' <span>(' . woocommerce_price( $_product->get_price() ) . ')</span>';
        }
    }
    return $term;
}

Пояснение кода

  1. Фильтрация атрибутов: Мы проверяем, есть ли атрибут «training-level» у текущего продукта, что позволит включить отображение цен только в том случае, если этот атрибут присутствует.

  2. Получение слага термина: Код содержит запрос к базе данных для получения слага термина, соответствующего названию вариации. Это необходимо для корректного получения цен.

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

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

Заключение

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

Этот подход соответствует современным требованиям SEO и ориентирован на пользователя, создавая удобный и логичный интерфейс для клиентов.

Оцените материал
Добавить комментарий

Капча загружается...