404 ошибка при переходе на страницу рубрик?

Ссылка скопирована
1 ответ

Добрый день.

Имеется сайт на WP с самописной темой (не моей). Если в настройке постоянных ссылок указать Произвольно -> /%category%/%postname%/, и создать запись в любой рубрике (например /news/one/) , то появляется 404 ошибка и на саму запись, и при переходе на страницу рубрики /news/. При этом при переходе на страницу рубрики /category/news отображается как надо.

Если в настройке постоянных ссылок указать любой другой вид, то и запись отдаётся нормально.

Никаких дополнительных таксономий на сайте нет, создан только один кастомный тип записи. Если сменить тему, то проблема исчезает, значит проблема именно в теме. Но дело в том, что тема самописаная, её автор недоступен.

Подскажите - в какую сторону копать для решения данной проблемы?

Дополнительно:

Сменить тему на нормальную, естественно.

  • Подскажите - в какую сторону копать для решения данной проблемы?

    Я думаю, что стоит начать с отладки WordPress.

    Результат?

  • Михаил Р., в том и проблема, что никаких ошибок (ни в админке, ни на фронте) не отображается. Отдаётся почему-то 404 шаблон.
  • YaMariya, что написано в .htaccess? что написано в functions.php Вашей темы? Попробуйте использовать плагин Query Monitor, какой результат?
  • Михаил Р., я смогла локализовать проблему! Она возникает при регистрации custom post type

    Код cpt

    add_action('init', 'register_post_types');  function register_post_types() {    register_post_type('services', [     'label'  => 'services',     'labels' => [       'name'               => 'Услуги',       'singular_name'      => 'Услуга',       'add_new'            => 'Добавить услугу',       'add_new_item'       => 'Добавление услуги',       'edit_item'          => 'Редактирование услуги',       'new_item'           => 'Новая услуга',       'view_item'          => 'Смотреть услугу',       'search_items'       => 'Искать услугу',       'not_found'          => 'Не найдено',       'not_found_in_trash' => 'Не найдено в корзине',       'parent_item_colon'  => '',       'menu_name'          => 'Список услуг',     ],     'description'            => '',     'public'                 => true,     // 'publicly_queryable'  => null,      // 'exclude_from_search' => null,      // 'show_ui'             => null,      // 'show_in_nav_menus'   => null,      'show_in_menu'           => true,      // 'show_in_admin_bar'   => null,      'show_in_rest'        => null,      'rest_base'           => null,      'menu_position'       => null,     'menu_icon'           => null,     //'capability_type'   => 'post',     //'capabilities'      => 'post',      //'map_meta_cap'      => null,      'hierarchical'        => false,     'supports'            => ['title', 'custom-fields', 'page-attributes'], // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats'     'taxonomies'          => [],     'has_archive'         => false,     'rewrite'             => array('slug' => '/', 'with_front' => false),     'query_var'           => true,   ]); }

    add_action('init', 'register_post_types'); function register_post_types() { register_post_type('services', [ 'label' => 'services', 'labels' => [ 'name' => 'Услуги', 'singular_name' => 'Услуга', 'add_new' => 'Добавить услугу', 'add_new_item' => 'Добавление услуги', 'edit_item' => 'Редактирование услуги', 'new_item' => 'Новая услуга', 'view_item' => 'Смотреть услугу', 'search_items' => 'Искать услугу', 'not_found' => 'Не найдено', 'not_found_in_trash' => 'Не найдено в корзине', 'parent_item_colon' => '', 'menu_name' => 'Список услуг', ], 'description' => '', 'public' => true, // 'publicly_queryable' => null, // 'exclude_from_search' => null, // 'show_ui' => null, // 'show_in_nav_menus' => null, 'show_in_menu' => true, // 'show_in_admin_bar' => null, 'show_in_rest' => null, 'rest_base' => null, 'menu_position' => null, 'menu_icon' => null, //'capability_type' => 'post', //'capabilities' => 'post', //'map_meta_cap' => null, 'hierarchical' => false, 'supports' => ['title', 'custom-fields', 'page-attributes'], // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats' 'taxonomies' => [], 'has_archive' => false, 'rewrite' => array('slug' => '/', 'with_front' => false), 'query_var' => true, ]); }

    Т.е. убирая данный cpt - записи, и рубрики начинают работать нормально, отдаётся верный шаблон Подозреваю, что проблема в rewrite правилах. Буду разбираться дальше.

  • YaMariya,

    'rewrite' => array('slug' => '/', 'with_front' => false),

    Попробуйте так:

    'rewrite' => array('slug' => 'services', 'with_front' => false),

    'rewrite' => array('slug' => 'services', 'with_front' => false),

  • Михаил Р., спасибо, Михаил за ответы! Так действительно работает, но добавляется /services/ в url. Это логично, но неправильно по тз. URL должен быть вида site.ru/services-name. Я нашла несколько вариантов решения этой задачи, буду пробовать. Ещё раз спасибо за ответы :)
  • YaMariya, не за что. Url site.ru/services-name без явного указания пути (site.ru/service/service-name) опасное решение из за риска конфликта с другими типами записей. Напишите, к чем в итоге пришли.
  • Михаил Р., да, про вероятность конфликта cpt и записей/страниц я знаю. Предложила заказчику вынести услуги из cpt в обычные страницы с указанием соответствующего шаблона. Т.к. услуг всего 6шт (и в перспективе не больше 10), а обычных записей больше 100 - это кажется логичным решением с учетом требований по url.

    Заказчику вобщем-то эти подробности не важны (а по структуре url - требование seo-специалиста), он пришел с проблемой сломавшегося сайта после другого специалиста. Так что, думаю, возражений не будет.

  • YaMariya, значит, как варианты:
    1. Хранить некоторый список слагов в txt файле, чтобы не создать запись с аналогичным слагом :)
    2. Писать код плагина, который будет иметь свою админку, где перечислить список слагов, которые нельзя будет указать при сохранение записей (или хук wp_insert_post_data, или js код на странице записи).
  • 404 ошибка при переходе на страницу рубрик?

    Проблема 404 была при указание rewrite в cpt:

    'rewrite' => array('slug' => '/', 'with_front' => false),

    Проблема 404 была решена так:

    'rewrite' => array('slug' => 'services', 'with_front' => false),

    'rewrite' => array('slug' => 'services', 'with_front' => false),

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Редакция по БД Ответ

    Если при структуре /%category%/%postname%/ появляется 404 и у записей, и у рубрик, чаще всего проблема в конфликте rewrite rules, самописной теме или неправильной регистрации rewrite. Настройка permalink сама по себе рабочая, но она чувствительна к slug страниц, рубрик и кастомных правил.

    Что проверить первым делом:

    • пересохраните “Настройки → Постоянные ссылки” без изменения;
    • убедитесь, что файл .htaccess доступен на запись и содержит стандартные правила WordPress;
    • проверьте, нет ли страницы со slug news, которая конфликтует с рубрикой news;
    • проверьте, не регистрирует ли тема свои rewrite rules;
    • отключите кастомные query_vars/rewrite_rule временно для проверки.

    Стандартный .htaccess для Apache:

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteBase /
    RewriteRule ^index.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress

    # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress

    Если сайт на Nginx, .htaccess не работает, нужны правила в конфиге Nginx:

    try_files $uri $uri/ /index.php?$args;

    try_files $uri $uri/ /index.php?$args;

    Также проверьте, не удалён ли base рубрик через плагин или код. Удаление /category/ может давать конфликты, особенно если есть страницы и рубрики с одинаковыми slug.

    Итог: начните с flush rewrite, стандартных правил веб-сервера и проверки конфликтов slug. Если тема самописная, ищите в ней add_rewrite_rule, register_post_type, register_taxonomy и фильтры permalink.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно