Jaki jest pomysł na rejestrację / kolejkowanie skryptów i / lub stylów do użytku we wtyczkach?
Niedawno stworzyłem wtyczkę prostą wtyczkę, aby dodać awatar użytkownika / gravatar z krótkim kodem. Mam różne opcje wyświetlania awatara (kwadratowy, okrągły itp.) I postanowiłem umieścić css bezpośrednio w samym krótkim kodzie.
Zdaję sobie jednak sprawę, że nie jest to dobre podejście, ponieważ będzie powtarzać css za każdym razem, gdy na stronie zostanie użyty krótki kod. Widziałem kilka innych podejść na tej stronie, a kodeks wp ma nawet dwa własne przykłady, więc trudno jest ustalić, które podejście jest najbardziej spójne i najszybsze.
Oto metody, które obecnie znam:
Metoda 1: Uwzględnij bezpośrednio w krótkim kodzie - tak właśnie robię we wtyczce, ale nie wydaje się dobra, ponieważ powtarza kod.
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' ) );
Metoda 2: Użyj klasy do warunkowego kolejkowania skryptów lub stylów
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();
Metoda 3: Używanie 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' );
Metoda 4: Używanie 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();
najlepiej, ponieważ zapewni to, że skrypty i style zostaną załadowane jeden raz, jeśli treść postu ma krótki kod, niezależnie od jego wielokrotnego użycia. Chociaż może nie działać w przypadku użycia krótkiego kodu w widżetach lub na pasku bocznym, nie jestem jednak pewien. Jeśli dotyczy wtyczki, nie polecam wiązania skryptów za pomocą shortcode, ponieważ niektórzy mogą wywołać twoją funkcję zamiast shortcode, aby uzyskać pożądany wynik.