Comment inclure du code uniquement sur des pages spécifiques?

14

J'apprends les plugins et les shortcodes. J'ai remarqué que lorsque j'active mon plugin, son code est chargé sur toutes mes pages, même les pages qui n'ont pas mon shortcode. (Je ne parle pas de contenu par rapport aux pages d'administration). Sur certaines pages de contenu, j'utilise un shortcode particulier et sur d'autres pages de contenu, je ne - mais en tout cas, le code du plugin est chargé. Comment faire pour que le plugin soit inclus uniquement sur les pages où le shortcode est utilisé?

Plus de détails:

Disons que j'ai un plugin qui fait une lightbox. J'active le plugin. Sur ma page "Cool Images", j'utilise un shortcode pour créer une lightbox. Lorsque je vérifie Afficher la source sur ma page "À propos", qui n'utilise pas le shortcode lightbox, je vois que le code du plugin lightbox a été chargé. Mes pages se chargeront plus rapidement si j'écris mon plugin afin que son code ne soit chargé que sur les pages où il est nécessaire. Est-ce possible? Sinon, je vais avoir du code pour de nombreux plugins chargés inutilement sur les pages. Des idées?

Laxmidi
la source
1
Essayez-vous de mettre quelque chose en file d'attente, ou essayez-vous d'exécuter un script PHP sur les pages qui ont le shortcode?
mor7ifer
+1 @ m0r7if3r - Je voudrais aussi comprendre que .. Les approches seraient très différentes
krembo99
@ mrOr7if3r, Merci pour le message. Par exemple, supposons que j'ai un plugin Google Maps. Ce plugin doit-il être chargé sur chaque page, c'est-à-dire les pages qui n'utilisent pas le plugin? Disons que j'ai une page "À propos" qui n'a pas le shortcode Google Maps dessus. Si je regarde View Source, je vois que le code du plugin a été chargé sur cette page (événement que je n'utilise pas). Le code des plugins doit-il être chargé sur chaque page? Merci.
Laxmidi
Bonne question qui, à mon humble avis, mène aux (nouvelles) meilleures pratiques, car WP nous permet désormais de mettre les scripts en file d'attente à tout moment.
Raphael

Réponses:

9

WP v3.3 nous a donné la possibilité d'exécuter wp_enqueue_script au milieu d'une page. Billet 9346

Cela a rendu beaucoup plus facile l'inclusion de votre JS avec une meilleure granularité (lors de l'utilisation de codes courts, au moins). Ici, jquery ne sera inclus que lorsque notre shortcode sera déclenché.

function get_slideshow() {
  // Do some stuff...

  // Load up scripts right from within our shortcode function (requires WP 3.3+)
  wp_enqueue_script( 'jquery', array(), null, true  ); 

  return;
}
add_shortcode( 'cool_slideshow', 'get_slideshow' );
Dave Romsey
la source
1
Voilà comment cela devrait être fait, imo.
Raphael
1
Excellent, je n'avais pas réalisé qu'il était désormais possible d'exécuter wp_enqueue_script au milieu d'une page. Une façon beaucoup plus propre de ne charger les scripts / css qu'en cas de besoin!
Rick Curran
2

Vérifiez les variables d'administration UI

Un élément de menu est un cas particulier: les commentaires, lorsqu'ils sont enregistrés à l'aide de l' add_WHATEVER_(submenu)page()API.

// All need to be stated as beeing global
global $pagenow, $typenow, $hook_suffix, $parent_file, $submenu_file, $post_type_object;
if ( 'THE-OUTPUT.php' === $WHATEVER_YOU_CHOOSE_TO_CHECK )
    // do stuff

Celles-ci sont non cohérentes et codées en dur dans le noyau wp. Notez que tous ne sont pas définis sur toutes les pages.

Accrochez-vous aux crochets d'interface utilisateur d'administration spécifiques à la page

Ensuite, il existe également des crochets spéciaux, spécifiques à la page, que vous pouvez consulter admin-footer.phpet admin-header.php:

// Examples:
// Header
"admin_head-$hook_suffix"
"admin_print_styles-$hook_suffix"
"admin_print_scripts-$hook_suffix"
// Footer
"admin_footer-$hook_suffix"

Quelques exemples dans le monde réel: Post Screen

// Examples how the result looks like
admin_print_styles-post.php
admin_print_styles-post-new.php

Ensuite, $hook_suffixvous pouvez également vérifier les scripts de mise en file d'attente, juste lorsque vous accrochez votre action:

do_action( 'admin_enqueue_scripts', $hook_suffix );

Mise à jour

Pour obtenir un accès plus facile (en un clic) à ces données / informations, nous avons créé un plug-in gratuit et convivial pour les développeurs nommé "(WCM) Current Admin Info" , qui est disponible sur GitHub . Le plugin peut également être trouvé dans un proche avenir dans le dépôt officiel de wp.org .

Captures d'écran

Pour donner un aperçu de ce que vous obtenez avec ce plugin:

Écran

Crochets

Globals

kaiser
la source
0

Pourrait faire quelque chose dans le sens de (dans le header.php):

<?php
        if ( have_posts() && ( is_page() || is_single() ) ) {
            $content = get_the_content(the_post());
            if ( stripos( $content , '[your-shortcode') ) { function_for_scripts(); } 
        }   
?>

Vérifie si la charge actuelle est une page ou une publication, puis saisit le contenu et recherche votre shortcode. En le trouvant, il exécute votre fonction.

Noel Tock
la source
Merci pour votre message. J'ai essayé d'utiliser votre solution, mais, malheureusement, je n'ai pas pu la faire fonctionner.
Laxmidi
A été ajouté à l'en-tête?
Noel Tock
1
Avez-vous déjà vu get_shortcode_regex()?
kaiser
0

Le moyen le plus simple est de simplement vérifier le shortcode.

function your_scripts()
{ 
    global $post;
    wp_register_script('your-script',$the_path_to_your_script,'0.1',true);
    if ( strstr( $post->post_content, '[your-shortcode' ) ) 
    {
        wp_enqueue_script('your-script');
    }
}
add_action( 'wp_enqueue_scripts', 'your_scripts');
matchdav
la source
1
Il y a get_shortcode_regex()pour ça.
kaiser
0

@kaiser a noté get_shortcode_regex()plusieurs fois dans ce fil, je pensais juste donner un exemple sur la façon de l'utiliser. Le code est à peu près tiré de la get_shortcode_regex()page de référence du code WordPress.

function enqueue_script_if_shortcode_is_detected() {
    global $post;

    wp_register_script( 'your-script', $the_path_to_your_script, '1.0', true );

    $pattern = get_shortcode_regex();

    if (   preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
        && array_key_exists( 2, $matches )
        && in_array( 'your-shortcode', $matches[2] )
    ) {
        wp_enqueue_script('your-script');
    }
}
add_action( 'wp_enqueue_scripts', 'enqueue_script_if_shortcode_is_detected' );
Nicolai
la source
-3

J'ai trouvé cette solution :

add_action( 'wp_print_scripts', 'my_deregister_javascript', 100 );

function my_deregister_javascript() {
    wp_deregister_script( 'my_scripts_handle' );
}
Laxmidi
la source
3
Mais vos solutions supprimeront les scripts de toutes les pages
Mamaduka