конфликт URL между настраиваемой таксономией и настраиваемым типом записи

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

У меня есть серьезная проблема с URL.

Существует пользовательский тип записи новости. Его ярлык news.

Ярлык таксономии новостей: news_category

URL таксономии новостей: http://domain.com/news_category/press-release

Я хочу изменить URL news_category на news.

Таким образом, URL таксономии новостей будет:

             http://domain.com/news/press-release

Я пытался изменить ярлык news_category на news, но это создает конфликт. Новости показывают URL новостей, но все записи типа записи новостей возвращают 404 не найдено

URL записи новостей:

     http://domain.com/news/POST_TITLE

Так как URL записей также содержит ярлык новостей, оба конфликта. Появляется ошибка 404.

Возможно ли это исправить? Как я могу это исправить?

Буду очень признателен за любую помощь.

Попробуйте этот код. Возможно, он вам поможет.

 class Tax_Seo_Perma {

  public function __construct() {
    // Хуки
    add_filter('rewrite_rules_array',array($this, 'create_rewrite_rules'));
    add_filter('wp_loaded', array($this, 'flush_rules'));
    add_filter('post_link', array($this, 'modify_link_addresses'), 10, 3);
    //add_filter('post_type_link', 'tsp_write_link_addresses', 10, 3);
}

public function flush_rules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules(); 
}

public function create_rewrite_rules($rewrite) {
    global $wp_rewrite;

    // Проходим по пользовательским таксономиям
    $args = array(
        'public'   => true,
        '_builtin' => false 
    );
    $output="names"; // или объекты
    $operator="and"; // 'and' или 'or'
    $custom_taxonomies  = get_taxonomies($args, $output, $operator); 
    if ($custom_taxonomies) {
        foreach ($custom_taxonomies as $tax_name ) {
            $tax_token = '%'.$tax_name.'%';
            $wp_rewrite->add_rewrite_tag($tax_token, '(.+)', $tax_name.'=');
        }
    }

    // Читаем текущую структуру постоянных ссылок и устанавливаем ту же структуру
    $keywords_rewrite = $wp_rewrite->generate_rewrite_rules($wp_rewrite->root.$wp_rewrite->permalink_structure);
    return ( $rewrite + $keywords_rewrite );
}

public function modify_link_addresses($permalink, $post_id, $leavename)
{
    global $blog_id;
    global $wp_rewrite;
    // это структура постоянных ссылок пользователя, установленная в настройках
    $permastruct = $wp_rewrite->permalink_structure;

    $args = array(
        'public'   => true,
        '_builtin' => false 
    );
    $output="names"; // или объекты
    $operator="and"; // 'and' или 'or'
    $custom_taxonomies  = get_taxonomies($args, $output, $operator);

    if ($custom_taxonomies) {
        foreach ($custom_taxonomies as $tax_name ) {
            $tax_token = '%'.$tax_name.'%';

            $tax_terms = get_the_terms( $post->id, $tax_name );
            //var_dump($tax_terms);
            if ( !empty($tax_terms) )
            {
                foreach($tax_terms as $a_term)
                {
                    $long_slug = $a_term->slug;
                    if( false != (int)$a_term->parent ) { // родитель a существует
                        $p_term = get_term( (int)$a_term->parent, $tax_name );//var_dump($p_term->slug);
                        $long_slug = ($p_term->slug) ? $p_term->slug .'+'. $long_slug : $long_slug;
                    } 
                    if( false != (int)$a_term->parent AND false != (int)$p_term->parent ) { // родитель p существует
                        $g_term = get_term( (int)$p_term->parent, $tax_name );
                        $long_slug = ($g_term->slug) ? $g_term->slug .'+'. $long_slug : $long_slug;
                    }

                    $permalink = str_replace($tax_token, $long_slug, $permalink);
                    break;
                }
            } else {$permalink = str_replace($tax_token, 'no-'.$tax_name, $permalink); }
        }
    }

    return $permalink;
 }
 }

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

Проблема конфликта URL-адресов между пользовательским типом записи и пользовательской таксономией — это распространённая задача, с которой сталкиваются разработчики WordPress. В вашем случае конфликт возникает из-за того, что вы хотите использовать один и тот же слуг (slug) "news" для пользовательского типа записи "news" и для пользовательской таксономии "news_category".

Природа конфликта

Ваша ситуация заключается в следующем:

  • У вас есть пользовательский тип записи (CPT) с именем "news", который использует слуг "news".
  • У вас есть пользовательская таксономия с именем "news_category", которая изначально имеет слуг "news_category", но вы хотите изменить её на "news".
  • Когда вы пытаетесь сделать это изменение, WordPress не может правильно обработать запрос, так как не знает, к какому объекту (CPT или таксономии) относится данный URL. Это приводит к ошибке 404.

Решение проблемы

Чтобы избежать конфликта и корректно настроить URL-адреса таксономии и пользовательского типа записи, вы можете рассмотреть несколько подходов:

1. Изменение структуры URL

Измените слуг таксономии на что-то более уникальное, например, используйте "news-category" вместо "news_category". Это позволит избежать конфликтов, так как URL будет выглядеть так:

  • Для новостей: http://domain.com/news/POST_TITLE
  • Для таксономии: http://domain.com/news-category/press-release

2. Использование Rewrite Rules

Если вы настаиваете на использовании слова "news" для обеих сущностей, вам нужно будет придумать, как отобразить их различия в URL. Используйте функции для переписывания правил. Ваш предложенный код содержит подходящие фильтры и хуки.

class Tax_Seo_Perma {

    public function __construct() {
        // Хуки
        add_filter('rewrite_rules_array', array($this, 'create_rewrite_rules'));
        add_filter('wp_loaded', array($this, 'flush_rules'));
    }

    public function flush_rules(){
        global $wp_rewrite;
        $wp_rewrite->flush_rules(); 
    }

    public function create_rewrite_rules($rewrite) {
        global $wp_rewrite;

        // Добавляет таксономические правила переписывания
        $rewrite['news/(.+)$'] = 'index.php?news=$matches[1]'; 
        return $rewrite;
    }
}

Этот код поможет создать более четкие правила для обработки URL, что может помочь в ситуации с конфликтом слуг.

3. Переписывание URL с помощью плагинов

Используйте плагины для управления переопределением и структурой URL, например, "Custom Post Type UI" или "Permalink Manager Lite". Эти инструменты могут облегчить процесс создания уникальных и приемлемых URL для ваших сущностей без необходимости вмешательства в код.

Заключение

Хотя вы можете изменить слуг таксономии на "news", лучше всего выбрать уникальный слуг, чтобы избежать конфликтов памяти и ошибок 404. Подходы к переписыванию URL-адресов, такие как использование кода для управления правилами или использование плагинов, могут помочь вам в управлении URL-адресами для ваших пользовательских типов записи и таксономий. Обеспечивая правильную настройку, вы сможете избежать проблем с 404 ошибками и обеспечить более интуитивно понятное взаимодействие для пользователей вашего сайта.

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

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