web-dev-qa-db-fra.com

Utiliser wp_redirect et .htaccess pour réorienter les recherches (et transmettre les vars GET restants)

J'essaie d'utiliser wp_redirect() pour rediriger les recherches vers un format que j'ai établi dans .htaccess. Malheureusement, je rencontre des problèmes pour le faire.

J'ai besoin de rediriger la recherche vers une série de dossiers, puis d'ajouter les paramètres restants à la fin de l'URL, le résultat final ressemblerait à ceci:

http://www.xxxxxxx.com/search/Used/MT/Billings/?s=BMW&z=59105&r=150&m=150000&pmin=1000&pmax=30000&submit=Refine

J'ai écrit cette fonction jusqu'à présent:

function redirect_search() {
    $var_status = var_status();
    $var_ci = var_ci();
    $var_st = var_st();
    if (is_search() && !empty($_GET['s'])) {
        wp_redirect(home_url("/search/".$var_status.'/'.$var_ci.'/'.$var_st));
        exit();
    }
}
add_action('template_redirect', 'redirect_search' );

Cette fonction a pour résultat que l'url ressemble à ceci: http://www.xxxxxxx.com/search/New/Billings/MT

J'ai ajouté les paramètres, et la fonction ressemble à ceci:

function redirect_search() {
    $var_status = var_status();
    $var_ci = var_ci();
    $var_st = var_st();
    $Zip = var_z();
    $radius = var_r();
    if (is_search() && !empty($_GET['s'])) {
        wp_redirect(home_url("/search/".$var_status.'/'.$var_ci.'/'.$var_st.'/?s='.get_search_query().'&z='.$Zip.'&r='.$radius.'etc... etc...'));
        exit();
    }
}
add_action('template_redirect', 'redirect_search' );

Malheureusement, cette approche semble annuler les dossiers qui ont été créés, et l'URL résultante ressemble à ceci:

http://www.xxxxxxx.com/search/?s=BMW&z=59101

Des idées sur la façon d'obtenir les dossiers et les paramètres? Merci!

1
Steve Dimock

* haha ​​* Celui-là est en fait assez drôle. Vous vous êtes littéralement tiré dans le pied.

Regardez le code source de la ligne 1922 du lien-template.php dit:

if ( ! empty( $path ) && is_string( $path ) && strpos( $path, '..' ) === false )

La dernière condition strpos( $path, '..' ) est en réalité vérifiée par le .'etc... etc...' dans votre exemple. Le paramètre $path dans home_url() est vérifié pour contenir tout .. afin d'empêcher les attaques par traversée de répertoire. Le paramètre $path n'est ajouté à l'URL que s'il ne contient aucun '..'. Supprimez simplement cela et vous serez un peu plus loin.

La prochaine étape est que toute URL contenant /search/anything-else est traitée comme une page de résultats de recherche dans wordpress. Le modèle par défaut est search/(.+)/?$. Vous pouvez le voir en installant le plugin Rewrite analyzer et en filtrant simplement la chaîne search/anything-else.

Vous devrez donc vous assurer que l'URL /search/Used/MT/Billings/ déclenche votre logique de recherche ici au lieu de la recherche wordpress. Sinon, votre URL de recherche sous la forme /search/test/test/test4/?s=asdasd&z=test&r=test créerait une boucle de redirection, car vous utiliseriez la version permanente Permalink version /search/term avec le $_GET param version ?s=term.

Ce n'est pas vraiment une partie de votre question mais juste ce que vous considérez: Même si la redirection fonctionne correctement dans la première partie, wordpress peut décider de reformater l'URL à la pageload suivant la redirection, car il ne reconnaît pas votre URL de recherche structure, c’est pourquoi vous devez vous assurer que votre logique est exécutée sur toutes les URL avant que WordPress ne le fasse.

Par exemple, vous pouvez ajouter une règle de réécriture personnelle en utilisant add_rewrite_rule () , ou vous connecter à l'action parse_request (qui est une bonne action pour gérer les paramètres url personnalisés dans mon avis). Bien sûr, vous pouvez également gérer cet aspect externe (avant wordpress) en ajoutant des éléments personnalisés au .htacces ou même en ajoutant une structure de répertoire /search/Used/MT/Billings/index.php (cela peut être la méthode la plus simple, mais je ne recommanderais pas cette cause qui pourrait être remplacée par effectuer une mise à jour WordPress plus tard).


Modifier

Selon votre dernier commentaire, je pense vraiment qu'il vaut mieux utiliser certaines règles de réécriture, qui prennent effet avant WordPress, au lieu de jouer avec Wordpress Core/Relevanssi. Je ne l'utiliserais pas dans un plugin, mais cela conviendra peut-être parfaitement à un développement personnalisé.

RewriteEngine On
RewriteRule ^search/(.*)/(.*)/(.*)/page/([1-9]) /page/$4/?status=$1&st=$2&ci=$3 [QSA]
RewriteRule ^search/(.*)/(.*)/(.*)/ /?status=$1&st=$2&ci=$3 [QSA]

Cette règle réécrira en interne cette URL:

/search/Used/MT/Billings/?s=BMW&z=59105&r=150&m=150000&pmin=1000&pmax=30000&submit=Refine

Pour cette URL (qui est à mon sens la forme que Relevanssi en aura besoin):

?status=Used&st=MT&ci=Billings&s=BMW&z=59105&r=150&m=150000&pmin=1000&pmax=30000&submit=Refine

Vous voudrez peut-être remplacer le (.*) par des expressions régulières plus spécifiques concernant le contenu possible de vos vars de requête.

0
s1lv3r