flush_rewrite_rules funktioniert nicht beim Deaktivieren des Plugins, ungültige URLs werden nicht angezeigt 404

Ich bin gerade dabei, ein Community Plug-in zu veröffentlichen und ein paar letzte Probleme zu haben.

Erstens, wenn ich eine Seite besuche, die für das Plugin nicht gültig ist, www.mydomain.com/forms/tester wird es mich auf eine andere Seite bringen. Was passieren sollte, ist der Plugin-Code versuchen und verwenden Sie den Pfad “Tester”, finden Sie es gibt keine solche Datei, und dann eine Seite nicht gefunden Fehler zurückgegeben.

Zweitens benutze ich AskApache RewriteRules Viewer Plugin, um meine Regeln zu sehen, und sehe, dass, obwohl ich mein Plug-In deaktiviert habe, die Regeln zum Umschreiben ‘index.php? Formid = $ matches [1]’ bleiben. Ich kann nicht verstehen, wie ich die Regeln über die Deaktivierung des Plugins umschreibe, und ich weiß, dass die function aufgerufen wird. Dies hat den gleichen Effekt wie oben, da inkorrekte URLs nicht auf 404, sondern auf andere Seiten verweisen.

Gibt es da eh etwas zu beheben, so dass 404 wenn eine falsche Seite besucht wird, 404 geworfen werden?

Der Code wird derzeit hier gehostet:. http://www.unifiedmicrosystems.com/products-and-services/software-development/wordpress/jformer-for-wordpress/ .

Ich warte nur auf wordpress.org Zugang, um die Quelle dort für den allgemeinen Gebrauch hochzuladen. Ich habe versucht, eine beschnittene Version mit den relevanten Teilen unten zu kopieren.

Vielen Dank im Voraus,

Chris

