Regole di Rewrite WordPress per Custom Post Type e Tassonomia
Ho trovato questo posto una buona fonte di informazioni in passato grazie a molte ricerche su Google per i problemi che ho incontrato. La mia domanda riguarda le verbose rewrite rules che WordPress utilizza.
Ho impostato un custom post type chiamato project, e ho registrato una tassonomia personalizzata chiamata projects. Tutto funziona alla grande tranne che per le opzioni degli slug di rewrite che finiscono per entrare in conflitto - molto probabilmente a causa delle regole di rewrite.
Fondamentalmente questa è la struttura che vorrei ottenere:
example.com/lavoro/%tassonomia%/%nome_post%/
(per i post)example.com/lavoro/%tassonomia%/
(lista dei post appartenenti a un termine specifico della tassonomia)example.com/lavoro/
(va a page-work.php che include taxonomy.php per elencare tutti i post associati a quella tassonomia)
Ecco il codice che ho finora, ma ho bisogno di aiuto per scrivere le regole WP_Rewrite poiché è questa la parte in cui sono bloccato.
$labels = array(
'name' => _x('Progetti', 'nome generico del post type'),
'singular_name' => _x('Progetto', 'nome singolare del post type'),
'add_new' => _x('Aggiungi nuovo', 'voce progetto'),
'add_new_item' => __('Aggiungi nuovo progetto'),
'edit_item' => __('Modifica progetto'),
'new_item' => __('Nuovo progetto'),
'view_item' => __('Visualizza progetto'),
'search_items' => __('Cerca progetti'),
'not_found' => __('Nessun risultato trovato'),
'not_found_in_trash' => __('Nessun risultato trovato nel cestino'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'hierarchical' => true,
'rewrite' => array('slug'=>'lavoro', 'with_front'=>false),
'show_ui' => true,
'_builtin' => false, // È un custom post type, non integrato!
'capability_type' => 'post',
'query_var' => "project", // Questo va nello schema WP_Query
'menu_position' => null,
'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);
register_post_type('project' , $args);
// Tassonomia Progetti
register_taxonomy('projects', array('project'), array(
'public' => true,
'hierarchical' => true,
'label' => 'Categorie Progetti',
'singular_label' => 'Categoria Progetto',
'query_var' => true,
'rewrite' => array('slug'=>'lavoro', 'with_front'=>false, 'hierarchical'=>true)
)
);
Grazie mille per il tuo aiuto! :-)
Spero che questo possa risolvere il tuo problema
function my_custom_post_type() {
$labels = array(
'name' => _x('Progetti', 'post type general name'), // Nome generale del tipo di post
'singular_name' => _x('Progetto', 'post type singular name'), // Nome singolare del tipo di post
'add_new' => _x('Aggiungi nuovo', 'project item'), // Testo per aggiungere nuovo elemento
'add_new_item' => __('Aggiungi nuovo progetto'), // Testo per aggiungere nuovo progetto
'edit_item' => __('Modifica progetto'), // Testo per modificare progetto
'new_item' => __('Nuovo progetto'), // Testo per nuovo progetto
'view_item' => __('Visualizza progetto'), // Testo per visualizzare progetto
'search_items' => __('Cerca progetti'), // Testo per cercare progetti
'not_found' => __('Nessun risultato trovato'), // Messaggio se non trovato
'not_found_in_trash' => __('Nessun risultato trovato nel cestino'), // Messaggio se non trovato nel cestino
'parent_item_colon' => '',
'menu_name' => 'Progetti' // Nome nel menu
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'hierarchical' => false,
'has_archive' => true,
'rewrite' => array('slug'=>'lavoro', 'with_front'=>false), // Slug personalizzato
'show_ui' => true,
'_builtin' => false, // È un tipo di post personalizzato, non integrato!
'capability_type' => 'post',
'query_var' => true, // Questo va nello schema WP_Query
'menu_position' => null,
'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt') // Funzionalità supportate
);
register_post_type( 'lavoro' , $args ); // Registra il tipo di post personalizzato
}
function my_custom_taxonomies() {
$labels = array(
'name' => __( 'Tassonomia', 'taxonomy general name' ), // Nome generale della tassonomia
'singular_name' => __( 'Tassonomia', 'taxonomy singular name' ), // Nome singolare della tassonomia
'search_items' => __( 'Cerca tassonomia' ), // Testo per cercare tassonomia
'all_items' => __( 'Tutte le tassonomie' ), // Testo per tutte le tassonomie
'parent_item' => __( 'Tassonomia genitore' ), // Testo per tassonomia genitore
'parent_item_colon' => __( 'Tassonomia genitore:' ), // Testo per tassonomia genitore con due punti
'edit_item' => __( 'Modifica tassonomia' ), // Testo per modificare tassonomia
'update_item' => __( 'Aggiorna tassonomia' ), // Testo per aggiornare tassonomia
'add_new_item' => __( 'Aggiungi nuova tassonomia' ), // Testo per aggiungere nuova tassonomia
'new_item_name' => __( 'Nome nuova tassonomia' ), // Testo per nome nuova tassonomia
'menu_name' => __( 'Tassonomia' ), // Nome nel menu
);
register_taxonomy( 'tassonomia', array('lavoro'), array ( // Registra la tassonomia personalizzata
'labels' => $labels,
'hierarchical' =>false,
'show_ui' => true,
'rewrite' => array( 'slug' => 'lavoro/tassonomia'), // Slug personalizzato
'query_var' => true,
'show_in_nav_menus' => true,
'public' => true,
));
}
add_action('init', 'my_custom_post_type', 0); // Hook per registrare il tipo di post
add_action('init', 'my_custom_taxonomies', 10); // Hook per registrare la tassonomia
ciò che devi creare è archive-lavoro.php (l'archivio del tuo tipo di post) e taxonomy.php che verrà utilizzato per mostrare l'archivio della tua tassonomia personalizzata.

Ho avuto lo stesso problema e dopo molte difficoltà sono arrivato a questa soluzione.
Basta aggiungere questo al tuo codice
global $wp_rewrite;
$wp_rewrite->flush_rules();
function my_custom_post_type() {
$labels = array(
'name' => _x('Progetti', 'post type general name'),
'singular_name' => _x('Progetto', 'post type singular name'),
'add_new' => _x('Aggiungi nuovo', 'voce progetto'),
'add_new_item' => __('Aggiungi nuovo progetto'),
'edit_item' => __('Modifica progetto'),
'new_item' => __('Nuovo progetto'),
'view_item' => __('Visualizza progetto'),
'search_items' => __('Cerca progetti'),
'not_found' => __('Nessun risultato trovato'),
'not_found_in_trash' => __('Nessun risultato trovato nel cestino'),
'parent_item_colon' => '',
'menu_name' => 'Progetti'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'hierarchical' => false,
'has_archive' => true,
'rewrite' => array('slug'=>'work', 'with_front'=>false),
'show_ui' => true,
'_builtin' => false, // È un custom post type, non built-in!
'capability_type' => 'post',
'query_var' => true, // Questo va nello schema WP_Query
'menu_position' => null,
'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);
register_post_type( 'work' , $args );
global $wp_rewrite;
$wp_rewrite->flush_rules(); // questo dovrebbe aiutare
}

$wp_rewrite->flush_rules() non dovrebbe essere eseguito così frequentemente, dovrebbe essere eseguito solo sugli hook di attivazione o disattivazione o il meno possibile. Lo dice qui: http://codex.wordpress.org/Rewrite_API/flush_rules ED è praticamente la stessa funzione di questa: http://codex.wordpress.org/Function_Reference/flush_rewrite_rules

Un'altra nota, questo è come l'ho realizzato: http://pastebin.com/k7QvxKLi

@Jared Grazie per il suggerimento, ma non sono riuscito a capire come realizzarlo quando è integrato nel nostro tema (cioè non tramite plugin). Per favore, suggerisci.

Il codice andrebbe in functions.php
in quel caso. Il codice per un plugin e per un tema è esattamente lo stesso, l'unica differenza è che nei temi va sempre in functions.php
o in un file incluso in functions.php

Una spiegazione più dettagliata è disponibile in un altro articolo, ma ecco le parti fondamentali che devi aggiungere:
Registra le tue tassonomie e custom post type come fai di solito. Assicurati che lo slug di rewrite per la tassonomia sia "basename" e lo slug di rewrite per il CPT sia "basename/%tax_name%".
Indica a WordPress cosa fare con "%tax_name%" in questo modo:
function filter_post_type_link($link, $post) { if ($post->post_type != 'custom_post_type_name') return $link; if ($cats = get_the_terms($post->ID, 'taxonomy_name')) { // Sostituisce il segnaposto %taxonomy_name% con l'ID del termine $link = str_replace('%taxonomy_name%',array_pop($cats)->term_id, $link); // vedi la funzione personalizzata definita sotto } return $link; } add_filter('post_type_link', 'filter_post_type_link', 10, 2);
