Вопрос или проблема
В настройках постоянных ссылок параметр ‘База магазина с категорией’ /shop/%product_cat%/
добавляет все иерархические категории в URL-адрес, например:
http:// mystore.com/shop/родительская-категория/дочерняя-категория/товар
Я хочу убрать всё между родительской категорией и товаром, чтобы мои URL-адреса выглядели так:
http:// mystore.com/shop/родительская-категория/товар
Я совершенно уверен, что настройка URL таким образом не вызывает проблем, потому что я могу вручную ввести укороченный URL в адресную строку, и он ведёт в то же место, что и более длинный.
Спасибо.
На самом деле это довольно просто. Используйте фильтр woocommerce_product_post_type_link_parent_category_only
:
add_filter( 'woocommerce_product_post_type_link_parent_category_only', '__return_true' );
Проверено и работает.
PS: Код нужно поместить в файл функций темы, а __return_true()
— это функция WordPress функция.
Если вы просто хотите убрать немедленный родитель слаг категории из URL (или любое количество предков), в файле wc-product-functions.php есть ещё один полезный фильтр, который находится за несколько строк до фильтра woocommerce_product_post_type_link_parent_category_only
:
// Удалить одну или несколько родительских категорий из URL товара Woo
function my_product_post_type_link_product_cat( $parent_term, $terms, $post ) {
// Выберите, какие продукты модифицировать
if ( has_term('некоторая-дочерняя-категория', 'product_cat', $post ) ) {
// ID термина желаемого окончательного слага категории в URL
$parent_term = get_term(123);
} else if ( $post->ID == 2962 ) { // Целевой отдельный товар
$parent_term = get_term(321);
}
return $parent_term;
}
add_filter( 'wc_product_post_type_link_product_cat', 'my_product_post_type_link_product_cat', 10, 3 );
Сгенерированный функцией $permalink
wc_product_post_type_link()
(которая содержит вышеупомянутые два фильтра) затем передаётся в фильтр post_type_link
, если вы предпочитаете подход с молотком (например, используя str_replace
).
При выборе, какие продукты модифицировать, избегайте условных операторов, таких как is_product_category
, иначе URL не будет модифицироваться в других местах (например, в результатах поиска). Вместо этого убедитесь, что используете функции, которые ссылаются на повсеместный объект $post
.
Ответ или решение
Удаление подкатегории из URL продуктов WooCommerce
В большинстве случаев, пользователи WooCommerce сталкиваются с вопросом, как изменить структуру постоянных ссылок (URL) для продуктов, чтобы они выглядели проще и лаконичнее. Например, для URL, где присутствует как родительская, так и дочерняя категории, можно получить более короткий вариант с использованием только родительской категории и названия продукта.
В этой статье мы рассмотрим, как удалить подкатегорию из URL продукта в WooCommerce, а также приведем соответствующий код и инструкции по его внедрению.
Проблема с текущей структурой URL
При настройке постоянных ссылок WooCommerce с параметром "Shop Base with Category" (/shop/%product_cat%/
), ваши URL будут выглядеть следующим образом:
http://mystore.com/shop/parent-category/child-category/product
Для более удобного восприятия, вы хотите изменить URL на следующий формат:
http://mystore.com/shop/parent-category/product
Решение: Использование фильтров WooCommerce
Для достижения желаемой структуры URL можно использовать фильтры WooCommerce. Вот шаги, которые помогут вам это сделать.
- Добавьте фильтр
woocommerce_product_post_type_link_parent_category_only
Этот фильтр позволяет ограничить вывод только родительской категории в URL. Код, который вам нужно добавить в файл functions.php
вашей темы, выглядит следующим образом:
add_filter('woocommerce_product_post_type_link_parent_category_only', '__return_true');
Использование функции __return_true()
позволяет убрать в URL все категории, кроме родительской.
- Удаление немедленной родительской категории
Если вам необходимо более тонкое управление, например, удалить только немедленную родительскую категорию, вы можете использовать следующий код:
// Удалить одну или несколько родительских категорий из URL продукта
function my_product_post_type_link_product_cat($parent_term, $terms, $post) {
// Выберите, какие продукты следует модифицировать
if (has_term('some-child-category', 'product_cat', $post)) {
// ID терминов желаемой конечной категории в URL
$parent_term = get_term(123);
} else if ($post->ID == 2962) { // Целевой единичный продукт
$parent_term = get_term(321);
}
return $parent_term;
}
add_filter('wc_product_post_type_link_product_cat', 'my_product_post_type_link_product_cat', 10, 3);
Этот код позволит вам более детально определить, какие товары изменять, основываясь на родительских и дочерних категориях.
Замечания и рекомендации
- Тестирование: После внесения изменений в файл
functions.php
, обязательно протестируйте новые URL, чтобы убедиться, что все перенаправления работают корректно. Это можно сделать, вручную вводя новые URL в адресную строку и проверяя результаты. - SEO-оптимизация: Убедитесь, что новый формат URL соответствует требованиям SEO, что может улучшить видимость ваших товаров в поисковых системах.
- Резервное копирование: Всегда рекомендуется делать резервную копию всех файлов темы перед внесением изменений, чтобы избежать потери данных.
Заключение
Следуя указанным шагам, вы сможете легко удалить подкатегории из URL продуктов WooCommerce и создать более короткие и удобочитаемые ссылки. Это не только улучшит пользовательский опыт, но и может положительно сказаться на SEO ваших страниц. Если потребуется помощь, обратитесь к профессионалам в области веб-разработки или поддержки WooCommerce.