- 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后台通过自定义字段检索产品
WooCommerce后台的产品检索与前台搜索略有不同。前台是在WordPress默认搜索的基础上修改,后台直接用了一套自己的逻辑,从wc_product_meta_lookup这个表里检索产品,调用函数WC_Product_Data_Store_CPT->search_products()
,这个函数只有一个filter——woocommerce_product_pre_search_products
,允许返回自定义结果,代价是截断了WooCommerce所有的搜索逻辑,显然不适合小修改。后台可以搜sku,但其它自定义字段就不行了,且没有任何位置可以干预。幸运的是我们还能用WordPress自带的filter – request
来完成自定义字段搜索功能。
WordPress Request Filter
它的用法如下:
- 它可以修改WordPress所有主查询的参数,且是在sql被执行之前运行。也就是说,我们可以在WooCommerce搜索的查询参数确定后,修改查询参数,再执行查询,这是我们加入自定义字段查询的关键。
- 它可以用在主题的functions.php里,但不能用在模板文件里,因为模板文件运行时,WordPress的主查询已经运行完了。
- 它会在全站运行,无论前台还是后台,所以要仔细测试,不要弄坏网站其它功能。
简单用法如下,也是本文代码的和心思想。
add_filter( 'request', 'alter_the_query' );
function alter_the_query( $query_vars ) {
$query_vars['post__in'] = array(1,2,3,4,5);
return $request;
}
post___in
参数负责告诉查询,把符合数组里指定的post_id的post全部返回给我们。只要我们用自定义查询找到想要的post_id,加到这个参数里,就会和WooCommerce的其它搜索结果一并返回。
增加自定义字段搜索功能的代码
这段代码来自Extending WooCommerce admin product search to use custom fields,放到主题的functions.php
里即可。假定要搜索的自定义字段的meta_key为“ _your_meta_key
”。
/**
* Alter the query vars to include products which have the meta we are searching for.
*
* @param array $query_vars The current query vars.
*
* @return array
*/
function sola_request_query( $query_vars ) {
global $typenow;
global $wpdb;
global $pagenow;
// 确保仅在后台产品列表页面运行
if ( 'product' === $typenow && isset( $_GET['s'] ) && 'edit.php' === $pagenow ) {
$meta_key = '_your_meta_key'; // 要搜索的meta_key
$search_term = esc_sql( sanitize_text_field( $_GET['s'] ) );
$post_types = array( 'product', 'product_variation' );
$sql = "SELECT DISTINCT posts.ID as product_id, posts.post_parent as parent_id
FROM {$wpdb->posts} posts
LEFT JOIN {$wpdb->postmeta} AS postmeta ON posts.ID = postmeta.post_id
WHERE postmeta.meta_key = '{$meta_key}'
AND postmeta.meta_value LIKE %s
AND posts.post_type IN ('" . implode( "','", $post_types ) . "')
ORDER BY posts.post_parent ASC, posts.post_title ASC";
$search_results = $wpdb->get_results(
$wpdb->prepare( $sql,'%' . $wpdb->esc_like( $search_term ) . '%' )
);
// 将查询到的parent_id和product_id合并,去除重复数据
$product_ids = wp_parse_id_list( array_merge( wp_list_pluck( $search_results, 'product_id' ), wp_list_pluck( $search_results, 'parent_id' ) ) );
// 修改query_vars,将查询到的产品id放到post_in参数里,该参数的作用是直接指定要获取的post
$query_vars['post__in'] = array_merge( $product_ids, $query_vars['post__in'] );
}
return $query_vars;
}
add_filter( 'request', 'sola_request_query', 20 );
给产品列表增加自定义字段
我们来实际测试一下,先在后台的产品列表增加一个自定义字段,meta_key是“_your_meta_key
”。
add_filter( 'manage_product_posts_columns', 'sola_new_custom_product_columns' );
function sola_new_custom_product_columns( $columns ){
$newColumns = [
'my_custom_column' => '自定义字段',
];
return array_slice( $columns, 0, 2 ) + $newColumns + $columns;
}
add_action( 'manage_product_posts_custom_column', 'sola_show_custom_product_columns', 10, 2 );
function sola_show_custom_product_columns( $column, $post_id ){
switch( $column ){
case 'my_custom_column' :
echo esc_html( get_post_meta( $post_id, '_your_meta_key', true) );
break;
}
}
再增加了自定义字段搜索的代码后,我们就能搜到这个自定义字段了,如下所示:
如何给产品增加自定义字段
你可以用Advanced Custom Fields插件创建字段,也可以用代码,例如在之前文章WooCommerce 后台自定义产品选项中提到的方法。
函数解释
在代码中出现了一些WordPress函数,简单解释一下用法。
wp_list_pluck()
从数组或对象里提取一个字段,类似PHP的array_column()函数。
$foods = array(
array(
'name' => 'Banana',
'color' => 'Yellow',
),
array(
'name' => 'Apple',
'color' => 'Red',
),
array(
'name' => 'Lettuce',
'color' => 'Green',
),
array(
'name' => 'Apple',
'color' => 'Red',
),
);
$food_names = wp_list_pluck( $foods, 'name' );
/*
* 返回值
* array ( 0 => 'Banana', 1 => 'Apple', 2 => 'Lettuce', 3 => 'Apple' )
*/
wp_parse_id_list()
清理一组ID,如果输入是空格或逗号分隔的数组,先转成数组,再去除重复。如果是一个数组,去除重复。
$ids = array(1,1,2,3,4);
$cleaned_ids = wp_parse_id_list( $ids );
/*
* 返回值
* array ( 0 => 1, 2 => 2, 3 => 3, 4 => 4 )
*/
$ids = '1 2 45 67 9 9';
$cleaned_ids = wp_parse_id_list( $ids );
/*
* 返回值
* array ( 0 => 1, 1 => 2, 2 => 45, 3 => 67, 4 => 9 )
*/
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论