- Windows 本地安装 Kibana 查询 Elasticsearch
- Windows 本地安装和使用 Elasticsearch
- WooCommerce 请登录 链接不工作
- 使 WooCommerce 订单搜索支持自定义字段
- 如何使用 WooCommerce Session
- 获取 WooCommerce 页面地址的方法
- WooCommerce后台通过自定义字段检索产品
- WooCommerce 自定义订单号
- WooCommerce Login / Register Redirect
- WooCommerce自带的shortcodes
- WooCommerce 打印订单
- WooCommerce 新用户注册管理员通知
- WooCommerce 移除产品页商品图片的url
- WooCommerce Email 模版增加全局内容的一个方法
- 错误:Call to a member function is_visible() on a non-object
- WooCommerce实用代码集合
- WooCommerce根据支付方式收取额外费用(2021)
- WooCommerce 订单管理
- WooCommerce移除登出账户的确认提示
- WooCommerce列出所有产品分类(2021)
- WooCommerce收据功能的实现
- WooCommerce Dynamic Pricing动态价格表(2021)
- 如何免费试用WordPress付费插件
- 写代码定制WooCommerce产品页模板(2021)
- 自定义WooCommerce Order Details模板明细部分(2021)
- WooCommerce Class WC_Order
- WooCommerce 产品搜索支持 SKU
- WooCommerce定制产品的Additional Information选项卡(2021)
- WooCommerce 定制产品页选项卡(2021)
- WooCommerce admin bar快捷菜单
- WooCommerce库存管理插件Stock Manager for WooCommerce(2021)
- WordPress备份插件UpdraftPlus(2021)
- 隐藏WooCommerce的购物功能
- WooCommerce目录模式Catalog Mode(2021)
- 构建基于WooCommerce和WPML的多语言电商网站 - 概述篇
- 构建基于WooCommerce和WPML的多语言电商网站 - 安装WooCommerce和测试数据
- 配置WordPress运行环境 - Wampserver安装图解
- 构建基于WooCommerce和WPML的多语言电商网站 - 安装和配置 WPML 插件
- 构建基于 WooCommerce 和 WPML 的多语言电商网站 - 使 WooCommerce 和 WPML 协同工作
- WooCommerce Paypal & RMB
- WooCommerce 2.0 来袭
- 如何修改 WooCommerce 插件的模版
- WooCommerce 显示每个产品的总销量
- WooCommerce 中的 Custom JavaScript Event
- WooCommerce Authorize.net CIM Gateway
- 用WooCommerce Fees API 添加手续费
- WooCommerce 产品加入购物车后直接结账
- 设置 Paypal Sandbox 测试 WooCommerce Subscription 产品
- WooCommerce Conditional Tags 详解
- WooCommerce Single Category Selector
- WooCommerce 自定义结账字段(2021)
- WooCommerce 将产品属性加入网站菜单(2021)
- WooCommerce Product API(2021)
- WooCommerce 添加附加费 surcharge(2021)
- WooCommerce 安装中文语言包(2021)
- WooCommerce 营销:订阅促销弹窗和潜在客户发掘(2021)
- WooCommerce 邮件定制、预览和测试(2021)
- WooCommerce 在线站点付款测试(2021)
- WooCommerce Product Archive Image Slider(2021)
- woocommerce_form_field() examples
- WooCommerce 商店页插入 shortcode 问题
- WooCommerce 在 Email Header 中获取用户信息
- WooCommerce 自定义结账字段图文详解
- WooCommerce 2.1.12 - 如何修改相关产品列表
- 修改 WooCommerce My Account 页面的地址格式
- Woocommerce:如何根据国家设置支付方式
- Woocommerce 支付宝插件初探
- 支付宝集成 如何在回调地址中使用自定义参数
- Woocommerce Settings API 如何使用
- Woocommerce 中文货币符号错误如何解决
- WooCommerce 如何扩展支付方式
- Woo commerce 搭建 WordPress 电子商务网站
- WooCommerce 查看所有用户购物车(2021)
- WooCommerce 最近一个月销量排行(2021)
- WooCommerce 后台自定义产品选项(2021)
- WooCommerce 自定义产品列表带分页(2021)
- WooCommerce 设置 - 自定义选项卡和字段(2021)
- WooCommerce My Account Menu Links 定制方法(2021)
- WooCommerce 产品列表增加数量字段
- WooCommerce 可变产品变种的数量限制
WooCommerce 产品搜索支持 SKU
WooCommerce 前台搜索只会从标题、内容、摘要里搜索,产品 SKU 有时比较重要,但它存储在 custom field 里,默认无法通过 SKU 搜索产品。本文介绍的方法可以让产品搜索支持 SKU。
默认搜索
假设我要搜 SLK3423 这个 SKU,默认搜索的 SQL 语句如下所示,可以看出只搜了标题、摘要和内容。
SELECT SQL_CALC_FOUND_ROWS wp_posts.id
FROM wp_posts
WHERE 1 = 1
AND ( wp_posts.id NOT IN (SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN ( 6 )) )
AND (( ( wp_posts.post_title LIKE '%SLK3423%' )
OR ( wp_posts.post_excerpt LIKE '%SLK3423%' )
OR ( wp_posts.post_content LIKE '%SLK3423%' ) ))
AND wp_posts.post_type = 'product'
AND ( wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private' )
GROUP BY wp_posts.id
ORDER BY wp_posts.post_title LIKE '%SLK3423%' DESC,
wp_posts.post_date DESC
让搜索支持 custom field
从 WordPress 角度考虑,只要让搜索支持 custom field,不就能搜 SKU 了吗。Adam J. Balée 在 Search WordPress by Custom Fields without a Plugin 中介绍了让 WordPress 的搜索支持 custom field 的方法。代码如下:
<?php
/**
* Extend WordPress search to include custom fields
*
* https://adambalee.com
*/
/**
* Join posts and postmeta tables
*
* http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
*/
function cf_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
}
return $join;
}
add_filter('posts_join', 'cf_search_join' );
/**
* Modify the search query with posts_where
*
* http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
*/
function cf_search_where( $where ) {
global $pagenow, $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
}
return $where;
}
add_filter( 'posts_where', 'cf_search_where' );
/**
* Prevent duplicates
*
* http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
*/
function cf_search_distinct( $where ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );
将这段代码放进主题的 functions.php
中,搜索就支持 custom field 了,sku 也属于 custom field,自然就能通过 sku 查找产品。
只搜索 SKU 字段
产品其它 custom field 可能含有和 sku 类似的字符串,但并不是我们想要的,我们希望只匹配 SKU 而忽略其它 custom field,这时我们可以这样修改一下 posts_where
:
function cf_search_where( $where ) {
global $pagenow, $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_key='_sku' AND ".$wpdb->postmeta.".meta_value LIKE $1)", $where );
}
return $where;
}
add_filter( 'posts_where', 'cf_search_where' );
这样修改后,查询产品的 SQL 语句变成了下面这样:
SELECT SQL_CALC_FOUND_ROWS distinct wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta
ON wp_posts.id = wp_postmeta.post_id
WHERE 1 = 1
AND ( wp_posts.id NOT IN (SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN ( 6 )) )
AND (( ( wp_posts.post_title LIKE '%SLK3423%' )
OR ( wp_postmeta.meta_key = '_sku' AND wp_postmeta.meta_value LIKE '%SLK3423%' )
OR ( wp_posts.post_excerpt LIKE '%SLK3423%' )
OR ( wp_posts.post_content LIKE '%SLK3423%' ) ))
AND wp_posts.post_type = 'product'
AND ( wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private' )
GROUP BY wp_posts.id
ORDER BY wp_posts.post_title LIKE '%SLK3423%' DESC,
wp_posts.post_date DESC
注意:这种方法只会搜索 post_type 是 product 的产品,variable product 的 variation 可以有自己的 sku,variation 的 post_type 是 product_variation,所以这种方法是搜不到 variation 的 sku 的。
为什么不能用 WooCommerce Meta Query
WooCommerce 的 product search 有一个 action 叫 woocommerce_product_query
,可以修改 Product Query 参数,搜索 SKU 是 meta query,通过这个 action 添加一个 meta query 不就好了吗?
add_action( 'woocommerce_product_query', 'sola_wc_meta_query', 10, 2 );
function sola_wc_meta_query( $query, $wc_query ){
if( $query->is_search() ){
$meta_query[] = array(
array(
'key'=> '_sku',
'value' => sanitize_text_field( $query->get('s') ),
'compare'=> 'LIKE'
)
);
$query->set( 'meta_query', $meta_query );
}
}
这样加完后是搜不到 sku 的,为什么?看看它生成的 SQL 就明白了,如下所示,这段 SQL 要找 post_title 和 meta_value 中都含有搜索关键词的产品,除非你把 SKU 写到标题里,否则是找不到的。我们想要 OR 的关系,而不是 AND。而前面的方法用正则表达式把 AND 替换成了 OR。
SELECT SQL_CALC_FOUND_ROWS wp_posts.id
FROM wp_posts
INNER JOIN wp_postmeta
ON ( wp_posts.id = wp_postmeta.post_id )
WHERE 1 = 1
AND ( wp_posts.id NOT IN (SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN ( 6 )) )
AND (( ( wp_posts.post_title LIKE '%SLK3423%' )
OR ( wp_posts.post_excerpt LIKE '%SLK3423%' )
OR ( wp_posts.post_content LIKE '%SLK3423%' ) ))
AND ((( wp_postmeta.meta_key = '_sku'AND wp_postmeta.meta_value LIKE '%SLK3423%' )))
AND wp_posts.post_type = 'product'
AND ( wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private' )
GROUP BY wp_posts.id
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
函数一般加到主题的 functions.php 里面即可!
看了这么多办法,包括装插件,数这个最靠谱。
能具体说下怎么在WORDPRESS里写上这串代码吗