wordpressのタイトルを変更してカスタマイズ

wordpressで作られたホームページに限らず、タイトルはブラウザ上からだと、ほとんどタブの幅から途切れた状態でしか見られません。最近のタイトルは長くすることが好まれているため、ほとんどの場合、そうなるでしょう。ソースコードを開けば「タイトル」タグとしてすぐに確認できるのでパソコンなら簡単です。しかし、スマホに関してはひと手間かかります。Androidの場合、「view-source:」をURLの先頭に追加しなければ見られません。iOSではまだ無理のようです。

wordpressにもこのタイトルを出力するための仕組みがあります。かつてはwordpressの「header.php」に直接タイトルのタグが記述されていましたが、現在ではこのテンプレートから消えて、「functions.php」から呼び出す方式に変わっています。いずれの場合もタイトルのカスタマイズは可能ですが、やり方が違います。

そういえば、昔はなぜかwordpressで一番左側にサイト名もしくはブログ名を表示していたように記憶してます。デフォルトテーマもそのように作られていました。当時のブログといえば趣味的な色合いが強かったように思います。日記のような感じでしょうか。そのためか、SEOもあまり考慮されてなかったのかも知れません。また、wordpressはその性質上、古いページは深い階層に追いやられるので、HTMLファイルで直接構築していたサイトよりもSEO面で劣るといったような話もありました。その後、wordpressのプラグインをはじめ、様々な工夫によってその優劣を問われることもなくなったように思います。

wordpressのタイトルの表示

wordpressのテンプレートタグであるwp_titleとadd_theme_support( 'title-tag' );は表示するために使います。一方、get_the_titleは変数へ代入して何らかの処理をする際に用います。そのままでは表示されずechoしなければなりません。

「header.php」に記入

echoはいりません。

<title><?php wp_title(); ?></title>

「functions.php」に記入

wordpressのheaderには、タイトルのタグはいりません。下のコードをfunctionsに記入すれば自動的にタイトルが追加されます。

add_theme_support( 'title-tag' );

wordpressの色んなテンプレートに記入

echoしなければ表示されませんが、変数に代入して色んな処理をすることができます。

echo get_the_title();

wordpressのタイトルをカスタマイズ

クロージャでコールバックを用いています。クロージャは名前のないいわゆる無名関数のことです。コールバックは関数の引数に別の関数を指定している関数のことです。「add_filter」は「add_action」でも構いません。後者は前者のエイリアス(別名)です。

以下は$tをpreg_replace関数などでパターンの決まった文字列を前後に入れ替えたり、変更したりします。正規表現を利用しないのであれば単純に処理するstr_replaceの方が適しているかも知れません。str_replaceはUTF-8であればマルチバイト文字でも認識するようです。配列で置換するのであれば、strtrなんかも使い勝手がよいです。

wp_title

add_filter('wp_title', function($t){
$t='タイトル';
return $t;
});

add_theme_support

変更するにはタイトルが入る$t['title']をpreg_replace関数などでパターンの決まった文字列を前後に入れ替えたり、変更したりします。タグラインは不要かも知れません。サイト名で編集できるため、何のためにあるのか今一つ分かりません。

add_filter('document_title_parts', function($t){
$t['title'] = 'タイトル';
$t['tagline'] = 'タグライン';
$t['site'] = 'サイト名';
return $t;
});

セパレーター

wordpressでいうセパレーターとは、区切り文字のことです。標準ではハイフンになっていることと思いますが、「| 」などに変えることができます。

add_filter('document_title_separator', function($eparator){
$eparator = ' | ';
return $eparator;
});

get_the_title

この関数が使われているテンプレートでは、上記の変更の影響を受けません。以下の通り、フックを使って別に処理します。

add_filter('the_title', function($t){
$t='タイトル';
return $t;
});

wordpressの文字列の置換

