Показать заданные атрибуты товара на страницах архива и категорий в WooCommerce
Я сделал вывод атрибутов товара на страницах архива и категорий.
add_action( 'woocommerce_after_shop_loop_item', 'new_template_loop_product_meta', 20 );
function new_template_loop_product_meta() {
global $product;
if( ! is_object( $product ) ) {
$product = wc_get_product( get_the_id() );
$sku = $product->get_sku();
}
echo '<div class="pa">';
echo '<span>Brand: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_brand') . '</span><br />';
echo '<span>Country: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_contry') . '</span><br />';
echo '<span>SKU: </span>' . '<span class="pa-right">' . $product->get_sku() . '</span><br />';
echo '<span>Material: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_material') . '</span><br />';
echo '<span>Type: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_product_type') . '</span><br />';
echo '<span>Color: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_color') . '</span><br />';
echo '<span>Size: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_size') . '</span><br />';
echo '<span>Model: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_model') . '</span><br />';
echo '<span>Collection: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_collection') . '</span><br />';
echo '<span>Mechanism: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_mechanism') . '</span><br />';
echo '<span>Magnetic: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_magnetic') . '</span><br />';
echo '<span>Side: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_side') . '</span><br />';
echo '<span>Load: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_load') . '</span><br />';
echo '<span>Availability: </span>' . '<span class="pa-right">' . $product->get_attribute('pa_availability') . '</span>';
echo '</div>';
}
Но на этих страницах показываются названия всех атрибутов, какие есть. Подскажите, как можно вывести только те атрибуты, что заданы тому или иному товару?
И наверное это уже второй вопрос. Как лучше оптимизировать код, чтобы не было лишних запросов к Базе с таким большим количеством атрибутов.
Буду рад вашей помощи!
Ответы (1 шт):
Автор решения: KAGG Design
→ Ссылка
Вот код, который выводит только те атрибуты, которые есть у данного товара:
<?php
add_action( 'woocommerce_after_shop_loop_item', 'new_template_loop_product_meta', 20 );
/**
* Show product attributes.
*/
function new_template_loop_product_meta() {
global $product;
$attr_list = [
'Brand' => 'pa_brand',
'Country' => 'pa_country',
'SKU' => 'sku',
'Material' => 'pa_material',
'Type' => 'pa_product_type',
'Color' => 'pa_color',
'Size' => 'pa_size',
'Model' => 'pa_model',
'Collection' => 'pa_collection',
'Mechanism' => 'pa_mechanism',
'Magnetic' => 'pa_magnetic',
'Side' => 'pa_side',
'Load' => 'pa_load',
'Availability' => 'pa_availability',
];
if ( ! is_object( $product ) ) {
$product = wc_get_product( get_the_id() );
}
echo '<div class="pa">';
foreach ( $attr_list as $attr_title => $attr_name ) {
show_attribute( $product, $attr_title, $attr_name );
}
echo '</div>';
}
/**
* Show attribute.
*
* @param WC_Product $product Product.
* @param string $attr_title Attribute title.
* @param string $attr_name Attribute name.
*/
function show_attribute( $product, $attr_title, $attr_name ) {
if ( 'sku' === $attr_name ) {
$attr = (string) $product->get_sku();
} else {
$attr = $product->get_attribute( $attr_name );
}
if ( '' === $attr ) {
return;
}
echo '<span>' . esc_html( $attr_title ) . ': </span><span class="pa-right">' . esc_html( $attr ) . '</span><br />';
}
В оптимизации код не нуждается. В WordPress и WooCommerce всё кешируется, и в базу делается только один раз один запрос для каждого продукта, чтобы считать все атрибуты товара.