【问题标题】:How to force Wordpress search bar to search pages not products?如何强制 Wordpress 搜索栏搜索页面而不是产品?
【发布时间】:2017-11-18 07:10:49
【问题描述】:

首先让我说我几乎没有在 stackoverflow 上发过帖子,所以我希望我在正确的部分。

我为我的客户提供了一个带有 Woocommerce 的 Wordpress 网站。我希望搜索栏不搜索产品,而是搜索页面。忽略所有产品很重要,因为我们不从产品页面订购产品,而是在多个页面上以产品名称为标题的订单表格集合。我们可以更改搜索栏,让它只在页面上而不是产品上拾取吗?

我对在 functions.php 中工作或在我的子主题中复制 Woocommerce 文件感到满意。非常感谢任何帮助!

[** 已编辑/更新 **] 我现在有这个:

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

这是完美的工作。它搜索页面而不是产品,它在标题而不是内容中搜索搜索词。现在我唯一的要求和问题是我需要让它输出页面链接而不是页面内容。 (输出页面的纯内容,一个接一个)

[** 已编辑/更新 #2 **]

我通过删除所有代码并将 product-searchform.php(来自 woocommerce)复制到我的子主题(在名为 woocommerce 的文件夹中)并进行更改来获得与上述相同的结果:

<input type="hidden" name="post_type" value="product" />

<input type="hidden" name="post_type" value="page" />

这实现了只查询页面而不是产品的相同效果,以及在页面标题中搜索关键字而不是在页面内容中搜索。现在我仍然得到它显示页面内容的相同输出,我只希望它显示页面链接,而不是内容。有什么想法吗?

[** 编辑/更新 3 **] 好的,我解决了这个问题。

下一步是将 search.php 复制到您的子主题中并添加一些代码。 添加:

$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');分手吧。

【问题讨论】:

  • @Dwhitz 我刚刚尝试了一些代码,请在我的原始帖子中查看我的更新。现在我只需要它来输出页面链接而不是页面内容。例如,我可能有 5 个页面与此匹配,并且我不希望所有 5 个页面内容一个接一个地输出。相反,我需要链接列表

标签: wordpress woocommerce searchbar


【解决方案1】:

尝试在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');

【讨论】:

  • 它肯定是搜索页面而不是产品,但输出是每个页面的内容一个接一个地粘贴。这很容易改变,所以我可以只输出链接列表而不是输出每个页面的内容吗?如果有办法只搜索页面标题而不搜索页面内容,我会更喜欢。例如,一些词出现在关于我们等页面中
  • 在我的更新下查看我在哪里
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 2011-05-16
  • 1970-01-01
相关资源
最近更新 更多