成果物をまとめて確認する
[成果物]WordPressのタイトル設定とSEO最適化 – 階層構造を反映した動的生成の実装方法
【WordPressのタイトル設定とSEO最適化 – 階層構造を反映した動的生成の実装方法】の成果物です。投稿の学びを終えた時点の構成を一覧でご確認いただけます。
前回の記事では、wp_nav_menu
の「分析→理解→実装」のワークフローを通じて、WordPressが出力するHTMLの分析とパラメーター制御技術を学習しました。
今回は、SEOにおいて非常に重要な要素である「タイトル」について詳しく解説します。
SEO効果を最大化するためには、各ページに適切なタイトルを設定する必要があります。WordPressのようなCMSでは、多数のページを手動で管理するのは現実的ではないため、ページの種類に応じてタイトルを動的に生成する機能が重要になります。その具体的な実装方法を実践的に学んでいきましょう。
今回の目標
目次
Webサイトにおけるタイトルは、大きく分類して2つあります。
この2つを適切に設定することで、ユーザーにとって分かりやすく、SEO効果の高いWebサイトを構築できます。
HTMLの基本ルールとして、Webサイト内のすべてのWebページは異なるタイトル(一意のタイトル)を持つ必要があります。これは技術的要件であり、どのWebサイトでも守るべき基本ルールです。
また、SEOの観点から、階層構造を反映したタイトル設定が推奨されています。階層構造を含むタイトルは、検索エンジンとユーザーの両方にとってページの位置づけを明確にし、Webサイト全体の利便性を向上させます。
具体的なメリットは以下の通りです。
このような理由から、単純なページタイトルよりも階層構造を含むタイトルの方が、SEO効果とユーザー体験の両面で優れていると言えます。
検索エンジンがページの内容を正確に理解し、ユーザーが迷わずに目的の情報を見つけられるように、以下のような階層構造でタイトルを設定します。
現在のheader.phpのtitleタグを確認してみましょう。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php the_title(); ?></title>
<?php wp_head();?>
</head>
<body>
<header class="global-header">
<h1><?php the_title();?></h1>
<?php wp_nav_menu( 'header-menu' ); ?>
</header>
<main>
6行目のtitle
タグがヘッダータイトルです。
この状態では、すべてのページで
、すなわち固定ページのタイトルが表示されてしまいます。the_title()
具体的には、
となります。
しかし、検索エンジンとユーザーにとって分かりやすいタイトル構成は、
であり、ページおよびページの階層に合わせたヘッダータイトルにする必要があります。
WordPressにはget_bloginfo()
という関数が用意されており、サイトの基本情報を取得することができます。主な使用例は以下の通りです。
get_bloginfo('name')
:サイトのタイトルを取得get_bloginfo('description')
:サイトのキャッチフレーズを取得get_bloginfo('url')
:サイトのURLを取得今回のヘッダータイトルでは、get_bloginfo('name')
を使用してサイトタイトルを動的に表示します。
WordPressでヘッダータイトルを動的に設定する方法は、主に2つあります。
まずは理解しやすい方法1から始めて、その後により良い方法2を学んでいきましょう。
最初に、header.phpファイルに直接PHPコードを書いて動的なタイトルを生成してみましょう。
現状のheader.phpのtitle
タグ部分を確認します。
<title><?php the_title(); ?></title>
トップページかどうかを判定し、タイトルを動的に変更します。WordPressでは、この判定にis_front_page()
関数を使用します。
<title>
<?php if (is_front_page()) : ?>
<?php bloginfo('name'); ?>
<?php else : ?>
<?php the_title(); ?>|<?php bloginfo('name'); ?>
<?php endif; ?>
</title>
この実装により
親ページがある場合の階層も反映するように改良します。
前提条件:
現在表示中のページに親ページがあるかを判断するために、以下の手順を使用します
wp_get_post_parent_id(get_the_ID())
で現在のページの親ページIDを取得get_the_ID()
は現在表示中のページIDを取得しますwp_get_post_parent_id
は指定したページIDの親ページのIDを取得しますこの処理を実現するコードは以下の通りです。
<title>
<?php
if (is_front_page()) {
// サイトタイトルを表示
bloginfo('name');
} else {
// 現在表示中のページタイトルを表示
the_title();
// 現在ページの親ページIDを取得
$parent_id = wp_get_post_parent_id(get_the_ID());
// 親ページが存在する場合(IDが0以外)、親ページのタイトルを追加
if ($parent_id) {
// 親ページのタイトルを表示
echo '|';
echo get_the_title($parent_id);
}
// サイトタイトルを表示
echo '|';
bloginfo('name');
}
?>
</title>
header.phpに直接書く方法は理解しやすいですが、WordPressのベストプラクティスとしてfunctions.phpでフィルターを使う方法があります。
この方法の本質的なメリットは、WordPressのタイトル管理システムとの統合にあります。
wp_head()
で自動出力される<title>
タグの内容を安全に制御できる<title>
タグ自動設置機能と連携し、設置漏れを防ぐheader.phpに直接書く方法は「その場しのぎの解決」で、WordPressのタイトル管理システムを迂回してしまいます。一方、フィルターを使う方法は「WordPressの設計思想に沿った解決」で、システム全体との統合を実現します。
まずfunctions.phpに以下の関数を追加します。
function custom_document_title($title) {
/* ここにタイトル取得処理 */
}
add_filter('pre_get_document_title', 'custom_document_title');
'pre_get_document_title'
は、WordPressがタイトルを取得するアクションです。
WordPressがタイトルを取得するとき、custom_document_title
を実行するようになります。
基本的にはheader.phpに記述したコードと同じです。大きな違いは「表示」ではなく「取得」になることです。
表示はWordPressが行うため、functions.phpでは取得するだけになります。
<?php
function custom_document_title($title) {
$custom_title = '';
if (is_front_page()) {
// サイトタイトルを取得
$custom_title = get_bloginfo('name');
} else {
// 現在表示中のページタイトルを取得
$custom_title = get_the_title();
// 現在ページの親ページIDを取得
$parent_id = wp_get_post_parent_id(get_the_ID());
// 親ページが存在する場合(IDが0以外)、親ページのタイトルを追加
if ($parent_id) {
// 親ページのタイトルを取得
$custom_title = $custom_title . '|';
$custom_title = $custom_title . get_the_title($parent_id);
}
// サイトタイトルを取得
$custom_title = $custom_title . '|';
$custom_title = $custom_title . get_bloginfo('name');
}
return $custom_title;
}
add_filter('pre_get_document_title', 'custom_document_title');
表示から取得に変えるために、bloginfo
がget_bloginfo
にthe_title
がget_the_title
に変わっています。
get_
をつけ忘れるとタイトルが2重に表示されることになるので注意してください。
これまでは、head
タグにtitle
タグを入れてヘッダータイトルを表示していました。
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php the_title(); ?></title>
<?php wp_head();?>
</head>
これはデフォルトの設定では、wp_head()
がtitle
タグを出力しないからです。
wp_head()
がtitle
タグを出力するように設定を変更できます。
<?php
// 外観→メニューの有効化
add_theme_support( 'menus' );
// titleタグの有効化
add_theme_support( 'title-tag' );
functions.phpにadd_theme_support( 'title-tag' )
を入れることで、wp_head()
がtitle
タグを出力するようになります。
wp_head()
がtitle
タグを出力するようになるとhead
タグに手動でtitle
タグを設置した場合、title
タグが重複するため注意が必要です。
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<?php wp_head();?>
</head>
wp_head
がtitle
タグを出力するため、title
タグを消します。
HTMLの基本ルールとして、1つのWebページにH1
タグは1つだけが推奨されています。これは技術的要件であり、どのWebサイトでも守るべき基本ルールです。
また、検索エンジンとユーザーにとって分かりやすいサイト構造にするため、H1
タグの適切な使い分けが重要です。
トップページ:サイトタイトルやロゴがH1
でOK
下層ページ:ページのタイトルをH1
にする。サイトタイトルやロゴはH1
以外(例:
)にする<div class="logo">
多くのWebサイトで間違った実装が見られます。
現在のheader.phpを確認してみましょう。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<?php wp_head();?>
</head>
<body>
<header class="global-header">
<h1><?php the_title();?></h1>
<?php wp_nav_menu( 'header-menu' ); ?>
</header>
<main>
この状態では、すべてのページでthe_title()
がh1
タグになってしまいます。
具体的には
となっています。
しかし、SEOベストプラクティスに従った正しいH1の使い方は
このように、現在のWordPress実装では適切なH1の使い分けができていません。
現状のタイトルの問題と理想のタイトルが明確になりましたので、さっそく実践してみましょう。
トップページではサイトタイトルをh1
タグ、それ以外のページではサイトタイトルをdiv
タグにします。
ただし、同じスタイルになるようlogo
クラスを付与します。
<header class="global-header">
<?php if (is_front_page()) { ?>
<h1 class="logo"><?php bloginfo('name'); ?></h1>
<?php } else { ?>
<div class="logo"><?php bloginfo('name'); ?></div>
<?php } ?>
<?php wp_nav_menu('header-menu'); ?>
</header>
このコードはさらに効率的に書くことができます。
<header class="global-header">
<?php $tag = is_front_page() ? 'h1' : 'div'; ?>
<<?php echo $tag; ?> class="logo"><?php bloginfo('name'); ?></<?php echo $tag; ?>>
<?php wp_nav_menu('header-menu'); ?>
</header>
トップページかそれ以外かによって、h1
タグとdiv
タグのようにタグだけが変われば良いのです。
トップページ以外は、main
タグの中にh1
タグでページタイトルを表示します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<?php wp_head();?>
</head>
<body>
<header class="global-header">
<?php $tag = is_front_page() ? 'h1' : 'div'; ?>
<<?php echo $tag; ?> class="logo"><?php bloginfo('name'); ?></<?php echo $tag; ?>>
<?php wp_nav_menu('header-menu'); ?>
</header>
<main>
<?php if (!is_front_page()) : ?>
<h1 class="page-title"><?php the_title(); ?></h1>
<?php endif; ?>
スタイルシートでサイトタイトルとページタイトルの見た目を調整します。
/* サイトタイトル */
.global-header .logo {
font-size: 3.0rem;
font-weight: bold;
color: #333;
margin: 0;
}
/* ページタイトルのスタイル */
.page-title {
font-size: 2.0rem;
color: #333;
margin-bottom: 2.0rem;
border-bottom: 2px solid #ddd;
padding-bottom: 1.0rem;
}
念のためsub.cssのコードはすべて削除します。
今回は、WordPressにおけるタイトル設定の実践的な方法を学習しました。
学んだ重要なポイント
WordPressでの実装方法
pre_get_document_title
フィルターを使用した実装が推奨is_front_page()
による適切な分岐これらの技術をマスターすることで、検索エンジンとユーザーにとって分かりやすく、HTMLの基本ルールに従ったWordPressサイトを構築できるようになります。
次回は「投稿」について解説します。
WordPressでは投稿機能がブログとして使われることが一般的ですが、ビジネス系サイトでは「お知らせ」や「ニュース」などの用途で活用されることが多くあります。
まずは投稿の概要について、固定ページとの違いを中心に説明する予定です。
これらの違いを理解することで、コンテンツの性質に応じた適切な使い分けができるようになります。
次回もお楽しみに!
この記事で作成した成果物は、以下のページでまとめて確認することができます。
wp_nav_menuを例にWordPressの関数が生成するHTMLを分析し「分析→理解→実装」のワークフローを体験します。WordPressが付与するCSSクラスの意味を理解し、ドロップダウンメニューを段階的に実装します。検証ツールを使った構造分析から、効率的なCSS設計まで、他の関数でも応用できる普遍的なスキルを習得できます。
WordPressの投稿と固定ページの基本概念と違いについて詳しく解説します。それぞれの技術的特徴、URL構造、階層構造の有無、分類機能(カテゴリー・タグ)、SEO的な違いを比較表とともに説明。カスタム投稿の概念や投稿一覧ページとの関係、投稿タイプ(pageとpost)の概念についても触れ、効率的なWordPress運用のための基礎知識を学習できます。
WordPressを効率よく確実に学ぶためには、学習の順序が大切です。知識が自然に積み上がるよう、学習ステップに沿って記事を順番に並べています。
学習ストーリー第24話まで掲載中