J'essaie de créer un point de terminaison d'API personnalisé dans WordPress et je dois rediriger les demandes vers une page virtuelle située dans la racine de WordPress vers une page fournie avec mon plug-in. Donc, fondamentalement, toutes les demandes d’une page sont en réalité acheminées vers une autre page.
Exemple:
http://mysite.com/my-api.php
=>http://mysite.com/wp-content/plugins/my-plugin/my-api.php
Le but de ceci est de rendre l'URL du noeud final de l'API aussi courte que possible (comme pour http://mysite.com/xmlrpc.php
envoyer le fichier de noeud final de l'API avec le plug-in plutôt que d'exiger que l'utilisateur déplace les fichiers dans son installation et / ou pirate son noyau. .
Mon premier essai consistait à ajouter une règle de réécriture personnalisée. Cependant, cela a eu deux problèmes.
- Le point final a toujours eu un slash final. C'est devenu
http://mysite.com/my-api.php/
- Ma règle de réécriture n'était que partiellement appliquée. Il ne redirigerait pas vers
wp-content/plugins...
, il redirigerait versindex.php&wp-content/plugins...
. Cela a amené WordPress à afficher une erreur de page introuvable ou tout simplement à afficher par défaut la page d'accueil.
Des idées? Suggestions?
la source
get_query_vars()
dans my-api.php. J'ai vérifié quelles variables sont chargées. Et la seule variable définie est aaWP object
appelée$wp
. Comment puis-je accéder ou transformer cela en unWP_Query
objet pour pouvoir accéder aux variables transmises avecget_query_vars()
?include
un fichier, il est exécuté dans la portée actuelle. Dans ce cas, c'est lawpse9870_parse_request
fonction qui n'a que le$wp
paramètre. Il est possible que l'$wp_query
objet global n'ait pas encore été défini. Celaget_query_var()
ne fonctionnera donc pas. Cependant, vous avez de la chance:$wp
la classe qui contient lequery_vars
membre dont vous avez besoin - je l’utilise moi-même dans le code ci-dessus.Cela a fonctionné pour moi. Je n'ai jamais touché l'API de réécriture, mais je suis toujours prêt à me pousser dans de nouvelles directions. Ce qui suit a fonctionné sur mon serveur de test pour 3.0 situé dans un sous-dossier de localhost. Je ne vois pas de problème si WordPress est installé dans la racine Web.
Il suffit de déposer ce code dans un plugin et de télécharger le fichier nommé "taco-kittens.php" directement dans le dossier du plugin. Vous aurez besoin d'écrire un flush dur pour vos permaliens. Je pense qu'ils disent que le meilleur moment pour le faire est l'activation du plugin.
Meilleurs voeux, -Mike
la source
add_rewrite_rule( 'taco-kittens', 'wp-content/plugins/taco-kittens.php', 'top' );
Une raison de ne pas faire quelque chose comme ça à la place?
http://mysite.com/?my-api=1
Ensuite, connectez simplement votre plugin à 'init' et vérifiez que la variable get. S'il existe, faites ce que votre plugin doit faire et mourrez ()
la source
Je ne comprends peut-être pas bien vos questions, mais un simple shortcode résoudrait-il votre problème?
Pas:
La nouvelle page agit comme un point de terminaison de l'API et votre shortcode envoie des demandes à votre code de plug-in à l' adresse http://mysite.com/wp-content/plugins/my-plugin/my-api.php.
(bien sûr, cela signifie que my-api.php aurait défini le shortcode)
Vous pouvez probablement automatiser les étapes 1 et 2 via le plugin.
la source
Je n'ai pas encore beaucoup traité de réécriture, donc c'est probablement un peu difficile, mais cela semble fonctionner:
Cela fonctionne si vous accrochez ceci à 'generate_rewrite_rules', mais il doit y avoir un meilleur moyen, car vous ne voulez pas réécrire .htaccess à chaque chargement de page.
On dirait que je ne peux pas arrêter de modifier mes propres messages ... il devrait probablement plutôt aller dans vous activez callback et référence globale $ wp_rewrite à la place. Ensuite, supprimez l'entrée de non_wp_rules et envoyez-la à nouveau à .htaccess en désactivant le rappel.
Et enfin, l'écriture dans .htaccess devrait être un peu plus sophistiquée, vous voulez seulement remplacer la section wordpress qui s'y trouve.
la source
J'avais une exigence similaire et je voulais créer plusieurs points de terminaison basés sur des slugs uniques pointant vers le contenu généré par le plugin.
Regardez la source de mon plugin: https://wordpress.org/extend/plugins/picasa-album-uploader/
La technique que j'ai utilisée commence par l'ajout d'un filtre permettant
the_posts
d'examiner la demande entrante. Si le plugin doit le gérer, un post factice est généré et une action est ajoutée pourtemplate_redirect
.Lorsque l'
template_redirect
action est appelée, il doit en résulter la sortie de l'intégralité du contenu de la page à afficher et à quitter, sinon le résultat doit être renvoyé sans qu'aucun résultat ne soit généré. Voir le code danswp_include/template-loader.php
et vous verrez pourquoi.la source
J'utilise une autre approche qui consiste à forcer la page d'accueil à charger un titre, un contenu et un modèle de page personnalisés .
La solution est très soignée puisqu'elle peut être mise en œuvre lorsqu'un utilisateur suit un lien convivial tel que http://example.com/ ? Plugin_page = myfakepage
Il est très facile à mettre en œuvre et devrait permettre un nombre illimité de pages.
Code et instructions ici: Générez une page Wordpress personnalisée / fictive / virtuelle à la volée
la source
J'utilise une approche similaire à celle décrite ci-dessus par Xavi Esteve, qui a cessé de fonctionner en raison d'une mise à niveau de WordPress, pour autant que je sache, au deuxième semestre de 2013.
C'est documenté en détail ici: https://stackoverflow.com/questions/17960649/wordpress-plugin-generating-virtual-pages-and-using-theme-template
La partie clé de mon approche consiste à utiliser le modèle existant afin que la page résultante ressemble à une partie du site; Je voulais que ce soit aussi compatible que possible avec tous les thèmes, espérons-le, dans les versions de WordPress. Le temps dira si j'avais raison!
la source
c'est un exemple de lecture en production, créez d'abord une classe de page virtuelle:
Dans l'étape suivante, accrocher l'
template_redirect
action et gérer votre page virtuelle comme ci-dessousla source