如果您的网站使用多个分类法对信息进行分类,则根据第二个分类法的术语拆分分类法存档中的帖子会很有帮助。
在本教程中,我将向您展示如何创建分类存档来实现此目的。
如果您曾经使用过多关系数据库,您就会知道它们的一大功能是您可以根据多种分类法查看数据。例如,如果您有一个客户数据库,您可以轻松查看哪些客户雇用您从事不同类别的项目,然后通过查看哪些网页设计客户(例如位于给定位置)来进一步排序。
当我第一次开始使用 WordPress 时,我感到很沮丧,因为您无法轻松做到这一点 - 至少您无法通过运行默认主题的开箱即用 WordPress 安装来做到这一点。
但是,可以通过多种分类法对数据进行分类。在本教程中。我将向您展示如何创建一个分类页面来列出该分类中的帖子,并按也适用于它们的另一个分类的术语排序。
然后,我将为第二个分类创建第二个分类存档,其中按照第一个分类的术语顺序列出其帖子(相信我 - 当您看到它发生时,它会更有意义!)
要完成本教程,您需要:
在本教程中,我将使用两个新模板文件、一个样式表和一个函数文件创建一个 24 的子主题。如果您使用自己的主题,只需将代码从我的函数文件复制到您主题的函数文件中,然后添加经过调整的模板文件以反映您主题的标记。
为了创建我的主题,我在空主题文件夹中创建一个名为 style.css
的文件,并使用以下内容填充它:
/* Theme Name: WPTutsPlus Create a Taxonomy Archive to List Posts by a Second Taxonomy's Terms Theme URI: https://rachelmccollin.co.uk/wptutsplus-taxonomy-archive-list-by-second-taxonomy/ Description: Theme to support WPTutsPlus tutorial on creating a custom taxonomy archive. Child theme for the Twenty Fourteen theme. Author: Rachel McCollin Author URI: http://rachelmccollin.co.uk/ Template: twentyfourteen Version: 1.0 */ @import url("../twentyfourteen/style.css");
这将创建我的子主题。
在本教程中,我将使用我在创建教程中使用的相同 'animals'
帖子类型和 'animal_cat'
分类法自定义帖子类型模板。我还将添加第二个分类法,名为 'habitat'
。
为此,我创建一个名为 functions.php
的新文件。首先,我添加函数来注册我的帖子类型:
<?php // register a custom post type called 'animals' function wptp_create_post_type() { $labels = array( 'name' => __( 'Animals' ), 'singular_name' => __( 'animal' ), 'add_new' => __( 'New animal' ), 'add_new_item' => __( 'Add New animal' ), 'edit_item' => __( 'Edit animal' ), 'new_item' => __( 'New animal' ), 'view_item' => __( 'View animal' ), 'search_items' => __( 'Search animals' ), 'not_found' => __( 'No animals Found' ), 'not_found_in_trash' => __( 'No animals found in Trash' ), ); $args = array( 'labels' => $labels, 'has_archive' => true, 'public' => true, 'hierarchical' => false, 'supports' => array( 'title', 'editor', 'excerpt', 'custom-fields', 'thumbnail', 'page-attributes' ), 'taxonomies' => array( 'post_tag', 'category'), ); register_post_type( 'animal', $args ); } add_action( 'init', 'wptp_create_post_type' ); ?>
然后我在一个函数中注册我的两个分类法:
<?php // register taxonomies function wptp_register_taxonomies() { // register a taxonomy called 'Animal Family' register_taxonomy( 'animal_cat', 'animal', array( 'labels' => array( 'name' => 'Animal Families', 'singular_name' => 'Animal Family', 'search_items' => 'Search Animal Families', 'all_items' => 'All Animal Families', 'edit_item' => 'Edit Animal Families', 'update_item' => 'Update Animal Family', 'add_new_item' => 'Add New Animal Family', 'new_item_name' => 'New Animal Family Name', 'menu_name' => 'Animal Family', ), 'hierarchical' => true, 'sort' => true, 'args' => array( 'orderby' => 'term_order' ), 'rewrite' => array( 'slug' => 'animal-family' ), 'show_admin_column' => true ) ); // register a taxonomy called 'Habitat' register_taxonomy( 'habitat', 'animal', array( 'labels' => array( 'name' => 'Habitats', 'singular_name' => 'Habitat', 'search_items' => 'Search Habitats', 'all_items' => 'All Habitats', 'edit_item' => 'Edit Habitat', 'update_item' => 'Update Habitat', 'add_new_item' => 'Add New Habitat', 'new_item_name' => 'New Habitat Name', 'menu_name' => 'Habitat', ), 'hierarchical' => true, 'sort' => true, 'args' => array( 'orderby' => 'term_order' ), 'show_admin_column' => true ) ); } add_action( 'init', 'wptp_register_taxonomies' ); ?>
这将创建 'animal'
帖子类型以及适用于它的两个分类法。请注意,我使用了 'show_admin_column'
来让管理我的帖子时变得更轻松。
添加一些数据并根据我的分类法对动物进行分类后,我现在可以在 WordPress 仪表板中查看我的数据,如下所示。
注意:我对所使用的动物的分类不是很科学 - 请不要评论我对栖息地或科系的理解!
下一步是为 'animal_cat'
分类存档创建模板文件。在主题文件夹中创建一个文件并将其命名为 taxonomy-animal_cat.php
。现在从您的主题添加包装器代码(我已从我的父主题复制了此代码,如果您使用自己的主题,您的代码将会有所不同):
<?php /* WpTutsPlus tutorial for creating archive to display posts by mutiple taxonomy terms Archive template for animal_cat taxonomy */ ?> <?php get_header(); ?> <div id="main-content" class="main-content"> <div id="primary" class="content-area"> <div id="content" class="site-content" role="main"> </div><!-- #content --> </div><!-- #primary --> <?php get_sidebar( 'content' ); ?> </div><!-- #main-content --> <?php get_sidebar(); get_footer();
现在需要向此模板文件添加一些数据。
存档模板将使用 WP_Query
为每个术语创建自定义查询。查询的对象之一将是当前显示的分类术语,因此您需要识别它并将其存储为变量。
在 get_header()
行下方,添加:
<?php // get the currently queried taxonomy term, for use later in the template file $animalcat = get_queried_object(); ?>
稍后您可以使用该 $animalcat
变量。
存档当前没有主标题,因此您需要使用刚刚定义的变量添加一个主标题。
在打开<div id="content">标签后,添加以下内容:
<pre class="brush:php;toolbal:false;"><header class="archive-header">
<h1 class="archive-title">
<?php echo $animalcat->name; ?>
</h1>
</header><!-- .archive-header -->
</pre>
<h3>获取第二个分类的术语</h3>
<p>接下来,您需要获取第二个分类的术语列表。在您刚刚添加的代码下方插入以下内容:</p>
<pre class="brush:php;toolbal:false;"><?php //start by fetching the terms for the animal_cat taxonomy
$terms = get_terms( 'habitat', array(
'hide_empty' => 0
) );
?>
</pre>
<p>这将获取所有术语的列表并将其存储在数组中。通过使用 <code class="inline">'hide_empty'
您可以避免显示任何空术语 - 但正如您很快就会看到的,这只会阻止查询根本没有帖子的术语,而不是那些没有帖子的术语当前查询的分类术语。
现在创建一个将为每个术语运行的循环:
<?php // now run a query for each animal family foreach ( $terms as $term ) { // Define the query $args = array( 'post_type' => 'animal', 'animal_cat' => $animalcat->slug, 'habitat' => $term->slug ); $query = new WP_Query( $args ); // output the term name in a heading tag echo'<h2>' . $term->name . ' habitat</h2>'; // output the post titles in a list echo '<ul>'; // Start the Loop while ( $query->have_posts() ) : $query->the_post(); ?> <li class="animal-listing" id="post-<?php the_ID(); ?>"> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </li> <?php endwhile; echo '</ul>'; // use reset postdata to restore orginal query wp_reset_postdata(); } ?>
对此的一些说明:
$term
) 和当前正在查询的术语 ($animalcat
)。'post_type'
参数,但我更愿意包含它以防万一。$term
变量用于使用 $term->name
输出每个部分的标题。现在保存您的模板文件并查看您的动物家族术语之一的分类存档:
目前,如您所见,模板正在输出空列表。通过检查每个查询是否有帖子可以轻松解决此问题。
在循环中包含以下内容:
if ( $query->have_posts() ) { }
你的循环现在看起来像这样:
if ( $query->have_posts() ) { // output the term name in a heading tag echo'<h2>' . $term->name . ' habitat</h2>'; // output the post titles in a list echo '<ul>'; // Start the Loop while ( $query->have_posts() ) : $query->the_post(); ?> <li class="animal-listing" id="post-<?php the_ID(); ?>"> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </li> <?php endwhile; echo '</ul>'; }
如果查询没有任何帖子,这会阻止 WordPress 运行循环,从而删除那些空标题。现在我的存档页面如下所示:
好多了!
最后一步是为第二个分类的档案创建模板文件。
复制您的第一个模板文件并将其重命名为 taxonomy-habitat.php
。编辑它以使术语正确。我需要对文件进行的编辑是:
$animalcat
变量的名称更改为 $habitat
(您可以通过为该变量指定一个更通用的名称来避免此问题 - 但不要将其称为 $term
因为您在其他地方使用它)<h1></h1>
标题,以便它使用 $habitat
变量来输出当前查询术语的名称(我还在此处添加了一些解释性文本)这是可选的)get_terms()
函数的第一个参数,使其使用 animal_cat
术语,而不是 habitat
术语。'animal_cat'
和 'habitat'
的值。<h2></h2>
内容以引用家庭而不是栖息地。这意味着我的新模板文件如下所示:
<?php /* WpTutsPlus tutorial for creating archive to display posts by mutiple taxonomy terms Archive template for habitat taxonomy */ ?> <?php get_header(); ?> <?php // get the currently queried taxonomy term, for use later in the template file $habitat = get_queried_object(); ?> <div id="main-content" class="main-content"> <div id="primary" class="content-area"> <div id="content" class="site-content" role="main"> <header class="archive-header"> <h1 class="archive-title"> Habitat - <?php echo $habitat->name; ?> </h1> </header><!-- .archive-header --> <?php //start by fetching the terms for the animal_cat taxonomy $terms = get_terms( 'animal_cat', array( 'hide_empty' => 0 ) ); ?> <?php // now run a query for each animal family foreach( $terms as $term ) { // Define the query $args = array( 'post_type' => 'animal', 'animal_cat' => $term->slug, 'habitat' => $habitat->slug ); $query = new WP_Query( $args ); if( $query->have_posts() ) { // output the term name in a heading tag echo'<h2>' . $term->name . ' family</h2>'; // output the post titles in a list echo '<ul>'; // Start the Loop while ( $query->have_posts() ) : $query->the_post(); ?> <li class="animal-listing" id="post-<?php the_ID(); ?>"> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </li> <?php endwhile; echo '</ul>'; } // use reset postdata to restore orginal query wp_reset_postdata(); } ?> </div><!-- #content --> </div><!-- #primary --> <?php get_sidebar( 'content' ); ?> </div><!-- #main-content --> <?php get_sidebar(); get_footer();
进行这些更改后,保存新模板文件并检查您的存档之一:
您现在拥有第二个分类的页面,其工作方式与第一个分类相同。
在本教程中,您学习了一种使用多种分类法显示数据的方法。您可以通过以下两种方式之一使用第三种分类法来进一步实现这一点:
$term
变量,其方式与 $habitat
或 $animalcat
变量类似并在现有的 foreach()
语句中添加额外的 foreach()
语句。然后,您需要考虑如何使用列表或网格来布局结果数据。为什么不尝试一下呢?
以上是按第二个分类法的术语列出分类目录:Taxonomy Archives的详细内容。更多信息请关注PHP中文网其他相关文章!