4种方法实现WordPress类目输出并控制排序
在 WordPress 开发中,要在产品列表页的左侧边栏输出指定的分类,并且可以手动控制展示顺序,可以通过以下几种方法实现:
方法一:使用自定义字段 (ACF) 手动控制分类显示顺序
- 安装 Advanced Custom Fields (ACF) 插件:如果你还没有安装 ACF 插件,可以先安装并激活该插件。
- 创建一个选项页面或自定义字段:
- 在 WordPress 后台的 ACF 插件中,创建一个新的字段组(Field Group)。
- 选择“选项页面”或“产品页面”作为这个字段组的显示位置。
- 添加一个“分类”字段,字段类型选择“关系”或“分类”,让用户能够选择想要显示的分类。
- 如果需要手动排序,选择“可排序”选项,允许用户自定义排序顺序。
- 在侧边栏模板中输出分类:
- 在产品列表页面的模板文件中(比如
sidebar-product.php
),使用 ACF 的get_field()
函数来获取手动选择的分类。 - 根据用户选择的顺序输出分类。
- 在产品列表页面的模板文件中(比如
<?php
// 获取自定义字段的分类列表(假设字段名为 'custom_categories')
$custom_categories = get_field('custom_categories', 'option'); // 如果是选项页面字段使用 'option'
if ($custom_categories) :
echo '<ul class="custom-category-list">';
foreach ($custom_categories as $category) :
echo '<li><a href="' . get_category_link($category->term_id) . '">' . esc_html($category->name) . '</a></li>';
endforeach;
echo '</ul>';
endif;
?>
方法二:使用 WordPress 的菜单管理器
- 创建一个分类菜单:
- 在 WordPress 后台,进入 外观 > 菜单。
- 创建一个新的菜单,将你想要展示的分类添加到菜单中。
- 将菜单的显示位置设置为左侧边栏(根据你的主题设置,可以通过挂钩或小部件显示菜单)。
- 在侧边栏模板中调用菜单:
- 在主题的侧边栏模板文件中,使用
wp_nav_menu()
函数来加载指定的菜单。 - 使用菜单的
menu_id
参数来确定你创建的菜单。
- 在主题的侧边栏模板文件中,使用
<?php
wp_nav_menu(array(
'theme_location' => 'sidebar_menu', // 主题位置可以根据需要设置
'menu_id' => 'custom_sidebar_menu',
'container' => 'nav',
'container_class' => 'sidebar-category-menu'
));
?>
注意:菜单项的顺序可以在 WordPress 菜单管理界面中手动调整,因此这提供了灵活的顺序控制。
方法三:使用自定义代码实现分类输出和排序
- 创建自定义分类排序字段:
- 在分类编辑页面上,使用 ACF 插件或 WordPress 自定义字段 API,给每个分类添加一个排序字段,比如
category_order
。- 在字段中填入数字值,越小的数字越靠前。
- 在模板中查询并按排序字段输出分类:
- 使用
get_terms()
函数,按照自定义字段category_order
的值排序获取分类。
<?php
$args = array(
'taxonomy' => 'product_cat', // 替换为你要查询的分类法
'meta_key' => 'category_order', // 自定义字段名
'orderby' => 'meta_value_num', // 根据自定义字段排序
'order' => 'ASC', // 升序排序
'hide_empty' => false, // 是否隐藏没有文章的分类
);
$categories = get_terms($args);
if (!empty($categories)) :
echo '<ul class="custom-category-list">';
foreach ($categories as $category) :
echo '<li><a href="' . get_category_link($category->term_id) . '">' . esc_html($category->name) . '</a></li>';
endforeach;
echo '</ul>';
endif;
?>
方法四:使用小部件 + 自定义排序插件
- 安装自定义排序插件:比如 Category Order and Taxonomy Terms Order 插件。该插件允许你通过拖放的方式调整分类的显示顺序。
- 使用 WordPress 小部件:
- 在 外观 > 小部件 中添加“分类”小部件到侧边栏。
- 启用你想要展示的分类,并通过插件的排序功能调整顺序。
- 在模板中应用排序:
- 该插件会自动应用排序,因此只需要确保分类的小部件或
get_terms()
函数的查询中不包含orderby
参数,分类会按照插件设置的顺序输出。
- 该插件会自动应用排序,因此只需要确保分类的小部件或
<div class="product-cats bg-light border">
<h5 class="text-transform py-3 px-4 mb-0 ls-0">Categories</h5>
<?php
$args = array(
'show_option_all' => '', //(字符串)是否显示到所有分类的链接,默认为空,不显示
'orderby' => 'name', //(字符串)排序依据,可以用分类名称,分类ID,或者分类文章数排序,可用的值有:ID,name(默认),slug,count,term_group
'order' => 'ASC', //(字符串)排序方式,正序或倒序,可用的值有:ASC,DESC
'style' => 'list', //(字符串)列表或无列表,可用的值有:list(默认),none
'show_count' => 0, //(布尔值)是否显示分类里面文章数量的开关,默认为不显示
'hide_empty' => 0, //(布尔值)是否显示空分类--没有文章的分类显示出来也是404页面,还不如隐藏了,所以默认为隐藏
'use_desc_for_title' => 1, //(布尔值)默认以分类描述作为分类链接的title属性,显示出来对SEO优化和用户体验提高是有帮助的,默认为显示
'child_of' => 0, //(布尔值)只显示指定分类的自分类,这算是一个小功能,默认为假
'feed' => '', //(字符串)是否显示一个分类rss2订阅源的文字,默认为空,看需要
'feed_type' => '', // (字符串)订阅源的类型
'feed_image' => '', // (字符串)显示一个表示订阅源的小图标。此参数覆盖feed参数的值
'exclude' => '1', //(字符串)从结果中排序某些分类,值为以逗号分隔的分类项ID,不能和include同时使用
'exclude_tree' => '', // (字符串)和上面的exclude作用一样,不同的是,这个排除的是有子分类的分类项
'include' => '', // (字符串)结果中只包含某些分类项
'hierarchical' => 1, // (布尔值)是否分层显示父级分类和子分类
'title_li' => __( '' ), //(字符串)分类列表的标题,默认为分类目录,可根据需要设置
'show_option_none' => __('No categories') ,//(字符串)没有分类的情况下显示的问题
'number' => null, //(整数),
'echo' => 1, // (布尔值)是否显示出来,控制直接显示列表,还是保存在某个变量中
'depth' => 0, // (整数) 是否分层显示列表,默认为0,分层显示所有分类和自分类,-1为不分层显示所有分类,1为只显示顶级分类,n为显示n级分类
'current_category' => 0, // (字符串)当前分类项,设置某项为当前分类项
'pad_counts' => 0, // (布尔值)通过自分类里的项目计算链接或文章数
'taxonomy' => 'category', //(字符串)显示某个自定义分类法下面的分类项目
'walker' => null //(对象),生成列表所用的类
); ?>
<ul class="list-group list-unstyled items-nav sticky-sidebar">
<?php wp_list_categories( $args); ?>
</ul>
</div>
总结
以上几种方法中,选择合适的方法取决于具体需求:
- 如果希望手动控制分类列表并控制展示顺序,推荐使用 方法一(ACF) 或 方法二(菜单)。
- 如果希望自动按顺序排序且灵活,可以使用 方法三(自定义排序字段)。
- 如果不想编写代码,可以使用 方法四(小部件和插件)。