web-dev-qa-db-fra.com

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

J'apprends les plugins et les codes courts. 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 code court. (Je ne parle pas du 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 le fais pas - mais dans tous les cas, le code du plugin est chargé. Comment puis-je faire en sorte que le plug-in ne soit inclus que 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 coche View Source sur ma page "About", qui n'utilise pas le shortcode lightbox, je constate que le code du plug-in 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, j'aurai du code pour de nombreux plug-ins chargés inutilement sur des pages. Des idées?

14
Laxmidi

WP v3.3 nous a permis 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é (lorsque vous utilisez des 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' );
8
Dave Romsey

Vérifier les variables de l'interface utilisateur d'administration

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

// 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.

Accrocher à des crochets d'interface utilisateur d'administration spécifiques à la page

Ensuite, il y a aussi des hooks spéciaux, spécifiques à une page, que vous pouvez jeter un coup d'oeil dans admin-footer.php et 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, il y a aussi le $hook_suffix contre lequel vous pouvez vérifier les scripts de mise en file d'attente, juste lorsque vous accrochez votre action:

do_action( 'admin_enqueue_scripts', $hook_suffix );

Mettre à jour

Pour obtenir un accès plus facile (en un clic) à ces données/informations, nous avons créé un plug-in gratuit pour les développeurs, appelé "(WCM) Informations sur l'administrateur actuel" , disponible sur GitHub . Le plugin se trouve également dans le répertoire officiel wp.org .

Captures d'écran

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

Screen

Hooks

Globals

2
kaiser

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 le chargement actuel est une page ou une publication, puis saisit le contenu et recherche votre shortcode. En le trouvant, il exécute votre fonction.

0
Noel Tock

Le moyen le plus simple est simplement de 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');
0
matchdav

@kaiser a noté get_shortcode_regex() plusieurs fois dans ce fil de discussion, je pensais juste donner un exemple d'utilisation. Le code provient assez bien de la page get_shortcode_regex() WordPress Code Reference.

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' );
0
Nicolai