web-dev-qa-db-fra.com

Ajouter une règle de réécriture dans le plugin: avec .htaccess dans le dossier du plugin ou à l'aide de fonctions WordPress

J'ai besoin d'ajouter une règle de réécriture dans mon plugin et de le distribuer avec mon code. Tout fonctionne bien si je mets la règle dans le fichier .htaccess dans le dossier racine de WordPress, mais je dois distribuer le plugin avec ma règle.

J'essaie de mettre un fichier .htaccess dans le dossier du plugin et d'essayer d'utiliser la fonction add_rewrite_rule mais ne fonctionne pas non plus.

Voici le code .htaccess qui fonctionne correctement dans le dossier racine de WordPress mais ne fonctionne pas dans mon dossier de plugin:

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteRule my-plugin/pages/tp(.*)\.php$ wp-content/plugins/my-plugin/pages/request.php?pid=$1

</IfModule>

J'essaie le code suivant dans mon plugin mais ne fonctionne pas non plus:

add_filter( 'query_vars', 'add_query_vars' );
function add_query_vars( $query_vars )
{
    $query_vars[] = 'pid';
    return $query_vars;
}
add_action( 'init', 'add_init' );
function add_init()
{
    $plugin_url = 'the-path-to-my-plugin-folder';
    add_rewrite_rule('my-plugin/pages/tp(.*)\.php'
                  , $plugin_url . 'pages/request.php?pid=$matches[1]','top');

    global $wp_rewrite;
    $wp_rewrite->flush_rewrite_rules(); // I know this should be called only one time, but I put it here just to keep simple the sample code
}

Mais j'obtiens toujours l'erreur que l'URL n'a pas été trouvée. Qu'est-ce que je fais mal? Comment puis-je faire ce dont j'ai besoin? J'ai cherché des questions similaires mais aucune n'a résolu mon problème.

3
leticia

REMARQUE: l'API WordPress Rewrite n'est pas identique au module Apache Rewrite. WP L'API de réécriture ne redirige pas une demande vers une autre URL, elle analysait l'URL actuelle et remplissait le tableau query_vars.

Le problème est dans le deuxième paramètre de votre appel de fonction add_rewrite_rule. Il doit commencer à partir de index.php? et ensuite il devrait y avoir vos arguments, comme pid, par exemple:

"index.php?pid=$matches[1]...."

Donc, votre fonction add_init devrait être comme ceci:

add_action( 'init', 'wpse8170_add_init' );
function wpse8170_add_init()
{
    add_rewrite_rule('my-plugin/pages/tp(.*)\.php', 'index.php?pid=$matches[1]', 'top');
}

N'oubliez pas de vider les règles de réécriture en visitant la page Settings "Permalinks.

Lectures complémentaires:

1
Eugene Manuilov