WordPress デフォルトテーマ TwentyFourteen の wp-title()

  WordPress

WordPress のデフォルトテーマ「TwentyFourteen」の【headeer.php】にある <title> 部分を見てみると

<title><?php wp_title( '|', true, 'right' ); ?></title>

とあり、wp_title() だけで「サイト名と投稿タイトル、ディスクリプション」が出力されますが、同じようにオリジナルテーマ<title> 部分に記述しても同じように出力されません。

「TwentyFourteen」の【functions.php】ファイルには wp_title() に対してフィルターフックがあるので、オリジナルテーマでも同じように【functins.php】を作成し、フィルターフックを実装することで「サイト名と投稿タイトル、ディスクリプション」が出力されるようになります。

 

functions.php ファイルの作成

現在開いてるテーマフォルダ の【index.php】と同じ階層に【functions.php】ファイルを作成し <?php  ?> と記述して保存します。

【functions.php】

<?php

?>

 

「TwentyFourteen」の【functions.php】ファイルの482行目付近にある function twentyfourteen_wp_title( $title, $sep ) { ~略~ } 部分をコピーし、新たに作成した【functions.php】の <?php ~ ?> の中に貼り付けます。

<?php
function twentyfourteen_wp_title( $title, $sep ) {
global $paged, $page;

if ( is_feed() )
return $title;

// Add the site name.
$title .= get_bloginfo( 'name' );

// Add the site description for the home/front page.
$site_description = get_bloginfo( 'description', 'display' );
if ( $site_description && ( is_home() || is_front_page() ) )
$title = "$title $sep $site_description";

// Add a page number if necessary.
if ( $paged >= 2 || $page >= 2 )
$title = "$title $sep " . sprintf( __( 'Page %s', 'twentyfourteen' ), max( $paged, $page ) );

return $title;
}
add_filter( 'wp_title', 'twentyfourteen_wp_title', 10, 2 );
?>

一番最後の行 add_filter( ‘wp_title’, ‘twentyfourteen_wp_title’, 10, 2 ); 部分がフィルターフックになっていて、テーマ内で wp_title() が実行されると、かわりに twentyfourteen_wp_title() が実行されます。

 

※ $title = "$title $sep " . sprintf( __( 'Page %s', 'twentyfourteen' ), max( $paged, $page ) ); にある , 'twentyfourteen' は削除しておきます。
(別途、翻訳用の国際化ファイルが必要になるので、この引数は削除しておきます。削除するとWordPress本体の翻訳ファイル wp-content/languages/~.mo を参照するようになります。)

削除後は

$title = "$title $sep " . sprintf( __( 'Page %s' ), max( $paged, $page ) );

となります。

 

add_filter()

フィルターは、WordPress が様々な種類のテキストをデータベースまたはブラウザ画面へ送信する前に、それを変更できます。プラグインは、フィルター API を利用して、指定したテキストをその時点で変更する PHP関数を実行できます。

WordPress Codex : 関数リファレンス/add filter

add_filter( $tag, $function_to_add, $priority, $accepted_args )

 

パラメータ
引数 説明
$tag
文字列
必須
$function_to_add 引数で指定した関数を登録するフィルターフックの名前
初期値:なし
$function_to_add
コールバック
必須
フィルターが適用されたときに呼び出される関数の名前
初期値:なし
$priority
整数
オプション
フィルターフックに登録された関数の中で、この関数を実行する順序。数値が小さいほど早く実行し、同じ数値の場合は追加された順に実行する
初期値:10
$accepted_args
整数
オプション
関数が受け取る引数の個数。WordPress 1.5.1 以降、フィルターフックに登録された関数は、対応する apply_filters() の実行時に渡される追加の引数を受け取ることができる
初期値:1

 

戻り値
真偽値 フィルターフックに関数を登録できると true を、そうでなければ false を返します。
ただし、その関数が存在することや、$function_to_add が文字列であることさえもテストしません。
これは最適化のためであり、できるかぎり高速に実行されます。

 

WordPressのグローバル変数

WordPress のコードの全体にわたって、いろいろな目的で WordPress 固有のグローバル変数が使用されます。WordPress が生成するデータのほとんど全部がグローバル変数に見られます。

WordPress Codex : グローバル変数

ページ関係のグローバル変数

$page 「固定ページ」や「投稿」の現在のページ番号。
$paged 「カテゴリー」や「タグ」の一覧ページの現在のページ番号。

 

