Jak poprawnie dodać Javascript w functions.php

11

Chciałbym usunąć kilka brzydko wyglądających strzałek, które są standardowe na przyciskach koszyka w WooCommerce. Aby to osiągnąć, znalazłem wskazówkę dotyczącą dodania następującego kodu, który powinien usunąć strzałki po załadowaniu dokumentu.

Zakładam, że zamierzam to umieścić w moich funkcjach. Php? Jak dokładnie miałbym to zrobić?

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

EDYTOWAĆ

W porządku. Próbowałem tego podejścia:

Utworzyłem plik o nazwie „removeArrows.js” i umieściłem go w folderze wtyczek. Ma taką samą treść jak oryginalny kod, z wyjątkiem jQuery zamiast $. Następnie dodałem następujące do 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' ); 

Nie mogę wymyślić, jak poprawnie wyświetlić kod. To nie zadziałało. Jakieś sugestie, aby to zadziałało?

Źródło jQuery Snippet

użytkownik2806026
źródło
To szalone: ​​nie możesz edytować strzałek w kodzie, który je generuje? (Czy jest pobierany z zewnętrznego źródła?) W każdym przypadku możesz wykonać obie zamiany w jednej funkcji, aby uniknąć dwukrotnego czytania i zapisywania całego HTML wewnątrz bloku koszyka. Nie znam sposobu, aby bezpośrednio wstrzyknąć to na stronę z functions.php, ale możesz zapisać go w osobnym pliku skryptu (jeśli go jeszcze nie masz, możesz go dodać), a następnie wp-enqueue-script. Musisz także zmienić $s na jQuery(patrz sekcja 7 strony)
Rup
Nie, jestem prawie pewien, że nie można go usunąć przed włożeniem. Jeśli to możliwe, nie byłem w stanie znaleźć sposobu, aby to zrobić. Warto dodać to w jednej funkcji. Czy tak by to wyglądało? $ (dokument) .ready (function () {$ (". woocommerce-cart"). html (function (i, val) {return val.replace ("→", ""); return val.replace ("← „,” „);});}); Zajrzę do skryptu kolejki. Wydaje się to trochę skomplikowane ... Dzięki!
user2806026
W porządku. Próbowałem tego podejścia; Utworzyłem plik o nazwie „removeArrows.js” i umieściłem go w folderze wtyczek. Ma taką samą treść jak oryginalny kod, z wyjątkiem jQuery zamiast $. następnie dodałem następujące do functions.php; `function wpb_adding_scripts () {wp_register_script ('my_amazing_script', plugins_url ('removeArrows.js', FILE ), tablica ('jquery'), '1.1', true); wp_enqueue_script ('my_amazing_script'); } add_action ('wp_enqueue_scripts', 'wpb_adding_scripts'); (Przepraszam, nie wiem, jak poprawnie wyświetlić kod) Nie działało. Czy możesz mi pomóc to naprawić?
user2806026
1
Proszę złożyć edytować i dodać wszystkie istotne informacje bezpośrednio do Twojego pytania Nie używaj sekcji komentarzy, aby dodać kod
Pieter Goosen

Odpowiedzi:

11

Twój $scrw swojej wp_register_script()funkcji jest źle. Biorąc pod uwagę, że twoja functions.php znajduje się we wtyczce, a plik removeArrows.js znajduje się w katalogu głównym wtyczki, $scrpowinieneś wyglądać tak:

plugins_url( '/removeArrows.js' , __FILE__ )

Innym ważnym punktem jest to, że zawsze dobrą praktyką jest ładowanie skryptów i stylów na końcu. Zapewni to, że nie zostaną zastąpione przez inne skrypty i style. Aby to zrobić, po prostu dodaj bardzo niski priorytet (bardzo wysoka liczba) do parametru priorytetu ( $priority) z add_action.

 add_action( 'wp_enqueue_scripts', 'wpb_adding_scripts', 999 ); 

I zawsze ładuj / kolejkuj skrypty i style za pomocą wp_enqueue_scriptshaka akcji, ponieważ jest to właściwy hak do użycia. Nie ładuj skryptów i stylów bezpośrednio do wp_headlubwp_footer

EDYTOWAĆ

W przypadku motywów, jak już wskazałeś, że wszystko przeniosłeś na swój motyw, $scrzmieniłbyś to na

 get_template_directory_uri() . '/removeArrows.js'

dla motywów nadrzędnych i tego

get_stylesheet_directory_uri() . '/removeArrows.js'

dla motywów potomnych. Twój pełny kod powinien wyglądać następująco

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 ); 
Pieter Goosen
źródło
Wielkie dzięki za wspaniałą radę. To wydaje się podejściem do użycia. Jedno pytanie; functions.php znajduje się w moim folderze motywów. Jak mam połączyć plik js, jeśli znajduje się on w tym samym folderze głównym motywu?
user2806026
Powinieneś trzymać wszystko we wtyczce lub w temacie, nie dziel ich. Jeśli jesteś w temacie, twój $scrbyłby get_template_directory_uri() . '/removeArrows.js'dla dominujących tematów, a get_templatestylesheet_directory_uri() . '/removeArrows.js'dla childthemes
Pieter Goosen
Próbowałem jeszcze raz, tym razem dodając removeArrows.js bezpośrednio w folderze motywów i wykorzystując następujące funkcje w functions.php; funkcja wpb_adding_scripts () {wp_register_script ('my_amazing_script', get_template_directory_uri (). '/ /removeArrows.js', FILE ), tablica ('jquery'), '1.1', true); wp_enqueue_script ('my_amazing_script'); } add_action ('wp_enqueue_scripts', 'wpb_adding_scripts', 999); to daje mi błąd analizy: błąd składni, nieoczekiwany „,” w wierszu wp_register_script.
user2806026
get_template_directory_uri() . '/removeArrows.js', FILE)powinien po prostu byćget_template_directory_uri() . '/removeArrows.js'
Pieter Goosen
Nie. Użyłem całkowicie edytowanego kodu na dole oryginalnego postu. Jedyne, co robi, to zamrożenie strony koszyka podczas przeglądania zawartości. Myślę, że się poddaję :-) Ale ostatnia deska ratunku; zacząłeś od wspomnienia, że ​​get_template_directory_uri () jest dla motywów nadrzędnych, a następnie w końcowym kompletnym kodzie, że jest dla motywów potomnych. Który to jest? Mój motyw jest nadrzędny :-)
user2806026
4

Nie dodawałbym innego zewnętrznego pliku js, jest to tylko dodatkowy i niepotrzebny zasób do pobrania, i to jest coś, co chcemy ograniczyć pod względem czasu ładowania strony.

Dodałbym ten fragment jQuery do twojej strony za pomocą wp_headhaka. Wkleisz następujące elementy w pliku funkcji motywu lub wtyczek. Upewniłem się również, że jQuery jest w trybie bez konfliktów, jak widać poniżej.

add_action('wp_head','woocommerce_js');

function woocommerce_js()
{ // break out of php ?>

jQuery(document).ready(function($) {
    $(".woocommerce-cart").html(function(i, val) {
    return val.replace(" →", "");
    });
    $(".woocommerce-cart").html(function(i, val) {
    return val.replace("← ", "");
    });
});
<?php } // break back into php

Po wykonaniu tej czynności i odświeżeniu strony sprawdź źródło strony, aby upewnić się, że ten fragment kodu jQuery jest faktycznie ładowany na twoją stronę. Jeśli tak, to powinno działać, chyba że jest to wyłączone w rzeczywistym fragmencie jQuery, którego używasz.

Matt Royal
źródło
Jednak to nie jest sposób WordPressa na ładowanie Javascript. Zobacz wp_enqueue_script()po więcej informacji.
Pat J
2
Cześć @PatJ, zgadzam się, za załadowanie zewnętrznej biblioteki JS lub pliku JS ze wszystkimi funkcjami Javascript, to tak, absolutnie tak będzie. Jeśli jednak ładujesz fragment kodu JavaScript, nie ma sensu tworzyć całego nowego pliku JS i dodawać w tym celu dodatkowe żądanie HTTP. Weźmy na przykład Google Analytics, w 99% kompozycji lub niestandardowych kompilacji JS zostanie dodany do nagłówka lub stopki za pomocą pliku opcji lub funkcji motywu. Powszechną praktyką jest stosowanie w ten sposób fragmentów kodu JS lub nawet CSS.
Matt Royal,
1
„Zwykła praktyka” nie poprawia tego. Stan wp_enqueue_script()dokumentów nawet Jest to zalecana metoda łączenia JavaScript ze stroną generowaną przez WordPress .
Pat J
Jeśli weźmiesz domyślny motyw dwudziestu czternastu WordPressa, ładuje html5.js do header.php. Udzielił łania w ten sposób z jakiegoś powodu, aby sprawdzić, czy przeglądarka spełnia warunek bycia IE <9, ale chodzi mi o to, co zrozumiałe, kolejkowanie jest zalecaną i preferowaną metodą, ale w zależności od wszystkich innych zmiennych / okoliczności otaczających to, co ty starają się to osiągnąć, nie zawsze jest to najbardziej praktyczne i uważam, że należy zachować dyskrecję. Słuchaj, mogę się całkowicie mylić w tym widoku, jestem zainteresowany usłyszeniem tego, co mają do powiedzenia niektórzy z naprawdę doświadczonych facetów :-)
Matt Royal
Dziękuję za twoją wspaniałą sugestię. Nie mogę go jednak uruchomić; jeśli dodam twój kod do znacznika <? php moich funkcji. php otrzymuję komunikat „Błąd analizy: błąd składni, nieoczekiwany” <”w pliku /somepath.../functions.php w wierszu 1146”. Jeśli dodam go poza <? Php, wydaje się, że echo podanego kodu na górze strony. Czego tu brakuje?
user2806026
0

Ponieważ odpowiedź została już zaakceptowana, chcę tylko powiedzieć, że istnieje inny sposób kolejkowania kodu javascript w stopce, który zrobiłem wiele razy.

w pliku 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' );

możesz załadować ten skrypt do konkretnego szablonu strony tylko przy użyciu warunku

if( is_page_template( 'page-template.php' ) ):

//put above code (or just add_action part) inside this condition to load file only if the condition is true 

endif;

jeśli page-template.php znajduje się w katalogu (powiedz katalog szablonów w katalogu głównym motywu), możesz napisać:

is_page_template( 'templates/page-template.php' );
politycznie niezależny
źródło
Nie polecałbym „wypiekania” JavaScript w stopce w ten sposób. Zapobiega to odłączeniu lub modyfikacji (przynajmniej łatwo), co jest niezwykle ważne w tworzeniu wtyczek i motywów. Jeśli jesteś użytkownikiem końcowym witryny i potrzebujesz szybkiego skryptu lub czegoś takiego, skorzystaj z niego - ale nawet wp_enqueue_script()prawie zawsze jest on ogólnie lepszy i bardziej elastyczny.
Xhynk
-1

Aby odpowiedzieć na pytanie, musimy najpierw rozróżnić javascript i JQuery.

Mówiąc to w prosty sposób:

  • JavaScript oparty jest na ECMAScript
  • JQuery to biblioteka dla Javascript

W rzeczywistości zadajesz dwa różne pytania:

  • Twój tytuł mówi o rozwiązaniu do implementacji javascript
  • Twoje pytanie dotyczy rozwiązania do wdrożenia JQuery

Ponieważ wyniki Google pokazują Twój tytuł, a cała zawartość strony mówi o JQuery, może to być bardzo frustrujące dla osób szukających rozwiązania javascript.

A teraz rozwiązanie JQuery:

wp_enqueue_script( 'script-id', get_template_directory_uri() . '/js/script.js', array ( 'jquery' ), 1.1, true);

I rozwiązanie javascript:

wp_enqueue_script( 'script-id', get_template_directory_uri() . '/js/script.js', array(), '1.0.0', true );

Ten kod można dodać do swoich funkcji. Php Lokalizacja skryptów w obu przypadkach to wp-content/themes/theme-name/js/script.js

Miłego kodowania!

Fred Heuvel
źródło
Mniej więcej w czasie, gdy OP publikował, devs używali zamiennie jquery i javascript. To wcale nie jest dokładne, ale tak popularna była jquery i ile brakowało javascript.
Rocky Kev