Как фильтровать записи по категориям в WordPress?

7 авг. 2013 г., 12:31:35
Просмотры: 14.2K
Голосов: 0

У меня есть произвольный тип записей, и теперь мне нужно фильтровать проекты по их категориям без перехода на другую страницу. Также мне нужна категория all, которая будет показывать все проекты. Ссылка на тестовый сайт. Буду благодарен за любую помощь.

portfolio-type.php:

<?php

if ( function_exists( 'add_theme_support' ) ) { 
   add_theme_support( 'post-thumbnails' );
   set_post_thumbnail_size( 270, 170, true ); // Размер миниатюр для записей
   add_image_size( 'screen-shot', 720, 540 ); // Полноразмерный скриншот
}

add_action('init', 'portfolio_register');  

function portfolio_register() {
$labels = array(
   'name' => _x('Портфолио', 'общее название типа записи'),
   'singular_name' => _x('Элемент портфолио', 'название одного элемента типа записи'),
   'add_new' => _x('Добавить новый', 'элемент портфолио'),
   'add_new_item' => __('Добавить новый элемент портфолио'),
   'edit_item' => __('Редактировать элемент портфолио'),
   'new_item' => __('Новый элемент портфолио'),
   'view_item' => __('Просмотреть элемент портфолио'),
   'search_items' => __('Искать элементы портфолио'),
   'not_found' =>  __('Ничего не найдено'),
   'not_found_in_trash' => __('Ничего не найдено в корзине'),
   'parent_item_colon' => ''
);
$args = array(
   'labels' => $labels,
   'public' => true,
   'publicly_queryable' => true,
   'show_ui' => true,
   'query_var' => true,
   'rewrite' => true,
   'capability_type' => 'post',
   'hierarchical' => false,
   'menu_position' => 5,
   'supports' => array('title','editor','thumbnail')
); 
register_post_type( 'portfolio' , $args );
}

function create_portfolio_taxonomies() {
$labels = array(
   'name'              => _x( 'Категории', 'общее название таксономии' ),
   'singular_name'     => _x( 'Категория', 'название одной таксономии' ),
   'search_items'      => __( 'Искать категории' ),
   'all_items'         => __( 'Все категории' ),
   'parent_item'       => __( 'Родительская категория' ),
   'parent_item_colon' => __( 'Родительская категория:' ),
   'edit_item'         => __( 'Редактировать категорию' ),
   'update_item'       => __( 'Обновить категорию' ),
   'add_new_item'      => __( 'Добавить новую категорию' ),
   'new_item_name'     => __( 'Название новой категории' ),
   'menu_name'         => __( 'Категории' ),
);

$args = array(
   'hierarchical'      => true, // Установите 'false' для неиерархической таксономии (как метки)
   'labels'            => $labels,
   'show_ui'           => true,
   'show_admin_column' => true,
   'query_var'         => true,
   'rewrite'           => array( 'slug' => 'categories' ),
);

register_taxonomy( 'portfolio_categories', array( 'portfolio' ), $args );
}
add_action( 'init', 'create_portfolio_taxonomies', 0 );

?>

index.php:

        <!-- Начало страницы портфолио -->

    <section id="portfolio" class="page">
        <div class="container">
            <div class="row">
                <div class="span12">

                    <div class="title">Портфолио</div>
                    <hr>
                    <div class="sub-title visible-desktop">Работы:</div>

                            <!-- Начало фильтров -->

                      <?php

                      $taxonomy = 'portfolio_categories';
                      $terms = get_terms($taxonomy); // Получаем все термины таксономии

                      if ( $terms && !is_wp_error( $terms ) ) :
                      ?>
                          <ul class="option-set" data-option-key="filter">
                            <li class="filter-icon hidden-phone">&#0065;</li>
                              <?php foreach ( $terms as $term ) { ?>
                                  <li><a href="<?php echo get_term_link($term->slug, $taxonomy); ?>" ><?php echo $term->name; ?></a></li>
                              <?php } ?>
                          </ul>
                      <?php endif;?>

                        <!-- Конец фильтров -->            

                        <!-- Начало проектов -->

                    <div id="posts" class="row isotope">


                      <?php if (have_posts()) : while (have_posts()) : the_post(); ?>  

                          <?php  
                              $title= str_ireplace('"', '', trim(get_the_title()));  
                              $desc= str_ireplace('"', '', trim(get_the_content()));  
                          ?>     

                          <div class="item post item span4 isotope-item">

                            <a class="project-wrp fancybox" title="<?=$title?>" rel="lightbox[work]" href="<?php print portfolio_thumbnail_url($post->ID) ?>"><div class="profile-photo"><div class="profile-icon">&#0102;</div><?php the_post_thumbnail(array('230','170'),array('alt' => '')); ?> </div>  
                            <div class="project-name"><?php echo $title; ?></div>
                            <div class="project-client"><?php echo $desc; ?></div>
                            </a>
                          </div>  
                      <?php endwhile; endif; ?>  

                    </div>

                </div>                    
            </div>
        </div>

    </section>

    <!-- Конец страницы портфолио -->
