Özel gönderi türü için özel bir arama nasıl oluşturulur?


44

Blog gönderileri için bir arama alanım var, ancak özel bir gönderi türü için bir başkasına ihtiyacım var. Nasıl bu oluşturabilir özel arama formunu bir ile farklı arama sonucu düzen ?

Yanıtlar:


61

İşte denedim ve 3 adımda bir çözüm. Özel gönderi türünüzün " ürünler " olduğunu varsayalım

1. Buraya İşlev Kodu Eklemek için archive-search.php belirtebilirsiniz

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. Özel gönderi türü için arama sonucu şablonu oluşturma (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. Arama Formu Oluştur
    Bu Arama Formunda "ürünler" değeri gizlenir ve sadece ürün kayıtlarını arar .

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

daha fazlası için, sizi buraya bağlamak istiyorum
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/


İpucu: Gönderi türünü kaydederken publicly_queryable argümanı true değerine ayarlanmalıdır . Aksi takdirde, get_query_var ('post_type'), url argümanında verilen post_type değerini asla döndürmez. codex.wordpress.org/Function_Reference/…
Gustavo

Başka bir ipucu / önerilen düzenleme: get_query_var('post_type')bir dizge (dizeden ziyade) döndürdüğü için doğrudan karşılaştırılamaz. Sadece bir defada bir mesaj türünü Arıyorum beri, sadece benim değişti $post_typeVAR'a $post_type[0].
indextwo

URL'yi yeniden yazmak için bir yol var http://localhost:3000/?s=cloud%27&post_type=producthttp://localhost:3000/search/cloud/product
YarGnawh

@YarGnawh Geç cevap için özür dilerim, bu kelimeyi kontrol edin wordpress.stackexchange.com/questions/15418/… . Wordpress.org/plugins/rewrite
Ronald

Bu search_templatefiltre daha uygun bir alternatif gibi görünüyortemplate_include
Alexey Kosov

6

İşte benim için işe yarıyor. O kadar temiz değil ama bu diğer cevapların hiçbirini işe alamadım.

Özel Gönderi Türü için arama formu:

<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 içinde:

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 içinde:

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

Doğal olarak, her üç yerde de "kitap" ı özel yazı türünüzle değiştirmeniz gerekir.

Umarım bu birine yardımcı olur!


2

Daha kısa bir kod

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

2

Normal aramalarım ve özel yazı tipindeki aramalarım için iki farklı form kullanmak istiyordum.

Özel gönderi türüm normal sayfalardan farklı bir başlık kullanıyor, normal sayfamda arama formuma yapılan çağrı:

<?php get_search_form(true); ?>

Özel yazı tipi başlığındaki arama formuma yapılan çağrı:

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

Hangisinin ek bir alanı var:

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

Fonksiyonlar dosyasında verdiğiniz aşağıdaki kod var.

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

Bu, arama formunun özel alanlar içinde arama yapıp yapmadığını algılar, böylece aramayı özel bir şablonda gösterir, aksi takdirde normal şablonu kullanın.

Düzenleme: ne olursa olsun doğru döndüren get_search_form () işlev çağrısı düzeltildi.


1
Kayda değer, ancak get_search_form('true')olmalıdır get_search_form(true). veya get_search_formbir boole girişi arıyor . Tırnak işaretleri içine alarak bir boolean parametresi değil, bir dize besliyorsunuzdur. Fonksiyon kurulduğundan, hem bu şekilde ve onlar (fonksiyon her iki durumda da gerçek dönmek neden olur) hem boş olmayan dizeler, çünkü aynı sonucu döndürecektir. truefalse'true''false'
Mike,

1

Boş giriş arama sorununu düzeltmek için işlev kodunu bununla değiştirebilirsiniz:

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

3
Kodunuzun nasıl çalıştığını
açıklarsanız
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.