Задать вопрос
@trenton

В чем конфликт ajax фильтра и модалки?

Давно хотел адаптировать под себя ajax-фильтр товаров. Если для этого дела нужна целая консультация, я готов обговорить условия, очень хочу и фильтр, и сохранить именно свою модалку quick view, без плагинов. Кто в таких штуках хорошо шарит, и копали еще глубже меня, помогите и мне, инфы мало.

Подскажите, в чем тут конфликт, почему в отфильтрованном виде модалка не открывается, если остальное все подхватывается - стили, вишлист, тоже "самописный"(то есть модифицированный под себя). Я пока не пойму. Может в запрос фильтра надо продублировать и данные модалки, чтоб они были в одном ajax запросе? Других идей нет почему они конфликтуют.

Вот такой вариант фильтрации.
Пока не разобрал его до конца, в процессе.
https://drive.google.com/file/d/1CjXhlD54YODD76vFq...
Виджет лежит в inc/widgets.
Js-часть в assets/js/filter.js
И еще часть кода в functions.php после всех require.
Урок в ютубе, последние 2 часа. https://www.youtube.com/watch?v=YkTvLVif3yI

Моя модалка быстрого просмотра
add_action( 'woocommerce_before_shop_loop_item_title', 'themename_loop_product_div_image_close', 30);
function themename_loop_product_div_image_close(){  
  global $product;
  ?>
  <div class="loop-product_bottom loop-product_bottom_sub1">
    <ul class="loop-product_bottom-ul">
      <li>
        <a href="#" data-toggle="modal" data-target="#modal-product" data-product-id="<?php echo $product->get_id();?>" class="modal-product-link">
          <span class="fa-eye-wrap"><span class="fa-eye"></span></span>          
        </a>
      </li> 
<?php }

add_action( 'wp_ajax_ajax_quick_view', 'themename_quick_view_product_callback' );
add_action( 'wp_ajax_nopriv_ajax_quick_view', 'themename_quick_view_product_callback' );
function themename_quick_view_product_callback(){

	if ( ! wp_verify_nonce( $_POST['nonce'], 'quick-nonce' ) ) {
		wp_die( 'Данные отправлены с левого адреса' );
	}
	global $post, $woocommerce, $product;
	$product = wc_get_product(esc_attr($_POST['id']));
	ob_start();	
	?>
	<div class="modal-body row">
		<div class="modal-body-left col-md-5">
			<?php 
			$attachment_id = get_post_thumbnail_id( $product->get_id() );
			$product_thub = wp_get_attachment_image_url($attachment_id, 'shop_single'); ?>
			<img src="<?php echo $product_thub;?>" >

			<div class="modal-gal d-flex">
				<?php 
				$attachment_ids = $product->get_gallery_attachment_ids();
				  
				foreach( $attachment_ids as $attachment_id ) {
				  echo wp_get_attachment_image( $attachment_id, 'woocommerce_gallery_thumbnail' );
				}
 				?>
			</div>

		</div>
		<div class="modal-body-right col-md-7">
			<h2><?php echo $product->get_name();?></h2>			
			<p><?php $rating  = $product->get_average_rating();
					$count   = $product->get_rating_count();
					echo wc_get_rating_html( $rating, $count ); ?></p>	
			<div class="modal-price mb-20">
				<?php echo $product->get_price_html();?></div>
			<p class="mb-20"><?php echo $product->get_short_description(); ?></p>	
			<p class="mb-20 cat-popup"><?php echo $product->get_categories(); ?></p>
			<div class="modal-buttons">
				<?php
				if ( $product->is_type( 'variation' ) ) {
				?>
              <form class="cart" action="<?php echo esc_url( apply_filters( 'woocommerce_add_to_cart_form_action', $product->get_permalink() ) ); ?>" method="post" enctype='multipart/form-data'>
                <?php woocommerce_single_variation_add_to_cart_button(); ?>
             </form>
              <?php
            } else {
              woocommerce_template_single_add_to_cart();
            }?>				
			</div>
			
		</div>
	</div>
	<?php  
	$data['product'] = ob_get_clean();
	wp_send_json( $data);
	wp_die();
}


JS часть модалки
jQuery(document).ready(function ($) {
    $('a.modal-product-link').on('click', function () {
        var productId = $(this).attr('data-product-id');
        console.log(productId);
        var data = {
            id:productId,
            action:'ajax_quick_view',
            nonce: ajax_quick.nonce
        };
        $.ajax({
            url:ajax_quick.url,
            data:data,
            type: 'POST',
            dataType: 'json',
            beforeSend:function(xhr){
               $('#modal-product .modal-body').text('Загрузка');
            },
            success:function(data){
                console.log(data);
                $('#modal-product .modal-content section').html(data.product);
            }
        });
    })
});
  • Вопрос задан
  • 56 просмотров
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 1
Так все очень просто.
Вы привязки в js делаейте при подгрузке страницы. Потом когда работает фильтр, он все элементы на странице удаляет, и создает новые. И вуаля, все Ваши привязки отвязаны.

Решений как всегда несколько
1 - Восстанавливать Ваши привязки после каждого процесса фильтрации. Это не сложно. Код кривязки закидываете в функцию и вызываете ее снова после фильтрации.
2 - Использовать делегирование, т.е привязывать на неудаляемого родителя. Обычно привязывают сразу на document? но можно и на body или еще что то близкое к карточкам товаров. Считаю это более правильным решением.

Для 2го варианта вместо
jQuery(document).ready(function ($) {
    $('a.modal-product-link').on('click', function () {


ставим
jQuery(document).ready(function ($) {
    $(document).on('click', 'a.modal-product-link', function () {
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы