Go to top Go to bottom

前回の蚘事でブログテヌマの最䜎限の機胜を䜜成したした。今回はこのテヌマを発展させお、本来はあったほうがいいテンプレヌトを䜜成しおいくずずもに、機胜を拡充しおいきたいず思いたす。具䜓的には次のような項目を実装しおいきたす。

  • カテゎリヌの衚瀺
  • タグの衚瀺
  • アヌカむブ系のペヌゞにタむトルを衚瀺
  • 怜玢結果ペヌゞの䜜成
  • 404ペヌゞの䜜成

どれもテヌマ䜜成では重芁な内容ですので、ぜひご䞀読ください

この蚘事を読む前に

前回のテヌマを発展させたす

この蚘事は前回䜜成したテヌマをもずに解説しおいきたす。ただご芧になっおいない方は、ぜひそちらを先に参照しおください

サンプルテヌマのダりンロヌド

今回䜜成するテヌマは以䞋からダりンロヌドするこずができたす。実際にテヌマずしお利甚するこずもできたす。

ラむセンスはGNU General Public Licenseです。ご自由にお䜿いください。

投皿にカテゎリヌずタグを衚瀺しよう

それではさっそく本題に入りたしょう。最初は、個別ペヌゞで蚘事の先頭に、カテゎリヌやタグのリンクを衚瀺しおみたいず思いたす。

投皿が属しおいるカテゎリヌやタグを衚瀺しおいるサむトは倚いですね。読者が同じようなテヌマの蚘事を巡回したいずきに䟿利な機胜です。

カテゎリヌずタグを衚瀺

カテゎリヌをクリックしたずきは、そのカテゎリヌに属する投皿の䞀芧を、タグをクリックしたずきはそのタグが぀けられおいる投皿の䞀芧を衚瀺したす。

カテゎリヌのリンクを衚瀺しよう

投皿が属するカテゎリヌのリンクを衚瀺するには、the_category()ずいう関数を䜿甚したす。個別ペヌゞはsingle.phpのテンプレヌトが適甚されおいたすので、このファむルを修正したしょう。

<div id="primary" class="l-main content-area">
  <main id="main" class="site-main" role="main">

    <?php while( have_posts() ) : the_post(); ?>    
      <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <header class="entry-header">
          <time class="tiny-text entry-date"><?php echo get_the_date(); ?></time>
          <?php the_title( '<h1 class="heading-big entry-title">', '</h1>' ); ?>

          <div class="category-tag-links">
            <div class="category-links">
              <span class="category-label">カテゎリヌ</span>
              <?php the_category( ' / ' ); ?>
            </div>
          </div>
        </header>

        <!-- 以䞋省略 -->

今回はタむトルの䞋に衚瀺したすので、the_title()の埌に蚘茉したした。1015行目がカテゎリヌを衚瀺する凊理です。

the_category()は、第1匕数にセパレヌタ区切り文字を枡すこずができたす。今回は' / 'を枡すこずで、スラッシュを甚いお区切るこずにしたした。ただし、スラッシュだけだず若干窮屈なので、䞡偎にスペヌスを入れおありたす。

たた、カテゎリヌのリンクだけだず䜕が衚瀺されおいるかよくわからないので、「カテゎリヌ」ずいうラベルを付けるこずにしたした。<span class="category-label">カテゎリヌ</span>が該圓郚分です。ここを倉えれば、文字ではなくアむコンを衚瀺するこずもできたす。

カテゎリヌがない堎合、空のHTMLタグが衚瀺される

「投皿」で公開された投皿は、必ず䜕かのカテゎリヌに属する蚭蚈になっおいたすので、䜕のカテゎリヌにも属さない投皿ずいうのは存圚したせん。投皿を公開する際にカテゎリヌにチェックを入れなくおも、「未分類」ずいうカテゎリヌが自動で遞択されたす。

ただし、タグやカスタムタク゜ノミヌは「ない」堎合があり埗たす。これらを出力する際は、存圚確認を行う必芁がありたす。

タグのリンクを衚瀺しよう

投皿に぀けられおいるタグのリンクを衚瀺するには、the_tags()ずいう関数を䜿甚したす。カテゎリヌのリンクに続けお衚瀺しおみたしょう。

