Вопрос или проблема
У меня есть пользовательский тип записи и пользовательская таксономия, созданные с помощью ACF Pro. Тип записи:
И таксономия:
Затем в functions.php
у меня есть следующий код:
add_action(
'init',
function() {
add_rewrite_rule(
'^(?:tour-category-1|tour-category-2|tour-category-3)/([^/]+)/?$',
'index.php?post_type=tour&name=$matches[1]',
'top',
);
},
);
add_filter(
'post_type_link',
function(string $post_link, WP_Post $post) {
static $placeholders_to_taxonomies = [
'%tourcategory%' => 'tour-category',
];
foreach ($placeholders_to_taxonomies as $placeholder => $taxonomy) {
if (str_contains($post_link, $placeholder)) {
$term = get_primary_term($taxonomy, $post->ID);
$replace="uncategorized";
if ($term instanceof WP_Term) {
$replace = $term->slug;
}
$post_link = str_replace($placeholder, $replace, $post_link);
}
}
return $post_link;
},
10,
2,
);
function get_primary_term(string $taxonomy, int $post_id): WP_Term|false
{
$primary_term = false;
$terms = get_the_terms($post_id, $taxonomy);
$terms = is_wp_error($terms) ? [] : $terms;
$terms = $terms ?: [];
if ($terms) {
[$primary_term] = $terms;
}
}
(Для вызова add_rewrite_rule
слуги категорий в регулярном выражении не являются фактическими категориями, используемыми на сайте.)
Это работает, но каждый раз, когда клиент добавляет категорию, мне приходится добавлять новый слаг категории в регулярное выражение. Я мог бы изменить код, чтобы получать все категории и добавлять правило переписи для каждой из них, но я не знаю, замедлил бы это сайт или нет, или есть ли лучший подход.
Ответ или решение
Вопрос об использовании пользовательских таксономий в URL с помощью ACF Pro и настроек в WordPress является актуальным для многих разработчиков, стремящихся улучшить SEO и структуру URL своего сайта. Вы уже предприняли некоторые шаги, воспользовавшись функциями add_rewrite_rule
и post_type_link
, чтобы включить таксономию в URL. Однако ваш текущий подход требует ручного вмешательства при добавлении новых категорий, что может быть неэффективно в долгосрочной перспективе. Рассмотрим лучшие практики для автоматизации этого процесса.
Теория
Переписывание URL в WordPress – это процесс добавления пользовательских URL-адресов, которые более удобны для пользователей и поисковых систем. Это достигается путем создания и управления собственными правилами маршрутизации (rewrite rules). Эти правила позволяют WordPress соответствовать входящим URL-запросам с конкретными query vars для получения нужного содержимого.
Таксономии в URL – включение таксономий (категорий) в структуру URL позволяет улучшить семантику URL и лучше организовать содержимое на вашем сайте.
Использование ACF Pro – Advanced Custom Fields Pro предоставляет расширенные возможности для управляения пользовательскими полями и таксономиями, однако, правильная работа с ними в URL требует дополнительной настройки.
Пример
На текущий момент у вас есть код, который вручную включает таксономии в URL следующим образом:
add_rewrite_rule
используется для добавления конкретных правил маршрутизации, указывая явно категории.post_type_link
фильтр используется для замены плейсхолдеров в постоянной ссылке.
Этот подход имеет недостатки, в частности необходимость обновления regex вручную при изменении категорий. Рассмотрим, как это можно улучшить.
Применение
-
Автоматизация правил маршрутизации. Вместо того, чтобы вручную управлять каждой категорией, мы можем динамически генерировать правила маршрутизации. Это можно сделать, получив все существующие термины (категории) для вашей таксономии и создав правила маршрутизации на основе этих данных.
add_action('init', function() { $taxonomy = 'tour-category'; $terms = get_terms(['taxonomy' => $taxonomy, 'hide_empty' => false]); if (!is_wp_error($terms)) { foreach ($terms as $term) { add_rewrite_rule( '^' . $term->slug . '/([^/]+)/?$', 'index.php?post_type=tour&name=$matches[1]', 'top' ); } } });
-
Обработка обновлений. Для обновлений таксономии можно использовать хуки, такие как
create_term
иdelete_term
, чтобы каждый раз, когда добавляется или удаляется термин, автоматически обновлялись правила маршрутизации.add_action('create_term', 'flush_rewrite_rules'); add_action('delete_term', 'flush_rewrite_rules');
-
Оптимизация функции поиска главного термина. Для лучшего управления терминами, вы можете рассмотреть использование ACF функции, либо модифицировать вашу функцию
get_primary_term
для возврата более точных данных. -
Кэширование правил маршрутизации. Поскольку каждая новая rewrite rule может потребовать дополнительное время на обработку, имеет смысл их кэшировать. Для этого убедитесь, что вы используете
flush_rewrite_rules
только тогда, когда это действительно необходимо. -
Тестирование. После применения изменений обязательно протестируйте новые URL на производительность и корректность. Можете использовать профилирование страниц для обнаружения узких мест.
Следуя этим улучшениям, вы сможете автоматизировать процесс управления таксономиями в URL без ухудшения производительности вашего сайта. Это избавит вас от необходимости ручной корректировки темы при каждом изменении категорий, сделает структуру URL более динамической и удобной для SEO.