web-dev-qa-db-fra.com

Aide sur Rewrite_Rules pour un plug-in personnalisé

J'ai lu cette question et la réponse avec un grand intérêt, car j'essaie de réaliser quelque chose de très similaire, mais j'échoue et je me demandais si quelqu'un pouvait m'aider.

J'utilise également un plug personnalisé qui interroge une table personnalisée afin de remplir une page. La page est une page normale WP avec un modèle joint qui appelle une fonction dans mon fichier de plug-in pour obtenir des données.

Si je tape ceci dans l'URL, ma page se charge correctement:

www.mywebsite.com/?pagename=products/food-and-catering-workwear&prodid=232&pname=Trilby Hat

Je voudrais taper ceci (ou l'utiliser dans un lien) et obtenir le même résultat:

mywebsite.com/products/food-and-catering-workwear/232/Trilby Hat /

(BTW, je pensais aussi au contraire à propos de rewrite_rules au début; cela changerait en fait mon URL en une version plus "conviviale" une fois en place :-)

J'ai ajouté cette ligne à la fonction init dans mon fichier de plug-in (une chose est que j'utilise cette même fonction init pour mettre en file d'attente quelques js - je supposais qu'il serait bien d'ajouter cette ligne à la même fonction ):

 add_rewrite_rule('([^/]+)/([^/]+)/([^/]+)/?','index.php?pagename=$matches[1]&prodid=$matches[2]&pname=$matches[3]','top' );

Remarque: dans ma hiérarchie de pages, il y aura toujours une page parent et une page enfant dans le slug; les chances sont que le parent sera toujours la même page, mais l'enfant va certainement varier. Mais je voudrais garder la règle souple pour saisir toutes les possibilités. Le déclencheur principal de mon plug-in sera ces deux variables dans la chaîne de requête.

J'ai également ajouté prodid et pname à $ query_vars:

 add_filter( 'query_vars', 'prod_query_vars' );
    function prod_query_vars( $query_vars )
    {
        $query_vars[] = 'prodid';
        $query_vars[] = 'pname';
        return $query_vars;
    }

Est-ce que quelqu'un voit où je vais mal? Une autre chose. Je ne comprends pas la partie règle-rinçage. Puisqu'il s'agit d'un plug-in (pas de functions.php), quand dois-je vider les règles? Chaque fois que j'ai mis à jour le fichier de plug-in (en essayant différentes possibilités de code), je me suis d'abord rendu sur la page Permaliens avant d'essayer d'utiliser mon format d'URL "convivial". J'ai remarqué dans l'un des exemples de la question précédente: flush_rewrite_rules (false) a été placée dans la fonction register_activation_hook (), mais mon plug-in est déjà configuré et en cours d'exécution. J'essaie de le modifier, alors je pense que je ne l'utiliserais pas pour l'instant (mais ce serait peut-être une solution pour les futures "installations" du plug-in)

Je ne suis pas non plus très versé dans les expressions régulières, alors je sais que cela pourrait être là où je m'égare.

Désolé pour la longue question, mais je voulais fournir autant de détails que possible sur ma situation.

Merci d'avance à tous ceux qui peuvent aider.

1
Kevin

En ce qui concerne le moment où vous devez vider les règles de réécriture:

Cela ne devrait se produire qu’une seule fois. Assurez-vous que vous n’appelez pas flush_rules() à l’initialisation, car cela réduirait réellement les performances des sites à trafic élevé.

WordPress stocke toutes les réécritures dans un tableau de la base de données. Il vous suffit donc de vous connecter avant de mettre à jour la base de données. Une façon de le faire est de vous connecter à "rewrite_rules_array" et d'ajouter votre règle:

add_filter( 'rewrite_rules_array', 'my_rewrites_function' );

function my_rewrite_function( $rules ) {

    $my_rules = array(
        '([^/]+)/([^/]+)/([^/]+)/?' => 'index.php?pagename=$matches[1]&prodid=$matches[2]&pname=$matches[3]'
    );
    $rules = array_merge( $my_rules, $rules );

    return $rules;
}

Gardez votre hook 'query_vars' tel quel. Vous devrez visiter la page Permalinks pour insérer votre règle dans les options de WordPress - mais alors vous devriez être défini.

Si cela ne fonctionne pas, vous pouvez vous connecter à 'parse_request' pour voir quelle règle de réécriture a été choisie pour la page que vous consultez:

add_filter( 'parse_request', 'my_request_rewrite_check' );

function my_request_check( $wp ) {

    var_dump( $wp->matched_rule );
    return $wp;
}

De plus, votre regex est un peu lâche pour la structure que vous avez mise au-dessus de mywebsite.com/products/food-and-catering-workwear/232/Trilby Hat/, cela ressemblerait davantage à:

^products/([^/]+)/([\d]*)/([^/]+)/?$

Est dit "commence par 'produits', '/', puis n'importe quel mot, '/', puis n'importe quel nombre, '/', puis n'importe quel mot" ("$" signifie que la chaîne doit maintenant se terminer)

J'espère que ça aide!

1
Joe Hoyle

D'accord, après avoir regardé ceci et regardé cela, j'ai réalisé que mon problème n'était PAS avec les règles de réécriture. C'était avec la façon dont mon plug traitait la chaîne de requête !!! Il cherchait $ _GET ['prodid'] pour remplir la page. Je ne savais pas qu'en utilisant le hook "query_vars", je devais utiliser $ prodid (tant que je l'avais d'abord déclaré comme global).

Quoi qu'il en soit, tout est réglé maintenant et je remercie encore une fois Joe pour son aide, ainsi que les personnes impliquées dans la première question (liée), car cela m'a aussi beaucoup aidé.

0
Kevin