कस्टम पोस्ट प्रकार के लिए एक कस्टम खोज कैसे बनाएं?


44

मेरे पास ब्लॉग पोस्ट के लिए एक खोज फ़ील्ड है, लेकिन मुझे कस्टम पोस्ट प्रकार के लिए अन्य की आवश्यकता है। मैं एक अलग खोज परिणाम लेआउट के साथ यह कस्टम खोज फ़ॉर्म कैसे बना सकता हूं ?

जवाबों:


61

यहाँ मैंने कोशिश की है और 3 चरणों के साथ एक समाधान मिला है। मान लें कि आपका कस्टम पोस्ट प्रकार " उत्पाद " है

१। फ़ंक्शन कोड जोड़ें यहां आप संग्रह-खोज को निर्दिष्ट कर सकते हैं। 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');    

२। कस्टम पोस्ट प्रकार (संग्रह- 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. बिल्ड सर्च फॉर्म
    इस सर्च फॉर्म में, मूल्य "उत्पादों" छिपा हुआ है और यह केवल उत्पाद पदों की खोज करेगा ।

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


युक्ति: पोस्ट प्रकार दर्ज करते समय, publicly_queryable तर्क को सही पर सेट किया जाना चाहिए । यदि नहीं, तो get_query_var ('post_type') url वाद में दिए गए post_type मान को कभी वापस नहीं करेगा। codex.wordpress.org/Function_Reference/…
गुस्तावो

एक और टिप / सुझाए गए संपादन: get_query_var('post_type')एक सरणी (बजाय एक स्ट्रिंग) लौटा दी गई ताकि सीधे तुलना नहीं की जा सके। चूंकि मैं एक समय में केवल एक पोस्ट प्रकार खोज रहा हूं, इसलिए मैंने बस अपना $post_typeसंस्करण बदल दिया है $post_type[0]
indextwo

वहाँ से यूआरएल के पुनर्लेखन के लिए एक तरीका है http://localhost:3000/?s=cloud%27&post_type=productकरने के लिएhttp://localhost:3000/search/cloud/product
YarGnawh

@YarGnawh देर से प्रतिक्रिया के लिए क्षमा करें, यह बाहर की जाँच करें wordpress.stackexchange.com/questions/15418/… । एक प्लगइन है जिसे rewrite too wordpress.org/plugins/rewrite
Ronald

search_templateफिल्टर करने के लिए एक अधिक उपयुक्त विकल्प प्रतीत हो रहा हैtemplate_include
एलेक्सी Kosov

6

यहाँ मेरे लिए क्या काम करता है। उतना साफ नहीं है, लेकिन मुझे इनमें से कोई भी जवाब काम नहीं मिला।

कस्टम पोस्ट प्रकार के लिए खोज फ़ॉर्म:

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

फ़ंक्शन में।

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

खोज में।

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

स्वाभाविक रूप से सभी तीन स्थानों पर आपको अपने कस्टम पोस्ट प्रकार के साथ "पुस्तक" को बदलना होगा।

आशा है कि यह किसी की मदद करता है!


2

एक छोटा कोड अधिक वास्तविक

 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

मैं अपनी सामान्य खोजों और कस्टम पोस्ट प्रकार पर अपनी खोजों के लिए दो भिन्न रूपों का उपयोग करना चाह रहा था।

मेरा कस्टम पोस्ट प्रकार सामान्य पृष्ठों की तुलना में एक भिन्न शीर्षक का उपयोग करता है, मेरे सामान्य पृष्ठ पर, मेरे खोज फ़ॉर्म में कॉल है:

<?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_search_form () फ़ंक्शन कॉल को ठीक किया, जो कि कोई भी बात नहीं हुई है।


1
वर्थ नोटिंग, लेकिन get_search_form('true')होना चाहिए get_search_form(true)get_search_formएक बूलियन इनपुट की तलाश में है, तो या तो है trueया false। इसे उद्धरणों में लपेटकर आप इसे एक स्ट्रिंग खिला रहे हैं, बूलियन पैरामीटर नहीं। जिस तरह से समारोह की स्थापना की है, दोनों कि 'true'और 'false'एक ही परिणाम वापसी होगी, क्योंकि वे दोनों गैर रिक्त स्ट्रिंग (जो समारोह दोनों ही मामलों में सही वापस जाने के लिए कारण बनता है) कर रहे हैं।
माइक

1

खाली इनपुट खोज समस्या को ठीक करने के लिए आप इसके साथ फ़ंक्शन कोड स्थानापन्न कर सकते हैं:

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
बहुत अच्छा होगा यदि आप समझाते हैं कि आपका कोड कैसे काम करता है, तो कोड के अपने स्रोत को प्रकट करें
Pieter Goosen
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.