it-swarm.com.de

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

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?

42
robert

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

1. Funktionscode hinzufügen hier können Sie das 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. Suchergebnisvorlage erstellen für 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 Produkt Beiträ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 mehr möchte ich dich hier verlinken
http://www.wpbeginner.com/wp-tutorials/wie-erstellen-weiterführende-suchform-in-wordpress-für-kundenspezifische-posttypen/

58
Ronald

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!

6
Shoelaced

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

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

Und 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 bereitgestellt 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.

2
Fliberty

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