Jak dołączyć kod tylko na określonych stronach?

14

Uczę się o wtyczkach i skrótach. Zauważyłem, że kiedy aktywuję wtyczkę, jej kod ładuje się na wszystkich moich stronach - nawet na stronach, które nie mają mojego krótkiego kodu. (Nie mam na myśli treści vs. stron administracyjnych). Na niektórych stronach z treściami używam określonego krótkiego kodu, a na innych stronach z treściami nie - ale w każdym razie kod wtyczki jest ładowany. Jak to zrobić, aby wtyczka była dołączana tylko na stronach, na których używany jest krótki kod?

Więcej szczegółów:

Powiedzmy, że mam wtyczkę, która tworzy lightbox. Aktywuję wtyczkę. Na mojej stronie „Cool Images” używam shortcode, aby utworzyć lightbox. Kiedy zaznaczam opcję Wyświetl źródło na mojej stronie „Informacje”, która nie używa skrótu lightbox, widzę, że kod wtyczki lightbox został załadowany. Moje strony będą ładować się szybciej, jeśli napiszę wtyczkę, tak aby jej kod był ładowany tylko na stronach, na których jest potrzebny. czy to możliwe? W przeciwnym razie będę niepotrzebnie ładować kod wielu wtyczek na stronach. Jakieś pomysły?

Laxmidi
źródło
1
Czy próbujesz coś kolejkować, czy próbujesz wykonać skrypt PHP na stronach z krótkim kodem?
mor7ifer
+1 @ m0r7if3r - Chciałbym również zrozumieć, że .. Podejścia byłyby bardzo różne
krembo99
@ mrOr7if3r, Dzięki za wiadomość. Załóżmy na przykład, że mam wtyczkę Map Google. Czy ta wtyczka musi być ładowana na każdej stronie - tj. Na stronach, które nie używają wtyczki? Załóżmy, że mam stronę „Informacje”, na której nie ma skrótu Map Google. Kiedy patrzę na View Source, widzę, że kod wtyczki został załadowany na tej stronie (zdarzenie, chociaż nie używam). Czy kod wtyczek musi się ładować na każdej stronie? Dzięki.
Laxmidi
Dobre pytanie, które imho prowadzi do (nowej) najlepszej praktyki, ponieważ WP umożliwia nam kolejkowanie skryptów w dowolnym momencie.
Raphael

Odpowiedzi:

9

WP v3.3 dał nam możliwość uruchamiania wp_enqueue_script na środku strony. Bilet 9346

To znacznie ułatwiło włączenie JS z większą szczegółowością (przynajmniej przy użyciu skrótów). Tutaj jquery zostanie uwzględnione tylko po uruchomieniu naszego shortcode.

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
źródło
1
Tak właśnie należy to zrobić, imo.
Raphael
1
Doskonale, nie zdawałem sobie sprawy, że można teraz uruchomić wp_enqueue_script na środku strony. O wiele czystszy sposób ładowania skryptów / css tylko w razie potrzeby!
Rick Curran
2

Sprawdź zmienne interfejsu administratora

Jeden element menu to szczególny przypadek: komentarze, ponieważ są rejestrowane za pomocą add_WHATEVER_(submenu)page()interfejsu 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

Są to niezgodne i zakodowane na stałe w rdzeniu wp. Pamiętaj, że nie wszystkie są ustawione na wszystkich stronach.

Podłącz do haków interfejsu użytkownika specyficznych dla strony

Są też specjalne, specyficzne dla strony haczyki, na które można spojrzeć admin-footer.phpi admin-header.php:

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

Kilka przykładów w prawdziwym świecie: Ekran postu

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

Jest też $hook_suffixcoś, co możesz sprawdzić w celu kolejkowania skryptów, właśnie wtedy, gdy chwytasz swoją akcję:

do_action( 'admin_enqueue_scripts', $hook_suffix );

Aktualizacja

Aby uzyskać łatwiejszy (1 kliknięcie) dostęp do tych danych / informacji, stworzyliśmy darmową, przyjazną dla programistów wtyczkę o nazwie „(WCM) Current Admin Info” , która jest dostępna na GitHub . Wtyczkę można wkrótce znaleźć w oficjalnym repozytorium wp.org .

Zrzuty ekranu

Aby wyświetlić podgląd tego, co otrzymujesz dzięki tej wtyczce:

Ekran

Haki

Globals

kajzer
źródło
0

Mógłby zrobić coś w stylu (w header.php):

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

Sprawdza, czy bieżącym ładowaniem jest strona czy post, a następnie pobiera treść i wyszukuje Twój krótki kod. Po znalezieniu wykonuje swoją funkcję.

Noel Tock
źródło
Dziękuję za Twoją wiadomość. Próbowałem użyć twojego rozwiązania, ale niestety nie udało mi się go uruchomić.
Laxmidi
Został dodany do nagłówka?
Noel Tock,
1
Widziałeś już get_shortcode_regex()?
kaiser
0

Najprostszym sposobem jest sprawdzenie krótkiego kodu.

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
źródło
1
Jest get_shortcode_regex()na to.
kaiser
0

@kaiser zanotował get_shortcode_regex()kilka razy w tym wątku, pomyślałem, że podam przykład, jak go używać. Kod pochodzi w dużej mierze ze strony get_shortcode_regex()Referencje do kodu 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
źródło
-3

Znalazłem to rozwiązanie :

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

function my_deregister_javascript() {
    wp_deregister_script( 'my_scripts_handle' );
}
Laxmidi
źródło
3
Ale wy usuniecie skrypty ze wszystkich stron
Mamaduka,