Цей код призначений для видалення базового слугу таксономії (наприклад, /tag/ для тегів) з URL-адрес вашого сайту на WordPress. Це дозволяє зробити URL-адреси більш короткими та зручними для користувачів і пошукових систем.
Ось як працює цей код:
Фільтр request: Ця частина коду модифікує запити WordPress, щоб правильно обробляти URL-адреси без базового слугу таксономії. Вона перевіряє наявність параметрів attachment або name у запиті та відповідно налаштовує запит для отримання правильних термінів таксономії.
Це дозволяє WordPress розпізнавати URL-адреси без базового слугу та відображати відповідні сторінки.
Фільтр term_link: Цей фільтр змінює генерацію посилань для термінів таксономії, видаляючи базовий слуг з URL-адрес. Коли WordPress створює посилання на сторінку терміна (наприклад, на сторінку тегу), цей код видаляє частину URL, що відповідає базовому слугу таксономії.
Це забезпечує генерацію "чистих" URL-адрес без зайвих частин.
Редирект старих URL: Ця функція відповідає за перенаправлення старих URL-адрес з базовим слугом на нові URL без нього. Якщо користувач або пошукова система звертається до старого URL з базовим слугом, цей код автоматично перенаправляє на новий, коректний URL без базового слугу.
Це важливо для збереження SEO-рейтингу та забезпечення безперебійного доступу до контенту після зміни структури URL.
Застереження: Використання цього коду може призвести до конфліктів, якщо у вас є терміни таксономії та сторінки або записи з однаковими слагами. У таких випадках WordPress може не правильно визначати, який контент відображати. Тому перед впровадженням цього коду рекомендується ретельно протестувати його на вашому сайті.
Альтернативні рішення: Якщо ви не хочете вносити зміни безпосередньо в код, існують плагіни, які спрощують цей процес:
Remove Taxonomy Base Slug: Цей плагін дозволяє видалити базовий слуг таксономії з URL-адрес без необхідності втручатися в код. Він автоматично обробляє перенаправлення та забезпечує коректну роботу посилань.
WORDPRESS.COM
Remove Taxonomy Url: Ще один плагін, який допомагає видалити базовий слуг таксономії з URL-адрес, роблячи їх більш чистими та зрозумілими.
UK.WORDPRESS.ORG
Використання плагінів може бути простішим та безпечнішим способом досягнення бажаного результату без прямого редагування коду вашої теми.
=========================================================================
add_filter('request', 'rudr_change_term_request', 1, 1 );
function rudr_change_term_request($query){
$tax_name = 'post_tag'; // specify your taxonomy name here
// Перевіряємо, чи існує ключ 'attachment' у масиві $query
if (!empty($query['attachment'])) {
$include_children = true;
$name = $query['attachment'];
} elseif (!empty($query['name'])) { // Перевіряємо, чи існує ключ 'name'
$include_children = false;
$name = $query['name'];
} else {
return $query; // Якщо обидва ключі відсутні, повертаємо оригінальний запит
}
$term = get_term_by('slug', $name, $tax_name); // Отримуємо термін
if ($term && !is_wp_error($term)) { // Перевіряємо, чи термін існує
if ($include_children) {
unset($query['attachment']);
$parent = $term->parent;
while ($parent) {
$parent_term = get_term($parent, $tax_name);
$name = $parent_term->slug . '/' . $name;
$parent = $parent_term->parent;
}
} else {
unset($query['name']);
}
switch ($tax_name) {
case 'category':
$query['category_name'] = $name; // Для категорій
break;
case 'post_tag':
$query['tag'] = $name; // Для тегів
break;
default:
$query[$tax_name] = $name; // Для інших таксономій
break;
}
}
return $query;
}
add_filter( 'term_link', 'rudr_term_permalink', 10, 3 );
function rudr_term_permalink( $url, $term, $taxonomy ){
$taxonomy_name = 'post_tag'; // your taxonomy name here
$taxonomy_slug = 'tag'; // the taxonomy slug can be different with the taxonomy name (like 'post_tag' and 'tag' )
// exit the function if taxonomy slug is not in URL
if ( strpos($url, $taxonomy_slug) === FALSE || $taxonomy != $taxonomy_name ) return $url;
$url = str_replace('/' . $taxonomy_slug, '', $url);
return $url;
}
add_action('template_redirect', 'rudr_old_term_redirect');
function rudr_old_term_redirect() {
$taxonomy_name = 'post_tag';
$taxonomy_slug = 'tag';
// exit the redirect function if taxonomy slug is not in URL
if( strpos( $_SERVER['REQUEST_URI'], $taxonomy_slug ) === FALSE)
return;
if( ( is_category() && $taxonomy_name=='category' ) || ( is_tag() && $taxonomy_name=='post_tag' ) || is_tax( $taxonomy_name ) ) :
wp_redirect( site_url( str_replace($taxonomy_slug, '', $_SERVER['REQUEST_URI']) ), 301 );
exit();
endif;
}