자식 테마에서 JavaScript 파일을 재정의하는 방법은 무엇입니까?


35

부모 테마에 JavaScript 파일을로드하고 있습니다. 부모 테마의 경로는 다음과 같습니다.

scripts > custom.js

자식 테마에서 동일한 경로 ( scripts > custom.js)를 만들고 custom.js파일 내부의 일부 jQuery를 변경 합니다.

문제는 변경 사항이 적용되지 않는다는 것입니다. 이것이 하위 테마에서 이러한 파일을 변경하는 잘못된 방법입니까?


1
부모 테마는 무엇입니까? 부모 테마 는 스크립트를 어떻게 호출 합니까?
칩 베넷

답변:


51

자식 테마는 get_template_part 또는 get_header 등과 같은 함수에 포함 된 PHP 파일 (예 : header.php) 만 재정의합니다.

WordPress에 스크립트를 추가하는 올바른 방법은 wp_enqueue_script 입니다. 부모 테마에서이를 사용하는 경우 wp_dequeue_script 를 사용 하고 자신의 를 작성하여 JS 파일을 대체 할 수 있습니다 .

이렇게 ...

<?php
// hook in late to make sure the parent theme's registration 
// has fired so you can undo it. Otherwise the parent will simply
// enqueue its script anyway.
add_action('wp_enqueue_scripts', 'wpse26822_script_fix', 100);
function wpse26822_script_fix()
{
    wp_dequeue_script('parent_theme_script_handle');
    wp_enqueue_script('child_theme_script_handle', get_stylesheet_directory_uri().'/scripts/yourjs.js', array('jquery'));
}

부모 테마가 wp_enqueue_script를 사용하지 않는 경우 아마도 wp_head (또는 wp_footer)에 연결하여 스크립트를 반향 할 수 있습니다. 따라서 remove_action 을 사용 하여 스크립트를 에코하는 기능을 제거하고 자신의 스크립트를 대기열에 넣습니다.

스크립트가 템플릿 파일에 하드 코딩 된 경우 스크립트 태그없이 하위 테마에서 해당 템플릿 파일을 교체하기 만하면됩니다.

그들이 사용 wp_enqueue_script 통화를 사용하는 경우 get_stylesheet_directory_uri을 , 당신은 아무것도 할 필요가 없습니다. 이런 일이 일어나지 않기 때문에 테마 제작자가 한 일을보고 싶을뿐입니다.


2
부모 테마가 get_stylesheet_directory_uri를 사용하여 스크립트를 대기열에 넣으면 자식 테마는 대기열에없는 모든 스크립트를 복제 해야 합니다. 그렇지 않으면 스크립트를 찾을 수 없기 때문입니다. get_stylesheet_directory_uri 에는 하위 테마에 개별 파일 이 있는지 확인 하고 필요한 경우 상위 테마 파일로 폴백하는 대체 메커니즘이 없습니다 .

Codex에서 :“wp_print_scripts를 사용하여 첫 페이지에 스타일이나 스크립트를 대기열에 넣지 마십시오. 대신 wp_enqueue_scripts를 사용하십시오. ” codex.wordpress.org/Plugin_API/Action_Reference/…
Christian Lescuyer

2 년 전에 작성된 시점을 명심하십시오. 이전 wp_enqueue_scripts에는 프런트 엔드에서 스크립트 만 대기열에 넣는 데 사용할 수있었습니다. 업데이트되었습니다. 오래된 것이 있으면 언제든지 편집하십시오.
chrisguitarguy

4
부모 테마가 대기열에 추가 된 후에 대기열에서 대기열이 해제되도록 우선 순위를 늦게 설정해야 할 수도 있습니다 (예 : 100) . add_action( 'wp_enqueue_scripts', 'wpse26822_script_fix', 100 ); 에서 codex.wordpress.org/Function_Reference/wp_dequeue_script
Spone

4
2016 업데이트 :에 따른 stackoverflow.com/questions/23507179/... 우리는 또한 사용이 wp_deregister_script('parent-script-handle');완전히 부모 스크립트를 제거 할 수 있습니다. 실제로, 그것이 없으면 저에게는 효과가 없었습니다. WP 4.6.1
PhiLho

1

경우에 따라 다음과 같이 add_action 및 wp_enqueue_script 함수 호출의 우선 순위를 지정해야합니다.

add_action('wp_enqueue_scripts', 'wpse26822_script_fix', 20120207);
function wpse26822_script_fix()
{
    wp_dequeue_script('storefront-navigation');
    wp_enqueue_script('my_storefront-navigation', get_stylesheet_directory_uri().'/js/navigation.min.js', array('jquery'),20151110,true);
}

이 경우 wp_enqueue_scripts가 우선 순위가 20120206 (날짜) 인 상위에 의해 호출되었으므로이 조치는 우선 순위가 거의 더해져 즉시 큐에서 제외됩니다. 그런 다음 뒤에 오는 대기열에있는 대기열은 실제로 이전 대기열이 대기열에 들어간 후에로드되도록하기 위해 우선 순위가 결정됩니다. 이 경우 부모 스크립트가 처음으로 대기열에 추가 된 바닥 글에 대기열에 포함되도록 지정하기 때문에이 경우에도 중요합니다.

또한 완전히 설명 할 수는 없지만 초기 스크립트를 대기열에 넣은 직후에 대기열에서 꺼내는 데주의를 기울이면 처음에로드되지 않도록 효과적으로 막을 수 있습니다.


1
이 함수 wp_enqueue_script에는 우선 순위 매개 변수가 없으며 경로 끝에 쿼리 ​​문자열로 연결된 버전 번호 일뿐입니다. 이 매개 변수는 캐싱 [...]에 관계없이 클라이언트에 올바른 버전이 전송되도록합니다.
Emile Bergeron

1

자신의 버전을 등록하기 전에 wp_deregister_script 를 호출 하십시오.


1
왜? 이것은 같은 핸들을 사용할 때만 필요합니다 – 필요하지 않은 것. 소스가 명확한 코드를 디버그하는 것이 더 쉽기 때문에 아마해서는 안됩니다.
fuxia

1
// enqueue your required script file
add_action('wp_enqueue_scripts', 'your_child_theme_js_file_override');
function your_child_theme_js_file_override(){
    wp_enqueue_script( 'child_theme_script_handle', get_stylesheet_directory_uri() . '/assets/js/your-file.js', array('jquery' ) );
}

// dequeue your required script file
function your_child_theme_js_file_dequeue() {
   wp_dequeue_script( 'parent_theme_script_handle' );
}
add_action( 'wp_print_scripts', 'your_child_theme_js_file_dequeue', 100 );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.