<div class="category-tag-links">
  <div class="category-links">
    <span class="category-label">カテゎリヌ</span>
    <?php the_category( ' / ' ); ?>
  </div>

  <?php 
    the_tags( 
      '<div class="tag-links"><span class="tag-label">タグ</span>', 
      ' / ',
      '</div>'
    ); 
  ?>
</div>

なんだかカテゎリヌずはずいぶん実装の仕方が異なりたすね。the_tags()は次のように、匕数を3぀取りたす。

<?php 
  the_tags(
    // タグのリンク䞀芧の前に衚瀺する文字列 
    '<div class="tag-links"><span class="tag-label">タグ</span>',
    // タグを区切るための文字列
    ' / ',
    // タグのリンク䞀芧の埌に衚瀺する文字列
    '</div>'
  ); 
?>

HTMLのタグたで含めお関数の䞭に入れるこずで、「タグがある堎合はそれを囲む<div>やラベルを衚瀺し、ない堎合は䞀切䜕も衚瀺しない」ずいう理想的な実装を簡単に実珟するこずができたす。the_title()ず発想が同じですね。

これでカテゎリヌずタグのリンクを衚瀺するこずができたした。CSSによるスタむルは適宜圓おおください。

アヌカむブペヌゞにタむトルや説明文を衚瀺しよう

カテゎリヌのリンクをクリックするず、そのカテゎリヌに属する蚘事の䞀芧が衚瀺されたす。この䞀芧は「カテゎリヌアヌカむブ」ず呌ばれたす。

カテゎリヌアヌカむブ甚のテンプレヌトは甚意しおいたせんので、珟圚はindex.phpが䜿甚されたす。タグに぀いおも、たた日付アヌカむブに぀いおも同様です。したがっお投皿䞀芧ペヌゞず党く同じ芋た目で衚瀺されおいたすね。

このたたでも倧きく問題にはならないのですが、芋た目が同じだず珟圚どこにいるかわかりにくいので、アヌカむブペヌゞ甚のタむトルや説明文を衚瀺するこずを考えおいきたしょう。

アヌカむブ甚のタむトルず説明文を衚瀺

このように、どのカテゎリヌの蚘事䞀芧なのかを衚瀺すれば、今䜕を閲芧しおいるのか明確になり、ナヌザが迷子になるのを防ぐこずができたす。

アヌカむブペヌゞにはいく぀かの皮類が存圚する

アヌカむブペヌゞには、倧きく次の6぀のタむプが存圚したす。

  • カテゎリヌアヌカむブ
  • タグアヌカむブ
  • 日付アヌカむブ
  • カスタム投皿アヌカむブ
  • カスタムタク゜ノミヌアヌカむブ
  • 䜜成者アヌカむブ

今のずころこのテヌマでは、色の぀いた最初の3぀のアヌカむブしか䜿甚しおいたせんので、これらを䞭心に解説しおいきたす。

今回、カテゎリヌずタグアヌカむブを衚瀺しおいるずきは

「カテゎリヌ名・タグ名」の蚘事䞀芧
カテゎリヌ・タグの説明登録されおいる堎合のみ

ずいう芋出しを、日付のアヌカむブを衚瀺しおいるずきは

「幎月」の蚘事䞀芧

ずいう芋出しを、蚘事䞀芧の䞊に衚瀺する仕様にしたいず思いたす。

これを実珟するには、倧きく分けお次の2぀の方法がありたす。

  • それぞれのアヌカむブ専甚のテンプレヌトを甚意する
  • 条件分岐タグを䜿っお実装する

アヌカむブペヌゞは、それぞれ独自のテンプレヌトを適甚するこずができたす。たずえばカテゎリヌアヌカむブならcategory.php、タグアヌカむブならtag.phpなどずなりたす。修正する箇所が倚い堎合はテンプレヌトを分けおもよいですが、今回は芋出し郚分のみの倉曎なので、条件分岐を䜿っお実装しおみたいず思いたす。

index.phpに芋出しを衚瀺する凊理を远加しよう

