WordPress dispone di un sistema di ricerca integrato caratterizzato da un form generico composto da un unico campo di testo. Ad una richiesta dell'utente, WordPress effettuerà la ricerca tra post, pagine e tipi di post personalizzati (custom post types) e restituirà il risultato caricando il template search.php
del tema.
Il form di ricerca
Il form può essere inserito all'interno dei template grazie alla funzione get_search_form()
, che restituisce (o stampa) il form di ricerca predefinito, oppure, se disponibile, il form generato dal template searchform.php
. Per impostazione predefinita, WordPress genera un form in HTML4; nel caso in cui si dovesse preferire un form in HTML5, sarà necessario aggiungere il supporto nel file functions.php
, con la seguente istruzione:
add_theme_support( 'html5', array( 'search-form' ) );
Il Codex fornisce la struttura predefinita di un form HTML5, da cui è possibile partire per sviluppare form più avanzati:
<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' ) ?>" />
</label>
<input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>
Il metodo di trasmissione dovrà essere GET
, la classe del form sarà search-form
, il tipo di input sarà search
. I form strutturati secondo le specifiche di HTML5 non hanno, invece, id
, e questo consente di inserirne diversi all'interno dello stesso documento. L'attributo name
del campo input#search
deve avere valore s
, mentre dovrà sempre essere presente l'elemento label
.
In base a questi requisiti, sarà possibile modificare il form predefinito in due modi: creando un template searchform.php
, oppure aggiungendo il filtro get_search_form
nel file functions.php
del tema. In questo capitolo si analizzerà la prima opzione.
Un form per una ricerca mirata
Si supponga di voler offrire agli utenti la possibilità di raffinare le ricerche in base ai tipi di post. Per far questo, si crei il file searchform.php
e si inserisca il seguente codice PHP:
<?php
/**
* @package WordPress
* @subpackage Seventy-One-WordPress-Theme
* @since Seventy One 1.0
*/
$args = array(
'public' => true,
'_builtin' => false
);
$output = 'names';
$operator = 'and';
$post_types = get_post_types( $args, $output, $operator );
?>
La funzione get_post_types
restituisce l'elenco dei post registrati, in base ai parametri passati con i tre argomenti.
- Il primo argomento è un array di parametri. Nell'esempio qui sopra, sono stati richiesti tutti i tipi di post pubblici, ad esclusione dei tipi predefiniti (
'_builtin' => false
); - il secondo argomento stabilisce se la funzione debba restituire i tipi di post come nomi o come oggetti;
- l'ultimo argomento stabilisce l'operatore logico da utilizzare nel caso venga passato un array
$args
con più elementi.
Dopo aver recuperato i tipi di post dal database, nello stesso file searchform.php
, si crea la struttura del form:
<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
<?php
if( count( $post_types ) > 0 ) :
?>
<span class="screen-reader-text"><?php echo _x( 'Search in:', 'label' ); ?></span>
<ul>
<?php foreach ( $post_types as $post_type ) { ?>
<li><input type="radio" name="post_type" value="<?php echo esc_attr( $post_type ); ?>" <?php checked( get_query_var( 'post_type' ), esc_attr( $post_type ) ); ?> /> <?php echo esc_attr( $post_type ); ?></li>
<?php } ?>
<li><input type="radio" name="post_type" value="any" <?php checked( get_query_var( 'post_type' ), 'any' ); ?> /> any post type</li>
</ul>
<?php
endif;
?>
<label>
<span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ); ?></span><br />
<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' ); ?>" />
</label>
<input type="submit" class="search-submit" value="<?php echo esc_attr_x( 'Search', 'submit button' ); ?>" />
</form>
La condizione verifica che sia stato recuperato almeno un tipo di post dal database. In caso positivo, il ciclo foreach
itera tra gli elementi dell'array $post_types
, generando un elemento input per ogni tipo di post. La funzione checked
verifica il valore del parametro post_type
della query_var
e restituisce la stringa checked="checked"
nel caso in cui questa sia uguale al valore del tipo di post richiesto dall'utente. In questo modo il form viene compilato automaticamente.
Nel tema Seventyone, nel caso di ricerca infruttuosa, il file index.php
include il template content-none.php
, qui di seguito riportato:
<header class="page-header">
<h1 class="page-title"><?php _e( 'Nothing Found', 'seventyone' ); ?></h1>
</header>
<div class="page-content">
<?php if ( is_home() && current_user_can( 'publish_posts' ) ) : ?>
<p><?php printf( __( 'Publish your first post <a href="%1$s">here</a>.', 'seventyone' ), admin_url( 'post-new.php' ) ); ?></p>
<?php elseif ( is_search() ) : ?>
<p><?php _e( 'Nothing found. Please try again.', 'seventyone' ); ?></p>
<?php get_search_form(); ?>
<?php else : ?>
<p><?php _e( 'Nothing found.', 'seventyone' ); ?></p>
<?php get_search_form(); ?>
<?php endif; ?>
</div><!-- .page-content -->
get_search_form
includerà il form di ricerca in caso di assenza di risultati.
Pagine singole e pagine non disponibili
Quando l'utente richiede un singolo post, WordPress seleziona il template in base alla seguente gerarchia:
single-{post_type}.php
single.php
index.php
Il template single.php
del tema Seventyone sarà caratterizzato da un Loop semplificato:
<?php get_header(); ?>
<div id="main-content" class="main-content">
<div id="content" class="content-area" role="main">
<?php
if (have_posts()) :
// Start the Loop.
while (have_posts()) : the_post();
get_template_part( 'content', get_post_format() );
if ( comments_open() || get_comments_number() ) {
comments_template();
}
endwhile;
?>
<?php post_navigation(); ?>
<?php
else :
get_template_part( 'content', 'none' );
endif;
?>
</div><!-- #content -->
</div><!-- #main-content -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Può essere opportuno prevedere un template specifico da utilizzare nel caso in cui la risorsa richiesta dall'utente non esista o sia stata rimossa. La gerarchia prevede, in questo caso, un file 404.php
, in assenza del quale si tornerà, come sempre, al file index.php
. Anche il file 404.php
conterrà una versione semplificata del Loop:
<?php get_header(); ?>
<div id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<header class="page-header">
<h1 class="page-title"><?php _e( 'Not Found', 'seventyone' ); ?></h1>
</header>
<div class="page-content">
<p><?php _e( 'Sorry, the page you were trying to view does not exist.', 'seventyone' ); ?></p>
<?php get_search_form(); ?>
</div><!-- .page-content -->
</div><!-- #content -->
</div><!-- #primary -->
<?php get_footer(); ?>
Come nel caso dei risultati della ricerca, sarà offerta la possibilità di visualizzare il form di ricerca, grazie alla funzione get_search_form
.