Tipi di post personalizzati, tassonomie e permalink


62

Questo mi sta facendo impazzire e sono sicuro che sia semplice ma nulla di ciò che cerco viene fuori con una struttura semplice (tutto è molto complesso).

Ho un tipo di post personalizzato product_listinge una tassonomia personalizzata di product_cat(che è gerarchica e dovrebbe avere categorie simili).

Voglio semplicemente che i miei URL siano così:

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

Ma per la vita di me, non importa quello che faccio, sto ricevendo il temuto problema 404. Le pagine funzionano bene e i post funzionano bene, ma i miei post personalizzati non funzionano correttamente. Si stanno presentando come:

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

Che funziona davvero ! È solo che voglio vedere la mia tassonomia personalizzata e inoltre voglio poter accedere al taxonomy.phpmodello che ho impostato andando a:

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

Nessuna delle mie lumache è la stessa, né voglio che lo siano. Ecco il tipo di post e la tassonomia del mio functions.phpfile:

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

// register the new post type
register_post_type( 'product_listing', array( 
    'labels'                 => array(
        'name'               => __( 'Products' ),
        'singular_name'      => __( 'Product' ),
        'add_new'            => __( 'Add New' ),
        'add_new_item'       => __( 'Create New Product' ),
        'edit'               => __( 'Edit' ),
        'edit_item'          => __( 'Edit Product' ),
        'new_item'           => __( 'New Product' ),
        'view'               => __( 'View Products' ),
        'view_item'          => __( 'View Product' ),
        'search_items'       => __( 'Search Products' ),
        'not_found'          => __( 'No products found' ),
        'not_found_in_trash' => __( 'No products found in trash' ),
        'parent'             => __( 'Parent Product' ),
    ),
    'description'           => __( 'This is where you can create new products on your site.' ),
    '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, // It's a custom post type, not built in!
    'rewrite'               => array( 'slug' => 'products', 'with_front' => true ),
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );


//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');

//create two taxonomies, genres and writers for the post type "book"
function create_product_taxonomies() {
    // Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name'              => _x( 'Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Category', 'taxonomy singular name' ),
        'search_items'      =>  __( 'Search Categories' ),
        'all_items'         => __( 'All Categories' ),
        'parent_item'       => __( 'Parent Categories' ),
        'parent_item_colon' => __( 'Parent Categories:' ),
        'edit_item'         => __( 'Edit Category' ), 
        'update_item'       => __( 'Update Category' ),
        'add_new_item'      => __( 'Add New Category' ),
        'new_item_name'     => __( 'New Category Name' ),
        'menu_name'         => __( 'Category' ),
    );  

    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 ),
    ) );

    // Add new taxonomy, NOT hierarchical (like tags)
    $labels = array(
        'name'                       => _x( 'Scents', 'taxonomy general name' ),
        'singular_name'              => _x( 'Scent', 'taxonomy singular name' ),
        'search_items'               =>  __( 'Search Scents' ),
        'popular_items'              => __( 'Popular Scents' ),
        'all_items'                  => __( 'All Scents' ),
        'parent_item'                => null,
        'parent_item_colon'          => null,
        'edit_item'                  => __( 'Edit Scent' ), 
        'update_item'                => __( 'Update Scent' ),
        'add_new_item'               => __( 'Add New Scent' ),
        'new_item_name'              => __( 'New Scent Name' ),
        'separate_items_with_commas' => __( 'Separate scents with commas' ),
        'add_or_remove_items'        => __( 'Add or remove scents' ),
        'choose_from_most_used'      => __( 'Choose from the most used scents' ),
        'menu_name'                  => __( 'Scents' ),
    ); 

    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 scentsche mi piacerebbe idealmente avere una sorta di URL amichevole, ma sono più aperto su questo. Vorrei forse accedere a un elenco di tutti i profumi andando a mysite.com/products/scentsma non devono essere specifici per categoria.

Qualcuno può aiutarmi?

Risposte:


63

