Не удается отобразить посты при фильтрации категорий с использованием isotope.js.

Вопрос или проблема

В настоящее время я создаю тему для 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; ?>

Объяснение Изменений

  1. Сбор слогов категорий: Код собирает слоги всех категорий, к которым принадлежит пост, и сохраняет их в массив $listCategories.

  2. Присвоение атрибутов: При помощи implode() массив слогов объединяется в одну строку, что позволяет использовать его как значение атрибута data-category и как классы в элементе div. Таким образом, элемент будет правильно распознаваться Isotope.js для фильтрации.

Заключение

С следованием вышеуказанным рекомендациям, ваша проблема с фильтрацией постов по категориям с использованием Isotope.js должна быть успешно решена. Убедитесь в том, что вы обновили ISotope.js и правильно инициализировали его скрипт после внесения изменений в код. Это позволит создать адаптивную и интуитивную фильтрацию контента, соответствующую современным стандартам веб-разработки. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...