在之前的課程中,您已經瞭解並學習了主題框架的工作方式和開發途徑。

現在是時候深入探討一些程式碼了!

在本教程中,您會採用一個基本的主題,然後編輯模板檔案,為主題框架新增相關掛鉤和函式做好準備。本教程旨在整理主題,減少程式碼重複,這意味著您要為迴圈建立包含檔案 (include files) 。

您將不必在子主題中建立重複迴圈,當您建立新的模板檔案時,或者您需要編輯迴圈時,您只需做一次就行了。

您需要做的是

跟隨本教程,您需要

  • 安裝一個 WordPress 開發環境
  • GitHub 庫相關係列中的起始檔案或者起始主題檔案
  • 一個程式碼編輯器

為迴圈建立包含檔案

我會為我的框架建立三個迴圈:

  • 一個用於存檔 (包括主部落格頁面)
  • 一個用於單篇文章
  • 一個用於頁面

這是因為我想讓其中的每一個迴圈與其他的顯示起來都略有不同。

儘管將會有三個迴圈,但相比較於每一個模板檔案中都包含一個迴圈而言,這會更加高效。

主迴圈

主迴圈會用於存檔和主部落格頁面。在您的主題資料夾中,建立一個名為 loop.php 的檔案。

從 archive.php 中將下列程式碼複製到 loop.php 檔案中:

  1. <?php
  2. /* Queue the first post, that way we know if this is a date archive so we can display the correct title.
  3.  * We reset this later so we can run the loop properly with a call to rewind_posts().
  4.  */
  5. if ( have_posts() )
  6.     the_post();
  7. ?>
  8.  
  9.         <h2 >
  10.             <?php if ( is_day() ) { ?>
  11.                 Archive for <?php echo get_the_date();
  12.             }
  13.             elseif ( is_month() ) { ?>
  14.                 Archive for <?php echo get_the_date('F Y');
  15.             }
  16.             elseif ( is_year() ) { ?>
  17.                 Archive for <?php echo get_the_date('Y');
  18.             }
  19.             else {
  20.                 echo get_queried_object()->name; 
  21.             } ?>
  22.         </h2>
  23.  
  24. <?php rewind_posts(); ?>
  25.  
  26.  
  27. <?php // start the loop ?> 
  28. <?php while ( have_posts() ) : the_post(); ?>
  29.  
  30. <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  31.  
  32.     <h2 >
  33.         <a href="http://span<?php/span%20the_permalinkspan(/spanspan)/spanspan;/span%20span?>/span" title="<?php printf( esc_attr__( 'Permalink to %s', 'compass' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark">
  34.             <?php the_title(); ?>
  35.         </a>
  36.     </h2>
  37.  
  38.     <section >
  39.  
  40.         <?php if ( has_post_thumbnail() ) { ?>
  41.             <a href="http://span<?php/span%20the_permalinkspan(/spanspan)/spanspan;/span%20span?>/span">
  42.                 <?php the_post_thumbnail( 'medium', array(
  43.                     'class' => 'left',
  44.                     'alt'   => trim(strip_tags( $wp_postmeta->_wp_attachment_image_alt ))
  45.                 ) ); ?>
  46.             </a>
  47.         <?php } ?>
  48.     </section><!-- .image -->
  49.  
  50.     <section >
  51.         <p>Posted on <?php the_date(); ?> by <?php the_author(); ?></p>
  52.     </section><!-- .entry-meta -->
  53.  
  54.     <section >
  55.         <?php the_content(); ?>
  56.     </section><!-- .entry-content -->
  57.  
  58.     <section >
  59.         <?php if ( count( get_the_category() ) ) : ?>
  60.             <span >
  61.                 Categories: <?php echo get_the_category_list( ', ' ); ?>
  62.             </span>
  63.         <?php endif; ?>   
  64.     </section><!-- .entry-meta -->
  65.  
  66. </article><!-- #01-->
  67.  
  68. <?php endwhile; ?>
  69. <?php // ends the loop ?>

您並不需要去顯示主部落格頁面上的標題,所以在第一個迴圈上新增一個條件標籤,以檢查我們是不是該網頁上:

  1. if ( ! is_front_page() ) {
  2. }

