Apakah mungkin membuat tema cucu?

15

Jika saya menggunakan salah satu kerangka kerja populer seperti Genesis, apakah mungkin membuat tema cucu?

Sebagai contoh, saya ingin menggunakan Genesis sebagai tulang punggung semua situs saya. Kejadian disebut kerangka tetapi sebenarnya adalah tema orang tua.

Lalu saya memilih salah satu tema anak Genesis untuk dijual di StudioPress, dan ingin terus menyesuaikannya untuk setiap situs saya. Apakah saya akan membuat tema cucu untuk semua situs saya, dan bagaimana saya melakukannya?

urok93
sumber

Jawaban:

17

Iya dan tidak.

Anda dapat membuat tema anak yang menetapkan tema anak lain sebagai induknya, dan WordPress akan berusaha menggunakannya.

Namun

Anda akan mengalami masalah, belum lagi bahwa pengembang inti telah secara eksplisit menyatakan bahwa ini bukan perilaku yang diinginkan, dan mereka tidak akan melakukan upaya untuk mendukung tema cucu.

Misalnya, WP API membuat perbedaan antara stylesheet dan URL templat / direktori, di mana stylesheet selalu merujuk ke tema aktif, dan templat merujuk ke tema induk, tetapi jika tema kakek-nenek disertakan, apakah get_template_directory_urimerujuk orangtua atau kakek-nenek? Banyak panggilan API sekarang ambigu, dan orang yang berbeda akan mengharapkan perilaku yang berbeda, termasuk kode yang pada intinya. Anda juga perlu memuat yang functions.phpdari orang tua atau kakek-nenek, dan pastikan itu dilakukan dalam urutan yang benar.

Ini juga dianggap praktik yang sangat buruk. Jika Anda memiliki kebutuhan untuk tema cucu maka pendekatan Anda telah mengambil jalan yang salah, dan Anda perlu mundur dan mengevaluasi kembali hal-hal.

Saya akan menyarankan Anda menghindari konsep tema cucu, itu akan menyebabkan lebih banyak masalah. Alih-alih lebih banyak hooks filter tindakan dan modularitas dalam tema anak Anda harus memungkinkan Anda untuk menjaga komponen anak tema yang dibagikan tetap sama, dan membuat Anda bercabang / bercabang dengan sedikit kesulitan. Coba pindahkan elemen umum ke submodule eksternal / git svn.

Ada juga model _s di mana Anda memiliki tema anak Anda sebagai pangkalan, dan bercabang, alih-alih menjadikannya sebagai orang tua dengan maksud Anda mengerjakan salinannya, bukan sebagai anak / override.

Tom J Nowell
sumber
Jadi dalam kasus saya jika saya menggunakan Genesis saya hanya perlu memodifikasi tema anak secara langsung bukan? Tidak terlalu akrab dengan Git, tetapi akan tertarik pada pendekatan yang membantu saya menjaga tema anak asli tetap utuh.
urok93
Ya, Anda tidak memiliki banyak opsi di sini.
Tom J Nowell
Saya ingin tahu apa yang akan terjadi jika Anda mencoba membuat tema cucu yang hebat.
Chris_O
1
Anda menyebutkan bahwa metode telah salah belok jika Anda membutuhkan ini. Alasan saya ingin tahu tentang ini adalah karena skenario seperti menggunakan tema WooCommerce Storefront. Mereka menjual tema anak ke etalase mereka yang disesuaikan untuk berbagai hal. Jadi jika saya menggunakan salah satu tema anak mereka, tapi kemudian saya ingin membuat perubahan sendiri dengan cara yang tidak akan ditimpa ketika mereka memperbarui tema anak mereka ... bagaimana saya melakukannya?
Drew Angell
1
Saya tidak tahu, itulah batasan bagaimana tema etalase telah dibangun, pada saat itu Anda dipaksa untuk memotong tema anak
Tom J Nowell
3

Saya tidak sepenuhnya menguji metode yang dijelaskan di bawah ini, Maupun tema "cucu" yang normal, Tetapi memberikan fungsionalitas filter template_include :

    /*
    Plugin Name: Grandchild Themes
    Plugin URI: http://www.who-cares.com/
    Description: A concept for Grandchild themes Plugin
    Author: See Plugin URI
    Version: 0.0.0.0.1-Alpha
    */

    add_action('wp_head', 'grnd_chld_add_headers', 0);
    add_action('init', 'grnd_chld_add_css');

    // Load template if exists. 
function grandchild_template_include( $template ) {

    if ( file_exists( untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template ) ) )
        $template = untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template );

    return $template;
}

// This is the actual filter that we want .
add_filter( 'template_include', 'grandchild_template_include', 11 );

    function grnd_chld_add_headers () {
        wp_enqueue_style('my_grandchild_style');
    }

    function grnd_chld_add_css() {
        $stamp = @filemtime(plugin_dir_path(__FILE__).'/style.css'); // easy versioning
        wp_register_style ('my_grandchild_style', plugins_url('style.css', __FILE__).'', array(), $stamp);
    }

    // From here , what you got is like a normal functions.php.

Anda juga dapat, dengan cara yang serupa, mencoba filter yang lebih spesifik seperti misalnya archive_template

add_filter ('archive_template', create_function ('', 'return plugin_dir_path(__FILE__)."archive.php";'));

Semua yang dikatakan dan dilakukan, saya tidak yakin itu adalah cara terbaik untuk melakukan sesuatu.

krembo99
sumber