Каковы лучшие практики для включения таксономии пользовательского типа записи в URL с использованием пользовательских записей и таксономий ACF Pro?

Вопрос или проблема

У меня есть пользовательский тип записи и пользовательская таксономия, созданные с помощью ACF Pro. Тип записи:

enter image description here

И таксономия:

enter image description here

Затем в 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 вручную при изменении категорий. Рассмотрим, как это можно улучшить.

Применение

  1. Автоматизация правил маршрутизации. Вместо того, чтобы вручную управлять каждой категорией, мы можем динамически генерировать правила маршрутизации. Это можно сделать, получив все существующие термины (категории) для вашей таксономии и создав правила маршрутизации на основе этих данных.

    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'
                );
            }
        }
    });
  2. Обработка обновлений. Для обновлений таксономии можно использовать хуки, такие как create_term и delete_term, чтобы каждый раз, когда добавляется или удаляется термин, автоматически обновлялись правила маршрутизации.

    add_action('create_term', 'flush_rewrite_rules');
    add_action('delete_term', 'flush_rewrite_rules');
  3. Оптимизация функции поиска главного термина. Для лучшего управления терминами, вы можете рассмотреть использование ACF функции, либо модифицировать вашу функцию get_primary_term для возврата более точных данных.

  4. Кэширование правил маршрутизации. Поскольку каждая новая rewrite rule может потребовать дополнительное время на обработку, имеет смысл их кэшировать. Для этого убедитесь, что вы используете flush_rewrite_rules только тогда, когда это действительно необходимо.

  5. Тестирование. После применения изменений обязательно протестируйте новые URL на производительность и корректность. Можете использовать профилирование страниц для обнаружения узких мест.

Следуя этим улучшениям, вы сможете автоматизировать процесс управления таксономиями в URL без ухудшения производительности вашего сайта. Это избавит вас от необходимости ручной корректировки темы при каждом изменении категорий, сделает структуру URL более динамической и удобной для SEO.

Оцените материал
Добавить комментарий

Капча загружается...