head titleを記事ごとに書き換える

ワードプレスのメモ

ジョブポスティング構文の出力や、OGPのtitleなどで、headのタグを書き換えることが多くなってきました。

「add_theme_support( ‘title-tag’ )」で出力している場合、header.phpで条件分岐とかは多分出来ないので、functions.phpで処理しています。

functions.php

固定ページ、シングル前提なので、前方/後方分けると面倒、とにかく全部置き換える。

/* ---------- head title - 前方を変更 ---------- */
function change_document_title_parts( $title_parts ){
	if( is_page() || is_single() ){
		global $post;
		if( get_post_meta( $post->ID, 'modify_head_title', true ) ){
			$title_parts[ 'title' ] = get_post_meta( $post->ID, 'modify_head_title', true );
		}
	}
	return $title_parts;
}
add_filter( 'document_title_parts', 'change_document_title_parts' );

/* ---------- head title - 後方を削除 ---------- */
function custom_title_text( $results ){
	if( is_page() || is_single() ){
		global $post;
		if( get_post_meta( $post->ID, 'modify_head_title', true ) ){
			$results['site'] = '';
		}
	}
	return $results;
}
add_filter( 'document_title_parts', 'custom_title_text', 11 );

/* ---------- head title - トップのキャッチを削除 ---------- */
add_filter( 'document_title_parts', 'remove_title_description' );
function remove_title_description ( $title ){
	if( is_page() || is_single() ){
		global $post;
		if( get_post_meta( $post->ID, 'modify_head_title', true ) ){
			unset( $title[ 'tagline' ] );
		}
	}
	return $title;
}

トップとそれ以外では処理が違うの注意。

トップは後方にキャッチフレーズ(tagline)、それ以外はサイトのタイトル(site)を出すので、それぞれ削除します。

 

「modify_meta_title」はカスタムフィールドです。

テキストなので、カスタムフィールドテンプレート、ACF、もちろん標準のカスタムフィールドなど、なんでも。

※同じようなことの解説記事で「get_post_meta()」をいきなり呼び出している例をちょくちょく見かけますが、前置き「global $post;」としないと動作しないかもです。

結果

この記事はtitleタグを改変しています。

変更なし

「head titleを記事ごとに書き換える | ピコクリ」

変更適用

「ワードプレス ヘッドのタイトルを書き換える話 | ピコクリの無駄話」

前方も後方もないので、入力したテキストがそのまんま出ます。

OGPにも適用

<?php
$post_type_name = esc_html( get_post_type_object( get_post_type() )->label );
if( is_page() || is_single() ){
	if( get_post_meta( $post->ID, 'modify_head_title', true ) ){
		$head_title = get_post_meta( $post->ID, 'modify_head_title', true );
	}else{
		$head_title = the_title_attribute( 'echo=0' );
	}
}elseif( is_404() ){
	$head_title = '404';
}elseif( is_search() ){
	$head_title = get_search_query() . 'の検索結果';
}elseif( is_home() ){
	//ブログトップ
	$head_title = $post_type_name;
}elseif( is_archive() ){
	if( is_author() ){
		$head_title .= get_the_author() . 'アーカイブ';
	}elseif( is_category() ){
		$head_title .= single_cat_title( '', false ) . 'アーカイブ';
	}elseif( is_tag() ){
		$head_title .= single_tag_title( '', false ) . 'アーカイブ';
	}elseif( is_tax() ){
		$head_title .= single_term_title( '', false ) . 'アーカイブ';
	}elseif( is_day() ){
		$head_title .= get_the_date( 'Y年m月d日' ) . 'アーカイブ';
	}elseif( is_month() ){
		$head_title .= get_the_date( 'Y年m月' ) . 'アーカイブ';
	}elseif( is_year() ){
		$head_title .= get_the_date( 'Y年' ) . 'アーカイブ';
	}else{//カスタム投稿トップ
		$head_title = $post_type_name;
	}
}else{
	$head_title .= bloginfo( 'name' );
}
?>
<meta property="og:title" content="<?php echo $head_title; ?>" />
<meta name="twitter:text:title" content="<?php echo $head_title; ?>" />

面倒臭いですが、単純にthe_title()やthe_title_attribute()を充てると、アーカイブや検索結果などが変な感じになるので。

※「add_theme_support( ‘title-tag’ )」で呼び出される元コードを任意に出力、改変すれば上記のコードは要らないですね。
5分間調べたところ、結局「wp_title」を呼び出してる?非推奨?これは関わらない方がいいかな、、、

 

meta keywordやmeta descriptionにも応用できるので、この感じでhead内のTDK、OGPは全部まとめてしまいました。