web-dev-qa-db-fra.com

Forcer le formulaire de recherche à nettoyer l’URL sans redirection multiple

J'ai réécrit le search_base en suche (allemand) pour obtenir une URL comme celle-ci: http://mypage.com/suche/searchterm

Maintenant, lorsque je soumets le formulaire de recherche, je reçois l'URL /?s=searchterm.

Internetz me donne la même solution de contournement à partir de plusieurs sources, telles que celle-ci: RL des résultats de la recherche sans variables de chaîne de requête

add_action("template_redirect", function() {
    if (is_search() && !empty( $_GET["s"] ) ) {
        if (wp_redirect( home_url('/suche/') . urlencode(get_query_var('s')) )) {
            exit();
        }
    }
});

Mon problème avec cette solution:

  • la redirection entraîne un délai sensiblement plus long (même dans mon environnement local)
  • Je dois à nouveau coder la suche en dur, alors que j'aimerais utiliser la base de recherche modifiée

J'ai essayé de créer mon propre formulaire de recherche personnalisé avec add_filter("get_search_form", ... avec action="http://mypage.com/suche/, ce qui entraînait toujours un get var /suche/?s=searchterm qui ne fonctionnait évidemment pas.

Comment puis-je indiquer au formulaire de recherche d'aller directement à /suche/searchterm

Merci!

1
kater louis

En supposant que vous fassiez en sorte que l'action de votre formulaire pointe sur la bonne URL, voici deux (et demi) options:

Avec Javascript (jQuery)

jQuery(document).ready( function() {
    jQuery("#searchform").submit( function() {
        self.location.href = jQuery(this).attr("action") + jQuery("#s").val();
        return false;
    });
});

Vous pouvez également le faire sans jQuery (si vous n'utilisez pas jQuery sur votre site et ne voulez pas le charger uniquement pour cela). Voici une version simple de celui-ci (probablement pas du navigateur super cross, mais je ne l'ai pas testé), sur laquelle vous pouvez développer:

<form action="/suche/" onsubmit="self.location.href=this.getAttribute('action') + document.getElementById('s').value; return false;">
<input type="text" name="s" id="s" />
<input type="submit"></form>

Avec une règle de réécriture:

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^s=(.*)
RewriteRule ^(.*?)/?$ $1/%1? [R=302,L]

Cela fonctionnerait sur n'importe quelle URL qui obtient? S = ... passé, vous voudrez peut-être limiter cela à votre recherche réelle, comme dans

RewriteEngine On
RewriteCond %{QUERY_STRING} ^s=(.*)
RewriteRule ^suche/$ /suche/%1? [R=302,L]

Et si vous transmettez plusieurs arguments sous cette forme (par exemple, une catégorie et une chaîne à rechercher), vous devrez l'adapter en conséquence. Pour le moment, cela suppose simplement qu'il n'y a qu'un seul paramètre, c'est la chaîne de requête.

0
janh