WordPress и фильтрация с помощью Isotope

8 мар. 2012 г., 22:53:37
Просмотры: 16K
Голосов: 4

Я пытаюсь использовать Isotope(http://isotope.metafizzy.co/) для фильтрации моих записей WordPress. http://i44.tinypic.com/fco55k.jpg вот как выглядит мой сайт, я хочу фильтровать записи в зависимости от категории, поэтому мне нужно добавить класс к каждой записи и затем фильтровать с помощью isotope

  <li><a href="#" data-filter="*">показать все</a></li>
  <li><a href="#" data-filter=".design">дизайн</a></li>
  <li><a href="#" data-filter=".typo">типографика</a></li>

это названия моих категорий, и затем я хочу добавить класс к записи в зависимости от категории, к которой она принадлежит.

<div id="main">
          <?php
          $args = array('orderby' => 'rand' );
          $random = new WP_Query($args); ?>
          <?php if(have_posts()) : ?><?php while($random->have_posts()) : $random->the_post(); ?>
         <a href="<?php the_permalink() ?>"> <div id="img" class="<?php  $category = get_the_category(); 
                echo $category[0]->cat_name; ?>">
            <?php 
                the_post_thumbnail();?>

            <h1><?php the_title(); ?></h1>
</div></a>

и используемый JavaScript

    <script type="text/javascript">
jQuery(window).load(function(){
jQuery('#main').isotope({
  masonry: {
    columnWidth: 20
  },

});
$('#filters a').click(function(event){
  var selector = $(this).attr('data-filter');
  $('#main').isotope({ filter: selector });
  return false;
});
});

</script>
4
Комментарии

Добро пожаловать на WPSE! Не могли бы вы уточнить ваш вопрос, чтобы лучше объяснить, в чем именно заключается ваша проблема, вопрос или задача? Что вы пытаетесь достичь? Что не работает правильно или не соответствует ожиданиям?

Chip Bennett Chip Bennett
8 мар. 2012 г. 23:03:15

Это не совсем вопрос по WordPress. Ознакомьтесь с документацией isotope. Ваша разметка неверна - посты должны быть обернуты в div с классом, соответствующим классам в меню фильтрации.

Chris_O Chris_O
8 мар. 2012 г. 23:32:17

isotope работает отлично, все мои посты красиво располагаются с его помощью, но я хотел бы фильтровать посты по категориям, поэтому мне нужно добавить имя класса к каждому посту и затем фильтровать их с помощью isotope

dinosauuur dinosauuur
8 мар. 2012 г. 23:41:23

"я хотел бы фильтровать записи в зависимости от категории, поэтому мне нужно добавить имя класса к каждой записи, а затем отфильтровать их с помощью isotope" - Пожалуйста, обновите свой вопрос этой информацией, так как она более точно описывает то, что вы пытаетесь сделать.

Chip Bennett Chip Bennett
9 мар. 2012 г. 00:18:16
Все ответы на вопрос 5
0

Вы можете использовать эту функцию:

Поместите это в файл functions.php

function isotope_categories() {

        $categories = get_categories();

        $html = '<ul class="filters option-set" data-option-key="filter">';
        $html .= '<li><a href="#filter" data-option-value="*" class="selected">Все элементы</a></li>';

        foreach ($categories as $category) {

            $html .= "<li><a href='#filter' data-option-value='.category-{$category->category_nicename}'>{$category->cat_name}</a></li>";   
        }

        $html .= '</ul>';

        echo $html;
    }

Затем вызовите эту функцию в файле, где находится ваш контейнер Isotope.

Например:

<nav class="options">                       
    <?php isotope_categories() ?>
</nav>  

Это выведет правильную разметку для Isotope.

Если вы создадите новые записи в админке WordPress и привяжете к ним категории, они будут отображаться и фильтроваться.

16 сент. 2012 г. 13:57:16
1

Я тоже пытался интегрировать jQuery Isotope плагин с WordPress, когда наткнулся на эту тему. Если вам все еще нужна помощь, вот как это сработало у меня. Мой метод немного отличался, так как я создал пользовательский тип записей "проекты", которые нужно было фильтровать по проектам_categories - пользовательской таксономии.

Шаблон страницы требовал следующего PHP кода для генерации списка #projects-filter и блока #projects.

<?php
$terms = get_terms('project_categories');
$count = count($terms);
if ( $count > 0 ){
echo '<ul id="projects-filter">';
echo '<li><a href="#" data-filter="*">Все</a></li>';
foreach ( $terms as $term ) {
    $termname = strtolower($term->name);  
    $termname = str_replace(' ', '-', $termname);  
    echo '<li><a href="#" data-filter="' . '.' . $termname . '">' . $term->name . '</a></li>';
}
echo '</ul>';
}
?>

<?php 
    $loop = new WP_Query(array('post_type' => 'projects', 'posts_per_page' => -1));
    $count =0;
?>

<div id="project-wrapper">
    <div id="projects">

    <?php if ( $loop ) : 

        while ( $loop->have_posts() ) : $loop->the_post(); ?>

            <?php
            $terms = get_the_terms( $post->ID, 'project_categories' );

            if ( $terms && ! is_wp_error( $terms ) : 
                $links = array();

                foreach ( $terms as $term ) 
                {
                    $links[] = $term->name;
                }
                $links = str_replace(' ', '-', $links); 
                $tax = join( " ", $links );     
            else :  
                $tax = '';  
            endif;
            ?>

            <?php $infos = get_post_custom_values('wpcf-proj_url'); ?>

            <div class="project-item <?php echo strtolower($tax); ?>">
                <div class="thumb"><a href="<?php the_permalink() ?>"><?php the_post_thumbnail( 'projects-thumb' ); ?></a></div>
                <h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3>
                <p class="excerpt"><a href="<?php the_permalink() ?>"><?php echo get_the_excerpt(); ?></a></p>
                <p class="links"><a href="<?php echo $infos[0]; ?>" target="_blank">Посмотреть онлайн →</a> <a href="<?php the_permalink() ?>">Подробнее →</a></p>
            </div>

        <?php endwhile; else: ?>

        <div class="error-not-found">Извините, в портфолио пока нет записей.</div>

    <?php endif; ?>


    </div>

    <div class="clearboth"></div>

</div> <!-- end #project-wrapper-->

А вот JavaScript, который делает всю магию.

jQuery(document).ready(function(){
    var mycontainer = jQuery('#projects');
    mycontainer.isotope({ 
        filter: '*',
        animationOptions: {
            duration: 750,
            easing: 'liniar',
            queue: false,
        }
    }); 

    jQuery('#projects-filter a').click(function(){ 
        var selector = jQuery(this).attr('data-filter'); 
        mycontainer.isotope({ 
            filter: selector,
            animationOptions: {
                duration: 750,
                easing: 'liniar',
                queue: false,
            } 
        }); 
      return false; 
    });
});
1 мая 2013 г. 17:50:30
Комментарии

Привет, Кёртис, мне интересен твой ответ. Я попробовал твой код, и кажется, что переход не такой плавный, как ожидалось. Пожалуйста, проверь, не упустил ли я что-то.

markyeoj markyeoj
13 авг. 2013 г. 10:52:20
3

Сначала оберните вывод поста в <div> и добавьте шаблонный тег <?php post_class(); ?> к этому <div>.

Итак, измените это:

<a href="<?php the_permalink() ?>"> <div id="img" class="<?php  $category = get_the_category(); echo $category[0]->cat_name; ?>">
    <?php the_post_thumbnail();?>

    <h1><?php the_title(); ?></h1>
</div></a>

...на это:

<div <?php post_class(); ?>
    <a href="<?php the_permalink() ?>"> <div id="img">
        <?php the_post_thumbnail();?>

        <h1><?php the_title(); ?></h1>
    </div></a>
</div>

Теперь, если вы прочитаете документацию post_class() (ссылка выше), вы увидите, что среди прочих классов этот шаблонный тег добавляет класс category-{slug}. (Для ваших примеров категорий, post_class() добавит category-design или category-typo.

Таким образом, вам просто нужно будет использовать category-{slug} для реализации фильтра isotope.

9 мар. 2012 г. 00:33:01
Комментарии

Вы можете использовать post_class() и для элементов a. Нет необходимости в дополнительном div.

fuxia fuxia
9 мар. 2012 г. 00:48:17

Верно; вы можете разместить post_class() где угодно, главное - чтобы это было внутри цикла Loop. :) Если фильтру Isotope нужно, чтобы класс применялся к якорю, тогда, конечно, поместите его внутри тега <a>.

Chip Bennett Chip Bennett
9 мар. 2012 г. 00:53:35

Помещение тега code внутрь тега div решило проблему для меня! Большое спасибо!

dinosauuur dinosauuur
9 мар. 2012 г. 00:58:49
0

Еще не разобрались с Isotope и фильтрами? 😕

Есть 2 момента, которые вы могли упустить:

  1. Фильтры нужно обернуть в класс (чтобы jQuery мог обрабатывать клики по ссылкам), вот так:

    <ul id="options">
    <li><a href="#" data-filter="*">показать все</a></li>
    <li><a href="#" data-filter=".web">веб</a></li>
    <li><a href="#" data-filter=".mobile">мобильные</a></li>
    </ul>
    

Обратите внимание: значения data-filter чувствительны к регистру (они не будут работать, если не совпадают с вашими категориями WordPress или тем, что вы используете).

  1. jQuery-код Isotope нужно адаптировать для WordPress - чтобы он работал в режиме no-conflict

Вот оригинальный код из документации Isotope:

// фильтрация элементов при клике на фильтр
$('#filters a').click(function(){
var selector = $(this).attr('data-filter');
$container.isotope({ filter: selector });
return false;
});

А вот код, адаптированный для WordPress:

// фильтрация элементов при клике на фильтр
jQuery('#options a').click(function(){
var selector = jQuery(this).attr('data-filter');
mycontainer.isotope({ filter: selector });
return false;
});

Важно: этот код нужно добавить после основного скрипта Isotope. И обратите внимание, что #options - это класс из вашего HTML-списка фильтров :)

Рабочий пример можно посмотреть на damien.co/isotope

Надеюсь, это вам помогло? 😊

15 июн. 2012 г. 00:18:07
1

Добавьте animationEngnine: 'jquery' - и анимация станет более плавной.

var mycontainer = jQuery('#projects');
mycontainer.isotope({ 
    filter: '*',
    animationEngine: 'jquery',
    animationOptions: {
    duration: 350,
    easing: 'linear',
    queue: true
    }
}); 

jQuery('#projects-filter a').click(function(){ 
    var selector = jQuery(this).attr('data-filter'); 
    mycontainer.isotope({ 
        filter: selector,
        animationOptions: {
            duration: 350,
            easing: 'linear',
            queue: true,
        } 
    }); 
  return false; 
});
5 нояб. 2013 г. 05:05:31
Комментарии

Это не ответ на вопрос...

Nicolai Grossherr Nicolai Grossherr
15 дек. 2013 г. 00:34:15