사용자 지정 게시물 유형 게시물 URL에서 슬러그 제거
-
-
왜 그렇게하고 싶은지 머리를 긁적 거리는 것 같아요?혼란스러워.I guess I'm scratching my head as to why you would want to do that? Confused.
- 0
- 2017-05-29
- Michael Ecklund
-
@MichaelEcklund는 공개 웹 페이지를 만드는 데 사용되는 CPT가 URL에 강제 슬러그 이름을 가지고 있기 때문입니다.실제로 슬러그를 안전하게 제거하려는 많은 WP 개발자가 있습니다.@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 대답
- 투표
-
- 2015-09-30
다음 코드는 작동하지만 사용자 지정 게시물 유형의 슬러그가 페이지 또는 게시물의 슬러그와 동일하면 충돌이 쉽게 발생할 수 있음을 명심해야합니다 ...
먼저,퍼머 링크에서 슬러그를 제거합니다.
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 );
슬러그를 제거하는 것만으로는 충분하지 않습니다. WordPress는 게시물과 페이지 만 이러한 방식으로 작동 할 것으로 예상하기 때문에 지금 당장 404 페이지가 표시됩니다. 또한 다음을 추가해야합니다.
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' );
'이벤트'를 맞춤 게시물 유형으로 변경하기 만하면됩니다. 퍼머 링크를 새로 고침해야 할 수도 있습니다.
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.
-
감사.이것이 수동으로 재 작성을 만드는 것보다 낫다고 생각하십니까?나는 그 해결책을 보았고 당신이 언급 한 갈등을 막을 수 있습니까?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
-
충돌을 일으키지 않을 것이라고 확신한다면 이것이 좋은 자동화 솔루션이라고 생각합니다.이 기능을 제공하는 경우 좋은 솔루션이 아닙니다. 기술에 정통하지 않은 클라이언트를 예로 들어 보겠습니다.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
-
여러 게시물 유형에이 코드를 사용하는 방법을 업데이트 해 주시겠습니까?can you please update, how to use this code for multiple post types
- 1
- 2016-01-25
- Abin
-
조건`2!=count ($ query-> query)`때문에nginx에서 실패합니다.nginx를 사용하면 $ query-> query as`array ( 'page'=> '','name'=> '...','q'=> '...')`를 가질 수 있습니다.그래서 @NateAllen,그 조건의 의미는 무엇입니까?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
-
이것보다 더 나은 것이 필요합니다.나중에 충돌하는 URL을 만들 수 없도록 내장 된 슬러그를 제거하도록 지원합니다.일반 게시물 및 페이지가 URL을 생성하는 방식.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
-
그것은 나뿐입니까,아니면is_single () 및is_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
-
이 솔루션은 안타깝게도 일부 링크가 끊어졌고 내 블로그는 게시물 표시를 중단하고 정상적인 페이지였습니다.아래에서 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
-
이 코드는 'post_type'이름이 모든 경우에 반드시있을 필요는없는 커스텀 포스트 유형 'slug'와 동일하다고 가정합니다.그러나 나머지는 기본 WP 솔루션이 더 좋을 것이라는 데 동의하지만 훌륭한 솔루션입니다.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} .php는이 접근 방식을 사용하여 작동을 멈 춥니 다.single-{cpt}.php stops working using this approach
- 0
- 2020-01-05
- Saleh Mahmood
-
위의 코드에 문제가있는 분들은 두 번째 함수 (**functionna_parse_request () **)를이 [answer] (https ://wordpress.stackexchange.com/a/292379/175093).사용자 정의 게시물 유형 이름으로 코드를 수정하는 것을 잊지 마십시오.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
-
WP 5.2가 나올 때까지이 멋진 코드를 사용해 왔습니다.업데이트 후이 코드는 내 Custom Post Type 플러그인과 Advanced Custom Fields 플러그인에서 실패하기 시작합니다. 동일한pre_get_posts 함수를 사용하고 있기 때문에 Advanced Custom Field Groups 대신이 플러그인에서 내 사용자 지정 게시물을 볼 수 있습니다.. 또한 CPT UI 플러그인에서 실패합니다. 새 게시물을 더 이상 만들 수 없으며 게시물을 만든 후 목록에 나타나지 않습니다.도와주세요!!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
-
단일 포스트 유형에서 작동했습니다.여러 게시물 유형에 코드를 사용하는 방법은 무엇입니까?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
분류 등록에 다음 코드를 작성합니다.
'rewrite' => [ 'slug' => '/', 'with_front' => false ]
코드 변경 후해야 할 가장 중요한 일
맞춤 게시물 유형 분류 문서를 변경 한 후 설정> 영구 링크 로 이동하여 설정을 다시 저장 하십시오. 그렇지 않으면 404 페이지가 표시되지 않습니다.찾았습니다.
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.
-
이것은 실제로 작동합니다. 이전에 아무도 이것을 어떻게 눈치 채지 못했는지 모르겠습니다.물론 이것은 동일한 퍼머 링크가있는 다른 페이지를 방해 할 수 있지만 그렇지 않은 경우 훌륭한 솔루션입니다.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ć
-
이것을 시도했습니다.내 사용자 지정 게시물 유형 링크에 대해 원하는 결과를 제공합니다.그러나 모든 POST 또는 PAGE 게시물 유형 슬러그를 '잡아서'내 사용자 지정 게시물 유형의 URL로 확인한 다음 404로 해결하려고 시도합니다.(예,영구 링크를 저장했습니다).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
-
모든 페이지 및 사용자 지정 게시물 유형의 동일한 슬러그가있을 수 있습니다. 페이지 슬러그를 변경 한 다음 확인하십시오.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
-
이것은 작동하지 않습니다.영구 링크를 업데이트 한 경우에도 404를 제공합니다.This doesn't work. Gives 404 even when you've updated permalinks.
- 5
- 2017-11-12
- Christine Cooper
-
안녕하세요. 이 단계를 따라야합니다 맞춤 게시물 유형 분류 문서를 변경 한 후 설정> 영구 링크로 이동하여 설정을 다시 저장하십시오. 그렇지 않으면 404 페이지를 찾을 수 없습니다.@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
-
마지막 댓글에서 강조 표시했듯이 영구 링크를 업데이트 한 후에도 * 후 *에도 404 오류가 발생합니다.직접 시도해보세요.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
-
특히 "설정 다시 저장"부분을 포함하여 전체 메시지를 읽을 때 매력처럼 작동합니다.+1Works like a charm, especially when reading the whole message, including the "re-save your settings" part. +1
- 0
- 2018-01-25
- davewoodhall
-
다시 말하지만,영구 링크 설정을 다시 저장 한 후에도 게시물과 페이지가 더 이상 작동하지 않습니다 (404).Again, even after re-saving the permalink settings, posts and pages no longer work (404)
- 3
- 2018-02-13
- amklose
-
이 솔루션은 URL에서 슬러그를 제거하는 데 효과적입니다.그러나 아카이브 페이지는 더 이상 작동하지 않습니다.This solution works for removing the slug from URL. But the archive pages don't work anymore.
- 1
- 2018-09-25
- Annapurna
-
다른 사람들이 말했듯이 이것은 CPT 게시물 자체에서 작동합니다.그러나 이제 일반 페이지에 404가 발생합니다.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
얼마 전에 이것을 알아 내려고했는데 제가 아는 짧은 대답은 아니요 입니다.적어도 다시 쓰기 인수 내에서가 아닙니다.
add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );
$args->rewrite['slug']
재 작성 태그에%$post_type%
접두사가 붙는 것을 볼 수 있습니다.몇 줄을 살펴볼 때까지 "그럼 슬러그를null
로 설정하겠습니다"라고 생각할 수 있습니다.if ( empty( $args->rewrite['slug'] ) ) $args->rewrite['slug'] = $post_type;
함수는 항상 이 비어 있지 않은 슬러그 값을 예상하고 그렇지 않으면 포스트 유형을 사용함을 알 수 있습니다.
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.
-
감사합니다 @JanBeck.이것이 존재하는 주된 이유가 있습니까?이 규칙에서 특정 게시물 유형을 생략하는 조건부로이 코어 파일을 해킹하지 않는 이유는 무엇입니까?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
-
Jan Beck에게 답을 주어야합니다.WordPress는 요청을 올바르게 라우팅하기 위해post_type 슬러그가 필요합니다.이 규칙은 기본 WP 페이지 (슬러그없이 렌더링)와 사용자 정의 게시물 유형 간의 이름 충돌을 방지합니다.슬러그를 해킹하면 워드 프레스는 "picnic"이라는 페이지와 "picnic"이라는 이벤트 (사용자 지정 게시물 유형)의 차이점을 알지 못합니다.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 동의했지만 절대적으로 URL을 변경해야하는 상황이 있습니다.그래서 기본적으로 할 수없고 그렇게해서는 안되는 이유 외에 어떻게 효율적으로 수행합니까?@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
내 이전 답변 에 대한 응답 : 물론 새 게시물 유형을 등록 할 때
rewrite
매개 변수를false
로 설정하고 재 작성 규칙을 직접 처리 할 수 있습니다.<?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' );
이제
add_permastruct
호출에 슬러그가 더 이상 포함되지 않음을 알 수 있습니다. 두 가지 시나리오를 테스트했습니다.- 슬러그 "캘린더"가 포함 된 페이지를 만들었을 때 해당 페이지는 "캘린더"슬러그도 사용하는 게시물 유형 아카이브로 덮어 쓰여집니다.
- 슬러그가 "my-event"인 페이지와 슬러그가 "my-event"인 이벤트 (CPT)가있는 페이지를 만들면 사용자 지정 게시물 유형이 표시됩니다.
- 다른 페이지도 작동하지 않습니다. 위의 그림을 보면 이유가 분명해집니다. 사용자 지정 게시물 유형 규칙은 항상 페이지 슬러그와 일치합니다. WordPress에는 존재하지 않는 페이지인지 사용자 지정 게시물 유형인지 식별 할 수있는 방법이 없기 때문에 404를 반환합니다. 따라서 페이지 또는 CPT를 식별하려면 슬러그가 필요합니다. 가능한 해결책은 오류를 가로 채서 이 답변과 유사한 존재하는 페이지를 찾는 것입니다. li>
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.
-
따라서 목표가 CPT에 대한 슬러그를 제거하는 것이라면 URL에서 결코 볼 수 없기 때문에 충돌하지 않는 고유 한 이름을 CPT에 지정할 수 없습니까?아니면 포스트 이름이 페이지와 동일한 경우 충돌 가능성이 있습니까?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
-
나는 이것이 실제로 * 모든 * 페이지를 망가 뜨리는 것을 보여주기 위해 내 대답을 업데이트했습니다.슬러그가 없으면 WP는 페이지 대신 CPT를 찾고 찾지 못하면 오류를 반환합니다.그래서 그것은 실제로 포스트 이름과 관련이 없습니다.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
-
내가 참조.네이티브 WP 게시물 대 페이지와 같이 향후 충돌하는 URL에 '-1'을 추가하는 재 작성 규칙이 있어야합니다.나는trac 티켓 https://core.trac.wordpress.org/ticket/34136#ticket을 만들었습니다.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
플러그인 정리
거의 2020 년이되었고 이러한 답변 중 상당수가 작동하지 않습니다. 다음은 현재 옵션에 대한 저만의 요약입니다.
- Matt Keys 답변 은 맞춤형 코드 솔루션을 원합니다. 내가 찾은 플러그인 중 어떤 것도 여기에 나열된 모든 것을 수행 할 수 없습니다. 특히 중복 검사를 할 수 없습니다. 이 접근 방식은 누군가가 원하는 플러그인을위한 정말 좋은 기회 인 것 같습니다.
- Permalink Manager Lite
- 제가 시도한 무료 플러그인 중 최고입니다.
- 모든 페이지/게시물/CPT 완전한 영구 링크 구조를 완전히 제어하고 동일하게 할 수 있습니다. GUI는 가장 풍부한 기능입니다.
- 게시물별로 전체 재정의를 허용하고 원본/기본값이 무엇인지 확인하고 필요한 경우 기본값으로 재설정 할 수 있습니다.
- 다중 사이트를 지원합니다.
- 게시물 유형 간의 중복 여부를 확인하지 않습니다 . 안타깝습니다. 페이지와 CPT의 URL이 동일한 경우 페이지가로드되고 CPT에 액세스 할 수 없습니다. 경고 나 오류가 없으며 중복 여부를 직접 확인하기 만하면됩니다.
- 모든 분류 기능은 PRO 버전에 있습니다. 업그레이드 잔소리가 꽤 무겁습니다.
- 맞춤 영구 링크
- 무료 버전은 많은 일을합니다. 분류 영구 링크 및 프리미엄 지원은 프로 버전에서 보류되는 유일한 것 같습니다.
- 개별 페이지/게시물/CPT에 대한 전체 고유 링크를 변경할 수 있습니다.
- 다중 사이트를 지원합니다.
- 기본 구조를 변경할 수 없습니다 . 따라서 사용자 지정 게시물 유형은 여전히 example.com/cpt-slug/post-title이되지만 개별적으로 변경할 수 있습니다.
- 게시물 유형 간의 중복을 확인하지 않습니다 . 안타깝습니다.
- 맞춤 게시물 유형 영구 링크
- 개발자가 아닌 사용자가
register_post_type
을 사용하여 이미 변경하기 쉬운 항목을 변경할 수 있습니다. - CPT 기본 슬러그를 변경할 수 없습니다 . 그 이후에 나오는 부분 만 – 개발자와이 질문의 문제에 거의 쓸모가 없습니다.
- 개발자가 아닌 사용자가
- 기본 슬러그 제거 ... -몇 년 동안 죽었습니다 ... 사용하지 마십시오.
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.
-
플러그인 Permalink Manager Lite는 확실히 최고의 솔루션입니다. 안정적이고 견고하며 깨끗하며 무료 버전을 사용하면 슬러그베이스를 제거 할 수 있습니다.그리고 그것은 Polylang에서도 작동합니다!다른 플러그인이 활성화되지 않은 상태에서 TwentyTwenty 테마로 Wordpress 5.4에서 테스트되었습니다.계층 적 게시물 (하위 게시물 및 손자 게시물 포함)을 생성했는지 여부에 관계없이 Custom Post Type의 참처럼 작동합니다.깨끗한 솔루션을 원하는 모든 사람으로부터.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
You dont need so much hard-code. Just use lightweight plugin:
It has customizable options.
-
이제 왜 당신이 반대표를 받았는지 알았으므로 정상적인 페이지 링크가 해결되지 않습니다.새로 고침에도 불구하고 기존 페이지의 캐시 된 사본을 받고 있었기 때문에 보지 못했습니다.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 문제에 대해 자세히 설명해 주시겠습니까?@Walf Can you tell me about the issue in details?
- 0
- 2017-09-14
- T.Todua
-
메인 메뉴에서 페이지에 대한 링크 (사용자 지정 게시물 유형이 아님)를 따라 가면 페이지가없는 것처럼 404 오류가 발생했습니다.그게 다야.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 귀하의 행사에 대한 예제 URL을 알려주시겠습니까?(원하는 경우 도메인 이름을 다룰 수 있습니다. 예가 필요합니다.) 감사합니다. 업데이트하겠습니다.@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
-
"이 플러그인은 2018 년 9 월 19 일에 폐쇄되었으며 다운로드 할 수 없습니다.이 폐쇄는 영구적입니다.""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
위에서 언급 한 기능을 몇 가지 변경할 수 있습니다.
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' ) ); } }
받는 사람 :
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 ); } }
올바른post_type 값을 설정하기 위해
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
이것은 저에게 효과적이었습니다. <코드> '재 작성'=>array ( 'slug'=> '/')
This worked for me:
'rewrite' => array('slug' => '/')
-
이것은 작동하지 않습니다.영구 링크를 업데이트 한 경우에도 404를 제공합니다.This doesn't work. Gives 404 even when you've updated permalinks.
- 1
- 2017-11-12
- Christine Cooper
-
- 2017-05-29
저처럼 하위 게시물에 문제가있는이 글을 읽는 모든 사람에게 가장 좋은 방법은 자신 만의 재 작성 규칙을 추가하는 것입니다.
내가 겪었던 주요 문제는 WordPress가 2 단계 (하위 게시물) 깊이의 페이지로부터의 리디렉션을 3 단계 깊이 (하위 게시물의 하위 게시물)와 약간 다르게 처리한다는 것입니다.
즉,/post-type/post-name/post-child/가있을 때/post-name/post-child를 사용할 수 있으며post-type이 앞에있는 것으로 리디렉션됩니다.post-type/post-name/post-child/post-handchild 그러면post-name/post-child/post-handchild를 사용할 수 없습니다.
재 작성 규칙을 살펴보면 첫 번째 및 두 번째 수준에서 페이지 이름 이외의 항목과 일치하는 것처럼 보이며 (두 번째 수준이 첨부 파일과 일치한다고 생각합니다) 적절한 게시물로 리디렉션하기 위해 작업을 수행합니다. 3 단계 깊이에서는 작동하지 않습니다.
첫 번째로해야 할 일은 어린이의 게시물 유형 링크도 제거하는 것입니다. 위의 Nate Allen의 답변을 보면이 논리가 발생해야합니다.
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
자신은 올바른 퍼머 링크로 이동하기 위해 게시물에 하위 항목이 있는지 확인하기 위해 여러 조건문을 혼합하여 사용했습니다. 이 부분은 너무 까다 롭지 않으며 다른 곳에서 수행하는 사람들의 예를 찾을 수 있습니다.
다음 단계는 주어진 답변에서 상황이 바뀌는 것입니다. 기본 쿼리에 항목을 추가하는 대신 (사용자 지정 게시물과 해당 자식에 대해서는 작동하지만 추가 자식에는 적용되지 않음) WordPress 규칙의 맨 아래에있는 재 작성을 추가하여 페이지 이름이 체크 아웃되지 않고 곧 404를 누르면 사용자 지정 게시물 유형 내의 페이지가 동일한 이름을 가지고 있는지 마지막으로 확인합니다. 그렇지 않으면 404가 표시되지 않습니다.
다음은 'event'가 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);
이게 다른 사람에게 도움이되기를 바랍니다. 하위 게시물의 하위 게시물에서 슬러그를 제거하는 것과 관련된 다른 내용은 찾을 수 없었습니다.
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.
-
정규식에 오타가있는 것 같습니다.'(:'사이에 '?'가 있어야 캡처되지 않는 하위 패턴으로 사용됩니다=> '(? :'. 세 번째?는 빈 첫 번째 하위 패턴을 허용하기 때문에 잘못 배치 된 것 같습니다. 적절하게는 (와 : 사이에 위치해야합니다.이 오타가 없으면 표현식은 기본 게시물 유형 '페이지'에서 찾을 수있는 것과 동일합니다.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
여기에도 같은 문제가 있었고 워드 프레스 사이트에는 움직임이없는 것 같습니다.단일 블로그 게시물의 경우/blog/%postname %/구조가이 솔루션이 필요한 특정 상황에서
https://kellenmace.com/remove-custom-영구 링크의 포스트 유형 슬러그/
404 초로 끝남
하지만 블로그 게시물에 백엔드 영구 링크 구조를 사용하지 않는이 멋진 접근 방식과 함께 마침내 charme처럼 작동합니다. https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/
감사합니다.
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.
-
링크 전용 답변은 권장하지 않습니다.이 기사에서 페이지의 다른 답변과 다른 답변을 찾은 경우 답변에 요약 및 코드 예제를 입력하십시오.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
사용자 정의 포스트 유형 슬러그를 제거하는 주제에 기반한 모든 웹 리소스 인 것 같습니다.
현재 WP 버전 3.5 이전 설치를 참조하는 매우 오래된 솔루션입니다. 일반적인 방법은 다음과 같습니다.
register_post_type 함수 내에서. 이것은 더 이상 작동하지 않으며 오해의 소지가 있습니다. 그래서 저는 2018 년 3 분기에 워드 프레스 5가 임박한 시점에서 커뮤니티에 질문합니다 ...
재 작성 인수 또는 다른 곳에서 사용자 지정 게시물 유형 게시물의 URL에서 게시물 유형 슬러그를 제거하는 현대적이고 효율적인 방법은 무엇입니까?
업데이트 : 정규식과 함께 작동하도록 강제하는 몇 가지 방법이있는 것 같습니다. 특히 Jan Beck의 답변은 충돌하는 페이지/게시물 이름이 생성되지 않도록 콘텐츠 생성을 지속적으로 모니터링 할 의향이 있어야합니다 .... 그러나 이것이 처리해야하는 WP 코어의 주요 약점이라고 확신합니다. . CPT를 만들 때 옵션/후크로 사용하거나 영구 링크에 대한 고급 옵션 세트로 사용합니다. 트랙 티켓을 응원 해주세요.
각주 : https ://core .trac.wordpress.org/ticket/34136 #ticket