Как правильно добавить Javascript в functions.php
Я хочу удалить некрасивые стрелки, которые по умолчанию отображаются на кнопках корзины в WooCommerce. Для этого я нашел совет добавить следующий код, который должен удалить стрелки после загрузки документа.
Полагаю, что мне нужно добавить это в functions.php? Как именно это сделать?
$(document).ready(function() {
$(".woocommerce-cart").html(function(i, val) {
return val.replace(" →", "");
});
$(".woocommerce-cart").html(function(i, val) {
return val.replace("← ", "");
});
});
РЕДАКТИРОВАНО
Хорошо. Я попробовал следующий подход:
Создал файл с названием 'removeArrows.js' и поместил его в папку плагина. В нем тот же код, что и оригинальный, только вместо $ используется jQuery. Затем я добавил следующее в functions.php:
function wpb_adding_scripts() {
wp_register_script('my_amazing_script', plugins_url('removeArrows.js', __FILE__), array('jquery'),'1.1', true);
wp_enqueue_script('my_amazing_script');
}
add_action( 'wp_enqueue_scripts', 'wpb_adding_scripts' );
Я не могу понять, как правильно заставить код работать. Этот вариант не сработал. Есть ли предложения, как это исправить?

Ваш параметр $scr
в функции wp_register_script()
указан неверно. Учитывая, что ваш файл functions.php находится внутри плагина, а файл removeArrows.js расположен в корне плагина, параметр $scr
должен выглядеть так:
plugins_url( '/removeArrows.js' , __FILE__ )
Ещё один важный момент — всегда рекомендуется загружать скрипты и стили последними. Это гарантирует, что они не будут переопределены другими скриптами и стилями. Для этого просто укажите очень низкий приоритет (очень большое число) в параметре $priority
функции add_action
.
add_action( 'wp_enqueue_scripts', 'wpb_adding_scripts', 999 );
И всегда подключайте скрипты и стили через хук wp_enqueue_scripts
, так как это правильный способ. Не загружайте скрипты и стили напрямую в wp_head
или wp_footer
.
ОБНОВЛЕНИЕ
Для тем (как вы указали, что перенесли всё в свою тему), ваш параметр $scr
изменится на:
get_template_directory_uri() . '/removeArrows.js'
для родительских тем и на:
get_stylesheet_directory_uri() . '/removeArrows.js'
для дочерних тем. Полный код должен выглядеть так:
function wpb_adding_scripts() {
wp_register_script('my_amazing_script', get_template_directory_uri() . '/removeArrows.js', array('jquery'),'1.1', true);
wp_enqueue_script('my_amazing_script');
}
add_action( 'wp_enqueue_scripts', 'wpb_adding_scripts', 999 );

Большое спасибо за отличный совет. Похоже, это правильный подход. Один вопрос: functions.php находится в папке моей темы. Как мне подключить js-файл, если он просто находится в корневой папке темы?

Вам следует хранить все либо в плагине, либо в теме, не разделяя их. Если вы работаете в теме, ваш $scr
будет get_template_directory_uri() . '/removeArrows.js'
для родительских тем и get_stylesheet_directory_uri() . '/removeArrows.js'
для дочерних тем.

Попробовал снова, на этот раз добавил removeArrows.js прямо в папку темы и использовал следующий код в functions.php: function wpb_adding_scripts() { wp_register_script('my_amazing_script', get_template_directory_uri() . '/removeArrows.js', FILE), array('jquery'),'1.1', true); wp_enqueue_script('my_amazing_script'); }
add_action( 'wp_enqueue_scripts', 'wpb_adding_scripts', 999 );
Это вызывает ошибку Parse error: syntax error, unexpected ',' в строке с wp_register_script.

get_template_directory_uri() . '/removeArrows.js', FILE)
следует заменить на get_template_directory_uri() . '/removeArrows.js'

Нет. Использовал ваш полный код, который вы отредактировали в конце оригинального сообщения. Единственное, что он делает - это замораживает страницу корзины при просмотре содержимого. Думаю, я просто сдаюсь :-) Последняя попытка: вы начали с упоминания, что get_template_directory_uri() предназначена для родительских тем, а затем в финальном полном коде сказали, что она для дочерних тем. Так для чего же? Моя тема родительская :-)

Я бы не стал добавлять ещё один внешний JS-файл, это просто дополнительный и ненужный ресурс для загрузки, а мы как раз хотим сократить время загрузки страницы.
Я бы добавил этот jQuery-код в head вашего сайта, используя хук wp_head
. Вставьте следующий код в functions.php вашей темы или плагина. Я также убедился, что jQuery используется в no-conflict режиме, как вы можете видеть ниже.
add_action('wp_head','woocommerce_js');
function woocommerce_js()
{ // выход из php ?>
<script>
jQuery(document).ready(function($) {
$(".woocommerce-cart").html(function(i, val) {
return val.replace(" →", "");
});
$(".woocommerce-cart").html(function(i, val) {
return val.replace("← ", "");
});
});
</script>
<?php } // возврат в php
После того как вы это сделаете и обновите страницу, проверьте исходный код страницы, чтобы убедиться, что этот jQuery-код действительно загружается на вашу страницу. Если это так, то он должен работать, если только нет какой-то ошибки в самом используемом jQuery-коде.

