правила полной перезаписи не работают при деактивации плагина, недопустимые URL-адреса не отображаются 404


Я как раз собираюсь выпустить плагин сообщества, и у меня есть несколько последних неприятных проблем.

Во-первых, всякий раз, когда я посещаю страницу, которая не будет действительна для плагина, www.mydomain.com/forms/tester это приведет меня на другую страницу. Что должно произойти, это код плагина, попробуйте использовать путь "тестер", найдите, что такого файла нет, а затем верните ошибку "страница не найдена".

Во-вторых, я использую плагин AskApache RewriteRules viewer для просмотра своих правил и могу видеть что, несмотря на то, что я деактивировал свой плагин, правила перезаписи остаются "index.php?formid=$matches[1]". Я не могу понять, как я сбрасываю правила перезаписи при деактивации плагина, и я знаю, что вызывается функция. Это дает тот же эффект, что и выше, с неправильными URL-адресами, которые не переходят на 404, а вместо этого переходят на другие страницы.

Есть ли способ исправить это, чтобы при посещении неправильной страницы выбрасывалось 404?

Код в настоящее время размещен здесь:. http://www.unifiedmicrosystems.com/products-and-services/software-development/wordpress/jformer-for-wordpress/.

Я просто жду wordpress.org доступ к загрузке источника там для общего использования. Я попытался скопировать сокращенную версию с соответствующими частями ниже.

Заранее большое спасибо,

Крис

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');
?>
Author: morleyc, 2011-12-11

3 answers

Вы пробовали delete_option('rewrite_rules'); отключить? При исследовании этой проблемы я столкнулся со следующим, и это помогло мне:

Обычно вы регистрируете типы записей при инициализации. Через некоторое время после этого вы получите действие деактивации. Ответственный плагин удалит свои правила перезаписи, сбросив их. Однако он не может отменить регистрацию, поэтому сброс не удаляет перезаписи плагина.

Хитрый обходной путь, который я использовал, состоит в том, чтобы просто удалить переписывать_рули опция деактивации. Они будут сгенерированы снова, когда в них возникнет необходимость, поэтому единственным заметным эффектом является то, что следующий просмотр сайта может занять немного больше времени.

Взгляните на http://core.trac.wordpress.org/ticket/14761#comment:12 для обсуждения этой темы.

 3
Author: Thijs, 2012-03-03 22:53:29

Я решил эту щекотливую проблему примерно следующим образом:

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

Обратите внимание, что 'my-rewrite-match' - это исходная строка, которую вы передали в add_rewrite_rule, а не регулярное выражение, с которым она внутренне сопоставлена.

 4
Author: Jamie White, 2012-04-18 23:14:09

Делаю что-то подобное.... создаю плагин типа "портфолио" и застрял в одном и том же месте. активация, кажется, в порядке. деактивация просто перенаправляет на домашнюю страницу. я бы хотел, чтобы URL-адрес остался прежним, но сгенерировал 404, чтобы вы знали, что это неработающая ссылка. я знаю, что маловероятно, что тип публикации портфолио будет деактивирован, но это просто похоже на должную осмотрительность.

О единственном источнике, который я нашел на тема:

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

Не совсем делает это для меня. я также пробовал:

update_option('rewrite_rules');
flush_rewrite_rules();

При деактивации, но это тоже не совсем правильно.

 0
Author: helgatheviking, 2012-01-08 20:17:14