• 解決済 yukikaze

    (@yukikaze)


    階層カテゴリーの短縮(一番下のカテゴリーを非)表示にしたくて、

    パーマリンク設定にて、カスタム構造で、
    [ドメイン]/%category%/id-%post_id%/
    としました。

    カテゴリーは
    AAA
    -BBB
    –CCC
    と階層になっています。

    記事をカテゴリー[CCC]選択し書くと、
    URLは [ドメイン]/AAA/BBB/CCC/id-記事番号/
    となります。

    そこで、
    [ドメイン]/AAA/BBB/id-記事番号//
    としたくて、下記の記事を参照し、テーマのfunctions.phpに記述しました。
    http://hacknote.jp/archives/14172/

    上記サイトのコードを書くと、
    記事URLが
    [ドメイン]/AAA/記事名/
    例えば「テスト」というタイトルの場合
    [ドメイン]/AAA/テスト/
    となってしまいました。

    コードは親のみの表示ということですので、正しいと思いますが、
    [ドメイン]/AAA/BBB/id-記事番号/
    とするには、どんなコードにすれば良いでしょうか。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • CG

    (@du-bist-der-lenz)

    参照記事は、親カテゴリーのみを表示する目的だから、条件分岐で、その点だけを判定しています。

    トピック投稿者 yukikaze

    (@yukikaze)

    add_filter( 'category_link', 'permalink_change_category', 10, 3 );
    function permalink_change_category( $permalink, $post ) {
     
        // パーマリンクにnetshopという文字列が含まれる場合、その部分を削除してURLをフラット化
        if( strpos($permalink, 'CCC/') )
        {
            $permalink = str_replace(array("CCC/"), '', $permalink);
        }
     
        return $permalink;
    }

    これでやってみましたが、できませんでした。
    どこがおかしいのか…

    LABE

    (@latobeam)

    フィルター category_link の引数は二つですが、 add_filter() の第4引数(フックする関数がとる引数の数)が3になっていますね。
    ところで、フィルター category_link はWordPress 2.5より非推奨となっているようです。
    これからは term_link を使いましょう。

    add_filter( 'term_link', 'permalink_change_category', 10, 3 );
    function permalink_change_category( $termlink, $term, $taxonomy ) {
        // 省略
    }

    引数が少し変わっています。

    トピック投稿者 yukikaze

    (@yukikaze)

    LABE 様

    ご指摘ありがとうございます。

    変更したソースをfunctions.phpに貼り、
    ドメイン/bbb/ccc/id-[記事番号]/ にアクセスしたところ、何もURLに変化はありませんでした。

    LABE

    (@latobeam)

    すみません、勘違いでした。
    category_linkterm_link も、カテゴリアーカイブページのURLを変更するフィルターです。

    パーマリンクを変更するフィルターは post_link です。

    add_filter( 'post_link', 'permalink_change_category' );
    function permalink_change_category( $permalink ) {
        // 省略
    }
    トピック投稿者 yukikaze

    (@yukikaze)

    動かなかったので別の方法で試してみました。
    コードは汚いですが…

    //非表示にするフィルタフック
    add_filter( 'post_link', 'remove_children_category_slug', 10, 3 );
    function remove_children_category_slug( $permalink, $post, $leavename ){
    //カテゴリーのIDを取得
    $cats = get_the_category( $post->ID );
    if ( $cats ) {
    //ID順にソート
    usort( $cats, '_usort_terms_by_ID' );
    foreach( $cats as $cat ) {
    //親カテゴリーが存在するかチェック
    if ( $cat->parent ) {
    $parentcategory = explode(" ",get_category_parents( $cat, false, ' ', true ));
    //配列から最上位のカテゴリーを取得
    $parentcat = $parentcategory[0];
    //配列から2階層目のカテゴリーを取得
    $parentcat2 = $parentcategory[1];
    } else {
    //親がない場合はそのままスラッグを取得
    $parentcat = $cat->slug;
    }
    }
    }
    //管理画面で設定したパーマリンクの設定に合わせる
    $permalink = home_url()."/".$parentcat."/".$parentcat2."/"."id-".$post->ID.'/';
    return $permalink;
    }
    トピック投稿者 yukikaze

    (@yukikaze)

    LABE 様

    助言いただき感謝いたします。

    ご提案いただきました

    add_filter( 'post_link', 'permalink_change_category' );
    function permalink_change_category( $permalink ) {
        // 省略
    }

    の方法で試してみましたが、やはり文字列削除はURLに反映されませんでした。

    仕方なく、

    add_filter( 'post_link', 'remove_children_category_slug', 10, 3 );
    function remove_children_category_slug( $permalink, $post, $leavename ){
        // 省略
    }

    この方法を試したところ動きました。

    しかし、

    //配列から最上位のカテゴリーを取得
    $parentcat = $parentcategory[0];
    //配列から2階層目のカテゴリーを取得
    $parentcat2 = $parentcategory[1];
    $permalink = home_url()."/".$parentcat."/".$parentcat2."/"."id-".$post->ID.'/';
    return $permalink;

    この部分の書き方が正しいのか理解不足で不安です。

    本題の解決とはそれてしまう旨もうしわけございませんが、希望の記述に関して、そもそも記事をカテゴリBBBにて作成すれば実現すると思うのですがCCCにする必要性はどのようなものでしょうか。
    CCCの記事はBBBと同階層になる可能性や、BBB階層下にDDDが出来た場合の動作はまた特別なものなのでしょうか。

    トピック投稿者 yukikaze

    (@yukikaze)

    msio 様

    サービスのマニュアルとFAQ作成に利用で考えています。

    例えば、下記のようにカテゴリーを作成し、各記事はカテゴリーを全て含めると長いURLとなってしまうため、
    [ドメイン]
    ヘルプ(help)
    – マニュアル(manual)
     – 基本設定(basic_settings)
     – 高度な設定(advanced_settings)
      — 独自ドメイン(original_domain)
      — テンプレート(template)
    – FAQ
     – 概要
     – 基本設定
     – 高度な設定
      — 独自ドメイン
      — テンプレート

    【要件】
    1.それぞれのカテゴリー毎に一覧表示をさせる
    2.各記事は親子カテゴリーまでのURLとする
    としたいのです。

    【URL例】
    カテゴリー毎の記事一覧
    [ドメイン]/help/
    [ドメイン]/help/manual/
    [ドメイン]/help/manual/advanced_settings/
    [ドメイン]/help/manual/advanced_settings/original_domain/

    各記事
    [ドメイン]/help/manual/id-[記事番号]/

    なるほどわかりました。
    タグか記事名で最下層を構成するのもよいのではないかと思いましたものでお取り組みに水をさすような無礼もうしわけございませんでした。

    LABE

    (@latobeam)

    この投稿のコードを見て、以下の点が気になりました。

    1. $parentcatforeach ループの最後の1回で上書きされ、処理に無駄がある。
    2. $parentcat2 を取得しない(できない)場合にも最後に $permalink に代入しようとしている。

    1. については、どれか一つのカテゴリを reset() などで抽出して使用するのが普通ですが、どの「一つ」を使用するかを決めるためにソートする必要はあります。

    if ( $cats ) {
        usort( $cats );
        $cat = reset( $cats );
        if ( $cat->parent ) {

    2. については、 get_category_parents() では最後のカテゴリの後ろにも区切り文字を付ける仕様なので、祖先のカテゴリが1階層しかなくても $parentcat2 が取得されますが、中身は空文字列になってしまいます。
    よって empty() などでチェックする必要があります。

    以上を踏まえて、以下のコードでいかがでしょうか。

    add_filter( 'post_link', 'remove_children_category_slug', 10, 3 );
    function remove_children_category_slug( $permalink, $post, $leavename ) {
        //カテゴリーのIDを取得
        $cats = get_the_category( $post );
        if ( ! $cats )
            return $permalink;
        //ID順にソート
        usort( $cats, '_usort_terms_by_ID' );
        //一つだけ取り出す
        $cat = reset( $cats );
        //親がない場合はそのまま
        if ( empty( $cat->parent ) )
            return $permalink;
        $parentcats = explode( ' ', get_category_parents( $cat, false, ' ', true ) );
        //配列から最上位のカテゴリーを取得
        $parentcat = $parentcats[0];
        //配列から2階層目のカテゴリーを取得
        if ( ! empty( $parentcats[1] ) )
            $parentcat .= '/'.$parentcats[1];
        //管理画面で設定したパーマリンクの設定に合わせる
        $permalink = home_url( $parentcat.'/id-'.$post->ID ).'/';
        return $permalink;
    }
    トピック投稿者 yukikaze

    (@yukikaze)

    msio 様

    ご丁寧にありがとうございます。

    LABE 様

    すっきりきれいなコードをありがとうございます!
    自分で作ったものは、孫カテゴリーに属する場合、URLを直打ちすると全て表示されていたのですが、
    LABE 様のものは、直打ちしても短縮されて、理想の動きになっています。
    ありがとうございました。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「階層カテゴリーの短縮表示」には新たに返信することはできません。