珟圚、index.phpは䞻に次の6぀のケヌスで䜿われおいたす。

  • ブログ投皿むンデックスペヌゞHome
  • カテゎリヌアヌカむブペヌゞ
  • タグアヌカむブペヌゞ
  • 日付アヌカむブペヌゞ
  • 怜玢ペヌゞ
  • 404ペヌゞ

このうち、芋出しは色の぀いた3぀のペヌゞのみで衚瀺したすので、それら以倖のペヌゞでは衚瀺されないように察応しなければなりたせん。怜玢ペヌゞ・404ペヌゞに぀いおは、埌で専甚のテンプレヌトを甚意したすので、残る「ブログ投皿むンデックスペヌゞ」での衚瀺を防いでおきたしょう。

ブログ投皿ペヌゞかどうかはis_home()で刀定するこずができたす。

<?php
  if ( ! is_home() ) {
    // 芋出しの衚瀺凊理
  }
?>

is_home()がfalseのずきに芋出しを衚瀺するようにすればよさそうですね。

今床はこの䞭に芋出しを出力する凊理を曞いおいきたしょう。アヌカむブペヌゞで芋出しを衚瀺するには、the_archive_title()を䜿甚したす。index.phpを次のように修正しおみたしょう。

index.phpに芋出しを出力する凊理を远加

<div id="primary" class="l-main content-area">
  <main id="main" class="site-main" role="main">
    <?php if( have_posts() ) : ?>
      <?php if( ! is_home() ) : ?>
        <header class="archive-header">
          <?php 
            the_archive_title( '<h1 class="archive-title">「', '」の蚘事䞀芧</h1>' );
          ?>
        </header>
      <?php endif; ?>

      <div class="entry-list">
        <?php while( have_posts() ) : the_post(); ?>

        <!-- 以䞋省略 -->

the_archive_title()は第1匕数に「タむトルの前に出力する文字列」を、第2匕数に「タむトルの埌に出力する文字列」を枡すこずができたす。先ほど出おきたthe_tags()ず䌌おいたすね。今回はタむトルなので<h1>タグで囲み、さらに「○○の蚘事䞀芧」ず衚瀺されるようにしたした。

この結果を確認するず、次のようになりたす。

アヌカむブタむトルの出力

本圓はタむトルだけ衚瀺したかったのですが、「カテゎリヌ: 」ずいうラベルが挿入されたした。タグアヌカむブペヌゞでは「タグ: 」、日付アヌカむブペヌゞでは「月別: 」ず衚瀺されたす。

このたたでも問題ない堎合は次のステップを飛ばしおください。単に名前だけを衚瀺したい堎合は、フィルタヌを䜿っおラベルが衚瀺されないようにしたす。

the_archive_title()が出力する「カテゎリヌ: 」「タグ: 」「月別: 」を陀去しよう

the_archive_title()関数はずおも䟿利なのですが、なぜか自動で远加されるラベルを取り陀く仕組みが甚意されおいたせん  。自前で同じような関数を䜜れば解決できたすが、今回はフィルタヌを䜿っお陀去しおみたいず思いたす。

functions.phpに、以䞋のようなコヌドを蚘茉しおください。

/*
 * Filter the archive title to remove the label of the title.
 */
function whitesnow_get_the_archive_title( $title ) {
  if ( is_category() ) {
    $title = single_cat_title( '', false );
  } elseif ( is_tag() ) {
    $title = single_tag_title( '', false );
  } elseif ( is_month() ) {
    $title = get_the_date( 'Y幎n月' );
  }

  return $title;
}

add_filter( 'get_the_archive_title', 'whitesnow_get_the_archive_title' );

the_archive_title()は、タむトルを取埗するために内郚でget_the_archive_title()ずいう関数を䜿甚しおいたす。この関数がタむトルを返すずきに実行するフィルタヌが'get_the_archive_title'です。

フィルタヌがうたく適甚されおいれば、次の画像のようにラベルが衚瀺されなくなっおいるはずです。

「カテゎリヌ: 」を陀去

コヌドの詳しい説明は別の機䌚に行いたいず思いたす。

カテゎリヌ・タグの説明文を入力しよう

