web-dev-qa-db-fra.com

flush_rewrite_rules ne fonctionne pas avec la désactivation du plugin, les URL non valides n'apparaissent pas

je suis sur le point de publier un plug-in de communauté et quelques derniers problèmes angoissants.

Premièrement, chaque fois que je visite une page qui ne serait pas valide pour le plug-in, www.mondomaine.com/forms/tester, cela me mènera à une autre page. Ce qui devrait arriver, c’est que le code du plugin essaie et utilise le chemin 'testeur', trouve qu’il n’existe pas de fichier de ce type, puis renvoie une erreur de page non trouvée.

Deuxièmement, j'utilise le plug-in visionneuse AskApache RewriteRules pour voir mes règles et constate que, même si j'ai désactivé mon plug-in, les règles de réécriture restent "index.php? Formid = $ correspond [1]". Je ne peux pas comprendre car je vide les règles de réécriture sur la désactivation du plug-in, et je sais que la fonction est appelée. Cela donne le même effet que ci-dessus, avec des URL incorrectes qui ne vont pas à 404 mais à d'autres pages.

Y a-t-il un moyen de résoudre ce problème, de sorte que si une page erronée est visitée, 404 sont lancées?

Le code est actuellement hébergé ici:. http://www.unifiedmicrosystems.com/products-and-services/software-development/wordpress/jformer-for-wordpress/ .

J'attends juste que l'accès wordpress.org permette de télécharger la source à des fins d'utilisation générale. J'ai essayé de copier une version réduite avec les parties pertinentes ci-dessous.

Merci d'avance,

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 . '<br >';

    $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', '<'))
    {
        deactivate_plugins(basename(__FILE__));
    }

    self::addRewriteRules();
    flush_rewrite_rules(true);
}

public static function deactivate()
{

    delete_option('jformer_options');
    //$wp_rewrite->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 '<p>Main description</p>';
}

public static function displayUrlStringSetting()
{
    $options = self::getOptions();
    echo "<input id='jformer_url_string' name='jformer_options[url_string]' size='40' type='text' value='{$options['url_string']}' />";
}

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()
{   
    ?>
    <div class="wrap">
        <h2>jFormer for WordPress Plugin Options</h2>
        Options relating to the Custom Plugin.
        <form action="options.php" method="post">
            <?php   
            settings_fields('jformer_options'); ?>
            <?php do_settings_sections('jformer_main_options'); ?>
            <input name="Submit" type="submit" value="<?php esc_attr_e('Save Changes'); ?>" />
        </form>
    </div>
    <?php
}

function showMessage($message, $msgclass = 'updated')
{  
    echo "<div id='message' class='$msgclass'>$message</div>";  
}  

public static function insertSettingsLink($links)
{
    $settings_link = '<a href="options-general.php?page=JFormerForWP">'.__('Settings','JFormerForWP').'</a>'; 
     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');
?>
1
Chris

Avez-vous essayé delete_option('rewrite_rules'); lors de la désactivation? Je suis tombé sur ce qui suit en enquêtant sur ce problème et cela a fonctionné pour moi:

En règle générale, vous enregistrez des types de publication sur init. Quelque temps après, vous obtenez l'action de désactivation. Un plugin responsable supprimerait ses règles de réécriture en purgeant. Cependant, il ne peut pas annuler l'enregistrement, donc le flush ne supprime pas les réécritures du plugin.

La solution de contournement que j'ai utilisée consiste à supprimer simplement l'option rewrite_rules lors de la désactivation. Elles seront générées à nouveau lorsque nécessaire, le seul effet notable est donc que la prochaine vue du site risque de prendre un peu plus de temps.

Consultez http://core.trac.wordpress.org/ticket/14761#comment:12 pour en savoir plus sur ce sujet.

3
Thijs

J'ai contourné ce problème insidieux avec quelque chose comme:

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

Notez que 'my-rewrite-match' est la chaîne d'origine dans laquelle vous avez passé add_rewrite_rule, pas la regex à laquelle elle est mappée en interne.

3
Jamie White

faire quelque chose de similaire .... créer un plugin portfolio post type et je suis coincé au même endroit. l'activation semble être ok. la désactivation ne fait que rediriger vers la page d'accueil. Ce que je voudrais, c'est que l'URL reste la même mais génère un 404, donc vous savez que c'est un lien brisé. Je sais qu'il est peu probable qu'un type de publication de portefeuille soit désactivé, mais cela ressemble à une diligence raisonnable.

à propos de la seule source que j'ai trouvée sur le sujet:

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

pas tout à fait le faire pour moi. j'ai aussi essayé:

update_option('rewrite_rules');
flush_rewrite_rules();

sur désactiver, mais ce n'est pas tout à fait raison non plus.

0
helgatheviking