Modifica sluggli argomenti del tipo di post in products/%product_cat%e quelli slugdella tassonomia in just products, quindi annulla le regole di riscrittura. WordPress ora dovrebbe gestire /products/my-product-cat/post-name/!

Ora, infine, dobbiamo aiutare un po 'WordPress a generare permalink (pronto all'uso, non riconoscerà il tag permastruct %product_cat%):

/**
 * Inject term slug into custom post type permastruct.
 * 
 * @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, questo prenderà semplicemente la prima categoria di prodotti per il post ordinato per nome . Se stai assegnando più categorie a un singolo prodotto, posso facilmente cambiare il modo in cui determina quale utilizzare nel permalink.

Fammi sapere come vai avanti con questo, e possiamo affrontare le altre questioni!


Oh WOW, sono sbalordito! Questo ha funzionato! Finalmente! Non avrei mai pensato che sarebbe successo !!! grazie mille !!! ............ Ora, come potrei generare un link (qualcosa come the_permalink) per afferrare l'URL della tassonomia da solo? / products / my-product-cat /
RodeoRamsey

Penso di averlo capito ^^^ ............ ma ora sono bloccato su Pagination. Sembra interrompersi quando si utilizza qualsiasi impaginazione (funzione personalizzata o incorporata) come / products / my-product-cat / sembra a posto ma / products / my-product-cat / page / 2 / restituisce un 404 e rilascia il file taxonomy.php in favore del file index.php. Ho provato tutto quello che sono riuscito a trovare e ancora niente.
Rodeo Ramsey,

1
Considereresti di cambiare le riscritture del singolo prodotto in product/cat-name/product-name? (nota la singolarità) Il problema è che la regola di riscrittura per l'impaginazione della tassonomia non viene attivata, perché viene catturata da una regola precedente per singoli prodotti!
TheDeadMedic il

Sono aperto ad esso. Ma per concludere, significherebbe che i prodotti avrebbero un percorso URL diverso se visualizzi una singola pagina di prodotto rispetto a una pagina di "categoria"? Quindi singolo sarebbe prodotto / nome-gatto / nome-prod, ma i gatti sarebbero prodotti / nome-gatto / ? Quel tipo di sconfitta non avrebbe lo scopo di url "umani amichevoli"? Faccio fatica ad aiutare i miei clienti ad imparare la dashboard di wp e tanto meno questa differenza ... Se sto fraintendendo, fammi sapere! Potrei anche essere contento di NO front directory, come product-cat / product-nam e solo product-cat / . Potrebbe funzionare?
RodeoRamsey,

2
Hai capito, anche se direi che è "amico dell'uomo", in quanto esiste una chiara distinzione tra archivi ( products/) e oggetti singolari ( product/). E no, terrei la 'prima directory' - aiuta a mantenere una chiara distinzione da post e pagine, inoltre altrimenti potresti finire con problemi di prestazioni (ad esempio regole di riscrittura verbose).
TheDeadMedic,

6

Grazie @TheDeadMechanic, la tua risposta mi ha aiutato, ma solo parzialmente. Volevo fare la stessa cosa richiesta da @RodeoRamsey, ma con categorie nidificate (es.:) mysite.com/products/category1/child-category-1/grandchild-category-1/product-nameE la tua soluzione non ha funzionato per questo.

Alla fine ho trovato una soluzione estesa alla mia domanda che funziona, quindi se qualcun altro ha bisogno di categorie / sottocategorie nidificate, puoi vedere una soluzione dettagliata sulla mia domanda. Spero che aiuti gli altri e grazie per i primi passi.


4

Non sono sicuro che wp supporti tale struttura per impostazione predefinita, ma è possibile creare facilmente le proprie regole di riscrittura per farlo.

Controlla una risposta precedente qui Autore url riscrivere .

Puoi cambiare la linea

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

a qualcosa del genere

$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 necessario.

Puoi aggiungere tutte le regole che ti piacciono e avranno la priorità su quelle integrate.


Beh, non è così interessante. Oh ragazzo, penso che le regole di riscrittura personalizzate siano oltre me. Ho provato il codice sopra (e il resto dall'altro post) e nulla è cambiato. Ho scaricato tutto e poi riprovato e ancora nessuna modifica, quindi ho commentato tutte le regole di riscrittura impostate nei tipi di post personalizzati e tassonomie e scaricato e ANCORA nulla.
RodeoRamsey,

2

Sì, mi stava facendo impazzire prima di impostare il permalink per il tipo di post personalizzato. Ho trovato un plug-in per gestire il tipo di post personalizzato. È molto facile da usare. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP dovrebbe aggiungere questo come funzionalità principale! Leo


L'avevo visto prima e mi ero astenuto dall'utilizzarlo perché diceva tassonomie "per non gerarchiche". Ne avevo uno impostato su gerarchico, quindi non pensavo che avrebbe funzionato, ma finora sembra che abbia funzionato! Inoltre, sembra che stia lavorando per realizzare la struttura / products / cat-name / prod-name / che stavo cercando di ottenere (vedi commento ad altra risposta). @TheDeadMedic, è un'opzione praticabile? O dovrei attenermi alle riscritture nel file Functions.php?
RodeoRamsey,

0

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

funzione create_product_taxonomies ()
{
// Aggiungi nuova tassonomia, rendila gerarchica (come le categorie)
    $ labels = array (
        'name' => _x ('Categorie', 'nome generale tassonomia'),
        'singular_name' => _x ('Categoria', 'tassonomy singular name'),
        'search_items' => __ ('Cerca categorie'),
        'all_items' => __ ('Tutte le categorie'),
        'parent_item' => __ ('Categorie padre'),
        'parent_item_colon' => __ ('Categorie padre:'),
        'edit_item' => __ ('Modifica categoria'),
        'update_item' => __ ('Categoria aggiornamento'),
        '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 le mie recensioni CPT da GenerateWP.com. Lo sto usando sul mio sito WordPress, https://www.wpstarters.com

funzione reviews_category_taxonomy () {

    $ labels = array (
        'name' => _x ('Categorie recensioni', 'Nome generale tassonomia', 'reviews_category'),
        'singular_name' => _x ('Categoria recensioni', 'Nome singolare tassonomia', 'reviews_category'),
        'menu_name' => __ ('Recensioni categoria', 'reviews_category'),
        'all_items' => __ ('Tutte le categorie di recensioni', 'reviews_category'),
        'parent_item' => __ ('Categoria recensione genitore', 'reviews_category'),
        'parent_item_colon' => __ ('Categoria recensione genitore:', 'reviews_category'),
        'new_item_name' => __ ('Nome nuova categoria recensione', 'reviews_category'),
        'add_new_item' => __ ('Aggiungi nuova categoria di recensioni', 'reviews_category'),
        'edit_item' => __ ('Modifica categoria recensioni', 'reviews_category'),
        'update_item' => __ ('Aggiorna categoria revisione', 'reviews_category'),
        'view_item' => __ ('Visualizza categoria di recensioni', 'reviews_category'),
        'separate_items_with_commas' => __ ('Separa elementi con 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 di recensioni popolari', 'reviews_category'),
        'search_items' => __ ('Cerca elementi', 'reviews_category'),
        'not_found' => __ ('Not Found', 'reviews_category'),
        'no_terms' => __ ('Categorie senza recensione', 'reviews_category'),
        'items_list' => __ ('Elenco categorie recensioni', 'reviews_category'),
        'items_list_navigation' => __ ('Navigazione elenco categorie di recensioni', 'review_category'),
    );
    $ args = array (
        'labels' => $ labels,
        'hierarchical' => true,
        'public' => true,
        'show_ui' => true,
        'show_admin_column' => true,
        'show_in_nav_menus' => vero,
        'show_tagcloud' => false,
        'show_in_rest' => true,
        'rewrite' => array ('hierarchical' => true),
    );
    register_taxonomy ('reviews_category', array ('wpsistruzione'), $ args);

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.