Wie erreiche ich diesen Permalink -> Kategorie-Name / Custom-Post-Typ-Name / Post-Name

Ich versuche Kategorien zu verwenden, um die Struktur für meine Website bereitzustellen. Ich werde Abschnitte auf meiner Website namens England, Wales, Schottland und Irland erstellen. Dies werden Kategorien sein. Meine Posts verwenden benutzerdefinierte Post-Typen – Video, Guide, Event, Clubs etc.

Also, wenn ich einen Beitrag mit dem Namen “Trouble down south” mit dem CPT “Video” erstelle und ihn an die Kategorie “England” anschließe, hätte ich gerne das Slug-Format:

Kategorie-Name / Benutzerdefiniert-Post-Typ-Name / Post-Name

zB mysite.com/england/video/troubles-down-south

Ich möchte auch, dass die folgenden Permalinks so funktionieren:

mysite.com/england/Zeige alle Beiträge in dieser Kategorie unabhängig von CPT

mysite.com/video/ – zeige alle Video CPT Beiträge unabhängig von der Kategorie

Bleibt bei meinem Beispiel, ich erstelle meinen Video CPT so:

add_action( 'init', 'register_cpt_video' ); function register_cpt_video() { $labels = array( 'name' => _x( 'videos', 'video' ), some code... ); $args = array( some code... 'taxonomies' => array( 'category' ), some code... 'has_archive' => true, 'rewrite' => array( 'slug' => 'video', 'with_front' => false, 'feeds' => true, 'pages' => true ), 'capability_type' => 'post' ); register_post_type( 'video', $args ); } 

Das macht fast das, was ich brauche. Ich bekomme die richtigen Einträge bei

mysite.com/england (dh Kategorie Archivseite)

und

mysite.com/video ( zB CPT-Archivseite)

Leider, wenn ich auf den eigentlichen Beitrag klicke, zeigt sich der Slug als

mysite.com/video/troubles-down-south

Ich möchte

mysite.com/england/video/troubles-down-south

Ich habe versucht, den folgenden Umschreibungs-Slug zu verwenden

 'slug' => '%category%/video', 

Das funktioniert nicht. % category% wird wörtlich in die URL eingefügt, ohne in den eigentlichen Kategorienamen umgewandelt zu werden.

Ich habe diese Seite nach einer Lösung durchsucht, aber keine gefunden. Die meisten verwandten Antworten scheinen sich damit zu befassen, Taxonomien an den CPT-Block anzuhängen.

zB mysite.com/video/england/troubles-down-south

Sie scheinen dies zu erreichen, indem sie dem Taxonomie-Umschreibungs-Slug den CPT-Namen explizit voranstellen, der die kaskadenartige Natur der Umschreibregeln ausnutzt (plus einige andere Zauberei, die ich nicht verstehe).

Wie auch immer, nichts, was ich gefunden habe, hat meine Anforderung von category-name / custom-post-type-name / post-name , plus die Archivseiten, die ich benötige, angesprochen.

Irgendwelche Ideen, wie ich meine gewünschte Permalink-Struktur erreichen kann?

Solutions Collecting From Web of "Wie erreiche ich diesen Permalink -> Kategorie-Name / Custom-Post-Typ-Name / Post-Name"

Sie müssen 'post_type_link' filtern 'post_type_link' um den entsprechenden Permalink zu erstellen. Siehe diese Antwort für ein ähnliches Beispiel.