class JFormerForWP { static $errors = false; /* for debugging */ static $pluginPath; static $pluginUrl; public static function makeFormFactory($id,$class) { $classPath = self::$pluginPath . "/forms/{$class}.php"; require_once $classPath; } /* called each request */ public static function init() { self::$pluginPath = dirname(__FILE__); // Set Plugin Path self::$pluginUrl = WP_PLUGIN_URL . '/jformer-for-wp/'; // Set Plugin URL self::addRewriteRules(); add_filter( 'query_vars', array(__CLASS__, 'addQueryVars')); add_action( 'template_redirect', array(__CLASS__, 'formDisplay')); add_action('wp_print_styles', array(__CLASS__, 'styles')); add_action('wp_print_scripts', array(__CLASS__, 'scripts') ); add_shortcode('jformer', array(__CLASS__, 'shortcodeHandler')); add_action('wp_ajax_nopriv_jFormerForWp', array(__CLASS__, 'ajaxHandler')); add_action('wp_ajax_jFormerForWp', array(__CLASS__, 'ajaxHandler')); self::$errors = new WP_Error(); } public static function ajaxHandler() { $formID = $_POST['jFormerId']; echo self::getForm($formID); } public static function shortcodeHandler($atts, $content) { extract( shortcode_atts( array( 'id' => '0', 'class' => '', 'text' => '' ), $atts ) ); // echo 'dumping shortcode values. content: ' . $content . ', id: ' . $id . ', class: ' . $class . '
'; $options = self::getOptions(); $permastructString = $options['url_string']; } public static function getOptions() { $options = get_option('jformer_options',array('url_string' => 'forms')); return $options; } public static function addRewriteRules() { $options = self::getOptions(); add_rewrite_rule( $options['url_string'] . '/?([^/]*)','index.php?formid=$matches[1]', 'top' ); } public static function addQueryVars($vars) { $vars[] = 'formid'; return $vars; } public static function formDisplay() { } public static function activate() { if (version_compare(PHP_VERSION, '5', 'flush_rules(true); flush_rewrite_rules(true); } public static function addAdminPage() { add_options_page( 'jFormer', 'jFormer Plugin', 'manage_options', 'jFormerForWP', array( __CLASS__ , 'displayAdminPageHtml' )); } public static function adminInit() { register_setting( 'jformer_options', 'jformer_options', array(__CLASS__,'validateOptions') ); add_settings_section('jformer_main', 'jFormer Settings', array(__CLASS__,'sectionText'), 'jformer_main_options'); add_settings_field('jformer_url_string', 'Rewrite String', array(__CLASS__,'displayUrlStringSetting'), 'jformer_main_options', 'jformer_main'); add_action('admin_notices', array(__CLASS__,'displayAdminNotices')); } public static function sectionText() { echo '

Main description

'; } public static function displayUrlStringSetting() { $options = self::getOptions(); echo ""; } public static function validateOptions($input) { $input['url_string'] = trim($input['url_string']); if(!preg_match('/^[a-z0-9]{1,}$/i', $input['url_string'])) { add_settings_error('jFormerForWP', 'url_string_error', 'Invalid URL string, please fix ensure string consists of alphanumeric characters only and is at least 1 character long', 'error' ); } else { // add_settings_error('jFormerForWP', 'url_string_updated', 'String updated', 'updated' ); $validatedOptions['url_string'] = $input['url_string']; } return $validatedOptions; } public static function registerAdminSettings() { register_setting('JFormerForWPSettings', 'JFormerForWPSettings_option1'); } public static function displayAdminPageHtml() { ?>

jFormer for WordPress Plugin Options

Options relating to the Custom Plugin.
<input name="Submit" type="submit" value="" />
<?php } function showMessage($message, $msgclass = 'updated') { echo "
$message
"; } public static function insertSettingsLink($links) { $settings_link = ''.__('Settings','JFormerForWP').''; array_unshift( $links, $settings_link ); return $links; } public static function styles() { wp_enqueue_style('jformer', self::$pluginUrl. 'css/style.css'); } public static function scripts() { wp_enqueue_script('jformer', self::$pluginUrl . 'jFormer/jFormer.js',array('jquery')); } } register_activation_hook(__FILE__, array('JFormerForWP','activate')); register_deactivation_hook(__FILE__, array('JFormerForWP','deactivate')); add_action('init', 'JFormerForWP::init'); add_action('admin_init', 'JFormerForWP::adminInit'); add_action('admin_menu', 'JFormerForWP::addAdminPage'); ?>

Solutions Collecting From Web of "flush_rewrite_rules funktioniert nicht beim Deaktivieren des Plugins, ungültige URLs werden nicht angezeigt 404"

Hast du versucht delete_option('rewrite_rules'); auf deaktivieren? Bei der Untersuchung dieses Problems stieß ich auf Folgendes:

Normalerweise registrieren Sie Post-Typen in init. Einige Zeit später erhalten Sie die Deaktivierungsaktion. Ein verantwortliches Plugin würde seine Umschreiberegeln durch Spülen entfernen. Es kann jedoch die Registrierung nicht rückgängig machen, so dass der Flush die Änderungen des Plugins nicht entfernt.

Die hacky Problemumgehung, die ich verwendet habe, ist nur die Option rewrite_rules beim Deaktivieren zu löschen. Sie werden erneut generiert, wenn sie benötigt werden. Der einzige sichtbare Effekt ist, dass die nächste Site-Ansicht etwas länger dauert.

Eine Diskussion zu diesem Thema finden Sie unter http://core.trac.wordpress.org/ticket/14761#comment:12 .

Ich habe dieses Problem mit etwas wie dem folgenden verstanden:

 function my_plugin_deactivate() { global $wp_rewrite; unset($wp_rewrite->non_wp_rules['my-rewrite-match']); flush_rewrite_rules(); } 

Beachten Sie, dass 'my-rewrite-match' die ursprüngliche Zeichenfolge ist, die Sie an add_rewrite_rule , und nicht die Regex, der intern zugeordnet wird.

etwas Ähnliches tun …. ein Portfolio-Post-Typ Plugin erstellen und am selben Ort stecken. Aktivierung scheint in Ordnung zu sein. Deaktivierung leitet einfach auf die Homepage um. Was ich möchte ist, dass die URL die gleiche bleibt, aber eine 404 generiert, so dass Sie wissen, dass es sich um einen errorshaften Link handelt. Ich weiß, dass es unwahrscheinlich ist, dass ein Portfolio-Post-Typ deaktiviert wird, aber es scheint nur eine Due Diligence zu sein.

über die einzige Quelle, die ich zu dem Thema gefunden habe:

http://shibashake.com/wordpress-theme/how-to-flush-permalink-rules-with-flush_rules

nicht ganz für mich. Ich habe es auch versucht:

 update_option('rewrite_rules'); flush_rewrite_rules(); 

auf deaktivieren, aber es ist auch nicht ganz richtig.