Фильтрация категорий в структуре постоянных ссылок


Используя /%category%/%postname%/ для постоянной ссылки, я получаю строку URL-адреса всех категорий, в которые включена конкретная публикация. Я бы хотел, чтобы категории в URL-адресе были отфильтрованы только до одной ветви структуры категорий и начинались не с корневой родительской категории.

У меня есть блог о путешествиях, и у меня есть такая структура категорий:
места "Название страны " Название региона "Название города
бывший: www.mytravelblog.com/places/indonesia/java/jakarta/myPostName/

Я хотел бы пропустить корневую категорию в URL-адресе или даже просто использовать самого маленького ребенка
пример: www.mytravelblog.com/jakarta/myPostName

Возможно ли это? (WP 3.0.1)

Author: Jan Fabry, 2010-11-15

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;
}
 4
Author: Jan Fabry, 2010-11-15 18:47:06

Я думал, что просто прокомментирую это, но тогда это было бы слишком маленькое место, чтобы уточнять детали.

Ответ, опубликованный Яном Фабри, отлично работает! Однако недостатком этого является то, что он даже указал в комментариях, что если у вас есть URL, такой как http://example.com/sports/world-sports/permalink , он будет сокращен до http://example.com/world-permalink , что фактически приведет к 404.

Чтобы избежать этого, вы можете добавить

$parentcats = '/' . $parentcats;

Так что все должно быть так

$parentcats = '/'. $parentcats;
$permalink = str_replace( $parentcats, '/', $permalink );

Это приведет только к удалению /спорта/, а не /мирового спорта/

Надеюсь, это кому-то поможет!

 0
Author: Patrick S, 2016-05-30 09:47:29

Что вы делаете, если у вас одинаковые названия районов/городов в разных регионах/странах?

Другой способ - сохранить ссылку, но работать с содержимым страницы, в зависимости от категорий. Вы могли бы использовать это:

<?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;
  }
} 
?>
 -1
Author: conualfy, 2010-11-15 19:16:48