Здесь собраны наиболее востребованные хуки woocommerce, которые могут пригодится при настройке любого интернет-магазина. С другими полезными хуками можно ознакомиться здесь
Необходимые части кода вставляем в файл functions (лучше использовать отдельный файл для функций woocommerce)
Изменения базовых параметров WC
//количество выводимых на странице товаров
add_filter('loop_shop_per_page', create_function('$cols', 'return 30;')); // устаревшая функция (конфликтует с php 7.2)
add_filter( 'loop_shop_per_page', function ( $cols ) { return 20; }, 20 ); // актуальная функция
//!!! Изменяем количество колонок
add_filter('loop_shop_columns', 'loop_columns');
if (!function_exists('loop_columns')) {
function loop_columns() {
return 3;
}
}
// Изменяем количество похожих товаров
add_filter( 'woocommerce_output_related_products_args', 'jk_related_products_args' );
function jk_related_products_args( $args ) {
$args['posts_per_page'] = 3; // количество "Похожих товаров"
$args['columns'] = 3; // количество колонок
return $args;
}
Убрать ссылку на товар из категории
remove_action( 'woocommerce_before_shop_loop_item', 'woocommerce_template_loop_product_link_open', 10 );
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_product_link_close', 5 );
Изменить ссылку Добавить в корзину на переход в карточку товара:
// Убрать кнопку добавить в корзину из категорий
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart');
add_action( 'woocommerce_after_shop_loop_item', 'add_inside_enter_button' );
function add_inside_enter_button() {
global $product;
echo '<a class="button product_type_simple add_to_cart_button" href="'.get_permalink($product->get_ID()).'">Подробнее</a>';
};
Переход в Оформление товара при добавлении товара в корзину (в настройках WC можно настроить переход в Корзину при добавлении товара):
// Редирект к оформлению после добавления товара
function bbloomer_redirect_checkout_add_cart( $url ) {
$url = get_permalink( get_option( 'woocommerce_checkout_page_id' ) );
return $url;
}
add_filter( 'woocommerce_add_to_cart_redirect', 'bbloomer_redirect_checkout_add_cart' );
Убрать ссылку на полное изображение товара (в шаблоне товара)
add_filter('woocommerce_single_product_image_thumbnail_html','wc_remove_link_on_thumbnails' );
function wc_remove_link_on_thumbnails( $html ) {
return strip_tags( $html,'<img>' );
}
Изменение составляющих WC: категория товаров
// описание категории после товаров
remove_action( 'woocommerce_archive_description', 'woocommerce_taxonomy_archive_description', 10 );
add_action( 'woocommerce_after_shop_loop', 'woocommerce_taxonomy_archive_description', 100 );
// html теги в описании категории товара
foreach ( array( 'pre_term_description' ) as $filter ) {
remove_filter( $filter, 'wp_filter_kses' );
}
foreach ( array( 'term_description' ) as $filter ) {
remove_filter( $filter, 'wp_kses_data' );
}
Вывести описание категории на всех страницах пагинации
function my_theme_woocommerce_taxonomy_archive_description() {
if ( is_tax( array( 'product_cat', 'product_tag' ) ) && get_query_var( 'paged' ) != 0 ) {
$description = wc_format_content( term_description() );
if ( $description ) {
echo '<div class="term-description">' . $description . '</div>';
}
}
}
add_action( 'woocommerce_archive_description', 'my_theme_woocommerce_taxonomy_archive_description');
Выводим изображение категории перед описанием
function woocommerce_taxonomy_archive_image() {
global $wp_query;
$term = $wp_query->get_queried_object();
$thumbnail_id = get_term_meta( $term->term_id, 'thumbnail_id', true );
$image = wp_get_attachment_url( $thumbnail_id );
if (!empty($image)) {
echo '<img src="'.$image.'" title="'.$term->name.'" alt="'.$term->name.'"
srcset="'.wp_get_attachment_image_srcset( $thumbnail_id, 'large' ).'" sizes="'.wp_get_attachment_image_sizes( $thumbnail_id, 'large' ).'">';
}
}
add_action( 'woocommerce_after_shop_loop', 'woocommerce_taxonomy_archive_image', 90 );
Альтернативный вариант вывода изображения категории (в некотором смысле более правильный):
// Выводим изображение таксономии
function woocommerce_taxonomy_archive_image() {
global $wp_query;
$term = $wp_query->get_queried_object();
if ( is_tax() ) {
$thumbnail_id = get_term_meta( $term->term_id, 'thumbnail_id', true );
$image = wp_get_attachment_url( $thumbnail_id );
echo '<img src="'.$image.'" title="'.$term->name.'" alt="'.$term->name.'" class="term-image"
srcset="'.wp_get_attachment_image_srcset( $thumbnail_id, 'large' ).'" sizes="'.wp_get_attachment_image_sizes( $thumbnail_id, 'large' ).'">';
}
}
add_action( 'woocommerce_after_shop_loop', 'woocommerce_taxonomy_archive_image', 90 );
Обернуть описание категории товаров в div
function add_class_to_term_description($term_description) {
if( !is_admin() ) {
echo '<div class="cell">' . $term_description. '</div>';
}
}
add_filter( 'term_description', 'add_class_to_term_description' );
Ajax-добавление в шаблоне товара
Как известно в карточке товара при добавлении страница перезагружается. Изменим это:
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
add_action( 'woocommerce_single_product_summary', 'woocommerce_template_loop_add_to_cart', 30 );
Решение не идеальное, т.к. мы убираем функционал количества, но если данный параметр не важен, то можно использовать.
Если нужно чтобы количество все же было, то нужно использовать функцию добавления количества в шаблоне архива, добавив к ней еще один хук:
add_action( 'woocommerce_single_product_summary', 'custom_quantity_field_archive', 30 );