web-dev-qa-db-fra.com

Réécriture d'URL avec add_rewrite_rule et attachment_id

J'essaie d'ajouter une règle de réécriture pour rendre ceci:

mysite/?attachment_id=106

ressemble à ca:

mysite/series/106

J'ai regardé partout dans ce site et d'autres et c'est très déroutant car il y a beaucoup de façons différentes de le faire. J'ai essayé de modifier le fichier functions.php dans mon dossier de thèmes, en ajoutant ceci au début du fichier:

add_rewrite_rule('series/([^/]+)/?$', 'index.php?attachment_id=$matches[1]', 'top');

Et le dernier que j'ai essayé:

add_filter( 'query_vars', 'wpa56345_query_vars' );

function wpa56345_query_vars( $query_vars ){
    $query_vars[] = 'attachment_id';
    return $query_vars;
}

add_action( 'init', 'wpa56345_rewrites' );

function wpa56345_rewrites(){
    add_rewrite_rule(
        'series/(\d+)/?$',
        'index.php?attachment_id=$matches[1]',
        'top'
    );
}
3
federomano

Placez le code suggéré ci-dessous dans functions.php de votre thème souhaité, cela a fonctionné pour moi avec WP 3.4: http://matty.co.za/2009/11/custom-url-rewrites-in-wordpress/

2
Joaquín L. Robles

Cela semble fonctionner pour moi:

// Add your query variable

add_filter( 'query_vars', 'my_query_vars' );
function my_query_vars( $query_vars ) {
    array_Push($query_vars, 'attachment_id');
    return $query_vars;
}

// Add your rule

add_filter( 'rewrite_rules_array', 'my_rewrite_rules_array' );
function my_rewrite_rules_array( $rules ) {
    $my_rules = array();
    $my_rules['series/(\d+)/?$'] = 'index.php?attachment_id=$matches[1]';
    return $my_rules + $rules;
}

// Flush the rules if your rule does not exist

add_action( 'wp_loaded', 'my_flush_rules' );
function my_flush_rules() {
    if (!$rules = get_option('rewrite_rules'))
        $rules = array();

    if (!isset($rules['series/(\d+)/?$'])) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}

Et aussi, si vous voulez déboguer des règles, il y a un extrait utile:

// Uncomment add_action to see what's happening

//add_action('wp', 'debug_rules');
function debug_rules() {
    global $wp, $wp_query, $wp_rewrite;
    echo $wp->matched_rule . ' | ' . $wp_rewrite->rules[$wp->matched_rule];
    print_r($wp_rewrite->rules);
    exit();
}

J'espère que ça aide.

4
vmassuchetto