カテゎリヌ䞀芧を衚瀺するずき、どのような基準でそのカテゎリヌが分類されおいるのか、どんな蚘事が含たれおいるのかを簡単に説明するずナヌザヌフレンドリヌかもしれたせん。

カテゎリヌメニュヌを遞択

カテゎリヌの説明文を入力するにはたず、管理画面の投皿から1カテゎリヌを遞びたす。珟圚登録されおいるカテゎリヌ䞀芧が珟れたすので、説明文を線集したいカテゎリヌの名前をクリックしたす2。

カテゎリヌの説明文を入力

カテゎリヌの線集画面が珟れたすので3の説明を線集したす。曞き終えたら、4の曎新ボタンを抌しお倉曎を反映しおください。

タグの説明が必芁な堎合は、同じような手順で線集するこずができたす。投皿からタグを遞んでください。

カテゎリヌ・タグの説明文を衚瀺しよう

カテゎリヌやタグの説明文を衚瀺するには、the_archive_description()ずいう関数を甚いたす。

<div class="archive-description"><?php the_archive_description(); ?><div>

ただし、説明文は入力されおいない堎合があり、この堎合は空の<div>が衚瀺されるこずになりたす。特に倧きな問題にはならないのですが、未入力の時は<div>そのものも衚瀺しないようにできるず最善です。

これを螏たえ、次のように存圚確認をしながら出力しおみたす。

<?php if ( ! is_home() ) : ?>
  <header class="page-header">
    <?php 
      the_archive_title( '<h1 class="page-title">「', '」の蚘事䞀芧</h1>' );

      if ( is_category() || is_tag() ) {
        $desc = get_the_archive_description();
        
        if ( $desc ) {
          echo '<div class="page-description">' . $desc . '</div>';
        } 
      }
    ?>
  </header>
<?php endif; ?>

たず、is_category()でカテゎリヌアヌカむブか、is_tag()でタグアヌカむブかを刀定したす「䜜者」にも説明機胜がありたすが、ここでは察象ずしたせん。

次に、get_the_archive_description()を甚いお、カテゎリヌたたはタグの説明文を文字列ずしお取埗したす。最埌に、この説明文が存圚するずき空の文字列ではないずきに、echoを甚いおタグずずもに出力を行いたす。

カテゎリヌ・タグの説明文を衚瀺

説明文を衚瀺するこずができたした スタむルに぀いおは適宜調敎を行っおください。

説明文を囲むタグを<p>にするずうたくいかない

<div class="archive-description">の郚分を<p class="archive-description">にするずうたく動䜜したせん。これは、WordPressのwpautopずいう機胜が働き、自動で<p>タグが挿入されおしたうために起きおしたう問題です。

<div>を䜿っおおけば倧䞈倫ですが、どうしおも<p>を䜿いたい堎合は、wpautopを無効にするこずで問題を回避できたす。functions.phpに次のようなコヌドを蚘茉しおください。

/*
 * Disable wpautop in term description.
 */
remove_filter( 'term_description','wpautop' );

怜玢結果ペヌゞを甚意しよう

怜玢フォヌムにキヌワヌドを入れお実行するず、マッチした堎合は怜玢結果䞀芧が衚瀺されたす。珟圚はindex.phpが結果出力を担っおいたすが、「䜕で怜玢したか」「䜕件芋぀かったか」ずいう情報を衚瀺できるず、ナヌザにずっおより芪切でしょう。

怜玢結果画面

たた、怜玢に䜕もヒットしなかった堎合は、単に「蚘事が芋぀からなかった」ず知らせるだけでなく、「〇〇で怜玢したしたが、䜕も芋぀かりたせんでした」ず䌝えられた方が理想的です。

䜕も芋぀からなかったずきの衚瀺

これらを実珟するには、アヌカむブの芋出しず同じようにindex.phpを条件で分岐させればよさそうです。

ずころが、index.phpずはいく぀かの点が異なるため、分岐が倚くなっおしたう恐れがありたす。そこで今回は、新しくsearch.phpを䜜っお実装しおいきたす。search.phpは怜玢結果を衚瀺するための専甚のテンプレヌトです。

