Tipuri de postări personalizate, taxonomii și permalink-uri
Acest lucru mă înnebunește și sunt sigur că e simplu, dar orice caut nu găsesc o structură simplă (totul este foarte complex).
Am un tip de postare personalizată product_listing
și o taxonomie personalizată product_cat
(care este ierarhică și ar trebui să se comporte ca categoriile).
Vreau pur și simplu ca URL-urile mele să arate astfel:
mysite.com/products/category1/product-name1
mysite.com/products/category2/product-name2
Dar orice aș face, primesc problema 404. Paginile funcționează bine și Articolele funcționează bine, dar postările mele personalizate nu funcționează corect. Ele apar ca:
mysite.com/products/product-name1
mysite.com/products/product-name2
Care de fapt funcționează! Doar că vreau să văd taxonomia mea personalizată acolo plus vreau să pot accesa șablonul taxonomy.php
pe care l-am configurat accesând:
mysite.com/products/category1/
mysite.com/products/category2/
Niciunul dintre slug-urile mele nu sunt la fel, și nici nu vreau să fie. Iată partea de tip de postare și taxonomie din fișierul meu functions.php
:
///// TIPURI DE POSTĂRI PERSONALIZATE /////
// înregistrarea noului tip de postare
register_post_type( 'product_listing', array(
'labels' => array(
'name' => __( 'Produse' ),
'singular_name' => __( 'Produs' ),
'add_new' => __( 'Adaugă Nou' ),
'add_new_item' => __( 'Creează Produs Nou' ),
'edit' => __( 'Editează' ),
'edit_item' => __( 'Editează Produs' ),
'new_item' => __( 'Produs Nou' ),
'view' => __( 'Vezi Produse' ),
'view_item' => __( 'Vezi Produs' ),
'search_items' => __( 'Caută Produse' ),
'not_found' => __( 'Nu s-au găsit produse' ),
'not_found_in_trash' => __( 'Nu s-au găsit produse în coșul de gunoi' ),
'parent' => __( 'Produs Părinte' ),
),
'description' => __( 'Aici puteți crea produse noi pe site-ul dvs.' ),
'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, // Este un tip de postare personalizat, nu unul incorporat!
'rewrite' => array( 'slug' => 'products', 'with_front' => true ),
'query_var' => true,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );
//conectare la acțiunea init și apelare create_book_taxonomies când se execută
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');
//crearea a două taxonomii, genuri și scriitori pentru tipul de postare "book"
function create_product_taxonomies() {
// Adăugare taxonomie nouă, făcută ierarhică (ca și categoriile)
$labels = array(
'name' => _x( 'Categorii', 'nume general taxonomie' ),
'singular_name' => _x( 'Categorie', 'nume singular taxonomie' ),
'search_items' => __( 'Caută Categorii' ),
'all_items' => __( 'Toate Categoriile' ),
'parent_item' => __( 'Categorii Părinte' ),
'parent_item_colon' => __( 'Categorii Părinte:' ),
'edit_item' => __( 'Editează Categorie' ),
'update_item' => __( 'Actualizează Categorie' ),
'add_new_item' => __( 'Adaugă Categorie Nouă' ),
'new_item_name' => __( 'Nume Categorie Nouă' ),
'menu_name' => __( 'Categorie' ),
);
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 ),
) );
// Adăugare taxonomie nouă, NU ierarhică (ca și etichetele)
$labels = array(
'name' => _x( 'Arome', 'nume general taxonomie' ),
'singular_name' => _x( 'Aromă', 'nume singular taxonomie' ),
'search_items' => __( 'Caută Arome' ),
'popular_items' => __( 'Arome Populare' ),
'all_items' => __( 'Toate Aromele' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Editează Aromă' ),
'update_item' => __( 'Actualizează Aromă' ),
'add_new_item' => __( 'Adaugă Aromă Nouă' ),
'new_item_name' => __( 'Nume Aromă Nouă' ),
'separate_items_with_commas' => __( 'Separați aromele cu virgule' ),
'add_or_remove_items' => __( 'Adaugă sau elimină arome' ),
'choose_from_most_used' => __( 'Alegeți dintre cele mai folosite arome' ),
'menu_name' => __( 'Arome' ),
);
register_taxonomy( 'scent', 'product_listing', array(
'hierarchical' => false,
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
//'rewrite' => array( 'slug' => 'scents' ),
) );
}
Mai am o altă taxonomie personalizată scents
pentru care aș dori ideal să am un URL prietenos, dar sunt mai deschis în această privință. Mi-ar plăcea să pot accesa o listă cu toate aromele mergând la mysite.com/products/scents
dar nu trebuie să fie specifice categoriei.
Mă poate ajuta cineva?