Однако это не рекомендуемый в WordPress способ загрузки JavaScript. Подробнее см. wp_enqueue_script()
.

Привет @PatJ, согласен, для загрузки внешней JS-библиотеки или JS-файла со всеми функциями JavaScript — да, это абсолютно правильный подход. Однако если вы загружаете небольшой фрагмент JavaScript, нет смысла создавать целый новый JS-файл и добавлять дополнительный HTTP-запрос только для этого. Возьмем, к примеру, Google Analytics — в 99% тем или кастомных сборок этот JS будет добавлен в header или footer через настройки темы или файл functions. Это распространенная практика — включать фрагменты JS или даже CSS таким образом.

"Распространенная практика" не означает, что это правильно. В wp_enqueue_script()
документации даже указано: Это рекомендуемый метод подключения JavaScript к странице, сгенерированной WordPress.

Если взять стандартную тему WordPress twentyfourteen, она загружает html5.js в header.php. Конечно, это сделано по причине проверки, соответствует ли браузер условию IE < 9, но суть в том, что хотя регистрация в очереди (enqueuing) является рекомендуемым и предпочтительным методом, в зависимости от других переменных/обстоятельств того, чего вы пытаетесь достичь, это не всегда может быть самым практичным решением, и я думаю, что следует использовать некоторую гибкость. Возможно, я полностью ошибаюсь в этом мнении, и мне интересно услышать, что скажут действительно опытные разработчики :-)

Спасибо за ваше отличное предложение. Однако у меня не получается заставить это работать: если я добавлю ваш код внутри тега <?php в моем functions.php, я получаю ошибку 'Parse error: syntax error, unexpected '<' in /somepath.../functions.php on line 1146'. Если я добавлю его вне <?php, он просто выводит данный код в верхней части страницы. Что я упускаю?

Когда вы вставляете код в файл functions.php - удалите первый <?php
из предоставленного мной кода, так как у вас уже есть открывающий тег <?php
на первой строке вашего файла functions.php. Я отредактировал свой исходный ответ и также удалил его оттуда.

Поскольку ответ уже принят, я просто хочу сказать, что есть еще один способ подключения JavaScript-кода в подвале, который я использовал много раз.
В файле functions.php:
function load_script_to_remove_arrow(){
?>
<script>
$(document).ready(function() {
$(".woocommerce-cart").html(function(i, val) {
return val.replace(" →", "");
});
$(".woocommerce-cart").html(function(i, val) {
return val.replace("← ", "");
});
});
</script>
<?php
}
add_action( 'wp_footer', 'load_script_to_remove_arrow' );
Вы можете загружать этот скрипт только для определенного шаблона страницы, используя условие:
if( is_page_template( 'page-template.php' ) ):
//поместите приведенный выше код (или только часть add_action) внутрь этого условия, чтобы загружать файл только при выполнении условия
endif;
Если файл page-template.php находится в каталоге (например, в каталоге templates в корневой директории вашей темы), можно написать так:
is_page_template( 'templates/page-template.php' );

Я бы не рекомендовал "встраивать" JavaScript в подвал таким образом. Это делает его неотключаемым и немодифицируемым (по крайней мере, легко), что крайне важно при разработке плагинов и тем. Если вы конечный пользователь сайта и вам нужен быстрый скрипт или что-то подобное — можно использовать этот метод, но даже в этом случае wp_enqueue_script()
почти всегда является более универсальным, гибким и предпочтительным вариантом.

Чтобы ответить на вопрос, сначала необходимо разграничить понятия JavaScript и jQuery.
Простыми словами:
- JavaScript основан на ECMAScript
- jQuery — это библиотека для JavaScript
Фактически вы задаёте два разных вопроса:
- Заголовок говорит о решении для реализации JavaScript
- Вопрос касается решения для реализации jQuery
Поскольку в результатах Google отображается ваш заголовок, а весь контент страницы говорит о jQuery, это может сильно разочаровать людей, ищущих решение для JavaScript.
Теперь решение для jQuery:
wp_enqueue_script( 'script-id', get_template_directory_uri() . '/js/script.js', array ( 'jquery' ), 1.1, true);
И решение для JavaScript:
wp_enqueue_script( 'script-id', get_template_directory_uri() . '/js/script.js', array(), '1.0.0', true );
Этот код можно добавить в ваш файл functions.php
В обоих случаях скрипты должны находиться по пути wp-content/themes/название-темы/js/script.js
Удачного кодинга!
