WordPress代码创建“颜色”的自定义分类法

在WordPress中,通过自定义分类法(Taxonomy)来实现文章的多条件筛选功能是一种常见且有效的方法。

把经下代码放到主题的 functions.php 文件中完成。

//自定义分类法
add_action( 'init', 'create_color' );
function create_color() {
 $labels = array(
    'name' => _x( 'color', 'taxonomy general name' ),
    'singular_name' => _x( 'color', 'taxonomy singular name' ),
    'search_items' =>  __( 'Search color' ),
    'all_items' => __( 'All colors' ),
    'parent_item' => __( 'Parent color' ),
    'parent_item_colon' => __( 'Parent color:' ),
    'edit_item' => __( 'Edit color' ),
    'update_item' => __( 'Update color' ),
    'add_new_item' => __( 'Add New color' ),
    'new_item_name' => __( 'New color Name' ),
  );

  register_taxonomy('color','post',array(
    'hierarchical' => false,
    'labels' => $labels
  ));
}

你已经在上面的代码中创建了一个名为“color”的自定义分类法,这个分类法将应用于文章(post)。现在,我们可以进一步探讨如何在前端实现基于这个自定义分类法的文章筛选功能。

1. 创建筛选表单

首先,你需要在你的主题文件(如 sidebar.phpfooter.php 或专门用于筛选的模板文件中)添加一个筛选表单。这个表单将包含基于“color”分类法的选项,以及可能的其他分类法或字段。

<form method="get" action="<?php echo home_url('/'); ?>">
    <label for="color-filter">筛选颜色:</label>
    <?php
    $color_terms = get_terms(array(
        'taxonomy' => 'color',
        'hide_empty' => false,
    ));
    
    echo '<select name="color" id="color-filter">';
    echo '<option value="">所有颜色</option>';
    foreach ($color_terms as $term) {
        echo '<option value="' . $term->slug . '">' . $term->name . '</option>';
    }
    echo '</select>';
    
    // 你可以添加更多的筛选条件,如类别、日期等
    
    echo '<input type="submit" value="筛选">';
    ?>
</form>

2. 修改查询以包含筛选条件

接下来,你需要修改WordPress的查询,以便它包含表单中提交的筛选条件。这通常在主题的 functions.php 文件中完成,或者在你的模板文件中,如果你正在为特定页面或模板定制查询。

如果你正在使用WordPress的默认查询(如在主循环中),你可以通过修改 pre_get_posts 钩子来添加筛选条件。

add_action( 'pre_get_posts', 'filter_posts_by_color' );
function filter_posts_by_color( $query ) {
    if ( !is_admin() && $query->is_main_query() ) {
        if ( isset( $_GET['color'] ) && !empty( $_GET['color'] ) ) {
            $query->set( 'tax_query', array(
                array(
                    'taxonomy' => 'color',
                    'field'    => 'slug',
                    'terms'    => $_GET['color'],
                ),
            ) );
        }
    }
}

3. 注意事项

  • 确保你的表单是安全的,特别是当涉及到处理用户输入时。上面的示例中,我们直接从$_GET中获取值,这在大多数情况下是可行的,但在生产环境中,你可能需要更仔细地验证和清理这些数据。
  • 如果你想要更复杂的筛选逻辑(例如,同时基于多个分类法筛选),你可能需要构建更复杂的tax_query数组。
  • 考虑到用户体验,你可能想要在页面上动态更新筛选结果,而不是让用户提交表单。这通常涉及到使用JavaScript(可能是通过Ajax)来捕获表单更改并重新加载筛选后的内容。这超出了简单WordPress主题的范畴,可能需要一些前端开发的技能。

通过这些步骤,你应该能够在WordPress网站上实现基于自定义分类法的文章筛选功能。