Bagaimana cara membuat pencarian khusus untuk jenis posting kustom?

44

Saya memiliki bidang pencarian untuk posting blog, tetapi saya membutuhkan yang lain untuk jenis posting kustom. Bagaimana saya bisa membuat formulir pencarian kustom ini dengan tata letak hasil pencarian yang berbeda ?

robert
sumber

Jawaban:

61

Inilah yang saya coba dan dapatkan solusi dengan 3 langkah. Katakanlah jenis posting khusus Anda adalah " produk "

1. Tambahkan Kode Fungsi di sini Anda dapat menentukan 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. Buat template hasil pencarian untuk jenis posting khusus (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 "$s"; ?> </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(); ?>
  1. Buat Formulir Pencarian
    Dalam Formulir Pencarian ini, nilai "produk" disembunyikan dan hanya akan mencari posting produk .

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

untuk lebih lanjut, saya ingin menghubungkan Anda ke sini
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/

Ronald
sumber
Kiat: saat mendaftarkan jenis posting, argumen publicly_queryable harus disetel ke true . Jika tidak, get_query_var ('post_type') tidak akan pernah mengembalikan nilai post_type yang diberikan dalam argumen url. codex.wordpress.org/Function_Reference/…
Gustavo
Sunting tip / saran lainnya: get_query_var('post_type')mengembalikan array (bukan string) sehingga tidak dapat dibandingkan secara langsung. Karena saya hanya mencari satu jenis posting pada suatu waktu, saya hanya mengubah $post_typevar saya menjadi $post_type[0].
indextwo
apakah ada cara untuk menulis ulang url dari http://localhost:3000/?s=cloud%27&post_type=productkehttp://localhost:3000/search/cloud/product
YarGnawh
@YarGnawh Maaf atas keterlambatan respons, lihat ini wordpress.stackexchange.com/questions/15418/… . Ada sebuah plugin yang disebut rewrite too wordpress.org/plugins/rewrite
Ronald
yang search_templatepenyaring tampaknya menjadi alternatif yang lebih tepat untuktemplate_include
Alexey Kosov
6

Inilah yang bekerja untuk saya. Tidak sebersih tapi saya tidak bisa mendapatkan jawaban yang lain untuk bekerja.

Formulir pencarian untuk Jenis Posting Kustom:

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

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

Di 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; ?>

Secara alami di ketiga tempat Anda harus mengganti "buku" dengan jenis pos kustom Anda.

Semoga ini bisa membantu seseorang!

Tali sepatu
sumber
2

Kode pendek lebih teraktualisasi

 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'); 
Raylin Aquino Fernández
sumber
2

Saya mencari untuk menggunakan dua bentuk berbeda untuk pencarian normal saya dan pencarian saya pada jenis posting kustom.

Jenis posting kustom saya menggunakan tajuk yang berbeda dari halaman normal, pada halaman normal saya, panggilan ke formulir pencarian saya adalah:

<?php get_search_form(true); ?>

Dan panggilan ke formulir pencarian saya di header tipe posting kustom adalah:

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

Yang memiliki bidang tambahan:

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

Dalam file fungsi saya memiliki kode berikut yang telah Anda berikan.

/** 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');

Yang mendeteksi jika formulir pencarian melakukan pencarian di dalam bidang khusus, sehingga menampilkan pencarian di templat kustom, jika tidak gunakan templat normal.

Sunting: memperbaiki panggilan fungsi get_search_form () yang akan mengembalikan true apa pun yang terjadi.

Fliberty
sumber
1
Layak dicatat, tetapi get_search_form('true')seharusnya get_search_form(true). get_search_formsedang mencari input boolean, jadi salah satu trueatau false. Dengan membungkusnya dalam tanda kutip, Anda memberinya string, bukan parameter boolean. Cara fungsi diatur, keduanya 'true'dan 'false'akan mengembalikan hasil yang sama, karena keduanya adalah string yang tidak kosong (yang menyebabkan fungsi mengembalikan true dalam kedua kasus).
Mike
1

Untuk memperbaiki masalah pencarian input kosong, Anda dapat mengganti kode fungsi dengan ini:

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');
ciccioformaggio
sumber
3
Akan lebih baik jika Anda menjelaskan cara kerja kode Anda, sebuah pengungkapan sumber kode Anda
Pieter Goosen