sidebar.phpとsearch.phpの制作

それでは次に「sidebar.php」と「search.php」を作成していきましょう。サイドバーには「検索ボックス」「カテゴリーリンク」「管理人情報」の3点だけを表示しています。

検索ボックスを設置する場合、検索結果を表示するページが必要になりますので、そのために「search.php」を作成します。検索ボックスは記事数が多いサイトにはとても便利な機能です。

こちらの「デモサイト」から実際のページを確認して頂けます。

sidebar.phpを作成する

「sidebar.php」に表示している内容は「検索ボックス」「カテゴリーリンク」「管理人情報」だけのシンプルな形です。ソースコードも短いので中身を確認してみてください。

sidebar.php

                	
  1. <aside id="sideWrap">
  2.   <div id="sideBox">
  3.     <div class="searchBox">
  4.       <form method="get" action="<?php echo home_url('/'); ?>">
  5.         <input type="text" name="s" class="search" placeholder="検索キーワード">
  6.         <input type="submit" class="btn" value="検索する">
  7.       </form>
  8.     </div>
  9.     <div class="sideNav">
  10.       <nav>
  11.         <ul>
  12.           <?php
  13.             $args = array(
  14.               'parent' => 0,
  15.               'orderby' => 'term_order',
  16.               'order' => 'ASC'
  17.             );
  18.             $categories = get_categories( $args );
  19.           ?>
  20.           <?php foreach( $categories as $category ) : ?>
  21.           <li><a href="<?php echo get_category_link( $category->term_id ); ?>"><?php echo $category->name; ?></a></li>
  22.           <?php endforeach; ?>
  23.         </ul>
  24.       </nav>
  25.     </div>
  26.     <?php dynamic_sidebar('sidebar-item'); ?>
  27.   </div>
  28. </aside>

それでは「sidebar.php」のコードもコピペしておきましょう。簡単なところから説明すると、「sideNav」というクラス名の中身が各カテゴリーページへのリンクメニュー部分です。

                	
  1. <?php
  2.   $args = array(
  3.     'parent' => 0,
  4.     'orderby' => 'term_order',
  5.     'order' => 'ASC'
  6.   );
  7.   $categories = get_categories($args);
  8. ?>
  9. <?php foreach($categories as $category) : ?>
  10. <li><a href="<?php echo get_category_link($category->term_id); ?>"><?php echo $category->name; ?></a></li>
  11. <?php endforeach; ?>

この記述は見覚えがありますよね。そうです、「header.php」に記述したドロワー(三本線)メニューの記述とまったく同じです。このコードでカテゴリーページのURLとカテゴリー名を出力しています

                	
  1. <div class="searchBox">
  2.   <form method="get" action="<?php echo home_url('/'); ?>">
  3.     <input type="text" name="s" class="search" placeholder="検索キーワード">
  4.     <input type="submit" class="btn" value="検索する">
  5.   </form>
  6. </div>

そして検索ボックスを作るのも難しくないです。たったこれだけのコードで検索ボックスは作れてしまいます。重要なのは「form」タグと「type=”text”」の「input」タグの記述です。

「form」タグの「method」属性に「get」、「action」属性に「<?php echo home_url(‘/’); ?>」、そして「input」タグの「name」属性には「s」と記述します。

                	
  1. <?php dynamic_sidebar('sidebar-item'); ?>

こちらのコードでウィジェットが出力されます。ウィジェットは管理画面で設定する事が可能です。サンプルブログはできるだけファイルを編集しなくても良いように作りましたので、あえてウィジェットを利用しています。

竹馬

ワードプレスってちょっと記述が違うだけでエラーが出たりしてしまうんですよ。僕もはじめて検索ボックスを設置した時に「s」の記述漏れをやらかしてしまいました(笑)。

サイドデザインをstyle.cssに追加

「sidebar.php」を作りましたので、サイドバーのデザインも「style.css」に追加しておきましょう。前回までに記述したコードの下へ追加しておいてください。