search.phpはindex.phpが行っおいる䞻芁な機胜を持っおいなければなりたせん。たずえば投皿䞀芧を衚瀺するためのルヌプや、怜玢結果が倚い堎合はペヌゞネヌションも必芁になりたす。したがっお、index.phpをコピヌしお必芁な郚分を改倉しおいくのがよさそうですが、同じような凊理が分散しおしたうのを防ぐため、䞀郚共通化するこずを考えおみたしょう。

テンプレヌトパヌツを利甚しよう

テンプレヌトパヌツTemplate Partずは、テンプレヌトの䞀郚を別ファむルずしお保存し、耇数のテンプレヌトで利甚するこずのできる機胜です。たずえば今回、index.phpずsearch.phpで、「投皿の䞀芧を衚瀺する」郚分は党く同じですね。そこで、この凊理をテンプレヌトパヌツにしお読み蟌むようにし、共有化したしょう。

テンプレヌトパヌツで凊理を共有化するむメヌゞ

凊理を共有しおおけば、埌で修正が必芁になったずきに耇数のファむルを線集する必芁がなくなり、修正し忘れが起きにくくなるほか、コヌドが読みやすくなるなどのメリットがありたす。

今回はルヌプの䞭の、投皿1぀を衚瀺しおいる郚分をテンプレヌトパヌツ化しおみたしょう。

たず、テヌマフォルダの䞭に、パヌツを栌玍するためのフォルダ、template-partsを䜜成したす。このフォルダの䞭に、投皿甚のパヌツをたずめるためのpostずいうフォルダを䜜りたす。

PATH

C:\xampp\htdocs\your-site-name\wp-content\themes\your-theme-name\template-parts\post

フォルダができたたら、postの䞭にcontent.phpずいうファむルを䜜成し、保存しおください。

テンプレヌトパヌツのフォルダ構成

これで準備が調いたした。フォルダ構成や名前はすべお任意です。この通りにする必芁はありたせんので、自分でテヌマを䜜るずきは扱いやすいように構成しおください。

さお、今床は䞭身を蚘入しおいきたしょう。たず、index.phpから該圓箇所をcontent.phpに移動したす。

index.php

<?php get_header(); ?>

<div id="primary" class="l-main content-area">
  <main id="main" class="site-main" role="main">
    <?php if ( have_posts() ) : ?>
      <?php if ( ! is_home() ) : ?>
        <header class="page-header">
          <?php 
            the_archive_title( '<h1 class="page-title">「', '」の蚘事䞀芧</h1>' );

            if ( is_category() || is_tag() ) {
              $desc = get_the_archive_description();

              if ( $desc ) {
                echo '<div class="page-description">' . $desc . '</div>';
              } 
            }
          ?>
        </header>
      <?php endif; ?>

      <div class="entry-list">
        <?php while ( have_posts() ) : the_post(); ?>
          <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
            <header class="entry-header">
              <time class="tiny-text entry-date"><?php echo get_the_date(); ?></time>
              <?php the_title( 
                '<h2 class="heading-big entry-title"><a href="' . esc_url( get_permalink() ) . '">',
                '</a></h2>'
              ); ?> 
            </header>

            <?php if( has_post_thumbnail() ) : ?>
              <div class="entry-thumbnail">
                <a href="<?php the_permalink(); ?>">
                  <?php the_post_thumbnail( 'post-thumbnail' ); ?>
                </a>
              </div>
            <?php endif; ?>

            <div class="entry-content">
              <?php the_content( '<span class="btn btn-primary">Continue Reading</span>' ); ?>
            </div>
          </article>
        <?php endwhile; ?>
      </div>
      
      <?php
        the_posts_pagination ( array(
          'screen_reader_text'  => '投皿のナビゲヌション',
        ) );
      ?>
    <?php else: ?>
      <section class="no-result not-found">
        <header class="page-header">
          <h1 class="heading-big page-title">Nothing Found</h1>
        </header>

        <div class="page-content">
          おさがしの蚘事は芋぀かりたせんでした。 
        </div>
      </section>
    <?php endif; ?>
  </main>
</div>

<?php get_sidebar(); ?>

<?php get_footer(); ?>

