functions.phpからtitleタグを出力・コントロールする方法

functions.phpからtitleタグを出力・コントロールする方法

functions.phpからtitleタグを出力・コントロールする方法

これまでwp_title関数を使ってheader.php内に直接titleタグを書く方法は、現在は推奨されていません。

これからは新しく登場したwp_get_document_title関数を使って、wp_head()実行時に生成する様にしましょう。

functions.phpにadd_theme_supportを記述してタイトルを生成し、さらに3つのフィルターを駆使して様々なカスタマイズが可能です。

titleタグ出力をコントロールする

これまでのWordpressでのタイトルの出し方

通常HTMLページのタイトルは、headタグ内に<title>~</title>を書きますよね。

Wordpressでタイトルを出力する際、テーマテンプレート「header.php」内に直接書いていたはずです。

header.php内titleタグ記述例

例えば、headタグ内に以下のような記述をしていました。

<title><?php bloginfo('name'); wp_title('|', true, 'left'); ?></title>

上記の様にwp_title()を使えば、簡単にタイトルを表示できる訳です。

上記コードでは、同時に「|」をサイトタイトルの左側につけています。

冒頭にページのタイトルbloginfo('name');をつけて「ページタイトル|サイトタイトル」の状態を生成している訳です。

実際の出力HTMLソース

<title>サイト名|記事のタイトル</title>

functions.php記述でタイトルタグを出す

実はWordpress4.1 以降から、titleタグはfunctions.phpでコントロールできる様になりました。

functions.phpに書く事で、ページの種類に応じてシステム側がtitleタグを自動表示してくれる訳です。

それが「add_theme_support」関数です。

add_theme_support関数

add_theme_support()は、Wordpressの特定の機能をテーマ内で有効にする関数です。

引数に「'title-tag'」を指定する事で、titleタグが自動的にheadタグ内に挿入されます。

functions.phpの記述例

具体的には、以下の一行を入れるだけですね。

add_theme_support('title-tag');

基本はこれだけで、ページタイトル・サイト名が入ったtitleタグが自動挿入されます。

headerに書かずに様々なカスタマイズが可能になり、利便性が高くなりました。

現在タイトルタグを出力する際は、このadd_theme_support()の利用が推奨されています。

header.php内にtitleタグは書かない

add_theme_support()を使う場合、逆にheader.phpにtitleタグを書かない様にしましょう。

そうしないと、ソース内にtitleタグが2つ表示されてしまいます。

ありがちなミスですので、注意しましょう。

wp_get_document_title

functions.phpからタイトルがコントロールできる様になった背景を紹介します。

Version4.4からwp_title()に代わってページタイトルを生成する関数が導入されました。

それが「wp_get_document_title」関数です。

現在のページの種類に応じて処理された、タイトルの文字列の値が取得されます。

ただしタイトルの出力まではせず、単に値を返すだけです。

Wordpressがwp_head()内で使用

このwp_get_document_title()は、wp_head()の中で実行される様になっています。

current_theme_supports()が準備

wp_head()を実行する際に動くファイル「wp-includes/general-template.php」内に、「current_theme_supports」関数の記述があります。

ここで'title-tag'が有効になっている場合、wp_get_document_title()でタイトルを出力する準備ができているのですね。

結果、functions.phpにadd_theme_support('title-tag')を記述する事で、headタグ内にtitleタグが自動挿入される訳です。

wp_get_document_title()で返ってくる値

wp_get_document_title()で生成する値について詳しく紹介しましょう。

生成されるタイトルの例(一部)

ページの種類により、それぞれ以下のタイトル情報が生成されます。

ページ種類 表示されるタイトル
404ページ ページが見つかりませんでした – サイト名
検索ページ “キーワード” の検索結果 – サイト名
フロントページ サイト名 – キャッチフレーズ
固定ページ
投稿ページ
カスタム投稿ページ
ページのタイトル – サイト名
アーカイブ
(一覧ページ)
タイトル – サイト名
アーカイブ
(2ページ目以降)
タイトル – ページ番号 – サイト名

変数に格納される配列情報

タイトル情報を$title等の変数で配列に格納した場合、以下のパーツに分かれます。

パーツ(要素)内容
$title['title'] メインのタイトル文字列
$title['page'] ページが分割されている場合のページ番号
$title['tagline'] フロントページの場合のキャッチフレーズ
$title['site'] フロントページでない場合に表示するサイト名

タイトル・キャッチフレーズ

基本的にフロント(TOP)ページにはタイトルに「キャッチフレーズ」がつき、その他ページには「サイト名」が付く様になっています。

サイト名は、get_bloginfo( 'name', 'display' )で取得されます。

キャッチフレーズは、get_bloginfo( 'description', 'display' ) で取得されます。

【フロントページ】…サイト名 – キャッチフレーズ 【サブページ】…ページのタイトル – サイト名 if ( is_front_page() ) { $title['tagline'] = get_bloginfo( 'description', 'display' ); } else { $title['site'] = get_bloginfo( 'name', 'display' ); }

ページ番号について

ページ番号は $title['page'] に格納されます。

ページが分割されている場合、以下の様にページ番号が入る形で生成されます。

タイトル – ページ番号 – サイト名 if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) { $title['page'] = sprintf( __( 'Page %s' ), max( $paged, $page ) ); }

titleの出力をカスタマイズする

ここまで、wp_get_document_title()がwp_head()内で実行される事で、titleタグが自動出力されるのがわかりました。

さらに場合によっては、その出力内容をカスタマイズするケースもあるでしょう。

そんな時は、大元となるwp_get_document_title()に3つのフィルターが設置されていますので、それらを活用する事になります。

・pre_get_document_title
・document_title_separator
・document_title_parts

これらのフィルターも全てfunctions.php内に記述して、出力をコントロールします。

