Как правильно добавить Javascript в functions.php

25 июн. 2014 г., 21:30:03
Просмотры: 148K
Голосов: 17

Я хочу удалить некрасивые стрелки, которые по умолчанию отображаются на кнопках корзины в 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' ); 

Я не могу понять, как правильно заставить код работать. Этот вариант не сработал. Есть ли предложения, как это исправить?

Исходный код jQuery

4
Комментарии

Это безумие: разве нельзя отредактировать стрелки в коде, который их генерирует? (Или они загружаются из внешнего источника?) В любом случае, вы можете выполнить обе замены в одной функции, чтобы избежать двойного чтения и записи всего HTML внутри блока корзины. Я не знаю способа напрямую вставить это в страницу из functions.php, но вы можете сохранить это в отдельном файле скрипта (если у вас его еще нет, можно добавить) и затем wp-enqueue-script его. Вам также придется заменить $ на jQuery (см. раздел 7 на той странице)

Rup Rup
25 июн. 2014 г. 21:46:08

Нет, я почти уверен, что их нельзя удалить до вставки. Если это возможно, я не смог найти способа это сделать.

Хорошее замечание насчет добавления в одной функции. Это будет выглядеть так?

$(document).ready(function() {
    $(".woocommerce-cart").html(function(i, val) {
    return val.replace(" →", "");
    return val.replace("← ", "");
    });
});

Я посмотрю enqueue script. Хотя кажется немного сложным.. Спасибо!

user2806026 user2806026
25 июн. 2014 г. 23:18:30

Хорошо. Я попробовал такой подход;

Создал файл с именем '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' );

(Извините, не могу понять, как правильно отобразить код)

Это не сработало. Можете помочь исправить?

user2806026 user2806026
25 июн. 2014 г. 23:32:34

Пожалуйста, создайте [правку] и добавьте всю соответствующую информацию непосредственно в ваш вопрос. Не используйте раздел комментариев для добавления кода

Pieter Goosen Pieter Goosen
26 июн. 2014 г. 14:52:08
Все ответы на вопрос 4
6
13

Ваш параметр $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 ); 
26 июн. 2014 г. 15:47:32
Комментарии

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

user2806026 user2806026
26 июн. 2014 г. 17:41:22

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

Pieter Goosen Pieter Goosen
26 июн. 2014 г. 17:44:46

Попробовал снова, на этот раз добавил 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.

user2806026 user2806026
26 июн. 2014 г. 18:07:51

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

Pieter Goosen Pieter Goosen
26 июн. 2014 г. 18:10:41

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

user2806026 user2806026
27 июн. 2014 г. 15:41:57

Извините, допустил ошибку при копировании и вставке. Последний полный код предназначен для родительской темы. Если это не работает, вам нужно проверить ваш скрипт

Pieter Goosen Pieter Goosen
27 июн. 2014 г. 16:31:59
Показать остальные 1 комментариев
7

Я бы не стал добавлять ещё один внешний 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-коде.

26 июн. 2014 г. 00:06:15
Комментарии

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

Pat J Pat J
26 июн. 2014 г. 00:24:23

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

Matt Royal Matt Royal
26 июн. 2014 г. 00:33:11

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

Pat J Pat J
26 июн. 2014 г. 03:04:37

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

Matt Royal Matt Royal
26 июн. 2014 г. 09:30:07

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

user2806026 user2806026
26 июн. 2014 г. 13:23:52

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

Matt Royal Matt Royal
26 июн. 2014 г. 14:38:00

Этот JS-код нужно обернуть в <script></script>. Такой способ вставки JS в WP не рекомендуется, но в некоторых случаях быстрое решение важнее лучших практик.

Tahi Reu Tahi Reu
9 янв. 2020 г. 16:13:14
Показать остальные 2 комментариев
1

Поскольку ответ уже принят, я просто хочу сказать, что есть еще один способ подключения 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' );
24 авг. 2018 г. 17:31:38
Комментарии

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

Xhynk Xhynk
24 авг. 2018 г. 19:33:34
1
-1

Чтобы ответить на вопрос, сначала необходимо разграничить понятия 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

Удачного кодинга!

24 авг. 2018 г. 14:24:26
Комментарии

В то время, когда автор написал пост, разработчики действительно использовали jQuery и JavaScript как взаимозаменяемые понятия. Это не совсем точно, но такова была популярность jQuery и отсутствие многих функций в JavaScript.

Rocky Kev Rocky Kev
29 апр. 2020 г. 19:01:00