Der folgende Code funktioniert:

 add_action( 'init', array ( 'WPSE_63343', 'init' ) ); class WPSE_63343 { protected $post_type = 'video'; public static function init() { new self; } public function __construct() { $args = array ( 'public' => TRUE, 'rewrite' => array( 'slug' => '[^/]+/' . $this->post_type .'/([^/]+)/?$' ), 'has_archive' => TRUE, 'supports' => array( 'title', 'editor' ), 'taxonomies' => array( 'category' ), 'labels' => array ( 'name' => 'Video', 'singular_name' => 'Video' ) ); register_post_type( $this->post_type, $args ); add_rewrite_rule( '[^/]+/' . $this->post_type .'/([^/]+)/?$', 'index.php?post_type=' . $this->post_type . '&pagename=$matches[1]', 'top' ); // Inject our custom structure. add_filter( 'post_type_link', array ( $this, 'fix_permalink' ), 1, 2 ); # uncomment for debugging # add_action( 'wp_footer', array ( $this, 'debug' ) ); } /** * Print debug data into the 404 footer. * * @wp-hook wp_footer * @since 2012.09.04 * @return void */ public function debug() { if ( ! is_404() ) { return; } global $wp_rewrite, $wp_query; print '
' . htmlspecialchars( print_r( $wp_rewrite, TRUE ) ) . '

'; print '

' . htmlspecialchars( print_r( $wp_query, TRUE ) ) . '

'; } /** * Filter permalink construction. * * @wp-hook post_type_link * @param string $post_link default link. * @param int $id Post ID * @return string */ public function fix_permalink( $post_link, $id = 0 ) { $post = &get_post( $id ); if ( is_wp_error($post) || $post->post_type != $this->post_type ) { return $post_link; } // preview empty ( $post->slug ) and ! empty ( $post->post_title ) and $post->slug = sanitize_title_with_dashes( $post->post_title ); $cats = get_the_category( $post->ID ); if ( ! is_array( $cats ) or ! isset ( $cats[0]->slug ) ) { return $post_link; } return home_url( user_trailingslashit( $cats[0]->slug . '/' . $this->post_type . '/' . $post->slug ) ); } }

Vergessen Sie nicht, die Permalink-Einstellungen einmal zu besuchen, um die gespeicherten Rewrite-Regeln zu aktualisieren.

 add_action( 'init', 'register_my_types' ); function register_my_types() { register_post_type( 'recipes', array( 'labels' => array( 'name' => __( 'Recipes' ), 'singular_name' => __( 'Recipee' ) ), 'public' => true, 'has_archive' => true, ) ); register_taxonomy( 'country', array( 'recipes' ), array( 'hierarchical' => true, 'label' => 'Country' ) ); } // Add our custom permastructures for custom taxonomy and post add_action( 'wp_loaded', 'add_clinic_permastructure' ); function add_clinic_permastructure() { global $wp_rewrite; add_permastruct( 'country', 'recipes/%country%', false ); add_permastruct( 'recipes', 'country/%country%/recipes/%recipes%', false ); } // Make sure that all links on the site, include the related texonomy terms add_filter( 'post_type_link', 'recipe_permalinks', 10, 2 ); function recipe_permalinks( $permalink, $post ) { if ( $post->post_type !== 'recipes' ) return $permalink; $terms = get_the_terms( $post->ID, 'country' ); if ( ! $terms ) return str_replace( '%country%/', '', $permalink ); //$post_terms = array(); foreach ( $terms as $term ) $post_terms = $term->slug; print_r($permalink); return str_replace( '%country%', $post_terms , $permalink ); } // Make sure that all term links include their parents in the permalinks add_filter( 'term_link', 'add_term_parents_to_permalinks', 10, 2 ); function add_term_parents_to_permalinks( $permalink, $term ) { $term_parents = get_term_parents( $term ); foreach ( $term_parents as $term_parent ) $permlink = str_replace( $term->slug, $term_parent->slug . ',' . $term->slug, $permalink ); return $permlink; } // Helper function to get all parents of a term function get_term_parents( $term, &$parents = array() ) { $parent = get_term( $term->parent, $term->taxonomy ); if ( is_wp_error( $parent ) ) return $parents; $parents[] = $parent; if ( $parent->parent ) get_term_parents( $parent, $parents ); return $parents; } 

über Code einfügen in der Datei theme function.php und ändere die Permalink-Option /%category/%postname%/ %