ラック
Home > CMS > 記事 > 2016年2月 > カスタム投稿を表示するとメニューの投稿の表示がおかしくなる件

カスタム投稿を表示するとメニューの投稿の表示がおかしくなる件

カテゴリ: WordPress

あ…ありのまま今起こった事を話すぜ!
「カスタム投稿のアーカイブページをカスタムメニューに追加してそのページを開いたと
思ったら、メニューで隣に設置した"投稿"の項目に"current_page_parent"とかうい余計なクラスが付与されていた」
な…何を言っているのかわからねーと思うが
おれも何をされたのかわからなかった…
頭がどうにかなりそうだった…テーマのバグだとか余計なお節介だとか
そんなチャチなもんじゃあ断じてねえ
もっと恐ろしいものの片鱗を味わったぜ…

 

…いや本当に。

カスタム投稿のアーカイブを開いているはずなのに、投稿の項目が「ここだよー」と言っているように1つだけ表示が変わっているのですから。

要素を検証して、すぐに上記の通り"current_page_parent"クラスが意図せずに付与されていることに気付いたわけですが。

さっきから、カスタムカスタムうるさいなあ。結局カスタム何とかがなきゃ何も出来ないのかよ。

 

いやまあうん。

カスタム何とかがあるから柔軟に色々できるのですが、これはある意味その副作用の1つなのかもしれませんね…。

google先生に訊いたところ、上記のサイトがヒットしました。

2つ目の記事は去年ですが、1つ目に至っては2011年の記事です。

「HAHAHA、まさかこんなコアの不具合(?)が5年間も放置されているなんて…」

と思いながら手元にあった4.4のコードを読んで行ったところ…まったく同じif文がありました。

マジカヨ...

 

というわけで、このコードを処置が必要なサイト用にちょこっと変更して対処することにしました。

その前に、この辺りを参照しつつ処置用コードを読んで、大体の流れを掴むことにしました。

 

function my_custom_menu($classes, $item) {
	global $wp_query;

	$singular_slug = 'cp_custom'; //決め打ち
	$page_for_custom_type_title = 'カスタムテスト'; //決め打ち
	$page_for_posts = get_option('page_for_posts');
	$post_type_query = $wp_query->query_vars['post_type'];
	$del_flag = true; //current_page_parentを消すためのフラグ
	$add_flag = false; //current_page_parentを付けるためのフラグ

	if(is_singular('post') || is_category() || is_tag()) {
		$del_flag = false;
	}
	elseif((is_author() || is_date() || is_author())) { //※1
		if(in_array($post_type_query, array('', 'post'))) {
			$del_flag = false;
		}
		elseif($post_type_query == $custom_post_type) {
			$add_flag = true;
		}
	}
	elseif(is_tax()) {
		$taxonomy = get_taxonomy($wp_query->query_vars['taxonomy']);
		if(count($taxonomy->object_type) == 1 && $taxonomy->object_type[0] == 'post') {
			$del_flag = false;
		}
		elseif (count($taxonomy->object_type) == 1 && $taxonomy->object_type[0] == $singular_slug) {
			$add_flag = true;
		}
	}
	elseif(is_singular($singular_slug)) {
		$add_flag = true;
	}

	if($del_flag && is_numeric($page_for_posts) && $item->object_id == $page_for_posts && $item->object == 'page' && $key = array_search('current_page_parent', $classes)) { //※2
		unset( $classes[$key] );
	}
	elseif($add_flag && $item->title == $page_for_custom_type_title && $item->object == 'page') {
		$classes[] = 'current_page_parent';
	}
	return $classes;
}
add_filter('nav_menu_css_class', 'my_custom_menu', 10, 2);

理解力不足なのか、2箇所ほど気になった点がありましたがほぼコピペ。こんな感じで。

  1. 気になった点その1(※1): is_authorが2回あり、それがor判定されていること。なぜ2回なのか、しかも括弧も二重になっていますし。
    ここは削って elseif(is_author() || is_date()) で良さそうな感じがしますが…。
  2. 気になった点その2(※2): $item->object_id == $page_for_posts の判定。こちらは完全に理解力不足な気がします。アーカイブページでの「何ページ目」の数値が入ってくる気がするのですが、その挙動が追いきれず。
    テストサイトでは面倒だったので固定ページでアーカイブを作成せずに値を見ていたので、そのせいもあるかもしれません。固定ページで作りなおしてからもう一度見てみます。

最後の部分のdel_flagやadd_flagで調整をしているので、そこに関連してカスタム投稿等のアーカイブページは固定ページとして作成しないといけないのがこのコード使用上での注意点でしょうか。

カスタムメニューのカスタムリンクで生成したメニュー項目は$item->objectに"custom"が入っているようなので、他の用途のカスタムリンクと判別が付かなさそうなので汎用性を考えると確かに固定ページでアーカイブを表示するのが楽なのかなー、と思いました。

 

読みきれていないですが、きちんと中身のコードを追いかけて理解するように努力するというのは大切だなぁ、と改めて思いました。

タグ: デザイン・ビジュアル, トラブル対処, カスタマイズ, カスタム投稿

 



関連する記事一覧