Wie füge ich Code nur auf bestimmten Seiten ein?

14

Ich lerne etwas über Plugins und Shortcodes. Ich habe festgestellt, dass beim Aktivieren meines Plugins der Code auf alle meine Seiten geladen wird - auch auf Seiten, die keinen Shortcode haben. (Ich meine nicht Inhalt gegen Admin-Seiten). Auf einigen Inhaltsseiten verwende ich einen bestimmten Shortcode und auf anderen Inhaltsseiten nicht - aber auf jeden Fall wird der Code des Plugins geladen. Wie mache ich es so, dass das Plugin nur auf Seiten enthalten ist, auf denen der Shortcode verwendet wird?

Mehr Details:

Nehmen wir an, ich habe ein Plugin, das eine Lightbox erstellt. Ich aktiviere das Plugin. Auf meiner Seite "Coole Bilder" verwende ich einen Shortcode, um eine Lightbox zu erstellen. Wenn ich auf meiner Seite "Info" die Option "Quelltext anzeigen" auswähle, auf der der Lightbox-Shortcode nicht verwendet wird, wird angezeigt, dass der Code des Lightbox-Plugins geladen wurde. Meine Seiten werden schneller geladen, wenn ich mein Plugin schreibe, sodass der Code nur auf den Seiten geladen wird, auf denen er benötigt wird. Ist das möglich? Ansonsten werde ich unnötigerweise Code für viele Plugins auf Seiten laden lassen. Irgendwelche Ideen?

Laxmidi
quelle
1
Versuchen Sie, etwas in die Warteschlange zu stellen, oder versuchen Sie, ein PHP-Skript auf Seiten mit dem Shortcode auszuführen?
Mor7ifer
+1 @ m0r7if3r - Ich möchte auch verstehen, dass .. Die Ansätze würden sehr unterschiedlich sein
krembo99
@ mrOr7if3r, Danke für die Nachricht. Angenommen, ich habe ein Google Maps-Plugin. Muss das Plugin auf jeder Seite geladen werden - dh auf Seiten, die das Plugin nicht verwenden? Nehmen wir an, ich habe eine "Info" -Seite, auf der sich der Google Maps-Shortcode nicht befindet. Wenn ich mir View Source anschaue, sehe ich, dass der Code des Plugins auf dieser Seite geladen wurde (Ereignis, obwohl ich es nicht benutze). Muss Code für Plugins auf jeder einzelnen Seite geladen werden? Vielen Dank.
Laxmidi
Gute Frage, die imho zu (neuen) Best Practices führt, da wir mit WP jetzt Skripte zu jedem Zeitpunkt in die Warteschlange stellen können.
Raphael

Antworten:

9

Mit WP v3.3 konnten wir wp_enqueue_script in der Mitte einer Seite ausführen. Ticket 9346

Dies hat es viel einfacher gemacht, Ihren JS mit besserer Granularität einzubinden (zumindest bei Verwendung von Shortcodes). Hier ist die Abfrage nur enthalten, wenn unser Shortcode ausgelöst wird.

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
quelle
1
So sollte es gemacht werden, imo.
Raphael
1
Hervorragend, ich hatte nicht bemerkt, dass es jetzt möglich ist, wp_enqueue_script mitten auf einer Seite auszuführen. Eine viel sauberere Möglichkeit, Skripte / CSS nur bei Bedarf zu laden!
Rick Curran
2

Überprüfen Sie die Benutzeroberflächenvariablen für Administratoren

Ein Menüpunkt ist ein Sonderfall: Kommentare, wie sie mit dem eingetragen werden 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

Diese sind nicht konsistent und in wp core fest codiert. Beachten Sie, dass nicht alle auf allen Seiten festgelegt sind.

Haken Sie sich in seitenbezogene Administrations-UI-Haken ein

Dann gibt es noch spezielle, seitenbezogene Hooks, die du dir ansehen kannst admin-footer.phpund admin-header.php:

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

Einige Beispiele aus der Praxis: Post Screen

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

Dann gibt es noch das $hook_suffix, mit dem Sie vergleichen können, um Skripte in die Warteschlange zu stellen, direkt wenn Sie Ihre Aktion einbinden:

do_action( 'admin_enqueue_scripts', $hook_suffix );

Aktualisieren

Um einen einfacheren (1-Klick) Zugriff auf diese Daten / Informationen zu erhalten, haben wir ein frei verfügbares, entwicklerfreundliches Plugin namens "(WCM) Current Admin Info" erstellt , das auf GitHub verfügbar ist . Das Plugin kann in naher Zukunft auch im offiziellen wp.org-Repository gefunden werden .

Screenshots

So geben Sie eine Vorschau auf das, was Sie mit diesem Plugin erhalten:

Bildschirm

Haken

Globals

Kaiser
quelle
0

Könnte etwas in der Art von (in der header.php) machen:

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

Überprüft, ob es sich beim aktuellen Ladevorgang um eine Seite oder einen Beitrag handelt, greift nach Inhalten und sucht nach Ihrem Shortcode. Wenn es gefunden wird, führt es Ihre Funktion aus.

Noel Tock
quelle
Danke für deine Nachricht. Ich habe versucht, Ihre Lösung zu verwenden, konnte sie jedoch leider nicht zum Laufen bringen.
Laxmidi
Wurde zum Header hinzugefügt?
Noel Tock
1
Schon gesehen get_shortcode_regex()?
Kaiser
0

Am einfachsten ist es, nur nach dem Shortcode zu suchen.

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
quelle
1
Dafür gibt get_shortcode_regex()es.
Kaiser
0

@kaiser merkte get_shortcode_regex()mehrmals in diesem Thread, ich dachte nur, ich gebe ein Beispiel, wie man es benutzt. Der Code ist so ziemlich der get_shortcode_regex()WordPress-Code-Referenzseite entnommen .

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
quelle
-3

Ich habe diese Lösung gefunden :

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

function my_deregister_javascript() {
    wp_deregister_script( 'my_scripts_handle' );
}
Laxmidi
quelle
3
Aber
Ihre