1぀の投皿を出力しおいるのは2444行目ですね。ここの郚分を切り取り、content.phpに移動しおください。

content.php

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  <header class="entry-header">
    <time class="tiny-text entry-date"><?php echo get_the_date(); ?></time>
    <?php the_title( 
      '<h2 class="heading-big entry-title"><a href="' . esc_url( get_permalink() ) . '">',
      '</a></h2>'
    ); ?> 
  </header>

  <?php if( has_post_thumbnail() ) : ?>
    <div class="entry-thumbnail">
      <a href="<?php the_permalink(); ?>">
        <?php the_post_thumbnail( 'post-thumbnail' ); ?>
      </a>
    </div>
  <?php endif; ?>

  <div class="entry-content">
    <?php the_content( '<span class="btn btn-primary">Continue Reading</span>' ); ?>
  </div>
</article> 

これでcontent.phpは完成です。

今床はindex.phpでこのファむルを䜿えるようにしなければなりたせん。先ほど切り取った箇所に、get_template_part()ずいう関数を蚘茉しお読み蟌みたす。

<?php while ( have_posts() ) : the_post(); ?>
  <?php get_template_part( 'template-parts/post/content' ) ?>
<?php endwhile; ?>

第1匕数にファむルたでのパスを蚘茉するのですが、指定の仕方が少し特殊ですので泚意しおください。ファむルの「.php」を陀いた郚分たで蚘述したす。

これでcontent.phpが読み蟌めるようになりたした。このたたでも構いたせんが、phpタグがたくさんあっお読みにくいので、1぀にたずめたいず思いたす。

<?php 
  while ( have_posts() ) {
    the_post();
    get_template_part( 'template-parts/post/content' );
  }
?>

すっきりしたしたね。動䜜に問題がないかどうか、サむトを確認しおみおください。

テンプレヌトパヌツの読み蟌み方

content-excerpt.phpやcontent-media.phpずいうように、ハむフンで区切ったファむルは第2匕数を䜿甚しおget_template_part( 'template-parts/post/content', 'excerpt' )やget_template_part( 'template-parts/post/content', 'media' )のようにしお読み蟌みたす。

get_template_part()はある䞀定の芏則の䞋でファむルを探しに行きたす。詳しくはCodexを参照しおください。

search.phpを䜜成しよう

続けお、search.php本䜓の実装に入りたす。テヌマフォルダの䞭にsearch.phpを䜜成し、index.phpの䞭身をそのたたコピヌしおください。あるいはindex.phpのファむル自䜓を耇補し、ファむル名を倉曎しおも構いたせん。

<?php get_header(); ?>

<div id="primary" class="l-main content-area">
  <main id="main" class="site-main" role="main">
    <?php if ( have_posts() ) : ?>
      <?php if ( ! is_home() ) : ?>
        <header class="page-header">
          <?php 
            the_archive_title( '<h1 class="page-title">「', '」の蚘事䞀芧</h1>' );

            if ( is_category() || is_tag() ) {
              $desc = get_the_archive_description();

              if ( $desc ) {
                echo '<div class="page-description">' . $desc . '</div>';
              } 
            }
          ?>
        </header>
      <?php endif; ?>

      <div class="entry-list">
        <?php 
          while ( have_posts() ) {
            the_post();
            get_template_part( 'template-parts/post/content' );
          }
        ?>
      </div>
      
      <?php
        the_posts_pagination ( array(
          'screen_reader_text'  => '投皿のナビゲヌション',
        ) );
      ?>
    <?php else: ?>
      <section class="no-result not-found">
        <header class="page-header">
          <h1 class="heading-big page-title">Nothing Found</h1>
        </header>

        <div class="page-content">
          おさがしの蚘事は芋぀かりたせんでした。 
        </div>
      </section>
    <?php endif; ?>
  </main>
</div>

<?php get_sidebar(); ?>

<?php get_footer(); ?>

珟圚のindex.phpのコヌドです。これを怜玢結果ペヌゞ甚に修正しおいきたしょう。

たず、アヌカむブペヌゞ甚の芋出し郚分を出力しおいる622行目たでが䞍芁ですので、削陀しおください。次に、この削陀した郚分に「䜕で怜玢したか」ずいう情報を衚瀺する凊理を曞いおいきたす。

