Antworten:
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(); ?>
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/
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_type
var auf geändert $post_type[0]
.
http://localhost:3000/?s=cloud%27&post_type=product
umhttp://localhost:3000/search/cloud/product
search_template
Filter scheint eine angemessenere Alternative zu seintemplate_include
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!
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); ?>
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.
get_search_form('true')
sollte aber sein get_search_form(true)
. get_search_form
sucht nach einer booleschen Eingabe, also entweder true
oder 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).
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');