Вопрос или проблема
В настоящее время я создаю тему для WordPress, используя скрипт isotope.js, который позволяет отображать статьи по одному этапу, фильтруя их по категориям. Я много мучился и до сих пор не могу добиться ожидаемого результата:
Вот ссылка, которая приведет вас к ожидаемому результату (полная версия в HTML / CSS):
https://vgamerz.fr/isotopehelp/gallery/blog.html
Вот моя тема для WordPress (PHP файлы):
<!-- Заголовок Isotope -->
<div class="row">
<div class="col-md-12">
<h2 class="isotope-button-title">Сортировка блога Isotope по</h2>
<div id="isotope-filters" class="isotope-button-group">
<li><a href="#" data-filter="*" class="selected">Все</a></li>
<?php
$terms = get_categories(); // получить все категории, но вы можете использовать любую таксономию
$count = count($terms); //Сколько их?
if ( $count > 0 ){ //Если есть более 0 терминов
foreach ( $terms as $term ) { //для каждого термина:
echo "<button class="button"><a href="#" data-filter=".".$term->slug."">" . $term->name . "</a></button>\n";
//создаем элемент списка с текущим термином slug для сортировки и именем для метки
}
}
?>
</div>
</div>
</div>
<!-- Заголовок Isotope -->
<!--------------------------------------- конец заголовка -------------------------------------->
<!-- Сетка Isotope -->
<div class="row isotope-grid">
<?php
// Циклы
if(have_posts()):
while(have_posts()):
the_post(); ?>
<!-- Элемент сетки Isotope -->
<div class="col-md-3 col-sm-4 col-xs-12 isotope-grid-item design" data-category="<?php get_the_category($post->ID); ?>">
<div class="isotope-item">
<a href="#"><div class="isotope-feature-image"><?php the_post_thumbnail() ?></div>
<h3 class="isotope-title"><a href="<?php the_permalink()?>"><?php the_title(); ?></a></h3>
<p class="isotope-number">Номер поста: <?php the_ID(); ?></p>
<p class="isotope-name">Автор: <?php the_author() ?></p>
<p class="isotope-type">Тип блога: <?php the_category() ?></p>
<p class="isotope-datetime">Дата поста: <?php the_date() ?> в <?php the_time() ?></p>
<p class="isotope-blog"><?php the_content(); ?></p>
</div>
</div>
<!-- Элемент сетки Isotope -->
<?php
Endwhile;
Endif;
?>
</div>
<!-- Конец сетки Isotope -->
<!-- Начало подвала -->
</div>
</body>
</html>
<!-- Конец подвала -->
JS файл (isotope.js):
"use strict";
(function ($){
$.fn.isotope_gallery = function(){
jQuery( function() {
var $container = jQuery('.isotope-grid');
// используйте imagesLoaded, вместо window.load
$container.imagesLoaded( function() {
$container.isotope({
itemSelector: '.isotope-item',
// плиточная компоновка является режимом компоновки по умолчанию, нет необходимости указывать его
});
})
});
// инициализация Isotope
var $grid = $('.isotope-grid').isotope({
itemSelector: '.isotope-grid-item',
layoutMode: 'fitRows',
isFitWidth: true,
getSortData: {
name: '.isotope-name',
title: '.isotope-title',
details: '.isotope-details',
symbol: '.isotope-symbol',
type: '.isotope-type',
number: '.isotope-number',
category: '[data-category]',
//вы можете добавить сюда больше сортировочных классов, таких как эти
}
});
// функции фильтрации
var filterFns = {
// показать, если число больше 50
numberGreaterThan50: function() {
var number = $(this).find('.number').text();
return parseInt( number, 10 ) > 50;
},
// показать, если имя заканчивается на -ium
ium: function() {
var name = $(this).find('.name').text();
return name.match( /ium$/ );
}
};
// привязка клика по кнопке фильтра
$('#isotope-filters').on( 'click', 'button', function() {
var filterValue = $( this ).attr('data-filter');
// используйте filterFn, если совпадает значение
filterValue = filterFns[ filterValue ] || filterValue;
$grid.isotope({ filter: filterValue });
});
// привязка клика по кнопке сортировки
$('#isotope-sorts').on( 'click', 'button', function() {
var sortByValue = $(this).attr('data-sort-by');
$grid.isotope({ sortBy: sortByValue });
});
// изменение класса is-checked на кнопках
$('.isotope-button-group').each( function( i, buttonGroup ) {
var $buttonGroup = $( buttonGroup );
$buttonGroup.on( 'click', 'button', function() {
$buttonGroup.find('.is-checked').removeClass('is-checked');
$( this ).addClass('is-checked');
});
});
// Выбор и цикл контейнера элементов, которые вы хотите уравнять
$('.isotope-grid').each(function(){
// Кешируем самую высокую
var highestBox = 0;
// Выбор и цикл элементов, которые вы хотите уравнять
$('.isotope-grid-item', this).each(function(){
// Если этот блок выше, чем кешированная высокая, то сохраняем его
if($(this).height() > highestBox) {
highestBox = $(this).height();
}
});
// Устанавливаем высоту всех этих дочерних элементов на ту, которая была самой высокой
$('.isotope-grid-item',this).height(highestBox);
});
}
$(this).isotope_gallery();
}(jQuery));
Спасибо за вашу помощь!
Можете попробовать:
<?php if (have_posts()): ?>
<?php while (have_posts()): the_post(); ?>
<?php
$categories = get_the_category();
$listCategories = [];
foreach ($categories as $category) {
$listCategories[] = $category->slug;
}
?>
<!-- Элемент сетки Isotope -->
<div class="col-md-3 col-sm-4 col-xs-12 isotope-grid-item <?php echo implode(' ', $listCategories); ?>" data-category="<?php echo implode(',', $listCategories); ?>">
<div class="isotope-item">
<a href="#">
<div class="isotope-feature-image"><?php the_post_thumbnail() ?></div>
<h3 class="isotope-title"><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3>
<p class="isotope-number">Номер поста: <?php the_ID(); ?></p>
<p class="isotope-name">Автор: <?php the_author() ?></p>
<p class="isotope-type">Тип блога: <?php the_category() ?></p>
<p class="isotope-datetime">Дата поста: <?php the_date() ?> в <?php the_time() ?></p>
<p class="isotope-blog"><?php the_content(); ?></p>
</a>
</div>
</div>
<!-- Элемент сетки Isotope -->
<?php endwhile; ?>
<?php endif; ?>
Посты могут иметь более одной категории, если вы посмотрите на источник, вы, вероятно, увидите [массив], или если вы включите отчет об ошибках PHP, получите ошибку.
Ответ или решение
Вопрос, с которым вы сталкиваетесь, связан с использованием библиотеки Isotope.js для фильтрации постов на WordPress по категориям. Разберем вашу проблему и предложим решение, чтобы обеспечить корректную работу фильтрации в вашем проекте.
Анализ Проблемы
Как правило, проблемы с фильтрацией постов в Isotope.js возникают из-за неправильного использования классов CSS и атрибутов данных, особенно когда пост может принадлежать нескольким категориям.
В текущем коде:
<div class="col-md-3 col-sm-4 col-xs-12 isotope-grid-item design " data-category="<?php get_the_category($post->ID); ?>">
Вы используете функцию get_the_category()
, которая возвращает массив объектов категорий, а не строку, что может привести к ошибкам при попытке фильтрации.
Решение
Для решения этой проблемы вы должны собрать слаги категорий в массив и объединить их в строку, которая будет присвоена атрибуту data-category
. Также необходимо добавить эти слоги к классам элемента div
, чтобы Isotope мог правильно их фильтровать.
Примените следующий код вместо вашего текущего фрагмента в цикле while
:
<?php if (have_posts()): ?>
<?php while (have_posts()): the_post(); ?>
<?php
$categories = get_the_category();
$listCategories = [];
foreach ($categories as $category) {
$listCategories[] = $category->slug; // Собираем слоги категорий
}
?>
<!-- Isotope Grid-Item -->
<div class="col-md-3 col-sm-4 col-xs-12 isotope-grid-item <?php echo implode(' ', $listCategories); ?>" data-category="<?php echo implode(',', $listCategories); ?>">
<div class="isotope-item">
<a href="#">
<div class="isotope-feature-image"><?php the_post_thumbnail(); ?></div>
<h3 class="isotope-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<p class="isotope-number">Post No: <?php the_ID(); ?></p>
<p class="isotope-name">Author: <?php the_author(); ?></p>
<p class="isotope-type">Blog Type: <?php the_category(); ?></p>
<p class="isotope-datetime">Post Date: <?php the_date(); ?> at <?php the_time(); ?></p>
<p class="isotope-blog"><?php the_content(); ?></p>
</a>
</div>
</div>
<!-- Isotope Grid-Item -->
<?php endwhile; ?>
<?php endif; ?>
Объяснение Изменений
-
Сбор слогов категорий: Код собирает слоги всех категорий, к которым принадлежит пост, и сохраняет их в массив
$listCategories
. -
Присвоение атрибутов: При помощи
implode()
массив слогов объединяется в одну строку, что позволяет использовать его как значение атрибутаdata-category
и как классы в элементеdiv
. Таким образом, элемент будет правильно распознаваться Isotope.js для фильтрации.
Заключение
С следованием вышеуказанным рекомендациям, ваша проблема с фильтрацией постов по категориям с использованием Isotope.js должна быть успешно решена. Убедитесь в том, что вы обновили ISotope.js и правильно инициализировали его скрипт после внесения изменений в код. Это позволит создать адаптивную и интуитивную фильтрацию контента, соответствующую современным стандартам веб-разработки. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!