Șabloane personalizate pentru taxonomii în Custom Post Types

13 sept. 2013, 08:06:22
Vizualizări: 19.3K
Voturi: 2

Am creat un Custom Post Type numit "Anunț" și o taxonomie asociată numită "tip". Am adăugat câțiva termeni în categoria Tip, precum "Radio", "TV", "Tipărit".

Doresc ca WordPress să folosească șabloane diferite single.php pentru fiecare termen. De exemplu, un șablon Radio care să difere de cel pentru Tipărit.

Am încercat cu taxonomy-ad-type-radio.php, single-ad-type-radio.php și alte variante similare. Care este cea mai bună metodă de a realiza acest lucru?

Am adăugat filtre în fișierul functions.php fără succes. Cred că omit ceva foarte simplu. Mulțumesc pentru ajutor!

<?php 

/** Înregistrarea post type-ului pentru anunțuri **/

add_action( 'init', 'register_cpt_ad' );

function register_cpt_ad() {

    $labels = array( 
        'name' => _x( 'Anunțuri', 'ad' ),
        'singular_name' => _x( 'Anunț', 'ad' ),
        'add_new' => _x( 'Adaugă nou', 'ad' ),
        'add_new_item' => _x( 'Adaugă anunț nou', 'ad' ),
        'edit_item' => _x( 'Editează anunț', 'ad' ),
        'new_item' => _x( 'Anunț nou', 'ad' ),
        'view_item' => _x( 'Vezi anunț', 'ad' ),
        'search_items' => _x( 'Caută anunțuri', 'ad' ),
        'not_found' => _x( 'Niciun anunț găsit', 'ad' ),
        'not_found_in_trash' => _x( 'Niciun anunț găsit în Coș', 'ad' ),
        'parent_item_colon' => _x( 'Anunț părinte:', 'ad' ),
        'menu_name' => _x( 'Anunțuri', 'ad' ),
    );

    $args = array( 
        'labels' => $labels,
        'hierarchical' => false,
        'description' => 'Sistem de anunțuri',
        'supports' => array( 'title', 'excerpt', 'editor', 'thumbnail', 'custom-fields' ),
        'taxonomies' => array( 'category', 'type', 'campaign', 'post_tag' ),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,     
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'has_archive' => true,
        'query_var' => true,
    'menu_position' => 3,
        'can_export' => true,
        'rewrite' => true,
        'capability_type' => 'post'
    );

    register_post_type( 'ad', $args );
}

/** Înregistrarea taxonomiei pentru tipurile de anunțuri **/
add_action( 'init', 'register_taxonomy_type' );

function register_taxonomy_type() {

    $labels = array( 
        'name' => _x( 'Tip Anunț', 'type' ),
        'singular_name' => _x( 'Tipuri Anunț', 'type' ),
        'search_items' => _x( 'Caută Tip Anunț', 'type' ),
        'popular_items' => _x( 'Tipuri Anunț Populare', 'type' ),
        'all_items' => _x( 'Toate Tipurile de Anunț', 'type' ),
        'parent_item' => _x( 'Tip Anunț Părinte', 'type' ),
        'parent_item_colon' => _x( 'Tip Anunț Părinte:', 'type' ),
        'edit_item' => _x( 'Editează Tip Anunț', 'type' ),
        'update_item' => _x( 'Actualizează Tip Anunț', 'type' ),
        'add_new_item' => _x( 'Adaugă Tip Anunț Nou', 'type' ),
        'new_item_name' => _x( 'Nume Tip Anunț Nou', 'type' ),
        'separate_items_with_commas' => _x( 'Separați tipurile de anunț cu virgule', 'type' ),
        'add_or_remove_items' => _x( 'Adaugă sau elimină tipuri de anunț', 'type' ),
        'choose_from_most_used' => _x( 'Alege din cele mai folosite tipuri de anunț', 'type' ),
        'menu_name' => _x( 'Tip Anunț', 'type' ),
    );

    $args = array( 
        'labels' => $labels,
        'public' => true,
        'show_in_nav_menus' => true,
        'show_ui' => true,
        'show_tagcloud' => true,
        'hierarchical' => true,
        'rewrite' => true,
        'query_var' => true
    );

    register_taxonomy( 'type', array('ad'), $args );
}

/** Înregistrarea taxonomiei pentru campanii **/
add_action( 'init', 'register_taxonomy_campaign' );

