Как настроить rewrite rule для WordPress?
На сайте есть кастомный тип записей 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)
Дополнительно:
ЕМНИП оно и так должно работать, если vcard таки кастомный тип поста и при обычных правилах рерайта, правда будет получаться не emplyee_id, а post_slug в глобальном WP_Query, и выполняться single-{post_name}.php при наличии
а функции не подключаются потому что запрос идёт мимо WP
Смена названия файла поможет?
При rewrite нужно подключать wp core? Не будет ли зацикливания?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для URL вида
/vcard/ivan-ivanov/, гдеivan-ivanov— slug записи CPTteam, нужно добавить rewrite rule, query var и шаблон, который по этому slug найдёт нужную запись.Добавьте query var:
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_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; }
После добавления правила обязательно пересохраните постоянные ссылки или один раз вызовите
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.