Regole di Rewrite WordPress per Custom Post Type e Tassonomia

16 giu 2011, 22:51:52
Visualizzazioni: 6.58K
Voti: 9

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

3
Commenti

@ChristopherDavis Grazie, approfondirò queste risorse e vedrò come procedere.

matt_d_rat matt_d_rat
20 giu 2011 03:19:43

Penso che questa domanda possa essere risposta guardando Mixing custom post type and taxonomy rewrite structures? Se quella domanda non ti aiuta, per favore modifica questa domanda per indicare in cosa differisce.

Jan Fabry Jan Fabry
9 lug 2011 16:18:09
Tutte le risposte alla domanda 3
1

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.

18 dic 2011 19:04:07
Commenti

non dimenticare di cambiare la "tassonomia" con il nome della tua tassonomia. Non utilizzare lo stesso valore del tuo post_type. Prova a usare category per il primo tentativo. work/category , register_taxonomy('category, array('work'), array( ......

nonsensecreativity nonsensecreativity
18 dic 2011 19:07:37
5

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 
}
2 gen 2012 11:17:49
Commenti

$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

Jared Jared
14 gen 2012 00:09:56

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

Jared Jared
14 gen 2012 00:19:10

@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.

Dipesh KC Dipesh KC
17 gen 2012 07:37:39

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

Jared Jared
17 gen 2012 11:05:44

Suggerirei di usare l'hook after_switch_theme, è nuovo dalla 3.3 (se non sbaglio).

Cristian Cristian
1 feb 2012 19:18:00
0

Una spiegazione più dettagliata è disponibile in un altro articolo, ma ecco le parti fondamentali che devi aggiungere:

  1. 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%".

  2. 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);
    
17 feb 2012 00:11:21