Шпаргалка по WooCommerce

Содержание:

Подключение 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();

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх