Как фильтровать записи по категориям в 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">A</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">f</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>
<!-- Конец страницы портфолио -->

Laniakea
503
Все ответы на вопрос
1
1
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">A</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">f</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; ?>
<!-- Конец цикла элементов портфолио -->

iEmanuele
1.62K
7 авг. 2013 г. 13:21:51
Комментарии
давайте продолжим обсуждение в чате

7 авг. 2013 г. 23:46:59
Похожие вопросы
2
ответов
1
ответов