Benutzerdefinierte Post-Typen, Taxonomien und Permalinks

Das macht mich verrückt und ich bin mir sicher, dass es einfach ist, aber nichts, nach dem ich suche, hat eine einfache Struktur (alles ist sehr komplex).

Ich habe einen benutzerdefinierten product_listing und eine benutzerdefinierte Taxonomie von product_cat (die hierarchisch ist und ähnliche Kategorien haben sollte).

Ich möchte einfach, dass meine URLs wie folgt aussehen:

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

Aber für das Leben von mir, egal was ich tue, bekomme ich das gefürchtete 404 Problem. Seiten funktionieren einwandfrei und Posts funktionieren, aber meine benutzerdefinierten Posts funktionieren nicht korrekt. Sie erscheinen als:

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

Was eigentlich funktioniert ! Es ist nur so, dass ich meine benutzerdefinierte Taxonomie dort sehen möchte und ich möchte auf die taxonomy.php Vorlage zugreifen können, die ich eingerichtet habe, indem ich gehe zu:

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

Keine meiner Schnecken ist gleich, und ich möchte auch nicht. Hier ist der Post-Typ und Taxonomie-Teil meiner functions.php Datei:

 ///// 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' ), ) ); } 

Ich habe auch eine andere benutzerdefinierte Taxonomie von scents dass ich am liebsten eine Art freundlicher URL hätte, aber ich bin diesbezüglich offener. Ich möchte vielleicht auf eine Liste aller Düfte mysite.com/products/scents , indem ich zu mysite.com/products/scents gehe, aber sie müssen nicht kategoriespezifisch sein.

Kann mir jemand helfen?

Solutions Collecting From Web of "Benutzerdefinierte Post-Typen, Taxonomien und Permalinks"

Ändern Sie den slug in Ihren Post-Typ-Argumenten in products/%product_cat% , und products/%product_cat% in Ihren Taxonomie-Argumenten nur products products/%product_cat% , und products/%product_cat% Sie dann Ihre Umschreibungsregeln. WordPress sollte jetzt /products/my-product-cat/post-name/ !

Jetzt müssen wir WordPress ein bisschen bei der Erstellung von Permalinks helfen (das permastruct-Tag %product_cat% wird nicht sofort %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 ); 

Eine Sache zu beachten, das wird nur die erste Produktkategorie für den Post nach Namen bestellt . Wenn Sie einem Produkt mehrere Kategorien zuweisen, kann ich leicht ändern, wie es bestimmt, welche im Permalink verwendet wird.

Lass mich wissen, wie es dir geht und wir können die anderen Probleme angehen!

Danke @TheDeadMechanic, deine Antwort hat mir geholfen, aber nur teilweise. Ich wollte das gleiche tun, wie @ RodeoRamsey es verlangt hat, aber mit verschachtelten Kategorien ( mysite.com/products/category1/child-category-1/grandchild-category-1/product-name : mysite.com/products/category1/child-category-1/grandchild-category-1/product-name ) und deine Lösung hat nicht funktioniert dafür.

Ich habe schließlich eine erweiterte Lösung für meine Frage gefunden, die funktioniert. Wenn also jemand andere verschachtelte Kategorien / Unterkategorien benötigt, können Sie eine detaillierte Lösung für meine eigene Frage finden. Hoffe es hilft anderen und danke für die ersten Schritte.

Ich bin nicht sicher, dass wp diese Struktur aus der Box unterstützt – aber Sie können sehr einfach Ihre eigenen Rewrite-Regeln erstellen, um dies zu tun.

Sehen Sie sich eine vorherige Antwort hier an Autor URL neu schreiben .

Sie können die Linie ändern

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

zu etwas wie

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

Der Teil product_cat kann hier überflüssig sein – ich bin mir nicht sicher, ob es benötigt wird.

Sie können beliebige Regeln hinzufügen, die Vorrang vor den eingebauten haben.

Ja, es hat mich verrückt gemacht, bevor ich den Permalink für den benutzerdefinierten Post-Typ gesetzt habe. Ich habe ein Plugin gefunden, um den benutzerdefinierten Post-Typ zu bearbeiten. Es ist sehr einfach zu bedienen. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP sollte dies als corefunktion hinzufügen! Löwe

