web-dev-qa-db-fra.com

add_rewrite_rule, activation du plugin et désactivation du plugin

Je vois beaucoup d’exemples montrant comment appeler add_rewrite_rule dans votre hook init, par exemple.

function add_my_custom_rewrite()
{
   add_rewrite_rule(...
}

add_action('init', 'add_my_custom_rewrite');

et dans votre crochet d'activation de plugin,

register_activation_hook( __FILE__, 'my_plugin_activation');

function my_plugin_activation()
{
   add_my_custom_rewrite();
   flush_rewrite_rules(false);
}

Ainsi, lorsque votre plugin est activé, votre réécriture sera transférée dans la base de données, semble fonctionner, mais, il y a un problème principal

Le problème de suppression de la réécriture n’a toujours pas été résolu lorsque des utilisateurs désactivent votre plug-in. Vous ne pouvez pas simplement placer flush_rewrite_rules dans votre crochet de désactivation, car init a déjà été appelé avant la désactivation.

register_deactivation_hook( __FILE__, 'my_plugin_deactivation');

function my_plugin_deactivation()
{
   flush_rewrite_rules(false); // will not work, since init (hence add_my_custom_rewrite) was already called at this point
}

Existe-t-il un meilleur moyen de résoudre le conflit entre add_rewrite_rule, l’activation du plugin et la désactivation du plugin?

3
Howard

Le problème avec flush_rewrite_rules() est que les règles sont régénérées instantanément, alors que les hooks de votre plugin sont toujours actifs.

Ce que je fais habituellement, car c’est le moyen le plus simple de réussir, est de supprimer l’option rewrite_rules lors de l’activation/désactivation. Les règles seront ensuite régénérées sur le prochain chargement de page au lieu de celui en cours:

register_deactivation_hook( __FILE__, 'my_plugin_deactivation');
function my_plugin_deactivation() {
   delete_option( 'rewrite_rules' );
}

Une solution plus idéale consiste à supprimer vos règles de la pile avant le vidage, mais c'est un peu difficile à faire (voir https://core.trac.wordpress.org/ticket/29118 ).

2
Matthew Boynes