如何强制 Wordpress 搜索栏搜索页面而不是产品?
How to force Wordpress search bar to search pages not products?
首先让我说我几乎没有在 Whosebug 上发帖所以我希望我在正确的部分。
我有一个带有 Woocommerce 的 Wordpress 网站供我的客户使用。我希望搜索栏不搜索产品而是搜索页面。忽略所有产品很重要,因为我们不从产品页面订购产品,而是我在多个页面上有 collections 的订单表格,标题为产品名称。我们能否更改搜索栏,使其只搜索页面而不搜索产品?
我很乐意在 functions.php 中工作或在我的 child 主题中复制 Woocommerce 文件。非常感谢任何帮助!
[** EDITED/UPDATE **]
我现在有这个:
function filter_search($query) {
if ($query->is_search) {
$query->set('post_type', array('post', 'page'));
}
return $query;
}
add_filter('pre_get_posts', 'filter_search');
function __search_by_title_only( $search, &$wp_query ){
global $wpdb;
if ( empty( $search ) )
return $search; // skip processing - no search term in query
$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 = '') ";
}
$search .= " AND ($wpdb->posts.post_type = 'page') ";
return $search;
}
add_filter( 'posts_search', '__search_by_title_only', 500, 2 );
效果很好。它搜索页面而不是产品,它搜索标题中的搜索词而不是内容。现在我唯一的要求和问题是我需要让它输出页面 LINK 而不是页面内容。 (输出页面纯内容,一个接一个)
[** EDITED/UPDATE #2 **]
我通过删除所有代码并将 product-searchform.php(来自 woocommerce)复制到我的 child 主题中(在名为 woocommerce 的文件夹中),实现了与上述相同的结果并更改:
<input type="hidden" name="post_type" value="product" />
至
<input type="hidden" name="post_type" value="page" />
这实现了只查询页面而不查询产品,以及在页面标题中搜索关键字而不是在页面内容中搜索的相同效果。现在我仍然得到它显示页面内容的相同输出,我只希望它显示 link 到页面,而不是内容。有什么想法吗?
[** EDITED/UPDATE 3 **]
好的,我解决了这个问题。
下一步是将 search.php 复制到您的 child 主题中并添加一些代码。
添加:
$s=get_search_query();
$args = array('s' =>$s);
// The Query
$the_query = new WP_Query( $args );
就在
之前
if ( have_posts() ) : ?>
然后添加:
while ( $the_query->have_posts() ) {
$the_query->the_post();?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li><?php
}
之前:
get_template_part( 'loop' );
并评论 get_template_part('loop');分手了。
尝试在functions.php
中添加这段代码
function filter_search($query) {
if ($query->is_search) {
$query->set('post_type', array('post', 'page'));
};
return $query;
};
add_filter('pre_get_posts', 'filter_search');
首先让我说我几乎没有在 Whosebug 上发帖所以我希望我在正确的部分。
我有一个带有 Woocommerce 的 Wordpress 网站供我的客户使用。我希望搜索栏不搜索产品而是搜索页面。忽略所有产品很重要,因为我们不从产品页面订购产品,而是我在多个页面上有 collections 的订单表格,标题为产品名称。我们能否更改搜索栏,使其只搜索页面而不搜索产品?
我很乐意在 functions.php 中工作或在我的 child 主题中复制 Woocommerce 文件。非常感谢任何帮助!
[** EDITED/UPDATE **] 我现在有这个:
function filter_search($query) {
if ($query->is_search) {
$query->set('post_type', array('post', 'page'));
}
return $query;
}
add_filter('pre_get_posts', 'filter_search');
function __search_by_title_only( $search, &$wp_query ){
global $wpdb;
if ( empty( $search ) )
return $search; // skip processing - no search term in query
$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 = '') ";
}
$search .= " AND ($wpdb->posts.post_type = 'page') ";
return $search;
}
add_filter( 'posts_search', '__search_by_title_only', 500, 2 );
效果很好。它搜索页面而不是产品,它搜索标题中的搜索词而不是内容。现在我唯一的要求和问题是我需要让它输出页面 LINK 而不是页面内容。 (输出页面纯内容,一个接一个)
[** EDITED/UPDATE #2 **]
我通过删除所有代码并将 product-searchform.php(来自 woocommerce)复制到我的 child 主题中(在名为 woocommerce 的文件夹中),实现了与上述相同的结果并更改:
<input type="hidden" name="post_type" value="product" />
至
<input type="hidden" name="post_type" value="page" />
这实现了只查询页面而不查询产品,以及在页面标题中搜索关键字而不是在页面内容中搜索的相同效果。现在我仍然得到它显示页面内容的相同输出,我只希望它显示 link 到页面,而不是内容。有什么想法吗?
[** EDITED/UPDATE 3 **] 好的,我解决了这个问题。
下一步是将 search.php 复制到您的 child 主题中并添加一些代码。 添加:
$s=get_search_query();
$args = array('s' =>$s);
// The Query
$the_query = new WP_Query( $args );
就在
之前if ( have_posts() ) : ?>
然后添加:
while ( $the_query->have_posts() ) {
$the_query->the_post();?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li><?php
}
之前:
get_template_part( 'loop' );
并评论 get_template_part('loop');分手了。
尝试在functions.php
中添加这段代码function filter_search($query) {
if ($query->is_search) {
$query->set('post_type', array('post', 'page'));
};
return $query;
};
add_filter('pre_get_posts', 'filter_search');