Как можно реализовать простой фильтр на WordPress?
мучаюсь с реализацией фильтра, на сайте натянутом на WP.
с помощью какого нибудь плагина это возможно реализовать...
Есть сайт, на нем есть рубрика "Кейсы", в этой рубрике изначально выводились карточки кейсов
следующим методом
<div class="row"> <?php if ( have_posts() ) : ?> <?php while ( have_posts() ) : the_post(); ?> <div class="case-col col-lg-4 col-md-6"> <div class="new-caseItem" style="background-image:url(<?php the_post_thumbnail_url();?>);"> <div class="new-caseItem-content"> <div class="new-caseItem-tags"><?php the_tags( '', ', '); ?></div> <div class="new-caseItem-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></div> <div class="new-caseItem-expect"><?php the_field( 'what_was_done' ); ?></div> <div class="new-caseItem-button"><a class="btn-new" href="<?php the_permalink(); ?>">Читать кейс</a> </div> </div> </div> </div> <?php endwhile; else : get_template_part( 'template-parts/content', 'none' ); endif; ?> </div> |
<div class="row"> <?php if ( have_posts() ) : ?> <?php while ( have_posts() ) : the_post(); ?> <div class="case-col col-lg-4 col-md-6"> <div class="new-caseItem" style="background-image:url(<?php the_post_thumbnail_url();?>);"> <div class="new-caseItem-content"> <div class="new-caseItem-tags"><?php the_tags( '', ', '); ?></div> <div class="new-caseItem-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></div> <div class="new-caseItem-expect"><?php the_field( 'what_was_done' ); ?></div> <div class="new-caseItem-button"><a class="btn-new" href="<?php the_permalink(); ?>">Читать кейс</a> </div> </div> </div> </div> <?php endwhile; else : get_template_part( 'template-parts/content', 'none' ); endif; ?> </div>
Я переделал карточки под статичный вывод, по единичности вывел их
вот как они выглядят
<div class="case-col col-lg-4 col-md-6 magazine"> <div class="new-caseItem" style="background-image:url();"> <div class="new-caseItem-content"> <div class="new-caseItem-tags"><a href="" rel="tag">Интернет-магазин</a></div> <div class="new-caseItem-title"><a href="">Магазин по продаже септиков Септик Маркет</a></div> <div class="new-caseItem-expect">Увеличили розницу на 60% за счет поискового продвижения</div> <div class="new-caseItem-button"><a class="btn-new" href="">Читать кейс</a></div> </div> </div> </div> <div class="case-col col-lg-4 col-md-6 magazine"> <div class="new-caseItem" style="background-image:url();"> <div class="new-caseItem-content"> <div class="new-caseItem-tags"><a href="" rel="tag">Интернет-магазин</a></div> <div class="new-caseItem-title"><a href="">Ural Sound — интернет-магазин автозвука</a></div> <div class="new-caseItem-expect">Органический трафик вырос до 1,86 млн. пользователей</div> <div class="new-caseItem-button"><a class="btn-new" href="">Читать кейс</a></div> </div> </div> </div> |
<div class="case-col col-lg-4 col-md-6 magazine"> <div class="new-caseItem" style="background-image:url();"> <div class="new-caseItem-content"> <div class="new-caseItem-tags"><a href="" rel="tag">Интернет-магазин</a></div> <div class="new-caseItem-title"><a href="">Магазин по продаже септиков Септик Маркет</a></div> <div class="new-caseItem-expect">Увеличили розницу на 60% за счет поискового продвижения</div> <div class="new-caseItem-button"><a class="btn-new" href="">Читать кейс</a></div> </div> </div> </div> <div class="case-col col-lg-4 col-md-6 magazine"> <div class="new-caseItem" style="background-image:url();"> <div class="new-caseItem-content"> <div class="new-caseItem-tags"><a href="" rel="tag">Интернет-магазин</a></div> <div class="new-caseItem-title"><a href="">Ural Sound — интернет-магазин автозвука</a></div> <div class="new-caseItem-expect">Органический трафик вырос до 1,86 млн. пользователей</div> <div class="new-caseItem-button"><a class="btn-new" href="">Читать кейс</a></div> </div> </div> </div>
Код сверху выводит две карточки, главный атрибут является тег
Я добавил к главному родительскому div классы для идентифицирования по типу ( .magazine, .remont) <div class="new-caseItem-tags"><a href="" rel="tag">Интернет-магазин</a></div> |
Я добавил к главному родительскому div классы для идентифицирования по типу ( .magazine, .remont) <div class="new-caseItem-tags"><a href="" rel="tag">Интернет-магазин</a></div>
По нему нужно производить сортировку.
И я попытался реализовать фильтр с помощью Jquery, добавив скрипт в конце файла
<script type="text/javascript"> // Фильтр кейсов jQuery(function(){ tail.select('select.select-ads', { placeholder: 'Рекламная площадка', multiShowCount: false,multiContainer: '.tail-move-container' }); tail.select('select.select-otrasl', { placeholder: 'Отрасль бизнеса', multiShowCount: false,multiContainer: '.tail-move-container' }); //строки бывшего программиста, выводящие меню фильтров на экран var MedCheck = false; var autotemCheck = false; var kosmetologCheck = false; var magazineCheck = false; var stomatologCheck = false; $('li').on('click', function(event){ $('.case-col').addClass('hide'); var data = $(this).data('key'); if ((data == "Медицина") && (MedCheck == false)) { $('.med').removeClass('hide'); MedCheck = true; } else if ((data == "Медицина") && (MedCheck == true)) { $('.med').addClass('hide'); MedCheck = false; }; if ((data == "Автозапчасти") && (autotemCheck == false)) { $('.autotem').removeClass('hide'); autotemCheck = true; } else if ((data == "Автозапчасти") && (autotemCheck == true)) { $('.autotem').addClass('hide'); autotemCheck = false; }; if ((data == "Стоматология") && (stomatologCheck == false)) { $('.stomatolog').removeClass('hide'); stomatologCheck = true; } else if ((data == "Стоматология") && (stomatologCheck == true)) { $('.stomatolog').addClass('hide'); stomatologCheck = false; }; if ((data == "Косметология") && (kosmetologCheck == false)) { $('.kosmetolog').removeClass('hide'); kosmetologCheck = true; } else if ((data == "Косметология") && (kosmetologCheck == true)) { $('.kosmetolog').addClass('hide'); kosmetologCheck = false; }; if ((data == "Интернет-магазин") && (magazineCheck == false)) { $('.magazine').removeClass('hide'); magazineCheck = true; } else if ((data == "Интернет-магазин") && (magazineCheck == true)) { $('.magazine').addClass('hide'); magazineCheck = false; }; if ((MedCheck == false) && (kosmetologCheck == false) && (magazineCheck == false) && (stomatologCheck == false) && (autotemCheck == false)) { $('.case-col').removeClass('hide'); }; event.stopPropagation(); }); }); </script> |
<script type="text/javascript"> // Фильтр кейсов jQuery(function(){ tail.select('select.select-ads', { placeholder: 'Рекламная площадка', multiShowCount: false,multiContainer: '.tail-move-container' }); tail.select('select.select-otrasl', { placeholder: 'Отрасль бизнеса', multiShowCount: false,multiContainer: '.tail-move-container' }); //строки бывшего программиста, выводящие меню фильтров на экран var MedCheck = false; var autotemCheck = false; var kosmetologCheck = false; var magazineCheck = false; var stomatologCheck = false; $('li').on('click', function(event){ $('.case-col').addClass('hide'); var data = $(this).data('key'); if ((data == "Медицина") && (MedCheck == false)) { $('.med').removeClass('hide'); MedCheck = true; } else if ((data == "Медицина") && (MedCheck == true)) { $('.med').addClass('hide'); MedCheck = false; }; if ((data == "Автозапчасти") && (autotemCheck == false)) { $('.autotem').removeClass('hide'); autotemCheck = true; } else if ((data == "Автозапчасти") && (autotemCheck == true)) { $('.autotem').addClass('hide'); autotemCheck = false; }; if ((data == "Стоматология") && (stomatologCheck == false)) { $('.stomatolog').removeClass('hide'); stomatologCheck = true; } else if ((data == "Стоматология") && (stomatologCheck == true)) { $('.stomatolog').addClass('hide'); stomatologCheck = false; }; if ((data == "Косметология") && (kosmetologCheck == false)) { $('.kosmetolog').removeClass('hide'); kosmetologCheck = true; } else if ((data == "Косметология") && (kosmetologCheck == true)) { $('.kosmetolog').addClass('hide'); kosmetologCheck = false; }; if ((data == "Интернет-магазин") && (magazineCheck == false)) { $('.magazine').removeClass('hide'); magazineCheck = true; } else if ((data == "Интернет-магазин") && (magazineCheck == true)) { $('.magazine').addClass('hide'); magazineCheck = false; }; if ((MedCheck == false) && (kosmetologCheck == false) && (magazineCheck == false) && (stomatologCheck == false) && (autotemCheck == false)) { $('.case-col').removeClass('hide'); }; event.stopPropagation(); }); }); </script>
Суть в том что я добавляю к ненужным карточкам класс .hide
Имеющий код CSS:
.hide { position:absolute; visibility: hidden; } |
.hide { position:absolute; visibility: hidden; }
Таким образом ненужные карточки я скрываю, а у нужных я убираю этот класс при условии если он имеется.
Но мой вариант реализации имеет кучу недостатков
Можно глянуть по ссылке
https://digitalriff.ru/cases/
Пока что реализовал недофильтр на отрасли бизнеса. Но если натыкать несколько ещё и удалить один, всё пойдёт по одному месту...
Теперь вопрос к тем кто уже может имел дело с такой задачей:
Какие другие варианты есть реализации?
Может какой плагин накатить?
Хотелось бы оставить метод вывода карточек с помощью запроса php...
Дополнительно:
как ваиант:
перепишите свой код js. отслеживайте изменение
$('#MY_orderby').change(function(){'use strict';... |
$('#MY_orderby').change(function(){'use strict';...
выпадающего списка. при этом добавляйте в разметку рядом кнопку применить (какой-нибудь span c id = postFilter) или по умолчанию скрытой (при change показывайте), или всегда видимой, например. по нажатию кнопки сохраняйте куку в зависимости от выбранного из списка и сразу после сохранения window.location.reload(). ну а дальше тупо в php смотрите куку и в зависимости от ключа выдавайте соответствующий контент через add_filter('pre_get_posts' например.
ну или простенькую форму и теже куки, но через post/get запрос
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос



Для реализации простого фильтра на WordPress можно воспользоваться функцией `pre_get_posts`, которая позволяет изменить параметры запроса перед выполнением основного запроса.
Прежде всего, создадим функцию, которая будет добавлять фильтр к запросу. Например, мы хотим отфильтровать посты по категории "новости". Вот пример кода:
function custom_filter_posts( $query ) { if ( !is_admin() && $query->is_main_query() && $query->is_home() ) { $query->set( 'category_name', 'news' ); } } add_action( 'pre_get_posts', 'custom_filter_posts' );
Этот код проверяет, что мы не находимся на странице администратора, что это основной запрос (не дополнительный) и что мы на главной странице. Затем он устанавливает параметр запроса `category_name` равным "news", что означает, что будут отображаться только посты из категории "новости".
Вы можете адаптировать этот код под свои нужды, изменяя условия и параметры запроса. Например, вы можете фильтровать посты по тегу, автору, дате и т.д.
Надеюсь, это поможет вам реализовать простой фильтр на вашем сайте WordPress.