Вопрос или проблема
У меня есть следующий код, который добавляет цену рядом с каждой вариацией:
//Добавить цены к вариациям
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;
}
Пояснение кода
-
Фильтрация атрибутов: Мы проверяем, есть ли атрибут «training-level» у текущего продукта, что позволит включить отображение цен только в том случае, если этот атрибут присутствует.
-
Получение слага термина: Код содержит запрос к базе данных для получения слага термина, соответствующего названию вариации. Это необходимо для корректного получения цен.
-
Проверка родительского ID: Мы извлекаем ID родительского продукта для того, чтобы найти соответствии в базе данных, и только после этого проверяем наличие выделенного атрибута.
-
Визуализация: Если условие с атрибутом выполнено, возвращается строка с названием вариации и ценой. Это визуально обогатит пользовательский интерфейс, обеспечив посетителей информацией о ценах на соответствующие вариации.
Заключение
Приведенное решение легко адаптируется под ваши нужды и гарантирует, что ваши клиенты увидят цены только для вариаций с указанным атрибутом. Если вы столкнетесь с дополнительными вопросами или проблемами, всегда можно адаптировать этот код, уточняя условия или добавляя дополнительные атрибуты. Ваше решение теперь станет полезным инструментом для повышения пользовательского опыта на вашем веб-сайте.
Этот подход соответствует современным требованиям SEO и ориентирован на пользователя, создавая удобный и логичный интерфейс для клиентов.