В одной из предыдущих статей мы научились вызывать ajax’ом содержимое записи. Теперь настроим и доработаем данный функционал для товаров woocommerce.
Создание функционала
Техническая часть (скрипты, стили) остается той же что и при подгрузке записей. т.е. мы должны создать скрытое всплывающее окно, которое выводится в момент подгрузки содержимого товара.
Я добавил кнопку закрытия окна (ее нужно создавать сразу на скрытом окне, чтобы на нее мог воздействовать скрипт)
add_action( 'popup-windows', 'supernova', 5 ); function supernova() { echo '<div class="popup supernova"><p class="close"><i class="fa fa-times" aria-hidden="true"></i></p><div id="ajax-response"></div></div>'; }
Хук добавления иконки вызова Просмотра товара
function ajaxpreviewproductbutton () { $idproduct = get_the_ID(); echo '<a href="#" id="'; echo $idproduct; echo '" class="ajax-post postview"><i class="fa fa-eye"></i></a>'; } add_action( 'woocommerce_after_shop_loop_item', 'ajaxpreviewproductbutton' );
Немного изменим вывод шаблона Просмотра товара, выделив его в отдельный файл (loading-single-product.php)
add_action( 'wp_ajax_theme_post_example', 'theme_post_example_init' ); add_action( 'wp_ajax_nopriv_theme_post_example', 'theme_post_example_init' ); function theme_post_example_init() { /* Made Query */ $args = array( 'p' => $_POST['id'],'post_type' => array( 'product' ) ); $theme_post_query = new WP_Query( $args ); while( $theme_post_query->have_posts() ) : $theme_post_query->the_post(); ?> <?php include(__DIR__."/loading-single-product.php"); ?> <?php endwhile; exit; }
Шаблон Просмотра товара и его оформление
Я закоментировал стандартный вывод карточки товара (//do_action( ‘woocommerce_single_product_summary’ );) чтобы больше кастомизировать шаблон:
<div id="product-<?php the_ID(); ?>" <?php post_class(); ?>><div class="preview-block"> <?php global $product; ?> <div id="preview-gallery"><?php echo get_the_post_thumbnail( $post->ID, 'shop_single', $attributes ); ?></div> <div id="preview-information"> <?php do_action( 'the_woocommerce_single_title' ); ?> <p class="price"><?php echo $product->get_price_html(); ?></p> <?php echo the_excerpt(); ?> <?php //do_action( 'woocommerce_single_product_summary' ); ?> <?php if ($product->stock_status == 'instock') { echo '<p class="stock in-stock"><i class="fa fa-check-circle-o" aria-hidden="true"></i> в наличии</p>'; } else { echo '<p class="stock out-of-stock"><i class="fa fa-times-circle-o" aria-hidden="true"></i> нет наличии</p>'; } ?> <?php if($product->get_type() == "variable"){ echo '</a>'; woocommerce_variable_add_to_cart(); } else { echo '</a>'; woocommerce_template_loop_add_to_cart(); } ?> </div> </div></div>
Основной проблемой данной динамической верстки является то, что элементы требующие обработки и взаимодействия с jQuery ее не получают, т.к. изначально всех этих объектов нет в DOM. Перестает работать выборка свойств вариативного товара, измененные кнопки количества, галерея (лайтбокс) и прочие элементы требующие в своей работе jQuery.
Вариант предложенной верстки подойдет для простых (не вариативных товаров). Оформление всплывающего просмотра я постарался сделать максимально лаконичным
Стили
.supernova { width: 900px; min-height: 400px; margin-top: -250px; margin-left: -450px; border-radius: 0px !important; } .supernova .hentry {width: 100%; margin: 0;} .preview-block {display: flex;} #preview-gallery {width: 60%;} #preview-information {width: 40%; padding: 30px; background: white;} #preview-information .product_title, #preview-information .price {width: 100%; min-height: auto;} #preview-information .star-rating {float: left;} #preview-information p, #preview-information .variations {margin-bottom: 30px;} #preview-information .stock {text-align: left; padding: 0;} #preview-information .product_meta, #preview-information .woocommerce-review-link, #preview-information .quantity {display: none;} .supernova .close {right: 15px; top: 15px; color: #aaa;} .supernova .close .fa {margin-right: 0;} @media screen and (max-device-width: 480px) { .supernova { width: 300px; margin-left: -150px; height: 600px; margin-top: -300px; overflow-y: scroll; } .preview-block { flex-wrap: wrap; } #preview-gallery, #preview-information {width: 100%;} .supernova .close { background: white; border-radius: 15px; line-height: 25px; } } .postview { position: absolute; top: 5px; right: 5px; height: auto !important; width: auto !important; background-color: #fff; padding: 5px; border-radius: 25px; opacity: 0.2; z-index: 9; }
Необходимые доработки
Я недавно делал обзор плагинов по созданию этого же функционала, и исходя из того что в них входило в моем функционале нужно доработать:
- Работоспособность скриптов (возможно применять синтаксис jQuery с динамическими элементами)
- Полноценная галерея изображений с лайтбоксом и увеличением при наведении
- Система лэйблов
- Переключение быстрого просмотра соседних по категории товаров
Здравствуйте.
У меня сейчас стоит такая же задача по созданию плагины quick view. И сталкнулся с теме же проблемами по выводу вариативных товаров, что и вы описываете. Скажите, получилось их решить?
Я пользуюсь плагином WPC Smart Quick View for WooCommerce. Многие моменты в нем предусмотрены.
Приятно читать стать, где есть prodigy 🤘
Да, Prodigy огонь! Слышал недавно что они работают над новым альбомом. Без Кейта, думаю, уже не то конечно, но все же интересно будет послушать.