web-dev-qa-db-fra.com

Comment utiliser wp_enqueue_style () et wp_enqueue_script () uniquement en cas de besoin?

Mon plugin utilise wp_enqueue_style () et wp_enqueue_script () pour charger des ressources, mais je me suis gardé de ne pas dégrader les performances de l'utilisateur et de ne les charger que lorsque l'ensemble actuel de publications contient le shortcode de mon plugin. Je le fais en utilisant:

add_filter('the_posts', 'CrayonWP::the_posts');

the_posts est appelé avant wp_head, mais également plusieurs fois par la suite (probablement pour les publications récentes dans les widgets, etc.).

Le problème ici est que lorsque je recherche le shortcode dans le contenu de la publication et que je signale le processus de mise en file d'attente, il arrive que:

  • the_post est appelé avant wp_head (ce que je veux)
  • mais cet ensemble de messages n'a pas mon shortcode et je ne mets pas en file d'attente.
  • plus tard, un autre appel à the_posts tente de mettre en file d'attente, mais il est trop tard.

Existe-t-il un moyen sûr de vérifier ce qui apparaîtra sur une page avant d'appeler wp_head afin de pouvoir être sûr de ne mettre en file d'attente que si cela est nécessaire sans pour autant rater l'occasion?

EDIT:

Excellent article: http://beerpla.net/2010/01/13/wordpress-plugin-development-how-to-include-css-and-javascript-conditional-and-only- quand-nécessaire-par-the-posts/

Mais il ne prend pas en compte plusieurs appels à the_posts dans une requête de page unique :(

EDIT 2:

Ce que j'ai essayé, c'est d'utiliser:

add_action('wp', 'CrayonWP::queue');

Étant donné que l'action wp n'est utilisée qu'une seule fois, juste après la finalisation de la demande.

Et à l'intérieur de cette fonction:

global $wp_query;
$posts = $wp_query->posts;

Je ne sais pas comment la variable $ wp_query change au cours de la boucle cependant. Si le filtre the_posts est appelé à plusieurs reprises, cela implique-t-il que la requête d'origine est susceptible de changer à mesure que les widgets envoient leurs propres requêtes? Évidemment, je ne veux pas vraiment vérifier les codes courts dans les posts de "posts récents", car ils ne sont peut-être pas affichés sur la page pour le moment. Ainsi, l'utilisation du crochet d'action wp au lieu du filtre the_posts contiendra-t-elle les publications demandées pour cette page donnée, qu'il s'agisse d'une page unique ou de la page d'accueil?

3
Aram Kocharyan

Je ne l'ai pas testé, mais pourrais is_main_query () (apparu en 3.3) être utilisé ici pour vérifier que la requête en cours d'exécution est la requête à renseigner 'la boucle'. (Je ne sais pas comment il gère les nouvelles instances WP_Query, cependant).

Le Codex indique qu'il peut être utilisé sur le pre_get_posts, mais en regardant le code, je ne vois pas pourquoi il ne pourrait pas être appelé par un hook ultérieur (c'est-à-dire the_posts). Il vérifie simplement le $wp_the_query global par rapport à la requête actuelle .

1
Stephen Harris