Template singoli per tassonomia di Custom Post Type

13 set 2013, 08:06:22
Visualizzazioni: 19.3K
Voti: 2

Ho creato un Custom Post Type chiamato "Ad" e una tassonomia sotto di esso chiamata "type". Ho aggiunto alcuni termini nella categoria Type come "Radio", "TV", "Print". Vorrei che WordPress utilizzasse un template single.php diverso per ogni termine. Vorrei avere un template Radio diverso da quello Print. Ho provato taxonomy-ad-type-radio.php e single-ad-type-radio.php e ogni altra combinazione simile. Qualcuno può dirmi qual è il modo migliore per ottenere questo risultato?

Ho anche aggiunto filtri al mio file functions.php senza successo. So che mi sto perdendo qualcosa di molto semplice. Grazie mille per il vostro aiuto.

<?php 

/** Registra il post type per gli annunci **/

add_action( 'init', 'register_cpt_ad' );

function register_cpt_ad() {

    $labels = array( 
        'name' => _x( 'Annunci', 'ad' ),
        'singular_name' => _x( 'annuncio', 'ad' ),
        'add_new' => _x( 'Aggiungi nuovo', 'ad' ),
        'add_new_item' => _x( 'Aggiungi nuovo annuncio', 'ad' ),
        'edit_item' => _x( 'Modifica annuncio', 'ad' ),
        'new_item' => _x( 'Nuovo annuncio', 'ad' ),
        'view_item' => _x( 'Visualizza annuncio', 'ad' ),
        'search_items' => _x( 'Cerca annunci', 'ad' ),
        'not_found' => _x( 'Nessun annuncio trovato', 'ad' ),
        'not_found_in_trash' => _x( 'Nessun annuncio trovato nel cestino', 'ad' ),
        'parent_item_colon' => _x( 'Annuncio genitore:', 'ad' ),
        'menu_name' => _x( 'Annunci', 'ad' ),
    );

    $args = array( 
        'labels' => $labels,
        'hierarchical' => false,
        'description' => 'Sistema Adbank',
        '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 );
}

/** Registra la tassonomia per i tipi di annuncio **/
add_action( 'init', 'register_taxonomy_type' );

function register_taxonomy_type() {

    $labels = array( 
        'name' => _x( 'Tipo Annuncio', 'type' ),
        'singular_name' => _x( 'Tipi Annuncio', 'type' ),
        'search_items' => _x( 'Cerca Tipo Annuncio', 'type' ),
        'popular_items' => _x( 'Tipi Annuncio popolari', 'type' ),
        'all_items' => _x( 'Tutti i Tipi Annuncio', 'type' ),
        'parent_item' => _x( 'Tipi Annuncio genitore', 'type' ),
        'parent_item_colon' => _x( 'Tipi Annuncio genitore:', 'type' ),
        'edit_item' => _x( 'Modifica Tipi Annuncio', 'type' ),
        'update_item' => _x( 'Aggiorna Tipi Annuncio', 'type' ),
        'add_new_item' => _x( 'Aggiungi nuovi Tipi Annuncio', 'type' ),
        'new_item_name' => _x( 'Nuovi Tipi Annuncio', 'type' ),
        'separate_items_with_commas' => _x( 'Separa i tipi di annuncio con virgole', 'type' ),
        'add_or_remove_items' => _x( 'Aggiungi o rimuovi tipi di annuncio', 'type' ),
        'choose_from_most_used' => _x( 'Scegli tra i tipi di annuncio più usati', 'type' ),
        'menu_name' => _x( 'Tipo Annuncio', '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 );
}

/** Registra la tassonomia per le campagne **/
add_action( 'init', 'register_taxonomy_campaign' );

function register_taxonomy_campaign() {

    $labels = array( 
        'name' => _x( 'Campagne', 'campaign' ),
        'singular_name' => _x( 'Campagna', 'campaign' ),
        'search_items' => _x( 'Cerca campagne', 'campaign' ),
        'popular_items' => _x( 'Campagne popolari', 'campaign' ),
        'all_items' => _x( 'Tutte le campagne', 'campaign' ),
        'parent_item' => _x( 'Campagna genitore', 'campaign' ),
        'parent_item_colon' => _x( 'Campagna genitore:', 'campaign' ),
        'edit_item' => _x( 'Modifica Campagna', 'campaign' ),
        'update_item' => _x( 'Aggiorna Campagna', 'campaign' ),
        'add_new_item' => _x( 'Aggiungi nuova Campagna', 'campaign' ),
        'new_item_name' => _x( 'Nuova Campagna', 'campaign' ),
        'separate_items_with_commas' => _x( 'Separa le campagne con virgole', 'campaign' ),
        'add_or_remove_items' => _x( 'Aggiungi o rimuovi campagne', 'campaign' ),
        'choose_from_most_used' => _x( 'Scegli tra le campagne più usate', 'campaign' ),
        'menu_name' => _x( 'Campagne', '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');

/* NUOVO CODICE */

// Registra la colonna
function price_column_register( $columns ) {
$columns['level'] = __( 'Livello Utente', 'my-plugin' );

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

// Mostra il contenuto della colonna
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 'ciao';
}
add_action( 'manage_posts_custom_column', 'price_column_display', 10, 2 );

/**
 * Aggiunge i termini di multiple tassonomie alla lista
 * di classi generate da 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) { // Filtra l'ordine delle tassonomie

    foreach( array("Categorie ", "Campagne ", "Tipo Annuncio " ) as $tax_label) {
        $new_taxies[$tax_label] = $old_taxies[$tax_label];
    }

    return $new_taxies;
}
0
Tutte le risposte alla domanda 1
10

Penso che ti manchino alcuni concetti o che non li abbia compresi appieno.

  1. Una tassonomia è un modo per raggruppare elementi, ad esempio post. La stessa tassonomia può essere utilizzata per diversi tipi di post, quindi una tassonomia non è sotto un post.
  2. I template file single vengono utilizzati per la visualizzazione di un singolo post. Puoi creare un template single diverso per ogni tipo di post, persino per ogni singolo post.
  3. Il template specifico per un termine di una tassonomia è taxonomy-{tua_tassonomia}-{termine}.php, nel tuo caso, ad esempio, sarebbe taxonomy-type-radio.php. Questo template mostrerà tutti i post all'interno del termine radio della tassonomia 'type'.

Penso che quello che vuoi realmente fare sia utilizzare un template single diverso basato sul termine della tassonomia "type" associato a un post di tipo 'Ad'. Assumo che solo un termine della tassonomia 'type' possa essere selezionato per post. Puoi usare il filtro template_include, o più specificamente, il filtro 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 )) {
            //Fai un foreach perché $terms è un array ma dovrebbe contenere solo un termine
            foreach($terms as $term){
                $single_template = dirname( __FILE__ ) . '/single-'.$term->slug.'.php';
            }
        }
     }
     return $single_template;
}

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

Inserisci questo nel file functions.php del tuo tema. Non dimenticare di creare i file single-*.php per ogni termine (single-radio.php, single-tv.php, ecc.).

Se non hai bisogno di un intero file template e ti bastano piccole modifiche, come classi CSS diverse, puoi verificare se il post ha il termine e assegnare una classe diversa. Ad esempio, in un template single comune:

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

Oppure

<?php
$terms = get_the_terms($post->ID, 'type');
$class = '';
//Fai un foreach perché $terms è un array ma dovrebbe contenere solo un termine
foreach($terms as $term){
    $class = $term->slug;
}
?>
<div class="<?php echo $class; ?>">
   <?php the_cotent();?>
</div>
13 set 2013 08:39:58
Commenti

Sì! Voglio avere un template diverso per ogni "tipo". Quindi se il singolo post è nella categoria radio, allora dovrebbe utilizzare il template single-radio. Perdonami l'ignoranza ma dove devo inserire il tuo codice? Nel file functions?

Ben Ben
13 set 2013 09:20:01

Sì, nel file functions.php. Inoltre devi creare single-radio.php, single-tv.php e così via... nella cartella del tuo tema.

cybmeta cybmeta
13 set 2013 13:01:47

È quello che pensavo e ho fatto tutto questo, ma per qualche motivo prende solo dal single-ad.php e si rifiuta di considerare qualsiasi altro single-template. Anche quando elimino il single-ad.php, non cerca altri file single. Forse lo sviluppatore del tema ha inserito qualcosa da qualche parte per dire di prendere solo da quel file. Non riesco proprio a trovarlo ;-(

Ben Ben
13 set 2013 17:04:11

Per aiutarti ulteriormente ho bisogno di vedere il codice che stai usando per registrare il custom post type e la tassonomia personalizzata. Puoi modificare la tua domanda e aggiungere il codice?

cybmeta cybmeta
13 set 2013 18:13:41

Puoi provare nuovamente il codice della mia risposta? L'ho modificato.

cybmeta cybmeta
13 set 2013 18:22:50

L'ho appena aggiunto tutto ma ha causato interruzioni in punti strani a causa delle parentesi graffe {}. Spero tu riesca a leggerlo bene. Leggilo tutto come un unico functions.php lungo. Grazie mille... se riesci a risolvere questo sarai il mio eroe!!

Ben Ben
13 set 2013 19:13:41

Hai provato di nuovo il codice della mia risposta? L'ho modificato e ti ho chiesto di riprovare, ma non hai detto se ci hai provato o meno.

cybmeta cybmeta
13 set 2013 19:50:55

Per qualche motivo quel codice mi restituisce solo una pagina bianca vuota senza alcun contenuto. Manda in tilt tutti i post singoli, non solo quelli con i radio button.

Ben Ben
14 set 2013 00:07:36

Scusa, c'era un errore di battitura. Riprova, ho testato e funziona qui.

cybmeta cybmeta
14 set 2013 00:19:16

Jan sei il mio nuovo migliore amico!!! ora funziona alla grande!!

Ben Ben
14 set 2013 02:25:41
Mostra i restanti 5 commenti