如何在自定义分类的产品中搜索



我创建了一个post类型"product"以及名为"产品类别"的自定义分类法。

我在searchform.php中创建了一个通用的产品搜索,并像这样调用archive-product.php:

<div class="search-wrapper">
<form role="search" method="get" id="searchform" action="<?php echo esc_url(site_url('products/')); ?>">
<input type="text" value="" name="s" id="s" placeholder="Search products" />
<input type="submit" id="searchsubmit" value="" />
</form>
</div>

还有search。php我从archive-product。php中复制所有内容

问题是,当用户在分类法产品搜索查询中只获得当前分类法产品并在其中搜索(而不是所有产品)时,我如何更改上面的代码?

我的分类法模板文件是taxonomy-product-cat.php

另外,如果我需要创建新的搜索模板文件,如search-products-cat.php或任何我需要做的过程,请提及它。由于

解决您的请求:如果我需要创建新的搜索模板文件,如search-products-cat.php或其他…,请注意创建自定义搜索的两种常用方法是:使用

  1. searchform.php,

  2. 使用get_search_form过滤器钩子(带有pre_get_posts动作钩子)。

下面的解决方案使用get_search_form过滤钩子。要测试它,将代码放入子主题或插件中,并在应该显示表单的位置使用get_search_form()函数。对get_search_form()的调用触发get_search_form要执行的过滤器

使用过滤器挂钩,您不需要创建多个模板搜索文件。但是,你需要用适当的设计模式来组织你的代码,以处理各种情况(例如,不同的product-cat术语的不同搜索页面设计)。当使用searchform.php时,您应该能够轻松地修改下面的示例代码以满足您的目的.

代码演示的基本思想是:

  1. 添加发送到前端的自定义搜索过滤器,并且

  2. 解析搜索过滤器,并在后端将其添加到WP_Query中。

您可以通过多种方式添加自定义搜索过滤器。一种方法是使用<input type="hidden" />字段。当提交搜索表单时,可以通过标记名解析隐藏字段,并将值添加到搜索查询中。示例代码如下:

get_search_form过滤器钩子

/**
* Render a custom search form.
*/
function custom_search_form( $form ) {
// Post type plural name or the value configured for the `rewrite['slug']` register_post_type option
$custom_post_type_plural = 'products';
$custom_taxonomy = 'product-cat';
$current_post_id = get_the_ID();
$related_term_ids = wp_get_object_terms(
$current_post_id,
$custom_taxonomy,
array(
'fields' => 'ids'
)
);
// home_url() is used by site visitors.
// site_url() is the location of the WordPress installation.
// They are often the same, but not always.
$home_url = home_url( $custom_post_type_plural ) . '/';
if ( is_singular() ) {
$related_term_id_list = esc_attr( implode( ',', $related_term_ids ) );
} else {
$related_term_id_list = '';
}
$search_query = esc_attr( get_search_query() );
$form = <<<EOHTML
<div class="search-wrapper">
<form
role="search"
method="GET"
id="searchform"
action="$home_url"
>
<input type="text" name="s" id="s" placeholder="Search products" value="$search_query" />
<input type="hidden" name="product_cat_term_list" value="$related_term_id_list" />
<input type="submit" id="searchsubmit" value="Search" />
</form>
</div>
EOHTML;
return $form;
}
add_filter( 'get_search_form', 'custom_search_form' );

pre_get_posts动作钩子

/**
* Update the query variable 'tax_query' in the WP_Query object.
* The action hook 'pre_get_posts' allows you to
* update the query before it is executed.
*
* @see https://developer.wordpress.org/reference/hooks/pre_get_posts/#targeting-the-right-query
*
*/
function target_product_cat_query_with_conditional_tags( $query ) {
$custom_post_type = 'product';
$custom_taxonomy = 'product-cat';
$term_ids_form_field_name = 'product_cat_term_list';
if ( ! $query->is_admin() &&
$query->is_search() &&
isset( $_GET[ $term_ids_form_field_name ] ) &&
! empty( $_GET[ $term_ids_form_field_name ] )
) {
// Get the product-cat-term-ids and add them to the tax_query
$related_term_id_list = $_GET[ $term_ids_form_field_name ];
$related_term_ids = explode( ',', $related_term_id_list );
$tax_query = array(
array(
'taxonomy' => $custom_taxonomy,
'field' => 'term_id',
'terms' => $related_term_ids
)
);
$query->set( 'tax_query', $tax_query );
}
}
add_action( 'pre_get_posts', 'target_product_cat_query_with_conditional_tags' );

相关内容

  • 没有找到相关文章

最新更新