WordPress 中 WooCommerce 产品管理添加标题字符数筛选功能

这是一个关于WordPress的WooCommerce插件开发的具体技术问题。让我先理清几个关键点:

  1. 问题本质是关于产品标题字符数的计算和筛选
  2. 涉及两个层面:
    • 产品标题字符数的计算方法
    • 如何通过代码扩展实现字符数筛选功能

需要考虑的技术细节:

  • WooCommerce产品数据存储在wp_posts表中,标题对应post_title字段
  • 中文和英文字符的计算可能需要特别处理
  • 筛选功能可能需要通过:
    1. 修改产品列表查询
    2. 添加筛选UI界面
    3. 处理筛选参数

在WordPress中实现这个功能,最可能的方式是通过posts_where或posts_clauses钩子来修改查询。

我还需要考虑:

  • 性能影响:对大量产品进行字符统计可能会影响性能
  • 多语言兼容:mb_strlen() vs strlen()的选择
  • 用户界面:如何让用户方便地输入字符数限制

这个问题需要提供一个完整的代码示例,包含计算和筛选逻辑。由于代码较长且是完整的功能实现,应该使用artifact来展示。

WooCommerce的产品标题存储在wp_posts表的post_title字段中,我们可以通过添加自定义筛选功能来实现按字符数筛选产品。

<?php
/**
 * Add product title length filter to WooCommerce admin
 */

// 添加筛选UI
function add_product_title_length_filter() {
    global $pagenow, $post_type;
    
    if ($pagenow !== 'edit.php' || $post_type !== 'product') {
        return;
    }
    
    $length_filter = isset($_GET['title_length']) ? sanitize_text_field($_GET['title_length']) : '';
    $operator = isset($_GET['title_length_operator']) ? sanitize_text_field($_GET['title_length_operator']) : 'lte';
    ?>
    <select name="title_length_operator">
        <option value="lte" <?php selected($operator, 'lte'); ?>>小于等于</option>
        <option value="gte" <?php selected($operator, 'gte'); ?>>大于等于</option>
    </select>
    <input type="number" name="title_length" placeholder="标题字符数" value="<?php echo esc_attr($length_filter); ?>">
    <?php
}
add_action('restrict_manage_posts', 'add_product_title_length_filter');

// 修改查询以支持字符数筛选
function filter_products_by_title_length($where) {
    global $pagenow, $wpdb, $post_type;
    
    if ($pagenow !== 'edit.php' || $post_type !== 'product') {
        return $where;
    }
    
    if (isset($_GET['title_length']) && !empty($_GET['title_length'])) {
        $length = intval($_GET['title_length']);
        $operator = isset($_GET['title_length_operator']) ? $_GET['title_length_operator'] : 'lte';
        
        // 使用CHAR_LENGTH来计算字符数,适用于UTF-8编码
        $compare = $operator === 'lte' ? '<=' : '>=';
        $where .= $wpdb->prepare(" AND CHAR_LENGTH({$wpdb->posts}.post_title) {$compare} %d", $length);
    }
    
    return $where;
}
add_filter('posts_where', 'filter_products_by_title_length');

// 可选:添加自定义列显示标题字符数
function add_product_title_length_column($columns) {
    $columns['title_length'] = '标题字符数';
    return $columns;
}
add_filter('manage_product_posts_columns', 'add_product_title_length_column');

function display_product_title_length_column($column, $post_id) {
    if ($column === 'title_length') {
        $title = get_the_title($post_id);
        echo mb_strlen($title, 'UTF-8');
    }
}
add_action('manage_product_posts_custom_column', 'display_product_title_length_column', 10, 2);

这段代码实现了以下功能:

  1. 在产品列表页面添加了字符数筛选器,包括:
    • 筛选条件选择(大于等于/小于等于)
    • 字符数输入框
  2. 通过修改WordPress查询来实现字符数筛选,使用CHAR_LENGTH函数计算字符数
  3. 添加了一个新列显示每个产品的标题字符数

使用方法:

  1. 将代码添加到你的主题的functions.php文件中,或者创建一个插件
  2. 刷新产品管理页面,你会看到新的筛选选项
  3. 输入想要筛选的字符数并选择筛选条件即可

注意事项:

  • 代码使用CHAR_LENGTH函数计算字符数,这在UTF-8编码下能正确处理中文字符
  • 为了安全性,加入了基本的数据验证和清理
  • 代码兼容WordPress的多语言特性

By 行政