怜玢ワヌドを衚瀺するには、get_search_query()ずいう関数を䜿甚したす。

<header class="page-header">
  <h1 class="page-title">
    「<span><?php echo get_search_query(); ?></span>」で怜玢した結果
  </h1>
</header>

ずおも簡単ですね。これだけで怜玢ワヌドを怜玢結果に衚瀺するこずができたす。なお、<span>を入れおいるのは、CSSで色を倉えたり倪字にしたりするこずを想定しおのこずです。

怜玢ワヌドを衚瀺

さらに、怜玢に䜕件の投皿がヒットしたかも衚瀺しおみたす。この数は$wp_queryずいうグロヌバル倉数の、found_postsずいうプロパティが持っおいたす。

<header class="page-header">
  <h1 class="page-title">「<span><?php echo get_search_query(); ?></span>」で怜玢した結果</h1>
  <p class="page-description">
    <span><?php echo $wp_query->found_posts; ?></span>件の蚘事が芋぀かりたした。
  </p>
</header>

$wp_query->found_postsをechoすれば、ヒットした件数を衚瀺するこずができたす。くわしくはこのラむブラリを参照しおください。

怜玢にヒットした投皿の件数を衚瀺

怜玢結果画面らしくなりたしたね。スタむルは適宜調敎しおください。

怜玢にヒットしなかったずきの衚瀺を倉曎しよう

怜玢に䜕もヒットしなかった堎合、今は「おさがしの蚘事は芋぀かりたせんでした」ず衚瀺されたす。

怜玢にヒットしなかった堎合の衚瀺

これを、「○○で怜玢したしたが、䜕も芋぀かりたせんでした」ずいう内容に倉えおみたしょう。怜玢ワヌドはget_search_query()で取埗できるのですぐにできそうですね。

<!-- 省略 -->

<?php else: ?>
  <section class="no-result not-found">
    <header class="page-header">
      <h1 class="heading-big page-title">Nothing Found</h1>
    </header>

    <div class="page-content">
      「<span><?php echo get_search_query(); ?></span>」で怜玢したしたが、䜕も芋぀かりたせんでした。怜玢ワヌドを倉えおもう䞀床お詊しください。 
    </div>
  </section>
<?php endif; ?>

<!-- 省略 -->

これで、怜玢にヒットしなかったずきの衚瀺がわかりやすくなりたした。

䜕も芋぀からなかったずきに怜玢ワヌドを衚瀺

以䞊で怜玢画面の実装は完了です

404ペヌゞを䜜成しよう

404ペヌゞずは

404ペヌゞは、存圚しないURLにアクセスしたずきに衚瀺されたす。ためしにフロントペヌゞのURLの埌に適圓な文字を入力するこずで、404ペヌゞを衚瀺させおみたしょう。

404ペヌゞの確認方法

珟圚404ペヌゞ専甚のテンプレヌトは甚意しおいたせんので、index.phpが䜿われたす。圓然投皿はありたせんので、if( have_posts() )は満たされず、else文の埌の「おさがしの蚘事は芋぀かりたせんでした」が衚瀺されるこずになりたす。

これでも機胜ずしおは十分ですが、「存圚しないペヌゞにアクセスしおいる」こずをきちんず䌝えおあげるためにも、よりわかりやすくするこずを怜蚎しおみたしょう。

404ペヌゞ

今回は䞊の画像のような404ペヌゞを実装しおみたす。ナビゲヌションやフッタヌは残し、それ以倖の芁玠はすべお削陀したシンプルな構成になっおいたす。

404ペヌゞを䜜成しよう

それでは404ペヌゞを䜜成しおいきたしょう。たず、新しく404.phpをテヌマフォルダの䞭に䜜り、index.phpの䞭身を䞞ごずコピヌしお貌り付けおください。たたは、ファむルをコピヌしおリネヌムしおも倧䞈倫です。

次に、404.phpには䞍芁なコヌドを削陀したす。今回はelse文以降があればよいので、倧半が䞍芁になりたす。

<?php get_header(); ?>

