Woocommerce – Überschreiben der Vorlage durch ein Plugin

Lesezeit: 5 Minuten

Ich habe eine Frage: Gibt es eine Möglichkeit, die Standardvorlage von WooCommerce über ein Plugin zu überschreiben, so wie Sie es mit einem Design tun würden? Ich habe diesen Code:

Class WoocommerceOverride {

    public function woocommerce_locate_template( $template, $template_name, $template_path ) {
        $plugin_path = SPSL_PLUGIN_PATH;
        global $woocommerce;
        $_template = $template;
        if ( ! $template_path ) $template_path = $woocommerce->template_url;
        $plugin_path .= '/woocommerce/';

  // Look within passed path within the theme - this is priority
        $template = locate_template(
            array(
                $template_path . $template_name,
                $template_name
                )
            );

  // Modification: Get the template from this plugin, if it exists
        if ( ! $template && file_exists( $plugin_path . $template_name ) )
            $template = $plugin_path . $template_name;

  // Use default template
        if ( ! $template )
            $template = $_template;

        //echo $template."<br>";

  // Return what we found
        return $template;
    }

}
add_filter( 'woocommerce_locate_template', array('WoocommerceOverride', 'woocommerce_locate_template'), 10, 3 );

Das Problem mit diesem Code ist, dass er nur teilweise funktioniert. Bei manchen Teilen funktioniert es, bei anderen nicht. Zum Beispiel kann ich archive-product.php überhaupt nicht anpassen. Was auch immer ich da reinschreibe, ob Code oder reiner Text, ich bekomme einfach keine Ergebnisse. Ich habe genau die gleichen Vorlagendateien aus meinem Plugin-Ordner in meinen Themenordner kopiert und es funktioniert. Da ich das aber als Plugin benötige, kann ich den Themenweg nicht gehen.

Danke vielmals.

  • Nach viel Recherche: stackoverflow.com/a/35252520/4689173 woocommerce_locate_template lädt nicht single-product.php Vorlage.

    – Kyrill A

    20. Juni 2019 um 18:33 Uhr


  • Verwenden von Filtern wc_get_template_part Wir können die standardmäßigen WooCommerce-Vorlagenteile überschreiben.
  • Verwenden von Filtern woocommerce_locate_template Wir können die standardmäßigen WooCommerce-Vorlagen überschreiben.

Probieren Sie das folgende Beispielcode-Snippet aus.

<?php
/**
 * Override default WooCommerce templates and template parts from plugin.
 * 
 * E.g.
 * Override template 'woocommerce/loop/result-count.php' with 'my-plugin/woocommerce/loop/result-count.php'.
 * Override template part 'woocommerce/content-product.php' with 'my-plugin/woocommerce/content-product.php'.
 *
 * Note: We used folder name 'woocommerce' in plugin to override all woocommerce templates and template parts.
 * You can change it as per your requirement.
 */
// Override Template Part's.
add_filter( 'wc_get_template_part',             'override_woocommerce_template_part', 10, 3 );
// Override Template's.
add_filter( 'woocommerce_locate_template',      'override_woocommerce_template', 10, 3 );
/**
 * Template Part's
 *
 * @param  string $template Default template file path.
 * @param  string $slug     Template file slug.
 * @param  string $name     Template file name.
 * @return string           Return the template part from plugin.
 */
function override_woocommerce_template_part( $template, $slug, $name ) {
    // UNCOMMENT FOR @DEBUGGING
    // echo '<pre>';
    // echo 'template: ' . $template . '<br/>';
    // echo 'slug: ' . $slug . '<br/>';
    // echo 'name: ' . $name . '<br/>';
    // echo '</pre>';
    // Template directory.
    // E.g. /wp-content/plugins/my-plugin/woocommerce/
    $template_directory = untrailingslashit( plugin_dir_path( __FILE__ ) ) . 'woocommerce/';
    if ( $name ) {
        $path = $template_directory . "{$slug}-{$name}.php";
    } else {
        $path = $template_directory . "{$slug}.php";
    }
    return file_exists( $path ) ? $path : $template;
}
/**
 * Template File
 *
 * @param  string $template      Default template file  path.
 * @param  string $template_name Template file name.
 * @param  string $template_path Template file directory file path.
 * @return string                Return the template file from plugin.
 */
