как переопределить цикл woocommerce или archive-product.php
Пока мой шаблон woocommerce перебирает все товары на странице магазина, я пытаюсь настроить и добавить несколько классов bootstrap для правильной стилизации, так как стандартные стили вызывают проблемы с макетом. После исследования страницы я обнаружил, что в сердце цикла находится это:
wc_get_template_part( 'content', 'product' );
Не знаю, что это такое, думал, что это будет выглядеть как обычный HTML и CSS классы, которые я могу отредактировать, но я все еще думаю, что это может быть где-то скрыто, но не знаю где найти.
Я застрял со вчерашнего дня на том, как редактировать HTML элементы, я все еще новичок в разработке тем, поэтому, пожалуйста, помогите мне или хотя бы посоветуйте. Вот полный archive-product.php, который выглядит следующим образом:
get_header(); ?>
<div class="row">
<div class="small-12 medium-12 large-12 columns text-left">
<!--хлебные крошки-->
<?php
/**
* хук woocommerce_before_main_content.
*
* @hooked woocommerce_output_content_wrapper - 10 (выводит открывающие div для контента)
* @hooked woocommerce_breadcrumb - 20
* @hooked WC_Structured_Data::generate_website_data() - 30
*/
do_action( 'woocommerce_before_main_content' );
?>
</div>
<header class="small-12 medium-6 large-6 columns text-left woocommerce-products-header collapse">
<!--заголовок-->
<?php if ( apply_filters( 'woocommerce_show_page_title', true ) ) : ?>
<h1 class="woocommerce-products-header__title page-title"><?php woocommerce_page_title(); ?></h1>
<?php endif; ?>
<?php
/**
* хук woocommerce_archive_description.
*
* @hooked woocommerce_taxonomy_archive_description - 10
* @hooked woocommerce_product_archive_description - 10
*/
do_action( 'woocommerce_archive_description' );
?>
</header>
<div class="small-12 medium-6 large-6 columns collapse">
<?php if ( have_posts() ) : ?>
<?php
/**
* хук woocommerce_before_shop_loop.
*
* @hooked woocommerce_result_count - 20
* @hooked woocommerce_catalog_ordering - 30
*/
do_action( 'woocommerce_before_shop_loop' );
?>
<?php endif; ?>
</div>
</div>
<div class="row small-up-2 large-up-4">
<?php if ( have_posts() ) : ?>
<?php #woocommerce_product_loop_start(); ?><!--удаляет ul-->
<?php woocommerce_product_subcategories(); ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
/**
* хук woocommerce_shop_loop.
*
* @hooked WC_Structured_Data::generate_product_data() - 10
*/
do_action( 'woocommerce_shop_loop' );
?>
<?php wc_get_template_part( 'content', 'product' ); ?>
<?php endwhile; // конец цикла. ?>
<?php #woocommerce_product_loop_end(); ?>
<?php
/**
* хук woocommerce_after_shop_loop.
*
* @hooked woocommerce_pagination - 10
*/
do_action( 'woocommerce_after_shop_loop' );
?>
<?php elseif ( ! woocommerce_product_subcategories( array( 'before' => woocommerce_product_loop_start( false ), 'after' => woocommerce_product_loop_end( false ) ) ) ) : ?>
<?php
/**
* хук woocommerce_no_products_found.
*
* @hooked wc_no_products_found - 10
*/
do_action( 'woocommerce_no_products_found' );
?>
<?php endif; ?>
</div>

Шаблонизация WooCommerce работает по-разному в зависимости от ваших потребностей и/или навыков.
Функция:
<?php
wc_get_template_part('content', 'product');
является эквивалентом функции шаблонов ядра WordPress в WooCommerce:
<?php
get_template_part('filename');
Важно знать, что это то же самое, что и require в PHP, но без использования расширения .php в конце.
Прежде чем выполнять какие-либо из описанных ниже шагов, убедитесь, что ваша тема поддерживает WooCommerce, проверив в файле functions.php наличие следующей строки кода:
<?php
// Хук after_setup_theme добавляет поддержку WC
function mytheme_add_woocommerce_support() {
add_theme_support( 'woocommerce' ); // <<<< здесь
}
add_action( 'after_setup_theme', 'mytheme_add_woocommerce_support' );
Для использования собственного дизайна/шаблона у вас есть несколько вариантов:
1) Самый простой способ:
Создайте файл "woocommerce.php" в папке вашей темы
Этот файл будет иметь наивысший приоритет в плане того, какой файл будет использоваться WordPress в вашей теме. Удалите этот файл, если хотите использовать второй способ.
2) Продвинутый способ:
Создайте папку "woocommerce" и скопируйте в неё шаблон, который вы хотите изменить.
WooCommerce/WordPress распознает это и будет использовать шаблоны из этой папки. Этот метод называется "переопределением шаблонов" и позволяет вам вставлять и изменять части вывода WooCommerce во фронтенде вашей темы. Это более продвинутый способ кастомизации WC, возможно, вызов для вас, но точно более профессиональный способ сделать это.
В этом случае вы, вероятно, ищете этот файл:
woocommerce/archive-product.php
Это шаблонный файл, который отображает основной обзор товаров в магазине. После создания папки и копирования файла в неё вы можете создать свою собственную разметку для этого макета.
В итоге ваш новый файл может выглядеть так:
<?php get_header(); ?>
<div class="container">
<div class="row">
<?php get_template_part('sidebars/sidebar-left'); ?>
<main class="col-xs-12 col-sm-9 col-md-9 col-lg-9">
<?php
// Запускаем только на страницах архива магазина, не на страницах отдельных товаров или других страницах
if ( is_shop() || is_product_category() || is_product_tag() ) {
// Товаров на странице
$per_page = 24;
if ( get_query_var( 'taxonomy' ) ) { // Если на странице архива таксономии товаров (категория или метка)
$args = array(
'post_type' => 'product',
'posts_per_page' => $per_page,
'paged' => get_query_var( 'paged' ),
'tax_query' => array(
array(
'taxonomy' => get_query_var( 'taxonomy' ),
'field' => 'slug',
'terms' => get_query_var( 'term' ),
),
),
);
} else { // На главной странице магазина
$args = array(
'post_type' => 'product',
'orderby' => 'date',
'order' => 'DESC',
'posts_per_page' => $per_page,
'paged' => get_query_var( 'paged' ),
);
}
// Устанавливаем запрос
$products = new WP_Query( $args );
// Стандартный цикл
if ( $products->have_posts() ) :
while ( $products->have_posts() ) : $products->the_post();
// Ваша новая HTML-разметка здесь
?>
<div class="col-xs-12 col-md-3">
<h2><?php the_title(); ?></h2>
<?php the_content(); ?>
<?php // дополнительные элементы здесь... разметка, классы и т.д. ?>
</div>
<?php
endwhile;
wp_reset_postdata();
endif;
} else { // Если не на странице архива (корзина, оформление заказа и т.д.), выполняем стандартные операции
woocommerce_content();
}
?>
</main>
</div>
</div>
</div>
<?php get_footer(); ?>
Надеюсь, это даст вам понимание, как это работает. Вы также можете посмотреть системную страницу WC в админке внизу. Там будет указано, какие шаблоны использует WC.