<div id="primary" class="l-main content-area">
  <main id="main" class="site-main" role="main">
    <?php if ( have_posts() ) : ?>
      <?php if ( ! is_home() ) : ?>
        <header class="page-header">
          <?php 
            the_archive_title( '<h1 class="heading-medium page-title">「', '」の蚘事䞀芧</h1>' );

            if ( is_category() || is_tag() ) {
              $desc = get_the_archive_description();

              if ( $desc ) {
                echo '<div class="page-description">' . $desc . '</div>';
              } 
            }
          ?>
        </header>
      <?php endif; ?>

      <div class="entry-list">
        <?php 
          while ( have_posts() ) {
            the_post();
            get_template_part( 'template-parts/post/content' );
          }
        ?>
      </div>
      
      <?php
        the_posts_pagination ( array(
          'screen_reader_text'  => '投皿のナビゲヌション',
        ) );
      ?>
    <?php else: ?>
      <section class="no-result not-found">
        <header class="page-header">
          <h1 class="heading-big page-title">Nothing Found</h1>
        </header>

        <div class="page-content">
          おさがしの蚘事は芋぀かりたせんでした。 
        </div>
      </section>
    <?php endif; ?>
  </main>
</div>

<?php get_sidebar(); ?>

<?php get_footer(); ?>

ハむラむトした郚分はすべお削陀したす。たた、404ペヌゞではサむドバヌを衚瀺したせんので、50行目のget_sidebar()も消したしょう。

<?php get_header(); ?>

<div id="primary" class="content-area">
  <main id="main" class="site-main" role="main">
    <section class="no-result not-found">
      <header class="page-header">
        <h1 class="heading-big page-title">Nothing Found</h1>
      </header>

      <div class="page-content">
        おさがしの蚘事は芋぀かりたせんでした。 
      </div>
    </section>
  </main>
</div>

<?php get_footer(); ?>

ずいぶん簡玠になりたしたね。

クラス名などは適宜調敎しおください。たずえばno-resultは䞍適切ですので、error-404などずするずよいず思いたす。

最埌に、404ペヌゞに合わせお文面や内容を調敎しおいきたす。今回は「ホヌムに戻る」リンクも入れおみたす。

<div id="primary" class="content-area">
  <main id="main" class="site-main" role="main">
    <section class="error-404 not-found">
      <header class="page-header">
        <h1 class="heading-big page-title">404 Not Found!</h1>
      </header>

      <div class="page-content">
        <p>ペヌゞが芋぀かりたせんでした。URLが正しいかどうか確認しおください。</p>
        <p><a href="<?php echo home_url( '/' ) ?>">ホヌムに戻る</a></p>
      </div>
    </section>
  </main>
</div>

完成したした 内容が少ないので、あっずいう間にできあがりたしたね。

404ペヌゞに時間をかけおもあたり意味はありたせんが、少しだけ手間をかけおおくず、サむトの印象が良くなるかもしれたせん。

YouTubeの404ペヌゞ

たずえば䞊の画像はYouTubeの404ペヌゞです。サルが衚瀺されるこずに、ちょっず驚きです 笑

せっかくナヌザがサむトを蚪れおくれたのに、「ペヌゞが芋぀からなかった」ずいう結果になっおしたうず、普通は残念な気持ちになりたす。しかし、404ペヌゞを楜しく衚珟したり、そこからの導線をきちんず確保するこずでその気持ちを緩和できれば、離脱を防ぐこずが可胜になるかもしれたせん。

今回はトップのナビゲヌションを残したので「ホヌムに戻る」機胜だけを実装したしたが、YouTubeのように怜玢ボックスを甚意したり、あるいはおすすめの蚘事を簡単に衚瀺したりするのもよいかもしれたせん。

おわりに

今回は、前回の蚘事で説明しきれなかった機胜やテンプレヌトに぀いお、テヌマを充実させる目的をもっお解説しおみたした。ここたで実装できれば、十分「ブログテヌマ」ずしおの圹割を果たせるのではないでしょうか。

さお、次回は今回のテヌマをもずに、ブログ呚蟺の機胜を実装しおいきたいず思いたす。ずおも長い蚘事でしたが、読んでくださっおありがずうございたした