wake-up-neo.net

add_rewrite_rule, Aktivierung und Deaktivierung des Plugins

Ich sehe viele Beispiele, die zeigen, wie Sie add_rewrite_rule in Ihrem init-Hook aufrufen, z.

function add_my_custom_rewrite()
{
   add_rewrite_rule(...
}

add_action('init', 'add_my_custom_rewrite');

und in Ihrem Plugin-Aktivierungs-Hook,

register_activation_hook( __FILE__, 'my_plugin_activation');

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

Also, wenn Ihr Plugin aktiviert ist, werden Sie neu schreiben in db gespült, scheint zu funktionieren, aber es gibt ein Hauptproblem

Das Problem, das Überschreiben zu entfernen, wenn Benutzer Ihr Plugin deaktivieren, ist immer noch nicht gelöst. Sie können flush_rewrite_rules nicht einfach in Ihren Deaktivierungs-Hook einfügen, da init bereits vor der Deaktivierung aufgerufen wurde, und es gibt keine Möglichkeit, vorhandene Überschreibungsregeln zu entfernen, z.

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
}

Gibt es eine bessere Möglichkeit, den Konflikt zwischen add_rewrite_rule, Plugin-Aktivierung und Plugin-Deaktivierung zu lösen?

3
Howard

Das Problem beim Aufruf von flush_rewrite_rules() ist, dass die Regeln sofort neu generiert werden, während die Hooks Ihres Plugins noch aktiv sind.

Normalerweise lösche ich beim Aktivieren/Deaktivieren die Option rewrite_rules, da dies der einfachste Weg zum Erfolg ist. Die Regeln werden dann auf der nächsten Seite anstelle der aktuellen Seite neu generiert:

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

Eine idealere Lösung besteht darin, Ihre Regeln vor dem Leeren aus dem Stapel zu entfernen. Dies ist jedoch eine schwierige Aufgabe (siehe https://core.trac.wordpress.org/ticket/29118 ).

2
Matthew Boynes