Как получить архивы для конкретной категории без category_base в URL?

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

Я использую этот код, чтобы получить архивы для конкретной категории:

function extend_date_archives_add_rewrite_rules($wp_rewrite){
    $rules = array();
    $structures = array(
        $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_date_permastruct(),
        $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_month_permastruct(),
        $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_year_permastruct(),
    );
    foreach( $structures as $s ){
        $rules += $wp_rewrite->generate_rewrite_rules($s);
    }
    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'extend_date_archives_add_rewrite_rules');

Это работает хорошо, и я получаю URL как:
example.com/category_base/category_name/date/YYYY/MM

Проблема в том, что я хотел бы получить URL без category_base: example.com/category_name/date/YYYY/MM

Если я использую плагин для удаления “category_base” (например, WP no category base) или просто использую “str_replace” для удаления “category_base”, я получаю страницу с ошибкой 404 на всех страницах и одиночных страницах.

Что я могу сделать?

Спасибо.

Добавленные заметки:

Если я использую:

function extend_date_archives_flush_rewrite_rules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
add_action('init', 'extend_date_archives_flush_rewrite_rules');
function extend_date_archives_add_rewrite_rules($wp_rewrite){
    $rules = array();
    $structures = array(
        $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_date_permastruct(),
        $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_month_permastruct(),
        $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_year_permastruct(),
    );
    foreach( $structures as $s ){
        $rules += $wp_rewrite->generate_rewrite_rules($s);
    }
    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'extend_date_archives_add_rewrite_rules');

example.com/category_name/YYYY работает хорошо, но одиночные и страницы отправляются на страницу 404. Но если я использую только:

function extend_date_archives_add_rewrite_rules($wp_rewrite){
        $rules = array();
        $structures = array(
            $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_date_permastruct(),
            $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_month_permastruct(),
            $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_year_permastruct(),
        );
        foreach( $structures as $s ){
            $rules += $wp_rewrite->generate_rewrite_rules($s);
        }
        $wp_rewrite->rules = $rules + $wp_rewrite->rules;
    }
    add_action('generate_rewrite_rules', 'extend_date_archives_add_rewrite_rules');

Тогда все одиночные и страницы работают хорошо, но example.com/category_name/YYYY отправляется на 404.
Есть идеи? Я обновил постоянные ссылки, и проблема продолжается 🙁

Обновление: Попробовал и работает нормально только без плагина WP no category base, то есть, вам придется смириться с категорией, хотя вы можете свободно изменять ее в настройках постоянных ссылок.

Для полного URL в одиночных записях установите структуру категории в Настройки > Постоянные ссылки, затем в Базе категории введите /%category%/%postname%/ (изображение ниже).

Пользовательская структура должна быть <code>/%category%/%postname%/</code>

Функция, которую я протестировал, такова:

function extend_date_archives_flush_rewrite_rules(){
   global $wp_rewrite;
   $wp_rewrite->flush_rules();
}
add_action('init', 'extend_date_archives_flush_rewrite_rules');

function extend_date_archives_add_rewrite_rules($wp_rewrite){
$rules = array();
$structures = array(
    $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_date_permastruct(),
    $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_month_permastruct(),
    $wp_rewrite->get_category_permastruct() . $wp_rewrite->get_year_permastruct(),
);
foreach( $structures as $s ){
    $rules += $wp_rewrite->generate_rewrite_rules($s);
}
$wp_rewrite->rules = $rules + $wp_rewrite->rules;
}

add_action('generate_rewrite_rules','extend_date_archives_add_rewrite_rules');

Тогда вы можете получить доступ к году category/categoryname/2012/02, месяцу category/categoryname/2012/02 и дню site.com/category/the-categoryname/2012/02/25.

Я думаю, что вы можете попробовать объединить переписывание плагина с этой функцией, потому что два переписывания, кажется, вызывают некоторые конфликты.

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

Как получить архивы для конкретной категории без category_base в URL

Для достижения желаемого результата, а именно, получения URL в формате example.com/category_name/date/YYYY/MM без category_base, необходимо внести изменения в систему перезаписи методом, который не будет конфликтовать с другими правилами перезаписи WordPress. Ниже приводится пошаговое руководство, как это можно реализовать.

Шаг 1: Настройка структуры постоянных ссылок

Прежде всего, убедитесь, что структура постоянных ссылок настроена правильно. Перейдите в админ-панель WordPress:

  1. Выберите «Настройки» > «Постоянные ссылки».
  2. Установите следующую структуру: /%category%/%postname%/. Это обеспечит связь между категориями и записями.
  3. Убедитесь, что поле «Базовая категория» оставлено пустым. Это важно, так как это влияет на структуру URL.

Шаг 2: Добавление настраиваемых правил перезаписи

Далее, используйте следующий код в вашем файле functions.php темы. Этот код добавляет необходимые правила для обработки запросов без category_base:

function custom_rewrite_rules($wp_rewrite) {
    $rules = array();

    // Определите структуры URL для года, месяца и дня без category_base
    $rules['([^/]+)/date/([0-9]{4})/([0-9]{2})/?$'] = 'index.php?category_name=$matches[1]&year=$matches[2]&monthnum=$matches[3]';
    $rules['([^/]+)/date/([0-9]{4})/?$'] = 'index.php?category_name=$matches[1]&year=$matches[2]';
    $rules['([^/]+)/date/?$'] = 'index.php?category_name=$matches[1]';

    // Объедините с существующими правилами
    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'custom_rewrite_rules');

Здесь мы создаем правила, которые обрабатывают различные форматы URL, включая год и месяц. Параметр category_name будет передаваться правильно.

Шаг 3: Очистка правил перезаписи

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

function flush_rewrite_rules_on_init() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
add_action('init', 'flush_rewrite_rules_on_init');

Шаг 4: Проверка работоспособности

После добавления и изменения этих функций:

  1. Сохраните изменения в functions.php.
  2. Перейдите на страницу «Настройки» > «Постоянные ссылки» и просто нажмите кнопку «Сохранить изменения» для принудительного обновления правил.
  3. Проверьте, корректно ли работают URL формата example.com/category_name/date/YYYY/MM.

Заключение

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

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

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