Hinzufügen von Kategorien zum benutzerdefinierten Post-Typ in Permalink

Ich weiß, dass die Leute das schon einmal gefragt haben und so weit gegangen sind, den benutzerdefinierten Post-Typ hinzuzufügen und für Permalink umzuschreiben.

Das Problem ist, dass ich 340 existierende Kategorien habe, die ich gerne weiter nutzen würde. Früher konnte ich / category / subcategory / postname sehen

Jetzt habe ich den Slug von customposttype / postname. Die Auswahl der Kategorie wird nicht mehr in Permalink angezeigt … Ich habe die Permalink-Einstellung in Admin nicht geändert.

Gibt es etwas, das mir fehlt oder diesem Code hinzugefügt werden muss?

function jcj_club_post_types() { register_post_type( 'jcj_club', array( 'labels' => array( 'name' => __( 'Jazz Clubs' ), 'singular_name' => __( 'Jazz Club' ), 'add_new' => __( 'Add New' ), 'add_new_item' => __( 'Add New Jazz Club' ), 'edit' => __( 'Edit' ), 'edit_item' => __( 'Edit Jazz Clubs' ), 'new_item' => __( 'New Jazz Club' ), 'view' => __( 'View Jazz Club' ), 'view_item' => __( 'View Jazz Club' ), 'search_items' => __( 'Search Jazz Clubs' ), 'not_found' => __( 'No jazz clubs found' ), 'not_found_in_trash' => __( 'No jazz clubs found in Trash' ), 'parent' => __( 'Parent Jazz Club' ), ), 'public' => true, 'show_ui' => true, 'publicly_queryable' => true, 'exclude_from_search' => false, 'menu_position' => 5, 'query_var' => true, 'supports' => array( 'title', 'editor', 'comments', 'revisions', 'trackbacks', 'author', 'excerpt', 'thumbnail', 'custom-fields', ), 'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ), 'taxonomies' => array( 'category','post_tag'), 'can_export' => true, ) ); 

Solutions Collecting From Web of "Hinzufügen von Kategorien zum benutzerdefinierten Post-Typ in Permalink"

Es gibt zwei Angriffspunkte, die abgedeckt werden müssen, wenn Sie benutzerdefinierte Umformungsregeln für Post-Typen hinzufügen:

Regeln neu schreiben

Dies geschieht, wenn die Rewrite-Regeln in wp-includes/rewrite.php in WP_Rewrite::rewrite_rules() . Mit WordPress können Sie die Rewrite-Regeln für bestimmte Elemente wie Posts, Seiten und verschiedene Arten von Archiven filtern. Wo posttype_rewrite_rules posttype sollte der posttype Teil der Name Ihres benutzerdefinierten posttype sein. Alternativ können Sie den post_rewrite_rules Filter verwenden, solange Sie nicht auch die Standard-Post-Regeln post_rewrite_rules .

Als nächstes brauchen wir die function, um die Rewrite-Regeln zu erzeugen:

 // add our new permastruct to the rewrite rules add_filter( 'posttype_rewrite_rules', 'add_permastruct' ); function add_permastruct( $rules ) { global $wp_rewrite; // set your desired permalink structure here $struct = '/%category%/%year%/%monthnum%/%postname%/'; // use the WP rewrite rule generating function $rules = $wp_rewrite->generate_rewrite_rules( $struct, // the permalink structure EP_PERMALINK, // Endpoint mask: adds rewrite rules for single post endpoints like comments pages etc... false, // Paged: add rewrite rules for paging eg. for archives (not needed here) true, // Feed: add rewrite rules for feed endpoints true, // For comments: whether the feed rules should be for post comments - on a singular page adds endpoints for comments feed false, // Walk directories: whether to generate rules for each segment of the permastruct delimited by '/'. Always set to false otherwise custom rewrite rules will be too greedy, they appear at the top of the rules true // Add custom endpoints ); return $rules; } 

Die Hauptsache, auf die Sie hier achten sollten, wenn Sie sich dazu entschließen, herumzuspielen, ist die boolesche ‘Walk-Verzeichnisse’. Es generiert Rewrite-Regeln für jedes Segment eines Permastruct und kann zu Fehlanpassungen der Rewrite-Regel führen. Wenn eine WordPress-URL angefordert wird, wird das Array rewrite rules von oben nach unten geprüft. Sobald ein Match gefunden wird, wird es laden, was auch immer es gestoßen ist, zum Beispiel wenn Ihr Permastruct eine gierige Übereinstimmung hat, z. für /%category%/%postname%/ und walk directories is on, gibt es Rewrite-Regeln für beide /%category%/%postname%/ AND /%category%/ die zu allem passen. Wenn das zu früh passiert, bist du verrückt.

Permalinks

Dies ist die function, die die Permalinks des Post-Typs analysiert und ein Permastruct (zB ‘/% Jahr% /% Monat%% /% Postname% /’) in eine tatsächliche URL umwandelt.

Der nächste Teil ist ein einfaches Beispiel für eine Version der function get_permalink() in wp-includes/link-template.php . Benutzerdefinierte post-Permalinks werden von get_post_permalink() generiert, was eine stark verwässerte Version von get_permalink() . get_post_permalink() wird nach post_type_link gefiltert, damit wir eine benutzerdefinierte Permastruktur erstellen können.

 // parse the generated links add_filter( 'post_type_link', 'custom_post_permalink', 10, 4 ); function custom_post_permalink( $permalink, $post, $leavename, $sample ) { // only do our stuff if we're using pretty permalinks // and if it's our target post type if ( $post->post_type == 'posttype' && get_option( 'permalink_structure' ) ) { // remember our desired permalink structure here // we need to generate the equivalent with real data // to match the rewrite rules set up from before $struct = '/%category%/%year%/%monthnum%/%postname%/'; $rewritecodes = array( '%category%', '%year%', '%monthnum%', '%postname%' ); // setup data $terms = get_the_terms($post->ID, 'category'); $unixtime = strtotime( $post->post_date ); // this code is from get_permalink() $category = ''; if ( strpos($permalink, '%category%') !== false ) { $cats = get_the_category($post->ID); if ( $cats ) { usort($cats, '_usort_terms_by_ID'); // order by ID $category = $cats[0]->slug; if ( $parent = $cats[0]->parent ) $category = get_category_parents($parent, false, '/', true) . $category; } // show default category in permalinks, without // having to assign it explicitly if ( empty($category) ) { $default_category = get_category( get_option( 'default_category' ) ); $category = is_wp_error( $default_category ) ? '' : $default_category->slug; } } $replacements = array( $category, date( 'Y', $unixtime ), date( 'm', $unixtime ), $post->post_name ); // finish off the permalink $permalink = home_url( str_replace( $rewritecodes, $replacements, $struct ) ); $permalink = user_trailingslashit($permalink, 'single'); } return $permalink; } 

Wie bereits erwähnt, ist dies ein sehr vereinfachter Fall zum Generieren eines benutzerdefinierten Rewrite-Regelsatzes und von Permalinks. Es ist nicht besonders flexibel, aber es sollte ausreichen, um Ihnen den Einstieg zu erleichtern.

Betrug

Ich habe ein Plugin geschrieben, mit dem Sie Permastructs für jeden beliebigen Post-Typ definieren können. Wie Sie %category% in der Permalink-Struktur für Posts verwenden können, unterstützt mein Plugin %custom_taxonomy_name% für alle benutzerdefinierten Taxonomien, in denen custom_taxonomy_name der Name Ihrer Taxonomie ist z.B. %club% .

Es funktioniert wie erwartet mit hierarchischen / nicht-hierarchischen Taxonomien.

http://wordpress.org/extend/plugins/wp-permastructure/

Ich habe eine Lösung gefunden !!!

(Nach endlosen Recherchen .. Ich kann Permalinks für CUSTOM POST TYPE haben wie:
example.com/category/sub_category/my-post-name

hier der Code (in functions.php oder plugin):

 //===STEP 1 (affect only these CUSTOM POST TYPES) $GLOBALS['my_post_typesss__MLSS'] = array('my_product1','....'); //===STEP 2 (create desired PERMALINKS) add_filter('post_type_link', 'my_func88888', 6, 4 ); function my_func88888( $post_link, $post, $sdsd){ if (!empty($post->post_type) && in_array($post->post_type, $GLOBALS['my_post_typesss']) ) { $SLUGG = $post->post_name; $post_cats = get_the_category($id); if (!empty($post_cats[0])){ $target_CAT= $post_cats[0]; while(!empty($target_CAT->slug)){ $SLUGG = $target_CAT->slug .'/'.$SLUGG; if (!empty($target_CAT->parent)) {$target_CAT = get_term( $target_CAT->parent, 'category');} else {break;} } $post_link= get_option('home').'/'. urldecode($SLUGG); } } return $post_link; } // STEP 3 (by default, while accessing: "EXAMPLE.COM/category/postname" WP thinks, that a standard post is requested. So, we are adding CUSTOM POST TYPE into that query. add_action('pre_get_posts', 'my_func4444', 12); function my_func4444($q){ if ($q->is_main_query() && !is_admin() && $q->is_single){ $q->set( 'post_type', array_merge(array('post'), $GLOBALS['my_post_typesss'] ) ); } return $q; } 

Habe die Lösung!

Um hierarchische Permalinks für benutzerdefinierte Post-Typ zu haben, installieren Sie das Plugin für benutzerdefinierte Post-Typ Permalinks ( https://wordpress.org/plugins/custom-post-type-permalinks/ ).

Aktualisieren Sie den registrierten Posttyp. Ich habe einen Post-Typ-Namen als Hilfe

 function help_centre_post_type(){ register_post_type('helpcentre', array( 'labels' => array( 'name' => __('Help Center'), 'singular_name' => __('Help Center'), 'all_items' => __('View Posts'), 'add_new' => __('New Post'), 'add_new_item' => __('New Help Center'), 'edit_item' => __('Edit Help Center'), 'view_item' => __('View Help Center'), 'search_items' => __('Search Help Center'), 'no_found' => __('No Help Center Post Found'), 'not_found_in_trash' => __('No Help Center Post in Trash') ), 'public' => true, 'publicly_queryable'=> true, 'show_ui' => true, 'query_var' => true, 'show_in_nav_menus' => false, 'capability_type' => 'page', 'hierarchical' => true, 'rewrite'=> [ 'slug' => 'help-center', "with_front" => false ], "cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/", 'menu_position' => 21, 'supports' => array('title','editor', 'thumbnail'), 'has_archive' => true )); flush_rewrite_rules(); } add_action('init', 'help_centre_post_type'); 

Und hier ist eine registrierte Taxonomie

 function themes_taxonomy() { register_taxonomy( 'help_centre_category', 'helpcentre', array( 'label' => __( 'Categories' ), 'rewrite'=> [ 'slug' => 'help-center', "with_front" => false ], "cptp_permalink_structure" => "/%help_centre_category%/", 'hierarchical' => true, 'public' => true, 'show_ui' => true, 'show_admin_column' => true, 'show_in_nav_menus' => true, 'query_var' => true ) ); } add_action( 'init', 'themes_taxonomy'); 

Diese Linie macht Ihren Permalink funktioniert

 "cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/", 

Sie können %post_id% entfernen und /%help_centre_category%/%postname%/"

Vergessen Sie nicht, Permalinks aus dem Dashboard zu spülen.

Sie haben mehrere Fehler mit Ihrem Code. Ich habe deinen bestehenden Code aufgeräumt:

 < ?php function jcj_club_post_types() { $labels = array( 'name' => __( 'Jazz Clubs' ), 'singular_name' => __( 'Jazz Club' ), 'add_new' => __( 'Add New' ), 'add_new_item' => __( 'Add New Jazz Club' ), 'edit' => __( 'Edit' ), 'edit_item' => __( 'Edit Jazz Clubs' ), 'new_item' => __( 'New Jazz Club' ), 'view' => __( 'View Jazz Club' ), 'view_item' => __( 'View Jazz Club' ), 'search_items' => __( 'Search Jazz Clubs' ), 'not_found' => __( 'No jazz clubs found' ), 'not_found_in_trash' => __( 'No jazz clubs found in Trash' ), 'parent' => __( 'Parent Jazz Club' ), ); $args = array( 'public' => true, 'show_ui' => true, 'publicly_queryable' => true, 'exclude_from_search' => false, 'menu_position' => 5, 'query_var' => true, 'supports' => array( 'title','editor','comments','revisions','trackbacks','author','excerpt','thumbnail','custom-fields' ), 'rewrite' => array( 'slug' => 'jazz-clubs-in', 'with_front' => true ), 'has_archive' => true ); register_post_type( 'jcj_club', $args ); } add_action( 'init','jcj_club_post_types' ); ?> 

Ersetzen Sie Ihren Code durch den obigen Code und sehen Sie, ob es funktioniert. Antworte zurück wenn du weitere Fragen hast und ich werde versuchen zu helfen.

BEARBEITEN:

Ich bemerkte, dass ich 'has_archive' => true .