wordpress 标题根据字符数量筛选功能

为了在产品搜索页面筛选出特定字符数范围的产品标题,我们可以通过在 WordPress 的产品列表页面中增加一个筛选器来实现此功能。这样,你就可以方便地找到字符太少或太多的标题,并进行优化。

方案概述:

  1. 增加筛选器:在产品搜索页面顶部增加一个筛选器,用于选择字符数范围(如 20、30、50 等)。
  2. 筛选条件:用户可以选择字符数范围(例如:少于20个字符,20-30个字符,30-50个字符,或者大于50个字符)。
  3. 过滤产品:基于用户选择的字符数范围,过滤出符合条件的产品标题。

步骤:

  1. 在后台产品列表页面添加筛选器
  2. 使用自定义查询过滤符合条件的产品
  3. 显示筛选后的产品

代码实现:

  1. 添加筛选器: 我们将使用 restrict_manage_posts 钩子来添加筛选器,并使用 pre_get_posts 来根据筛选条件调整查询。
// 添加字符数筛选器到产品列表页面
add_action('restrict_manage_posts', 'add_title_length_filter_to_product_list');

function add_title_length_filter_to_product_list() {
    // 检查是否在产品页面
    if (get_post_type() == 'product') {
        $selected_length = isset($_GET['title_length']) ? $_GET['title_length'] : '';
        ?>
        <select name="title_length">
            <option value="">All Titles Length</option>
            <option value="less_than_20" <?php selected($selected_length, 'less_than_20'); ?>>Less than 20 characters</option>
            <option value="less_than_30" <?php selected($selected_length, 'less_than_30'); ?>>Less than 30 characters</option>
            <option value="less_than_40" <?php selected($selected_length, 'less_than_40'); ?>>Less than 40 characters</option>
            <option value="less_than_50" <?php selected($selected_length, 'less_than_50'); ?>>Less than 50 characters</option>
            <option value="less_than_60" <?php selected($selected_length, 'less_than_60'); ?>>Less than 60 characters</option>
            <option value="less_than_70" <?php selected($selected_length, 'less_than_70'); ?>>Less than 70 characters</option>
            <option value="less_than_80" <?php selected($selected_length, 'less_than_80'); ?>>Less than 80 characters</option>
            <option value="less_than_100" <?php selected($selected_length, 'less_than_100'); ?>>Less than 100 characters</option>
            <option value="less_than_120" <?php selected($selected_length, 'less_than_120'); ?>>Less than 120 characters</option>
            <option value="less_than_140" <?php selected($selected_length, 'less_than_140'); ?>>Less than 140 characters</option>
            <option value="greater_than_140" <?php selected($selected_length, 'greater_than_140'); ?>>Greater than 140 characters</option>
        </select>
        <?php
    }
}

// 根据筛选条件过滤产品
add_action('pre_get_posts', 'filter_products_by_title_length');

function filter_products_by_title_length($query) {
    // 检查是否在管理后台,并且是产品查询
    if (!is_admin() || !$query->is_main_query() || get_post_type() != 'product') {
        return;
    }

    // 获取筛选器的选值
    if (isset($_GET['title_length']) && $_GET['title_length'] != '') {
        $title_length = sanitize_text_field($_GET['title_length']);
        
        switch ($title_length) {
            case 'less_than_20':
                $query->set('title_length', 20);
                $query->set('s', '');  // 清除其他搜索条件
                add_filter('posts_where', 'filter_title_length_less_than_20');
                break;
            case 'less_than_30':
                $query->set('title_length', 30);
                add_filter('posts_where', 'filter_title_length_less_than');
                break;
            case 'less_than_40':
                $query->set('title_length', 40);
                add_filter('posts_where', 'filter_title_length_less_than');
                break;
            case 'less_than_50':
                $query->set('title_length', 50);
                add_filter('posts_where', 'filter_title_length_less_than');
                break;
            case 'less_than_60':
                $query->set('title_length', 60);
                add_filter('posts_where', 'filter_title_length_less_than');
                break;
            case 'less_than_70':
                $query->set('title_length', 70);
                add_filter('posts_where', 'filter_title_length_less_than');
                break;
            case 'less_than_80':
                $query->set('title_length', 80);
                add_filter('posts_where', 'filter_title_length_less_than');
                break;
            case 'less_than_100':
                $query->set('title_length', 100);
                add_filter('posts_where', 'filter_title_length_less_than');
                break;
            case 'less_than_120':
                $query->set('title_length', 120);
                add_filter('posts_where', 'filter_title_length_less_than');
                break;
            case 'less_than_140':
                $query->set('title_length', 140);
                add_filter('posts_where', 'filter_title_length_less_than');
                break;
            case 'greater_than_140':
                $query->set('title_length', 140);
                add_filter('posts_where', 'filter_title_length_greater_than_140');
                break;
        }
    }
}

// 过滤标题长度小于指定字符数
function filter_title_length_less_than($where) {
    global $wpdb;
    $title_length = get_query_var('title_length');
    $where .= " AND LENGTH($wpdb->posts.post_title) < $title_length";
    return $where;
}

// 过滤标题长度大于指定字符数(大于140)
function filter_title_length_greater_than_140($where) {
    global $wpdb;
    $where .= " AND LENGTH($wpdb->posts.post_title) > 140";
    return $where;
}

代码说明:

  1. add_title_length_filter_to_product_list
    • 该函数会在产品列表页面的顶部添加一个下拉筛选器,允许管理员选择标题的字符数范围。
  2. filter_products_by_title_length
    • 根据管理员选择的筛选条件,修改产品查询,以筛选出符合条件的产品。posts_where 过滤器用于在 SQL 查询中加入条件。
  3. filter_title_length_less_than_20filter_title_length_rangefilter_title_length_greater_than_50
    • 这些函数分别处理不同字符数范围的过滤逻辑。它们会修改 SQL 查询,使查询结果符合管理员选择的标题字符长度范围。

结果:

  • 在后台产品列表页面上会出现一个筛选器,管理员可以根据标题字符数进行筛选,选择 less_than_2020_to_3030_to_50greater_than_50
  • 产品列表将根据筛选条件实时更新,显示符合条件的产品。

后续:

  • 如果需要,可以扩展此功能,允许管理员自定义字符数范围,或者在筛选器中添加更多的过滤选项,如包含/不包含特定关键词等。

By 行政