Який ідеальний спосіб зареєструвати / задати сценарії та / або стилі для використання у плагінах?
Нещодавно я створив простий плагін, щоб додати аватар / граватар користувача з коротким кодом. У мене є різні варіанти стилю відображення аватара (квадрат, круглий і т. Д.) І вирішив помістити css безпосередньо в самий короткий код.
Однак я усвідомлюю, що зараз це не дуже вдалий підхід, оскільки він повторюватиме css щоразу, коли короткий код використовується на сторінці. Я бачив кілька інших підходів на цьому сайті, і wp codex навіть має два власні приклади, тому важко дізнатися, який підхід є найбільш послідовним і швидким.
Ось методи, про які я зараз знаю:
Спосіб 1: Включити безпосередньо в короткий код - Це те, що я зараз роблю в плагіні, але не здається гарним, оскільки він повторює код.
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' ) );
Спосіб 2: Використовуйте клас для додавання сценаріїв або стилів умовно
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();
Спосіб 3: Використання 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' );
Метод 4: Використання 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();
, що найкраще, тому що це гарантуватиме, що сценарії та стилі завантажуватимуться один раз, якщо вміст публікації має короткий код незалежно від багаторазового використання короткого коду. Хоча це може не працювати для використання коротких кодів у віджетах або на бічній панелі, проте не впевнений. Якщо це плагін, я б не рекомендував зв’язувати сценарії з коротким кодом, оскільки деякі можуть зателефонувати вашій функції замість короткого коду, щоб отримати потрібний вихід.