Вопрос или проблема
Я пытаюсь переписать свои URL-адреса продуктов WooCommerce так, чтобы в конце присутствовал ID записи, как это:
/product/product-name-post-id/
Я использовал код из этой темы Как переписать URI пользовательского типа записи?, который работает, но у нас получается /product/post-id-product-name/.
add_filter('post_type_link', 'wpse33551_post_type_link', 1, 3);
function wpse33551_post_type_link( $link, $post = 0 ){
if ( $post->post_type == 'product' ){
return home_url( 'product/' . $post->post_name . '-' . $post->ID );
} else {
return $link;
}
}
add_action( 'init', 'wpse33551_rewrites_init' );
function wpse33551_rewrites_init(){
add_rewrite_rule(
'product/([0-9]+)?$',
'index.php?post_type=product&p=$matches[1]',
'top' );
}
Я не могу понять, как исправить правило переписывания во второй функции, чтобы ID записи был в конце?
Это должно сработать:
add_action( 'init', 'wpse33551_rewrites_init' );
function wpse33551_rewrites_init(){
add_rewrite_rule(
'product/.+\-([0-9]+)?$',
'index.php?post_type=product&p=$matches[1]',
'top' );
}
Функция фильтра изменяет постоянную ссылку на product/my-product-name-88
. Вам просто нужно подкорректировать регулярное выражение во второй функции, чтобы оно соответствовало этому шаблону.
Регулярное выражение:
product/
– соответствует буквальной строке product/
.+
– соответствует одному или более другим символам
\-
– соответствует дефису (обратный слэш экранирует его, чтобы движок регулярных выражений не думал, что это специальный оператор регулярных выражений, как в следующей части)
([0-9]+)?$
– соответствует и захватывает одно или более чисел в конце URL
Как говорит @gregory, после внесения этого изменения вам нужно нажать кнопку «Сохранить» на странице постоянных ссылок wp-admin/options-permalink.php
, чтобы сбросить кэш переписывания.
Ответ или решение
Переписывание URL продуктов в WooCommerce
При оптимизации структуры URL ваших продуктов в WooCommerce, одной из задач может стать модификация адресов в формате /product/product-name-<post-id>/
. Это можно достичь с помощью фильтров и правил переписывания в WordPress.
Ваша текущая реализация использует следующую логику:
- Фильтр
post_type_link
— отвечает за изменение структуры URL товара. - Действие
init
— добавляет правило переписывания.
Ваш код для фильтра выглядит как:
add_filter('post_type_link', 'wpse33551_post_type_link', 1, 3);
function wpse33551_post_type_link( $link, $post = 0 ){
if ( $post->post_type == 'product' ){
return home_url( 'product/' . $post->post_name . '-' . $post->ID );
} else {
return $link;
}
}
Этот код корректно формирует ссылки на страницы товаров, но ваше правило переписывания требует дополнения для получения желаемого формата URL. Для достижения нужной структуры необходимо внести изменения в ваше второе правило.
Обновленное правило переписывания
Для того чтобы обеспечить правильное сопоставление URL с постом, обновите функцию wpse33551_rewrites_init
следующим образом:
add_action( 'init', 'wpse33551_rewrites_init' );
function wpse33551_rewrites_init(){
add_rewrite_rule(
'product/.+\-([0-9]+)$',
'index.php?post_type=product&p=$matches[1]',
'top'
);
}
Объяснение обновленного регулярного выражения
Давайте разберем, как работает обновленное регулярное выражение:
product/
— соответствует строке «product/», которая является фиксированной частью URL..+
— соответствует любым символам, кроме символа новой строки, что гарантирует, что название продукта будет захвачено.\-
— соответствует символу дефиса. Знак обратной косой черты перед дефисом указывает, что это не специальный символ регулярного выражения.([0-9]+)$
— захватывает одно или более чисел (ID поста) в конце URL.
Обновление пермалинков
После внесения изменений в правила переписывания необходимо обновить кэш пермалинков. Для этого:
- Перейдите в админку WordPress.
- Откройте раздел "Настройки" → "Постоянные ссылки".
- Нажмите "Сохранить изменения" без необходимости вносить изменения — это обновит кэш ваших правил переписывания.
Заключение
Создание структурированных и понятных URL не только улучшает пользовательский опыт, но также может повлиять на SEO вашего веб-сайта. Убедитесь, что все перенаправления настроены правильно после внесения изменений, а ваш контент остается доступным для поисковых систем. Если у вас возникнут дополнительные вопросы или потребуется более глубокий анализ, не стесняйтесь обращаться для получения помощи.