如何仅获取POST=‘产品’

时间:2015-12-18 作者:Adnan Ali

我正在使用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连接,然后显示enter image description here

Code is given below

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\' );

This is to prevent distinct values

  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

Wordpress版本为16和4.4。已安装Woocommerce插件

在这两种情况下,查询都是

Case 1: http://localhost/wp/?s=D34&post_type=product

Case 2: http://localhost/wp/?s=D34

AND wp_posts.post_type = \'product\' AND (wp_posts.post_status = \'publish\') AND (((wp_posts.post_title LIKE \'%D34%\') OR (wp_postmeta.meta_value LIKE \'%D34%\') OR (wp_posts.post_content LIKE \'%D34%\'))) AND (wp_posts.post_password = \'\') AND wp_posts.post_type IN (\'post\', \'page\', \'attachment\', \'product\') AND (wp_posts.post_status = \'publish\') AND (wp_posts.post_type = \'product\')

3 个回复
SO网友:s_ha_dum

如果我理解你的话,你所做的事情是极其复杂的。你所需要的只是一个简单的pre_get_posts 过滤器:

add_filter( \'pre_get_posts\', \'modified_pre_get_posts\' ); 
function modified_pre_get_posts( $query ) { 
  if ( $query->is_search() ) { 
    $query->set( \'post_type\', \'product\' ); 
  } 
  return $query; 
}
加上你的过滤器DISTINCT.

post_type 是一个query parameter rolled into Core. 传递URL,例如localhost/wp/?s=D34&post_type=product 默认情况下,应将查询限制为单一命名帖子类型。你不应该做任何特殊的事情来完成这项工作。事实上,您的过滤器可能会导致故障。

SO网友:Reigel

try this

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\' );
SO网友:Saichon Wongbua

您只需将下面的代码添加到searchform中,即可添加隐藏的输入类型。php

<input type="hidden" value="post" name="product" id="product" />

相关推荐

是否可以取消对特定帖子类型的POSTS_PER_PAGE限制?

我想知道我是否可以取消特定帖子类型的posts\\u per\\u页面限制。在存档中。php页面我显示不同的帖子类型,对于特定的“出版物”帖子类型,我想显示所有帖子。我如何在不影响传统“post”类型的情况下实现这一点?