J'ai un site Wordpress typique, avec un modèle de page de recherche typique qui utilise le format GET typique
<form id="searchform" action="http://example.com" method="get">
<input id="s" type="text" name="s" placeholder="Search Again">
</form>
Pour la commodité des utilisateurs, j'aimerais que l'URL suivante soit redirigée vers le modèle de page de recherche:
http://example.com/search/
Mais puisqu'il n'y a pas de page/de recherche ou de publication, ce n'est pas le cas. Il jette un 404.
Donc ce que je veux c'est pour ...
http://example.com/search/
... se comporter comme:
http://example.com/?s=
Comment puis-je faire cela?
Vous pouvez utiliser template_redirect . Voici une simple fonction de redirection.
add_action( 'template_redirect', 'se219663_template_redirect' );
function se219663_template_redirect()
{
global $wp_rewrite;
if ( is_search() && ! empty ( $_GET['s'] ) )
{
$s = sanitize_text_field( $_GET['s'] ); // or get_query_var( 's' )
$location = '/';
$location .= trailingslashit( $wp_rewrite->search_base );
$location .= user_trailingslashit( urlencode( $s ) );
$location = home_url( $location );
wp_safe_redirect( $location, 301 );
exit;
}
}
Règle sans requête de recherche, comme ceci (n'oubliez pas d'aller dans les paramètres de Permalink pour vider les règles):
add_filter( 'search_rewrite_rules', 'se219663_search_rewrite_rules', 10, 1 );
function se219663_search_rewrite_rules( $rewrite )
{
global $wp_rewrite;
$rules = array(
$wp_rewrite->search_base . '/?$' => 'index.php?s=',
);
$rewrite = $rewrite + $rules;
return $rewrite;
}
et redirigez avec une requête de recherche vide, utilisez simplement isset, modifié à partir du code ci-dessus.
add_action( 'template_redirect', 'se219663_template_redirect' );
function se219663_template_redirect()
{
global $wp_rewrite;
if ( is_search() && isset ( $_GET['s'] ) )
{
$s = sanitize_text_field( $_GET['s'] ); // or get_query_var( 's' )
$location = '/';
$location .= trailingslashit( $wp_rewrite->search_base );
$location .= ( ! empty ( $s ) ) ? user_trailingslashit( urlencode( $s ) ) : urlencode( $s );
$location = home_url( $location );
wp_safe_redirect( $location, 301 );
exit;
}
}