Entfernen Sie den benutzerdefinierten Posttyp-Slug aus der URL und fügen Sie den Taxonomie-Slug hinzu

Ich habe ein Problem beim Ändern einer benutzerdefinierten Post-URL. Die URL des aktuellen Beitragstyps lautet:

http://example.com/product/product-slug 

wo Produkt ist ein benutzerdefinierter Beitragstyp.

Ich möchte es ändern zu:

 http://domain.com/brand/brand-slug/product-slug 

Wo Marke ist die benutzerdefinierte Taxonomie.

Ich habe einen Code gefunden, der /product/ von der URL des benutzerdefinierten Post-Typs entfernt und für mich funktioniert. Ich verwende folgenden Code.

 function gp_remove_cpt_slug( $post_link, $post, $leavename ) { if ( 'product' != $post->post_type || 'publish' != $post->post_status ) { return $post_link; } $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link ); return $post_link; } add_filter( 'post_type_link', 'gp_remove_cpt_slug', 10, 3 ); function gp_parse_request_trick( $query ) { // Only noop the main query if ( ! $query->is_main_query() ) return; // Only noop our very specific rewrite rule match if ( 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } // 'name' will be set if post permalinks are just post_name, otherwise the page rule will match if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'page', 'product' ) ); } } add_action( 'pre_get_posts', 'gp_parse_request_trick' ); 

Permalink Einstellung ist /%postname%/ . Aber wenn ich die Permalink-Einstellung auf /brand/%brand%/%postname%/ , beginnen alle benutzerdefinierten Post-Typen, mir 404 Fehler zu geben.

Bitte schlagen Sie vor, welche Änderungen im obigen Code vorgenommen werden müssen, damit es funktioniert.

Solutions Collecting From Web of "Entfernen Sie den benutzerdefinierten Posttyp-Slug aus der URL und fügen Sie den Taxonomie-Slug hinzu"

Sie können beim Registrieren des Post-Typs einfache Steuer / CPT-Permalinks mit dem Argument zum erneuten Schreiben einrichten:

 function wpd_product_brand_types() { register_taxonomy( 'brand', 'product', array( 'rewrite' => array( 'slug' => 'brand', 'with_front' => false ) ) ); register_post_type( 'product', array( 'label' => 'Products', 'public' => true, 'supports' => array( 'title' ), 'rewrite' => array( 'slug' => 'brand/%brand%', 'with_front' => false ) ) ); } add_action( 'init','wpd_product_brand_types' ); 

Dann post_type_link der post_type_link Filter den %brand% slug:

 function wpd_product_permalinks( $post_link, $post ){ if ( is_object( $post ) && $post->post_type == 'product' ){ $terms = wp_get_object_terms( $post->ID, 'brand' ); if( $terms ){ return str_replace( '%brand%' , $terms[0]->slug , $post_link ); } } return $post_link; } add_filter( 'post_type_link', 'wpd_product_permalinks', 1, 2 );