使用 Bootstrap 3 選項卡在自定義帖子類型分類中顯示帖子
已發表: 2021-07-19Bootstrap 選項卡非常適合在小區域內顯示大量內容。 簡而言之,他們為很少的屏幕空間帶來了很多衝擊!
在本教程中,我們將研究一種顯示自定義帖子類型帖子的好方法,該帖子分為不同的分類術語。
對於這個例子,我設置了一個“電影”的自定義帖子類型,我們將按照“流派”的分類法對它們進行分組。 正是這些類型將成為引導標籤,而標籤內容將是這些特定類型下的電影。
這是我們正在努力實現的目標:

設置帖子類型和分類
首先,我們需要創建自定義帖子類型的電影。 最簡單的方法是安裝優秀的自定義帖子類型 UI。
使用以下設置:

然後我們需要設置類型分類,以便我們可以將所有電影歸入正確的類型。 使用自定義帖子類型 UI,使用以下設置創建分類:

確保將hierarchy 設置為true,因為這將確保分類使用類別樣式選擇框而不是標籤。
接下來的工作是製作一些電影並將它們歸類為正確的類型。 我剛剛添加了一些測試膠片,以便向您展示下一個過程。
為簡單起見,我將在 WordPress 中創建一個名為“電影”的頁面,然後對該頁面進行頁面覆蓋,我們將在其中放置我們的代碼。 這樣做的方法是在你的主題文件夾中創建一個名為 page-films.php 的文件,然後 WordPress 將使用這個文件來顯示電影頁面。 這樣,我們就可以添加我們需要的代碼,並且只有在您訪問網站的電影頁面時才會顯示。
該頁面不必稱為“電影”,但要確保頁面的 slug 與頁面模板的第二部分匹配。 因此,如果頁面的 slug 是“電影”,則模板文件將被稱為 page-movies.php。
創建選項卡
如果您訪問 Bootstrap 站點並訪問選項卡部分,我們可以獲取我們將需要的標記。 只要您加載了所有 Bootstrap javascript 文件(尤其是 tabs.js 和 transitions.js),您剛剛粘貼到頁面中的選項卡就可以正常工作。
不過,我們想要做的是在選項卡中顯示我們的流派名稱。 為此,我們將不得不使用 WordPress 函數 get_terms。 這個函數基本上只是返回所有與分類相關的帖子的術語。 因此,我們需要使用 get_terms 來返回有關我們擁有的所有類型的信息。
<?php $film_genres = get_terms('genres'); ?>在此示例中,我針對變量 $film_genres 設置了 get_terms,但您可以使用任何您喜歡的內容。
接下來,我們需要對這個變量進行 foreach 循環,以返回我們添加的所有類型。 我們想對 nav-tabs 無序列表執行此操作,如下所示:
<ul class="nav nav-tabs nav-justified">
<li class="active">
<a data-toggle="tab" href="#all">全部</a>
</li>
<?php foreach($film_genres as $film_genre) { ?>
<li>
<a href="#<?php echo $film_genre->slug ?>" data-toggle="tab"><?php echo $film_genre->name ?></a>
</li>
<? } ?>
</ul>
確保在 foreach 之前設置“All”li,因為我們希望第一個選項卡默認顯示所有電影,然後我們使用其他選項卡按流派過濾。
標籤內容
然後我們想為所有電影選項卡設置選項卡內容,我們使用 wp_query 對電影的帖子類型進行設置,如下所示:
<div class="tab-pane active">
<?php
$args = 數組(
'post_type' => '電影',
'posts_per_page' -1,
'orderby' => 'title',
'訂單' => 'ASC'
);
$all_films = new WP_Query( $args);
?>
<?php if ( $all_films->have_posts() ) : // 在做任何事情之前確保我們有電影要放映?>
<div class="table-responsive">
<table class="table">
<?php while ( $all_films->have_posts() ) : $all_films->the_post(); ?>
<tr>
<td><?php the_post_thumbnail() ?></td>
<td><h3><?php the_title() ?></h3</td>
<td>
<p class="lead"><?php the_excerpt() ?></p>
<a href="<?php the_permalink() ?>" class="btn btn-primary">閱讀更多</a>
</td>
</tr>
<?php endwhile; ?>
<?php wp_reset_query() ?>
</table>
</div>
<?php endif; ?>
</div><!-- 所有電影選項卡窗格 -->確保您將帖子類型鍵值設置為您的帖子類型的名稱(如果您不使用電影),即“post_type”=>“您的帖子類型在這裡”。 然後,我們將返回電影帖子類型中的所有帖子,並按標題升序排列。
然後我們在這個 wp_query 對像上運行一個普通的 WordPress 循環並返回所有的電影帖子。
對於此示例,我選擇在每個選項卡窗格中輸出引導表,但您可以隨時輸出數據。 需要記住的是,通過使用 wp_query 循環,我們可以使用所有出色的 WordPress 功能,例如 the_title、the_excerpt、the_post_thumbnail 等。
在此循環結束時不要忘記運行 wp_reset_query,因為如果我們要在此頁面上運行任何其他循環,這將避免我們可能遇到的任何可能的問題。
在我們整理好顯示所有電影的選項卡內容後,我們希望能夠顯示所有按類型分組的電影。 我們希望它是動態的,這樣如果我們將來選擇添加更多類型,我們就不需要為這些類型中的每一個在其他 wp_quires 中編碼。 為了實現這一點,我們需要在下一個 tab-content div 上運行另一個 foreach 循環,在這個循環中,我們將運行一個帶有一些分類參數的 wp_query。
<?php foreach($film_genres as $film_genre) { ?>
<div class="tab-pane">
<?php
$args = 數組(
'post_type' => '電影',
'posts_per_page' -1,
'orderby' => 'title',
'訂單' => 'ASC',
'tax_query' => 數組(
大批(
'分類' => '流派',
'field' => 'slug',
'條款' => $film_genre->slug
)
)
);
$films = new WP_Query( $args );
?>
<?php if ( $films->have_posts() ) : // 在做任何事情之前確保我們有電影要放映?>
<table class="table">
<?php while ( $films->have_posts() ) : $films->the_post(); ?>
<tr>
<td><?php the_post_thumbnail() ?></td>
<td><h3><?php the_title() ?></h3</td>
<td>
<p class="lead"><?php the_excerpt() ?></p>
<a href="<?php the_permalink() ?>" class="btn btn-primary">閱讀更多</a>
</td>
</tr>
<?php endwhile; ?>
<?php wp_reset_query() ?>
</table>
<?php endif; ?>
</div>
<? } ?>
我們將之前使用的 foreach 包裝在選項卡窗格 div 周圍。 我們需要這樣做,以便我們可以訪問我們設置的 $film_genre 對像中的值,因為我們需要使用 slug 值傳遞給我們的 wp_query,並設置選項卡窗格 id。
創建 wp_query 後,我們使用與“所有”電影選項卡窗格中相同的 WordPress 循環,記住將 wp_query 變量更改為諸如 $film_genres 之類的唯一變量。
這真的是關於它。 Bootstrap 選項卡應該可以正常工作,並且當您添加附加了電影的新類型時,它應該顯示為一個新選項卡。
這是完整的代碼:
<section class="films-tabs">
<?php $film_genres = get_terms('genres'); // 獲取所有流派 ?>
<!-- 導航標籤 -->
<ul class="nav nav-tabs nav-justified">
<li class="active">
<a data-toggle="tab" href="#all">全部</a>
</li>
<?php foreach($film_genres as $film_genre) { ?>
<li>
<a href="#<?php echo $film_genre->slug ?>" data-toggle="tab"><?php echo $film_genre->name ?></a>
</li>
<? } ?>
</ul>
<!-- 標籤窗格 -->
<div class="tab-content">
<div class="tab-pane active">
<?php
$args = 數組(
'post_type' => '電影',
'posts_per_page' -1,
'orderby' => 'title',
'訂單' => 'ASC'
);
$all_films = new WP_Query( $args);
?>
<?php if ( $all_films->have_posts() ) : // 在做任何事情之前確保我們有電影要放映?>
<div class="table-responsive">
<table class="table">
<?php while ( $all_films->have_posts() ) : $all_films->the_post(); ?>
<tr>
<td><?php the_post_thumbnail() ?></td>
<td><h3><?php the_title() ?></h3</td>
<td>
<p class="lead"><?php the_excerpt() ?></p>
<a href="<?php the_permalink() ?>" class="btn btn-primary">閱讀更多</a>
</td>
</tr>
<?php endwhile; ?>
<?php wp_reset_query() ?>
</table>
</div>
<?php endif; ?>
</div><!-- 所有電影選項卡窗格 -->
<?php foreach($film_genres as $film_genre) { ?>
<div class="tab-pane">
<?php
$args = 數組(
'post_type' => '電影',
'posts_per_page' -1,
'orderby' => 'title',
'訂單' => 'ASC',
'tax_query' => 數組(
大批(
'分類' => '流派',
'field' => 'slug',
'條款' => $film_genre->slug
)
)
);
$films = new WP_Query( $args );
?>
<?php if ( $films->have_posts() ) : // 在做任何事情之前確保我們有電影要放映?>
<table class="table">
<?php while ( $films->have_posts() ) : $films->the_post(); ?>
<tr>
<td><?php the_post_thumbnail() ?></td>
<td><h3><?php the_title() ?></h3</td>
<td>
<p class="lead"><?php the_excerpt() ?></p>
<a href="<?php the_permalink() ?>" class="btn btn-primary">閱讀更多</a>
</td>
</tr>
<?php endwhile; ?>
<?php wp_reset_query() ?>
</table>
<?php endif; ?>
</div>
<? } ?>
</div><!-- 標籤內容 -->
</section><!-- 電影標籤 -->
如果您需要幫助,請隨時與我們聯繫。
