Cum să afișez categoriile pentru un Custom Post Type?
Am un tip de postare personalizat (custom post type). Ceea ce doresc să fac este să afișez categoriile proiectelor chiar deasupra proiectelor, astfel încât vizitatorii să poată filtra proiectele în consecință.
În fișierul meu functions.php
am:
<?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){
// Returnează un spațiu gol
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];
}
?>
În portfolio-type.php
:
<?php
if ( function_exists( 'add_theme_support' ) ) {
add_theme_support( 'post-thumbnails' );
set_post_thumbnail_size( 270, 170, true ); // Miniaturi normale pentru postări
add_image_size( 'screen-shot', 720, 540 ); // Dimensiune completă pentru ecran
}
add_action('init', 'portfolio_register');
function portfolio_register() {
$args = array(
'label' => __('Portofoliu'),
'singular_label' => __('Proiect'),
'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" => "Tipuri de Proiecte", "singular_label" => "Tip Proiect", "rewrite" => true));
?>
Și în final, în index.php am:
<!-- Început Proiecte -->
<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>

Eliminați codul din portfolio-type.php care înregistrează tipul de post și taxonomia (de la linia 9 încolo).
Folosiți următorul cod (în portfolio-type.php) pentru a înregistra tipul de post "portfolio"
function portfolio_register() {
$labels = array(
'name' => _x('Portfolio', 'nume general tip post'),
'singular_name' => _x('Element Portfolio', 'nume singular tip post'),
'add_new' => _x('Adaugă nou', 'element portfolio'),
'add_new_item' => __('Adaugă element nou în Portfolio'),
'edit_item' => __('Editează element Portfolio'),
'new_item' => __('Element nou în Portfolio'),
'view_item' => __('Vezi element Portfolio'),
'search_items' => __('Caută elemente în Portfolio'),
'not_found' => __('Nu s-a găsit nimic'),
'not_found_in_trash' => __('Nu s-a găsit nimic în Coșul de gunoi'),
'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');
Folosiți următorul cod (în portfolio-type.php) pentru a înregistra o taxonomie "portfolio_categories" pentru tipul de post "portfolio", făcând-o ierarhică (ca categoriile)
function create_portfolio_taxonomies() {
$labels = array(
'name' => _x( 'Categorii', 'nume general taxonomie' ),
'singular_name' => _x( 'Categorie', 'nume singular taxonomie' ),
'search_items' => __( 'Caută Categorii' ),
'all_items' => __( 'Toate Categoriile' ),
'parent_item' => __( 'Categorie Părinte' ),
'parent_item_colon' => __( 'Categorie Părinte:' ),
'edit_item' => __( 'Editează Categorie' ),
'update_item' => __( 'Actualizează Categorie' ),
'add_new_item' => __( 'Adaugă Categorie Nouă' ),
'new_item_name' => __( 'Nume Categorie Nouă' ),
'menu_name' => __( 'Categorii' ),
);
$args = array(
'hierarchical' => true, // Setează 'false' pentru taxonomie neierarhică (ca etichetele)
'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 );
Apoi folosiți următorul cod pentru a prelua termenii taxonomiei în fișierele de șablon (ca index.php)
<?php
$taxonomy = 'portfolio_categories';
$terms = get_terms($taxonomy); // Obține toți termenii unei taxonomii
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;?>
?>
Anunțați-mă dacă aveți nevoie de clarificări.

Am înlocuit codul în fișierul meu portfolio-type.php cu codul pe care l-ai furnizat și am reușit să afișez categoriile, dar din nu știu ce motiv, acestea nu filtrează proiectele.

Primele două fragmente de cod pe care le-am furnizat erau pentru funcționalitatea din back-end. Al treilea fragment vă permite să obțineți numele categoriilor.
Permite-mi să verific din nou site-ul tău și să văd ce lipsește acum.

Ai putea, te rog, să postezi codul PHP (pentru întreaga secțiune de portofoliu) pe care îl ai acum?

Am comitat codul aici.

Aceasta ar putea fi o metodă mai bună de a încărca categoriile după configurarea taxonomiei personalizate `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 ); } } }`
