Template singoli per tassonomia di Custom Post Type
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;
}
Penso che ti manchino alcuni concetti o che non li abbia compresi appieno.
- 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.
- 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. - Il template specifico per un termine di una tassonomia è
taxonomy-{tua_tassonomia}-{termine}.php
, nel tuo caso, ad esempio, sarebbetaxonomy-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>

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?

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

È 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 ;-(

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?

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!!

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.

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.

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