Je développe un plugin où j'aimerais activer des pages personnalisées. Dans mon cas, une page personnalisée contiendrait un formulaire comme un formulaire de contact (pas littéralement). Lorsque l'utilisateur remplira ce formulaire et l'enverra, il devrait y avoir l'étape suivante qui nécessitera plus d'informations. Supposons que la première page avec le formulaire se trouve au niveau www.domain.tld/custom-page/
et après la soumission réussie du formulaire, l'utilisateur doit être redirigé vers www.domain.tld/custom-page/second
. Le modèle avec des éléments HTML et du code PHP doit également être personnalisé.
Je pense qu'une partie du problème est possible à réaliser avec des réécritures d'URL personnalisées, mais les autres parties me sont actuellement inconnues. Je ne sais vraiment pas par où commencer et quel est le nom correct pour ce problème. Toute aide sera grandement appréciée.
Réponses:
Lorsque vous visitez une page frontend, WordPress interroge la base de données et si votre page n'existe pas dans la base de données, cette requête n'est pas nécessaire et n'est qu'un gaspillage de ressources.
Heureusement, WordPress offre un moyen de gérer les demandes frontales de manière personnalisée. Cela se fait grâce au
'do_parse_request'
filtre.En revenant
false
sur ce crochet, vous pourrez empêcher WordPress de traiter les demandes et le faire à votre manière.Cela dit, je veux partager un moyen de créer un plugin OOP simple qui peut gérer des pages virtuelles de manière facile à utiliser (et à réutiliser).
Ce dont nous avons besoin
Interfaces
Avant de construire des classes, écrivons les interfaces des 3 objets listés ci-dessus.
D'abord l'interface de la page (fichier
PageInterface.php
):La plupart des méthodes ne sont que des getters et setters, pas besoin d'explication. La dernière méthode doit être utilisée pour obtenir un
WP_Post
objet à partir d'une page virtuelle.L'interface du contrôleur (fichier
ControllerInterface.php
):et l'interface du chargeur de modèles (fichier
TemplateLoaderInterface.php
):Les commentaires phpDoc devraient être assez clairs pour ces interfaces.
Le plan
Maintenant que nous avons des interfaces, et avant d'écrire des classes concrètes, passons en revue notre flux de travail:
Controller
classe (implémentantControllerInterface
) et injectons (probablement dans un constructeur) une instance deTemplateLoader
classe (implémentantTemplateLoaderInterface
)init
raccroché, nous appelons laControllerInterface::init()
méthode pour configurer le contrôleur et pour déclencher le crochet que le code consommateur utilisera pour ajouter des pages virtuelles.ControllerInterface::dispatch()
, et là nous vérifierons toutes les pages virtuelles ajoutées et si l'une d'elles a la même URL de la requête en cours, l'afficher; après avoir défini toutes les variables globales de base ($wp_query
,$post
). Nous utiliserons également laTemplateLoader
classe pour charger le bon modèle.Au cours de ce flux de travail , nous allons déclencher des crochets de base, comme
wp
,template_redirect
,template_include
... pour faire le plugin plus souple et d' assurer la compatibilité avec le noyau et d' autres plug - ins, ou tout au moins avec un bon nombre d'entre eux.Outre le flux de travail précédent, nous devrons également:
the_permalink
pour lui faire renvoyer la bonne URL de page virtuelle lorsque cela est nécessaire.Classes de béton
Nous pouvons maintenant coder nos classes concrètes. Commençons par la classe de page (fichier
Page.php
):Rien de plus que la mise en œuvre de l'interface.
Maintenant, la classe du contrôleur (fichier
Controller.php
):Essentiellement, la classe crée un
SplObjectStorage
objet dans lequel tous les objets pages ajoutés sont stockés.Sur
'do_parse_request'
, la classe de contrôleur boucle ce stockage pour trouver une correspondance pour l'URL actuelle dans l'une des pages ajoutées.S'il est trouvé, la classe fait exactement ce que nous avions prévu: déclencher des hooks, configurer des variables et charger le modèle via l'extension de classe
TemplateLoaderInterface
. Après ça, justeexit()
.Écrivons donc la dernière classe:
Les modèles stockés dans la page virtuelle sont fusionnés dans un tableau avec les valeurs par défaut
page.php
etindex.php
, avant le chargement du modèle'template_redirect'
, pour ajouter de la flexibilité et améliorer la compatibilité.Après cela, le modèle trouvé passe par les filtres personnalisés
'virtual_page_template'
et les'template_include'
filtres principaux : encore une fois pour plus de flexibilité et de compatibilité.Enfin, le fichier modèle vient d'être chargé.
Fichier plugin principal
À ce stade, nous devons écrire le fichier avec des en-têtes de plug-in et l'utiliser pour ajouter les crochets qui permettront à notre flux de travail de se produire:
Dans le vrai fichier, nous ajouterons probablement plus d'en-têtes, comme des liens de plugin et d'auteur, une description, une licence, etc.
Plugin Gist
Ok, nous avons fini avec notre plugin. Tout le code peut être trouvé dans un Gist ici .
Ajout de pages
Le plugin est prêt et fonctionne, mais nous n'avons ajouté aucune page.
Cela peut être fait à l'intérieur du plugin lui-même, à l'intérieur du thème
functions.php
, dans un autre plugin, etc.Ajouter des pages n'est qu'une question de:
Etc. Vous pouvez ajouter toutes les pages dont vous avez besoin, n'oubliez pas d'utiliser des URL relatives pour les pages.
À l'intérieur du fichier de modèle, vous pouvez utiliser toutes les balises de modèle WordPress et vous pouvez écrire tout le PHP et HTML dont vous avez besoin.
L'objet de publication global est rempli de données provenant de notre page virtuelle. La page virtuelle elle-même est accessible via une
$wp_query->virtual_page
variable.Pour obtenir l'URL d'une page virtuelle, il suffit de passer au
home_url()
même chemin que celui utilisé pour créer la page:Notez que dans la boucle principale du modèle chargé,
the_permalink()
retournera le permalien correct à la page virtuelle.Notes sur les styles / scripts pour les pages virtuelles
Probablement lorsque des pages virtuelles sont ajoutées, il est également souhaitable d'avoir des styles / scripts personnalisés mis en file d'attente, puis de les utiliser uniquement
wp_head()
dans des modèles personnalisés.C'est très facile, car les pages virtuelles sont facilement reconnaissables en regardant les
$wp_query->virtual_page
variables et les pages virtuelles peuvent être distinguées les unes des autres en regardant leurs URL.Juste un exemple:
Notes à OP
La transmission de données d'une page à une autre n'est pas liée à ces pages virtuelles, mais est juste une tâche générique.
Cependant, si vous avez un formulaire dans la première page et que vous souhaitez transmettre des données de celui-ci à la deuxième page, utilisez simplement l'URL de la deuxième page dans la
action
propriété de formulaire .Par exemple, dans le fichier de modèle de première page, vous pouvez:
puis dans le deuxième fichier de modèle de page:
la source
wordpress/virtual-page
et l'url tronquée de la page l'estvirtual-page
.J'ai utilisé une fois une solution décrite ici: http://scott.sherrillmix.com/blog/blogger/creating-a-better-fake-post-with-a-wordpress-plugin/
En fait, lorsque je l'utilisais, j'étend la solution de manière à pouvoir enregistrer plus d'une page à la fois (le reste d'un code est +/- similaire à la solution que je relie à partir d'un paragraphe ci-dessus).
La solution nécessite que vous ayez de bons permaliens autorisés ...
la source
content
dans le tableau lorsque vous vous inscrivez, la fausse page est affichée dans le corps de la page - elle peut contenir du HTML ainsi que du texte simple ou même un shortcode.