Làm cách nào để làm cho chủ đề con tôi áp dụng lại các cài đặt đã được tùy chỉnh khi cha mẹ của nó hoạt động?


17

Kịch bản

  1. Chọn chủ đề 2015. Tùy chỉnh các cài đặt khác nhau, chẳng hạn như ảnh nền, ảnh tiêu đề, tên trang web và khẩu hiệu.
  2. Nhưng đừng chạm vào nội dung của bất kỳ tệp nào của chủ đề.
  3. Sử dụng Chủ đề con của Codex để tạo chủ đề con tối thiểu của chủ đề năm 2015.
  4. Kích hoạt chủ đề con mới.

Giáo sư?

Trang web có chủ đề con tối thiểu trần này được kích hoạt trông hoàn toàn khác với chủ đề gốc. Hình nền và hình ảnh tiêu đề đã biến mất và tất cả các cách của tiện ích thanh bên (hoặc tiêu đề) đã được kích hoạt không hoạt động (theo mặc định) trong chủ đề gốc 2015.

Giao diện ban đầu của trang web chỉ với một vài cài đặt tùy chỉnh cho chủ đề năm 2015:

SofietjeWonders với chủ đề 2015 tùy chỉnh

Trang web trông giống với chủ đề con xuất phát từ chủ đề năm 2015, chỉ có tiêu đề bắt buộc trong style.cssvà chỉ liệt kê các kiểu theo đề xuất của trang Chủ đề trẻ em của Codex function.php.

nhập mô tả hình ảnh ở đây

Câu hỏi

Làm cách nào để tôi kích hoạt chủ đề con giữ các tùy chỉnh và mặc định của chủ đề gốc?

Trong trường hợp này: hình ảnh tiêu đề và hình nền và loại bỏ (hủy kích hoạt?) Của các widget (thanh bên / tiêu đề) mặc định.


Ghi chú

Tạo một chủ đề con của một chủ đề đã được tùy chỉnh nặng có thể nghe giống như một bản sao, nhưng đó là về các tùy chỉnh bằng cách chỉnh sửa các tệp của chủ đề.

Câu hỏi này Khi kích hoạt một chủ đề con, cài đặt cốt lõi nào phải được đặt lại tức là; Menu tùy chỉnh vv? dường như hỏi chính xác những gì tôi dường như sau. Thật không may, câu trả lời duy nhất suy đoán về sự không phù hợp trong các tính năng, đó không phải là trường hợp của tôi và đã không nhận xét về nhận xét của OP có cùng tác dụng.

Tôi cũng nhìn

Câu trả lời:


9

Tôi đã đưa ra +1 cho câu trả lời của @ webtoure vì nó cho bạn đúng hướng, tuy nhiên tôi nghĩ rằng nó thiếu một số kiểm tra.

Trước hết, nó không kiểm tra xem chủ đề đang được kích hoạt có phải là chủ đề con hay không và không kiểm tra xem chủ đề đang hoạt động trước đó có phải là chủ đề chính của chủ đề con đang được kích hoạt hay không.

Theo hiểu biết của tôi về OP những điều kiện này là bắt buộc.

Hơn nữa, một vấn đề mà bạn cần tính đến là phải làm gì với các mod chủ đề của chủ đề con đang được kích hoạt, nếu chúng đã tồn tại.

Trong câu trả lời @webtoure, chúng được lưu trữ trong bản sao lưu, điều này có thể giúp bạn tiết kiệm trong một số trường hợp, nhưng WordPress sẽ không nhận ra chúng theo mặc định và vì vậy chúng yêu cầu một số mã bổ sung được sử dụng.

Tôi nghĩ sẽ tốt hơn nếu kế thừa các sửa đổi chủ đề từ chủ đề gốc chỉ lần đầu tiên một chủ đề con được kích hoạt.

Nói tóm lại, các điều kiện tôi muốn kiểm tra trước để kế thừa các mod chủ đề từ chủ đề gốc là:

  • chủ đề hoạt động trước đó phải là phụ huynh của chủ đề con đang được kích hoạt
  • chủ đề con đang được kích hoạt phải chưa bao giờ được kích hoạt trước đó

Để đảm bảo điều kiện thứ hai tôi sẽ sử dụng tùy chọn tùy chỉnh, vì WordPress không cung cấp cách thực hiện kiểm tra này.

Đây là mã, vui lòng đọc các bình luận nội tuyến để giải thích về những gì đang diễn ra:

add_action( 'switch_theme', function( $new_name, \WP_Theme $new_theme ) {

    // get the previously active theme
    $previous = get_option( 'theme_switched', -1 );

    // get the parent of current theme, will be false if no parent
    $parent = $new_theme->parent() ? $new_theme->get_template() : false;

    // current stylesheet name
    $stylesheet = get_option( 'stylesheet' );

    // has the theme being activated ever been activated before?
    $lastActive = get_option( $stylesheet . '_last_active', false );

    // if previouly active theme is the parent of the the child theme being activated
    // and it has never been activated before..
    if ( ! $lastActive && $parent === $previous ) {

        // update "last_active" option so following code won't run again for this theme
        update_option( $stylesheet . '_last_active', current_time( 'timestamp', 1 ) );

        // get the theme mods of the parent
        $previousMods = get_option( 'theme_mods_' . $parent, array() );

        // inherit current theme mods from parent theme mods
        update_option( 'theme_mods_' . $stylesheet, $previousMods );
    }

}, 10, 2 );

Điểm quan tâm đầu tiên của bạn không thực sự hợp lý: nếu chủ đề hiện tại không phải là chủ đề con thì get_templatesẽ chỉ trả về tên thư mục của chủ đề hiện tại. Bạn không cần biết mối quan hệ giữa chủ đề đang hoạt động trước đó và chủ đề hiện tại: nếu chủ đề có phụ huynh, nó sẽ tải các cài đặt đó nếu không nó chỉ tải các cài đặt của chính nó. Tôi đồng ý với điểm thứ hai của bạn trong đó giải quyết vấn đề cài đặt bị ghi đè.
webtoure

Hơn nữa, nếu người dùng vô tình kích hoạt một chủ đề khác trước khi kích hoạt chủ đề con mong muốn thì sao? Mã sẽ không hoạt động và mối quan hệ ( theme_switched, current_theme) không liên quan để bắt đầu.
webtoure

1
@MarjanVenema Tôi sẽ rất vui nếu bạn tặng tiền thưởng cho webtoure .
gmazzap

1
@MarjanVenema gmazzap thực sự đã cung cấp ý kiến ​​cho quá trình suy nghĩ của anh ấy và cũng đề nghị một sự điều chỉnh cho đoạn trích của tôi. Tôi nghĩ rằng nếu có ai xứng đáng nhận tiền thưởng, thì đó là anh ta. Ngoài ra, tôi không trả lời các câu hỏi cho các điểm hoàn toàn vô dụng. Tôi thích: tương tác với mọi người, thử thách và thường giúp đỡ khi tôi có thể.
webtoure

1
Vui lòng thảo luận mở rộng để trò chuyện, ý kiến ​​không dành cho họ. :)
Rarst
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.