function register_taxonomy_campaign() {

    $labels = array( 
        'name' => _x( 'Campanii', 'campaign' ),
        'singular_name' => _x( 'Campanie', 'campaign' ),
        'search_items' => _x( 'Caută Campanii', 'campaign' ),
        'popular_items' => _x( 'Campanii Populare', 'campaign' ),
        'all_items' => _x( 'Toate Campaniile', 'campaign' ),
        'parent_item' => _x( 'Campanie Părinte', 'campaign' ),
        'parent_item_colon' => _x( 'Campanie Părinte:', 'campaign' ),
        'edit_item' => _x( 'Editează Campanie', 'campaign' ),
        'update_item' => _x( 'Actualizează Campanie', 'campaign' ),
        'add_new_item' => _x( 'Adaugă Campanie Nouă', 'campaign' ),
        'new_item_name' => _x( 'Nume Campanie Nouă', 'campaign' ),
        'separate_items_with_commas' => _x( 'Separați campaniile cu virgule', 'campaign' ),
        'add_or_remove_items' => _x( 'Adaugă sau elimină campanii', 'campaign' ),
        'choose_from_most_used' => _x( 'Alege din cele mai folosite campanii', 'campaign' ),
        'menu_name' => _x( 'Campanii', 'campaign' ),
    );

    $args = array( 
        'labels' => $labels,
        'public' => true,
        'show_in_nav_menus' => true,
        'show_ui' => true,
        'show_tagcloud' => true,
        'hierarchical' => true,
        'rewrite' => true,
        'query_var' => true
    );

    register_taxonomy( 'campaign', array('ad'), $args );
}

function query_post_type($query) {
    $post_types = get_post_types();

    if ( is_category() || is_tag()) {

        $post_type = get_query_var('ad');

        if ( $post_type ) {
            $post_type = $post_type;
        } else {
            $post_type = $post_types;
        }

        $query->set('post_type', $post_type);

        return $query;
    }
}

add_filter('pre_get_posts', 'query_post_type');

/* FUNCȚIONALITĂȚI NOI */

// Înregistrează coloana
function price_column_register( $columns ) {
$columns['level'] = __( 'Nivel Utilizator', 'my-plugin' );

return $columns;
}
add_filter( 'manage_edit-ad_columns', 'price_column_register' );

// Afișează conținutul coloanei
function price_column_display( $column_name, $post_id ) {
if ( 'level' != $column_name )
    return;
$roles = get_post_meta( $post->ID, '_members_access_role', true );
if ($roles == 'level1') echo 'level1';
echo 'salut';
}
add_action( 'manage_posts_custom_column', 'price_column_display', 10, 2 );

/**
 * Adaugă termenii din multiple taxonomii la lista
 * de clase generate de post_class().
 *
 * @since 2010-07-10
 * @alter 2012-01-06
 */
function mysite_post_class( $classes, $class, $ID ) {

    $taxonomies = array(
        'type',
        'campaign',
    );

    $terms = get_the_terms( (int) $ID, $taxonomies );

    if ( is_wp_error( $terms ) || empty( $terms ) )
        return $classes;

    foreach ( (array) $terms as $term ) {
        if ( ! in_array( $term->slug, $classes ) )
            $classes[] = $term->slug;
    }

    return $classes;
}

add_filter( 'post_class', 'mysite_post_class', 10, 3 );
add_filter( 'tpicker_taxonomies', 'my_tpicker_taxonomies' );
function my_tpicker_taxonomies( $old_taxies) { // Filtrează ordinea taxonomiilor

    foreach( array("Categorii ", "Campanii ", "Tip Anunț " ) as $tax_label) {
        $new_taxies[$tax_label] = $old_taxies[$tax_label];
    }

    return $new_taxies;
}
0
Toate răspunsurile la întrebare 1
10

Cred că îți lipesc câteva concepte sau nu le înțelegi pe deplin.

  1. O taxonomie este un mod de a grupa lucruri, de exemplu postări. Aceeași taxonomie poate fi folosită pentru mai multe tipuri de postări, deci o taxonomie nu este subordonată unei postări.
  2. Fișierele șablon single sunt folosite pentru afișarea unei singure postări. Poți crea un șablon diferit pentru fiecare tip de postare, chiar și pentru fiecare postare individuală.
  3. Șablonul specific pentru un termen dintr-o taxonomie este taxonomy-{your_taxonomy}-{term}.php, în cazul tău ar fi de exemplu taxonomy-type-radio.php. Acest șablon va afișa toate postările din cadrul termenului radio din taxonomia 'type'.

