Я гуглил это как сумасшедший, но не могу найти не слишком устаревший ответ на этот вопрос или что-то, что действительно работает.
Моя проблема такая же, как та, которую этот парень описывает в этом сообщении на форуме (из 4, святой ЧЕТВЕРТЫЙ много лет назад!):
https://wordpress.org/support/topic/duplicate-subcategory-slug-problem
В настоящее время я использую последнюю версию WordPress 4.1, и я пытаюсь добиться этого:
Допустим, у меня есть 2 категории на моем сайте, которые называются ботинки а также обувь.
Внутри них я хочу сделать категорию с именем красный. Вот так будет выглядеть моя структура категорий:
- Boots // -> URL: http://example.com/boots
| ----- Red // -> URL: http://example.com/boots/red (GREAT!)
- Shoes // -> URL: http://example.com/shoes
| ----- Red // -> URL: http://example.com/shoes/red-shoes (cmon, wp, nooo !)
Когда то, что я хотел бы достичь, это:
- Boots // -> URL: http://example.com/boots
| ----- Red // -> URL: http://example.com/boots/red
- Shoes // -> URL: http://example.com/shoes
| ----- Red // -> URL: http://example.com/shoes/red
Этот путь был бы идеальным !!!
Если вам интересно, да, я знаю, что это только часть WordPress, и они не хотят, чтобы это изменилось, я понимаю, почему и весь этот джаз, да.
Но для этого конкретного проекта мне это действительно нужно.
Я думаю, мне, вероятно, придется изменить ядро, не имея возможности обновить WordPress, если я это сделаю, я знаю, но у меня нет проблем с этим, если мне это нужно.
Но если есть другой способ создать эту иерархию, которая не включает категории и не нарушает мои URI, я тоже могу попробовать это. Любая помощь или совет приветствуется, ребята, большое спасибо!
Если ваша структура подкатегории не идет глубже, чем shoes/red
(не shoes/red/hiking
например), вы можете использовать конечные точки постоянных ссылок моделировать категории. Конечные точки постоянных ссылок переписаны с domain.com/request/url/?endpoint
,
После того, как каждый цвет или аналог устанавливается в качестве конечной точки EP_CATEGORY
URL-адреса категорий могут быть дополнены /red
, /blue
и так далее. Применение конечных точек к EP_ALL_ARCHIVES
позволяет конечные точки в архивах CPT и даты тоже.
Затем в фильтре или действии, таком как template_include
Вы можете прочитать добавленную конечную точку, используя глобальную $wp_query
объект и фильтровать элементы категории соответственно.
Если пользователь вводит другой суффикс к URL (например, /red/hiking
), $wp_query
распознает их как пару ключ / значение как red => hiking
(?red=hiking
в виде необработанной строки запроса) в переменных запроса ($wp_query -> get( 'red' );
возвращается hiking
). Это может быть хорошо или плохо в зависимости от того, как вы реализуете логику.
После добавления конечных точек с постоянными ссылками необходимо сбросить правила перезаписи вашей установки, используя функцию flush_rewrite_rules()
или зайдя в раздел управления постоянными ссылками админ-панели и нажав один раз обновить.
Примечание. Вы не можете использовать динамические имена для конечных точек. Вам необходимо определить статическую конечную точку для каждого варианта (красный, синий и т. Д.).
У меня была такая же проблема с моими таксономиями, и я только что исправил ее, надеюсь, это поможет.
Во-первых, у вас есть таксономии ваших родителей, и когда вы создаете детей, вы должны быть уверены, что родительский слаг добавлен в слаг подкатегории. В вашем примере это будет выглядеть так:
Это должно иметь уникальный слаг для каждой подкатегории.
Теперь важная вещь, правила переписывания и ссылки таксономии:
Когда вы определяете таксономию, вы должны сделать это следующим образом:
register_taxonomy('mytaxonomy',array('mycustompost'), array(
'hierarchical' => true,
'sort' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array(
'slug' => '/%parent%'
)
));
Кроме того, вы должны изменить постоянные ссылки, чтобы они имели необходимую вам структуру, если это пользовательская таксономия (как в моем случае), вы делаете это с помощью фильтра term_link. Моя функция выглядит так:
function mytaxonomy_link( $permalink, $term, $taxonomy )
{
if ( $taxonomy !== 'mytaxonomy' && false === strpos( $permalink, '%parent%' ) )
return $permalink;
$temp_padre = $term->parent;
$padre = get_term_by('id', $temp_padre, 'mytaxonomy');$cat_name = 'general';
if(isset($padre) && !empty($padre))
{
$cat_name = $padre->slug;
$termslug = $term->slug;
$new_slug = str_replace( $cat_name , '' , $termslug);
$new_slug = ltrim($new_slug, '-');
$permalink = str_replace( '%parent%' , $cat_name , $permalink );
$permalink = str_replace( $termslug , $new_slug , $permalink );
}
return $permalink;
}
add_filter( 'term_link', 'mytaxonomy_link', 10, 3 );
Эта функция преобразует ссылку подкатегории в: http://example.com/boots/red
И переписать правило, которое делает все волшебство:
add_rewrite_rule('([^/]+)/([^/]+)/?$', 'index.php?mytaxonomy=$matches[1]-$matches[2]','top');
add_rewrite_rule('([^/]+)/([^/]+)', 'index.php?mytaxonomy=$matches[1]-$matches[2]','top');
В моем случае мои отношения между постами и таксономиями были намного сложнее, но я думаю, что это решение поможет вам.
Надеюсь, это поможет, потому что я действительно ужасно пытался найти решение этой проблемы.