Schimbă slug
în argumentele tipului de post la produse/%product_cat%
, și slug
în argumentele taxonomiei la simplu produse
, apoi resetează regulile de rescriere. WordPress ar trebui acum să gestioneze /produse/categoria-mea-de-produse/numele-postului/
!
În final, trebuie să ajutăm puțin WordPress cu generarea legăturilor permanente (în mod implicit, nu va recunoaște eticheta de permastruct %product_cat%
):
/**
* Injectează slug-ul termenului în permastruct-ul tipului de post personalizat.
*
* @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 );
Un lucru de notat, această funcție va lua pur și simplu prima categorie de produse pentru post ordonată după nume. Dacă atribui mai multe categorii unui singur produs, pot schimba ușor modul în care determină care să fie utilizată în legătura permanentă.
Spune-mi cum merge cu asta, și putem aborda celelalte probleme!

Oh WOW sunt uimit! A FUNCȚIONAT! În sfârșit! Nu am crezut niciodată că va funcționa nimic!!! Mulțumesc NESpus de mult!!! ............ Acum, cum aș putea genera un link (ceva similar cu the_permalink) pentru a obține doar URL-ul taxonomiei? /products/my-product-cat/

Cred că am reușit să rezolv asta^^^ ............ dar acum sunt blocat la Paginare. Se pare că se întrerupe când folosesc orice paginare (funcție personalizată sau cea built-in), deoarece /products/my-product-cat/ arată ok dar /products/my-product-cat/page/2/ returnează o eroare 404 și renunță la fișierul taxonomy.php în favoarea index.php. Am încercat tot ce am găsit și încă nimic.

Ai considera să schimbi rewrite-urile pentru produsele individuale în product/nume-categorie/nume-produs
? (atenție la singular) Problema este că regula de rewrite pentru paginarea taxonomiei nu este declanșată, pentru că este prinsă de o regulă anterioară pentru produsele individuale!

Sunt deschis la idee. Dar ca să înțeleg, asta ar însemna că produsele ar avea căi URL diferite dacă vizualizezi o pagină de produs singular vs. o pagină de 'categorie'? Deci singular ar fi product/nume-categorie/nume-produs, dar categoriile ar fi products/nume-categorie/? Nu ar contrazice asta cumva scopul URL-urilor "prietenoase pentru oameni"? Am dificultăți să-i învăț pe clienții mei să folosească tabloul de bord WordPress, darămite această diferență... Dacă am înțeles greșit, te rog să-mi spui! Aș putea fi mulțumit și fără un director frontal, cum ar fi product-cat/nume-produs și doar product-cat/. Ar putea funcționa așa?

Ai înțeles corect - deși aș spune că este "prietenos pentru oameni", întrucât există o distincție clară între arhive (products/
) și elemente singulare (product/
). Și nu, aș păstra 'directorul frontal' - ajută la menținerea unei distincții clare față de articole și pagini, plus că altfel ai putea avea probleme de performanță (de ex., reguli de rescriere prea complexe).

Bine, ce zici să păstram sugestia ta de mai sus, dar să folosim termeni mai puțin asemănători? De exemplu... product/nume-categorie/nume-produs/ pentru paginile de produs singular... și ceva de genul categories/nume-categorie/ pentru paginile de arhivă ale categoriei? Ce ar trebui să modific în codul de mai sus ca să funcționeze așa?

Am testat acel plugin sugerat în celălalt răspuns și pare să funcționeze bine pentru /produse/nume-categorie/nume-produs/ ȘI /produse/nume-categorie/... este o opțiune viabilă?

Este posibil ca plugin-ul să genereze manual regulile de rescriere într-o ordine care funcționează - singurul lucru pe care l-aș face este să monitorizez performanța - folosește <?php timer_stop(true); ?>
și <?php echo get_num_queries(); ?>
undeva în footer.php
, și vezi ce medii obții când soliciți arhivele de taxonomie și produse individuale.

Ați găsit vreo soluție pentru această problemă? Am încercat codul sugerat de @TheDeadMedic și plugin-ul, dar niciunul nu funcționează cu succes. Dacă da, vă rog să aruncați o privire la întrebarea mea. Mulțumesc! - http://wordpress.stackexchange.com/questions/40587/shouldnt-this-be-easy-custom-post-type-custom-taxonomy-permalink

Mulțumesc @TheDeadMechanic, răspunsul tău m-a ajutat, dar doar parțial. Voiam să fac același lucru pe care l-a întrebat @RodeoRamsey, dar cu categorii imbricate (adică: mysite.com/products/category1/child-category-1/grandchild-category-1/product-name
) iar soluția ta nu a funcționat pentru asta.
În sfârșit am găsit o soluție extinsă la întrebarea mea care funcționează, așa că dacă altcineva are nevoie de categorii/subcategorii imbricate, puteți vedea o soluție detaliată pe întrebarea mea. Sper să ajute și pe alții și mulțumesc pentru pașii inițiali.

Nu sunt sigur dacă WordPress suportă această structură din cutie - dar poți crea cu ușurință propriile reguli de rescriere pentru a realiza acest lucru.
Verifică un răspuns anterior aici Rescriere URL autor.
Poți modifica linia
$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';
în ceva de genul
$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';
partea cu product_cat poate fi redundantă aici - nu sunt sigur dacă este necesară.
Poți adăuga orice reguli dorești și acestea vor avea prioritate față de cele încorporate.

Ei, nu e interesant. Oh, Doamne, cred că regulile personalizate de rescriere sunt prea complicate pentru mine. Am încercat codul de mai sus (și restul din celălalt post) și nu s-a schimbat nimic. Am resetat totul și am încercat din nou, dar încă fără schimbare, așa că am comentat toate regulile de rescriere setate în tipurile personalizate de postări și taxonomii, am resetat și tot nimic.

Da, mă enerva înainte să setez permalink-ul pentru tipul de postare personalizată. Am găsit un plugin care gestionează tipul de postare personalizată. Este foarte ușor de utilizat. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP ar trebui să adauge această funcționalitate în nucleul sistemului! Leo

Am văzut această soluție înainte și am evitat să o folosesc pentru că era menționat că este "pentru taxonomii neierarhice". Aveam o taxonomie setată ca ierarhică, așa că nu am crezut că va funcționa, dar până acum, se pare că a făcut treaba! În plus, pare să funcționeze pentru a obține structura /produse/nume-categorie/nume-produs/ pe care încercam să o realizez (vezi comentariul la celălalt răspuns). @TheDeadMedic, este aceasta o opțiune viabilă? Sau ar trebui să rămân la rescrierile din fișierul functions.php?

De fapt, este destul de ușor. Ai nevoie doar de o singură linie. Iată codul meu:
function create_product_taxonomies()
{
// Adaugă o nouă taxonomie, fă-o ierarhică (ca categoriile)
$labels = array(
'name' => _x('Categorii', 'nume general taxonomie'),
'singular_name' => _x('Categorie', 'nume singular taxonomie'),
'search_items' => __('Caută Categorii'),
'all_items' => __('Toate Categoriile'),
'parent_item' => __('Categorii Părinte'),
'parent_item_colon' => __('Categorii Părinte:'),
'edit_item' => __('Editează Categorie'),
'update_item' => __('Actualizează Categorie'),
'add_new_item' => __('Adaugă Categorie Nouă'),
'new_item_name' => __('Nume Categorie Nouă'),
'menu_name' => __('Categorie'),
);
register_taxonomy('product_cat', array('product_listing'), array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => array('hierarchical' => true),
));
Și aplicat la taxonomia generată pentru CPT-ul meu Reviews de pe GenerateWP.com. Folosesc asta pe propriul meu site WordPress, https://www.wpstarters.com
function reviews_category_taxonomy() {
$labels = array(
'name' => _x( 'Categorii Recenzii', 'Nume General Taxonomie', 'reviews_category' ),
'singular_name' => _x( 'Categorie Recenzie', 'Nume Singular Taxonomie', 'reviews_category' ),
'menu_name' => __( 'Categorie Recenzie', 'reviews_category' ),
'all_items' => __( 'Toate Categoriile de Recenzii', 'reviews_category' ),
'parent_item' => __( 'Categorie Părinte Recenzie', 'reviews_category' ),
'parent_item_colon' => __( 'Categorie Părinte Recenzie:', 'reviews_category' ),
'new_item_name' => __( 'Nume Categorie Recenzie Nouă', 'reviews_category' ),
'add_new_item' => __( 'Adaugă Categorie Recenzie Nouă', 'reviews_category' ),
'edit_item' => __( 'Editează Categorie Recenzie', 'reviews_category' ),
'update_item' => __( 'Actualizează Categorie Recenzie', 'reviews_category' ),
'view_item' => __( 'Vezi Categorie Recenzie', 'reviews_category' ),
'separate_items_with_commas' => __( 'Separează elementele cu virgule', 'reviews_category' ),
'add_or_remove_items' => __( 'Adaugă sau elimină elemente', 'reviews_category' ),
'choose_from_most_used' => __( 'Alege dintre cele mai folosite', 'reviews_category' ),
'popular_items' => __( 'Categorii Recenzii Populare', 'reviews_category' ),
'search_items' => __( 'Caută Elemente', 'reviews_category' ),
'not_found' => __( 'Nu s-a găsit', 'reviews_category' ),
'no_terms' => __( 'Fără Categorii Recenzii', 'reviews_category' ),
'items_list' => __( 'Listă Categorii Recenzii', 'reviews_category' ),
'items_list_navigation' => __( 'Navigare listă Categorii Recenzii', '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 );
Tot ce trebuie să faci este să adaugi 'rewrite' => array('hierarchical' => true),
