Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the all-in-one-seo-pack domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/kusanagi/gisco.biz/DocumentRoot/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the twentytwentytwo domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/kusanagi/gisco.biz/DocumentRoot/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the jetpack domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/kusanagi/gisco.biz/DocumentRoot/wp-includes/functions.php on line 6114
【第二回】WordPressテーマを自作する方法 | WordPress制作の「gisco」

【第二回】WordPressテーマを自作する方法


お久しぶりです!

前回に引き続きWordPressテーマを自作する方法をご紹介します。

前回の記事では、トップページのHTMLをphpファイルに変更し、header.phpとfooter.phpというテンプレートに分けるところまでご紹介しました。

まだご覧になっていない方は、上記からご確認ください!

ヘッダーとフッターのテンプレート分けができましたので、TOPページを完成させていきましょう。

ここで必要になる作業としては、以下の3つです。

  • カテゴリの登録
  • サンプル記事投稿
  • カテゴリ別の記事表示

それではやっていきましょー。

カテゴリの登録

このHTMLテンプレートには、デフォルトでいくつかのカテゴリーがあるようですが、その通りにする必要は全くありません。

しかし、デザインを崩したくはないので最低でも4つは用意してみましょう。

私の場合は世間様にご紹介するような趣味が4つもありませんでしたので、極力日常生活に近いカテゴリを選んでみようと思います。

  • 愚痴
  • ボクシング
  • ごはん・酒
  • 散歩

この4つでいきます。

まずは、管理画面にログインし左メニューの「投稿」「カテゴリー」から新規に4つ登録していきます。

この際、カテゴリのスラッグを英語で登録することをオススメします。

サンプル記事登録

カテゴリの登録が済んだら、次はサンプル記事を登録します。

こんな感じで、カテゴリの数だけ投稿してきます。

合計4記事つくりました。

しかし、TOPページ上部に表示されている記事数が5件のため、一件余計に投稿しておきます。

カテゴリ別の記事表示

ここから少し難しくなります。

TOPページ上部の記事リストは、ブラウザのデベロッパーツールでソースを見てみると<div class=”masonry-blog”>の中で、3つのセクションに分かれている事が分かります。

left-sideで1件、center-sideで3件、right-sideで1件の合計5件の記事が表示されています。

まずはこれを表示させましょう。

エディターでindex.phpを開きます。

WordPressを扱う上で気にすべき点は、「どこをループさせるか」です。

今回のテンプレートの場合は、<div class=”masonry-box”>というdivを親として、記事がループしているようです。

例としてcenter-sideの中の3件

最初の一件のみ大きく、残りの2件はsmall-boxというクラスが付くことにより小さく表示されています。

どこがどのようにループしているかが分かったところで、記事の取得と表示をしていきましょう。

記事の取得

このHTMLテンプレートでは、TOPページの中で、様々な種類のカテゴリ記事を表示しています。

こことか
こことか

それぞれで共通している事は、「特定のカテゴリから記事を数件取得し表示している」という事です。

WordPressでは様々な記事取得用の関数が用意されていますが、中でもget_posts()関数が有名ですね。

以前は、query_posts()関数を使用するケースが多かったのですが、この関数ではメインクエリーを上書きしてしまうため現在は非推奨となっています。

get_posts()関数の詳細な使い方は以下をご参照ください。

しかし、私としてはあまりオススメ致しません。

この関数の中で行われている処理内容は、与えられたオプションを解析しWP_Queryクラスを生成してリターンするという、二度手間になっています。

ですので、最初からnew WP_Query()でオブジェクトを生成した方が良いと思います。

こちらの公式ドキュメントで使い方を説明していますので、ぜひご覧ください。

さて、話を戻します。

最新5件を取得したい

TOPページ上部の5件を取得していきましょう。

この箇所は、カテゴリの指定がなく、最新5件を取得し表示するようにしたいと思います。

<?php
$args = array(
  'post_type'      => 'post',
  'post_status'    => 'publish',
  'posts_per_page' => '5'
); 
$query = new WP_Query( $args );
?>

これで投稿タイプ「投稿」の「公開済み記事」を「5」件取得するクエリーを作る事ができました。

正常に記事取得ができているか、確認してみましょう。

確認するためには、var_dump()というPHPの関数を使用します。

<?php
$args = array(
  'post_type'      => 'post',
  'post_status'    => 'publish',
  'posts_per_page' => '5'
); 
$query = new WP_Query( $args );
//ここまで、さっきと同じ

var_dump( $query );

?>

これで保存し、画面を確認すると…。

なんやらゴチャゴチャ。

すっごく見づらいですね。でも大丈夫です。

右クリックから「ページのソースを表示」で、ソースコードを表示すると、多少マシに確認できます。

取得した記事は、表示されたwp_queryオブジェクトの「posts」に格納されていますので、先程のコードを少し変更します。

<?php
$args = array(
  'post_type'      => 'post',
  'post_status'    => 'publish',
  'posts_per_page' => '5'
); 
$query = new WP_Query( $args );
//ここまで、さっきと同じ

