【WordPressテーマの作り方 第10回】HTMLヘッダーを最適化しよう(header.php編)

「タイトルタグってどう書けばいい?」
「SNSシェア用の画像って自動で出るの?」
「SEOやブランディングにも効くってほんと?」

WordPressテーマ制作の中でも、実は軽視されがちなのが <head> 内の記述。
でも、ここにはSEO・SNS表示・ブランド印象など、サイトの“第一印象”を決める大切な情報が詰まっています。

今回は header.php を舞台に、「HTMLヘッダーの最適化」にフォーカスして解説していきます!

目次

✅ 今回のゴール

  • header.php の基本構造を理解する
  • OGPやTwitterカードなど、SNS対応のタグを正しく書く
  • SEO視点で「title」や「meta description」を整備する

1. header.php を作って基本構成を整えよう

まずは最小構成の例から👇

<!DOCTYPE html>
<!-- HTMLタグに言語情報(lang属性など)を出力 -->
<html <?php language_attributes(); ?>>
<head>
  <!-- サイトの文字コードを指定(WordPressの設定を使用) -->
  <meta charset="<?php bloginfo('charset'); ?>">
  <!-- レスポンシブ対応:ビューポートの初期設定 -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <!-- WordPressが自動で<title>などを出力するためのフック -->
  <?php wp_head(); ?>
</head>
<!-- 現在のページ情報に応じたクラスが body タグに自動で付与される -->
<body <?php body_class(); ?>>

✅ 併せて functions.php に追加すべきコード

// WordPressに<title>タグの自動出力を任せる設定(必須)
// これを有効にすると header.php から <title> を書かなくてよくなります
add_theme_support('title-tag');
<!-- 実際に出力される例 -->
<title>記事タイトル | サイト名</title>

❌ 旧コードでの間違い例

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

これは WordPress 4.4 以降は非推奨 で、現在では add_theme_support('title-tag') によって自動出力されます。

💡ポイント

  • wp_head()絶対に消してはいけません!
    → プラグインやWordPressコア機能がここを通じて必要なCSSやJSを読み込みます。

💡 Google は <title> を重要なランキング要素として見ています。

🔍 補足:bodyタグのクラス制御

<body <?php body_class(); ?>>

この body_class() によって、ページの種類に応じたクラス(例:single postid-123home blog など)が自動で付与され、CSSでの装飾切り替えなどに役立ちます。

2. SNS対策:OGPタグを設定しよう

SNSシェアで「変なタイトル・画像」にならないために、OGPの設定は超重要!

<!-- OGP基本設定 -->
<meta property="og:title" content="<?php the_title(); ?>"> // タイトルがすべてのページに出力される想定
<meta property="og:type" content="website">
<meta property="og:url" content="<?php echo esc_url(get_permalink()); ?>">
<meta property="og:image" content="<?php echo get_template_directory_uri(); ?>/img/ogp.jpg"> // 同じOGP画像がすべてのページに出力される想定
<meta property="og:site_name" content="<?php bloginfo('name'); ?>">
<meta property="og:description" content="<?php bloginfo('description'); ?>">

✅ タイトルが404ページなどでは出力しないよう制御

<?php if (is_single() || is_page()): ?>
  <meta property="og:title" content="<?php the_title(); ?>">
<?php endif; ?>

✅ 投稿ごとにOGP画像を切り替え

<?php
// アイキャッチが設定されている場合はそのURLを、なければデフォルト画像
if (has_post_thumbnail()) {
  $ogp_img = get_the_post_thumbnail_url(null, 'full');
} else {
  $ogp_img = get_template_directory_uri() . '/img/ogp.jpg';
}
?>
<meta property="og:image" content="<?php echo esc_url($ogp_img); ?>">

💡 OGP画像は絶対パス(http から始まるURL)で指定しましょう。SNS側が相対パスを正しく認識しないことがあります。

3. Twitterカードの設定も忘れずに

<!-- Twitterカード:summary_large_image で大きい画像表示 -->
<meta name="twitter:card" content="summary_large_image">
<!-- サイトのTwitterアカウント(あれば) -->
<meta name="twitter:site" content="@your_account">
<!-- Twitter上に表示する説明文(要約) -->
<meta name="twitter:description" content="ここに要約を入れる">

summary_large_image を使うと、画像つきの大きいカードが表示されます。

4. ファビコンとアイコンの設定

<link rel="icon" href="<?php echo get_template_directory_uri(); ?>/img/favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon" href="<?php echo get_template_directory_uri(); ?>/img/apple-touch-icon.png">

/img/ フォルダにアイコンを用意しておきましょう。

WordPress 4.3以降はカスタマイザーからもサイトアイコン(favicon)の設定が可能です!コードで制御したい場合は上記のように書きます。

5. meta description を出し分けよう(SEO対策)

<?php if (is_single() || is_page()): ?>
  <meta name="description" content="<?php echo esc_attr(get_the_excerpt()); ?>">
<?php else: ?>
  <meta name="description" content="<?php bloginfo('description'); ?>">
<?php endif; ?>

💡 get_the_excerpt() で抜粋が空だった場合、自動で本文の冒頭から生成されますが、より確実にしたい場合はカスタムフィールドなどで制御してもOKです。

投稿・固定ページでは get_the_excerpt() を使うと柔軟に対応できます。

✨ meta description を100文字でカットする例:

<?php if (is_single() || is_page()): ?>
  <?php
  // 抜粋を取得し、100文字にカット(マルチバイト対応)
  $desc = get_the_excerpt();
  $desc = mb_strimwidth($desc, 0, 100, '...');
  ?>
  <meta name="description" content="<?php echo esc_attr($desc); ?>">
<?php else: ?>
  <meta name="description" content="<?php bloginfo('description'); ?>">
<?php endif; ?>

💡 抜粋が長すぎる場合に備えて、mb_strimwidth() で文字数を制限しておくと安心です(例:100文字+「…」)

✅ よくある注意点まとめ

チェック項目説明
<title> は自動化できる?add_theme_support('title-tag') を使用すればOK
wp_head() は必須?絶対必要!消すとプラグインが動かない
OGP画像は絶対パス?はい。http(s):// で始まるフルURLで記述すること

🪄 あえてさらに磨くなら…

  • noindex指定:検索結果に出したくないページには <meta name="robots" content="noindex"> を条件分岐で出し分け
  • 構造化データ:JSON-LDを活用し、Googleリッチスニペット対応も◎ (参考:構造化データに関する一般的なガイドライン(Google))
  • 画像サイズ調整:SNS別に適した画像(例:Twitterは横長、LINEは正方形)を自動出力する工夫も可能

📏 SNSごとの推奨画像サイズ

  • Twitter:横長 1200×630px
  • Facebook:1200×630px
  • LINE:正方形 800×800px

📝 次回予告:「get_postsとWP_Queryの違いをマスターしよう」

次回は、テーマ制作でよく使う「投稿の取得」について。
get_posts()WP_Query の違い、そしてそれぞれの使いどころを丁寧に解説します!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Web制作会社勤務、業界歴10年以上。現場を走り回ってきた制作者。
これからWeb制作を学ぶ人に寄り添いながら、実務で役立つ知識をわかりやすくシェアします。
「ゼロぐらいから学べる!」をモットーに、あなたの“がんばろ”を応援します!

目次