サポート » 使い方全般 » body_classに最上位の親ページのスラッグを出力したい

  • 解決済モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)


    3階層くらいで固定ページを作っています。仮に
    /japan/aichi/nagoya という階層だとしましょう。

    nagoyaページにいるとき、bodyに 今いるページのスラッグnagoyaと、
    最上位ページのスラッグjapanを出力させたいと思います。

    ▼理想
    <body class=”nagoya japan page-child parent-pageid-03 (以下略)”>

    そこで、過去ログのこちら:「[解決済み] 選択ページの一番上の親のID取得方法」を参考に、
    functions.phpに

    //最上位の親ページのスラッグを取得
    function ps_get_root_page( $cur_post, $cnt = 0 ) {
    	if ( $cnt > 100 ) { return false; }
    	$cnt++;
    	if ( $cur_post->post_parent == 0 ) {
    		$root_page = $cur_post;
    	} else {
    		$root_page = ps_get_root_page( get_post( $cur_post->post_parent ), $cnt );
    	}
    	return $root_page;
    }
    //body_classの拡張
    function custom_body_class($slug) {
    	$page = get_page($page_id);
    	$slug[0] = $page->post_name;
    	$slug[1] = get_page_uri($root_page->ID);
    	return $slug;
    }
    add_filter('body_class','custom_body_class');

    を記述したところ、

    <body class=”nagoya japan/aichi/nagoya page-child parent-pageid-03 (以下略)”>
    という感じになってしまいました。

    japan/aichi/nagoya を nagoyaだけにする方法はわかったんですが、japanだけにすることができていないので、何かしらヒントを頂けますでしょうか。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • こんにちは
    post_parentの値は覗いてみました?
    デバッグ用に値を覗いてみてはどうでしょう?

    後はps_get_root_page呼び出しは問題ないとして
    帰ってきてからの処理で扱けているとかはありませんか?

    帰ってきてからで思いつきましたが戻ってきてから値を編集するのもありかと
    (スマートではないやり方とは思いますが)

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    CyberCypherさん、回答ありがとうございます!

    おそらく、たんなる値の取得ミスなんでしょうが。。。
    get_page_uriを使っているので、ある意味これが正しい挙動なんだろうなぁとも思いつつ、
    もうちょっと落ち着いて調べなおしてみます。

    ※ちなみに、スラッグじゃなくて投稿タイトルと、投稿ID(数字)なら取れるんですよね。。。
     あとちょっとでつまづいてます。。。

    フィルターで置き換えてるところを見ると
    body_class()で取得したのを置き換えてるっていうこと?
    文字列の置換えのようになってしまっているせいで一部しか変更されないのだと思います
    それならいっそのこと直接
    ps_get_root_pageをbodyに書いてしまうのも有りかと・・・
    フィルタされるタイミングが問題ですよね

    同じトピックのmizubeさんが紹介している方法で可能です。
    http://ja.forums.wordpress.org/topic/1056?replies=10#post-4600

    function custom_body_class($slug) {
    	$page = get_page($page_id);
    	$ancestor  = array_pop(get_post_ancestors($page_id));
    	$parent = get_page($ancestor);
    	$slug[] = $page->post_name;
    	$slug[] = get_page_uri($parent->ID); // $parent->post_nameでもどちらでも可能
    	//$slug[] = $parent->post_name;
    	return $slug;
    }
    add_filter('body_class','custom_body_class');

    $slug[0]、$slug[1]のように直接指定すると、WPで付与しているclass(page、page-id-**、 page-child…)が順番に上書きされて消えてしまうので、上記のように配列の後ろに追加するようにしています。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    popupさんも、アドバイス有難うございます!
    希望通りの動作になりました。

    加えて、このフォーラムでもお馴染みのjim912さんがいつの間にかしれっとこんな記事を書いてくださっていたので、紹介しまして解決済みといたします。
    WordPressのbody_classに固定ページのルートのスラッグを追加する

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「body_classに最上位の親ページのスラッグを出力したい」には新たに返信することはできません。