J'ai publié un plugin qui crée un shortcode et nécessite un fichier JavaScript et un fichier CSS à charger sur toute page contenant ce shortcode. Je pourrais simplement faire en sorte que le script / style soit chargé sur toutes les pages, mais ce n'est pas la meilleure pratique. Je veux seulement charger les fichiers sur les pages qui appellent le shortcode. J'ai trouvé deux méthodes pour le faire, mais les deux ont des problèmes.
La méthode 1 attribue la valeur true à un indicateur dans la fonction de gestionnaire de shortcode, puis vérifie cette valeur dans un wp_footer
rappel. Si c'est vrai, il utilise wp_print_scripts()
pour charger le JavaScript. Le problème, c'est que cela ne fonctionne que pour JavaScript et non pour CSS, car CSS doit être déclaré à l'intérieur <head>
, ce que vous ne pouvez faire que très tôt, comme init
ou wp_head
.
La méthode 2 se déclenche tôt et "regarde en avant" pour voir si le shortcode existe dans le contenu de la page en cours. J'aime cette méthode beaucoup mieux que la première, mais le problème qu'elle pose ne détecte pas si le modèle appelle do_shortcode()
.
Donc, je suis plutôt enclin à utiliser la deuxième méthode, puis à essayer de détecter si un modèle est attribué et, le cas échéant, à l’analyser pour le shortcode. Avant de faire cela, cependant, je voulais vérifier si quelqu'un connaissait une meilleure méthode.
Mise à jour: j'ai intégré la solution dans mon plugin. Si quelqu'un est curieux de le voir se dérouler dans un environnement live, vous pouvez le télécharger ou le parcourir .
Mise à jour 2: à partir de WordPress 3.3, il est désormais possible d' appeler wp_enqueue_script()
directement dans un rappel de shortcode , et le fichier JavaScript sera appelé dans le pied de page du document. C'est techniquement possible pour les fichiers CSS également, mais cela devrait être considéré comme une mauvaise pratique, car la sortie de CSS en dehors de la <head>
balise enfreint les spécifications du W3C, peut provoquer la FOUC et obliger le navigateur à restituer la page.
Réponses:
Sur la base de ma propre expérience, j’ai utilisé une combinaison des méthodes 1 et 2, l’architecture et les scripts de pied de page de 1, et la technique de prévision 2.
Pour l’avenir, j’utilise regex à la place de
stripos
; préférence personnelle, plus rapidement, et peut vérifier pour shortcode «malformé»;Si vous craignez que les auteurs utilisent
do_shortcode
manuellement, je choisirais de leur demander d'utiliser un appel d'action pour mettre enfiled'attente manuellement votre style préenregistré.UPDATE : Pour l'auteur paresseux qui n'a jamais RTFM, affichez un message pour mettre en évidence l' erreur de leur manière;)
la source
do_shortcode()
, n'est-il pas raisonnable de supposer qu'ils sont également aptes à suivre les instructions suivantes pour la mise en file d'attente du style shortcode?init
, juste n'importe où auparavantwp_head
. Pour le développeur paresseux, vérifiez à l'wp_style_is( 'my_style_handle', 'done' )
intérieur de votre shortcode. Si c'est faux, imprimez une erreur visible qui leur indique quoi faire.do_shortcode()
au modèle est déjà "quelque chose de plus" - et que les utilisateurs qui feraient quelque chose de plus sauraient déjà qu'il est nécessaire de mettre le style en file d'attente ou seraient plus disposés / susceptibles de le faire. suivre des instructions spéciales.Je réponds tardivement à cette question, mais depuis que Ian a commencé ce fil de discussion sur la liste des wp-hackers aujourd'hui, cela m'a fait penser que cela valait la peine de répondre, d'autant plus que j'ai prévu d'ajouter une telle fonctionnalité aux plugins sur lesquels je travaille.
Une approche à considérer consiste à vérifier sur le chargement de la première page pour voir si le shortcode est réellement utilisé, puis enregistrez le statut d'utilisation du shortcode dans une clé méta de publication. Voici comment:
Comment faire étape par étape
$shortcode_used
drapeau pour'no'
.$shortcode_used
indicateur sur'yes'
.'the_content'
priorité de raccordement12
après que WordPress a traité les codes courts et vérifiez la méta-publication pour une''
utilisation de la clé"_has_{$shortcode_name}_shortcode"
. (Une valeur de''
est renvoyée lorsqu'une clé méta de publication n'existe pas pour l'ID de publication.)'save_post'
crochet pour supprimer la publication meta en effaçant l'indicateur de persistance pour cette publication au cas où l'utilisateur modifierait l'utilisation du code court.'save_post'
hook, utilisezwp_remote_request()
pour envoyer un HTTP GET non bloquant à la permalien de la publication afin de déclencher le chargement de la première page et le réglage de l'indicateur de persistance.'wp_print_styles'
et vérifiez post meta pour une valeur de'yes'
,'no'
ou''
utilisez la clé"_has_{$shortcode_name}_shortcode"
. Si la valeur est'no'
ne pas servir l'externe. Si la valeur est'yes'
ou''
aller de l'avant et servir l'externe.Et cela devrait le faire. J'ai écrit et testé un exemple de plugin pour montrer comment tout cela fonctionne.
Exemple de code de plugin
Le plugin se réveille sur un
[trigger-css]
shortcode qui définit les<h2>
éléments de la page en blanc sur rouge afin que vous puissiez facilement la voir fonctionner. Il suppose uncss
sous - répertoire contenant unstyle.css
fichier contenant ce CSS:Et ci-dessous est le code dans un plugin de travail:
Exemple de captures d'écran
Voici une série de captures d'écran
Post Editor basique, sans contenu
Affichage post, pas de contenu
Post Editor
[trigger-css]
basique avec ShortcodeAffichage de poste avec
[trigger-css]
ShortcodePas sûr si c'est 100%
Je crois que ce qui précède devrait fonctionner dans presque tous les cas, mais comme je viens d'écrire ce code, je ne peux pas être sûr à 100%. Si vous pouvez trouver des situations où cela ne fonctionne pas, j'aimerais vraiment savoir si je peux corriger le code dans certains plugins auxquels j'ai ajouté ceci. Merci d'avance.
la source
post_content
. Et qu'en est-il des codes courts dans les widgets?'pre_http_request'
et désactiver plusieurs appels vers la même URL lorsque le'save_post'
raccordement est actif, mais je voudrais attendre que w en voie vraiment le besoin, non? Quant aux widgets, ils pourraient être améliorés, mais ce n’est pas un cas d’utilisation que j’ai déjà examiné.<style>
).Googling m'a trouvé une réponse potentielle . Je dis "potentiel", car cela a l'air bien et devrait fonctionner, mais je ne suis pas convaincu à 100% que c'est la meilleure façon de le faire:
Cela devrait pouvoir vérifier si la publication actuelle utilise un shortcode et ajouter une feuille de style à l'
<head>
élément de manière appropriée. Mais je ne pense pas que cela fonctionnera pour une page d'index (c.-à-d. Plusieurs publications dans la boucle) ... Elle provient également d'un article de blog vieux de 2 ans. Je ne suis même pas sûr que cela fonctionne avec WP 3.1.X. .la source
get_shortcode_regex()
pour la recherche.do_shortcode()
manuellement dans le modèle, vous savez déjà que vous exécuterez le shortcodeEn utilisant une combinaison de la réponse de TheDeadMedic et de la documentation get_shortcode_regex () (qui n'a en fait pas trouvé mes codes abrégés), j'ai créé une fonction simple permettant de mettre en file d'attente les scripts de plusieurs codes abrégés. Comme wp_enqueue_script () dans les codes abrégés ne fait qu'ajouter un pied de page, cela peut être utile car il peut gérer les scripts d'en-tête et de pied de page.
la source
Enfin, j’ai également trouvé une solution de chargement css conditionnel qui fonctionne pour mon plugin www.mapsmarker.com et que j’aimerais partager avec vous. Il vérifie si mon shortcode est utilisé dans le fichier de modèle actuel et dans l'en-tête / footer.php et si c'est le cas, met la feuille de style nécessaire dans l'en-tête:
la source
Pour mon plugin, j'ai constaté que parfois les utilisateurs ont un générateur de thème qui a un shortcode stocké dans des méta-données post . Voici ce que j'utilise pour détecter si mon shortcode de plugin est présent dans les métadonnées post ou post actuelles :
la source
Pour les fichiers CSS, vous pouvez les charger dans la sortie de votre shortcode:
Définissez une constante ou quelque chose après cela, comme
MY_CSS_LOADED
(inclure uniquement le CSS si la constante n'est pas définie).Vos deux méthodes sont plus lentes que d'aller de cette façon.
Pour les fichiers JS, vous pouvez faire de même si le script que vous chargez est unique et ne comporte aucune dépendance extérieure. Si ce n'est pas le cas, chargez-le à l'intérieur du pied de page, mais utilisez la constante pour déterminer si vous devez le charger ou non ...
la source
<head>
élément n'est pas un balisage approprié. Certes, la validation n’est qu’une directive, mais si nous essayons de nous en tenir à cette directive, le chargement de la feuille de style dans la sortie du code court est une mauvaise idée.<style type="text/css"> The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head"
. Les styles en ligne (<element style="..."></element>
) sont donc valables, mais les<style>
éléments en ligne ne le sont pas.Script Logic est un plugin WordPress qui vous donne un contrôle total sur tous les fichiers JavaScript et CSS. En utilisant ce plugin, vous pouvez conditionnellement charger le fichier CSS et JS uniquement sur les pages où cela est nécessaire.
http://wordpress.org/plugins/script-logic/
la source