Вопрос или проблема
У меня есть серьезная проблема с 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 ошибками и обеспечить более интуитивно понятное взаимодействие для пользователей вашего сайта.