Вопрос или проблема
Я испытываю проблему при изменении URL типа записи. Текущий URL типа записи:
http://example.com/product/product-slug
где product является пользовательским типом записи.
Я хочу изменить его на:
http://domain.com/brand/brand-slug/product-slug
где brand является пользовательской таксономией.
Я нашел код, который удаляет /product/
из URL типа записи, и он работает нормально для меня. Я использую следующий код.
function gp_remove_cpt_slug( $post_link, $post, $leavename ) {
if ( 'product' != $post->post_type || 'publish' != $post->post_status ) {
return $post_link;
}
$post_link = str_replace( "https://wordpress.stackexchange.com/" . $post->post_type . "https://wordpress.stackexchange.com/", "https://wordpress.stackexchange.com/", $post_link );
return $post_link;
}
add_filter( 'post_type_link', 'gp_remove_cpt_slug', 10, 3 );
function gp_parse_request_trick( $query ) {
// Только для основного запроса
if ( ! $query->is_main_query() )
return;
// Только для нашего очень специфичного правила переписывания
if ( 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
return;
}
// 'name' будет установлен, если постоянные ссылки записи - это просто post_name, в противном случае сработает правило страницы
if ( ! empty( $query->query['name'] ) ) {
$query->set( 'post_type', array( 'post', 'page', 'product' ) );
}
}
add_action( 'pre_get_posts', 'gp_parse_request_trick' );
Настройка постоянной ссылки /%postname%/
. Но когда я меняю настройку постоянной ссылки на /brand/%brand%/%postname%/
, все пользовательские типы записей начинают выдавать ошибку 404.
Пожалуйста, подскажите, какие изменения нужно внести в код выше, чтобы это работало.
Вы можете настроить простые постоянные ссылки таксономии/типа записи с помощью аргумента rewrite
при регистрации типа записи:
function wpd_product_brand_types() {
register_taxonomy(
'brand',
'product',
array(
'rewrite' => array( 'slug' => 'brand', 'with_front' => false )
)
);
register_post_type(
'product',
array(
'label' => 'Products',
'public' => true,
'supports' => array( 'title' ),
'rewrite' => array( 'slug' => 'brand/%brand%', 'with_front' => false )
)
);
}
add_action( 'init','wpd_product_brand_types' );
Затем фильтр post_type_link
заменяет слаг %brand%
:
function wpd_product_permalinks( $post_link, $post ){
if ( is_object( $post ) && $post->post_type == 'product' ){
$terms = wp_get_object_terms( $post->ID, 'brand' );
if( $terms ){
return str_replace( '%brand%' , $terms[0]->slug , $post_link );
}
}
return $post_link;
}
add_filter( 'post_type_link', 'wpd_product_permalinks', 1, 2 );
Ответ или решение
Изменение структуры URL для пользовательских типов записей и добавление таксономии требует тщательного подхода и понимания основ работы с пермалинками и таксономией в WordPress. Давайте разберем задачу детально и рассмотрим решение, используя ваши текущие настройки и цели.
Теория:
В WordPress URL для записей определяются пермалинками, в которых вы можете комбинировать типы записей и таксономии. В вашем случае, вы хотите убрать сегмент /product/
из URL и вместо этого использовать структуру /brand/brand-slug/product-slug/
, где brand
– это таксономия. Это включает использование так называемого "человеческого" читаемого пути, который более интуитивно понятен пользователям и может облегчить работу SEO.
Когда вы регистрируете пользовательский тип записей или таксономию в WordPress, у вас есть возможность указать структуру URL через параметр rewrite
. Важно понимать, что изменение структуры URL может повлиять на работу сайта, особенно если определенные правила переписывания URL не соответствуют вашим новым требованиям.
Пример:
Ваш текущий URL выглядит так: http://example.com/product/product-slug
, и вы хотите изменить его на http://domain.com/brand/brand-slug/product-slug
. Ваша текущая конфигурация предполагает, что вы уже убрали часть /product/
из URL. Однако, при попытке использования нового правила пермалинков /brand/%brand%/%postname%/
, возникает проблема 404. Это указывает на то, что правила переписывания URL не соответствуют, и сервер не может правильно обработать запрос.
Код, который вы представили, включает функцию, которая заменяет часть URL, а также пытается настроить правила запроса. Но это не полностью решает вашу проблему, так как требуются корректные правила для работы с таксономиями и соответствующими постами.
Применение:
-
Регистрация таксономии и типов записей:
При регистрации таксономии и пользовательского типа записей убедитесь, что вы правильно задаете параметр
rewrite
. В вашем случае необходимо, чтобы параметрslug
в таксономии соответствовал вашему желаемому URL.function wpd_product_brand_types() { register_taxonomy( 'brand', 'product', array( 'rewrite' => array( 'slug' => 'brand', 'with_front' => false ) ) ); register_post_type( 'product', array( 'label' => 'Products', 'public' => true, 'supports' => array( 'title' ), 'rewrite' => array( 'slug' => 'brand/%brand%', 'with_front' => false ) ) ); } add_action( 'init','wpd_product_brand_types' );
Здесь мы установили, что тип записей
product
будет иметь структуру URL, включающую таксономиюbrand
. -
Фильтр для изменения ссылки типов записей:
Настроим фильтр, который заменит плейсхолдер
%brand%
на фактический слаг таксономии.function wpd_product_permalinks( $post_link, $post ){ if ( is_object( $post ) && $post->post_type == 'product' ){ $terms = wp_get_object_terms( $post->ID, 'brand' ); if( $terms && !is_wp_error($terms) ){ return str_replace( '%brand%' , $terms[0]->slug , $post_link ); } } return $post_link; } add_filter( 'post_type_link', 'wpd_product_permalinks', 1, 2 );
Этот код берет первый термин таксономии
brand
, связанный с записью, и заменяет им%brand%
в URL. -
Проверка и обновление правил перезаписи:
После внесения изменений убедитесь, что вы обновили правила перезаписи. Это можно сделать вручную через интерфейс WordPress или программно вызвать
flush_rewrite_rules();
, однако это стоит делать только временно, так как постоянный вызов может повлиять на производительность.function rewrite_rules_on_activation() { wpd_product_brand_types(); flush_rewrite_rules(); } register_activation_hook( __FILE__, 'rewrite_rules_on_activation' );
Используйте эту функцию при активации темы или плагина.
Данный подход позволяет вам гибко управлять URL, обеспечивая, что все правила перезаписи корректно обрабатываются WordPress. Не забудьте протестировать изменения в вашей тестовой среде перед тем, как внедрять их на рабочем сайте. Это позволит избежать потенциальных сбоев и проблем с доступом к страницам.