web-dev-qa-db-ja.com

リテラルとして '[' ']'または '(' ')'を使用したURLの書き換え

このようなURLと一致させようとしています

linktosite/alphaNum/123/321/alphanum[alphanum].jpg

.htaccessで、すべてのグループを適切に一致させて抽出することができます。

linktosite/(.+)/([0-9]+)/([0-9]+)/(.+)\\[(.+)\\]\\.(.+)$

add_rewrite_ruleでは、一致させることができません。 [\\[\\\\[\\\\\\\\[をエスケープしてみました

そして何もうまくいきません。私はまた\Q[\Eを試して、それを\x5b\091として使用しましたが、何もうまくいきません。また、([^\\[]+)までの[以外の文字と一致するように[を試してみました

このようなメタキャラクタを一致させるための適切な方法は何ですか?リテラル\()についても同じことをします

2
Arnold Bailey

私はこれがWordPressのあまり文書化されていない機能の1つであることを発見したので、うまくいけばこれは軌道に乗っているか、WP_Rewriteにもっと流暢な人によって修正されるでしょう。

基本的な要旨はこうです:

  1. プラグインのアクティブ化中およびルールのフラッシュ中に、カスタムルールがリストに追加されていることを確認してください。
  2. init中に、ルール内にあるカスタムクエリ文字列パラメータにはadd_rewrite_tag()を使用します。宛先がindex.php?this_is_custom=$matches[1]の場合は、this_is_customタグを追加する必要があります。
function wpse_39626_init() {
    // these must be added during init. if you haven't done
    // add_rewrite_tag() for all custom query string vars,
    // wordpress will ignore them.
    add_rewrite_tag( '%wpse_thing%', '(\w+)' );
    add_rewrite_tag( '%wpse_name%', '(\w+)' );
    add_rewrite_tag( '%wpse_index%', '(\w+)' );

    // manually flushing rules so this code is easier to demo.
    // under normal circumstances you would use the plugin
    // activation hook. this will eventually call wpse_39626_rules().
    flush_rewrite_rules();
}
add_action( 'init', 'wpse_39626_init' );

// Normally, this would get called during something like
// your plugin's activation hook. See register_activation_hook().
function wpse_39626_activate() {
    add_rewrite_rule( 'testing/(\w+)\[(\w+)\]', 'index.php?wpse_thing=custom&wpse_name=$matches[1]&wpse_index=$matches[2]', 'top' );
    flush_rewrite_rules();
}
//register_activation_hook( __FILE__, 'wpse_39626_activate' );

// Hook into rewrite_rules_array, in case rewrite rules
// are flushed after the plugin is activated.
function wpse_39626_rules( $rules ) {
    $new_rules = array();

    // Matches: testing/outer[inner]
    //   wpse_name  = outer
    //   wpse_index = inner
    $new_rules['testing/(\w+)\[(\w+)\]'] = 'index.php?wpse_thing=custom&wpse_name=$matches[1]&wpse_index=$matches[2]';

    // prepend and return rules
    return $new_rules + $rules;
}
add_action( 'rewrite_rules_array', 'wpse_39626_rules' );

// Here's some demo code to intercept the page load
// and do custom functionality when our rewrite rule
// matches. (We'll just dump the matched values.)
function wpse_39626_posts( $query ) {
    if( ! is_main_query( $query ) ) {
        return;
    }

    if( $query->get('wpse_thing') != 'custom' ) {
        return;
    }

    var_dump( $query->get('wpse_name') );
    var_dump( $query->get('wpse_index') );

    die;
}
add_action( 'pre_get_posts', 'wpse_39626_posts' );

あなたの例は、特にあなたがマッチさせようとしているURL(それらのすべてのパラメータが何に対応しているか?)において、少しコードの上に軽いので、私の答えはやや一般的です。

1