Cred că ceea ce vrei de fapt este să folosești un șablon single diferit bazat pe termenul din taxonomia "type" asociat unei postări de tip 'Ad'. Presupun că doar un termen din taxonomia 'type' poate fi selectat per postare. Poți folosi filtrul template_include, sau mai precis, filtrul single_template:

<?php
function get_custom_single_template($single_template) {
    global $post;

    if ($post->post_type == 'ad') {
        $terms = get_the_terms($post->ID, 'type');
        if($terms && !is_wp_error( $terms )) {
            //Facem un foreach deoarece $terms este un array dar se presupune că este doar un termen
            foreach($terms as $term){
                $single_template = dirname( __FILE__ ) . '/single-'.$term->slug.'.php';
            }
        }
     }
     return $single_template;
}

add_filter( "single_template", "get_custom_single_template" ) ;
?>

Pune acest cod în fișierul functions.php al temei tale. Nu uita să creezi fișierele single-*.php pentru fiecare termen (single-radio.php, single-tv.php, etc).

Dacă nu ai nevoie de un fișier șablon complet și ai nevoie doar de mici modificări, cum ar fi clase CSS diferite, poți verifica dacă postarea are termenul și să-i atribui o clasă diferită. De exemplu, într-un șablon single obișnuit:

 <div class="<?php echo class="<?php echo has_term( 'radio', 'type' ) ? 'radio' : ''; ?>">
   <?php the_cotent();?>
</div>

Sau

<?php
$terms = get_the_terms($post->ID, 'type');
$class = '';
//Facem un foreach deoarece $terms este un array dar se presupune că este doar un termen
foreach($terms as $term){
    $class = $term->slug;
}
?>
<div class="<?php echo $class; ?>">
   <?php the_cotent();?>
</div>
13 sept. 2013 08:39:58
Comentarii

Da! Vreau să am un șablon diferit pentru fiecare "tip". Deci, dacă postarea single este în categoria radio, atunci să încarce șablonul single radio. Iartă-mi ignoranța, dar unde pun codul tău? În fișierul functions?

Ben Ben
13 sept. 2013 09:20:01

Da, în fișierul functions.php. De asemenea, trebuie să creezi single-radio.php, single-tv.php și așa mai departe... în directorul temei tale.

cybmeta cybmeta
13 sept. 2013 13:01:47

Asta am crezut și eu și am făcut toate astea, dar din nu știu ce motiv, încarcă doar din single-ad.php. Refuză să ia în considerare orice alt șablon single. Chiar și când elimin single-ad.php, nu caută niciun alt fișier single. Poate dezvoltatorul temei a pus ceva pe undeva care să spună să încarce doar din acel singur fișier. Doar că nu îl pot găsi ;-(

Ben Ben
13 sept. 2013 17:04:11

Pentru a te putea ajuta mai departe, am nevoie să văd codul pe care îl folosești pentru înregistrarea tipului de postare personalizat și a taxonomiei personalizate. Poți să editezi întrebarea ta și să adaugi codul?

cybmeta cybmeta
13 sept. 2013 18:13:41

Poți să încerci din nou codul din răspunsul meu? L-am editat.

cybmeta cybmeta
13 sept. 2013 18:22:50

Tocmai am adăugat tot dar a creat erori în locuri ciudate din cauza acoladelor {}. Sper că poți citi totul bine. Citește totul ca un singur fișier functions.php lung. Mulțumesc mult... dacă poți rezolva asta, vei fi eroul meu!!

Ben Ben
13 sept. 2013 19:13:41

Ai încercat din nou codul din răspunsul meu? L-am editat și ți-am cerut să încerci din nou, dar nu ai spus dacă ai încercat sau nu.

cybmeta cybmeta
13 sept. 2013 19:50:55

Din nu știu ce motiv, acel cod îmi afișează doar o pagină albă goală, fără nimic pe ea. Strică toate articolele individuale, nu doar cele cu radio.

Ben Ben
14 sept. 2013 00:07:36

Îmi cer scuze, aveam o greșeală de scriere. Încearcă din nou, am testat și funcționează la mine.

cybmeta cybmeta
14 sept. 2013 00:19:16

Jan, ești noul meu cel mai bun prieten!!! acum funcționează perfect!!

Ben Ben
14 sept. 2013 02:25:41
Arată celelalte 5 comentarii