フィルターを駆使する関数

上記3つのフィルターをfunctions.php内で使うために必要な、2つの関数を紹介します。

apply_filters()
add_filter()

apply_filters()

apply_filters()は、フィルター処理に使われます。

apply_filters()の第一引数には「フィルターフック名」が入り、第二引数には「変更できる値」が入ります。

add_filter()

add_filter()は、フィルターフックの実行に使われます。

add_filter()の第一引数には「フィルターフック名」、第二引数には値を変更する「フィルター関数」が指定されます。

実際に両者がどのように使われるのかは、実例を見ながら確認して下さいね。

pre_get_document_title

最初に設置されているフィルターが「pre_get_document_title」です。

このフィルターはタイトル自体を丸ごと変更する際に使用されます。

条件分岐を設けることで、場面に応じて全く違うタイトルを生成することができます。

pre_get_document_titleの機能

pre_get_document_titleフィルターは、wp_get_document_title()内で使用されています。

つまり、Wordpressのタイトル生成実行中に割り込みするフィルターです。

このpre_get_document_titleフィルターで「空文字以外」が指定された場合、本来の生成処理は止まります。

つまり文字列が指定されればそのタイトル文字に変わり、指定が無ければ(空文字の場合なら)通常の生成ルールでタイトルが出力される事になります。

タイトル文字自体を丸ごと書き換える

このフィルターと条件分岐を使えば、場面によって全く違うタイトルを表示できる様になります。

functions.phpの記述例(ファイル判定)

function change_title_tag( $title ) { if ( is_404() ) { $title = '404エラーページ:このページは表示できません'; }elseif ( is_search() ) { $title = ''; } return $title; } add_filter( 'pre_get_document_title', 'change_title_tag' );

404エラーページの場合、$titleに専用文字列が入っているので、この文字のみに変換されます。

それに対して検索結果ページの場合、中は空文字「''」になっていますね。

この場合、wp_get_document_title()にようる通常の生成処理がされ、いつものタイトルが表示される訳です。

document_title_separator

2番目に設置されているフィルター名が「document_title_separator」です。

このフィルターはWordpressが各ページごとに設定したタイトル文字列内の「区切り文字」を変更する場合に使用します。

区切り文字を変える

通常、wp_get_document_title()で生成するページタイトルとタイトルの間には「-」が入ります。

この「-」を「|」に変更したい場合は、以下様に書きましょう。

functions.phpの記述(-を|に変換)

add_theme_support('title-tag'); function my_title_separator($separator) { $separator = '|'; return $separator; } add_filter('document_title_separator', 'my_title_separator');

この様にdocument_title_separatorを使う事で、区切り文字を自由に変更する事ができます。

document_title_parts

3つ目のフィルターが「document_title_parts」ですね。

このフィルターは、設定したタイトル文字列を「パーツ単位に分割・変更」する場合に使用します。

タイトル情報をパーツごとに分割配列

apply_filters()でdocument_title_partsを実行すると、タイトル情報は配列に変換されます。

$title = apply_filters( 'document_title_parts', $title );

これにより、変数$title内にパーツごとに格納されます。

$titleに格納された各パーツ情報

これによりタイトル情報は、wp_get_document_title()で紹介した様に以下のパーツに分割・格納されます。

$title['title']…メインタイトル
$title['page']…ページが分割されている場合のページ番号
$title['tagline']…設定欄で入力したキャッチフレーズ
$title['site']…設定欄で入力したサイト名

事例1:要素の表示・非表示

特定のページにおいて、特定パーツの内容を変更したり非表示にする例です。

TOPページでデフォルト表示されるキャッチフレーズを非表示にしています。

functions.php記述例(キャッチフレーズ削除)

function change_title_parts ( $title ) { if ( is_home() || is_front_page() ) { unset( $title['tagline'] ); //キャッチフレーズを非表示 } return $title; } add_filter( 'document_title_parts', 'change_title_parts');

unset()を使うと、配列の要素や配列自体を削除する事ができます。

この分岐設定により、フロントページで「サイト名 – キャッチフレーズ」だったタイトルが、「サイト名」のみになります。

事例2:ページ種類ごとのカスタマイズ

次は、ページごとに各パーツを組み合わせるカスタマイズ例です。

functions.php記述例

function cus_Title($title) { unset($title['tagline']); //キャッチフレーズを非表示 $title['site'] = 'えるぺぐ'; //サイト名を任意の名前に変更 //ページごとの分岐 if(is_home()){ $title['title'] = $title['site'].'TOPページ'; //TOP }else if(is_archive()){ $title['title'] = $title['site'].'記事一覧アーカイブ'; //アーカイブ }else if(is_single()){ $title['title'] = $title['title'].'の詳細ページ'; //記事詳細 } return $title; } add_filter('document_title_parts','cus_Title');

この場合、フロントページのタイトルは「えるぺぐTOPページ」になります。

記事のアーカイブ一覧ページのタイトルは「えるぺぐ記事一覧アーカイブ」になります。

記事詳細ページのタイトルは「○○○○詳細ページ」になります。

この様にページの種類によってパーツ単位でカスタマイズする事ができます。

いかがでしたか

特にオリジナルテーマを構築する場合、いまだにheadタグにtitleタグを記述している人も多いと思います。

これからはfunctions.php内(add_theme_support)で、wp_get_document_title()が生み出すタイトル生成機能を使う様にしましょう。

条件分岐と3つのフィルターを駆使すれば、様々なカスタマイズが可能になります。

ただし生成タイトルはwp_head()実行時に表示されます。そのためtitleタグのソース上の位置は、headタグ内のかなり下の方になります。

この記事をシェアする

一押し人気コーナー紹介

Wordpressテーマカスタマイズ系記事