Пропали с сайта Рубрики и Записи – 404 ошибка. В админке они есть

Пропали с сайта Рубрики и Записи – 404 ошибка. В админке они есть, при переходе из админки – из URL рубрика пропадает и тоже 404 ошибка

У меня причина была в Polylang

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

Важно понимать:

Polylang скрывает всё, у чего не назначен язык

Посмотрите поэтому свои рубрики!!! Возможно слетел язык с рубрики

У меня в общем была вот такая проблема:

сайт переносился через Duplicator. При переносе Polylang хранил языки рубрик в виде скрытых связей в базе. Связи эти «поплыли», записи подцепились нормально (en: 20, ru: 30), а рубрики – остались висеть в воздухе.

Polylang, скорее всего, был отключён

И он, как строгий вахтёр, начал проверять у каждой рубрики документ – А какой у тебя язык?.

Документа нет – рубрика прячется – ссылки ломаются – 404 на всех страницах, где хоть как-то замешана рубрика.

Код pll_set_term_language () — это как сказать вахтёру – Вот, впиши всем, кому не вписано, русский или английский, по алфавиту.
И он вписал. Вахтёр успокоился, рубрики вышли из тени, ссылки восстановились.

Решение:

Добавьте в functions.php (Polylang должен быть включён)
Сохраните functions.php
Обновите главную страницу сайта
Сразу удалите этот код из functions.php
Зайдите в Настройки – Постоянные ссылки – Сохранить
Откройте список рубрик -теперь в колонке Languages должны появиться флажки
Проверьте рубрику и запись на сайте

add_action( 'init', 'fix_category_languages', 999 );
function fix_category_languages() {
    if ( ! function_exists( 'pll_set_term_language' ) ) return;

    $cats = get_categories( array( 'hide_empty' => false ) );

    foreach ( $cats as $cat ) {
        $current = pll_get_term_language( $cat->term_id );

        // Назначаем язык ТОЛЬКО рубрикам без языка
        if ( ! $current ) {
            $lang = ( preg_match( '/[а-яА-ЯёЁ]/u', $cat->name ) || $cat->slug === 'ru' ) ? 'ru' : 'en';
            pll_set_term_language( $cat->term_id, $lang );
            error_log( 'Assigned ' . $lang . ' to: ' . $cat->name );
        }
    }
    error_log( '=== CATEGORY LANGUAGES FIXED ===' );
}

Если когда-нибудь снова будете переносить сайт с Polylang – перед бэкапом зайдите в Polylang – Settings и выгрузите настройки, либо просто сделайте полный дамп БД через phpMyAdmin, а не через Duplicator – у него с мультиязычными плагинами вечная нелюбовь.

guest
Закрыть меню