style.css

                	
  1. ~テーマ情報省略~
  2. ~共通デザイン省略~
  3. ~main・パンくず・mainContents省略~
  4. ~ヘッダー・フッター省略~
  5. /* ------ aside ------ */
  6. .mainInner aside {
  7.   width: 26%;
  8.   max-width: 300px;
  9.   vertical-align: top;
  10.   padding-bottom: 60px;
  11.   display: inline-block
  12. }
  13. .mainInner aside #sideBox {
  14.   width: 100%;
  15.   max-width: 300px
  16. }
  17. /* serach box */
  18. .mainInner aside .searchBox .formBox { font-size: 0 }
  19. .mainInner aside .searchBox input[type="text"] {
  20.   width: calc(100% - 80px);
  21.   height: 36px;
  22.   font-size: 1.4rem;
  23.   font-family: "Kiwi Maru", "Yu Gothic", "YuGothic", "Hiragino Kaku Gothic Pro", "Meiryo UI", "Meiryo", "MS PGothic", sans-serif;
  24.   line-height: 36px;
  25.   vertical-align: top;
  26.   padding: 0 10px;
  27.   border: 1px solid #c1c1c1;
  28.   border-right: none;
  29.   display: inline-block
  30. }
  31. .mainInner aside .searchBox input[type="text"]:-webkit-autofill { -webkit-box-shadow: 0 0 0 1000px white inset }
  32. .mainInner aside .searchBox input[type="submit"] {
  33.   width: 80px;
  34.   height: 36px;
  35.   color: #fff;
  36.   font-size: 1.3rem;
  37.   font-family: "Kiwi Maru", "Yu Gothic", "YuGothic", "Hiragino Kaku Gothic Pro", "Meiryo UI", "Meiryo", "MS PGothic", sans-serif;
  38.   line-height: 36px;
  39.   vertical-align: top;
  40.   border: none;
  41.   background: #ff657c;
  42.   display: inline-block
  43. }
  44. /* side nav */
  45. .mainInner aside .sideNav { margin-top: 40px }
  46. .mainInner aside nav ul {
  47.   padding: 0 10px;
  48.   background: #fff
  49. }
  50. .mainInner aside nav li {
  51.   font-size: 1.6rem;
  52.   line-height: 50px;
  53.   position: relative
  54. }
  55. .mainInner aside nav li + li { border-top: 1px dashed #c1c1c1 }
  56. .mainInner aside nav li {
  57.   font-size: 1.5rem;
  58.   position: relative
  59. }
  60. .mainInner aside nav a {
  61.   position: relative;
  62.   display: block
  63. }
  64. .mainInner aside nav li a { padding: 0 10px }
  65. .mainInner aside nav a::after {
  66.   content: "";
  67.   width: 100%;
  68.   height: 2px;
  69.   margin: auto;
  70.   background: #fff;
  71.   position: absolute;
  72.   right: 0;
  73.   bottom: 0;
  74.   left: 0;
  75.   transform: scale(0, 1);
  76.   transform-origin: center top;
  77.   transition: transform .3s
  78. }
  79. @media screen and (max-width: 900px) {
  80.   .mainInner aside {
  81.     width: 100%;
  82.     max-width: inherit;
  83.     padding-bottom: 40px;
  84.     display: block
  85.   }
  86.   .mainInner aside #sideBox { max-width: inherit }
  87. }
  88. /* author */
  89. .mainInner aside .author {
  90.   padding: 20px;
  91.   margin-top: 40px;
  92.   background: #fff
  93. }
  94. .mainInner aside .author .authorTop {
  95.   font-size: 0;
  96.   text-align: center;
  97.   padding-bottom: 20px;
  98.   border-bottom: 1px dashed #c1c1c1
  99. }
  100. .mainInner aside .author .imageWrap {
  101.   width: 60px;
  102.   vertical-align: middle;
  103.   margin-right: 30px;
  104.   display: inline-block
  105. }
  106. .mainInner aside .author .imageWrap img { width: 100% }
  107. .mainInner aside .author .nameWrap {
  108.   vertical-align: middle;
  109.   display: inline-block
  110. }
  111. .mainInner aside .author .nameWrap p { font-size: 2rem }
  112. .mainInner aside .author .nameWrap p span {
  113.   font-size: 1.2rem;
  114.   display: block
  115. }
  116. .mainInner aside .author .txtWrap {
  117.   text-align: center;
  118.   font-size: 1.6rem;
  119.   margin-top: 20px;
  120.   background: #fff;
  121.   position: relative
  122. }
  123. .mainInner aside .author .txtWrap::before {
  124.   content: "";
  125.   margin-left: -11px;
  126.   border: 12px solid transparent;
  127.   border-bottom: 12px solid #fff;
  128.   position: absolute;
  129.   top: -24px;
  130.   left: 50%;
  131.   z-index: 2
  132. }
  133. .mainInner aside .author .txtWrap a {
  134.   color: #ff657c;
  135.   text-decoration: underline
  136. }

ココのデザインに関しては特に問題ないですが、サイドバーに関してひとつお伝えしておくと、サンプルブログではページを下へスクロールしていくとサイドバーが付いてくるように設定しています。

この動きはチェピレアでも実装しているのでパソコンでご覧の方は確認してみてください。

通常であればスクロールするとサイドバーは上部に取り残され、長いページの場合はサイドバーのスペースが空白になってしまいます。ココを空白にするのは淋しいし勿体ない。

なのでサンプルブログではどんなに長いページでもサイドバーが表示されるようにしているというワケです。設定自体はJSファイルでおこなっていますので、後の「main.jsを作成する」で紹介させて頂きます。

サイト管理人の設定方法

準備が整いましたので管理画面のウィジェットを利用して「管理人情報」を作成していきましょう。その際にご自身の写真やイラストなどがあれば、印象アップの効果があります。

竹馬

ちなみに僕は「chappie」というアプリでプロフィール画像を作っています。こちらは「App Store」しか取り扱っていないようですが良ければチェックしてみてください。

サンプルブログのアイコンサイズは「横幅60px × 高さ60px」で表示しています。アイコンの形は正方形でも円形でもどちらでも構いません。

テーマの有効化

それでは管理画面でテーマの切り替えをおこないます。「外観」→「テーマ」と進んで、作成したテーマにマウスを重ねると現れる「有効化」をクリックします。

まだテーマフォルダをアップロードしていない方は、FTPソフトを使ってルートディレクトリにある「wp-content」の中の「themes」の中にテーマフォルダを設置しておいてください。

メディアの追加

次にプロフィール画像をアップロードします。「メディア」→「ライブラリ」と進んで、「新規追加」から画像をアップロードします。画像をアップロードすると「ファイルのURL」も表示されますのでメモっておいてください。

ウィジェットの設定

最後に管理人情報を設定していきます。「外観」→「ウィジェット」と進んで、「サイドバー」内にあるブロックを開いて、下記のコードを記述して「保存」をクリックします。

                	
  1. <div class="authorTop">
  2.   <div class="imageWrap">
  3.     <img src="https://chepirare.com/sample/02/wp-content/uploads/2022/02/user.png" alt="竹馬" title="竹馬">
  4.   </div>
  5.   <div class="nameWrap">
  6.     <p>竹馬<br><span>サイト管理人</span></p>
  7.   </div>
  8. </div>
  9. <div class="txtWrap">
  10.   <p>こちらは<a href="https://chepirare.com/">チェピレア</a>が制作したサンプルのブログサイトです。ワードプレスの設置からサイトの作り方までを解説しています。ご自身のブログサイトを持ちたいとお考えの方はぜひ参考になさってください。</p>
  11. </div>

このままだとサンプルブログの情報なので、「プロフィール画像のURL」「名前」「紹介文」はご自身のものに書き換えてください。プロフィール画像のURLは先ほどメモったURLです。

ウィジェットの「サイドバー」の中は記述したブロックひとつだけでOKです。デフォルトではいくつかのブロックが用意されていると思いますので、他のブロックは削除しておいてください。

竹馬

この状態で一度サイトをチェックしてみましょう。管理人情報も表示されているかと思います。まだカテゴリーを作成していないのでリンクは表示されない状態です。

search.phpを作成する

続いて「search.php」を作成していきますので、下記のコードをコピペしておいてください。検索結果を表示する際には、いくつかの条件分岐を設定する必要があります。

search.php

                	
  1. <?php get_header(); ?>
  2. <main>
  3.   <div class="breadcrumbWrap">
  4.     <ol itemscope="" itemtype="https://schema.org/BreadcrumbList">
  5.       <li itemscope="" itemtype="https://schema.org/ListItem" itemprop="itemListElement">
  6.         <a itemprop="item" href="<?php echo esc_url(get_home_url()); ?>">
  7.           <img src="<?php bloginfo('template_url'); ?>/img/icon_home.svg" alt="">
  8.           <span itemprop="name">ホーム</span>
  9.         </a>
  10.         <meta itemprop="position" content="1">
  11.       </li>
  12.       <li itemscope="" itemtype="https://schema.org/ListItem" itemprop="itemListElement">
  13.         <span itemprop="name">「<?php the_search_query(); ?>」の検索結果</span>
  14.         <meta itemprop="position" content="2">
  15.       </li>
  16.     </ol>
  17.   </div>
  18.   <div class="mainInner">
  19.     <div id="mainContents" class="mainContents">
  20.       <section id="category">
  21.         <div class="title">
  22.           <h1>「<?php the_search_query(); ?>」の検索結果</h1>
  23.         </div>
  24.         <div class="inner">
  25.           <div class="postWrap">
  26.             <?php if (empty(get_search_query())): ?>
  27.             <div class="notFoundWrap">
  28.               <p>検索キーワードが未入力です。<br>もう一度検索して頂くかサイトマップからご確認ください。</p>
  29.               <div class="btn">
  30.                 <a href="<?php echo esc_url(get_home_url()); ?>/sitemap/">サイトマップ</a>
  31.               </div>
  32.             </div>
  33.             <?php else : ?>
  34.               <?php if ( have_posts() ) : ?>
  35.               <?php while ( have_posts() ) : the_post(); ?>
  36.               <article>
  37.                 <a href="<?php the_permalink(); ?>">
  38.                   <figure class="thumbnail">
  39.                     <?php if(has_post_thumbnail()) { echo the_post_thumbnail(); } ?>
  40.                   </figure>
  41.                   <div class="txt">
  42.                     <h2 itemprop="headline"><?php echo get_the_title(); ?></h2>
  43.                   </div>
  44.                 </a>
  45.               </article>
  46.               <?php endwhile; ?>
  47.               <?php else : ?>
  48.               <div class="notFoundWrap">
  49.                 <p>「<?php the_search_query(); ?>」を含む記事が見つかりませんでした。<br>別のキーワードで検索して頂くかサイトマップからご確認ください。</p>
  50.                 <div class="btn">
  51.                   <a href="<?php echo esc_url(get_home_url()); ?>/sitemap/">サイトマップ</a>
  52.                 </div>
  53.               </div>
  54.               <?php endif; ?>
  55.             <?php endif; ?>
  56.           </div>
  57.           <div class="paginationWrap">
  58.             <?php wp_pagination(); ?>
  59.           </div>
  60.         </div>
  61.       </section>
  62.       <div class="recommend">
  63.         <div class="title">
  64.           <h2>その他の記事</h2>
  65.         </div>
  66.         <div class="postWrap">
  67.           <?php
  68.           $args = array(
  69.             'post_type' => 'post',
  70.             'posts_per_page' => 6,
  71.             'orderby' => 'rand'
  72.           );
  73.           $the_query = new WP_Query($args);
  74.           while ($the_query->have_posts()) : $the_query->the_post();
  75.           ?>
  76.           <article>
  77.             <a href="<?php the_permalink(); ?>">
  78.               <figure class="thumbnail">
  79.                 <?php if(has_post_thumbnail()) { echo the_post_thumbnail(); } ?>
  80.               </figure>
  81.               <div class="txt">
  82.                 <h3 itemprop="headline"><?php echo get_the_title(); ?></h3>
  83.                 <div class="cattegory">
  84.                   <p><?php $cat = get_the_category(); $cat = $cat[0]; { echo $cat->cat_name; } ?></p>
  85.                 </div>
  86.               </div>
  87.             </a>
  88.           </article>
  89.           <?php endwhile; ?>
  90.         </div>
  91.       </div>
  92.     </div>
  93.     <?php get_sidebar(); ?>
  94.   </div>
  95. </main>
  96. <?php get_footer(); ?>

「search.php」の中身は大きく分けて「パンくずリスト」「検索結果」「その他の記事」です。ココでは「検索結果」の表示を解説して、「その他の記事」に関しては後の「archive.phpを作成する」でご紹介させて頂きます。

条件分岐の記述には「if文」を使用します。if文とは「もし~なら●●をする、~でなければ○○をする。」という指示を加えた設定です。検索結果の設定にはこの「if文」の中にさらに「if文」を入れていきます。

                	
  1. <?php if (empty(get_search_query())): ?>
  2. // 検索ワードが未入力の場合
  3. <?php else : ?>
  4. // 検索ワードが入力されている場合
  5.   <?php if ( have_posts() ) : ?>
  6.   ・
  7.   // 検索ワードに該当する記事がある場合
  8.   ・
  9.   <?php else : ?>
  10.   ・
  11.   // 検索ワードに該当する記事がない場合
  12.   ・
  13.   <?php endif; ?>
  14. <?php endif; ?>

上記は検索結果で設定されているPHPの「if文」のみを取り出したコードです。これだけで見てもらうと「if文」の中に「if文」がある(入れ子)状態というのがわかってもらえるかと思います。

「<?php if (empty(get_search_query())): ?>」の意味は「検索ワードが未入力の場合」です。「<?php else : ?>」は「それ以外」という意味なので、今回で言うと「検索ワードが入力されている場合」となります。

さらに「検索ワードが入力されている場合」には、「該当する記事がある場合」と「該当する記事がない場合」という条件も追加しています。「if文」の終わりには「<?php endif; ?>」の記述も必要なので注意してください。

                	
  1. <h1>「<?php the_search_query(); ?>」の検索結果</h1>

あとタイトルなどにも使用している「<?php the_search_query(); ?>」を記述すると、検索ボックスで記入された文字列を出力する事ができます。

竹馬

JavaScriptやPHPなどでシステムを構築する際にはこの「if文」をよく利用します。まぁ、「こういう考え方をするんだ」っていうコトだけ知っておいてください。

検索結果のデザインをstyle.cssに追加

「search.php」の検索結果のデザインを「style.css」に追加します。それと「index.php」の作成時に省略したループ部分のデザインも記載しますのでご確認ください。

style.css

                	
  1. ~テーマ情報省略~
  2. ~共通デザイン省略~
  3. ~main・パンくず・mainContents省略~
  4. ~ヘッダー・フッター省略~
  5. ~サイドバーデザイン省略~
  6. * ------ category ------ */
  7. #category .title h1,
  8. #category .title h2 {
  9.   font-size: 2.4rem;
  10.   font-weight: 300;
  11.   padding-bottom: 10px;
  12.   border-bottom: 1px dashed #c1c1c1;
  13.   position: relative
  14. }
  15. #category .inner { margin-top: 40px }
  16. #category article {
  17.   width: 100%;
  18.   max-width: 50%;
  19.   vertical-align: top;
  20.   padding: 40px 15px 0;
  21.   display: inline-block
  22. }
  23. #category article:first-child,
  24. #category article:nth-child(2) {
  25.   padding: 0 15px
  26. }
  27. #category article a { display: block }
  28. #category article figure img { transition: all 0.3s ease-in-out }
  29. #category article a:hover figure img { opacity: 0.7 }
  30. #category article .txt {
  31.   padding: 10px 20px 20px;
  32.   background: #fff
  33. }
  34. #category article h2 {
  35.   font-size: 1.6rem;
  36.   font-weight: 300;
  37.   text-align: left
  38. }
  39. #category article .cattegory p {
  40.   font-size: 1.3rem;
  41.   text-align: left;
  42.   margin-top: 6px
  43. }
  44. @media screen and (max-width: 768px) {
  45.   #category .title h1 { font-size: 2rem }
  46.   #category .inner {
  47.     padding: 20px 10px;
  48.     margin-top: 20px;
  49.     background: #fff
  50.   }
  51.   #category article {
  52.     max-width: 100%;
  53.     display: block
  54.   }
  55.   #category article:first-child { padding: 0 }
  56.   #category article:nth-child(2) { padding: 20px 0 0 }
  57.   #category article + article {
  58.     padding: 20px 0 0;
  59.     margin-top: 20px;
  60.     border-top: 1px dashed #c1c1c1
  61.   }
  62.   #category article a { font-size: 0 }
  63.   #category article figure {
  64.     width: 100px;
  65.     vertical-align: top;
  66.     margin-right: 10px;
  67.     display: inline-block
  68.   }
  69.   #category article .txt {
  70.     width: calc(100% - 110px);
  71.     vertical-align: top;
  72.     padding: 0 10px;
  73.     display: inline-block
  74.   }
  75. }
  76. /* pagenation */
  77. #category .paginationWrap { text-align: center }
  78. #category .paginationWrap .pagination { margin: 40px auto 0 }
  79. #category .paginationWrap .pagination li {
  80.   position: relative;
  81.   display: inline-block
  82. }
  83. #category .paginationWrap .pagination li + li::before {
  84.   content: "";
  85.   width: 1px;
  86.   height: 50px;
  87.   border-left: 1px solid #c1c1c1;
  88.   position: absolute;
  89.   top: 0;
  90.   left: 0;
  91.   z-index: 1
  92. }
  93. #category .paginationWrap .pagination li a,
  94. #category .paginationWrap .pagination li span {
  95.   min-width: 50px;
  96.   height: 50px;
  97.   font-size: 1.5rem;
  98.   line-height: 50px;
  99.   padding: 0 20px;
  100.   background: #dcdcdc;
  101.   transition: 0.3s;
  102.   float: left;
  103.   position: relative
  104. }
  105. #category .paginationWrap .pagination li .next,
  106. #category .paginationWrap .pagination li .prev {
  107.   font-size: 2rem
  108. }
  109. #category .paginationWrap .pagination li .next { border-radius: 0 25px 25px 0 }
  110. #category .paginationWrap .pagination li .prev { border-radius: 25px 0 0 25px }
  111. #category .paginationWrap .pagination li a:hover {
  112.   color: #fff;
  113.   background: #ff657c
  114. }
  115. #category .paginationWrap .pagination li .current {
  116.   color: #fff;
  117.   background: #ff657c;
  118.   cursor: default
  119. }
  120. @media screen and (max-width: 768px) {
  121.   #category .paginationWrap .pagination li + li::before { height: 40px }
  122.   #category .paginationWrap .pagination li a,
  123.   #category .paginationWrap .pagination li span {
  124.     min-width: 40px;
  125.     height: 40px;
  126.     line-height: 40px;
  127.     padding: 0 15px;
  128.   }
  129.   #category .paginationWrap .pagination li .next { border-radius: 0 20px 20px 0 }
  130.   #category .paginationWrap .pagination li .prev { border-radius: 20px 0 0 20px }
  131. }
  132. /* ------ search ------ */
  133. #category .inner .notFoundWrap {
  134.   text-align: center;
  135.   padding: 20px;
  136.   background: #fff
  137. }
  138. #category .inner .notFoundWrap p { font-size: 1.7rem }
  139. #category .inner .notFoundWrap .btn {
  140.   text-align: center;
  141.   margin-top: 30px
  142. }
  143. #category .inner .notFoundWrap .btn a {
  144.   width: 100%;
  145.   max-width: 300px;
  146.   color: #fff;
  147.   font-size: 1.6rem;
  148.   line-height: 50px;
  149.   margin: 0 auto;
  150.   background: #ff657c;
  151.   display: block
  152. }
  153. #category .inner .notFoundWrap .btn a:hover { opacity: 0.7 }

少し長いですけどじっくり見てもらえれば難しい事もやってないので問題ないハズです。それではこちらもコピペしてもらって、これまでのファイルを確認しておきましょう。

サンプルブログのファイル

結構ファイルも揃ってきましたね。次は「page.php」と「404.php」を作成していきます。「404」というのは存在しないページにアクセスした時に表示される「エラーページ」の事です。

竹馬

今回、自作のテーマを「有効化」してもらいましたのでサイトも確認できるようになりましたね。あともう少しファイルの作成をしていきますので頑張っていきましょう。

ホームページの簡単な作り方以外にも
お得な情報や日常を紹介するブログも是非どうぞ!
Webに関連するレンタルサーバーなどの特徴・料金比較や、
個人的に挑戦している資格取得についての勉強法やグルメなどを紹介しています。