为了在产品搜索页面筛选出特定字符数范围的产品标题,我们可以通过在 WordPress 的产品列表页面中增加一个筛选器来实现此功能。这样,你就可以方便地找到字符太少或太多的标题,并进行优化。
目录
方案概述:
- 增加筛选器:在产品搜索页面顶部增加一个筛选器,用于选择字符数范围(如 20、30、50 等)。
- 筛选条件:用户可以选择字符数范围(例如:少于20个字符,20-30个字符,30-50个字符,或者大于50个字符)。
- 过滤产品:基于用户选择的字符数范围,过滤出符合条件的产品标题。
步骤:
- 在后台产品列表页面添加筛选器。
- 使用自定义查询过滤符合条件的产品。
- 显示筛选后的产品。
代码实现:
- 添加筛选器: 我们将使用
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;
}
代码说明:
add_title_length_filter_to_product_list
:- 该函数会在产品列表页面的顶部添加一个下拉筛选器,允许管理员选择标题的字符数范围。
filter_products_by_title_length
:- 根据管理员选择的筛选条件,修改产品查询,以筛选出符合条件的产品。
posts_where
过滤器用于在 SQL 查询中加入条件。
- 根据管理员选择的筛选条件,修改产品查询,以筛选出符合条件的产品。
filter_title_length_less_than_20
、filter_title_length_range
、filter_title_length_greater_than_50
:- 这些函数分别处理不同字符数范围的过滤逻辑。它们会修改 SQL 查询,使查询结果符合管理员选择的标题字符长度范围。
结果:
- 在后台产品列表页面上会出现一个筛选器,管理员可以根据标题字符数进行筛选,选择
less_than_20
、20_to_30
、30_to_50
、greater_than_50
。 - 产品列表将根据筛选条件实时更新,显示符合条件的产品。
后续:
- 如果需要,可以扩展此功能,允许管理员自定义字符数范围,或者在筛选器中添加更多的过滤选项,如包含/不包含特定关键词等。