0
Все ответы на вопрос 1
1

Из документации Isotope:

HTML:

<ul id="filters">
  <li><a href="#" data-filter="*">показать все</a></li>
  <li><a href="#" data-filter=".metal">металлы</a></li>
  <li><a href="#" data-filter=".transition">переходные</a></li>
  <li><a href="#" data-filter=".alkali, .alkaline-earth">щелочные и щелочноземельные</a></li>
  <li><a href="#" data-filter=":not(.transition)">не переходные</a></li>
  <li><a href="#" data-filter=".metal:not(.transition)">металлы, но не переходные</a></li>
</ul>
<div id="container">
  <div class="element transition metal">...</div>
  <div class="element post-transition metal">...</div>
  <div class="element alkali metal">...</div>
  <div class="element transition metal">...</div>
  <div class="element lanthanoid metal inner-transition">...</div> 
  <div class="element halogen nonmetal">...</div> 
  <div class="element alkaline-earth metal">...</div>
  ...
</div>

JS логика:

// кешируем контейнер
var $container = $('#container');
// инициализируем isotope
$container.isotope({
  // опции...
});

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

Кажется, вы пропустили атрибут "data-filter" в ваших ссылках фильтрации и класс для фильтрации внутри атрибута class ваших элементов записей. Вы можете вывести slug категории в атрибут "data-filter" и такое же значение в атрибут class ваших элементов записей.

ОБНОВЛЕНИЕ

Согласно новым ответам,

index.php

<!-- Взято из index.php -->

<!-- Начало фильтров -->
<?php
    $taxonomy = 'portfolio_categories';
    $terms = get_terms($taxonomy); // Получаем все термины таксономии

    if ( $terms && !is_wp_error( $terms ) ) :


?>


<ul class="option-set" data-option-key="filter"> 
  <li class="filter-icon hidden-phone">&#0065;</li> 
  <li><a href="#" data-option-value="*">Все</a></li> 
  <?php foreach ( $terms as $term ) { ?> 
  <li><a data-option-value=".<?php echo $term->slug; ?>" href="#" ><?php echo $term->name; ?></a></li> 
<?php } ?> 
</ul>
<?php endif;?>
<!-- Конец фильтров -->

<!-- Начало цикла элементов портфолио -->
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>


<?php  
    $title= str_ireplace('"', '', trim(get_the_title()));  
    $desc= str_ireplace('"', '', trim(get_the_content()));

    /*
     * Примечание: функция get_the_terms() получает все термины таксономии, принадлежащие записи.
     * Возвращает: (array|false|wp_error)
     *  1. массив объектов терминов
     *  2. false если нет терминов в таксономии
     *  3. объект wp_error если указана неверная таксономия
     */

    $termsObj = get_the_terms( $post->ID, 'portfolio_categories' );
    if ( $termsObj && !is_wp_error( $termsObj ) ) :
        //Нам нужен только slug этого/этих терминов, поэтому перебираем результат чтобы получить только значения slug и сохранить в новый массив
        $terms = array();
        foreach( $termsObj as $obj ){
            $terms[] = $obj->slug;
        }
        //Объединяем или преобразуем новый массив в строку и помещаем в атрибут class элемента портфолио
        $termsString = join( ' ', $terms);
    endif;
?>     

<div class="item post item span4 isotope-item <?php echo $termsString; ?>">
    <a class="project-wrp fancybox" title="<?=$title?>" rel="lightbox[work]" href="<?php print portfolio_thumbnail_url($post->ID) ?>">
        <div class="profile-photo"><div class="profile-icon">&#0102;</div><?php the_post_thumbnail(array('230','170'),array('alt' => '')); ?> </div>  
        <div class="project-name"><?php echo $title; ?></div>
        <div class="project-client"><?php echo $desc; ?></div>
    </a>
</div>  

<?php endwhile; endif; ?>
<!-- Конец цикла элементов портфолио -->
7 авг. 2013 г. 13:21:51
Комментарии

давайте продолжим обсуждение в чате

Laniakea Laniakea
7 авг. 2013 г. 23:46:59