Ist es möglich, Themen für Enkelkinder zu erstellen?

15

Kann ich Enkelkind-Themen erstellen, wenn ich eines der gängigen Frameworks wie Genesis verwende?

Als Beispiel möchte ich Genesis als Rückgrat aller meiner Websites verwenden. Genesis wird als Framework bezeichnet, ist jedoch eigentlich ein übergeordnetes Thema.

Dann wähle ich eines der untergeordneten Genesis-Designs aus, das bei StudioPress zum Verkauf steht, und möchte es für jede meiner Websites anpassen. Würde ich ein Enkelkind-Thema für alle meine Websites erstellen und wie würde ich vorgehen?

urok93
quelle

Antworten:

17

Ja und nein.

Sie könnten ein untergeordnetes Thema erstellen, indem Sie ein anderes untergeordnetes Thema als übergeordnetes Thema angeben, und WordPress würde versuchen, es zu verwenden.

jedoch

Sie werden auf Probleme stoßen, ganz zu schweigen davon, dass die Kernentwickler ausdrücklich erklärt haben, dass dies kein wünschenswertes Verhalten ist, und keine Anstrengungen unternehmen, um Enkelkind-Themen zu unterstützen.

Beispielsweise unterscheiden WP-APIs zwischen Stylesheet- und Vorlagen-URLs / -Verzeichnissen, wobei sich Stylesheet immer auf das aktive Thema und Vorlage auf das übergeordnete Thema bezieht. Wenn jedoch ein übergeordnetes Thema enthalten ist, bezieht sich dies get_template_directory_uriauf das übergeordnete oder das übergeordnete Thema ? Viele API-Aufrufe sind jetzt mehrdeutig, und verschiedene Personen würden ein unterschiedliches Verhalten erwarten, einschließlich des Codes, der sich im Kern befindet. Sie müssten auch functions.phpentweder die des Elternteils oder des Großelternteils laden und sicherstellen, dass dies in der richtigen Reihenfolge erfolgt.

Es wird auch als sehr schlechte Praxis angesehen. Wenn Sie Enkelkind-Themen benötigen, ist Ihr Ansatz falsch verlaufen, und Sie müssen einen Schritt zurücktreten und die Dinge neu bewerten.

Ich rate Ihnen, das Konzept von Enkelkind-Themen zu vermeiden, da dies zu weiteren Problemen führen wird. Stattdessen sollten mehr Hooks-Filteraktionen und Modularität in Ihrem untergeordneten Thema es Ihnen ermöglichen, die gemeinsam genutzten Komponenten des untergeordneten Themas gleich zu halten, und Sie können problemlos verzweigen / verzweigen. Versuchen Sie, allgemeine Elemente in ein svn external / git-Submodul zu verschieben.

Es gibt auch das _s-Modell, in dem Sie Ihr untergeordnetes Thema als Basis haben und es teilen, anstatt es als übergeordnetes Thema zu haben, mit der Absicht, dass Sie an der Kopie arbeiten, und nicht als untergeordnetes Thema / Überschreibung.

Tom J Nowell
quelle
Also muss ich in meinem Fall, wenn ich mich für Genesis entscheide, das untergeordnete Thema direkt ändern, oder? Ich kenne Git nicht sehr gut, wäre aber an einem Ansatz interessiert, der mir hilft, das ursprüngliche untergeordnete Thema beizubehalten.
Urok93
Ja, Sie haben hier nicht viele Möglichkeiten.
Tom J Nowell
Ich frage mich, was passieren würde, wenn Sie versuchen würden, ein Thema für ein Urenkelkind zu erstellen.
Chris_O
1
Sie erwähnen, dass die Methode eine falsche Wendung genommen hat, wenn Sie dies benötigen. Der Grund, warum ich neugierig bin, ist ein Szenario wie die Verwendung des WooCommerce Storefront-Themas. Sie verkaufen untergeordnete Themen an die Storefront, die für verschiedene Dinge angepasst sind. Wenn ich also eines ihrer untergeordneten Themen verwende, aber dann meine eigenen Änderungen so vornehmen möchte, dass sie beim Aktualisieren ihres untergeordneten Themas nicht überschrieben werden. Wie würde ich das tun?
Drew Angell
1
Ich weiß nicht, das ist eine Einschränkung der Erstellung des Storefront-Themas. An diesem Punkt müssen Sie das untergeordnete Thema aufteilen
Tom J Nowell
3

Ich habe die unten beschriebene Methode nicht vollständig getestet, noch ein normales "Enkelkind" -Thema, aber die Funktionalität des Filters template_include angegeben :

    /*
    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.

Auf ähnliche Weise können Sie auch spezifischere Filter wie zum Beispiel archive_template ausprobieren

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

Nach all dem bin ich mir nicht sicher, ob es der beste Weg ist, Dinge zu tun.

krembo99
quelle