Добавьте дополнительный класс с идентификаторами категорий продуктов на страницы архивов WooCommerce

#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() )..