Wie erstelle ich eine benutzerdefinierte Suche für einen benutzerdefinierten Beitragstyp?


44

Ich habe ein Suchfeld für die Blog-Posts, aber ich benötige ein anderes für einen benutzerdefinierten Post-Typ. Wie kann ich dieses benutzerdefinierte Suchformular mit einem anderen Suchergebnislayout erstellen ?

Antworten:


61

Hier ist, was ich ausprobiert und eine Lösung mit 3 Schritten bekommen habe. Angenommen, Ihr benutzerdefinierter Beitragstyp lautet " Produkte ".

1. Funktionscode hinzufügen Hier können Sie die archive-search.php angeben

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. Erstellen einer Suchergebnisvorlage für einen benutzerdefinierten Beitragstyp (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. Suchformular erstellen
    In diesem Suchformular ist der Wert "Produkte" ausgeblendet und es werden nur Produktbeiträge durchsucht .

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

Für weitere Informationen möchte ich Sie hier verlinken:
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/


Tipp: Wenn Sie den Beitragstyp registrieren, muss das Argument publicly_queryable auf true gesetzt werden . Andernfalls gibt get_query_var ('post_type') niemals den im url-Argument angegebenen post_type-Wert zurück. codex.wordpress.org/Function_Reference/…
Gustavo

Noch ein Tipp / vorgeschlagen edit: get_query_var('post_type')zurück ein Array (statt einer Zeichenfolge) kann so nicht direkt miteinander verglichen werden. Da ich immer nur einen Beitragstyp suche, habe ich einfach meinen $post_typevar auf geändert $post_type[0].
Indextwo

gibt es eine Möglichkeit , die URL aus neu zu schreiben , http://localhost:3000/?s=cloud%27&post_type=productumhttp://localhost:3000/search/cloud/product
YarGnawh

@YarGnawh Entschuldigung für die verspätete Antwort, check this out wordpress.stackexchange.com/questions/15418/… . Es gibt ein Plugin mit dem Namen rewrite too wordpress.org/plugins/rewrite
Ronald

Der search_templateFilter scheint eine angemessenere Alternative zu seintemplate_include
Alexey Kosov

6

Hier ist was für mich funktioniert. Nicht so sauber, aber ich konnte keine dieser anderen Antworten zum Laufen bringen.

Suchformular für benutzerdefinierten Beitragstyp:

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

Natürlich müssen Sie an allen drei Stellen "book" durch Ihren benutzerdefinierten Post-Typ ersetzen.

Hoffe das hilft jemandem!


2

Ein aktuellerer Kurzcode

 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

Ich habe versucht, zwei verschiedene Formulare für meine normalen Suchvorgänge und meine Suchvorgänge für einen benutzerdefinierten Beitragstyp zu verwenden.

Mein benutzerdefinierter Beitragstyp verwendet eine andere Kopfzeile als normale Seiten. Auf meiner normalen Seite lautet der Aufruf meines Suchformulars:

<?php get_search_form(true); ?>

Der Aufruf meines Suchformulars in der Kopfzeile des benutzerdefinierten Beitragstyps lautet:

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

Welches hat ein zusätzliches Feld:

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

In der Funktionsdatei habe ich den folgenden Code, den Sie zur Verfügung gestellt haben.

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

Welche erkennt, ob das Suchformular eine Suche in benutzerdefinierten Feldern durchführt und somit die Suche in einer benutzerdefinierten Vorlage anzeigt, verwenden Sie andernfalls die normale Vorlage.

Bearbeiten: Der Funktionsaufruf get_search_form () wurde korrigiert, der auf jeden Fall true zurückgegeben hätte.


1
Bemerkenswert, get_search_form('true')sollte aber sein get_search_form(true). get_search_formsucht nach einer booleschen Eingabe, also entweder trueoder false. Indem Sie es in Anführungszeichen setzen, geben Sie ihm einen String und keinen booleschen Parameter. Die Art 'true'und Weise, wie diese Funktion eingerichtet ist, ist beides und 'false'würde dasselbe Ergebnis zurückgeben, da es sich bei beiden um nicht leere Zeichenfolgen handelt (wodurch die Funktion in beiden Fällen true zurückgibt).
Mike

1

Um das Problem mit der Suche nach leeren Eingaben zu beheben, können Sie den Funktionscode durch Folgendes ersetzen:

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
Wäre großartig, wenn Sie erklären, wie Ihr Code funktioniert, und Ihre Quelle des Codes
preisgeben
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.