第一個迴圈當前會如下所示:

  1. if ( ! is_front_page() ) {
  2.  
  3.     if ( have_posts() )
  4.         the_post();
  5.     ?>
  6.  
  7.             <h2 >
  8.                 <?php if ( is_day() ) { ?>
  9.                     Archive for <?php echo get_the_date();
  10.                 }
  11.                 elseif ( is_month() ) { ?>
  12.                     Archive for <?php echo get_the_date('F Y');
  13.                 }
  14.                 elseif ( is_year() ) { ?>
  15.                     Archive for <?php echo get_the_date('Y');
  16.                 }
  17.                 else {
  18.                     echo get_queried_object()->name; 
  19.                 } ?>
  20.             </h2>
  21.  
  22.     <?php rewind_posts();
  23.  
  24. } ?>

現在,您需要在相關網站模版檔案中包含這個迴圈。在 archive.php 和 index.php 檔案中,將現有的迴圈替換為 get_template_part() 標籤,其中包含了您的迴圈檔案:

  1. <?php get_template_part( 'loop' ); ?>

現在您有了一個用於存檔的工作迴圈。

頁面迴圈

接下來,您將為頁面建立一個迴圈檔案。建立一個名為 loop-page.php 的檔案。

從現有的 page.php 檔案中將下列迴圈程式碼複製到 loop-page.php 檔案:

  1. <?php
  2.     // Run the page loop to output the page content.
  3.  
  4.      if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
  5.  
  6.         <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  7.  
  8.             <?php if ( ! is_front_page() ) { ?>
  9.                 <h2 ><?php the_title(); ?></h2>
  10.             <?php } ?>
  11.  
  12.             <section >
  13.                 <?php the_content(); ?>
  14.             </section><!-- .entry-content -->
  15.         </article><!-- #post-## -->
  16.  
  17.     <?php endwhile; ?>

現在在主題的所有頁面模板中 (page.phppage-full-width.php),使用下面的程式碼替換迴圈:

  1. <?php get_template_part( 'loop' , 'page' ); ?>

文章頁迴圈

最後,您將為單篇文章頁面建立一個迴圈檔案,用於普通的文章和您將來建立的任何自定義的文章型別。這和主迴圈是相似的,只是它不包括該文章的連結,也沒有初始迴圈,用來檢查我們的存檔情況。

建立一個名為 loop-single.php 和另一個名為 single.php 的檔案。

將 index.php 檔案中的內容複製到 single.php 檔案,並在檔案的初始位置編輯說明和迴圈,如下所示:

  1. <?php get_template_part( 'loop', 'single' ); ?>

現在,在 single-loop.php 檔案中,複製程式碼到 loop.php 檔案,不包括查詢檔案的第一個迴圈。在迴圈內編輯初始標題標籤並取消連結,程式碼如下:

  1. <?php while ( have_posts() ) : the_post(); ?>
  2.  
  3. <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
  4.  
  5.     <h2 >
  6.         <?php the_title(); ?>
  7.     </h2>
  8.  
  9.     <section >
  10.  
  11.         <?php if ( has_post_thumbnail() ) { ?>
  12.             <a href="http://span<?php/span%20the_permalinkspan(/spanspan)/spanspan;/span%20span?>/span">
  13.                 <?php the_post_thumbnail( 'medium', array(
  14.                     'class' => 'left',
  15.                     'alt'   => trim(strip_tags( $wp_postmeta->_wp_attachment_image_alt ))
  16.                 ) ); ?>
  17.             </a>
  18.         <?php } ?>
  19.     </section><!-- .image -->
  20.  
  21.     <section >
  22.         <p>Posted on <?php the_date(); ?> by <?php the_author(); ?></p>
  23.     </section><!-- .entry-meta -->
  24.  
  25.     <section >
  26.         <?php the_content(); ?>
  27.     </section><!-- .entry-content -->
  28.  
  29.     <section >
  30.         <?php if ( count( get_the_category() ) ) : ?>
  31.             <span >
  32.                 Categories: <?php echo get_the_category_list( ', ' ); ?>
  33.             </span>
  34.         <?php endif; ?>   
  35.     </section><!-- .entry-meta -->
  36.  
  37. </article><!-- #01-->
  38.  
  39. <?php endwhile; ?>

儲存這兩個檔案。現在,所有的迴圈檔案您都準備好了。

小結

從長遠來看,使用一個主題框架之前,先整理主題並減少程式碼重複將會節省下不少的工作時間。

當您開始建立子主題並和父主題一起使用時,您會發現自己在建立自定義迴圈的同時,也在以一種完全正確的方式完成一個給定專案的內容。有了三個獨立的迴圈,您就會避免在子主題中建立重複的模板檔案,因為您只需要建立重複迴圈檔案就行了。