Вопрос или проблема
В WooCommerce я хочу удалить стандартный продуктовый цикл и создать свой собственный. Вот мой код на данный момент:
<?php
// добавляем поддержку WooCommerce для темы
add_action('after_setup_theme', 'custom_theme_add_woocommerce_support');
function custom_theme_add_woocommerce_support()
{
add_theme_support('woocommerce', array(
'thumbnail_image_width' => 200,
'single_image_width' => 500,
));
add_theme_support('wc-product-gallery-zoom');
add_theme_support('wc-product-gallery-lightbox');
add_theme_support('wc-product-gallery-slider');
}
// Удаляем стандартный продуктовый цикл
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_output_all_notices', 10 );
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_result_count', 20 );
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 );
// Удаляем содержание стандартного продуктового цикла
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_product_loop_start', 40 );
remove_action( 'woocommerce_after_shop_loop', 'woocommerce_product_loop_end', 40 );
// Удаляем действие woocommerce_shop_loop
remove_action( 'woocommerce_shop_loop', 'woocommerce_template_loop_product', 10 );
// Добавляем свой собственный кастомный цикл
add_action( 'woocommerce_before_shop_loop', 'my_custom_product_loop_start', 40 );
function my_custom_product_loop_start() {
// Ваш код для начала кастомного цикла
// Например:
echo '<div class="my-custom-loop">';
}
add_action( 'woocommerce_after_shop_loop', 'my_custom_product_loop_end', 40 );
function my_custom_product_loop_end() {
// Ваш код для конца кастомного цикла
// Например:
echo '</div>';
}
// Добавляем контент для собственного продуктового цикла
function my_custom_product_loop() {
// Ваш код контента кастомного продуктового цикла
// Например:
$args = array(
'post_type' => 'product',
'posts_per_page' => 12
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
// Ваш код элемента кастомного продуктового цикла
// Например:
echo '<div class="my-custom-product-loop-item">';
echo '<div>' . get_the_post_thumbnail() . '</div>';
echo '<h2>' . get_the_title() . '</h2>';
echo '</div>';
endwhile;
wp_reset_postdata();
}
// Вызываем функцию кастомного продуктового цикла
add_action( 'woocommerce_before_shop_loop', 'my_custom_product_loop', 50 );
Моя функция my_custom_product_loop() создает новый продуктовый цикл, но стандартный цикл не удаляется полностью. Вместо этого он перемещается в div с классом my-custom-loop. Как я могу полностью удалить оригинальный цикл? Также будет ли работать мой кастомный цикл для связанных продуктов в шаблонах категорий и тегов?
Ответ или решение
Чтобы полностью удалить стандартный цикл продуктов в WooCommerce и создать свой собственный, вам нужно правильно использовать хуки и гарантироваться, что все части оригинального цикла действительно отменены. Давайте рассмотрим, как это сделать.
Шаг 1: Удаление стандартного цикла продуктов
Мы начнем с удаления всех стандартных хуков, связанных с выводом продуктов на странице магазина. В вашем коде уже есть часть этого, но давайте убедимся, что вы убрали все необходимые части.
// Удаляем стандартные хуки WooCommerce
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_output_all_notices', 10 );
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_result_count', 20 );
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 );
remove_action( 'woocommerce_before_shop_loop', 'woocommerce_product_loop_start', 40 );
remove_action( 'woocommerce_after_shop_loop', 'woocommerce_product_loop_end', 40 );
remove_action( 'woocommerce_shop_loop', 'woocommerce_template_loop_product', 10 );
Шаг 2: Создание вашего собственного цикла продуктов
Теперь, когда стандартный цикл удалён, вы можете добавить свой собственный цикл продуктов. Давайте кардинально перестроим вашу функцию my_custom_product_loop()
и убедимся, что она возвращает только уникальный набор данных.
// Добавление вашего собственного цикла продуктов
function my_custom_product_loop() {
// Определите параметры для запроса продуктов
$args = array(
'post_type' => 'product',
'posts_per_page' => 12,
'orderby' => 'date',
'order' => 'DESC',
);
// Выполните запрос
$loop = new WP_Query($args);
if ($loop->have_posts()) {
echo '<div class="my-custom-loop">'; // Начало вашего пользовательского цикла
while ($loop->have_posts()) : $loop->the_post();
// Отображение каждого товара
echo '<div class="my-custom-product-loop-item">';
echo '<div>' . get_the_post_thumbnail() . '</div>';
echo '<h2>' . get_the_title() . '</h2>';
echo '</div>';
endwhile;
echo '</div>'; // Конец вашего пользовательского цикла
} else {
echo __('Нет товаров', 'text-domain');
}
wp_reset_postdata(); // Сброс данных
}
// Вызываем ваш пользовательский цикл перед стандартным циклом
add_action( 'woocommerce_before_shop_loop', 'my_custom_product_loop', 5 );
Шаг 3: Установка хуков
Убедитесь, что ваш специфичный контент вызывается в нужное время. Мы будем вызывать my_custom_product_loop()
непосредственно перед появлением стандартного цикла с использованием приоритета 5, чтобы он отображался в правильном порядке.
Шаг 4: Проверка на страницы категорий и тегов
Чтобы ваш пользовательский цикл работал на страницах категорий и тегов, вы можете использовать условные теги. Вам нужно будет модифицировать функцию, чтобы учитывать эти условия:
function my_custom_product_loop() {
if (is_product_category() || is_product_tag() || is_shop()) {
// Здесь добавьте код из предыдущего шага, чтобы вернуться к вашему пользовательскому циклу
}
}
Так вы сможете проверить, находитесь ли вы на странице категории или тега, прежде чем выполнять свой пользовательский цикл.
Заключение
После выполнения всех этих шагов вы сможете полностью удалить стандартный цикл WooCommerce и создать свой собственный уникальный цикл для отображения продуктов. Убедитесь, что вы тестируете ваши изменения для разных страниц (магазин, категории, теги), чтобы гарантировать, что все работает гладко.