flush_rewrite_rules, не работающий над сменной деактивацией, недопустимые URL, не показывающие 404

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

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

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

Там должен так или иначе зафиксировать это, так, чтобы, если неправильную страницу посещают, 404, были брошены?

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

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

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

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
11.12.2011, 14:33
3 ответа

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

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

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

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

3
19.02.2020, 22:43

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

о единственном источнике я нашел на предмете:

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

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

update_option('rewrite_rules');
flush_rewrite_rules();

на деактивируются, но это не совершенно правильно также.

0
19.02.2020, 22:43

Я обошел эту мелкую проблему с чем-то как следующее:

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, не regex это внутренне отображается на.

3
19.02.2020, 22:43
  • 1
    Этот подход работал на меня, но использование extra_rules_top вместо non_wp_rules. Если в сомнении относительно того, что сбросить, попытайтесь добавить exit(var_dump($wp_rewrite)); к нижней части деактивировать функции и ищут Ваши правила в выводе. –  Nick F 25.06.2014, 19:12

Теги

Похожие вопросы