ど素人から毛を生やす。<延>

脱プラグイン?ぱんくず関数を作ってみる。

Web > WordPress 2019年10月25日(最終更新:21日前)

どもです。

当サイトの導入プラグインは大半が5年以上前に導入したものなので、そろそろ開発者がやる気をなすなど諸々の事情で寿命を迎えたプラグインが出てきました。

失ったらまずいものは、やはりfunction.phpに置いておく方が安心でしょう。

…と尤もらしい前置きをしてみましたが、実際は「Breadcrumb NavXT」が死んだと勘違いして慌てて作った、というのが真実だったりします。

ともかく、ぱんくず表示関数を自作しました。function.phpに入れておきます。

function getBreadcrumbs($tagType, $homeStr=null ,$separator="\n"){
	$breadcrumbs = array();
	$urls = array();
	$names = array();
	//ホームページ
	$urls[] = home_url();
	$names[] = ($homeStr)? $homeStr : get_bloginfo('name'); 
	//投稿タイプ?
	$post_type = get_post_type();
	$customFlag = false;
	if($post_type){
		if(!is_home()){
			switch($post_type){
				case 'post' : //投稿
				case 'page' : //固定ページ
				case 'attachment' : //添付ファイル
				case 'revision' : //リビジョン
				case 'nav_menu_item' : //ナビゲーションメニュー
					break;
				default : //カスタム投稿
					$post_type_archive_link = get_post_type_archive_link($post_type);
					if($post_type_archive_link){
						if(is_post_type_archive($post_type)){
							$urls[] = null;
						}else{
							$urls[] = $post_type_archive_link;
						}
						$names[] = get_post_type_object($post_type)->label;
					}
					$customFlag = true;
			}
			//アーカイブページ?
			if(is_archive() && (!$customFlag || !is_post_type_archive($post_type))){
				if(is_category() || is_tax() || is_tag()){
					//タクソノミ系
					$the_term = get_queried_object();
					$terms = getAppointmentTermList($the_term);
					foreach($terms as $term){
						$term_link = get_term_link($term->term_taxonomy_id, $term->taxonomy);
						if(!is_object($term_link)){
							$urls[] = ($term->term_id==$the_term->term_id)? null : $term_link;
							$names[] = $term->name;
						}
					}
				}else{
					//日付等
					$urls[] = null;
					$names[] = get_the_archive_title();
				}
			}else 
			//検索結果?
			if(is_search()){
				$urls[] = null;
				$names[] = '検索結果';
			}else
			//シングルページ?
			if(is_single()){
				//タームを有する?
				$taxonomies = get_object_taxonomies($post_type, 'objects');
				if($taxonomies){
					foreach($taxonomies as $taxonomie => $taxonomie_value){
						$the_terms = get_the_terms($post->ID, $taxonomie);
						if($the_terms){
							$terms = getAppointmentTermList(current($the_terms));
							foreach($terms as $term){
								$term_link = get_term_link($term->term_taxonomy_id, $term->taxonomy);
								if(!is_object($term_link)){
									$urls[] = $term_link;
									$names[] = $term->name;
								}
							}
							break;
						}
					}
				}
				$urls[] = null;
				$names[] = get_the_title(get_the_ID());
			}else if(!$customFlag || !is_post_type_archive($post_type)){
				$urls[] = null;
				$names[] = get_the_title();
			}
		}
	}else{
		$urls[] = null;
		$names[] = '404 not found';
	}
	//HTMLタグ種別(spanかli)
	$parent_tag = null;
	switch($tagType){
		case 'span': $tag = 'span'; break;
		default: $tag = 'li'; $parent_tag = 'ul';
	}
	//実行
	foreach($names as $id => $name){
		$breadcrumb = "<{$tag} itemscope=\"itemscope\" itemtype=\"http://data-vocabulary.org/Breadcrumb\">";
		if($urls[$id]){
			$breadcrumb .= "<a href=\"{$urls[$id]}\" itemprop=\"url\">";
		}
		$breadcrumb .= "<span itemprop=\"title\">{$name}</span>";
		if($urls[$id]){
			$breadcrumb .= "</a>";
		}
		$breadcrumb .= "</{$tag}>";
		$breadcrumbs[] = $breadcrumb;
	}
	$breadcrumbs = implode($separator, $breadcrumbs);
	if($parent_tag != null){
		$breadcrumbs = "<{$parent_tag} class=\"breadcrumb\">{$breadcrumbs}</{$parent_tag}>";
	}
	return $breadcrumbs;
}
function getAppointmentTermList($the_terms){
	//指定カテゴリの最上位から階層で取得する
	if(!$the_terms) return array();
	$terms = array($the_terms);
	$tmpTerm = $the_terms;
	while(isset($tmpTerm->parent) && $tmpTerm->parent){
		$tmpTerm = get_term($tmpTerm->parent, $taxonomie);
		$terms[] = $tmpTerm;
		$tmp++;
	}
	return array_reverse($terms);	
}

使うときは echo getBreadcrumbs('span', 'home'); みたいな感じでOKです。

引数は('li'または'span', ホームを指すテキスト(未入力・nullはサイト名), タグ間の区切り文字(未入力可));

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)