Eigentlich ist es ziemlich einfach. Du brauchst nur eine Zeile. Hier ist mein Code

 function create_product_taxonomies ()
 {
 // Neue Taxonomie hinzufügen, hierarchisch machen (wie Kategorien)
     $ labels = Array (
         'name' => _x ('Kategorien', 'Taxonomie allgemeiner Name'),
         'singular_name' => _x ('Kategorie', 'Name der Taxonomie'),
         'search_items' => __ ('Suchkategorien'),
         'all_items' => __ ('Alle Kategorien'),
         'parent_item' => __ ('Übergeordnete Kategorien'),
         'parent_item_colon' => __ ('Übergeordnete Kategorien:'),
         'edit_item' => __ ('Kategorie bearbeiten'),
         'update_item' => __ ('Kategorie aktualisieren'),
         'add_new_item' => __ ('Neue Kategorie hinzufügen'),
         'new_item_name' => __ ('Neuer Kategoriename'),
         'menu_name' => __ ('Kategorie'),
     );

     Register_Taxonomie ('Produkt_Kat', Array ('Produkt_Liste'), Array (
         'hierarchisch' => wahr,
         'labels' => $ labels,
         'show_ui' => wahr,
         'query_var' => wahr,
         'rewrite' => array ('hierarchisch' => true),
     ));

Und angewendet auf die generierte Taxonomie für meine Reviews CPT von GenerateWP.com. Ich benutze dies auf meiner eigenen WordPress-Website, https://www.wpstarters.com

 function Bewertungen_Kategorie_Taxonomie () {

     $ labels = Array (
         'name' => _x ('Bewertungen Kategorien', 'Taxonomie Allgemeiner Name', 'Bewertungen_Kategorie'),
         'singular_name' => _x ('Bewertungen Kategorie', 'Taxonomy Singular Name', 'reviews_category'),
         'menu_name' => __ ('Bewertungen Kategorie', 'Bewertungen_Kategorie'),
         'all_items' => __ ('Alle Review Kategorien', 'reviews_category'),
         'parent_item' => __ ('Übergeordnete Überprüfungskategorie', 'reviews_category'),
         'parent_item_colon' => __ ('Übergeordnete Überprüfungskategorie:', 'reviews_category'),
         'new_item_name' => __ ('Name der neuen Review-Kategorie', 'reviews_category'),
         'add_new_item' => __ ('Neue Review-Kategorie hinzufügen', 'reviews_category'),
         'edit_item' => __ ('Bewertungskategorie bearbeiten', 'reviews_category'),
         'update_item' => __ ('Review-Kategorie aktualisieren', 'reviews_category'),
         'view_item' => __ ('View Review Category', 'reviews_category'),
         'separate_items_with_commas' => __ ('Teile mit Kommas trennen', 'reviews_category'),
         'add_or_remove_items' => __ ('Objekte hinzufügen oder entfernen', 'reviews_category'),
         'choose_from_most_used' => __ ('Wählen Sie aus den am häufigsten verwendeten', 'reviews_category'),
         'popular_items' => __ ('Beliebte Review Kategorien', 'reviews_category'),
         'search_items' => __ ('Suchelemente', 'reviews_category'),
         'not_found' => __ ('Nicht gefunden', 'reviews_category'),
         'no_terms' => __ ('Keine Review-Kategorien', 'reviews_category'),
         'items_list' => __ ('Liste der Kategorien überprüfen', 'reviews_category'),
         'items_list_navigation' => __ ('Kategorienlistennavigation', 'reviews_category'),
     );
     $ args = Array (
         'labels' => $ labels,
         'hierarchisch' => wahr,
         "öffentlich" => wahr,
         'show_ui' => wahr,
         'show_admin_column' => wahr,
         'show_in_nav_menus' => wahr,
         'show_tagcloud' => falsch,
         'show_in_rest' => wahr,
         'rewrite' => array ('hierarchisch' => true),
     );
     register_taxonomie ('reviews_category', array ('wps_reviews'), $ args);

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

Alles was du brauchst ist also das ‘rewrite’ => array (‘hierarchisch’ => true),