wordpressではphpの関数を用いています。phpにもともと導入されているものはビルトインといいます。ビルトインはもともと内臓されている、という意味を持ちます。そして、上記のものはワードプレスのユーザ定義関数。

str_replace

「編集」が変換対象、「カスタマイズ」が変換後の文字列、$strは対象の文章。単純に文字をかえたいだけなら、これで十分だとおもいます。

実行結果は、「エディタでカスタマイズしてみる。」となります。

$str = "エディタで編集してみる。";
echo str_replace('編集', 'カスタマイズ', $str);

strtr

strtrは単純な置換もできますが、配列で置換することもできます。タイトルだけでなく、コンテンツ内の文字も操作できます。

実行すると「abcd」が「プログラムを学んでもっと色々あそぼう。」に変わります。

$str = 'abcd';
$a=[
"a" => "プログラムを",
"b" => "学んで",
"c" => "もっと色々",
"d" => "あそぼう。",
];
echo strtr($str, $a);

preg_replace

このビルトインは、正規表現を利用できます。最も頻繁にもちいられる傾向にある一方、正規表現の奥は深いです。以下のケースでは、ワイルドカードなどの正規表現を使い、サブパターンを適用しています。サブパターンとは「()」で囲まれた部分。第一引数にある5個の括弧は、左側から順番に$1から$5まで割り当てられています。第二引数にはこれらの必要なサブパターンだけを組み込んで、新しい文章に書き換えています。何やら間抜けな文章しか思いつかなくて、ご愛敬としてお許しください。

実行すると、「ワードプレスでタイトルを削除して爆笑しよう。」と出力されます。

$p="wordpressでタイトルを変更してカスタマイズしよう。";
echo preg_replace('/(.*?)(変更)(.*?)(カスタマイズ)(.*)/', '$1削除$3爆笑$5', $p);

左カギカッコの直後にH1やH2などが無い「左カギカッコ」にマッチする。(?!は否定先読み)

実行結果は、「H2」ワードプレス「/H2」(DIV」変更(/DIV」

$p='「H2」wordpress「/H2」「DIV」変更「/DIV」';
echo preg_replace('/「(?!(H[\d]+|\/H[\d]+))/', '(', $p);

右カギカッコ直前にH1やH2などがない右カギカッコにマッチする。(?<!は否定後読み)

実行結果は、「H2」ワードプレス「/H2」「DIV)変更「/DIV)

$p='「H2」wordpress「/H2」「DIV」変更「/DIV」';
echo preg_replace('/(?<!H[\d])」/', ')', $p);

以下を実行するとHカギカッコ以外が普通のカッコになります。これをHタグに応用すると色々できます。ワードプレスはthe_contentフックで文字列を置き換えられますが、正規表現を使って特定のブロック内を指定すると、その中にある置き換えられるべき文字が置き換えられなくなります。もちろん、ブロックなどを指定しなければまとめて置き換えられます。しかし、ワードプレスでは、この部分は変更したいが、そっちは変更したくない、っていう時がしょっちゅうあります。そういった時に「否定先読み」や「否定後読み」は便利です。正規表現は他にもたくさんありますが、ここでは割愛します。

実行結果は、「H2」ワープレ「/H2」(DIV)カスタマイズ(/DIV)

$p='「H2」wordpress「/H2」「DIV」カスタマイズ「/DIV」';
$p = preg_replace('/「(?!(H[\d]+|\/H[\d]+))/', '(', $p);
echo preg_replace('/(?<!H[\d])」/', ')', $p);

まとめ

この記事では、ワープレのタイトルをカスタマイズする方法を述べてきましたが、これらのプログラムはワープレのfunctionsをはじめとする他のテンプレート内で利用するほうが多いかも知れません。特に記事のコンテンツに関わる部分には重宝するかとおもいます。正規表現に関しては割愛していますが、ワープレをいじる際、この正規表現と配列は非常によく使います。ワープレの独自関数などもたくさんありますが、phpのビルトインとは異なります。