Comment fonctionne le routage sur wordpress?


13

Comment fonctionne le routage wp principal? J'ai du mal à comprendre ... Dans MVC, votre URL ressemble à mycontroller / myaction qui correspond à MyController-> myaction ()

Dans drupal, c'est index.php? Q = mycustomerpath / hello qui peut être mappé à n'importe quelle fonction que vous aimez et qui renvoie un contenu "à thème" dans la disposition de votre thème.

Mais dans wp, je n'ai aucune idée de la façon dont les choses se font ... c'est? P = 1 puis? Product = 1 ... J'ai recherché la documentation du flux de routage mais je n'en trouve pas (google renvoie simplement des articles sur la coutume routes) .. je veux d'abord comprendre les principes de base du routage ..


creuser dans le code, je vois à chaque demande qu'il appelle query_posts? pourquoi diable a-t-il besoin d'interroger les messages à chaque fois? n'y a-t-il pas des cas où vous ne voulez pas vraiment afficher de messages ??
yeahman

1
Le contenu est enregistré en tant que publication dans WP. Donc, lorsque vous devez afficher le contenu, vous devez l'interroger
Sisir

Puis-je vous suggérer de lire sur "la boucle" qui est le concept que vous devez comprendre pour savoir comment fonctionne WordPress. La "boucle" essentielle affiche un tableau de publications qui est le résultat de query_posts. Pour les demandes d'URL non administrateur, WP est conçu pour afficher uniquement les publications et il faut une programmation personnalisée pour afficher autre chose qu'une publication. Les demandes d'URL d'administration sont différentes et celles-ci n'utilisent pas "la boucle" et affichent des éléments non publiés.

ok mais cette approche est un peu bizarre et pas très flexible tbh
yeahman

dis que je veux afficher un formulaire de contact .. je dois mettre mon html dans un type de contenu de page? J'essaie toujours de trouver où mettre la logique pour la soumission du formulaire ... (dans le thème page.php? Approche très laide)
yeahman

Réponses:


20

Dans WordPress, les URL ne sont pas mappées aux itinéraires. Ils sont mappés aux requêtes de base de données.

Lorsque vous utilisez WordPress en mode de permaliens "par défaut", vous avez un ensemble de variables dans la requête URL principale, comme? P = 1 ou? Page = 234 et ainsi de suite. Il y a aussi? S = search et bien d'autres.

Si vous utilisez les "jolis" permaliens, un grand ensemble de règles appelé "règles de réécriture" est créé, qui mappe directement divers modèles d'URL sur ce même ensemble de paramètres d'URL. Ainsi, une URL comme / 2014/04/12 / exemple correspondrait à? Year = 2014 & month = 04 & day = 12 & postname = example ou similaire. Donc, ce qui suit s'applique également à ceux-ci, une fois ce mappage effectué.

Ces variables contrôlent essentiellement l'instance principale de la classe WP_Query. La classe WP_Query contient toutes les informations qui génèrent la requête de base de données pour obtenir les "publications" de la base de données. Les différents paramètres qui lui sont transmis contrôlent le type de requête qu'il construit et les données qu'il obtient.

Vous voyez, tout ce qui peut être affiché par WordPress est essentiellement un «post». Un blog est une série de publications dans l'ordre chronologique inverse. Une "page" est une publication statique avec un nom défini. Un "type de publication personnalisé" est exactement ce à quoi il ressemble, un "publication" avec un type personnalisé que vous définissez. Toutes les requêtes principales pour afficher quoi que ce soit dans WordPress reçoivent un sous-ensemble de publications de la table wp_posts.

Le WP_Query est ce qui fait cela. Et les paramètres de l'URL sont envoyés directement dans cette requête principale et y sont utilisés.

Le thème détermine ensuite le modèle à utiliser en fonction du contenu de la requête. Si vous avez demandé / category / example, cela devient? Category_name = example, ce qui signifie que le tableau principal $ wp_query-> query_vars obtiendra ces informations, et WP_Query extraira les derniers messages X pour la catégorie "exemple", et il définira son indicateur is_category sur true.

Le chargeur de modèles s'exécutera après cela, voir que is_category () retourne vrai et décider de choisir le modèle de catégorie, il recherchera donc category-example.php et retombera dans category.php et ainsi de suite, selon le modèle Hiérarchie.

Ainsi, la question si vous souhaitez modifier le fonctionnement des URL est simple: voulez-vous modifier les URL ou à quoi elles sont mappées? Étant donné que les URL ne sont pas mappées à des fonctions, elles sont mappées à des paramètres qui contrôlent la requête. Si vous voulez que l'URL ajuste cette requête principale, c'est un processus légèrement différent que si vous voulez qu'une URL spéciale exécute un autre code spécial.

Et pour répondre à votre question spécifique dans les commentaires: "n'y a-t-il pas des cas où vous ne souhaitez pas réellement afficher les messages?" Non, il n'y en a pas. Tout est un post. Tout le contenu est stocké dans des publications. Si vous voulez stocker du contenu ailleurs et être différent, vous pouvez le faire, mais c'est plus difficile car, honnêtement, ce n'est généralement pas nécessaire. Si vous avez du contenu spécial, créez un type de publication personnalisé, stockez votre contenu en tant que publication avec ce type, mappez-y un modèle d'URL. Facile.


Je comprends que tout devrait être représenté dans un article (via des types de messages personnalisés, etc.) très similaires aux types personnalisés dans drupal 6 ... mais cela affecte-t-il les performances d'avoir une seule table de messages pour stocker chaque contenu du site? drupal 7 l'a résolu en introduisant un type d'entité afin que vous n'ayez pas à créer un type personnalisé et à tout stocker dans la table des nœuds, mais dans votre propre table d'entité qui peut encore tirer parti du framework drupal. J'espère que wordpress introduira une telle approche à l'avenir. merci pour l'explication détaillée.
yeahman

je suppose que si je veux mapper une URL à ma propre fonction / thème, un routeur wp aiderait?
yeahman

L'ajout d'un système de routage complet n'est généralement pas nécessaire. Il existe des moyens plus simples. La base de WordPress est d'afficher du contenu généré par l'utilisateur, qui est tout stocké dans le tableau des publications. Si vous souhaitez afficher du contenu qui n'est pas généré par l'utilisateur, vous le faites généralement dans le thème ou dans un plugin. Il existe des centaines (des milliers) de crochets et de filtres d'action et d'autres façons pour le code de remplacer différentes parties du processus lors de la génération de la page. Et avec des choses comme les shortcodes, l'insertion de code HTML personnalisé dans le contenu est relativement facile.
Otto

comment ajouter du html / php personnalisé dans un type de message que j'ai créé? sans avoir à modifier le single.php du thème ou à créer un single-mycustompost.php (pas une approche très portable)
yeahman

6
après plus d'un an de travail avec wordpress maintenant ... je n'en suis toujours pas convaincu ... le cadre n'est pas élégant et assez moche ... Il fonctionne comme un simple blog mais si vous voulez développer d'autres types de sites web. C'est une sorte de piratage de WordPress pour faire quelque chose qu'il n'était pas censé faire.
yeahman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.