web-dev-qa-db-ja.com

flush_rewrite_rulesがプラグインの無効化に機能していない、無効なURLに404が表示されていない

コミュニティプラグインをリリースしようとしていて、最後に厄介な問題がいくつかあります。

まず、私がプラグインに有効ではないページを訪問するたびに、www.mydomain.com/forms/testerそれは別のページに私を連れて行くでしょう。起こるべきことは、プラグインコードがパス 'tester'を試してみて、そのようなファイルがないことを見つけて、そしてページが見つからないというエラーを返すことです。

次に、AskApache RewriteRulesビューアプラグインを使用してルールを確認しています。プラグインを無効にしても、書き換えルールは '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');
?>
1
Chris

無効化にdelete_option('rewrite_rules');を試しましたか?この問題を調査したところ、次のような問題に遭遇しました。

通常はinitに投稿タイプを登録します。その後しばらくすると、無効化アクションが発生します。責任あるプラグインはフラッシュすることで書き換え規則を削除するでしょう。ただし、登録を元に戻すことはできないため、フラッシュしてもプラグインの書き換えは削除されません。

私が使用した厄介な回避策は、非アクティブ化時にrewrite_rulesオプションを削除することです。これらは必要になったときに再度生成されるため、次のサイトビューには少し時間がかかることがあります。

このトピックに関する議論については、 http://core.trac.wordpress.org/ticket/14761#comment:12 をご覧ください。

3
Thijs

私は次のような何かでこのぐったりする問題を回避しました:

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に渡した元の文字列であり、内部的にマッピングされている正規表現ではありません。

3
Jamie White

似たようなことをしています....ポートフォリオの投稿タイプのプラグインを作成して、同じ場所で立ち往生しています。アクティベーションは問題ないようです。無効化するとホームページにリダイレクトされます。 URLを同じままにして404を生成するのがよいので、リンクが壊れていることがわかります。ポートフォリオの投稿タイプが無効になることはまずないと思いますが、それはまさしくデューデリジェンスのように思えます。

私が主題について見つけた唯一の情報源について:

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

私のためにそれをしていません。私も試してみました:

update_option('rewrite_rules');
flush_rewrite_rules();

無効にしますが、それもまったく正しくありません。

0
helgatheviking