如何创建自定义帖子类型的自定义搜索?

时间:2013-03-07 作者:robert

我有一个博客帖子的搜索字段,但我需要一个其他的自定义帖子类型。如何使用different 搜索结果布局?

8 个回复
SO网友:Ronald

下面是我尝试过的,并得到了一个包含3个步骤的解决方案。假设您的自定义帖子类型为;products"E;

1.Add Function Code 您可以在此处指定存档搜索。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。创造search result template 用于自定义帖子类型(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_excerpt(); ?></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(); ?>
 
  1. Build Search Form
    在此搜索表单中,值;“产品”;已隐藏,将仅进行搜索product 职位。

     <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/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/

SO网友:Shoelaced

以下是对我有效的方法。没有那么干净,但我无法得到任何其他答案。

Search form for Custom Post Type:

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

In 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\');

In 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; ?>
当然,在这三个地方,你都需要用你的自定义帖子类型来替换“book”。

希望这对别人有帮助!

SO网友:Raylin Aquino Fernández

更实际的简短代码

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

SO网友:Fliberty

我希望使用两种不同的表单进行常规搜索和自定义帖子类型的搜索。

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

<?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\');
它检测搜索表单是否在自定义字段中进行搜索,从而在自定义模板中显示搜索,否则使用普通模板。

编辑:修复了get\\u search\\u form()函数调用,该函数调用无论如何都会返回true。

SO网友:ciccioformaggio

要解决空输入搜索问题,可以用以下代码替换功能代码:

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

SO网友:gtamborero

在WooCommerce(产品帖子类型)搜索案例中,只需复制WooCommerce/模板/归档产品。php文件到您的子主题,然后自定义它。。。1小时!!:(

SO网友:Eduard

我有10个CPT,每个都有自己的搜索结果页面(每个页面有不同的布局),使用它对我来说不起作用。

经过进一步挖掘,我发现了这个this 接近您设置搜索条件的位置。php模板,如果URL中有CPT,则加载另一个模板。

基本上在search.php 您插入以下内容:

<?php

// check to see if there is a post type in the URL
if ( isset( $_GET[\'post_type\'] ) && $_GET[\'post_type\'] ) {

// save it for later
$post_type = $_GET[\'post_type\'];

// check to see if a search template exists
if ( locate_template( \'search-\' . $post_type . \'.php\' ) ) {
    // load it and exit
    get_template_part( \'search\', $post_type );
    exit;
}

}

?>
以及search form 应该是这样的:

<form class="search" action="<?php echo home_url( \'/\' ); ?>">
  <input type="search" name="s" placeholder="Search&hellip;">
  <input type="submit" value="Search">
  <input type="hidden" name="post_type" value="kb_article">
</form>

SO网友:MadAsAWriter

我知道这是一个旧线程,但我在函数中使用自定义短代码。php文件,以支持与特定帖子类型和自定义分类法相关的搜索。我每年都会使用POD作为视频演讲档案,并希望搜索只在这一年内进行。目前正在运行(在my functions.php中):

/*Custom search for Video Archives Year 2020 - adds shortcode [2020search] for the search*/
function video2020searchform( $form ) {

    $form = \'<form role="search" method="get" id="searchform" action="\' . home_url( \'/\' ) . \'" >
    <div class="my-custom-search"><label class="screen-reader-text" for="s">\' . __(\'Search for:\') . \'</label>
    <input type="hidden" name="video_year" value="video-archive-2020" />
    <input type="text" value="\' . get_search_query() . \'" name="s" id="s" placeholder="Search 2020 archives by speaker or keyword..." />
    <input type="submit" id="searchsubmit" value="\'. esc_attr__(\'Search\') .\'" />
    </div>
    </form>\';

    return $form;
}

add_shortcode(\'2020search\', \'video2020searchform\');
// end of 2020 search form.   
然后,我有一个页面,上面有2020年的精彩视频,上面有搜索表单快捷码,这样用户就可以搜索2020年剩下的视频。name="video_year" 是由Pods创建的自定义分类法,post类型也是由Pods创建的,称为;视频“;,和value="video-archive-2020" 是我需要的播客视频年的鼻涕虫。如果您的自定义帖子类型为;书籍“;,“的分类法”;图书类型;您试图将搜索限制为;“冒险”"E;图书类型;将是“name”条目和;“冒险”;将是“值”。希望这对某人有所帮助,并感谢您对以上所有答案的回答!

结束

相关推荐

Search result by range?

我必须搜索标签或自定义字段中有数字(价格)的帖子:示例152。每个帖子都有价格标签。我如何搜索所有高于价格的帖子,例如,我需要搜索所有标价至少为100的帖子。类似/?s=关键字(&M);价格>=300Thx公司