J'ai un type de publication personnalisé pour les diaporamas qui crée une publication paginée et chaque diapositive est une page distincte. Les données de chaque diapositive sont enregistrées dans les champs personnalisés et chaque diapositive a un jeu de titres enregistré dans le champ personnalisé avec la clé slide{$i}-title
($i
étant le numéro de la diapositive, par exemple slide1-title
).
Actuellement, l'URL de chaque page suivante est le numéro ajouté à l'article permalink (qui correspond au format standard des URL de page paginées), comme suit: http://example.com/post-title/2/ pour la page/slide 2 et http://example.com/post-title/3/ pour la page/slide 3.
Comment puis-je changer cela pour que l'URL de chaque page soit ajoutée avec le titre de la diapositive au lieu du numéro incrémental?
Par exemple: http://example.com/post-title/slide-2-title/ pour la page/diapositive 2 et http://example.com/post-title/slide-3-title/ pour la page/diapositive 3.
La modification de la structure de l'URL comprend toujours deux parties: l'une modifie les URL que vous générez avec votre code et l'autre le traitement des URL entrantes de la nouvelle structure. Je vais me concentrer sur la deuxième partie, et peut-être la moins comprise.
Les URL entrantes sont associées à différentes règlesrewrite, qui sont des expressions régulières pouvant correspondre à l'URL. Ces expressions peuvent avoirgroupes de capturequi capturent une partie de l'URL pour l'envoyer à différentes variables de requête, utilisées par exemple pour construire la requête de base de données. Si vous créez un type de publication personnalisé slideshow
, l'une des règles de réécriture ressemblera à ceci:
diaporama/([^ /] +) (/ [0-9] +)? /? $ => index.php? slideshow = $ correspond à [1] & page = $ correspond à [ 2]
Cela signifie que nous associons une URL qui commence par slideshow/
, puis tout ce qui ne correspond pas à /
, et éventuellement (le ?
) un /
et un nombre quelconque de chiffres. La première correspondance est envoyée à la variable de requête slideshow
, la seconde à la variable page
. Par exemple, slideshow/nature/2
définira slideshow
à nature
et page
à 2
. J'ai écrit un plugin qui pourrait être utile pour comprendre et déboguer vos règles actuelles .
Vous souhaitez faire correspondre une structure comme slideshow/nature/slide-2-canyon/
. La regex pour cela ressemble à:
slideshow/// Commencez par 'slideshow /' ([^ /] +) // Ensuite, tout ce qui n'est pas' /' (/ slide- // Then ' slide - ' ([0-9] +) // Un numéro de page (- ([^ /] +))? // Titre de la diapositive:' - 'et tout ce qui ne l'est pas '/'. Facultatif pour ne pas avoir à l'ajouter )? /? $ // Ce qui pourrait être suivi d'un '/'
Nous voulons capturer le nom du diaporama et le numéro de la page. Vous comptez l'ouverture '(' pour obtenir les index de correspondance, ainsi notre règle de réécriture complète ressemble à ceci:
diaporama/([^ /] +) (/ diapositive - ([0-9] +) (- ([^ /] +))?)? /? $ => index .php? slideshow = $ correspond [1] & page = $ correspond [3]
Maintenant, nous devons juste ajouter ceci aux règles de réécriture. Assurez-vous de le placer en haut, car une règle similaire est utilisée pour faire correspondre les pièces jointes d'un message, et votre règle personnalisée ne sera jamais touchée si elle se trouve en bas de la liste.
add_rewrite_rule(
'slideshow/([^/]+)(/slide-([0-9]+)(-([^/]+))?)?/?$',
'index.php?slideshow=$matches[1]&page=$matches[3]',
'top'
);
Il suffit d'appeler cette ligne une seule fois, puis flush_rewrite_rules()
. Ou, si vous ne voulez pas jouer avec les points d'ancrage d'activation de plug-in, appelez la add_rewrite_rule()
sur chaque init
, puis chargez la page de paramètres "Permalink" pour purger les règles. Tant que vous ne videz pas les règles à chaque chargement de page, car le calcul est coûteux.
La seule chose qui vous reste à faire est de générer des liens de page du nouveau format. wp_link_pages()
ne semble proposer aucun filtre pour modifier sa sortie, aussi j'étudierais son fonctionnement et la dupliquerais avec le format de votre page (ce n'est pas difficile et vous n'avez besoin que de la moitié de la fonction si vous choisissez un seul format de sortie) .