Как настроить rewrite rule для WordPress?

Ссылка скопирована
1 ответ

На сайте есть кастомный тип записей team, в нем есть записи.
Нужно создать дополнительную страницу, которая использует данные из кастомного типа,
где post slug = GET-параметр в новом пути

Файл-обработчик страницы single-vcard.php, лежит в корне теме.

Путь
site.ru/vcard/ivan-ivanov/
vcard – статическая часть url
ivan-ivanov – GET-параметр

После добавления кода в functions.php и обновления постоянных ссылок через админку не передаются значения GET-параметра employee_id.

Вопросы:
1. Как сократить путь в add_rewrite_rule(), чтобы не писать путь от корня сайта?
2. Почему не передаются значения GET-параметра employee_id ?
3. Почему не подгружаются стандартные функции WordPress в подключаемом файле?
Нужно принудительно require wp_core.php прописать?

Код

add_action('init', function(){     add_rewrite_rule(         '^vcard/([a-zA-Z0-9-_]+)/?',         'wp-content/themes/main_theme/single-vcard.php?employee_id=$matches[1]',         'top'     ); });  function prefix_register_query_var( $vars ) {     $vars[] = 'employee_id';          return $vars; }  add_filter( 'query_vars', 'prefix_register_query_var' );

add_action('init', function(){ add_rewrite_rule( '^vcard/([a-zA-Z0-9-_]+)/?', 'wp-content/themes/main_theme/single-vcard.php?employee_id=$matches[1]', 'top' ); }); function prefix_register_query_var( $vars ) { $vars[] = 'employee_id'; return $vars; } add_filter( 'query_vars', 'prefix_register_query_var' );

Результат ($_GET)

Как настроить rewrite rule для WordPress?

Дополнительно:

ЕМНИП оно и так должно работать, если vcard таки кастомный тип поста и при обычных правилах рерайта, правда будет получаться не emplyee_id, а post_slug в глобальном WP_Query, и выполняться single-{post_name}.php при наличии

а функции не подключаются потому что запрос идёт мимо WP

  • IvanU7n, vcard не кастомный тип поста.
    Смена названия файла поможет?

    При rewrite нужно подключать wp core? Не будет ли зацикливания?

  • Илья Петров, в таком случае лучше переименовать, т.к. может ввести в заблуждение, и использовать другой механизм расписанный в комментариях к документации на add_rewite_tag()
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Игорь NetOps Ответ

    Для URL вида /vcard/ivan-ivanov/, где ivan-ivanov — slug записи CPT team, нужно добавить rewrite rule, query var и шаблон, который по этому slug найдёт нужную запись.

    Добавьте query var:

    add_filter('query_vars', function ($vars) {
        $vars[] = 'vcard_team';
        return $vars;
    });

    add_filter('query_vars', function ($vars) { $vars[] = 'vcard_team'; return $vars; });

    Добавьте правило:

    add_action('init', function () {
        add_rewrite_rule(
            '^vcard/([^/]+)/?$',
            'index.php?vcard_team=$matches[1]',
            'top'
        );
    });

    add_action('init', function () { add_rewrite_rule( '^vcard/([^/]+)/?$', 'index.php?vcard_team=$matches[1]', 'top' ); });

    Подключите шаблон:

    add_filter('template_include', function ($template) {
        $slug = get_query_var('vcard_team');
     
        if (!$slug) {
            return $template;
        }
     
        $file = get_stylesheet_directory() . '/single-vcard.php';
     
        if (file_exists($file)) {
            return $file;
        }
     
        return $template;
    });

    add_filter('template_include', function ($template) { $slug = get_query_var('vcard_team'); if (!$slug) { return $template; } $file = get_stylesheet_directory() . '/single-vcard.php'; if (file_exists($file)) { return $file; } return $template; });

    В single-vcard.php найдите запись:

    $slug = get_query_var('vcard_team');
     
    $team = get_page_by_path($slug, OBJECT, 'team');
     
    if (!$team) {
        status_header(404);
        nocache_headers();
        include get_404_template();
        exit;
    }

    $slug = get_query_var('vcard_team'); $team = get_page_by_path($slug, OBJECT, 'team'); if (!$team) { status_header(404); nocache_headers(); include get_404_template(); exit; }

    После добавления правила обязательно пересохраните постоянные ссылки или один раз вызовите flush_rewrite_rules() при активации плагина. Не вызывайте flush на каждом запросе — это замедляет сайт.

    Файл single-vcard.php лучше держать в теме/дочерней теме, а rewrite-логику — в плагине или functions.php. Если функционал важный и не должен зависеть от темы, вынесите его в маленький кастомный плагин.

    Проверьте также конфликт со страницей /vcard/. Если такая страница уже существует, правило всё равно может работать, но порядок rewrite rules становится важным. После настройки откройте “Инструменты → Здоровье сайта” или временно выведите get_query_var('vcard_team'), чтобы убедиться, что WordPress реально получил slug.

    Итог: нужны три части: rewrite rule, query var и template include. Сам GET-параметр в URL пользователю не нужен, WordPress получит его внутренне через rewrite.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно