SOLUTION
Je suis allé avec la mise à jour 3 et je la fais fonctionner. Ce que j'avais mal compris, c'est que je croyais qu'une règle de réécriture changerait designers/?designer=some-designer&bid=9
en /designers/some-designer
. Mais c'est bien sûr l'inverse.
J'ai fait des recherches, mais je ne comprends pas trop comment utiliser add_rewrite_rule () .
Ce message est assez proche de ce dont j'ai besoin, mais ai-je vraiment besoin de tant de code?
Mon lien actuel est le suivant:
http://www.norwegianfashion.no/designers/?designer=Batlak-og-Selvig&bid=9
Ce que je veux, c’est ce
http://www.norwegianfashion.no/designers/Batlak-og-Selvig /
- Comment puis-je utiliser
add_rewrite_rule()
? - Je dois transmettre l'ID de concepteur (enchère). Comment puis-je faire cela lorsque j'utilise des règles re.write sans que cela apparaisse dans l'URL?
Mise à jour 1
J'ai trouvé cela qui est un peu plus explicatif. Mais ça ne marche pas:
function add_rewrite_rules( $wp_rewrite )
{
$new_rules = array(
'('.$template_page_name.')/designers/(.*?)/?([0-9]{1,})/?$' => 'designers.php?designer='.
$wp_rewrite->preg_index(1).'&bid='.
$wp_rewrite->preg_index(2)
);
// Always add your rules to the top, to make sure your rules have priority
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'add_rewrite_rules');
function query_vars($public_query_vars) {
$public_query_vars[] = "designer";
$public_query_vars[] = "bid";
return $public_query_vars;
}
add_filter('query_vars', 'query_vars')
Mise à jour 2
Voici une autre solution que j'ai essayée, que Jan Fabry a suggérée dans un autre fil. Je mets cela dans mon functions.php, mais cela n’a aucun effet.
add_action('generate_rewrite_rules', 'add_rewrite_rules');
add_filter('query_vars', 'query_vars');
/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function add_rewrite_rules( $wp_rewrite )
{
add_rewrite_rule('^designers/([^/]*)/([^/]*)$ /designers/?designer=$1&bid=$2 [L]', 'top');
flush_rewrite_rules(false);
}
function query_vars($public_query_vars) {
$public_query_vars[] = "designer";
$public_query_vars[] = "bid";
return $public_query_vars;
}
Mise à jour 3,
j'ai trouvé quelques exemples ici aussi. Mais cela ne fonctionne pas non plus :(
add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');
// Remember to flush_rules() when adding rules
function flushRules(){
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
// Adding a new rule
function wp_insertMyRewriteRules($rules)
{
$newrules = array();
$newrules['(designers)/(\d*)$'] = 'index.php?pagename=designers&designer=$matches[1]';
return $newrules + $rules;
}
// Adding the bid var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars)
{
array_push($vars, 'designer');
return $vars;
}
Mise à jour 4 J'ai également essayé cette solution, mais toujours sans succès.
add_filter('search_rewrite_rules', 'designers_createRewriteRules');
function designers_createRewriteRules($rewrite) {
global $wp_rewrite;
// add rewrite tokens
$designer_token = '%designers%';
$wp_rewrite->add_rewrite_tag($designer_token, '(.+)', 'designers=');
$bid_token = '%bid%';
$wp_rewrite->add_rewrite_tag($bid_token, '(.+)', 'bid=');
$keywords_structure = $wp_rewrite->root . "designers/$designer_token/$bid_token";
$keywords_rewrite = $wp_rewrite->generate_rewrite_rules($keywords_structure);
return ( $rewrite + $keywords_rewrite );
}
Mise à jour 5
Il semble que mes règles de réécriture ne soient pas ajoutées. L’exécution des nouvelles règles suivantes print_r($wp_rewrite)
ne comprend pas les nouvelles règles de réécriture.
Mise à jour 6
J'ai testé la solution de Jan. Mais l'URL ne change pas :(
/* Initiation script for NF template
------------------------------------------------------------------------------*/
add_action('after_setup_theme','norwegianfashion_setup');
if ( ! function_exists( 'norwegianfashion_setup' ) ):
function norwegianfashion_setup() {
/* Here I do a lot of stuff */
// SEO friendly URL for desigenrs
add_action( 'init', 'wpa5413_init' );
add_filter( 'query_vars', 'wpa5413_query_vars' );
}
endif;
/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function wpa5413_init()
{
// Remember to flush the rules once manually after you added this code!
add_rewrite_rule(
'designers/([^/]+)/?',
'index.php?pagename=designers&designer=$matches[1]',
'top' );
}
function wpa5413_query_vars( $query_vars )
{
$query_vars[] = 'designer';
return $query_vars;
}
J'apprécierais vraiment si quelqu'un pouvait m'aider à résoudre ce problème.
bid
?slug
? `Récupérer les données de Designer est beaucoup plus facile à utiliserbid
quedesigner
Réponses:
Quelques informations sur les règles de réécriture
Le système WP Rewrite semble compliqué, mais en réalité, il n’est pas difficile de comprendre son fonctionnement. Il est utilisé pour analyser les jolies URL (
/designers/
) comme si elles étaient non-jolies (/index.php?pagename=designers
). L'idée de base est que vous disposiez d'une liste de règles de réécriture , d'expressions régulières pouvant correspondre aux URL entrantes, et que vous les réécriviez dans d'autres URL, principalement sous la forme deindex.php
certaines variables de requête. Ces variables sont définies sur des parties de l'expression régulière correspondant à l'URL. Les règles sont évaluées de haut en bas. Par conséquent, si deux règles peuvent correspondre, la première "gagne".Ces règles de réécriture sont stockées dans la base de données par appel
flush_rewrite_rules()
, mais, comme générer et écrire ces règles est une opération coûteuse, vous ne devez pas le faire à chaque foisinit
. Au lieu de cela, vous ne le faites que lorsque vous modifiez les règles: probablement lors de l'activation du plug-in (utilisationregister_activation_hook()
), ou manuellement en visitant la page des paramètres de Permalinks ( car il est difficile de le faire automatiquement lors de l'activation du thème ). Si vous ne videz pas les règles, l'appeladd_rewrite_rule()
n'aura aucun effet. Ce n'est pas un problème d'appeleradd_rewrite_rule()
chaque foisinit
, même après avoir éliminé les règles.Il existe de nombreuses façons d’ajouter vos règles de réécriture, et si vous ne souhaitez ajouter qu’une règle, vous pouvez le faire avec
add_rewrite_rule()
. Parce que les règles pour les postes, pages, taxonomies, ... suite à plusieurs règles, ils sont créés avec des fonctions de haut niveau commeadd_rewrite_tag()
,add_permastruct()
... Mais ceux - ci ne sont pas nécessaires pour le cas simple que nous avons ici.Il existe également certains filtres, vous pouvez donc également ajouter vos règles à l’aide des crochets
generate_rewrite_rules
ougenerate_rewrite_rules_array
. Celles-ci vous donnent un contrôle très détaillé sur l'ensemble des règles, mais encore une fois, celaadd_rewrite_rule()
suffit si vous souhaitez simplement ajouter une règle.J'ai créé un petit plugin qui vous permet d'analyser les règles de réécriture actuelles , et (bien sûr) je vous recommande de l'utiliser lorsque vous essayez de changer quelque chose.
Obtenir vos informations supplémentaires à partir de l'URL
Construisons sur l'exemple que vous avez donné. Vous avez la marque du designer
Batlak og Selvig
, avec l'ID numérique (bid
)9
. Vous ne voulez pas cet identifiant dans l'URL, mais seulement le nom. Nous appelons la version URL conviviale du nom (sans espaces ou caractères spéciaux) la limace :Batlak-og-Selvig
.En règle générale, l'URL doit contenir toutes les informations permettant d'identifier le contenu que vous souhaitez afficher sur la page. Vous pouvez utiliser des cookies ou des demandes POST pour stocker l'ID de concepteur que vous souhaitez afficher, mais cette erreur échouera si quelqu'un partage le lien, en l'envoyant par courrier, Facebook, Twitter ou simplement en le lisant à haute voix par téléphone. Si vous ne souhaitez pas utiliser l'ID numérique dans votre URL, vous devez vous assurer que le slug est unique: vous devez d'abord rechercher l'ID basé sur le slug et continuer comme auparavant.
Donc, ce que nous avons appris maintenant, c'est que nous voulons ajouter une règle de réécriture pour le modèle "
/designers/
suivi de rien jusqu'à la suivante/
" et enregistrer ce "n'importe quoi" dans ladesigner_slug
variable de requête. Dans votre cas, je pense que vous souhaitez également utiliser la page avec le slugdesigners
comme contenu général de la page, nous allons donc le dire également à WordPress.La seule chose qui reste à faire est de dire à WordPress de conserver également
designer_slug
les variables de la requête afin que vous puissiez y accéder ultérieurement. WordPress utilise une liste blanche de variables de requête autorisées afin d'empêcher les utilisateurs de modifier chaque paramètre de la requête de publication via l'URL. Tout ce qui ne figure pas sur cette liste est ignoré. Accrochez-vous simplement auquery_vars
crochet et ajoutez votre variable supplémentaire:Comme vous pouvez le constater, cette réponse est fondamentalement la même que ma réponse précédente , mais sans que la règle soit affichée dans le code (vous pouvez donc l'utiliser dans votre thème
functions.php
plutôt que dans un plugin), et avec un peu plus de certitude et d'explication, car j'ai appris beaucoup sur les règles de réécriture depuis (et à cause de) répondre à votre première question.Discussion en salle de chat
Nous avons résolu les dernières questions relatives à cette question dans la salle de discussion . À la fin, Steven a utilisé le
generate_rewrite_rules
crochet, parce que laadd_rewrite_rule()
fonction ne semblait pas fonctionner pour lui.la source
pagename
est le slug de la page WordPress que vous souhaitez afficher (enregistrez dans la base de données). Cette page peut ensuite indiquer qu'elle souhaite utiliser ledesigners.php
fichier de modèle dans la zone d'administration WP. Donc, vous pointez sur le slug de page, pas sur le nom du modèle, car le même modèle peut être utilisé pour plusieurs pages: dans ce cas, WordPress ne sait pas ce que vous voulez faire.add_rewrite_rules()
fonction et appelezadd_filter()/add_action()
directement. S'il s'agit d'un fichier de thème, supprimez-leflush_rewrite_rules()
et visitez la page des paramètres de permaliens pour purger les règles (ou ajoutez-leswpse5413_init()
et supprimez-les plus tard). Et mon plugin affiche les règles de réécriture actuelles. N'oubliez pas que cela ne modifie que la manière dont les URL entrantes sont traitées, pas la manière dont votre code écrira les URL dans le code HTML./designers/designer-slug/
URL, vous devez changer vous-même les endroits où vous écrivez ces URL dans votre code HTML. Testez-le en allant à/designers/Batlak-og-Selvig/
vous-même, si cela fonctionne, trouvez tous les emplacements qui génèrent ces URL et modifiez-les pour qu'ils utilisent la nouvelle structure.www.mysite.com/batlat-og-selvig/9
et que celle-ci soit "traduite" en/?designer=Batlak-og-Selvig&bid=9