Йоу-йоу! С некоторого времени я занимаюсь разработкой сайта для общественной организации защиты животных. Недавно я отослал свой плагин на валидацию и мне прислали ошибку. Суть заключалась в том, что для вставки инлайнового скрипта я использовал примерно такой код:
add_action('wp_footer', 'my_print_script'); function my_print_script(){ ?> <script> /* Код скрипта */ </script> <?php }
Однако этот код поддержка wordpress’а не одобрила и сказала, чтобы я использовалwp_add_inline_script().
Функция печатает скрипт после какого-то определённого другого скрипта, который был подключен через wp_enqueue_script(). Когда вы используете wp_enqueue_script(), то первым параметром передаёте уникальный идентификатор (handler). В wp_add_inline_script() вы первым параметром вводите handler того скрипта после (или перед) которого вы хотите, чтобы был напечатан ваш инлайновый скрипт. Например, в статье про построение fancybox-галереи я печатал свой скрипт прямо в html после вывода блоков. Ценой такого исполнения было то, что я оборачивал весь код в window.onload. Код выглядел вот так:
wp_enqueue_script( 'application', get_template_directory_uri() . '/js/app.js', array('gjQuery', 'fancybox'), '0.1.0', true ); add_action('x_gallery', 'x_gallery'); function x_gallery(){ $argm = [ 'post_type'=>'fgb_fs_gallery', 'orderby'=>'date', 'order'=>'ASC' ]; $query = new WP_query($argm); // Сюда в цикле собираем данные о картинках прикреплённых к записям $arr_x = []; $home_url = get_home_url(); while ( $query->have_posts() ) : $query->the_post(); $postID = get_the_ID(); // Для фансибокса $needPostMetaValue = get_post_meta($postID, '_x_id', true); // Кладём в ассоциативнй массив данные о картинках $arr_x[$needPostMetaValue] = get_post_images(); ?> <!-- Вёрстка блока который мы выведем --> <!-- data-x-fancy селектор для fancybox --> <div> <a data-x-fancy="<?php echo $needPostMetaValue; ?>" data-src="<?php echo get_the_post_thumbnail_url($postID, 'full');?>" href="javascript:;"> <?php echo get_the_post_thumbnail($postID, 'x_face', ['class'=>'w-100']);?> </a> </div> <?php endwhile; // Сюда получаем будем собирать ссылки на картинки $images = []; foreach ($arr_x as $gallery=>$arr){ foreach ($arr as $item){ $el = wp_get_attachment_image_src( $item['id'], 'full'); $images[$gallery][] = $el[0]; } } ?> <!-- Печатаем скрипт с вызовам js части --> <script> window.addEventListener('load', function () { <?php foreach ($images as $key=>$value): ?> var <?php echo $key; ?> = new XSLICK({ galleryId: '<?php echo $key; ?>', images: [ <?php foreach ($value as $item): ?> <?php echo '"' . $item . '",' . PHP_EOL ?> <?php endforeach; ?> ] }, $); <?php endforeach; ?> }); </script> <?php }
Сейчас бы код был примерно таким
wp_enqueue_script( 'application', get_template_directory_uri() . '/js/app.js', array('gjQuery', 'fancybox'), '0.1.0', true ); add_action('x_gallery', 'x_gallery'); function x_gallery(){ $argm = [ 'post_type'=>'fgb_fs_gallery', 'orderby'=>'date', 'order'=>'ASC' ]; $query = new WP_query($argm); // Сюда в цикле собираем данные о картинках прикреплённых к записям $arr_x = []; $home_url = get_home_url(); while ( $query->have_posts() ) : $query->the_post(); $postID = get_the_ID(); // Для фансибокса $needPostMetaValue = get_post_meta($postID, '_x_id', true); // Кладём в ассоциативнй массив данные о картинках $arr_x[$needPostMetaValue] = get_post_images(); ?> <!-- Вёрстка блока который мы выведем --> <!-- data-x-fancy селектор для fancybox --> <div> <a data-x-fancy="<?php echo $needPostMetaValue; ?>" data-src="<?php echo get_the_post_thumbnail_url($postID, 'full');?>" href="javascript:;"> <?php echo get_the_post_thumbnail($postID, 'x_face', ['class'=>'w-100']);?> </a> </div> <?php endwhile; // Сюда получаем будем собирать ссылки на картинки $images = []; foreach ($arr_x as $gallery=>$arr){ foreach ($arr as $item){ $el = wp_get_attachment_image_src( $item['id'], 'full'); $images[$gallery][] = $el[0]; } } ob_start(); // Использую для сохранения строки ?> <?php foreach ($images as $key=>$value): ?> var <?php echo $key; ?> = new XSLICK({ galleryId: '<?php echo $key; ?>', images: [ <?php foreach ($value as $item): ?> <?php echo '"' . $item . '",' . PHP_EOL ?> <?php endforeach; ?> ] }, $); <?php endforeach; ?> <?php $output = ob_get_contents(); ob_end_clean(); wp_add_inline_script('application', $output, 'after' ); }
Самое главное, что я точно знаю, мой скрипт будет загружен после того, где лежит код, который я инициализирую. Тоже самое вы можете сделать, например, с fancybox, slick-slider, datatable, stickjaw и любые скрипты, которые зависят от jQuery (иногда это большая боль).
wp_add_inline_script() может подключатся не только после скрипта, но и перед. Для этого нужно прописать параметр $position. Вообще wp_add_inline_script() имеет 3 параметра:
То есть у $position имеются два варианта: before и after (по умолчанию). Если before — скрипт подключится до, если after — после. Это будет полезно если вам, например, нужно объявить глобальные переменные или по каким-то причинам прервать скрипт, который должен выполняться ниже или создать промис или создать элемент.
В дополнение к этой статье прочитайте о том, как правильно подключать скрипты в wordpress. Это вам поможет избегать ошибок и загрузки лишних скриптов на странице. Призываю вас использовать инструменты для разработчика на моём сайте, например, Экранировать html.