Wie können Skripte und / oder Stile für die Verwendung in Plugins registriert / in die Warteschlange gestellt werden?
Ich habe vor kurzem ein einfaches Plugin-Plugin gemacht , um den Benutzer Avatar / Gravatar mit einem Shortcode hinzuzufügen. Ich habe verschiedene Stiloptionen für die Anzeige des Avatars (quadratisch, rund usw.) und habe mich entschieden, die CSS direkt in den Shortcode selbst einzufügen.
Jetzt ist mir jedoch klar, dass dies kein guter Ansatz ist, da der CSS-Code jedes Mal wiederholt wird, wenn der Shortcode auf einer Seite verwendet wird. Ich habe mehrere andere Ansätze auf dieser Site gesehen und der wp-Codex hat sogar zwei eigene Beispiele, so dass es schwierig ist zu wissen, welcher Ansatz am konsistentesten und schnellsten ist.
Hier sind die Methoden, die mir derzeit bekannt sind:
Methode 1: Direkt in den Shortcode aufnehmen - Dies ist das, was ich derzeit im Plugin mache, aber es scheint nicht gut zu sein, da es den Code wiederholt.
class My_Shortcode {
function handle_shortcode( $atts, $content="" ) {
/* simply enqueue or print the scripts/styles in the shortcode itself */
?>
<style type="text/css">
</style>
<?php
return "$content";
}
}
add_shortcode( 'myshortcode', array( 'My_Shortcode', 'handle_shortcode' ) );
Methode 2: Verwenden Sie die Klasse, um Skripts oder Stile bedingt in die Warteschlange zu stellen
class My_Shortcode {
static $add_script;
static function init() {
add_shortcode('myshortcode', array(__CLASS__, 'handle_shortcode'));
add_action('init', array(__CLASS__, 'register_script'));
add_action('wp_footer', array(__CLASS__, 'print_script'));
}
static function handle_shortcode($atts) {
self::$add_script = true;
// shortcode handling here
}
static function register_script() {
wp_register_script('my-script', plugins_url('my-script.js', __FILE__), array('jquery'), '1.0', true);
}
static function print_script() {
if ( ! self::$add_script )
return;
wp_print_scripts('my-script');
}
}
My_Shortcode::init();
Methode 3: Verwenden von get_shortcode_regex();
function your_prefix_detect_shortcode() {
global $wp_query;
$posts = $wp_query->posts;
$pattern = get_shortcode_regex();
foreach ($posts as $post){
if ( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
&& array_key_exists( 2, $matches )
&& in_array( 'myshortcode', $matches[2] ) )
{
// css/js
break;
}
}
}
add_action( 'wp', 'your_prefix_detect_shortcode' );
Methode 4: Verwenden von has_shortcode();
function custom_shortcode_scripts() {
global $post;
if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'myshortcode') ) {
wp_enqueue_script( 'my-script');
}
}
add_action( 'wp_enqueue_scripts', 'custom_shortcode_scripts');
Method 4: Using has_shortcode();
ist am besten, weil es sicherstellt, dass Skripte und Stile einmal geladen werden, wenn der Inhalt des Beitrags einen Shortcode enthält, unabhängig von der mehrfachen Verwendung des Shortcodes. Obwohl es möglicherweise nicht für Shortcode-Anwendungen in Widgets oder in der Seitenleiste funktioniert, bin ich mir nicht sicher. Wenn es sich um ein Plugin handelt, würde ich Ihnen nicht empfehlen, Skripte mit einem Shortcode zu verknüpfen, da einige möglicherweise Ihre Funktion anstelle des Shortcodes aufrufen, um die gewünschte Ausgabe zu erhalten.