var_dump( $query->posts );
// ->postsを追加。

?>

そして保存。

先程と同様に、ソースを表示して見てみます。

array(5) {….}となっていますね。

array(5)とあるので、正常に5件取得できた事が確認できました。

各セクションで表示する

次は、取得した記事をループさせながら必要な情報を表示していくのですが、今回は先述の通り3つのセクションに分けなければいけません。

方法としてはいくつもありますが、パッと思いついたのは3つほど。

  1. ループの中で条件分岐する方法
  2. そもそも三回に分けて取得する方法
  3. 取得した配列を分割する方法

こんなもんですかね。

1.ループの中で条件分岐

取得したpostオブジェクトの配列をループし、その中で1回目、2,3,4回目、5回目という風に条件分岐をしてセクションを分ける方法。

どう考えてもメンテナンス性が悪いコードが出来上がりますので、これはパスですね。

2.そもそも3回に分けて取得

new WP_Query();に与えるオプション配列にoffsetを加えれば「最新記事から●件を除いて取得」ができますので、left-side、center-side,right-sideでそれぞれ記事を取得する方法。

<?php
//最新1件のみ取得
$args = array(
  'post_type'      => 'post',
  'post_status'    => 'publish',
  'posts_per_page' => '1'
); 
$query = new WP_Query( $args );
?>

<div class="left-side">
... //ここでループ
</div>

<?php
//最新1件を除き3件取得
$args = array(
  'post_type'      => 'post',
  'post_status'    => 'publish',
  'posts_per_page' => '3',
  'offset'         => 1
); 
$query = new WP_Query( $args );
?>

<div class="center-side">
.... //ここでループ
</div>

<?php
//最新4件を除き1件取得
$args = array(
  'post_type'           => 'post',
  'post_status'         => 'publish',
  'posts_per_page'      => '1',
  'offset'              => 4
); 
$query = new WP_Query( $args );
?>

<div class="right-side">
.... //ここでループ
</div>

こんな感じです。

せっかく書きましたが無駄なクエリを発行する事になるので却下。

3.取得した配列を分割する方法

これが一番現実的かつ効率的かもしれませんね。

array_slice();を使い配列を分割、それを使用して各セクションで表示する方法です。

<?php
$args = array(
  'post_type'      => 'post',
  'post_status'    => 'publish',
  'posts_per_page' => '5'
); 
$query = new WP_Query( $args );

$left     = array_slice( $query->posts, 0, 1 );
$center   = array_slice( $query->posts, 1, 3 );
$right    = array_slice( $query->posts, 4, 1 );
?>

<div class="left-side">
<?php foreach ( $left as $post )  : setup_post_data( $post ); ?>
...
<?php endforeach; wp_reset_postdata(); ?>
</div>

<div class="center-side">
<?php foreach ( $left as $post )  : setup_post_data( $post ); ?>
<?php $i = 1; ?>
<div class="masonry-box post-media <?php if ( $i !== 1 ) echo 'small-box'; ?>">
</div>
<?php $i++; endforeach; wp_reset_postdata(); ?>
</div>

<div class="right-side">
<?php foreach ( $right as $post )  : setup_post_data( $post ); ?>
...
<?php endforeach; wp_reset_postdata(); ?>
</div>

この方がスッキリしてて見やすいですね。

TOPの上部完成まで

これで、3つのセクション分けができましたので、次は中身のコードを整えていきます。

最初はleft-sideからです。

元のソースコードはこちら。

<div class="left-side">
    <div class="masonry-box post-media">
         <img src="http://demo.gisco.biz/wp-content/themes/cloapedia/upload/blog_masonry_01.jpg" alt="" class="img-fluid">
         <div class="shadoweffect">
            <div class="shadow-desc">
                <div class="blog-meta">
                    <span class="bg-aqua"><a href="blog-category-01.html" title="">Lifestyle</a></span>
                    <h4><a href="single.html" title="">The golden rules you need to know for a positive life</a></h4>
                    <small><a href="single.html" title="">17 January, 2021</a></small>
                </div><!-- end meta -->
            </div><!-- end shadow-desc -->
        </div><!-- end shadow -->
    </div><!-- end post-media -->
</div><!-- end left-side -->

上記ソースコードを変更します。

<?php 
foreach( $left as $post ) : setup_postdata( $post ); 
    $term      = array_shift( get_the_terms( $post->ID, 'category' ) );
    $term_link = get_term_link( $term->term_id );
    $term_name = esc_html( $term->name );
?>
<div class="left-side">
    <div class="masonry-box post-media">
         <?php the_post_thumbnail(array(534,468)); ?>
         <div class="shadoweffect">
            <div class="shadow-desc">
                <div class="blog-meta">
                    <span class="bg-aqua"><a href="<?php echo $term_link; ?>" title="<?php echo $term_name; ?>"><?php echo $term_name; ?></a></span>
                    <h4><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h4>
                    <small><a href="<?php the_permalink(); ?>" title=""><?php echo get_post_time('d F, Y'); ?></a></small>
                </div><!-- end meta -->
            </div><!-- end shadow-desc -->
        </div><!-- end shadow -->
    </div><!-- end post-media -->
