web-dev-qa-db-fra.com

Réécriture personnalisée dans le plug-in avec paramètres

Je suis vraiment bloqué sur la fonctionnalité WP_Rewrite ...

Ce que j'ai

J'ai un plugin qui utilise un shortcode et affiche le contenu complet du site. Par exemple.:

//?p=2 (maps to domain.tld/myplugin/)
[my-plugin]

Ce plugin est fondamentalement un répertoire de contenu de liste.

Ce que je veux

En gros, je veux obtenir de belles URL pour la catégorisation du contenu de la liste affichée par le plugin. Par exemple.:

domain.tld/myplugin/?filter=someFilter // works but is ugly

domain.tld/myplugin/someFilter         // is what I want

Ce que j'ai essayé

J'ai donc essayé l'approche en utilisant add_rewrite_rule ainsi que la modification:

global $wp_rewrite

$customRules = [
    "myplugin/([^/]+)/?" => "?p=2&filter=$matches[1]" // try 1.1
    "myplugin/([^/]+)/?" => "/myplugin/filter=$matches[1]" // try 2.1
];

$wp_rewrite->rules = $customRules + $wp_rewrite->rules; // try 1
$wp_rewrite->extra_rules_top = $customRules + $wp_rewrite->extra_rules_top // try 2

Cependant, aucune de mes réécritures ne fonctionne. Le mieux que je puisse faire est d’être simplement redirigé vers /myplugin/ sans ajouter de paramètre à la page. Ceci, je suppose, est dû à la correspondance entre ?p=2 et /myplugin/ dans Wordpress, telle que définie dans la structure de lien permanent de la page. Donc, je suppose que les paramètres sont tout simplement supprimés de la règle.

Donc ma question:

Comment puis-je atteindre ce que je veux? Dois-je vraiment écrire les règles de réécriture dans le fichier .htaccess?

La solution à 50%

Donc, après avoir lu cet article génial j'ai pu obtenir au moins quelque chose qui fonctionne. En fin de compte je suis capable de réaliser

domain.tld/myplugin/filter/someFilter
a syntax like "param/value"

Ceci est fait par add_rewrite_endpoint() et en ajoutant le filtre au query_vars. Pour l’instant, c’est ce que je fais, mais au final, j’aimerais vraiment le réduire à:

domain.tld/myplugin/someFilter

Donc, l'aide sera toujours très appréciée;)

Mise à jour de la 1ère solution par @websupporter

J'ai essayé l'approche donnée par un utilisateur ici et cela ne fonctionne toujours pas. J'ai désactivé tous les plugins et cela ne fonctionne toujours pas.

La seule chose qui pourrait interférer à ce stade, pour autant que je sache, est le .htaccess, mais pour moi, celui-ci a également une apparence standard.

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
3
Sam

Cette approche devrait fonctionner pour vous:

<?php
/**
 * Plugin Name: Rewrite Shortcode
 **/

 add_shortcode( 'myplugin', 'mp_shortcode' );
 function mp_shortcode(){
    return '<p>Filter: ' . get_query_var( 'filter' ) . '</p>';
 }

 add_action( 'init', 'mp_rewrite' );
 function mp_rewrite(){
    $post_id = 2;
    add_rewrite_rule( 'myplugin/([^/]+)/?$', 'index.php?p=' . $post_id . '&filter=$matches[1]', 'top' );
    add_rewrite_tag( '%filter%', '([^/]+)' );
 }
?>

Je l'ai développé rapidement en tant que petit plugin, j'ai donc pu le tester moi-même. Pendant que vous travaillez avec le $wp_rewrite global, j’ai pensé qu’il serait peut-être préférable d’utiliser les fonctions décrites dans le Codex. En gros, parce que je les connais mieux :) Ainsi, je ne peux pas vous dire exactement ce que vous avez fait de mal, mais je peux dire ce que je fais différemment.

Vous vous approchez:

"myplugin/([^/]+)/?" => "?p=2&filter=$matches[1]

J'ai explicitement dit à WordPress d'utiliser le index.php comme c'est également le cas dans les documents. Et j'utilise add_rewrite_tag() pour générer une nouvelle variable de requête, que je peux lire avec get_query_var() dans mon shortcode.

Attention: éliminez les règles! Lorsque vous utilisez ces fonctions, accédez à Paramètres> Permaliens et cliquez sur le bouton "mettre à jour". Si vous ne le faites pas, les nouvelles règles ne seront pas actives. Vous pouvez également utiliser flush_rewrite_rules() lors de l'activation du plugin. Un exemple sur la manière de procéder est donné dans le Codex.

Docs:

3
websupporter

J'utiliserais la fonction add_rewrite_rule(); veuillez noter que le code n'a pas été testé mais qu'il devrait fonctionner en fonction de votre utilisation spécifique. Si vous devez également définir un post_id , ajoutez-le simplement à la chaîne index.php?p=X....

function myplugin_filter_add_rewrite_rules()
{
  // Allow for /myplugin/filter/someFilter
  add_rewrite_rule('myplugin/filter/([^/]+)/?$',
   'index.php?filter=$matches[1]',
   'top');

  // Optionally keep pagination /myplugin/filter/someFilter/page/2
  add_rewrite_rule('myplugin/filter/([^/]+)/page/([0-9]+)?$',
   'index.php?filter=$matches[1]&paged=$matches[2]',
   'top');
}

add_filter('init', 'myplugin_filter_add_rewrite_rules');

Comme déjà indiqué, n'oubliez pas de vider les règles en visitant Paramètres> Permaliens ou utilisez flush_rewrite_rules() dans l'activation du plug-in (ne l'exécutez pas à chaque chargement de page).

1
gyo