Come creare una ricerca personalizzata per il tipo di post personalizzato?
5 risposta
- voti
-
- 2013-03-08
Ecco cosa hoprovatoe ho ottenuto una soluzione con 3passaggi. Supponiamo cheiltuotipo dipostpersonalizzato sia "prodotti "
1. Aggiungi codicefunzione quipuoi specificare archive-search.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');
2. Crea un modello di risultati di ricerca periltipo dipostpersonalizzato (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(); ?>
Creamodulo di ricerca
In questomodulo di ricerca,il valore "prodotti" ènascostoe cercherà soloi post di prodotto .<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>
per ulterioriinformazioni,vorrei collegarti a qui
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/Here is what I've tried and got a solution with 3 steps. Let's say your custom post type is "products"
1 . Add Function Code here you can specify the archive-search.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');
2 . Create search result template for custom post type ( 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(); ?>
Build Search Form
In this Search Form, the value "products" is hidden and it will search only product posts.<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>
for more, I would like to link you to here
http://www.wpbeginner.com/wp-tutorials/how-to-create-advanced-search-form-in-wordpress-for-custom-post-types/-
Suggerimento: quando si registrailtipo dipost,l'argomento **publicly_queryable ** deveessereimpostato su **true **.In caso contrario,get_query_var ('post_type')non restituiràmaiil valorepost_typefornitonell'argomento url.https://codex.wordpress.org/Function_Reference/register_post_type#ArgumentsTip: when registering the post type, the **publicly_queryable** argument must be set to **true**. If not, the get_query_var('post_type') will never return the post_type value given in the url argument. https://codex.wordpress.org/Function_Reference/register_post_type#Arguments
- 0
- 2015-05-21
- Gustavo
-
Un altro suggerimento/modifica suggerita: `get_query_var ('post_type')` ha restituito un array (piuttosto che una stringa) quindinonpuòessere confrontato direttamente.Dato che sto cercando solo untipo di articolo alla volta,ho semplicemente cambiato lamia var `$post_type`in` $post_type [0] `.Another tip/suggested edit: `get_query_var('post_type')` returned an array (rather than a string) so couldn't be compared directly. Since I'm only searching one post type at a time, I simply changed my `$post_type` var to `$post_type[0]`.
- 0
- 2016-04-08
- indextwo
-
c'è unmodoper riscrivere l'URL da `http://localhost: 3000/? s=cloud% 27 &post_type=product` a` http://localhost: 3000/search/cloud/product`is there a way to rewrite the url from `http://localhost:3000/?s=cloud%27&post_type=product` to `http://localhost:3000/search/cloud/product`
- 0
- 2017-11-06
- YarGnawh
-
@YarGnawh Ci scusiamoper la rispostatardiva,controlla questo https://wordpress.stackexchange.com/questions/15418/pretty-permalinks-for-search-results-with-extra-query-var.C'è anche unplugin chiamato rewrite https://wordpress.org/plugins/rewrite/@YarGnawh Sorry for late response, check this out https://wordpress.stackexchange.com/questions/15418/pretty-permalinks-for-search-results-with-extra-query-var. There is a plugin called rewrite too https://wordpress.org/plugins/rewrite/
- 0
- 2017-11-13
- Ronald
-
ilfiltro `` search_template``` sembraessere un'alternativapiù appropriata a ``template_include```the ```search_template``` filter seems to be a more appropriate alternative to ```template_include```
- 0
- 2018-07-19
- Alexey Kosov
-
- 2016-01-12
Ecco cosafunzionaperme. Non cosìpulitomanon sono riuscito afarfunzionarenessuna di queste altre risposte.
Modulo di ricercapertipo di articolopersonalizzato:
<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>
Infunctions.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; ?>
Ovviamentein tuttie trei punti dovrai sostituire "libro" coniltipo dipostpersonalizzato.
Spero che questo aiuti qualcuno!
Here is what works for me. Not as clean but I couldn't get any of these other answers to work.
Search form for Custom Post Type:
<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; ?>
Naturally in all three places you'll need to replace "book" with your custom post type.
Hope this helps someone!
-
- 2015-11-16
Un codicebrevepiù attualizzato
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');
A short code more actualized
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');
-
- 2017-03-02
Stavo cercando di utilizzare duemoduli diversiper lemie normali ricerchee lemie ricerche su untipo dipostpersonalizzato.
Ilmiotipo dipostpersonalizzato utilizza un'intestazione diversa rispetto allepaginenormali,sullamiapaginanormale,la chiamata almiomodulo di ricerca è:
<?php get_search_form(true); ?>
E la chiamata almiomodulo di ricercanell'intestazione deltipo dipostpersonalizzato è:
<?php get_template_part('search','library'); ?>
Che ha un campo aggiuntivo:
<input type="hidden" name="post_type" value="library" /> //Where "library" is my custom post type.
Nelfile dellefunzioni hoil seguente codice che haifornito.
/** 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');
Che rileva seilmodulo di ricerca staeffettuando una ricerca all'interno di campipersonalizzati,mostrando così la ricercain unmodellopersonalizzato,altrimenti utilizzailmodellonormale.
Modifica: corretta la chiamata allafunzioneget_search_form () che avrebbe restituito veroin ogni caso.
I was looking to use two different forms for my normal searches and my searches on a custom post type.
My custom post type uses a different header than normal pages, on my normal page, the call to my search form is:
<?php get_search_form(true); ?>
And the call to my search form in the custom post type header is:
<?php get_template_part('search','library'); ?>
Which has an additional field:
<input type="hidden" name="post_type" value="library" /> //Where "library" is my custom post type.
In the functions file I have the following code that you have provided.
/** 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');
Which detects if the search form is doing a search within custom fields, thus showing the search in a custom template, otherwise use the normal template.
Edit: fixed the get_search_form() function call which would have returned true no matter what.
-
Vale lapenanotare,ma `get_search_form ('true')` dovrebbeessere `get_search_form (true)`.`get_search_form` sta cercando uninputbooleano,quindi o`true` o `false`.Mettendolotra virgolettegli sifornisce una stringa,non unparametrobooleano.Ilmodoin cui lafunzione èimpostata,sia ""true "che" "false" restituiscono lo stesso risultato,perché sonoentrambe stringhenon vuote (il chefa sì che lafunzione restituiscatruein entrambii casi).Worth noting, but `get_search_form('true')` should be `get_search_form(true)`. `get_search_form` is looking for a boolean input, so either `true` or `false`. By wrapping it in quotes you are feeding it a string, not a boolean parameter. The way that function is set up, both `'true'` and `'false'` would return the same result, because they are both non-empty strings (which causes the function to return true in both cases).
- 1
- 2018-02-22
- Mike
-
- 2014-09-16
Per risolvereilproblema della ricerca dell'input vuoto,puoi sostituireil codice dellafunzione con questo:
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');
To fix the empty input search issue you can substitute the function code with this:
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');
-
Sarebbefantastico se spiegassi comefunzionailtuo codicee rivelassi latuafonte del codiceWould be great if you explain how your code works, an reveal your source of the code
- 3
- 2014-09-16
- Pieter Goosen
Ho un campo di ricercaperi post delblog,mami serve un altroper untipo dipostpersonalizzato.Comeposso creare questo modulo di ricercapersonalizzato con un diverso layout dei risultati di ricerca ?