web-dev-qa-db-fra.com

réécrire de manière flexible les URL "dynamiques" avec Wordpress

Je souhaite accéder à mon message portant l'identifiant 17 comme ceci:

http: // localhost/archives/17/moot-bla-foo-ramble

En d'autres termes, l'identifiant décide, tout peut par la suite être (ou ne pas être) la limace ou toute autre chose. Un peu comme ces liens menant à la même page (beaucoup d'autres sites font la même chose):

J'ai essayé de définir une règle de réécriture comme celle-ci vers le haut de mon .htaccess:

RewriteRule ^archives/(\d{1,12})(?:/.*) archives/$1 [NC]

Ceci presque fonctionne, c’est-à-dire va à la bonne page, mais me donne une page introuvable, parce que wordpress regarde à nouveau PATH_INFO (je crois) et indique que $query_string est maintenant string attachment=moot-bla-foo-ramble

Je ne veux pas faire une redirection 301.

Mon favori ou bien sûr, si une telle chose existait dans Permalink Settings: Custom Structure

/archives/%post_id%/%wildcard%

Bien que cela rende la "randonnée" obligatoire, alors encore mieux ...

/archives/%post_id%(/%wildcard%)?

un voeu pieux, je suppose.

2
Frank Nocke

Vous ne devriez pas utiliser htaccess à la place, vous devriez utiliser les API WordPress

par exemple.

function custom_rewrite( $wp_rewrite ) {

    $feed_rules = array(
        'archives/(\d+)(?:/.*)+'    =>  'index.php?p='. $wp_rewrite->preg_index(1)
);

    // ( array merge must be done this way, to ensure new rule comes first )
    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'custom_rewrite' );
2
Tom J Nowell

Identique à la réponse de @ Tom, mais en utilisant le wrapper fourni add_rewrite_rule :

add_action('init','wpse48481_rewrite_rules');
function wpse48481_rewrite_rules(){
    add_rewrite_rule('^archives/([0-9]{1,})/','index.php?p=$matches[1]','top');
}

Ceci vérifiera les urls de la forme:

 http://www.yoursite.com/archives/99/something-else

et l'interpréter comme le post/page/cpt avec ID = 99. Bien sûr, la regex peut être ce que vous voulez ...

1
Stephen Harris

Je suis désolé de le dire, mais tout cela m'a amené à des problèmes profonds. Soudain, les URL des balises et des catégories ont cessé de fonctionner, donnant une page de recherche vide "Eh bien, c’est embarrassant" ...

Même un rappel neutre, non changeant, déclenché par un flush sans l'ajout d'aucune règle irait à l'encontre de choses comme */archives/tag/kiwis */archives/catégories/fruits

Tout supprimer et enregistrer /wp-admin/options-permalink.php (c.-à-d. Les paramètres numériques) le corrige à nouveau. À plusieurs reprises. Très vérifié. Voir aussi ce fil sur wordpress.org.

En gros, au cours d’une journée, j’ai imaginé un hack très simple, qui semble fonctionner. en ajoutant ceci dans le fichier .htacces, avant le bloc wordpress

RewriteRule ^archives/(\d{1,12})(?:/.*) archives/$1 [NC,L]

en ajoutant ceci dans le functions.php de mon thème. Directement. Pas de crochet.

if ( isset($_SERVER["REDIRECT_URL"]) )
    $_SERVER["REQUEST_URI"] = $_SERVER["REDIRECT_URL"];

Oui, assez sale, écrivant dans une variable $ _SERVER. Et voila, tous mes testcases fonctionnent (URL simple, URL ramble, balises, catégorie, ...) (nb: sans le si votre page de démarrage cesse de fonctionner (boucle de redirection sans fin)

0
Frank Nocke