ジョブポスティング構文の出力や、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は全部まとめてしまいました。