Добавить базу категорий в url в произвольном типе сообщения / таксономии
-
-
В последнее время сталкиваюсь с этой проблемой.** Решено! ** [# 188834] [1] [1]: http://wordpress.stackexchange.com/questions/94817/add-category-base-to-url-in-custom-post-type-taxonomy/188834#188834Recently, I face this issue. **Solved!** [#188834][1] [1]: http://wordpress.stackexchange.com/questions/94817/add-category-base-to-url-in-custom-post-type-taxonomy/188834#188834
- 0
- 2015-05-20
- maheshwaghmare
-
** РЕШЕНИЕ! ** (После бесконечных исследований)
вам следует изменить фильтр `post_type_link`.подробнее на: http://wordpress.stackexchange.com/a/167992/33667)**SOLUTION!** (After endless research)
you should modify the `post_type_link` filter. more at: http://wordpress.stackexchange.com/a/167992/33667 )- 0
- 2015-07-26
- T.Todua
-
возможный дубликат [Как изменить структуру постоянных ссылок для пользовательского типа сообщения и его таксономии?] (http://wordpress.stackexchange.com/questions/28979/how-to-change-permalink-structure-for-custom-post-type-and-its-таксономии)possible duplicate of [How to change permalink structure for custom post type and it's taxonomies?](http://wordpress.stackexchange.com/questions/28979/how-to-change-permalink-structure-for-custom-post-type-and-its-taxonomies)
- 0
- 2015-07-26
- T.Todua
-
9 ответ
- голосов
-
- 2013-04-06
Измените текст,чтобы добавить переменную запроса курса:
'rewrite' => array('slug' => 'courses/%course%')
Затем отфильтруйте
post_type_link
,чтобы вставить выбранный курс в постоянную ссылку:function wpa_course_post_link( $post_link, $id = 0 ){ $post = get_post($id); if ( is_object( $post ) ){ $terms = wp_get_object_terms( $post->ID, 'course' ); if( $terms ){ return str_replace( '%course%' , $terms[0]->slug , $post_link ); } } return $post_link; } add_filter( 'post_type_link', 'wpa_course_post_link', 1, 3 );
Существуют также плагины,такие как Постоянные ссылки пользовательского типа сообщений ,которые могут сделать это за вас.
Change your rewrite to add the course query var:
'rewrite' => array('slug' => 'courses/%course%')
Then filter
post_type_link
to insert the selected course into the permalink:function wpa_course_post_link( $post_link, $id = 0 ){ $post = get_post($id); if ( is_object( $post ) ){ $terms = wp_get_object_terms( $post->ID, 'course' ); if( $terms ){ return str_replace( '%course%' , $terms[0]->slug , $post_link ); } } return $post_link; } add_filter( 'post_type_link', 'wpa_course_post_link', 1, 3 );
There are also plugins like Custom Post Type Permalinks that can do this for you.
-
Спасибо,я ценю ваш быстрый ответ.В этом есть смысл.Мне любопытно,где мне вставить фильтрpost_type_link?могу я просто перейти в конец всего документа?Thank you, I appreciate your swift answer. This makes complete sense. I'm curious though, where do I insert the filter post_type_link at? can i just go at the bottom of the entire document?
- 0
- 2013-04-06
- Zach Russell
-
Я добавил его внизу,и это страница 404.I added it to the bottom and it 404's the page.
- 0
- 2013-04-06
- Zach Russell
-
вам нужно сбросить перезаписи,посетите страницу настроек постоянных ссылок.you have to flush rewrites, visit the permalinks settings page.
- 1
- 2013-04-06
- Milo
-
также обратите внимание,что вы,вероятно,столкнетесь с таксономией и типом сообщения,которые имеют один и тот же слаг.also note you'll likely have a clash with a taxonomy and a post type both sharing the same slug.
- 0
- 2013-04-06
- Milo
-
Где я сейчас нахожусь,так это то,что постоянные ссылки создаются правильно,но они не выполняются правильно (это мягкое 404).Любые рекомендации о том,что я могу сделать,чтобы это работало правильно?Я прочь переписываю постоянные ссылки.Просто нажмите «сохранить»,и он обновит файл (этоnginx,поэтому он контролируется в файлеnginx.conf)Where i'm at now is it's making the permalinks right, but it's not executing correctly (it's soft 404ing). Any recommendations on what I can do to get this working right? I'm away of the permalink flush rewrites. Just click 'save' and it updates the file (it's nginx so it's controlled in the nginx.conf file)
- 0
- 2013-04-06
- Zach Russell
-
Понял!Это был конфликт.Got it! It was a conflict.
- 0
- 2013-04-06
- Zach Russell
-
Голос против - страница архива 404Downvote - archive page 404
- 1
- 2020-04-04
- Dev
-
Это не работает для переведенных сообщений на многоязычном сайте (например,с использованием WPML).This doesn't work for translated posts on a multilingual site (for example using WPML).
- 0
- 2020-08-05
- montrealist
-
Это показывает мне главную страницу на вновь созданном URL.Вы должны использовать add_rewrite_rule () из ответа @ Floris,чтобы он работал.Также обратите внимание,страницы архива перестают работать,я получаю 404 для/my-post-type и для/my-post-type/my-categoryThis shows frontpage for me on the newly created URL. You gotta use the add_rewrite_rule() seen in @Floris's answer to make it work. Also note, archive pages stop working, I get 404 for /my-post-type and for /my-post-type/my-category
- 0
- 2020-09-01
- trainoasis
-
- 2019-02-11
Решение для меня состояло из трех частей. В моем случае тип сообщения называется
trainings
.- Добавьте
'rewrite' => array('slug' => 'trainings/%cat%')
в функциюregister_post_type
. - Измените заголовок на динамическую категорию.
- "Прослушайте" новый динамический URL и загрузите соответствующий шаблон.
Итак,вот как динамически изменить постоянную ссылку для заданного типа сообщения. Добавить в
functions.php
:function vx_soon_training_post_link( $post_link, $id = 0 ) { $post = get_post( $id ); if ( is_object( $post ) ) { $terms = wp_get_object_terms( $post->ID, 'training_cat' ); if ( $terms ) { return str_replace( '%cat%', $terms[0]->slug, $post_link ); } } return $post_link; } add_filter( 'post_type_link', 'vx_soon_training_post_link', 1, 3 );
... и вот как загрузить соответствующий шаблон в новый динамический URL. Добавить в
functions.php
:function archive_rewrite_rules() { add_rewrite_rule( '^training/(.*)/(.*)/?$', 'index.php?post_type=trainings&name=$matches[2]', 'top' ); //flush_rewrite_rules(); // use only once } add_action( 'init', 'archive_rewrite_rules' );
Вот и все! Не забудьте обновить постоянные ссылки,снова сохранив постоянные ссылки в серверной части. Или используйте функцию
flush_rewrite_rules()
.The solution for me had three parts. In my case the post type is called
trainings
.- Add
'rewrite' => array('slug' => 'trainings/%cat%')
to theregister_post_type
function. - Change the slug to have a dynamic category.
- "Listen" to the new dynamic URL and load the appropriate template.
So here is how to change the permalink dynamically for a given post type. Add to
functions.php
:function vx_soon_training_post_link( $post_link, $id = 0 ) { $post = get_post( $id ); if ( is_object( $post ) ) { $terms = wp_get_object_terms( $post->ID, 'training_cat' ); if ( $terms ) { return str_replace( '%cat%', $terms[0]->slug, $post_link ); } } return $post_link; } add_filter( 'post_type_link', 'vx_soon_training_post_link', 1, 3 );
...and this is how to load the appropriate template on the new dynamic URL. Add to
functions.php
:function archive_rewrite_rules() { add_rewrite_rule( '^training/(.*)/(.*)/?$', 'index.php?post_type=trainings&name=$matches[2]', 'top' ); //flush_rewrite_rules(); // use only once } add_action( 'init', 'archive_rewrite_rules' );
Thats it! Remember to refresh the permalinks by saving the permalinks again in de backend. Or use the
flush_rewrite_rules()
function. -
- 2017-10-06
Есть решение!
Чтобы иметь иерархические постоянные ссылки для пользовательского типа сообщений,установите постоянные ссылки пользовательского типа сообщений ( https://wordpress.org/plugins/custom-post-type-permalinks/) плагин.
Обновите зарегистрированный тип сообщения. У меня в справочном центре указано название типа сообщения
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');
А вот и зарегистрированная таксономия
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');
Эта строка заставляет вашу постоянную ссылку работать
"cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",
вы можете удалить
%post_id%
и оставить/%help_centre_category%/%postname%/"
Не забывайте удалять постоянные ссылки с панели управления.
Got the solution!
To have hierarchical permalinks for custom post type install Custom Post Type Permalinks(https://wordpress.org/plugins/custom-post-type-permalinks/) plugin.
Update registered post type. I have post type name as help center
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');
And here is registered taxonomy
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');
This is line makes your permalink work
"cptp_permalink_structure" => "/%help_centre_category%/%post_id%-%postname%/",
you can remove
%post_id%
and can keep/%help_centre_category%/%postname%/"
Don't forget to flush permalinks from dashboard.
-
- 2015-05-20
Ага! После долгих исследований я получил плагин ' Пользовательские постоянные ссылки '.Что соответствует моим требованиям - настраиваемый URL,например.
- для категории
- для публикации
- для персонализированной публикации
- для пользовательской таксономии и т. д.
Как этот Пользовательский тип сообщения - Сообщение :
Yep! After a lot of research I got plugin 'Custom Permalinks'. Which fulfils my requirement regards - custom URL e.g.
- for Category
- for Post
- for Custom Post
- for Custom Taxonomy etc.
Like this Custom Post Type - Post:
-
- 2019-06-12
Вам необходимо обновить строку ниже,в которой вы зарегистрировали пользовательский тип сообщения,используя функцию register_post_type.
'rewrite'=> array ('slug'=> 'курсы/% cat%')
Чтобы динамически изменять постоянную ссылку для типа сообщения,вам необходимо добавить следующий код в файлfunctions.php:
function change_link( $post_link, $id = 0 ) { $post = get_post( $id ); if( $post->post_type == 'courses' ) { if ( is_object( $post ) ) { $terms = wp_get_object_terms( $post->ID, array('course') ); if ( $terms ) { return str_replace( '%cat%', $terms[0]->slug, $post_link ); } } } return $post_link ; } add_filter( 'post_type_link', 'change_link', 1, 3 ); //load the template on the new generated URL otherwise you will get 404's the page function generated_rewrite_rules() { add_rewrite_rule( '^courses/(.*)/(.*)/?$', 'index.php?post_type=courses&name=$matches[2]', 'top' ); } add_action( 'init', 'generated_rewrite_rules' );
После этого нужно сбросить постоянные ссылки перезаписи,перейдите в wp-admin> Настройки> постоянные ссылки . просто обновите настройку постоянной ссылки,используя кнопку «Сохранить изменения».
он вернет URL-адреса,как показано ниже:
- domain.com/courses/[course-name{category}]]/имя- урока
Спасибо!
You need to update below line at where you have register a custom post type using register_post_type function.
'rewrite' => array('slug' => 'courses/%cat%')
To change permalink dynamically of post type you have to add below code in functions.php file :
function change_link( $post_link, $id = 0 ) { $post = get_post( $id ); if( $post->post_type == 'courses' ) { if ( is_object( $post ) ) { $terms = wp_get_object_terms( $post->ID, array('course') ); if ( $terms ) { return str_replace( '%cat%', $terms[0]->slug, $post_link ); } } } return $post_link ; } add_filter( 'post_type_link', 'change_link', 1, 3 ); //load the template on the new generated URL otherwise you will get 404's the page function generated_rewrite_rules() { add_rewrite_rule( '^courses/(.*)/(.*)/?$', 'index.php?post_type=courses&name=$matches[2]', 'top' ); } add_action( 'init', 'generated_rewrite_rules' );
After that, you need to flush rewrites permalinks, goto the wp-admin > Settings > permalinks. just update permalink setting using "Save Changes" button.
it'll return urls like below :
- domain.com/courses/[course-name{category}]/lesson-name
Thank you!
-
Голосование против - 404 для типов страниц архива одиночного CPT и CTPDown vote - 404 on both single CPT and CTP archive page types
- 0
- 2020-04-04
- Dev
-
@dev,вы выполнили все шаги,которые я упомянул в моем ответе?вы сбросили постоянные ссылки для перезаписи?Я протестировал,и он работает нормально.@dev did you follow all steps which i have mentioned in my answer ? did you flush your rewrite permalinks? I have tested and it is working fine.
- 0
- 2020-04-04
- Chetan Vaghela
-
- 2017-05-03
Это сработало для меня:
'rewrite' => array( 'slug' => 'portfolio', 'with_front' => false, 'hierarchical' => true // to display category/subcategroy ),
This is worked for me :
'rewrite' => array( 'slug' => 'portfolio', 'with_front' => false, 'hierarchical' => true // to display category/subcategroy ),
-
При этом не используются категории или их путь,а только иерархический пользовательский тип сообщения.This does not make use of the categories or their path it only makes the custom post type hierarchical.
- 5
- 2017-08-25
- Joris Kroos
-
- 2019-07-01
Всем,кто интересуется этим решением,без необходимости возиться с сырым PHP-кодом,я настоятельно рекомендую плагин Permalink Manager Lite от Maciej Bis.Это спасатель.
Он имеет визуальный механизм для удаления или добавления любой части,которую вы хотите в URL-адрес пользовательского типа сообщения,на основе 'permastructs':
(Со всей болью,связанной с простым структурированием URL-адресов с помощью настраиваемых типов сообщений,мы были готовы отказаться от WP и перейти на другую CMS. Но этот плагин в сочетании с ACF и CPTUI или Pods делает Wordpress довольно профессиональным.)
To anyone interested in the solution, without having to tinker with raw PHP code, I highly recommend the plugin Permalink Manager Lite by Maciej Bis. It's a life saver.
It has a visual mechanism to remove or add whatever part you want in the custom post type's URL based on 'permastructs':
(With all the pain involved in simple URL structuring with custom post types, we were about to give up on WP and move to another CMS. But this plugin in conjunction with ACF and CPTUI or Pods makes Wordpress fairly professional.)
-
- 2020-05-29
Если вы используете
get_post_type_archive_link()
,возможно,вам потребуется удалить/%cat%/
из URL-адреса с помощью фильтраpost_type_archive_link
.If you're using
get_post_type_archive_link()
, maybe you will need to remove/%cat%/
from the URL usingpost_type_archive_link
filter. -
- 2020-08-18
Я нашел ответ @chetan-vaghela почти идеальным;в моем случае использования я также хотел иметь возможность видеть список всех сообщений этого типа,как на типичной странице архива (т.е./курсы/,без какой-либо таксономии после него).Мне просто пришлось добавить одно дополнительное правило перезаписи следующим образом:
function generated_rewrite_rules() { add_rewrite_rule( '^courses/(.*)/(.*)/?$', 'index.php?post_type=courses&name=$matches[2]', 'top' ); }
I found @chetan-vaghela 's answer almost perfect; in my use case I also wanted to be able to see a list of all posts by this post type like a typical archive page (i.e. /courses/, without any taxonomy after it). I just had to add one additional rewrite rule as follows:
function generated_rewrite_rules() { add_rewrite_rule( '^courses/(.*)/(.*)/?$', 'index.php?post_type=courses&name=$matches[2]', 'top' ); }
Я создаю систему типов LMS в WordPress,управляемую
Custom Posttypes
.Тип сообщения называется
Уроки
(с наборомкурсов
),и у него есть однанастраиваемая таксономия
(категория),называемаякурсы код>.
Структура URL-адреса домена сейчас отображается как:
domain.com/courses/lesson-name
.Я хочу,чтобы это стало:
domain.com/courses/[имя- курса{category}]]/имя- урока
или по сути:
/[cpt]/% category%/%postname%/
вот плагин,который я написал,который теперь контролирует
CPT
.