Yanıtlar:
İş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(); ?>
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/
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_type
VAR'a $post_type[0]
.
http://localhost:3000/?s=cloud%27&post_type=product
mıhttp://localhost:3000/search/cloud/product
search_template
filtre daha uygun bir alternatif gibi görünüyortemplate_include
İş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!
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');
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.
get_search_form('true')
olmalıdır get_search_form(true)
. veya get_search_form
bir 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. true
false
'true'
'false'
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');