Flush_REWRITE_RULES不适用于插件停用,无效URL未显示404

时间:2011-12-11 作者:morleyc

我正要发布一个社区插件,还有一些最后的问题。

首先,每当我访问一个对插件无效的页面,www.mydomain。com/forms/tester它将把我带到另一个页面。应该发生的是,插件代码尝试并使用路径“tester”,发现没有这样的文件,然后返回一个页面未找到错误。

其次,我正在使用AskApache RewriteRules查看器插件查看我的规则,并且可以看到,即使我停用了插件,重写规则仍然是“索引”。php?formid=$匹配项[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\');
?>

3 个回复
最合适的回答,由SO网友:Thijs 整理而成

你试过了吗delete_option(\'rewrite_rules\'); 启用停用?在调查此问题时,我遇到了以下问题,它帮了我的忙:

通常在init上注册post类型。在那之后的一段时间,您将获得停用操作。负责任的插件将通过刷新删除其重写规则。但是,它无法撤消注册,因此刷新不会删除插件的重写。

我使用的黑客解决方法是在停用时删除rewrite\\u rules选项。它们将在需要时再次生成,因此唯一值得注意的效果是,下一个站点视图可能需要更长的时间。

看看http://core.trac.wordpress.org/ticket/14761#comment:12 来讨论这个话题。

SO网友:Jamie White

我通过以下方式解决了这个琐碎的问题:

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, 不是内部映射到的正则表达式。

SO网友:helgatheviking

做类似的事情。。。。创建一个公文包帖子类型插件,我被困在同一个地方。激活似乎没问题。停用只会重定向到主页。我希望URL保持不变,但生成一个404,因此您知道这是一个断开的链接。我知道不太可能停用投资组合职位类型,但这看起来就像尽职调查。

关于我找到的关于这个主题的唯一来源:

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

不是为我做的。我也尝试过:

update_option(\'rewrite_rules\');
flush_rewrite_rules();
启用deactivate,但也不太正确。

结束

相关推荐

__FILE__ in WordPress plugins

我正在使用Sidebar Generator 在我所有的主题中。该插件在“plugins”目录下正常工作,但我想以某种方式将其嵌入到我的主题中,因此它不会显示在已安装的插件列表中。我刚刚复制了sidebar\\u生成器。php(幸运的是,整个代码都在一个文件中)到mytheme/插件,并将其包含在函数中。phprequire_once (MY_PLUGINS . \'/sidebar_generator.php\'); 现在,它适用于所有其他插件,但不适用于这个插件!这样,当我点击“侧栏”时