WooCommerce后台订单搜索扩展:支持MD5邮箱搜索的两种实现方案咨询
WooCommerce后台订单搜索扩展:支持MD5邮箱搜索的两种实现方案咨询
嗨,我来帮你搞定这两种实现方案的具体代码和操作步骤,完美解决你在WooCommerce后台订单列表搜索MD5邮箱的需求~
方案一:实时转换搜索内容为MD5,匹配原邮箱的MD5值
这个方案不需要额外存储数据,核心思路是在搜索执行时,把用户输入的搜索词转换成MD5,然后在SQL查询里添加对_billing_email字段的MD5匹配逻辑,同时保留你原来的搜索功能(原邮箱、手机号、支付方式搜索不受影响)。
你需要在现有代码基础上,添加一个修改搜索查询的钩子:
// 修改后台订单搜索的SQL查询,支持MD5邮箱搜索 add_filter('posts_search', 'add_md5_email_search_logic', 10, 2); function add_md5_email_search_logic($search, $wp_query) { // 只在WooCommerce订单后台的搜索场景生效 if (!is_admin() || $wp_query->get('post_type') !== 'shop_order' || empty($wp_query->get('s'))) { return $search; } global $wpdb; $search_term = $wp_query->get('s'); // 生成搜索词的MD5值 $md5_search_term = md5($search_term); // 构建MD5邮箱匹配的SQL片段 $md5_search_sql = $wpdb->prepare( " OR (pm.meta_key = '_billing_email' AND MD5(pm.meta_value) = %s)", $md5_search_term ); // 将MD5匹配逻辑插入到原搜索SQL中 $search = str_replace(')))', $md5_search_sql . ')))', $search); return $search; }
代码说明:
- 这个钩子只会在后台订单页面的搜索请求中触发,不会影响其他页面;
- 它会把用户输入的搜索词转换成MD5,然后在原有搜索逻辑上,新增一个“
_billing_email的MD5值等于转换后的值”的条件; - 你原来的
extending_admin_orders_search_field函数不需要修改,原有的邮箱、手机号、支付方式搜索依然正常工作。
方案二:预存MD5邮箱为自定义元数据,直接加入搜索字段
这个方案是提前把订单的MD5邮箱保存为一个独立的订单元字段,之后就像你搜索手机号、原邮箱一样,直接把这个元字段加入搜索范围,逻辑更清晰,性能也更好(不需要每次搜索都计算MD5)。
步骤1:添加保存MD5邮箱的钩子
当订单创建或更新时,自动生成并保存MD5邮箱:
// 保存订单时,生成并存储MD5格式的邮箱 add_action('woocommerce_process_shop_order_meta', 'save_order_md5_billing_email', 10, 2); function save_order_md5_billing_email($order_id, $order) { $billing_email = $order->get_billing_email(); if (!empty($billing_email)) { $md5_email = md5($billing_email); // 保存为自定义元字段 update_post_meta($order_id, '_billing_email_md5', $md5_email); } } // 对于已有的旧订单,你可以手动运行一次这个函数来批量生成MD5邮箱(执行一次即可,之后删除) /* function batch_add_md5_email_to_old_orders() { $orders = wc_get_orders(array('limit' => -1)); foreach ($orders as $order) { $billing_email = $order->get_billing_email(); if (!empty($billing_email) && !get_post_meta($order->get_id(), '_billing_email_md5', true)) { update_post_meta($order->get_id(), '_billing_email_md5', md5($billing_email)); } } } // 执行批量更新(访问任意前端页面一次即可,之后注释掉) // batch_add_md5_email_to_old_orders(); */
步骤2:修改搜索字段配置,加入MD5邮箱元字段
修改你已有的extending_admin_orders_search_field函数,把新增的_billing_email_md5元字段加进去:
add_filter( 'woocommerce_shop_order_search_fields', 'extending_admin_orders_search_field', 10, 1 ); function extending_admin_orders_search_field( $meta_keys ){ $meta_keys[] = '_billing_email'; $meta_keys[] = '_billing_phone'; $meta_keys[] = '_payment_method_title'; // 添加MD5邮箱的元字段 $meta_keys[] = '_billing_email_md5'; return $meta_keys; }
代码说明:
- 第一个钩子会在订单保存时自动生成MD5邮箱并存储,新订单会自动生效;
- 注释掉的批量更新函数是给旧订单用的,执行一次后就可以删除/注释;
- 修改后的搜索字段配置,会让后台搜索直接匹配
_billing_email_md5字段,和你原来的搜索逻辑完全一致,使用起来更直观。
两种方案各有优劣:方案一适合不想改动数据库的场景,方案二更适合长期使用、性能要求高的场景,你可以根据自己的需求选择~
备注:内容来源于stack exchange,提问作者SubZer0
相关产品推荐
相关产品推荐

