Czy można tworzyć motywy dla wnuków?

15

Jeśli korzystam z jednego z popularnych frameworków, takich jak Genesis, czy mogę tworzyć motywy wnuka?

Jako przykład chcę użyć Genesis jako kręgosłupa wszystkich moich stron. Genesis nazywa się ramą, ale w rzeczywistości jest tematem nadrzędnym.

Następnie wybieram jeden z potomnych motywów Genesis na sprzedaż w StudioPress i chcę nadal dostosowywać go do każdej z moich stron. Czy będę tworzyć motyw wnuczka dla wszystkich moich witryn i jak sobie z tym poradzić?

urok93
źródło

Odpowiedzi:

18

Tak i nie.

Możesz utworzyć motyw podrzędny, określając inny motyw podrzędny jako nadrzędny, a WordPress spróbuje go użyć.

jednak

Wpadniesz na problemy, nie wspominając o tym, że rdzeniowcy wyraźnie stwierdzili, że nie jest to pożądane zachowanie i nie będą starali się wspierać motywów wnuczka.

Na przykład WP API rozróżnia arkusz stylów i adresy URL / katalogi szablonów, gdzie arkusz stylów zawsze odnosi się do aktywnego motywu, a szablon odnosi się do motywu nadrzędnego, ale jeśli uwzględniono motyw dziadka, to czy get_template_directory_uriodwołuje się do rodzica czy dziadka? Wiele wywołań interfejsu API jest obecnie niejednoznacznych, a różni ludzie oczekiwaliby odmiennego zachowania, w tym kodu będącego rdzeniem. Musisz także załadować functions.phprodzica lub dziadka i upewnić się, że zostało to wykonane we właściwej kolejności.

Jest to również uważane za bardzo złą praktykę. Jeśli potrzebujesz motywów dla wnuków, twoje podejście przybrało zły obrót i musisz cofnąć się i dokonać ponownej oceny.

Radziłbym unikać koncepcji motywów wnuczka, to doprowadzi do kolejnych problemów. Zamiast tego więcej filtrów przechwytujących działania i modułowość motywu podrzędnego powinny pozwolić ci zachować te same komponenty podrzędne i pozwolić na rozgałęzienie / rozwidlenie z niewielkim trudem. Spróbuj przenieść wspólne elementy do submoduła svn external / git.

Istnieje również model _s, w którym masz motyw potomny jako bazę i rozwidlaj go, zamiast mieć go jako element nadrzędny z zamiarem pracy nad kopią, a nie nadrzędnego / zastępowania.

Tom J Nowell
źródło
Więc w moim przypadku, jeśli przejdę do Genesis, będę musiał bezpośrednio zmodyfikować motyw potomny, prawda? Niezbyt dobrze zna Git, ale byłby zainteresowany podejściem, które pomogłoby mi zachować oryginalny motyw potomny.
urok93
Tak, nie masz tutaj wielu opcji.
Tom J Nowell
Zastanawiam się, co by się stało, gdybyś spróbował stworzyć świetny motyw wnuka.
Chris_O,
1
Wspominasz, że metoda skręciła źle, jeśli jej potrzebujesz. Jestem ciekawy tego powodu takiego scenariusza jak użycie motywu WooCommerce Storefront. Sprzedają motywy potomne do Storefront, które są dostosowane do różnych rzeczy. Więc jeśli używam jednego z ich motywów potomnych, ale chcę kontynuować wprowadzanie własnych zmian w sposób, który nie zostanie zastąpiony, gdy zaktualizują motyw potomny ... jak to zrobić?
Drew Angell,
1
Nie wiem, to jest ograniczenie budowy motywu sklepu. W tym momencie jesteś zmuszony rozwidlić motyw potomny
Tom J Nowell
3

Nie w pełni przetestowałem metodę opisaną poniżej, ani normalny motyw „wnuka”, ale podając funkcjonalność filtra 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.

Możesz również w podobny sposób wypróbować bardziej szczegółowe filtry, takie jak na przykład element_archiwum

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

Wszystko, co zostało powiedziane i zrobione, nie jestem pewien, czy jest to najlepszy sposób na robienie różnych rzeczy.

krembo99
źródło