Как отобразить категории для произвольного типа записей?
У меня есть произвольный тип записей. Я хочу отобразить категории проектов над самими проектами, чтобы посетители могли фильтровать проекты соответствующим образом.
В моем файле functions.php
содержится:
<?php
require_once('portfolio-type.php');
add_filter('excerpt_length', 'my_excerpt_length');
function my_excerpt_length($length) {
return 25;
}
add_filter('excerpt_more', 'new_excerpt_more');
function new_excerpt_more($text){
return ' ';
}
function portfolio_thumbnail_url($pid){
$image_id = get_post_thumbnail_id($pid);
$image_url = wp_get_attachment_image_src($image_id,'screen-shot');
return $image_url[0];
}
?>
В файле 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() {
$args = array(
'label' => __('Портфолио'),
'singular_label' => __('Проект'),
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => true,
'supports' => array('title', 'editor', 'thumbnail')
);
register_post_type( 'portfolio' , $args );
}
register_taxonomy("project-type", array("portfolio"), array("hierarchical" => true, "label" => "Типы проектов", "singular_label" => "Тип проекта", "rewrite" => true));
?>
И наконец, в моем файле index.php:
<!-- Начало проектов -->
<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>

Удалите ваш код из файла portfolio-type.php, который регистрирует тип записи и таксономию (начиная с 9 строки).
Используйте следующий код (в portfolio-type.php) для регистрации типа записи "portfolio"
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' => 8,
'supports' => array('title','editor','thumbnail')
);
register_post_type( 'portfolio' , $args );
}
add_action('init', 'portfolio_register');
Используйте следующий код (в portfolio-type.php) для регистрации таксономии "portfolio_categories" для типа записи "portfolio", сделайте её иерархической (как категории)
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)
<?php
$taxonomy = 'portfolio_categories';
$terms = get_terms($taxonomy); // Получить все термины таксономии
if ( $terms && !is_wp_error( $terms ) ) :
?>
<ul>
<?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;?>
?>
Дайте мне знать, если вам нужно что-то уточнить.

Я заменил код в своем portfolio-type.php на предоставленный вами код, и категории теперь отображаются, но по какой-то причине они не фильтруют проекты.

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

Могли бы вы опубликовать текущий php-код (для всей секции портфолио), который у вас сейчас есть?

Я закоммитил код здесь.

Это может быть лучшим способом загрузить категории после настройки пользовательской таксономии `function displayCategories($post_type_name) { $customPostTaxonomies = get_object_taxonomies($post_type_name);
if(count($customPostTaxonomies) > 0) { foreach($customPostTaxonomies as $tax) { $args = array( 'orderby' => 'name', 'show_count' => 1, 'pad_counts' => 0, 'hierarchical' => 1, 'taxonomy' => $tax, 'title_li' => '' ); wp_list_categories( $args ); } } }`

Этот код работает.
$term_args = array(
'post_type' => 'portfolio', // тип записи
'taxonomy' => 'project-type', // таксономия
'hide_empty' => true, // скрывать пустые
'fields' => 'all' // возвращать все поля
);
$term_query = new WP_Term_Query( $term_args ); // создаем новый запрос терминов
