Фильтрация категорий в структуре постоянных ссылок
Используя /%category%/%postname%/
для постоянной ссылки, я получаю строку URL-адреса всех категорий, в которые включена конкретная публикация.
Я бы хотел, чтобы категории в URL-адресе были отфильтрованы только до одной ветви структуры категорий и начинались не с корневой родительской категории.
У меня есть блог о путешествиях, и у меня есть такая структура категорий:
места "Название страны " Название региона "Название города
бывший: www.mytravelblog.com/places/indonesia/java/jakarta/myPostName/
Я хотел бы пропустить корневую категорию в URL-адресе или даже просто использовать самого маленького ребенка
пример: www.mytravelblog.com/jakarta/myPostName
Возможно ли это? (WP 3.0.1)
3 answers
Это должно быть возможно. Во-первых, вам повезло, что www.mytravelblog.com/jakarta/myPostName/
уже работает, он показывает вам сообщение и не перенаправляет вас на более длинную версию (по крайней мере, кажется, что это работает на моей стороне). Это означает, что вам нужно работать только с сгенерированной ссылкой и не вмешиваться в то, как обрабатываются или "канонизируются" входящие URL-адреса.
Результат get_permalink()
, который вы хотите изменить, фильтруется через post_link
. Так что вы, вероятно, можете сделать что-то вроде этого:
add_filter( 'post_link', 'remove_parent_cats_from_link', 10, 3 );
function remove_parent_cats_from_link( $permalink, $post, $leavename )
{
$cats = get_the_category( $post->ID );
if ( $cats ) {
// Make sure we use the same start cat as the permalink generator
usort( $cats, '_usort_terms_by_ID' ); // order by ID
$category = $cats[0]->slug;
if ( $parent = $cats[0]->parent ) {
// If there are parent categories, collect them and replace them in the link
$parentcats = get_category_parents( $parent, false, '/', true );
// str_replace() is not the best solution if you can have duplicates:
// myexamplesite.com/luxemburg/luxemburg/ will be stripped down to myexamplesite.com/
// But if you don't expect that, it should work
$permalink = str_replace( $parentcats, '', $permalink );
}
}
return $permalink;
}
Я думал, что просто прокомментирую это, но тогда это было бы слишком маленькое место, чтобы уточнять детали.
Ответ, опубликованный Яном Фабри, отлично работает! Однако недостатком этого является то, что он даже указал в комментариях, что если у вас есть URL, такой как http://example.com/sports/world-sports/permalink , он будет сокращен до http://example.com/world-permalink , что фактически приведет к 404.
Чтобы избежать этого, вы можете добавить
$parentcats = '/' . $parentcats;
Так что все должно быть так
$parentcats = '/'. $parentcats;
$permalink = str_replace( $parentcats, '/', $permalink );
Это приведет только к удалению /спорта/, а не /мирового спорта/
Надеюсь, это кому-то поможет!
Что вы делаете, если у вас одинаковые названия районов/городов в разных регионах/странах?
Другой способ - сохранить ссылку, но работать с содержимым страницы, в зависимости от категорий. Вы могли бы использовать это:
<?php
foreach((get_the_category()) as $childcat)
{
if (cat_is_ancestor_of($my_cat_id, $childcat))
{
echo $child = $childcat->cat_name;
//echo $parent = $childcat->category_parent;
}
}
?>