web-dev-qa-db-fra.com

Réécriture d'URL avec '[' ']]' ou '(' ')' comme littéraux

Essayer de faire correspondre et URL comme ceci

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

dans .htaccess, je peux faire correspondre et extraire correctement tous les groupes avec

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

dans add_rewrite_rule je ne peux pas le faire correspondre. J'ai essayé d'échapper au [ avec \\[, \\\\[, \\\\\\\\[

et rien ne fonctionne. J'ai aussi essayé \Q[\E et l'utiliser comme \x5b\091 et rien ne fonctionne. Également essayé ([^\\[]+) pour faire correspondre des caractères non [ jusqu'au [

Quelle est la bonne façon de faire correspondre les métacaractères comme ceci? Fait de même pour la fonction \() littérale

2
Arnold Bailey

J'ai trouvé qu'il s'agissait de l'une des fonctionnalités les moins documentées de WordPress. J'espère donc que tout va bien ou que quelque chose qui le corrigera sera corrigé par quelqu'un de plus à l'aise dans WP_Rewrite.

Le Gist de base est donc:

  1. Lors de l'activation du plug-in et lors du vidage des règles, assurez-vous que votre règle personnalisée est ajoutée à la liste.
  2. Au cours de init, utilisez add_rewrite_tag() pour tous les paramètres de chaîne de requête personnalisés figurant dans la règle. Pour une destination de index.php?this_is_custom=$matches[1], vous devez ajouter la balise 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' );

Votre exemple est un peu léger sur le code, en particulier dans l'URL que vous essayez de faire correspondre (à quoi correspondent tous ces paramètres?), Ma réponse est donc quelque peu générique.

1
Annika Backstrom