使用 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' );

那么需要什么修改呢?

URLhttp://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 列时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 产品搜索中启用自定义分类

WooCommerce 按标签或描述搜索产品查询帖子

php 必须使用搜索结果产品存档模板与WooCommerce一起工作

搜索产品woocommerce时查询缓慢

php 按类别筛选搜索 - woocommerce产品

php WooCommerce产品搜索