仅限WooCommerce产品搜索标题

时间:2013-09-04 作者:kristina childs

我之前问过这个问题,并使用Relevanssi 插件,但是那个插件现在坏了,所以我不能再使用它了。woocommerce怎么会让如此简单的事情变得如此不可能??啊啊!

我试过使用this solution, 但这似乎对我不起作用。我也试着搜索woocommerceproduct_search 函数并向其中添加了一个过滤器,但也没有取得任何效果。

这是我最后一次尝试,它仍然返回所有内容的搜索结果,而不仅仅是标题:

标记

<form role="search" method="get" id="searchform" action="<?php echo home_url( \'/\' ); ?>">
    <input type="hidden" name="post_type" value="product" />
    <input type="text" value="" name="s" />
    <input type="submit" value="Search" />
</form> 
搜索SQL筛选器回调

// Search product titles only.
function __search_by_title_only( $search, &$wp_query ) {
    global $wpdb;
    if($_GET[\'post_type\'] = \'product\' )
        return $search;
    $q = $wp_query->query_vars;
    $n = ! empty( $q[\'exact\'] ) ? \'\' : \'%\';
    $search =
    $searchand = \'\';
    foreach ( (array) $q[\'search_terms\'] as $term ) {
        $term = esc_sql( like_escape( $term ) );
        $search .= "{$searchand}($wpdb->posts.post_title LIKE \'{$n}{$term}{$n}\')";
        $searchand = \' AND \';
    }
    if ( ! empty( $search ) ) {
        $search = " AND ({$search}) ";
        if ( ! is_user_logged_in() )
            $search .= " AND ($wpdb->posts.post_password = \'\') ";
    }
    return $search;
}
add_filter( \'posts_search\', \'__search_by_title_only\', 500, 2 );
有人吗?我想这与woocommerce的帖子类型本身有关。。。他们喜欢放很多定制挂钩之类的东西。

2 个回复
SO网友:Vinicius Garcia

这是一个9个月的问题,但由于我遇到了同样的问题并找到了解决方案,我来这里发布它。

已存档wp-content/plugins/woocommerce/classes/class-wc-query.php, 作用pre_get_posts( $q ), WooCommerce在第114行定义:

add_filter( \'posts_where\', array( $this, \'search_post_excerpt\' ) );
这就是WooCommerce将您的查询搞砸的时候!

功能search_post_excerpt 定义在第132行,您可以看到他将摘录添加到搜索查询中。

因此,您有两种解决方案:

糟糕的是,评论第114行!

//add_filter( \'posts_where\', array( $this, \'search_post_excerpt\' ) );
好的一个,我没有实现自己,但应该像添加过滤器一样posts_where 在WooCommerce之后运行并修复它。或者取下过滤器。

我会更好地寻找好的解决方案,我保证我会把它张贴在这里。但糟糕的解决方案很好地解决了这一问题。

SO网友:kaiser

到目前为止,你的插件看起来不错。能否转储最后一个SQL字符串并将其添加到问题中?另外:WC插件是否将posts表中的所有内容保存为post类型?如果是:您是否添加了仅按此帖子类型搜索的限制?您可能需要在$posts_clauses-中的筛选器$clauses[\'where\'] 子句或内部posts_where-滤器只需字符串替换post_type = post 使用WC中的自定义帖子类型。

结束

相关推荐

private functions in plugins

我开发了两个插件,其中一个功能相同(相同的名称,相同的功能)。当试图激活两个插件时,Wordpress会抛出一个错误,因为它不允许我以相同的名称定义函数两次。有没有一种方法可以使这个函数只对插件私有,而不使用面向对象编程,也不简单地重命名函数?我不想使用OOP,因为我首先要学习它。此外,我不想重命名该函数,因为我可能也想在其他插件中使用它,而重命名感觉不太合适。