Содержание:
Подключение WooCommerce в шаблоне
Отключение стилей WooCommerce
Подключение стилей и скриптов WooCommerce только на страницах магазина
Проверка типа страницы WooCommerce
Подключение нужного шаблона в зависимости от типа страницы
Узнать (получить) ссылку на магазин (витрину, каталог) WooCommerce
Вывод и получение заголовка текущего каталога
Вывод описания категории
Получение ID текущей категории
Получение ID категорий у текущего товара
Подключение WooCommerce в теме WordPress. В файл functions.php добавить код, желательно в начале:
if ( class_exists( 'WooCommerce' ) ) {
require get_template_directory() . '/woocommerce.php';
}
В теме создать файл woocommerce.php и добавить следующий код в него:
function theme_name_woocommerce_setup() {
add_theme_support(
'woocommerce',
array(
'thumbnail_image_width' => 150, // размер thumbnail
'single_image_width' => 300, // размер изображений товара
'product_grid' => array( // параметры вывода товаров по умолчанию на страницах архивов
'default_rows' => 3,
'min_rows' => 1,
'default_columns' => 4,
'min_columns' => 1,
'max_columns' => 6,
),
)
);
add_theme_support( 'wc-product-gallery-zoom' ); // Включить поддержку увеличение изображений
add_theme_support( 'wc-product-gallery-lightbox' ); // Включить поддержку Модальные окна
add_theme_support( 'wc-product-gallery-slider' ); // Включить поддержку Слайдер изображений
}
add_action( 'after_setup_theme', 'theme_name_woocommerce_setup' );
Отключение стилей WooCommerce по умолчанию:
add_filter( 'woocommerce_enqueue_styles', '__return_empty_array' );
Подключение стилей и скриптов WooCommerce только на страницах магазина:
add_action( 'wp_enqueue_scripts', 'wc_styles_scripts', 99 );
function wc_styles_scripts() {
if ( function_exists( 'is_woocommerce' ) ) {
if ( ! is_woocommerce() && ! is_cart() && ! is_checkout() && ! is_account_page() ) {
wp_dequeue_style('woocommerce-layout');
wp_dequeue_style('woocommerce-smallscreen');
wp_dequeue_style('woocommerce-general');
wp_dequeue_style('evolution-woostyles');
wp_dequeue_script('wc_price_slider');
wp_dequeue_script('wc-single-product');
wp_dequeue_script('wc-add-to-cart');
wp_dequeue_script('wc-cart-fragments');
wp_dequeue_script('wc-checkout');
wp_dequeue_script('wc-add-to-cart-variation');
wp_dequeue_script('wc-single-product');
wp_dequeue_script('wc-cart');
wp_dequeue_script('wc-chosen');
wp_dequeue_script('woocommerce');
wp_dequeue_script('prettyPhoto');
wp_dequeue_script('prettyPhoto-init');
wp_dequeue_script('jquery-blockui');
wp_dequeue_script('jquery-placeholder');
wp_dequeue_script('fancybox');
wp_dequeue_script('jqueryui');
}
}
}
Проверка типа страницы WooCommerce:
проверяем страницу Товар
if (is_woocommerce() && (is_single() || is_page())) {
// Здесь свой код, если страница - товар
}
страница является категорией (подкатегория)
if (is_tax('product_cat')) {
// Здесь код, если находимся на странице Категория (Подкатегория)
}
проверяем, является страница тегом (меткой, tag)
if (is_tax('product_tag')) {
// если страница метка
}
находимся на странице личного кабинета
if (is_account_page()) {
// если личный кабинет, то ...
}
проверяем является ли страница корзиной
if (is_cart()) {
// Это корзина и здесь пишем код
}
и конечно же проверить страницу оформления заказа
if (is_checkout()) {
// мы находимся на странице Оформление заказа
}
Подключение нужного шаблона в зависимости от типа страницы, код пишем в файл woocommerce.php о котором писалось выше.
if (is_single() || is_page()) { // Товар
get_template_part('');
} elseif (is_tax()) {
if (is_tax('product_cat')) { // Категория / Подкатегория
get_template_part('');
} elseif (is_tax('product_tag')) { // Метка
get_template_part('');
} else { // Другие таксономии
woocommerce_content();
}
} else { // Каталог товаров
get_template_part('');
}
Узнать (получить) ссылку на магазин (витрину, каталог) WooCommerce
$shop_url = get_permalink(wc_get_page_id('shop'));
Вывод и получение заголовка текущего каталога
single_term_title(); // так выводиться название каталога (заголовок)
$category_title = single_term_title('', 0); // так мы получаем название заголовка
Вывод описания категории
$cat_id = get_queried_object()->term_id; // получаем id текущей категории
$prod_term = get_term($cat_id, 'product_cat'); // получаем данные
echo $description = $prod_term->description; // выводим описание категории
Получить ID текущей категории
$cat_id = get_queried_object()->term_id; // получаем id текущей категории
Получить ID категорий у текущего товара
$categories = get_the_terms($post->ID, 'product_cat'); // получаем категории текущего товара
foreach ($categories as $category) {
$cat_ids = $category->term_id; // товар может находиться в нескольких категориях
echo $cat_ids;
}
Если предыдущий вариант не сработает, то есть попробуйте в woocommerce получить категорию товара по id так:
global $wp_query;
$terms_post = get_the_terms( $post->cat_ID , 'product_cat' );
foreach ($terms_post as $term_cat) {
$term_cat_id = $term_cat->term_id;
echo $term_cat_id;
}
Вывод списка заголовков категорий (по умолчанию список категорий текущего товара выводится через запятую)
echo wc_get_product_category_list($product->get_id()); // вывод названий категорий товара через запятую
Удаляем количество (count) товара в категории
add_filter('woocommerce_subcategory_count_html', 'remove_count');
function remove_count() {
return '';
}
Получить ID товара
echo $product->get_id();
Получить цену товара
echo $product->get_price();
Получить краткое описание товара (Product short description)
echo apply_filters('woocommerce_short_description', $post->post_excerpt);
Вывести главное изображение товара
$product_image_url = get_the_post_thumbnail_url($product->get_id(), 'large');
echo $product_image_url;
или второй вариант
$product_image = wp_get_attachment_image_src( get_post_thumbnail_id(), "medium" );
echo $product_image[0];
Ссылка на плэйсхолдер изображение
echo wc_placeholder_img_src();
Вывод галереи товаров
$attachment_ids = $product->get_gallery_image_ids(); // Получаем id изображений
foreach ($attachment_ids as $attachment_id) {
if ($attachment_id) {
// Вывод URL изображений галереи - размеры изображений WordPress
echo wp_get_attachment_image_src( $attachment_id, 'thumbnail' )[0];
echo wp_get_attachment_image_src( $attachment_id, 'medium' )[0];
echo wp_get_attachment_image_src( $attachment_id, 'full' )[0];
// Вывод URL изображений галереи - размеры изображений WooCommerce
echo $shop_thumbnail_image_url = wp_get_attachment_image_src( $attachment_id, 'shop_thumbnail' )[0];
echo $shop_catalog_image_url = wp_get_attachment_image_src( $attachment_id, 'shop_catalog' )[0];
echo $shop_single_image_url = wp_get_attachment_image_src( $attachment_id, 'shop_single' )[0];
// Вывод изображения (img)
echo wp_get_attachment_image($attachment_id, 'thumbnail');
echo wp_get_attachment_image($attachment_id, 'medium');
echo wp_get_attachment_image($attachment_id, 'full');
echo wp_get_attachment_image($attachment_id, 'shop_thumbnail');
echo wp_get_attachment_image($attachment_id, 'shop_catalog');
echo wp_get_attachment_image($attachment_id, 'shop_single');
}
}
Задать размеры миниатюр изображений в WooCommerce
add_filter('woocommerce_get_image_size_thumbnail', 'add_thumbnail_size', 1, 10);
function add_thumbnail_size($size){
$size['width'] = 420; // ширина в px
$size['height'] = 190; // высота в px
$size['crop'] = 1; // 0 - не обрезаем, 1 - обрезаем
return $size;
}
Проверка наличия атрибутов у товара
if ($product->get_attributes()) {
// если есть атрибуты, то выполнится весь здешний код
}
Вывод атрибутов
wc_display_product_attributes($product);
Получаем вариации WooCommerce товара, если они есть
if ($product->is_type('variable')) {
// это вариативный товар
} else {
// это не вариативный товар
}
Вывод артикула (SKU)
echo $product->get_sku();
Вывод товаров в цикле WordPress
$mypost_Query = new WP_Query(array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => 8,
));
if ($mypost_Query->have_posts()) {
while ($mypost_Query->have_posts()) {
$mypost_Query->the_post();
get_template_part('file-tpl'); // Шаблон для отображения каждого товара
}
} else {
echo ('<p>Извините, нет товаров.</p>');
}
wp_reset_postdata();
Вывод товаров из текущей категории
$cat_id = get_queried_object()->term_id; // Получаем id текущей категории
$mypost_Query = new WP_Query(array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1, // кол-во записей
'tax_query' => array(
array(
'taxonomy' => 'product_cat', // таксономия
'field' => 'id', // тип поля (slug или id)
'terms' => $cat_id // ярлык (slug) или id
)
)
));
Исключить товары определённых категорий
$mypost_Query = new WP_Query(array(
'post_type' => 'product', // post, page, custom_post_type
'post_status' => 'publish', // статус записи
'posts_per_page' => 8, // кол-во постов вывода/загрузки
'tax_query' => array(
array(
'taxonomy' => 'product_cat', // таксономия «Категории товаров»
'field' => 'id', // slug/id
'terms' => array('21', '22'), // термины (slug/id) в примере id категорий 21 и 22
'operator' => 'NOT IN',
)
),
));
Вывод сортировки товаров WooCommerce по умолчанию
woocommerce_catalog_ordering(); // дефолтная сортировка
Получение сортировки в GET-параметрах и использование в WP_Query
if (isset($_GET['orderby'])) { // Если выбрана сортировка пользователем
if ($_GET['orderby'] == 'popularity') { // По популярности
$orderby = "popularity";
$orderby_meta_key = '';
$order = 'ASC';
} else if ($_GET['orderby'] == 'price') { // По цене от низкой до высокой
$orderby = "meta_value_num";
$orderby_meta_key = '_regular_price';
$order = 'ASC';
} else if ($_GET['orderby'] == 'price-desc') { // По цене с высокой до низкой
$orderby = "meta_value_num";
$orderby_meta_key = '_regular_price';
$order = 'DESC';
} else if ($_GET['orderby'] == 'date') { // По дате
$orderby = "date";
$orderby_meta_key = '';
$order = 'DESC';
} else if ($_GET['orderby'] == 'menu_order') { // По умолчанию
$orderby = "menu_order";
$orderby_meta_key = '';
$order = 'ASC';
}
} else { // По умолчанию (не выбрана сортировка)
$orderby = "menu_order";
$orderby_meta_key = '';
$order = 'ASC';
}
// для WP QUERY
'orderby' => $orderby,
'meta_key' => $orderby_meta_key,
'order' => $order,
Вывод количества товаров в корзине WooCommerce
global $woocommerce;
echo WC()->cart->get_cart_contents_count(); // вывод количества товаров
Ссылка на корзину WooCommerce
echo esc_url(wc_get_cart_url());
Ссылка для добавления товара в корзину WooCommerce
<a href="/cart/?add-to-cart=<?php the_ID(); ?>">Добавить в корзину</a>
Вывести корзину и счётчик товаров AJAX
// код добавить в functions.php
add_filter('woocommerce_add_to_cart_fragments', 'header_add_to_cart_fragment');
function header_add_to_cart_fragment($fragments)
{
global $woocommerce;
ob_start();
?>
<div class="cart-icon__count"><?php echo sprintf($woocommerce->cart->cart_contents_count); ?></div>
<?php
$fragments['.cart-icon__count'] = ob_get_clean();
return $fragments;
}
<!-- Этот код добавить где нужно вывести корзину (например в header.php) -->
<div class="cart-icon__count">
<?php
global $woocommerce;
echo sprintf($woocommerce->cart->cart_contents_count);
?>
</div>
AJAX добавление товара в корзину
<form class="cart" action="<?php echo esc_url($product->add_to_cart_url()); ?>" method="post" enctype="multipart/form-data">
<?php woocommerce_quantity_input(); ?>
<button class="add_to_cart_btn" data-id="<?php the_ID(); ?>" type="submit">Добавить в корзину</button>
</form>
<script>
(function ($) {
$(document).on('click', '.add_to_cart_btn', function (e) {
e.preventDefault();
let $this_btn = $(this),
$form = $this_btn.parent('form.cart'),
id = $this_btn.data('id'),
product_qty = $form.find('input[name="quantity"]').val() || 1,
product_id = $form.find('input[name="product_id"]').val() || id,
variation_id = $form.find('input[name="variation_id"]').val() || 0;
let data = {
action: 'woocommerce_ajax_add_to_cart',
product_id: product_id,
product_sku: '',
quantity: product_qty,
variation_id: variation_id,
};
$(document.body).trigger('adding_to_cart', [$this_btn, data]);
$.ajax({
type: 'post',
url: wc_add_to_cart_params.ajax_url,
data: data,
beforeSend: function (response) {
$this_btn.removeClass('added').addClass('loading');
},
complete: function (response) {
$this_btn.addClass('added').removeClass('loading');
},
success: function (response) {
if (response.error & response.product_url) {
window.location = response.product_url;
return;
} else {
$(document.body).trigger('added_to_cart', [response.fragments, response.cart_hash, $this_btn]);
}
// здесь можно добавить оповещение об успешном добавлении в корзину
},
});
return false;
});
})(jQuery);
</script>
// этот код добавить в functions.php
add_action('wp_ajax_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
add_action('wp_ajax_nopriv_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
function woocommerce_ajax_add_to_cart()
{
$product_id = apply_filters('woocommerce_add_to_cart_product_id', absint($_POST['product_id']));
$quantity = empty($_POST['quantity']) ? 1 : wc_stock_amount($_POST['quantity']);
$variation_id = absint($_POST['variation_id']);
$passed_validation = apply_filters('woocommerce_add_to_cart_validation', true, $product_id, $quantity);
$product_status = get_post_status($product_id);
if ($passed_validation && WC()->cart->add_to_cart($product_id, $quantity, $variation_id) && 'publish' === $product_status) {
do_action('woocommerce_ajax_added_to_cart', $product_id);
if ('yes' === get_option('woocommerce_cart_redirect_after_add')) {
wc_add_to_cart_message(array($product_id => $quantity), true);
}
WC_AJAX::get_refreshed_fragments();
} else {
$data = array(
'error' => true,
'product_url' => apply_filters('woocommerce_cart_redirect_after_error', get_permalink($product_id), $product_id)
);
echo wp_send_json($data);
}
wp_die();
}
Ссылка на личный кабинет WooCommerce (functions.php)
// Ссылка на личный кабинет WC в файл functions.php
function account_login_out_link()
{
if (is_user_logged_in()) { // Ссылка на ЛК
echo '<a href="'.get_permalink(wc_get_page_id('myaccount')).'">Аккаунт</a>';
} elseif (!is_user_logged_in()) { # Войти в ЛК
echo '<a href="'.get_permalink(wc_get_page_id('myaccount')).'">Войти</a>';
}
}
// Добавить в шаблон
account_login_out_link();