Пользовательская таксономия переписывания в постоянных ссылках для постов вызывает ошибку 404 на страницах.

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

Итак, у меня есть пользовательская таксономия (называемая “версия”) только для постов, которая работает нормально.. Моя проблема в том, что я хочу использовать эту таксономию в своих постоянных ссылках, например URL.com/12-3/cat/имянпоста.. это тоже работает нормально для постов, когда я использую /%version%/%category%/%postname%/ для постоянных ссылок.

НО теперь каждая страница выдает мне ошибку 404.. (например, URL.com/test -> 404). Если я удаляю /%version%, это работает нормально.. но только для страниц.. но мне нужна таксономия версии в URL для постов.. Код ниже используется для слагов таксономии в постоянных ссылках:

add_filter('post_link', 'version_permalink', 10, 3);
function version_permalink($permalink, $post_id, $leavename) {
    if (strpos($permalink, '%version%') === FALSE) {
        return $permalink;
    } else {

        // Получаем пост
        $post = get_post($post_id);
        if (!$post || 'page' === $post->post_type) return $permalink;

        // Получаем термины таксономии
        $terms = wp_get_object_terms($post->ID, 'version');
        if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) {
            $taxonomy_slug = $terms[0]->slug;
        } else { $taxonomy_slug = 'no-version'; }

        return str_replace('%version%', $taxonomy_slug, $permalink);
    }
}

Я думаю, я сделал какую-то глупую ошибку, о которой не догадываюсь.. Когда я посмотрел на var_dump($wp); он показывает мне, например (для URL.com/impressum):

["query_vars"]=>
  array(1) {
    ["version"]=>
    string(9) "impressum"
  }
  ["query_string"]=>
  string(17) "version=impressum"
  ["request"]=>
  string(9) "impressum"
  ["matched_rule"]=>
  string(10) "([^/]+)/?$"
  ["matched_query"]=>
  string(17) "version=impressum"
  ["did_permalink"]=>
  bool(true)

так что этот “version” зарегистрирован только для постов, а не для страниц, но всё равно ищет его… У меня нет понятия, как это решить, любая помощь или дополнительные идеи будут очень признательны 🙂

для информации: пользовательская таксономия:

add_action('init', 'version_init');
function version_init() {
    if (!is_taxonomy('version')) {
        $labels = array(
            'name'                       => __( 'Версии'),
            'singular_name'              => __( 'Версия'),
            'search_items'               => __( 'Поиск версий' ),
            'popular_items'              => __( 'Популярные версии' ),
            'all_items'                  => __( 'Все версии' ),
            'parent_item'                => null,
            'parent_item_colon'          => null,
            'edit_item'                  => __( 'Редактировать версию' ),
            'update_item'                => __( 'Обновить версию' ),
            'add_new_item'               => __( 'Добавить новую версию' ),
            'new_item_name'              => __( 'Новое имя версии' ),
            'add_or_remove_items'        => __( 'Добавить или удалить версию' ),
            'choose_from_most_used'      => __( 'Выбрать из самых популярных версий' ),
            'not_found'                  => __( 'Версии не найдены.' ),
            'menu_name'                  => __( 'Версии' ),
        );
        $rewrite = array(
            'slug'                       => '',
            'with_front'                 => false,
            'hierarchical'               => false,
        );
        register_taxonomy( 'version', 'post',
                          array(
                              'hierarchical' => TRUE,
                              'labels' => $labels,
                              'public' => TRUE,
                              'show_ui' => TRUE,
                              'show_admin_column' => TRUE,
                              'update_count_callback' => '_update_post_term_count',
                              'query_var' => 'version',
                              'rewrite' => $rewrite
                          )
                         );
    }
}

Хорошо, теперь у меня это работает.. Думаю, это не совсем аккуратно, но для меня это сработало..

Сначала я исправил отсутствующий slug в $rewrite для register_taxonomy, но это не была настоящая проблема..

  1. Поскольку мне нужно значение динамически в первую очередь, я создал пустую родительскую страницу для страниц, которые я хотел показать, и поместил их туда. Я назвал её content. (Ну, я мог просто вручную изменить постоянную ссылку, но.. я не сделал этого)
  2. Теперь добавил новое правило перезаписи, чтобы страницы использовали правильную строку запроса.

.

function funny_unicorn_rewrite_rules() {
    add_rewrite_rule(
        '^content/([^/]*)/?$', // используйте "content" как префикс для идентификации моих страниц
        'index.php?pagename=content%2F$matches[1]', // исправьте строку запроса
        'top'
    );
}
add_action('init','funny_unicorn_rewrite_rules');

Чтобы это заработало, мне нужно было вернуть родительскую страницу в строку с content%2F прямо перед $matches[1].

И, конечно, я очистил правила перезаписи после внесения изменений..

Так что остается только тот факт, что это не будет работать с WPML.. когда у меня будет решение и для этого, я обновлю этот пост!

С уважением

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

Решение проблемы 404 ошибок для страниц при использовании кастомной таксономии в WordPress

Создание кастомной таксономии в WordPress и её интеграция в структуру постоянных ссылок — задача, которая может вызвать некоторые сложности, особенно если вы также работаете со страницами. Рассмотрим вашу проблему в деталях и предложим потенциальные решения.

Суть проблемы

Вы создали кастомную таксономию (версии) для постов и настроили структуру постоянных ссылок с использованием %version%. При этом возникла проблема: страницы на вашем сайте начали выдавать 404 ошибки. Удаление %version% решает эту проблему, но это не устраивает вас, так как вы хотите сохранить эту часть в адресах ваших постов.

Анализ кода

Ваш код, отвечающий за пермалинки, проверяет, является ли тип поста «page», чтобы избегать применения кастомной таксономии к страницам. Однако все равно страницы попадают в запросы, что приводит к ошибке 404.

if (!$post || 'page' === $post->post_type) return $permalink;

Этот участок кода справедливо исключает страницы, но не решает основную проблему — страницы остаются в процессе обработки URL.

Рекомендации по устранению и оптимизации

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

    $rewrite = array(
        'slug' => 'version', // Укажите правильный slug
        'with_front' => false,
        'hierarchical' => false,
    );
  2. Добавление правил переписывания:
    Для того чтобы страницы не конфликтовали с вашими кастомными URL для постов, вы можете добавить дополнительные правила переписывания. Как вы сделали это с родительской страницей content, вы можете создать уникальное правило:

    function custom_rewrite_rules() {
        add_rewrite_rule(
            '^content/([^/]*)/?$',
            'index.php?pagename=content&version=$matches[1]',
            'top'
        );
    }
    add_action('init', 'custom_rewrite_rules');

    Это поможет WordPress правильно обрабатывать запросы к страницам, которые начинаются с content, и вести к верному содержимому.

  3. Очистка правил переписывания:
    После внесения изменений в правила переписывания необходимо очистить кэш, чтобы новые правила вступили в силу. Это можно сделать через панель администратора или программно:

    flush_rewrite_rules();
  4. Учет WPML:
    Если вы планируете использовать WPML для многоязычного контента, следует удостовериться, что ваши кастомные структуры URL совместимы с WPML. В этом случае, возможно, понадобится доработка его интеграции с кастомными таксономиями и правилами переписывания.

Вывод

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

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

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