Как отобразить категории для произвольного типа записей?

1 авг. 2013 г., 10:40:31
Просмотры: 171K
Голосов: 9

У меня есть произвольный тип записей. Я хочу отобразить категории проектов над самими проектами, чтобы посетители могли фильтровать проекты соответствующим образом.

В моем файле 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">&#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>
0
Все ответы на вопрос 3
7
19

Удалите ваш код из файла 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;?>

?>

Дайте мне знать, если вам нужно что-то уточнить.

1 авг. 2013 г. 11:11:14
Комментарии

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

Laniakea Laniakea
1 авг. 2013 г. 11:47:55

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

Позвольте мне снова просмотреть ваш сайт и понять, чего сейчас не хватает.

Rahul Verma Rahul Verma
1 авг. 2013 г. 13:30:05

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

Rahul Verma Rahul Verma
1 авг. 2013 г. 13:33:12

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

Laniakea Laniakea
1 авг. 2013 г. 13:55:43

Я создам новую тему для обсуждения фильтрации по категориям.

Laniakea Laniakea
5 авг. 2013 г. 10:14:04

Это может быть лучшим способом загрузить категории после настройки пользовательской таксономии `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 ); } } }`

Eyo Okon Eyo Eyo Okon Eyo
29 сент. 2016 г. 01:26:31

Должно быть $args = array( 'hide_empty' => false, ); $terms = get_terms($taxonomy, $args), чтобы видеть список, даже если у категорий нет записей.

X9DESIGN X9DESIGN
6 февр. 2018 г. 10:22:45
Показать остальные 2 комментариев
0

Для вывода списка категорий портфолио в записи используйте:

<?php echo get_the_term_list(get_the_ID(), 'portfolio_category', '', ', ', ''); ?>
15 янв. 2017 г. 10:15:41
0

Этот код работает.

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