Правило переписывания и регулярное выражение – Извлечение ‘cat-name’ и ‘page-number’ из http://domain.com/custom-post-type/category/cat-name/page/page-number

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

У меня есть URL, оформленный так:

http://domain.com/custom-post-type/category/cat-name/page/page-number

Мне нужно извлечь:

cat-name и page-number

Чтобы в моем functions.php я мог создать собственное правило переписывания:

function my_insert_rewrite_rules( $rules ) {
  $newrules = array();
  $newrules['projects/category/(.+)/page/(\d+)/?$'] = 'index.php?post_type=project&project_cat=$matches[1]&paged=$matches[2]';
  return $newrules + $rules;
}

Я пытаюсь использовать выражение:

projects/category/(.+)/page/(\d+)/?$

Которое, похоже, работает должным образом (экранируя слеши) в этом примере: http://rubular.com/r/5rzECsTexy

Однако это никогда не работает, URL:

http://domain.com/projects/category/print и http://domain.com/projects/category/print/page/2 всегда ведут к 404.

Мое предыдущее правило переписывания projects/category/(.*/?)$ работало для категории, но не извлекало номер страницы правильно.

Редактировать
Код регистрации пользовательского типа записи (в function.php моей темы)

// Пользовательские типы записей
add_action( 'init', 'create_post_type' );
function create_post_type() {
    register_post_type( 'project',
        array(
            'labels' => array(
                'name' => __( 'Проекты' ),
                'singular_name' => __( 'Проект' )
            ),
        'public' => true,
        'has_archive' => true,
        'taxonomies' => array('category'),
        'rewrite' => array('slug' => 'projects')
        )
    );
}

Вам не нужно настраивать собственное правило переписывания для этого, просто установите свой слаг переписывания так:

'rewrite' => array( 'slug' => 'projects/category/%project_cat%' )

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

Чтобы извлечь ‘cat-name’ и ‘page-number’ из URL, имеющего формат http://domain.com/custom-post-type/category/cat-name/page/page-number, мы можем использовать регулярные выражения (regex) в комбинации с правилами перезаписи (rewrite rules) в WordPress. Рассмотрим этот процесс более подробно.

Шаг 1: Определение регулярного выражения

Для вашего случая мы можем использовать следующее регулярное выражение:

projects/category/([^/]+)/page/(\d+)/?$

Объяснение регулярного выражения:

  • projects/category/ – Эта часть соответствует статическому началу вашего URL.
  • ([^/]+) – Это захватывающая группа, которая будет извлекать ‘cat-name’. Символы [^/] указывают, что мы ищем любые символы, кроме слэша /, один или более раз (+).
  • /page/ – Эта часть также указывает на наличие статической структуры URL.
  • (\d+) – Вторая захватывающая группа, которая будет извлекать ‘page-number’. Здесь \d соответствует любой цифре, а + указывает на одно или более вхождений.
  • /?$ – Указывает, что на конце URL может быть один слэш или не быть, и что это конец строки.

Шаг 2: Создание правила перезаписи

Теперь, когда мы определили регулярное выражение, мы можем использовать его для создания правила перезаписи в файле functions.php вашей темы:

function my_insert_rewrite_rules( $rules ) {
    $newrules = array();
    $newrules['projects/category/([^/]+)/page/(\d+)/?$'] = 'index.php?post_type=project&project_cat=$matches[1]&paged=$matches[2]';
    return $newrules + $rules;
}
add_filter('rewrite_rules_array', 'my_insert_rewrite_rules');

Шаг 3: Регистрация пользовательского типа записи

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

add_action( 'init', 'create_post_type' );
function create_post_type() {
    register_post_type( 'project',
        array(
            'labels' => array(
                'name' => __( 'Projects' ),
                'singular_name' => __( 'Project' )
            ),
            'public' => true,
            'has_archive' => true,
            'taxonomies' => array('category'),
            'rewrite' => array('slug' => 'projects')
        )
    );
}

Добавьте в массив rewrite строку для таксономии:

'rewrite' => array('slug' => 'projects/category/%project_cat%')

Это позволит WordPress правильно интерпретировать ваши запросы.

Шаг 4: Обновление правил перезаписи

После внесения изменений в файл functions.php, не забудьте обновить правила перезаписи:

  1. Перейдите в админку WordPress.
  2. В разделе «Настройки» выберите «Постоянные ссылки».
  3. Нажмите «Сохранить изменения» (даже если вы ничего не меняете).

Это обновит ваши правила перезаписи и активирует новые настройки.

Заключение

Вышеуказанный метод использует регулярные выражения для извлечения параметров ‘cat-name’ и ‘page-number’ из заданного URL. Обратив внимание на структуру URL и соответствующие правила перезаписи в WordPress, вы сможете избежать ошибок 404 и добиться правильной работы вашего пользовательского типа записи и таксономии.

Помните, что правильное тестирование после реализации изменений – это ключ к успешному управлению вашим сайтом на WordPress. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за поддержкой.

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

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