Làm cách nào để ghi đè tệp JavaScript trong chủ đề con?


35

Tôi đang tải một số tệp JavaScript trong chủ đề chính. Đường dẫn trong chủ đề chính là:

scripts > custom.js

Trong chủ đề con, tôi đang tạo cùng một đường dẫn ( scripts > custom.js) và thay đổi một số jQuery bên trong custom.jstệp.

Vấn đề là những thay đổi không được áp dụng. Đây có phải là cách sai để thay đổi các tệp này trong chủ đề con không?


1
Chủ đề phụ huynh là gì? Làm thế nào các kịch bản được gọi bởi chủ đề mẹ?
Chip Bennett

Câu trả lời:


51

Các chủ đề con chỉ ghi đè các tệp php (như header.php) được bao gồm với các hàm như get_template_part hoặc get_header, v.v.

Cách chính xác để thêm tập lệnh vào WordPress là với wp_enqueue_script . Nếu chủ đề gốc của bạn sử dụng điều này, bạn có thể ghi đè các tệp JS bằng cách sử dụng wp_dequeue_script hoặc chính bạn.

Giống như vậy ...

<?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'));
}

Nếu chủ đề gốc không sử dụng wp_enqueue_script, thì có lẽ nó đang nối vào wp_head (hoặc wp_footer) để lặp lại các tập lệnh ở đó. Vì vậy, bạn sẽ sử dụng remove_action để loại bỏ các hàm đó lặp lại các tập lệnh, và sau đó ghi lại tập lệnh của riêng bạn.

Nếu tập lệnh được mã hóa cứng vào tệp mẫu, bạn sẽ chỉ cần thay thế tệp mẫu đó trong chủ đề con của mình mà không có thẻ tập lệnh.

Nếu họ đã sử dụng các cuộc gọi wp_enqueue_script sử dụng get_stylesheet_directory_uri , thì bạn không cần phải làm gì cả. Vì điều này không xảy ra, bạn sẽ phải chọc ngoáy và xem tác giả chủ đề đã làm gì.


2
nếu chủ đề gốc sử dụng get_stylesheet_directory_uri để liệt kê các tập lệnh, thì chủ đề con sẽ phải sao chép tất cả các tập lệnh do đó bị mê hoặc, vì nếu không chúng sẽ không được tìm thấy. Không có cơ chế dự phòng trong get_stylesheet_directory_uri để kiểm tra xem một tệp riêng lẻ có tồn tại trong chủ đề con hay không và quay lại tệp của chủ đề gốc nếu cần.

Từ Codex: không nên sử dụng wp_print_scripts để liệt kê các kiểu hoặc tập lệnh trên trang đầu. Sử dụng wp_enqueue_scripts thay thế. ” Codex.wordpress.org/Plugin_API/Action_Reference/...
Christian Lescuyer

Hãy ghi nhớ khi điều này được viết: hai năm trước. Trước đây wp_enqueue_scriptscó thể được sử dụng để chỉ enqueue script ở mặt trước. Cập nhật. Nếu bạn thấy một cái gì đó lỗi thời, hãy chỉnh sửa.
chrisguitarguy

4
Xin lưu ý rằng bạn có thể phải đặt mức độ ưu tiên muộn (ví dụ 100) để đảm bảo dequeue của bạn xảy ra sau khi đăng ký chủ đề chính. add_action( 'wp_enqueue_scripts', 'wpse26822_script_fix', 100 ); từ codex.wordpress.org/Function_Reference/wp_dequeue_script
Đã diễn ra vào

4
Cập nhật cho năm 2016: theo stackoverflow.com/questions/23507179/, chúng tôi cũng phải sử dụng wp_deregister_script('parent-script-handle');để xóa hoàn toàn tập lệnh gốc. Thật vậy, nó đã không làm việc cho tôi mà không có nó. WP 4.6.1
PhiLho

1

Trong một số trường hợp, điều quan trọng là phải ưu tiên cả hàm add_action và hàm wp_enqueue_script như vậy:

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);
}

Trong trường hợp này, wp_enqueue_scripts được gọi bởi phụ huynh với mức độ ưu tiên là 20120206 (ngày) và vì vậy hành động này được thêm vào với mức độ ưu tiên chỉ lớn hơn một chút để nó sẽ ngay lập tức bị loại bỏ. Sau đó, tuyên bố enqueue tiếp theo sau đó thực sự được ưu tiên sau đó để đảm bảo rằng nó tải sau khi cái cũ bị mất. Sự thật, trong trường hợp này cũng rất quan trọng bởi vì điều đó xác định rằng nó sẽ được ghi chú trong phần chân trang, đó là nơi kịch bản gốc được liệt kê đầu tiên.

Ngoài ra, tôi hoàn toàn không thể giải thích nó hoàn toàn, nhưng tôi nhận thấy rằng nếu bạn cẩn thận với việc loại bỏ tập lệnh ban đầu ngay sau khi nó được xử lý, có vẻ như bạn có thể ngăn chặn nó tải ngay từ đầu.


1
Hàm wp_enqueue_scriptkhông có tham số ưu tiên, nó chỉ là số phiên bản được nối với cuối đường dẫn dưới dạng chuỗi truy vấn. Tham số này được sử dụng để đảm bảo rằng phiên bản chính xác được gửi đến máy khách bất kể bộ nhớ đệm [...]
Emile Bergeron

1

gọi wp_deregister_script trước khi đăng ký phiên bản của riêng bạn


1
Tại sao? Điều này chỉ cần thiết khi bạn đang sử dụng cùng một tay cầm - điều mà bạn không phải làm. Bạn thậm chí có thể không nên, bởi vì dễ dàng hơn để gỡ lỗi mã có nguồn rõ ràng.
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 );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.