</div><!-- end left-side -->
<?php endforeach; wp_reset_postdata(); ?>

これで、左側のセクションが動的になりました。

この要領で、どんどんいきましょう。

最終的なコード

が、こちらです。

 <?php
     $args = array(
         'post_type' => 'post',
         'post_status' => 'publish',
         'posts_per_page' => '5',
     );
     $obj = new WP_Query( $args );
 

     $left   = array_slice( $obj->posts, 0, 1 );
     $center = array_slice( $obj->posts, 1, 3 );
     $right  = array_slice( $obj->posts, 4, 1 );
 

 ?>
 

 <div class="left-side">
 <?php
     foreach ( $left as $post ) : setup_postdata( $post );
         $term  = array_shift( get_the_terms( $post->ID, 'category' ) );
         $term_link  = get_term_link( $term->term_id );
         $term_name  = esc_html( $term->name );
 ?>
     <div class="masonry-box post-media">
          <?php the_post_thumbnail('left-right-side'); ?>
          <div class="shadoweffect">
             <div class="shadow-desc">
                 <div class="blog-meta">
                     <span class="bg-aqua"><a href="<?php echo $term_link; ?>" title="<?php echo $term_name; ?>"><?php echo $term_name; ?></a></span>
                     <h4><a href="single.html" title="<?php the_title(); ?>"><?php echo get_the_title( $post->ID ); ?></a></h4>
                     <small><a href="single.html" title="<?php echo get_post_time('d F, Y'); ?>"><?php echo get_post_time('d F, Y'); ?></a></small>
                 </div><!-- end meta -->
             </div><!-- end shadow-desc -->
         </div><!-- end shadow -->
     </div><!-- end post-media -->
 <?php endforeach; wp_reset_postdata(); ?>
 </div><!-- end left-side -->
 

 <div class="center-side">
     <?php
     $i = 1;
     foreach( $center as $post ) : setup_postdata( $post );
         $term  = array_shift( get_the_terms( $post->ID, 'category' ) );
         $term_link  = get_term_link( $term->term_id );
         $term_name  = esc_html( $term->name );
     ?>
     <div class="masonry-box post-media <?php if ( $i !== 1 ) echo 'small-box'; ?>">
 

         <?php
         if ( $i == 1 ) {
             the_post_thumbnail('center-side-top');
         } else {
             the_post_thumbnail('center-side-bottom');
         }
         ?>
 

          <div class="shadoweffect">
             <div class="shadow-desc">
                 <div class="blog-meta">
                     <span class="bg-green"><a href="<?php echo $term_link; ?>" title="<?php echo $term_name; ?>"><?php echo $term_name; ?></a></span>
                     <h4><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h4>
                     <?php if ( $i == 1 ) : ?>
                     <small><a href="<?php the_permalink(); ?>" title="<?php echo get_post_time('d F, Y'); ?>"><?php echo get_post_time('d F, Y'); ?></a></small>
                     <?php endif; ?>
                 </div><!-- end meta -->
             </div><!-- end shadow-desc -->
         </div><!-- end shadow -->
     </div><!-- end post-media -->
     <?php $i++; endforeach; wp_reset_postdata(); ?>
 </div><!-- end left-side -->
 

 <div class="right-side hidden-md-down">
     <?php
     foreach ( $right as $post ) : setup_postdata( $post );
         $term  = array_shift( get_the_terms( $post->ID, 'category' ) );
         $term_link  = get_term_link( $term->term_id );
         $term_name  = esc_html( $term->name );
     ?>
     <div class="masonry-box post-media">
          <?php the_post_thumbnail('left-right-side'); ?>
          <div class="shadoweffect">
             <div class="shadow-desc">
                 <div class="blog-meta">
                     <span class="bg-aqua"><a href="<?php echo $term_link; ?>" title="<?php echo $term_name; ?>"><?php echo $term_name; ?></a></span>
                     <h4><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h4>
                     <small><a href="<?php the_permalink(); ?>" title="<?php echo get_post_time('d F, Y'); ?>"><?php echo get_post_time('d F, Y'); ?></a></small>
                 </div><!-- end meta -->
             </div><!-- end shadow-desc -->
          </div><!-- end shadow -->
     </div><!-- end post-media -->
     <?php endforeach; wp_reset_postdata(); ?>
 </div><!-- end right-side --> 

そして保存。

できたものがこちら。

ちゃんと表示されました。

今回は、とりあえずTOPの上部だけ動的表示にできた段階で終わりたいと思います。

次回の記事は、アイキャッチのサイズ設定方法からTOPページ完成までをご紹介します。

前回の記事をまだご覧になっていない方は、こちらから是非ご確認ください!