Передача переменных в структуре постоянной ссылки для пользовательского типа записи

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

У меня есть структура, похожая на следующую для моих пользовательских типов записей:

domain.com/member/member-name/book/book-name

В основном, у меня есть пользовательский тип записи “member”, а “member-name” – это запись. Что я хочу сделать, так это передать переменную под названием “books”, но я не могу заставить свой код работать.

Я основывал свое решение на одном из тех, что уже задавались здесь, но моя структура отличается, и я гуглил и гуглил без результата. Я действительно не могу разобраться с переписыванием структур!

    function add_book_rewrite() {
        add_rewrite_tag('%book_name%','([^&]+)');
    }
    add_action( 'init', 'add_book_rewrite' );

    function add_book_rewrite_rules() {
        add_rewrite_rule('^member/([^/]*)/book/([^/]*)/?','index.php?post_type=member&name=$matches[2]&book_name=$matches[4]','top');
    }
    add_action( 'init', 'add_book_rewrite_rules' );

    add_filter( 'query_vars', 'add_query_var' );

    function add_query_var( $query_vars ) {

        $query_vars[] = 'book_name';
        return $query_vars;
    }

    echo 'Книга это '.get_query_var('book_name');

Любые рекомендации по этому поводу будут восприниматься с благодарностью

Спасибо

Во-первых, добавление тега переписывания и переменной запроса является избыточным, добавление тега добавляет переменную запроса.

Во-вторых, $matches соответствует каждому шаблону regex, который у вас есть в вашем правиле, так что это должно быть $matches[1] и $matches[2], а не 2 и 4.

Наконец, для одного member вы можете просто установить переменную запроса member.

add_rewrite_rule(
    '^member/([^/]*)/book/([^/]*)/?',
    'index.php?member=$matches[1]&book_name=$matches[2]',
    'top'
);

Некоторое время не тестировалось, но должно помочь вам двигаться в правильном направлении. Также посмотрите на этот плагин для анализа переписывания, который поможет вам построить ваше правило переписывания.

Ответ или решение

Прохождение переменных в структуре постоянных ссылок на собственном типе записи в WordPress

В данной статье мы детально рассмотрим, как правильно передавать переменные в структуре постоянных ссылок для кастомного типа постов в WordPress, а также исправим некоторые ошибки в предложенном вами коде. Рассмотрим ваш случай, где структура URL выглядит так: domain.com/member/member-name/book/book-name.

1. Основные понятия

Перед тем как начать, важно понимать ключевые аспекты, связанные с созданием пользовательских типов постов и их permalink структур. Для вашего случая у нас есть два уровня иерархии в URL: member (член) и book (книга), и мы хотим извлечь информацию о книге в вашем кастомном типе записи.

2. Настройка правил перезаписи (Rewrite Rules)

Ваше текущее определение правил перезаписи имеет некоторые недочеты, что препятствует корректному извлечению значений из URL. Правила перезаписи должны точно соответствовать структуре вашего URL и правильно использовать индексы массива $matches.

Вот исправленная версия вашего кода:

function add_book_rewrite() {
    // Добавляем тег перезаписи
    add_rewrite_tag('%book_name%', '([^&]+)');
}
add_action('init', 'add_book_rewrite');

function add_book_rewrite_rules() {
    // Создадим правило перезаписи для обработки структуры URL
    add_rewrite_rule(
        '^member/([^/]*)/book/([^/]*)/?',
        'index.php?post_type=member&name=$matches[1]&book_name=$matches[2]',
        'top'
    );
}
add_action('init', 'add_book_rewrite_rules');

function add_query_var($query_vars) {
    // Добавляем переменную book_name в массив переменных запроса
    $query_vars[] = 'book_name';
    return $query_vars;
}
add_filter('query_vars', 'add_query_var');

3. Разъяснения по коду

  • Функция add_book_rewrite: добавляет тег для URL, который позволяет WordPress понять, что URL может включать переменную book_name. Здесь мы используем только один тег, так как добавление кастомных переменных требует единственной записи.

  • Функция add_book_rewrite_rules: здесь мы корректно извлекаем значения из URL, используя $matches[1] для имени члена и $matches[2] для названия книги.

  • Функция add_query_var: добавляет book_name как переменную запроса, которая затем будет доступна через функции WordPress.

4. Получение значения переменной

Теперь, чтобы получить значение переменной book_name, вы можете использовать следующую строку кода:

echo 'Книга: ' . get_query_var('book_name');

Эта строка выведет название книги, извлеченное из запроса, если URL соответствует заданной структуре.

5. Проверка перезаписи правил

После внесения изменений в код не забудьте обновить перезапись правил в разделе "Настройки → Постоянные ссылки" админ-панели WordPress. Это необходимо для применения новых правил. Просто нажмите на кнопку "Сохранить изменения", и вы будете уверены, что ваши изменения вступили в силу.

6. Полезные инструменты

Рекомендуем использовать плагин Monkeyman Rewrite Analyzer для тестирования и проверки ваших правил перезаписи, что существенно упростит процесс разработки.

Заключение

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

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

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