Tipi di post personalizzati, tassonomie e permalink

14 dic 2010, 01:56:21
Visualizzazioni: 22.3K
Voti: 66

Questo mi sta facendo impazzire e sono sicuro che sia semplice ma niente di quello che cerco fornisce una struttura semplice (tutto è molto complesso).

Ho un tipo di post personalizzato product_listing e una tassonomia personalizzata product_cat (che è gerarchica e dovrebbe comportarsi come le categorie).

Voglio semplicemente che i miei URL appaiano così:

mysite.com/products/category1/product-name1 
mysite.com/products/category2/product-name2

Ma per quanto ci provi, ottengo sempre il temuto errore 404. Le Pagine funzionano bene e i Post funzionano bene ma i miei post personalizzati non funzionano correttamente. Si mostrano come:

mysite.com/products/product-name1
mysite.com/products/product-name2

Che in realtà funziona! È solo che voglio vedere la mia tassonomia personalizzata inclusa e voglio poter accedere al template taxonomy.php che ho configurato andando a:

mysite.com/products/category1/
mysite.com/products/category2/

Nessuno dei miei slug è uguale, né voglio che lo sia. Ecco la parte del tipo di post e della tassonomia del mio file functions.php:

///// CUSTOM POST TYPES /////

// registra il nuovo tipo di post
register_post_type( 'product_listing', array( 
    'labels'                 => array(
        'name'               => __( 'Prodotti' ),
        'singular_name'      => __( 'Prodotto' ),
        'add_new'            => __( 'Aggiungi Nuovo' ),
        'add_new_item'       => __( 'Crea Nuovo Prodotto' ),
        'edit'               => __( 'Modifica' ),
        'edit_item'          => __( 'Modifica Prodotto' ),
        'new_item'           => __( 'Nuovo Prodotto' ),
        'view'               => __( 'Visualizza Prodotti' ),
        'view_item'          => __( 'Visualizza Prodotto' ),
        'search_items'       => __( 'Cerca Prodotti' ),
        'not_found'          => __( 'Nessun prodotto trovato' ),
        'not_found_in_trash' => __( 'Nessun prodotto trovato nel cestino' ),
        'parent'             => __( 'Prodotto Genitore' ),
    ),
    'description'           => __( 'Qui puoi creare nuovi prodotti sul tuo sito.' ),
    'public'                => true,
    'show_ui'               => true,
    'capability_type'       => 'post',
    'publicly_queryable'    => true,
    'exclude_from_search'   => false,
    'menu_position'         => 2,
    'menu_icon'             => get_stylesheet_directory_uri() . '/images/tag_orange.png',
    'hierarchical'          => true,
    '_builtin'              => false, // È un tipo di post personalizzato, non integrato!
    'rewrite'               => array( 'slug' => 'products', 'with_front' => true ),
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );


//aggancia all'azione init e chiama create_book_taxonomies quando viene eseguita
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');

//crea due tassonomie, generi e scrittori per il tipo di post "book"
function create_product_taxonomies() {
    // Aggiungi nuova tassonomia, rendila gerarchica (come le categorie)
    $labels = array(
        'name'              => _x( 'Categorie', 'nome generale tassonomia' ),
        'singular_name'     => _x( 'Categoria', 'nome singolare tassonomia' ),
        'search_items'      =>  __( 'Cerca Categorie' ),
        'all_items'         => __( 'Tutte le Categorie' ),
        'parent_item'       => __( 'Categorie Genitore' ),
        'parent_item_colon' => __( 'Categorie Genitore:' ),
        'edit_item'         => __( 'Modifica Categoria' ), 
        'update_item'       => __( 'Aggiorna Categoria' ),
        'add_new_item'      => __( 'Aggiungi Nuova Categoria' ),
        'new_item_name'     => __( 'Nome Nuova Categoria' ),
        'menu_name'         => __( 'Categoria' ),
    );  

    register_taxonomy( 'product_cat', array( 'product_listing' ), array(
        'hierarchical'  => true,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => true,
        'rewrite'       => array( 'slug' => '%category%', 'with_front' => true ),
    ) );

    // Aggiungi nuova tassonomia, NON gerarchica (come i tag)
    $labels = array(
        'name'                       => _x( 'Profumi', 'nome generale tassonomia' ),
        'singular_name'              => _x( 'Profumo', 'nome singolare tassonomia' ),
        'search_items'               =>  __( 'Cerca Profumi' ),
        'popular_items'              => __( 'Profumi Popolari' ),
        'all_items'                  => __( 'Tutti i Profumi' ),
        'parent_item'                => null,
        'parent_item_colon'          => null,
        'edit_item'                  => __( 'Modifica Profumo' ), 
        'update_item'                => __( 'Aggiorna Profumo' ),
        'add_new_item'               => __( 'Aggiungi Nuovo Profumo' ),
        'new_item_name'              => __( 'Nome Nuovo Profumo' ),
        'separate_items_with_commas' => __( 'Separa i profumi con le virgole' ),
        'add_or_remove_items'        => __( 'Aggiungi o rimuovi profumi' ),
        'choose_from_most_used'      => __( 'Scegli tra i profumi più usati' ),
        'menu_name'                  => __( 'Profumi' ),
    ); 

    register_taxonomy( 'scent', 'product_listing', array(
        'hierarchical'  => false,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => array( 'slug' => 'scents' ),
    ) );
}

Ho anche un'altra tassonomia personalizzata chiamata scents per la quale idealmente vorrei avere un qualche tipo di URL amichevole, ma sono più flessibile su questo. Mi piacerebbe poter accedere a un elenco di tutti i profumi andando su mysite.com/products/scents ma non devono essere specifici per categoria.

Qualcuno può aiutarmi?

0
Tutte le risposte alla domanda 5
9
67

Cambia lo slug negli argomenti del tuo post type in products/%product_cat%, e lo slug negli argomenti della tassonomia semplicemente in products, quindi svuota le regole di riscrittura. WordPress ora dovrebbe gestire /products/my-product-cat/post-name/!

Infine, dobbiamo aiutare WordPress un po' nella generazione dei permalink (di default, non riconoscerà il tag %product_cat% nella struttura dei permalink):

/**
 * Inietta lo slug del termine nella struttura dei permalink del custom post type.
 * 
 * @link   http://wordpress.stackexchange.com/a/5313/1685
 * 
 * @param  string  $link
 * @param  WP_Post $post 
 * @return array
 */
function wpse_5308_post_type_link( $link, $post ) {
    if ( $post->post_type === 'product_listing' ) {
        if ( $terms = get_the_terms( $post->ID, 'product_cat' ) )
            $link = str_replace( '%product_cat%', current( $terms )->slug, $link );
    }

    return $link;
}

add_filter( 'post_type_link', 'wpse_5308_post_type_link', 10, 2 );

Una cosa da notare, questa funzione prenderà semplicemente la prima categoria di prodotto per il post ordinata per nome. Se stai assegnando più categorie a un singolo prodotto, posso facilmente cambiare come determina quale usare nel permalink.

Fammi sapere come procedi con questo, e possiamo affrontare gli altri problemi!

14 dic 2010 03:50:16
Commenti

Oh WOW sono senza parole! Ha FUNZIONATO! Finalmente! Non pensavo che nulla avrebbe mai funzionato!!! Grazie MILLE!!! ............ Ora, come potrei generare un link (qualcosa come the_permalink) per ottenere l'URL della tassonomia da solo? /products/my-product-cat/

RodeoRamsey RodeoRamsey
14 dic 2010 05:21:13

Penso di aver risolto questo problema^^^ ............ ma ora sono bloccato con la Paginazione. Sembra rompersi quando uso qualsiasi tipo di paginazione (funzione personalizzata o built-in) poiché /products/my-product-cat/ sembra funzionare, ma /products/my-product-cat/page/2/ restituisce un 404 e abbandona il file taxonomy.php in favore di index.php. Ho provato tutto ciò che ho trovato e ancora nulla.

RodeoRamsey RodeoRamsey
14 dic 2010 08:45:48

Potresti considerare di modificare i rewrite dei singoli prodotti in product/cat-name/product-name? (nota il singolare) Il problema è che la regola di rewrite per la paginazione della tassonomia non viene attivata, perché viene catturata da una regola precedente per i singoli prodotti!

TheDeadMedic TheDeadMedic
14 dic 2010 12:52:16

Sono aperto all'idea. Ma per capirla bene, significherebbe che i prodotti avrebbero un percorso URL diverso se stai visualizzando una pagina singola del prodotto rispetto a una pagina di 'categoria'? Quindi per il singolo sarebbe product/nome-cat/nome-prod ma per le categorie sarebbe products/nome-cat/? Non vanificherebbe un po' lo scopo degli URL "user friendly"? Ho già difficoltà a far imparare ai miei clienti la dashboard di wp, figuriamoci questa differenza... Se ho frainteso fammelo sapere! Potrei anche essere contento SENZA una directory frontale, tipo product-cat/nome-prod e semplicemente product-cat/. Potrebbe funzionare?

RodeoRamsey RodeoRamsey
14 dic 2010 16:44:44

Hai capito bene - anche se direi che è "user friendly", dato che c'è una chiara distinzione tra archivi (products/) e elementi singoli (product/). E no, terrei la 'directory frontale' - aiuta a mantenere una chiara distinzione da post e pagine, inoltre altrimenti potresti avere problemi di prestazioni (ad esempio regole di rewrite troppo verbose).

TheDeadMedic TheDeadMedic
14 dic 2010 17:31:53

Ok, che ne dici di mantenere il tuo suggerimento sopra ma usando termini meno simili? Tipo... product/nome-cat/nome-prod/ per le pagine singole dei prodotti... e qualcosa come categories/nome-cat/ per le pagine archivio delle categorie? Cosa dovrei modificare nel codice sopra per farlo funzionare?

RodeoRamsey RodeoRamsey
14 dic 2010 19:18:59

Ho testato quel plugin che l'altra risposta suggeriva e sembra funzionare bene per /products/cat-name/prod-name/ E /products/cat-name/... è un'opzione valida?

RodeoRamsey RodeoRamsey
14 dic 2010 19:58:26

Potrebbe essere che il plugin generi manualmente le regole di riscrittura in un ordine che funziona - l'unica cosa che farei è tenere d'occhio le prestazioni - usa <?php timer_stop(true); ?> e <?php echo get_num_queries(); ?> da qualche parte nel tuo footer.php, e vedi quali medie ottieni quando richiedi archivi di tassonomia e prodotti singoli.

TheDeadMedic TheDeadMedic
15 dic 2010 00:21:48

Avete trovato un modo per risolvere questo problema? Ho provato il codice suggerito da @TheDeadMedic e il plugin ma nessuno dei due funziona con successo. Se sì, per favore date un'occhiata alla mia domanda. Grazie! - http://wordpress.stackexchange.com/questions/40587/shouldnt-this-be-easy-custom-post-type-custom-taxonomy-permalink

fxfuture fxfuture
30 gen 2012 04:43:40
Mostra i restanti 4 commenti
0

Grazie @TheDeadMechanic, la tua risposta mi è stata utile, ma solo in parte. Volevo fare la stessa cosa chiesta da @RodeoRamsey, ma con categorie annidate (es: mysite.com/products/categoria1/sottocategoria-1/sottosottocategoria-1/nome-prodotto) e la tua soluzione non ha funzionato in quel caso.

Alla fine ho trovato una soluzione estesa alla mia domanda che funziona, quindi se qualcun altro ha bisogno di categorie/sottocategorie annidate può vedere una soluzione dettagliata sulla mia stessa domanda. Spero possa aiutare altri, e grazie per i primi passi.

23 gen 2012 20:39:23
1

Non sono sicuro che WordPress supporti questa struttura di default, ma puoi facilmente creare le tue regole di riscrittura per ottenere questo risultato.

Dai un'occhiata a questa risposta precedente: Riscrittura URL autore.

Puoi modificare la riga

$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';

in qualcosa come

$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';

La parte product_cat qui potrebbe essere superflua - non sono sicuro che sia necessaria.

Puoi aggiungere qualsiasi regola desideri e avranno priorità rispetto a quelle predefinite.

14 dic 2010 02:07:03
Commenti

Beh, non è interessante. Oh cavolo, credo che le regole di riscrittura personalizzate siano oltre le mie capacità. Ho provato il codice sopra (e il resto del post) e non è cambiato nulla. Ho resettato tutto e poi ho riprovato ma ancora nessun cambiamento, così ho commentato tutte le regole di riscrittura impostate nei tipi di post personalizzati e nelle tassonomie e ho resettato ma ANCORA nulla.

RodeoRamsey RodeoRamsey
14 dic 2010 03:09:48
1

Sì, mi stava facendo impazzire prima di impostare il permalink per il custom post type. Ho trovato un plugin per gestire il custom post type. È molto semplice da usare. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP dovrebbe aggiungere questa funzione tra le funzionalità di base! Leo

14 dic 2010 12:13:59
Commenti

L'avevo già visto in precedenza e mi ero trattenuto dall'usarlo perché indicava "per tassonomie non gerarchiche". Ne avevo una impostata come gerarchica, quindi pensavo non avrebbe funzionato, ma finora sembra aver fatto il suo dovere! Inoltre, sembra funzionare per ottenere la struttura /products/nome-categoria/nome-prodotto/ che cercavo di realizzare (vedi commento all'altra risposta). @TheDeadMedic, è un'opzione valida? O dovrei attenermi alle riscritture nel file functions.php?

RodeoRamsey RodeoRamsey
14 dic 2010 19:57:35
0

In realtà, è piuttosto semplice. Hai bisogno solo di una riga. Ecco il mio codice


function create_product_taxonomies()
{
// Aggiungi una nuova tassonomia, rendila gerarchica (come le categorie)
    $labels = array(
        'name' => _x('Categorie', 'nome generale della tassonomia'),
        'singular_name' => _x('Categoria', 'nome singolare della tassonomia'),
        'search_items' => __('Cerca Categorie'),
        'all_items' => __('Tutte le Categorie'),
        'parent_item' => __('Categorie Genitore'),
        'parent_item_colon' => __('Categorie Genitore:'),
        'edit_item' => __('Modifica Categoria'),
        'update_item' => __('Aggiorna Categoria'),
        'add_new_item' => __('Aggiungi Nuova Categoria'),
        'new_item_name' => __('Nome Nuova Categoria'),
        'menu_name' => __('Categoria'),
    );

    register_taxonomy('product_cat', array('product_listing'), array(
        'hierarchical' => true,
        'labels' => $labels,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => array('hierarchical' => true),
    ));

E applicato alla tassonomia generata per il mio CPT Reviews da GenerateWP.com. Lo sto usando sul mio sito WordPress personale, https://www.wpstarters.com


function reviews_category_taxonomy() {

    $labels = array(
        'name'                       => _x( 'Categorie Recensioni', 'Nome Generale della Tassonomia', 'reviews_category' ),
        'singular_name'              => _x( 'Categoria Recensioni', 'Nome Singolare della Tassonomia', 'reviews_category' ),
        'menu_name'                  => __( 'Categoria Recensioni', 'reviews_category' ),
        'all_items'                  => __( 'Tutte le Categorie Recensioni', 'reviews_category' ),
        'parent_item'                => __( 'Categoria Recensioni Genitore', 'reviews_category' ),
        'parent_item_colon'          => __( 'Categoria Recensioni Genitore:', 'reviews_category' ),
        'new_item_name'              => __( 'Nome Nuova Categoria Recensioni', 'reviews_category' ),
        'add_new_item'               => __( 'Aggiungi Nuova Categoria Recensioni', 'reviews_category' ),
        'edit_item'                  => __( 'Modifica Categoria Recensioni', 'reviews_category' ),
        'update_item'                => __( 'Aggiorna Categoria Recensioni', 'reviews_category' ),
        'view_item'                  => __( 'Visualizza Categoria Recensioni', 'reviews_category' ),
        'separate_items_with_commas' => __( 'Separa gli elementi con le virgole', 'reviews_category' ),
        'add_or_remove_items'        => __( 'Aggiungi o rimuovi elementi', 'reviews_category' ),
        'choose_from_most_used'      => __( 'Scegli tra i più utilizzati', 'reviews_category' ),
        'popular_items'              => __( 'Categorie Recensioni Popolari', 'reviews_category' ),
        'search_items'               => __( 'Cerca Elementi', 'reviews_category' ),
        'not_found'                  => __( 'Non Trovato', 'reviews_category' ),
        'no_terms'                   => __( 'Nessuna Categoria Recensioni', 'reviews_category' ),
        'items_list'                 => __( 'Lista Categorie Recensioni', 'reviews_category' ),
        'items_list_navigation'      => __( 'Navigazione Lista Categorie Recensioni', 'reviews_category' ),
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true,
        'show_in_nav_menus'          => true,
        'show_tagcloud'              => false,
        'show_in_rest'               => true,
        'rewrite' => array( 'hierarchical' => true ),
    );
    register_taxonomy( 'reviews_category', array( 'wps_reviews' ), $args );

}
add_action( 'init', 'reviews_category_taxonomy', 0 );

Tutto ciò di cui hai bisogno è inserire 'rewrite' => array('hierarchical' => true),

6 dic 2017 21:15:00