Entfernen Sie den Slug aus den benutzerdefinierten Post-URLs vom Post-Typ
-
-
Ichglaube,ich kratztemir am Kopf,warum du dastunmöchtest.Verwirrt.I guess I'm scratching my head as to why you would want to do that? Confused.
- 0
- 2017-05-29
- Michael Ecklund
-
@MichaelEcklund,dajedes CPT,das zum Erstellen öffentlich zugänglicher Webseiten verwendet wird,einen erzwungenen Slug-Namenin der URL hat.Esgibt tatsächlich viele wp-Entwickler,die versuchen,die Schnecke sicher zuentfernen.@MichaelEcklund because any CPT that is used to create public facing web pages has a forced slug name in the URL. There is actually a lot of wp devs looking to remove the slug safely.
- 3
- 2017-07-18
- Ben Racicot
-
10 Antworten
- Stimmen
-
- 2015-09-30
Derfolgende Codefunktioniert,aber Siemüssennurbedenken,dass Konflikte leicht auftreten können,wenn der Slugfür Ihrenbenutzerdefinierten Beitragstypmit demeines Seiten- oder Post-Slugsidentischist ...
Zuerstentfernen wir die Schnecke aus dem Permalink:
function na_remove_slug( $post_link, $post, $leavename ) { if ( 'events' != $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', 'na_remove_slug', 10, 3 );
Es reichtnicht aus,nur die Schnecke zuentfernen. Im Momenterhalten Sieeine 404-Seite,da WordPressnurerwartet,dass sich Beiträge und Seiten so verhalten. Siemüssen außerdem Folgendes hinzufügen:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'events', 'page' ) ); } } add_action( 'pre_get_posts', 'na_parse_request' );
Ändern Sieeinfach "Ereignisse"in Ihrenbenutzerdefinierten Beitragstyp und losgeht's. Möglicherweisemüssen Sie Ihre Permalinks aktualisieren.
The following code will work, but you just have to keep in mind that conflicts can happen easily if the slug for your custom post type is the same as a page or post's slug...
First, we will remove the slug from the permalink:
function na_remove_slug( $post_link, $post, $leavename ) { if ( 'events' != $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', 'na_remove_slug', 10, 3 );
Just removing the slug isn't enough. Right now, you'll get a 404 page because WordPress only expects posts and pages to behave this way. You'll also need to add the following:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'events', 'page' ) ); } } add_action( 'pre_get_posts', 'na_parse_request' );
Just change "events" to your custom post type and you're good to go. You may need to refresh your permalinks.
-
Vielen Dank.Denken Sie,dass diesbesserist,als die Umschreibungenmanuell zuerstellen?Ich habe diese Lösunggesehen und sie kann die von Ihnenerwähnten Konfliktein Schach halten?thanks. Do you think this is better than creating the rewrites manually? I've seen that solution and it may keep the conflicts you mention at bay?
- 0
- 2015-10-01
- Ben Racicot
-
Ich denke,diesisteine gute automatisierte Lösung,wenn Sie sicher sind,dass Sie keine Konflikte verursachen.Diesist keinegute Lösung,wenn Sie diesfür ...einen Kundenbereitstellen,dernichttechnisch versiertist.I think this is a good automated solution if you're confident that you won't be creating conflicts. This isn't a good solution if you're providing this to... let's say a client that isn't tech savvy.
- 0
- 2015-10-01
- Nate Allen
-
Können Siebitte aktualisieren,wie dieser Codefürmehrere Beitragstypen verwendet wird?can you please update, how to use this code for multiple post types
- 1
- 2016-01-25
- Abin
-
Es schlägtmit nginxfehl,weil die Bedingung `2!=Count ($ query-> query)`.Mitnginx können Sie $ query-> query als `array ('page'=> '','name'=> '...','q'=> '...')` haben.Also @NateAllen,wasbedeutet diese Bedingung?It fails with nginx because the condition `2 != count( $query->query )`. With nginx, you can have $query->query as `array('page' => '', 'name' => '...', 'q' => '...')`. So @NateAllen, what is the meaning of that condition?
- 1
- 2016-11-08
- Fabio Montefuscolo
-
Wirbrauchenetwas Besseres.Unterstützungfür das Entfernen desintegrierten Slugs,damit später keine widersprüchlichen URLserstellt werden können.Die Art und Weise,wie reguläre Beiträge und Seitenihre URLserstellen.We need something better than this. Support to remove the slug built in so that we cannot create conflicting URLs later on. The way regular posts and pages create their URLs.
- 3
- 2017-07-18
- Ben Racicot
-
Istesnurich oderbricht dieseinige WordPress-bedingte Tags wieis_single () undis_singular ()?Is it just me or does this break some wordpress conditional tags like is_single() and is_singular()?
- 4
- 2017-07-18
- rob-gordon
-
Diese Lösung verursachte leidereinige defekte Links undmein Blog zeigte keine Beiträgemehr an und warnureine normale Seite.Untenfinden Sieeine bessere Lösung von Matt Keys.This solution unfortunately caused some broken links and my blog stopped showing posts and was just a normal page. See a better solution below by Matt Keys.
- 1
- 2018-10-08
- Radley Sustaire
-
Dieser Code setzt voraus,dass der Name "post_type"mit dem Namen desbenutzerdefinierten Post-Typs "slug"identischist,dernicht unbedingtin jedem Fall seinmuss.Aberim Übrigen wäreeine großartige Lösung,obwohlich der Meinungbin,dasseine native WP-Lösungbesser wäre.This code assumes that the `post_type` name is the same as the custom post type `slug` which doesn't necessarily have to be in every case. But for the rest, great solution although I agree a native WP solution would be better.
- 0
- 2019-06-14
- Marco Miltenburg
-
single- {cpt} .phpfunktioniertmit diesem Ansatznichtmehrsingle-{cpt}.php stops working using this approach
- 0
- 2020-01-05
- Saleh Mahmood
-
Für diejenigen,dieein Problemmit dem obigen Code haben,funktioniertes wieein Zauber,wenn Sie die zweite Funktion (**functionna_parse_request () **) durch diein dieser [Antwort] (https://wordpress.stackexchange)gefundeneersetzen.com/a/292379/175093).Vergessen Sienicht,den Codemit Ihremeigenen Namenfür denbenutzerdefinierten Beitragstyp zu ändern.For those who have a problem with the code above, it works like a charm if you replace the second function ( **function na_parse_request()** ) by the one found on this [answer](https://wordpress.stackexchange.com/a/292379/175093). Dont forget to modify the code with your own Custom Post Type name.
- 0
- 2020-04-03
- PhpDoe
-
Ich habe diesennetten Code verwendet,bis WP 5.2 kam.Nach dem Update schlägt dieser Codein meinem Plugin "Benutzerdefinierter Beitragstyp" undim Plugin "Erweitertebenutzerdefinierte Felder"fehl,da siemeiner Meinungnach dieselbe Funktion "pre_get_posts" verwenden. Anstelle dererweitertenbenutzerdefinierten Feldgruppen werdenmeine benutzerdefinierten Beiträgein diesem Plugin angezeigt.Scheitert auchmit dem CPT-UI-Plugin - kann keineneuen Beiträgemehrerstellen,sie werdennach dem Erstellennichtmehrin der Liste angezeigt.Bitte helfen Sie !!I have been using this nice code until WP 5.2 came. After the update this code starts to fail on my Custom Post Type plugin and Advanced Custom Fields plugin, because, I think, they are using the same pre_get_posts function, so instead of Advanced Custom Field Groups I see my custom posts in this plugin... Also fails with CPT UI plugin - can not create new posts anymore, they are not appearing in list after creating them. Please help!!
- 0
- 2020-05-04
- Gediminas
-
Esfunktioniertefüreinzelne Post-Typ.Wie verwendeich den Codefürmehrere Beitragstypen?It worked for single post type. How to use the code for multiple post type?
- 0
- 2020-07-02
- Swaranan Singha Barman
-
- 2017-04-12
Schreiben Sie denfolgenden Codein die Taxonomieregistrierung.
'rewrite' => [ 'slug' => '/', 'with_front' => false ]
Das Wichtigste,was Sienach dem Ändern des Codestunmüssen
Nachdem Sie Ihrbenutzerdefiniertes Post-Typ-Taxonomiedokumentgeändert haben,versuchen Sie,zu Einstellungen> Permalinks zu wechseln und Ihre Einstellungenerneut zu speichern . Andernfallserhalten Sie keine 404-Seitegefunden.
Write following code into the taxonomy registration.
'rewrite' => [ 'slug' => '/', 'with_front' => false ]
Most important thing that you have to do after code changing
After you’ve altered your custom post type taxonomy document, try to go to Settings > Permalinks and re-save your settings, else you will get 404 page not found.
-
Dasfunktionierttatsächlich,ich weißnicht,wie dasnochniemandbemerkt hat.Natürlich kann dies andere Seiten stören,wenn sie denselben Permalink haben,aber wennnicht,ist dieseine großartige Lösung.This actually works, i don't know how no one noticed this before. Of course this can interfere with other pages if they have same permalink, but if not this is a great solution.
- 0
- 2017-07-31
- Aleksandar Đorđević
-
Versuchte dies.Esgibt dasgewünschte Ergebnisfürmeine benutzerdefinierten Post-Typ-Links.Es "fängt"jedoch alle POST- oder PAGE-Post-Type-Slugs und versucht,sie als URLfürmeinen benutzerdefinierten Post-Typ aufzulösen,dann 404s.(Ja,ich habe Permalinksgespeichert).Tried this out. It gives the desired result for my custom post type links. However it 'catches' all POST or PAGE post type slugs and tries to resolve them as a URL for my custom post type, then 404s. (yes I've saved permalinks).
- 6
- 2017-10-05
- Matt Keys
-
Möglicherweisegibt esfürjede Seite undjedenbenutzerdefinierten Beitragstyp denselben Slug. Ändern Sie Ihren Seiten-Slug und überprüfen Sie dann ..There might be the same slug of any page and custom post type, change your page slug and then check..
- 0
- 2017-10-11
- Mayank Dudakiya
-
Dasfunktioniertnicht.Gibt 404 auch dann,wenn Sie Permalinks aktualisiert haben.This doesn't work. Gives 404 even when you've updated permalinks.
- 5
- 2017-11-12
- Christine Cooper
-
@ChristineCooper Siemüssen diesen Schrittbefolgen Nachdem Sie Ihrbenutzerdefiniertes Taxonomiedokument vom Typ "Post"geändert haben,gehen Sie zu "Einstellungen"> "Permalinks" und speichern Sie Ihre Einstellungenerneut. Andernfalls wird die 404-Seitenichtgefunden.@ChristineCooper You have to follow this step After you’ve altered your custom post type taxonomy document, try to go to Settings > Permalinks and re-save your settings, else you will get 404 page not found.
- 0
- 2017-11-15
- Mayank Dudakiya
-
Wieichin meinem letzten Kommentar hervorgehoben habe,wird auchnach der Aktualisierung der Permalinksein 404-Fehler angezeigt.Bitteprobieren Siees selbst aus.As I highlighted in my last comment, you will get an 404 error even *after* you have updated permalinks. Please give it a try yourself.
- 0
- 2017-11-15
- Christine Cooper
-
Funktioniert wieein Zauber,insbesonderebeim Lesen dergesamten Nachricht,einschließlich des Teils "Einstellungenerneut speichern".+1Works like a charm, especially when reading the whole message, including the "re-save your settings" part. +1
- 0
- 2018-01-25
- davewoodhall
-
Auchnach demerneuten Speichern der Permalink-Einstellungenfunktionieren Beiträge und Seitennichtmehr (404).Again, even after re-saving the permalink settings, posts and pages no longer work (404)
- 3
- 2018-02-13
- amklose
-
Diese Lösung dient zum Entfernen des Slugs aus der URL.Aber die Archivseitenfunktionierennichtmehr.This solution works for removing the slug from URL. But the archive pages don't work anymore.
- 1
- 2018-09-25
- Annapurna
-
Wie andere angegeben haben,funktioniert diesfür die CPT-Stellen selbst.Aberes verursachtjetzteine 404für reguläre Seiten.As others have stated, this does work for the CPT posts themselves. But it's causing a 404 for regular Pages now.
- 0
- 2019-07-03
- Garconis
-
- 2015-09-30
Ich habe vor kurzem versucht,dies herauszufinden,und die kurze Antwort von dem,wasich weiß,ist nein .Zumindestnicht aus dem Rewrite-Argument heraus.
Die lange Erklärung wird deutlich,wenn Sie sich dentatsächlichen Code von
register_post_type
in wp-includes/post.php Zeile 1454 :add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );
Sie können sehen,dass
$args->rewrite['slug']
dem%$post_type%
-Rewrite-Tag vorangestellt wird.Man könnte denken "Setzen wir den Slug danneinfach aufnull
",bis Sieein paar Zeilennach oben schauen:if ( empty( $args->rewrite['slug'] ) ) $args->rewrite['slug'] = $post_type;
Sie können sehen,dass die Funktion immer einen Slug-Werterwartet,dernicht leerist und ansonsten den Beitragstyp verwendet.
I tried to figure this out not long ago and the short answer from what I know is no. Not from within the rewrite argument at least.
The long explanation becomes apparent if you look at the actual code of
register_post_type
in wp-includes/post.php line 1454:add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );
You can see it prefixes
$args->rewrite['slug']
to the%$post_type%
rewrite tag. One could think "let's just set the slug tonull
then" until you look a few lines up:if ( empty( $args->rewrite['slug'] ) ) $args->rewrite['slug'] = $post_type;
You can see that the function always expects a slug value that is not empty and otherwise uses the post type.
-
Danke @JanBeck.Gibteseinen Hauptgrund dafür?Warumnicht diese Kerndateimit einer Bedingung hacken,umbestimmte Beitragstypen aus dieser Regel herauszulassen?Thanks @JanBeck . Is there a major reason for this to exist? Why not hack this core file with a conditional to omit certain post types from this rule?
- 0
- 2015-09-30
- Ben Racicot
-
Sie sollten die Antwort an Jan Beck vergeben.WordPressbenötigt den Post_Type-Slug,um Anfragen richtig weiterzuleiten.Diese Regel verhindert Namenskonflikte zwischennativen WP-Seiten (die ohne Sluggerendert werden) undbenutzerdefinierten Beitragstypen.Wenn Sie den Slug-Out hacken,kennt WordPress den Unterschied zwischeneiner Seitemit dem Namen "Picknick" undeinem Ereignis (benutzerdefinierter Beitragstyp)mit dem Namen "Picknick"nicht.You should award the answer to Jan Beck. WordPress needs the post_type slug to route requests properly. This rule prevents naming conflicts between native WP pages (which render without the slug) and any custom defined post types. If you hack the slug out then WordPress won't know the difference between a page named "picnic" and an event (custom post type) named "picnic".
- 9
- 2015-09-30
- dswebsme
-
@dswebsme Einverstanden,aberesgibt Situationen,in denen Sie die URL unbedingt ändernmüssen.Anders als warum Sienichtnativ können und sollten,wiemachen Sie das soeffizient?@dswebsme Agreed, but there are situations where you absolutely must change the URL. So other than why you can't natively and shouldn't, how do you do so efficiently?
- 3
- 2015-10-01
- Ben Racicot
-
- 2015-10-02
Als Antwort auf meine vorherige Antwort : Sie könnennatürlich den Parameter
rewrite
auffalse
setzen,wenn Sieeinen neuen Beitragstyp registrieren,und die Regelnfür das Umschreiben selbst sobehandeln<?php function wpsx203951_custom_init() { $post_type = 'event'; $args = (object) array( 'public' => true, 'label' => 'Events', 'rewrite' => false, // always set this to false 'has_archive' => true ); register_post_type( $post_type, $args ); // these are your actual rewrite arguments $args->rewrite = array( 'slug' => 'calendar' ); // everything what follows is from the register_post_type function if ( is_admin() || '' != get_option( 'permalink_structure' ) ) { if ( ! is_array( $args->rewrite ) ) $args->rewrite = array(); if ( empty( $args->rewrite['slug'] ) ) $args->rewrite['slug'] = $post_type; if ( ! isset( $args->rewrite['with_front'] ) ) $args->rewrite['with_front'] = true; if ( ! isset( $args->rewrite['pages'] ) ) $args->rewrite['pages'] = true; if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive ) $args->rewrite['feeds'] = (bool) $args->has_archive; if ( ! isset( $args->rewrite['ep_mask'] ) ) { if ( isset( $args->permalink_epmask ) ) $args->rewrite['ep_mask'] = $args->permalink_epmask; else $args->rewrite['ep_mask'] = EP_PERMALINK; } if ( $args->hierarchical ) add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" ); else add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" ); if ( $args->has_archive ) { $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive; if ( $args->rewrite['with_front'] ) $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; else $archive_slug = $wp_rewrite->root . $archive_slug; add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' ); if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) { $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); } if ( $args->rewrite['pages'] ) add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' ); } $permastruct_args = $args->rewrite; $permastruct_args['feed'] = $permastruct_args['feeds']; add_permastruct( $post_type, "%$post_type%", $permastruct_args ); } } add_action( 'init', 'wpsx203951_custom_init' );
Sie können sehen,dass der Aufruf
add_permastruct
jetzt den Slugnichtmehrenthält. Ich habe zwei Szenariengetestet:- Wennicheine Seitemit dem Slug "Kalender"erstellt habe,wird diese Seite vom Post-Typ-Archiv überschrieben,das auch den Slug "Kalender" verwendet.
- Wennicheine Seitemit dem Slug "my-event" undein Ereignis (CPT)mit dem Slug "my-event"erstellt habe,wird derbenutzerdefinierte Beitragstyp angezeigt.
- Alle anderen Seitenfunktionierenebenfallsnicht. Wenn Sie sich das Bild oben ansehen,wird klar,warum: Die Regelfürbenutzerdefinierte Beitragstypen stimmtimmermit einem Seitenblock überein. Da WordPressnichterkennen kann,obes sich umeine Seite odereinen benutzerdefinierten Beitragstyp handelt,dernicht vorhandenist,wird 404 zurückgegeben. Aus diesem Grundbenötigen Sieeinen Slug,um die Seite oder das CPT zuidentifizieren. Einemögliche Lösung wäre,den Fehler abzufangen undnacheiner Seite zu suchen,diemöglicherweise ähnlich dieser Antwort vorhandenist.
In response to my previous answer: you could of course set the
rewrite
parameter tofalse
when registering a new post type and handle the rewrite rules yourself like so<?php function wpsx203951_custom_init() { $post_type = 'event'; $args = (object) array( 'public' => true, 'label' => 'Events', 'rewrite' => false, // always set this to false 'has_archive' => true ); register_post_type( $post_type, $args ); // these are your actual rewrite arguments $args->rewrite = array( 'slug' => 'calendar' ); // everything what follows is from the register_post_type function if ( is_admin() || '' != get_option( 'permalink_structure' ) ) { if ( ! is_array( $args->rewrite ) ) $args->rewrite = array(); if ( empty( $args->rewrite['slug'] ) ) $args->rewrite['slug'] = $post_type; if ( ! isset( $args->rewrite['with_front'] ) ) $args->rewrite['with_front'] = true; if ( ! isset( $args->rewrite['pages'] ) ) $args->rewrite['pages'] = true; if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive ) $args->rewrite['feeds'] = (bool) $args->has_archive; if ( ! isset( $args->rewrite['ep_mask'] ) ) { if ( isset( $args->permalink_epmask ) ) $args->rewrite['ep_mask'] = $args->permalink_epmask; else $args->rewrite['ep_mask'] = EP_PERMALINK; } if ( $args->hierarchical ) add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" ); else add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" ); if ( $args->has_archive ) { $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive; if ( $args->rewrite['with_front'] ) $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; else $archive_slug = $wp_rewrite->root . $archive_slug; add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' ); if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) { $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); } if ( $args->rewrite['pages'] ) add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' ); } $permastruct_args = $args->rewrite; $permastruct_args['feed'] = $permastruct_args['feeds']; add_permastruct( $post_type, "%$post_type%", $permastruct_args ); } } add_action( 'init', 'wpsx203951_custom_init' );
You can see the
add_permastruct
call now doesn't include the slug anymore. I tested two scenarios:- When I created a page with the slug "calendar" that page is overwritten by the post type archive which also uses the "calendar" slug.
- When I created a page with the slug "my-event" and an event (CPT) with the slug "my-event", the custom post type is displayed.
- Any other pages do not work either. If you look at the picture above it becomes clear why: the custom post type rule will always match against a page slug. Because WordPress has no way of identifying if it's a page or a custom post type that does not exist, it will return 404. That's why you need a slug to identify either the page or CPT. A possible solution would be to intercept the error and look for a page that might exist similar to this answer.
-
Wenn das Ziel also darinbesteht,den Slugfür CPTs zuentfernen,können wir das CPT dannnicht alseinzigartigbezeichnen,dasnicht kollidieren würde,daes sowiesonie in der URL angezeigt wird?Oderist der Nachname dermögliche Konflikt,wennermit einer Seiteidentischist?So if the goal is to remove the slug for CPT's couldn't we name the CPT something unique that wouldn't collide since it will never be seen in the URL anyways? Or is the post-name the possible conflict if named the same as a page?
- 0
- 2015-10-02
- Ben Racicot
-
Ich habemeine Antwort aktualisiert,um zu zeigen,dass dadurchtatsächlich * alle * Seitenbeschädigt werden.Ohne Slug sucht WPnacheinem CPT anstelleeiner Seite undgibt einen Fehler zurück,wennesnichtgefunden wird.Es hat alsoeigentlichnichtsmit dem Postnamen zutun.I have updated my answer to show that this does actually break *all* pages. Without a slug, WP will look for a CPT instead of a page and if it doesn't find it, return an error. So it's actually not related to the post-name.
- 0
- 2015-10-02
- Jan Beck
-
Aha.Es sollte Umschreiberegelngeben,die '-1' an zukünftige widersprüchliche URLs wienative WP-Posts oder Seiten anhängen.Ich habeein Trac-Ticketerstellt. Https://core.trac.wordpress.org/ticket/34136#ticket würde Ihre Gedanken lieben.I see. There should be rewrite rules that append '-1' to future conflicting URL's like native WP posts vs pages. I've created a trac ticket https://core.trac.wordpress.org/ticket/34136#ticket would love your thoughts.
- 1
- 2015-10-02
- Ben Racicot
-
- 2019-12-17
Plugin Roundup
Esistfast 2020 und viele dieser Antwortenfunktionierennicht. Hieristmeine eigene Zusammenfassung der aktuellen Optionen:
- Antwort von Matt Keys scheint dieeinzige auf dem richtigen Weg zu sein,wenn Siemöchteneine benutzerdefinierte Codelösung. Keines dergefundenen Plugins kann allestun,was hier aufgeführtist,insbesondere die doppelte Überprüfung. Dieser Ansatz scheinteine wirklichgute Gelegenheitfürein Plugin zu sein,wennjemand das übernehmenmöchte.
- Permalink Manager Lite
- Diebesten kostenlosen Plugins,dieich ausprobiert habe.
- Ermöglicht die vollständige Kontrolle über diegesamte Permalink-Struktur von Page/Post/CPT undermöglicht,dass dieseidentisch sind. Die GUIistbei weitem diefunktionsreichste.
- Ermöglicht auch die vollständige Überschreibungpro Beitrag und zeigt an,wie das Original/der Standardwert aussehen würde,und kannbei Bedarf auf den Standardwert zurückgesetzt werden.
- Unterstützt Multi-Site.
- Überprüft nicht auf Duplikate zwischen Beitragstypen,wastraurigist. Wenneine Seite undein CPT dieselbe URL haben,wird die Seitegeladen und auf das CPT kannnicht zugegriffen werden. Keine Warnungen oder Fehler,Siemüssennur Ihreeigene manuelle Überprüfung auf Duplikate durchführen.
- Alle Taxonomiefunktionen sindin der PRO-Versionenthalten. Die Upgrade-Nags sind ziemlich schwer.
- Benutzerdefinierte Permalinks
- Die kostenlose Versionmacht viel. Taxonomie-Permalinks und Premium-Support scheinen dieeinzigen Dinge zu sein,die der Pro-Version vorenthalten werden.
- Ermöglicht das Ändern des vollständigen Permalinksfürjedeeinzelne Seite/jeden Post/CPT.
- Unterstützt Multi-Site.
- Ermöglicht nicht das Ändern der Standardstruktur,sodass Ihrebenutzerdefinierten Beitragstypen weiterhinexample.com/cpt-slug/post-title lauten. Sie können siejedocheinzeln ändern.
- Überprüft nicht ,ob Duplikate zwischen Beitragstypen vorhanden sind,wastraurigist.
- Benutzerdefinierte Post-Typ-Permalinks
- Ermöglicht Nicht-Entwicklern,die Dinge zu ändern,diebereitsmit
register_post_type
leicht zu ändern sind
- Erlaubt Ihnen nicht ,den CPT-Basis-Slug zu ändern -nur den Teil,der danach kommt -,derfür Entwickler und das Problemin dieser Frage sogut wienutzlosist.
- Basisschneckeentfernen ... - seiteinigen Jahrentot ...nicht verwenden.
Plugin Roundup
It's almost 2020 and a lot of these answers don't work. Here's my own roundup of the current options:
- Matt Keys answer seems to be the only one on the right track if you want a custom code solution. None of the plugins I found can do everything listed here, especially the duplicate checking. This approach seems like a really good opportunity for a plugin if anyone wanted to take that on.
- Permalink Manager Lite
- Best of the free plugins I tried.
- Gives full control over all Page/Post/CPT complete permalink structure and allows them to be the same. The GUI is by far the most feature-rich.
- Allows full override per-post as well and lets you see what the original/default would be and reset to the default if needed.
- Supports multi-site.
- Does not check for duplicates between post types, which is sad. If a page and a CPT have the same URL, the page loads and the CPT is inaccessible. No warnings or errors, you just have to do your own manual checking for duplicates.
- All taxonomy features are in the PRO version. The upgrade nags are pretty heavy.
- Custom Permalinks
- The free version does a lot. Taxonomy permalinks and premium support seem to be the only things withheld from the pro version.
- Allows you to change the full permalink for any individual page/post/CPT.
- Supports multi-site.
- Does not allow you to change the default structure so you your Custom Post Types will still be example.com/cpt-slug/post-title but you can change them individually.
- Does not check for duplicates between post types, which is sad.
- Custom Post Type Permalinks
- Allows non-developer users to change the things that are easy to change already with
register_post_type
- Does not allow you to change the CPT base slug - only the part that comes after that - so pretty much useless for developers and the issue in this question.
- Allows non-developer users to change the things that are easy to change already with
- remove base slug... - dead for several years now... do not use.
-
Das Plugin Permalink Manager Liteist definitiv diebeste Lösung: Stabil,robust,sauber und die kostenlose Versionermöglichtes Ihnen,die Slug-Basis zuentfernen.Undesfunktioniert auchmit Polylang!Getestet auf Wordpress 5.4mit TwentyTwenty Theme,ohne dassein anderes Plugin aktiviert wurde.Funktioniert wieein Zauberfür denbenutzerdefinierten Beitragstyp,unabhängig davon,ob Sieeinen hierarchischen Beitragerstellt haben (mit untergeordnetem Beitrag und Enkelbeitrag).Von allen,dieeine saubere Lösung wollen.The plugin Permalink Manager Lite is definitively the best solution : steady, robust, clean, and the free version allow you to remove the slug base. And it works with Polylang too ! Tested on Wordpress 5.4, with TwentyTwenty Theme, without any other plugin activated. Works like a charm on Custom Post Type, no matter if you have created a hierarchical one (with child post and grandchild post). From everyone who wants a clean solution.
- 1
- 2020-04-04
- PhpDoe
-
- 2017-02-25
Siebrauchennicht so viel Hardcode.Verwenden Sieeinfach das leichte Plugin:
Es verfügt über anpassbare Optionen.
You dont need so much hard-code. Just use lightweight plugin:
It has customizable options.
-
Jetzt weißich,warum Sie herabgestimmt wurden. Es verhindert,dassnormale Seitenlinks aufgelöst werden.Ich habeesnichtgesehen,weilichtrotz Aktualisierung zwischengespeicherte Kopien der vorhandenen Seitenerhalten habe.Now I know why you got downvoted, it prevents normal page links resolving. I didn't see it because I was getting cached copies of the existing pages despite refreshing.
- 0
- 2017-09-14
- Walf
-
@Walf Kannst dumir das Problemim Detailerzählen?@Walf Can you tell me about the issue in details?
- 0
- 2017-09-14
- T.Todua
-
Das Verfolgen von Links zu Seiten (dienicht derbenutzerdefinierte Beitragstyp waren) aus dem Hauptmenüergab 404 Fehler,als ob die Seitenicht vorhanden wäre.dasistes.Following links to pages (that weren't the custom post type) from the main menu gave 404 errors, as if the page did not exist; that's it.
- 0
- 2017-09-14
- Walf
-
@Walf kannst dumireine Beispiel-URLfür deinen Anlassgeben?(Sie können Domain-Namen abdecken,wenn Siemöchten,ichbrauchenurein Ex-Beispiel) Danke,ich werdees aktualisieren@Walf can you give me any example url of your occasion? (you can cover domain name if you want, i just need an ex example) thanks, i wil update it
- 0
- 2017-09-15
- T.Todua
-
"Dieses Plugin wurde am 19. September 2018geschlossen und stehtnicht zum Download zur Verfügung. Diese Schließungist dauerhaft.""This plugin has been closed as of September 19, 2018 and is not available for download. This closure is permanent."
- 1
- 2019-12-16
- squarecandy
-
- 2017-03-01
und wir könneneinige Änderungen an der obengenannten Funktion vornehmen:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'events', 'page' ) ); } }
bis:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { global $wpdb; $pt = $wpdb->get_var( "SELECT post_type FROM `{$wpdb->posts}` " . "WHERE post_name = '{$query->query['name']}'" ); $query->set( 'post_type', $pt ); } }
,um den richtigen Wertfürpost_typefestzulegen.
and we can make some changes to above-mentioned function:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'events', 'page' ) ); } }
to:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { global $wpdb; $pt = $wpdb->get_var( "SELECT post_type FROM `{$wpdb->posts}` " . "WHERE post_name = '{$query->query['name']}'" ); $query->set( 'post_type', $pt ); } }
in order to set right post_type value.
-
- 2017-05-03
Das hatbei mirfunktioniert:
'rewrite' => array('slug' => '/')
This worked for me:
'rewrite' => array('slug' => '/')
-
Dasfunktioniertnicht.Gibt 404 auch dann,wenn Sie Permalinks aktualisiert haben.This doesn't work. Gives 404 even when you've updated permalinks.
- 1
- 2017-11-12
- Christine Cooper
-
- 2017-05-29
Für alle,die dies lesen und Problememit untergeordneten Posts haben,wieichesgetan habe,wares ambesten,eigene Regelnfür das Umschreiben hinzuzufügen.
Das Hauptproblem,dasich hatte,war,dass WordPress die Weiterleitung von Seiten,die 2 Ebenen (untergeordnete Beiträge)tief sind,etwas andersbehandelt als 3 Ebenentief (untergeordnete Beiträge).
Das heißt,wennich/post-type/post-name/post-child/habe,kannich/post-name/post-child verwenden,undes leitetmich zu demmit dem Post-type vor,aber wennich habe Post-Typ/Post-Name/Post-Kind/Post-Enkel,dann kannich Post-Name/Post-Kind/Post-Enkelnicht verwenden.
Wenn Sie sich die Umschreiberegeln ansehen,siehtes so aus,als ob siefür andere Dinge als den Seitennamen auf derersten und zweiten Ebene übereinstimmen (ich denke,die zweite Ebeneentspricht dem Anhang) und dann dortetwas unternimmt,um Sie zum richtigen Beitrag weiterzuleiten. Auf drei Ebenenfunktioniertesnicht.
Alserstesmüssen Sie den Post-Typ-Link auch von Kindernentfernen. Diese Logik sollte hier auftreten,wenn Sie sich die Antwort von Nate Allen oben ansehen:
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
Ich selbst habeeine Mischung verschiedener Bedingungen verwendet,um zu überprüfen,ob der Beitrag Kinder hatte und so weiter,um zum richtigen Permalink zugelangen. Dieser Teilistnicht zu knifflig und Sie werden Beispiele von Leutenfinden,dieihn woandersmachen.
Imnächsten Schritt ändern sich die Dinge von dergegebenen Antwort. Anstatt der Hauptabfrage Dinge hinzuzufügen (diefürbenutzerdefinierte Posts und deren untergeordnete Elementefunktionierten,abernichtfür die weiteren untergeordneten Elemente),habeichein Umschreiben hinzugefügt,das am Ende der WordPress-Regeln stand,damit wenn der Seitennamenicht ausgecheckt wurde undesbald soweit war Wenn Sieeine 404treffen,wirdeine letzte Überprüfung durchgeführt,umfestzustellen,obeine Seiteinnerhalb desbenutzerdefinierten Beitragstyps denselben Namen hat. Andernfalls wird die 404 verworfen.
Hierist die Umschreiberegel,dieich verwendet habe,vorausgesetzt,'Ereignis'ist der Name Ihres CPT
function rewrite_rules_for_removing_post_type_slug() { add_rewrite_rule( '(.?.+?)?(:/([0-9]+))?/?$', 'index.php?event=$matches[1]/$matches[2]&post_type=event', 'bottom' ); } add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);
Ich hoffe,dies hilftjemand anderem. Ich konntenichts anderesfinden,dasmit Child-of-Child-Posts und dem Entfernen der Schnecke von diesen zutun hatte.
For anyone reading this that had trouble with child posts like I did I found the best way was to add your own rewrite rules.
The main issue I was having was that WordPress treats the redirect from pages that are 2 levels (child posts) deep a little differently than it treats 3 levels deep (child of child posts).
That means when I have /post-type/post-name/post-child/ I can use /post-name/post-child and it will redirect me to the one with post-type in front but if I have post-type/post-name/post-child/post-grandchild then I can't use post-name/post-child/post-grandchild.
Taking a look into the rewrite rules it looks like it matches for things other than pagename at the first and second levels (I think the second level matches attachment) and then does something there to redirect you to the proper post. At three levels deep it doesn't work.
First thing you need to do is to remove the post type link from children as well. This logic should happen here if you look at Nate Allen's answer above:
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
Myself I used a mix of different conditionals to check if the post had children and whatnot in order to get to the right permalink. This part isn't too tricky and you'll find examples of people doing it elsewhere.
The next step though is where things change from the given answer. Instead of adding things to the main query (which worked for custom posts and their children but not the further children) I added a rewrite that went to the bottom of the WordPress rules so that if pagename didn't check out and it was about to hit a 404 it would do one last check to see if a page within the custom post type had the same name otherwise it would throw out the 404.
Here is the rewrite rule I used assuming 'event' is the name of your CPT
function rewrite_rules_for_removing_post_type_slug() { add_rewrite_rule( '(.?.+?)?(:/([0-9]+))?/?$', 'index.php?event=$matches[1]/$matches[2]&post_type=event', 'bottom' ); } add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);
Hope this helps someone else, I couldn't find anything else that had to do with child of child posts and removing the slug from those.
-
Es scheinteinen Tippfehlerin der Regex zugeben.Zwischen '(:' a '?' Wirdbenötigt,umes alsnichterfassendes Untermuster zu verwenden=> '(?:'. Das dritte? Scheintfalschplatziert zu sein,daesein leereserstes Untermuster zulässt. Möglicherweise solltees zwischen (und:)positioniert werden.Ohne diesen Tippfehlerist der Ausdruck derselbe wie der,derfür denintegrierten Beitragstyp 'Seite'gefunden wird.There seems to be a typo in the regex. Between '(:' a '?' is needed to use it as non-capturing subpattern => '(?:'. The third ? seems misplaced as it allows an empty first subpattern. Propably it should be positioned between ( and :. Without this typo the expression will be the same as the one which can be found for the build-in post type 'page'.
- 0
- 2019-10-28
- jot
-
- 2019-06-19
Hatte hier diegleichen Probleme undes scheint keine Bewegung auf der WordPress-Site zugeben.Inmeiner speziellen Situation,in derfüreinzelne Blogposts die Struktur/blog/%postname%/diese Lösungbenötigt wurde
https://kellenmace.com/remove-custom-Post-Type-Slug-from-Permalinks/
endetein einer Reihe von 404s
Aber zusammenmit diesem wunderbaren Ansatz,bei dem die Backend-Permalink-Strukturnichtfür den Blogpost verwendet wird,funktioniertes schließlich wie charme. https://www.bobz.co/add-blog-prefix-permalink-struktur-blog-posts/
Vielen Dank.
Had the same problems here and there seems to be no movement on wordpress site. In my particular situation where for single blogposts the structure /blog/%postname%/ was needed this solution
https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/
ended in a bunch of 404s
But together with this wonderful approach, which is not using the backend permalink strukture for the blogpost it finally works like charme. https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/
Thanks a bunch.
-
Von Nur-Link-Antworten wird abgeraten.Wenn Siein diesem Artikeleine Antwortgefunden haben,die sich von den anderen Antworten auf der Seite unterscheidet,fügen Sie Ihrer Antworteine Zusammenfassung undein Codebeispiel hinzu.Link-only answers are discouraged. If you found an answer in this article that is different from the other answers on the page, please put a summary and code example in your answer.
- 0
- 2019-12-16
- squarecandy
Es scheint,dass alle Webressourcen auf dem Thema des Entfernenseinesbenutzerdefinierten Post-Typ-Slugsbasieren,dh
sindmittlerweile sehr veraltete Lösungen,die häufig auf Installationen vor WP Version 3.5 verweisen. Eine üblicheist:
innerhalb Ihrer Funktion register_post_type. Diesfunktioniertnichtmehr undistirreführend. Alsofrageich die Communityim dritten Quartal 2018 am Rande von WordPress 5 ...
Was sind diemodernen undeffizienten Methoden,um den Post Type Slug aus der URLeinesbenutzerdefinierten Post Type-Posts aus dem Rewrite-Argument oderirgendwo anders zuentfernen?
UPDATE: Es scheint verschiedene Möglichkeiten zugeben,dies zu zwingen,mit Regex zu arbeiten. Insbesondere die Antwort von Jan Beck,falls Sie konsequentbereit sein sollten,die Erstellung von Inhalten zu überwachen,um sicherzustellen,dass keine widersprüchlichen Seiten-/Beitragsnamenerstellt werden. Ichbin jedoch davon überzeugt,dass dieseine große Schwachstelleim WP-Kernist,wo diesfür unsbehandelt werden sollte . Sowohl als Option/Hookbeim Erstelleneines CPT als auch alserweiterter Satz von Optionenfür Permalinks. Bitte unterstützen Sie das Track Ticket.
Fußnote: Bitte unterstützen Sie dieses Trac-Ticket,indem Siees ansehen/bewerben: https://core .trac.wordpress.org/ticket/34136 #ticket