function twentyfourteen_wp_title( $title, $sep ) の中を順に追っていきます

グローバル変数 どちらも1ページ目は0、2ページ目以降は2、3…と整数(int)が格納されます。

global $paged, $page;

 

フィードリクエストだった場合、「ページタイトル」を返します。

if ( is_feed() )
return $title;

 

文字列「ページタイトル」に「サイト名」を加えます。

$title .= get_bloginfo( 'name' );

 

変数 $site_descriptionget_bloginfo() で「ディスクリプション」を取得して格納します。

$site_description = get_bloginfo( 'description', 'display' );

get_bloginfo() の引数に ’display’ があると「ディスクリプション」の前の区切り文字がコード表記のまま &#8211; と出力されてしまいます。’display’ を削除すると正常に  -  と表示されます。

 

$site_description に値があり、かつサイトのトップページ(ホームもしくはフロントページ)の場合は、$title に文字列「ページタイトル」+「区切り文字」+「ディスクリプション」を代入します。

if ( $site_description && ( is_home() || is_front_page() ) )
$title = "$title $sep $site_description";

 

$paged が2かそれ以上、もしくは $page が2かそれ以上だった場合、$title に文字列「ページタイトル」+「区切り文字」+「ページ( $paged$page の大きいほうの数字)」を代入します。

if ( $paged >= 2 || $page >= 2 )
$title = "$title $sep " . sprintf( __( 'Page %s', 'twentyfourteen' ), max( $paged, $page ) );

 

たとえば、一覧ページ(カテゴリー等)の2ページ目であれば

<title>カテゴリー名 | ページ2</title>

となります。

 

最後に $title を返しファンクションが完了します。

return $title;

 

最後の sprintf( __( ‘Page %s’〜 の部分をもう少し追ってみます。

$title = "$title $sep " . sprintf( __( 'Page %s', 'twentythirteen' ), max( $paged, $page ) );

 

sprintf()
sprintf( __( 'Page %s', 'twentythirteen' ), max( $paged, $page ))

フォーマット文字列 format に基づき生成された文字列を返します。

PHP Manual : sprintf

sprintf( string $format , mixed $args )

sprintf() は引数をフォーマットしてから出力します。
第1引数で指定した文字列の $format に第2引数 $args で指定した値を当てはめて出力します。

$format は指定子(%~)で指定します。
この場合の %s は引数を文字列として扱い、表現します。

 

__($text, $domain=’default’)
sprintf( __( 'Page %s', 'twentythirteen' ), max( $paged, $page ))

__( $text, $domain=’default’ ) は翻訳する関数で、’Page %s’ を翻訳して返します。

 

翻訳テキストが見つからなかった場合は $text をそのまま返します。
独自の国際化用ファイルで翻訳させるために $domain’twentyfourteen’ を指定しています。( twentyfourteen/languages/~.pot

パラメータ $domain を省略した場合、国際化用ファイルは ’default’wp-content/languages/~.mo となります。

 

max( $value1, $value2 )
sprintf( __( 'Page %s', 'twentythirteen' ), max( $paged, $page ))

max( $value1, $value2 ) を使って、$paged$page パラメータの中で最も大きい数値を %s に返します。

 

 

解説は以上になります。

 

実際に設置してみます。

【index.php】もしくは【header.php】の <head> タグ内の <title> 部分に下記を書きます。

<title><?php wp_title( '|', true, 'right' ); ?></title>

 

次に【functions.php】作成します。(すでにファイルがある場合は下記を追加します。)

※ファンクション名は「twentyfourteen_wp_title」から「my_wp_title」に変更しました。

<?php
function my_wp_title( $title, $sep ) {
  global $paged, $page;
  if (is_feed()) {
    return $title;
  }
  
  $title .= get_bloginfo( 'name' );
  
  $site_description = get_bloginfo( 'description', 'display' );
  if ($site_description && ( is_home() || is_front_page())) {
    $title = "$title $sep $site_description";
  }
  
  if ($paged >= 2 || $page >= 2) {
    $title = "$title $sep " . sprintf( __( 'Page %s' ), max( $paged, $page ) );
  }
  return $title;
}
add_filter( 'wp_title', 'my_wp_title', 10, 2 );
?>

 

以上で完了です。
wp_title() で「サイト名と投稿タイトル、ディスクリプション」が出力されるようになります。

 

  WordPress     by