我有一个用于博客帖子的搜索字段,但是我需要另一个用于自定义帖子类型的字段。如何创建具有不同搜索结果布局的此自定义搜索表单?

#1 楼

这是我尝试过的并获得3个步骤的解决方案。假设您的自定义帖子类型为“产品”
1。在此处添加功能代码,您可以指定archive-search.php
function template_chooser($template)   
{    
  global $wp_query;   
  $post_type = get_query_var('post_type');   
  if( $wp_query->is_search && $post_type == 'products' )   
  {
    return locate_template('archive-search.php');  //  redirect to archive-search.php
  }   
  return $template;   
}
add_filter('template_include', 'template_chooser');    

2。为自定义帖子类型创建搜索结果模板(archive-search.php)
        <?php
        /* Template Name: Custom Search */        
        get_header(); ?>             
        <div class="contentarea">
            <div id="content" class="content_right">  
                     <h3>Search Result for : <?php echo htmlentities($s, ENT_QUOTES, 'UTF-8'); ?> </h3>       
                     <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>    
                <div id="post-<?php the_ID(); ?>" class="posts">        
                     <article>        
                    <h4><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h4>        
                    <p><?php the_exerpt(); ?></p>        
                    <p align="right"><a href="<?php the_permalink(); ?>">Read     More</a></p>    
                    <span class="post-meta"> Post By <?php the_author(); ?>    
                     | Date : <?php echo date('j F Y'); ?></span>    

                    </article><!-- #post -->    
                </div>
        <?php endwhile; ?>
    <?php endif; ?>




           </div><!-- content -->    
        </div><!-- contentarea -->   
        <?php get_sidebar(); ?>
        <?php get_footer(); ?>
 



构建搜索表单
在此搜索表单中,值“ products”为隐藏,它将仅搜索产品信息。
 <div>   
    <h3>Search Products</h3>
    <form role="search" action="<?php echo site_url('/'); ?>" method="get" id="searchform">
    <input type="text" name="s" placeholder="Search Products"/>
    <input type="hidden" name="post_type" value="products" /> <!-- // hidden 'products' value -->
    <input type="submit" alt="Search" value="Search" />
  </form>
 </div>



更多信息,我想将您链接到此处http://www.wpbeginner.com/wp-tutorials/如何在WordPress中为自定义帖子类型创建高级搜索形式/

评论


提示:注册帖子类型时,必须将publicly_queryable参数设置为true。如果不是,则get_query_var('post_type')将永远不会返回url参数中给出的post_type值。 codex.wordpress.org/Function_Reference/…

–古斯塔沃
15年5月21日在17:46



另一个提示/建议的编辑:get_query_var('post_type')返回一个数组(而不是字符串),因此无法直接进行比较。由于我一次只搜索一种帖子类型,因此我只需将$ post_type var更改为$ post_type [0]。

– indextwo
16年4月8日在15:51

有没有办法将网址从http:// localhost:3000 /?s = cloud%27&post_type = product重写为http:// localhost:3000 / search / cloud / product

– YarGnawh
17年11月6日在16:33

@YarGnawh对不起,请您稍后回复,请访问wordpress.stackexchange.com/questions/15418/…。还有一个名为rewrite的插件wordpress.org/plugins/rewrite

–罗纳德
17年11月13日在11:20



search_template过滤器似乎是template_include的更合适的选择

–阿列克谢·科索夫(Alexey Kosov)
18年7月19日在13:02

#2 楼

这是对我有用的。不太干净,但是我无法获得其他任何答案。

自定义帖子类型的搜索表单:

<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
    <label>
        <span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ) ?></span>
        <input type="search" class="search-field" placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder' ) ?>" value="<?php echo get_search_query() ?>" name="s" title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
        <input type="hidden" name="post_type" value="book" />
    </label>
    <input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>


在functions.php:

function searchfilter($query) {
    if ($query->is_search && !is_admin() ) {
        if(isset($_GET['post_type'])) {
            $type = $_GET['post_type'];
                if($type == 'book') {
                    $query->set('post_type',array('book'));
                }
        }       
    }
return $query;
}
add_filter('pre_get_posts','searchfilter');


在search.php:

<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
    <?php if(isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
           if($type == 'book') {?>

               /* Format for "book" custom post type */

           <?php } else { ?>

               /* Format for custom post types that are not "book,"
               or you can use elseif to specify a second post type the
               same way as above. Copy the default format here if you
               only have one custom post type. */

           <?php } ?>
    <?php } else { ?>

              /* Format to display when the post_type parameter
              is not set (i.e. default format) */
<?php } ?>
<?php endwhile; else: ?>

/* What to display if there are no results. */

<?php endif; ?>


自然地,在所有三个地方我需要用您的自定义帖子类型替换“书”。

希望对您有所帮助!

#3 楼

要解决输入查询为空的问题,可以用以下代码替换功能代码:

function template_chooser($template)   
{    
 global $wp_query;   
 $post_type = get_query_var('post_type');   
 if( isset($_GET['s']) && $post_type == 'products' )   
 {
  return locate_template('archive-search.php');  //  redirect to archive-search.php
 }   
 return $template;   
}
add_filter('template_include', 'template_chooser');


评论


如果您解释代码的工作原理,并揭示您的代码来源,那就太好了

–Pieter Goosen
2014年9月16日11:00

#4 楼

简短的代码更加具体化

 function template_chooser($template)   
{    
  global $wp_query; 
  $post_type = $wp_query->query_vars["pagename"];   
  if( isset($_GET['s']) && $post_type == 'products' )   
  {

    return locate_template('archive-search.php');  //  redirect to archive-search.php
  }   
  return $template;   
}
add_filter('template_include', 'template_chooser'); 


#5 楼

我想使用两种不同的形式进行常规搜索以及对自定义帖子类型的搜索。

我的自定义帖子类型使用的标题与普通页面不同,在普通页面上,搜索表单是:

<?php get_search_form(true); ?>


在自定义帖子类型标题中对我的搜索表单的调用是:

<?php get_template_part('search','library'); ?>


其中还有一个附加字段:

<input type="hidden" name="post_type" value="library" /> //Where "library" is my custom post type.


在功能文件中,我提供了以下代码。

/** Custom Search for Library */
function search_library($template)   
{    
  global $wp_query;   
  $post_type = get_query_var('post_type');   
  if( $wp_query->is_search && $post_type == 'library' )   
  {
    return locate_template('search-library.php');  //  redirect to archive-search.php
  }   
  return $template;   
}
add_filter('template_include', 'search_library');


检测到搜索表单是否在自定义字段中进行搜索,从而在自定义模板中显示搜索,否则使用常规模板。 )函数调用,无论如何它都将返回true。

评论


值得注意的是,但是get_search_form('true')应该是get_search_form(true)。 get_search_form正在寻找布尔输入,因此为true或false。通过将其包装在引号中,您将为它提供一个字符串,而不是布尔参数。函数的设置方式,“ true”和“ false”都将返回相同的结果,因为它们都是非空字符串(这两种情况都会导致函数返回true)。

–迈克
18-2-22在1:29

#6 楼

在WooCommerce(产品发布类型)搜索案例中,
只需将woocommerce / templates / archive-product.php文件复制到您的子主题,然后对其进行自定义...为此需要1个小时! :(