階層カテゴリーの短縮表示
-
階層カテゴリーの短縮(一番下のカテゴリーを非)表示にしたくて、
パーマリンク設定にて、カスタム構造で、
[ドメイン]/%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-記事番号/
とするには、どんなコードにすれば良いでしょうか。
-
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; }
これでやってみましたが、できませんでした。
どこがおかしいのか…フィルター
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 ) { // 省略 }
引数が少し変わっています。
LABE 様
ご指摘ありがとうございます。
変更したソースをfunctions.phpに貼り、
ドメイン/bbb/ccc/id-[記事番号]/ にアクセスしたところ、何もURLに変化はありませんでした。すみません、勘違いでした。
category_link
もterm_link
も、カテゴリアーカイブページのURLを変更するフィルターです。パーマリンクを変更するフィルターは
post_link
です。add_filter( 'post_link', 'permalink_change_category' ); function permalink_change_category( $permalink ) { // 省略 }
動かなかったので別の方法で試してみました。
コードは汚いですが…//非表示にするフィルタフック 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; }
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が出来た場合の動作はまた特別なものなのでしょうか。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-[記事番号]/この投稿のコードを見て、以下の点が気になりました。
$parentcat
はforeach
ループの最後の1回で上書きされ、処理に無駄がある。$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; }
- トピック「階層カテゴリーの短縮表示」には新たに返信することはできません。