使用 WooCommerce 产品搜索搜索特定 post_type 表单 post_type 列时出错
Posted
技术标签:
【中文标题】使用 WooCommerce 产品搜索搜索特定 post_type 表单 post_type 列时出错【英文标题】:Error in searching specific post_type form post_type column using WooCommerce product search 【发布时间】:2016-03-24 19:11:04 【问题描述】:我正在使用 this code 从 Wordpress/WooCommerce 网站搜索产品。
我的要求是 URL 就像“http://localhost/wp/?s=D34&post_type=product”
而s=D34
是搜索字符串。
用户何时搜索字符串。将从所有默认字段+产品的custom filed
中搜索数据。下面的代码适用于http://localhost/wp/?s=D34,但是当&post_type=product
与url 连接时,它会显示
代码如下
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 );
$where .= " AND ($wpdb->posts.post_type = 'product') ";
return $where;
add_filter( 'posts_where', 'cf_search_where' );
这是为了防止出现不同的值
function cf_search_distinct( $where )
global $wpdb;
if ( is_search() )
return "DISTINCT"; //to prevent duplicates
return $where;
add_filter( 'posts_distinct', 'cf_search_distinct' );
那么需要什么修改呢?
URL
http://localhost/wp/?orderby=price&post_type=product 工作正常
但是http://localhost/wp/?s=D34&post_type=product 有什么问题
【问题讨论】:
我只是好奇(因为这有点发生在我身上);尝试在您的搜索字段所在页面的某处(临时)添加购物车小部件或任何 woocommerce 小部件(如类别),然后尝试使用您的第二个字符串(使用s=d34
)进行搜索。我想对 woocommerce 进行详细搜索,并且仅当我在带有搜索字段的页面上存在其他一些 woocommerce 小部件时才有效。这可能是 woocommerce 问题...
我只能在这里建议,尝试使用给定的 URL,可能是您的问题与字符 D34 的 url 编码有关,localhost/wp/?post_type=product&s=D34,它可以通过打印 where 子句来洞察您的问题,如下答案建议
@dingo_d 我也认为它的 woo-commerce 问题,或者可能是当包含 post_type ='product' 时它开始在特定文件夹中搜索,就像您在图片“Home/Shop/”中看到的那样,我将尝试您的建议。
@Abhishek 我以前尝试过这个东西,但它没有给出所需的结果但同样的错误。
【参考方案1】:
试试这个
function cf_search_where( $where )
global $pagenow, $wpdb;
// a little debugging will help you..
//print_r ($where);
//die();
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 );
$where .= " AND ($wpdb->posts.post_type = 'product') ";
return $where;
add_filter( 'posts_where', 'cf_search_where' );
根据您更新的问题。
如果您使用print_r ($where);
来检查$where
包含什么值,您会看到类似这样的内容...
http://localhost/wp/?s=D34
AND (((wp1_posts.post_title LIKE '%D34%') OR (wp1_postmeta.meta_value LIKE '%D34%') OR (wp1_posts.post_content LIKE '%D34%')))
AND (wp1_posts.post_password = '')
AND wp1_posts.post_type IN ('post', 'page', 'attachment', 'product')
AND (wp1_posts.post_status = 'publish')
http://localhost/wp/?s=D34&post_type=product
AND (((wp1_posts.post_title LIKE '%D34%') OR (wp1_postmeta.meta_value LIKE '%D34%') OR (wp1_posts.post_content LIKE '%D34%')))
AND (wp1_posts.post_password = '')
AND ( ( wp1_postmeta.meta_key = '_visibility' AND CAST(wp1_postmeta.meta_value AS CHAR) IN ('visible','search') ) )
AND wp1_posts.post_type = 'product'
AND (wp1_posts.post_status = 'publish')
记下wp1_posts.post_type
并获得提示.. 对自己保持灵活并尝试调试。以上是没有$where .= " AND ($wpdb->posts.post_type = 'product') ";
的结果。
【讨论】:
我修改了问题,现在更清楚了,请看一下。我正在投票,如果您修改答案将接受 它应该可以工作...如果没有,那么这是另一个问题..在当前给定的问题上看不到...尝试停用插件...或尝试更改主题。 . 没有活动插件,只有 woocommerce。 我才知道,真正的问题是 URL。这段代码很好。我将查询直接放入代码中进行检查。只有在添加 &post_type=product 问题开始时,它才能与 localhost/wp/?s=D34 正常工作 调试也使用其他主题.. 比如 tweentytwelve以上是关于使用 WooCommerce 产品搜索搜索特定 post_type 表单 post_type 列时出错的主要内容,如果未能解决你的问题,请参考以下文章