Вопрос или проблема
Я использую этот код, чтобы получить архивы для конкретной категории:
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%/
(изображение ниже).
Функция, которую я протестировал, такова:
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:
- Выберите «Настройки» > «Постоянные ссылки».
- Установите следующую структуру:
/%category%/%postname%/
. Это обеспечит связь между категориями и записями. - Убедитесь, что поле «Базовая категория» оставлено пустым. Это важно, так как это влияет на структуру 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: Проверка работоспособности
После добавления и изменения этих функций:
- Сохраните изменения в
functions.php
. - Перейдите на страницу «Настройки» > «Постоянные ссылки» и просто нажмите кнопку «Сохранить изменения» для принудительного обновления правил.
- Проверьте, корректно ли работают URL формата
example.com/category_name/date/YYYY/MM
.
Заключение
Следуя вышеуказанным шагам, вы сможете настроить URL для архивов категории без использования category_base
. Этот метод позволяет избежать конфликтов с другими плагинами и сохранить функциональность сайта. Если у вас возникнут любые трудности, проверьте консоль разработчика на предмет ошибок или конфликтов с другими плагинами.