#wordpress #woocommerce #product
Вопрос:
Я хочу добавить пользовательский класс в категории на странице архива продуктов, чтобы я мог добавлять пользовательские стили в теги категорий.
Пример:
- Товар X в категории 1 —> Метка категории желтого цвета
- Товар Y в категории 2 —> Тег категории красным цветом
Я использую этот фрагмент php, но он предназначен для отдельных страниц продукта и применяется к <body>
элементу. Как я могу изменить его, чтобы он работал и для страниц архива магазина?
add_filter( 'body_class','my_body_classes2' );
function my_body_classes2( $classes ) {
if ( is_product() ) {
global $post;
$terms = get_the_terms( $post->ID, 'product_cat' );
foreach ($terms as $term) {
$product_cat_id = $term->term_id;
$classes[] = 'product-in-cat-' . $product_cat_id;
}
}
return $classes;
}
Ответ №1:
Вы можете использовать более новый woocommerce_post_class
фильтр-крючок
Таким образом, вы получаете:
/**
* WooCommerce Post Class filter.
*
* @since 3.6.2
* @param array $classes Array of CSS classes.
* @param WC_Product $product Product object.
*/
function filter_woocommerce_post_class( $classes, $product ) {
// Returns true when viewing a product category archive.
// Returns true when on the product archive page (shop).
if ( is_product_category() || is_shop() ) {
// Set taxonmy
$taxonomy = 'product_cat';
// Get the terms
$terms = get_the_terms( $product->get_id(), $taxonomy );
// Error or empty
if ( is_wp_error( $terms ) || empty( $terms ) ) {
return $classes;
}
// Loop trough
foreach ( $terms as $index => $term ) {
// Product term Id
$term_id = $term->term_id;
// Add new class
$classes[] = 'product-in-cat-' . $term_id;
}
}
return $classes;
}
add_filter( 'woocommerce_post_class', 'filter_woocommerce_post_class', 10, 2 );
Примечание: условие if может быть расширено/ограничено другими условными тегами
Пример:
is_product()
— Возвращает значение true на одной странице продукта. Обертка для is_singular.- и т.д..
Чтобы НЕ применять это, используйте
!
в условии if:// NOT if ( ! is_product_category() )..