Cum să afișez categoriile pentru un Custom Post Type?

1 aug. 2013, 10:40:31
Vizualizări: 171K
Voturi: 9

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">&#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
Toate răspunsurile la întrebare 3
7
19

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.

1 aug. 2013 11:11:14
Comentarii

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.

Laniakea Laniakea
1 aug. 2013 11:47:55

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.

Rahul Verma Rahul Verma
1 aug. 2013 13:30:05

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

Rahul Verma Rahul Verma
1 aug. 2013 13:33:12

Am comitat codul aici.

Laniakea Laniakea
1 aug. 2013 13:55:43

Voi începe un thread nou legat de filtrarea categoriilor.

Laniakea Laniakea
5 aug. 2013 10:14:04

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 ); } } }`

Eyo Okon Eyo Eyo Okon Eyo
29 sept. 2016 01:26:31

Ar trebui să fie $args = array( 'hide_empty' => false, ); $terms = get_terms($taxonomy, $args) pentru a vedea lista chiar și atunci când categoriile nu au articole.

X9DESIGN X9DESIGN
6 feb. 2018 10:22:45
Arată celelalte 2 comentarii
0

Pentru lista de categorii ale postărilor din portofoliu, folosește:

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

Acest cod funcționează.

$term_args = array(
        'post_type'              => 'portfolio',
         'taxonomy'               => 'project-type',
        'hide_empty'             => true,
        'fields'                 => 'all'
      );
    $term_query = new WP_Term_Query( $term_args );
9 feb. 2021 14:39:02