function override_woocommerce_template( $template, $template_name, $template_path ) {
    // UNCOMMENT FOR @DEBUGGING
    // echo '<pre>';
    // echo 'template: ' . $template . '<br/>';
    // echo 'template_name: ' . $template_name . '<br/>';
    // echo 'template_path: ' . $template_path . '<br/>';
    // echo '</pre>';
    // Template directory.
    // E.g. /wp-content/plugins/my-plugin/woocommerce/
    $template_directory = untrailingslashit( plugin_dir_path( __FILE__ ) ) . 'woocommerce/';
    $path = $template_directory . $template_name;
    return file_exists( $path ) ? $path : $template;
}

  • Funktioniert fantastisch danke. Für Google will ich nur sagen, dass dies der beste Weg ist, woocommerce 3.x-Vorlagendateien von einem Plugin zu ersetzen.

    – DaveLak

    9. August 2017 um 10:08 Uhr

  • Scheint nicht mehr zu funktionieren? Jetzt wird die Standardvorlage geladen

    – Alternativ C

    3. August 2019 um 11:27 Uhr

  • @LatheeshVMVilla Dem Dateipfad müssen Vorlagen hinzugefügt werden. Sollte folgendes sein: $template_directory = untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/woocommerce/templates/'; Das hat bei mir funktioniert

    – Dan W.

    8. Januar 2020 um 21:33 Uhr


Vor einigen Monaten hatte ich die gleichen Anforderungen. Also habe ich ein bisschen mehr im Internet gesucht und nützlichen Code gefunden, der mir geholfen hat (mit etwas mehr Anpassung gemäß meinen Anforderungen).

Für einen detaillierten Code mit Erläuterung siehe Das und Das Verknüpfung. Der Ansatz kann sich von dem unterscheiden, was Sie derzeit verwenden, führt jedoch dazu, dass Woocommerce-Vorlagen im Plugin überschrieben werden

  • Danke für die Antwort. Hat das für Sie vollständig funktioniert? Ich denke, der erste und der zweite Link haben den gleichen Code. Ich habe den Code aus dem ersten Link verwendet (gerade in eine Klasse umgewandelt), aber er funktioniert bei mir nicht vollständig. Die Shopseite kann ich darüber gar nicht bearbeiten, ich kann ein paar Dateien ändern, aber nicht alle. Gab es Probleme?

    – Stefan Malic

    23. August 2015 um 11:12 Uhr


  • Um genauer zu sein, was ich brauche: Abgesehen davon, dass ich die Dateien anpassen muss, ist die Hauptdatei, die ich anpassen muss, die Shop-Seite, da ich ihr gesamtes Layout ändern muss.

    – Stefan Malic

    23. August 2015 um 12:27 Uhr

  • Ich habe ungefähr 10 Lösungen/Codebeispiele getestet (einschließlich derjenigen, die Sie hier verlinken), keine davon hat funktioniert, nur die oben, eingereicht von @maheshwaghmare.

    – Eduard Münch

    28. Juli 2020 um 22:12 Uhr


Sie sollten versuchen, diesen Code vor Ihrem hinzuzufügen // Use default template Code:

if( $template_name == '{template part name}') {
     $template = $plugin_path . $template_name;
}

In meinem Fall war {Name des Vorlagenteils} global/quantity-input.php

Sie können Ihre genauen Vorlagenteilnamen herausfinden, indem Sie vorübergehend diese Zeile zu Ihrem Code hinzufügen:

print_r($template_name);

Ich weiß, es ist ein bisschen spät für eine Antwort hier, aber vielleicht ist es für jemand anderen nützlich. Und denken Sie daran woocommerce_locate_template ist entwertet. Es gibt also wahrscheinlich irgendwo da draußen eine “aktuellere” Lösung.

1002950cookie-checkWoocommerce – Überschreiben der Vorlage durch ein Plugin

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy