Woocommerce – Alternative für woocommerce_locate_template

Lesezeit: 5 Minuten

Ich entwickle ein Plugin basierend auf WooCommerce und als Teil davon musste ich den Standardspeicherort der Vorlagendatei von WooCommerce überschreiben. Ich meine, ich suche nach einer benutzerdefinierten Woocommerce-Vorlage, die von meinem Plugin geladen wird.

Um dies zu tun, habe ich auf dieser Grundlage in woocommerce über woocommerce_locate_template gelesen Artikelaber mir ist aufgefallen, dass dieselbe Funktion als veraltet markiert wurde Verknüpfung. Jetzt frage ich mich, was eine alternative Funktion dafür sein könnte.

Meine ganze Absicht war es, den Standard-Ladeort für Woocommerce-Vorlagen in meinen Plugin-Ordner zu ändern. Irgendwelche Hilfe bei der Lösung dieses Problems? Danke im Voraus.

Benutzer-Avatar
Lorenzo Zottar

Die Funktion woocommerce_locate_template ist zugunsten von wc_locate_template veraltet: Sie können den Code lesen hier.

Wenn Sie jedoch nach dem suchen Filteres ist immer noch woocommerce_locate_template und nimmt drei Argumente:

  1. $Vorlage das ist das Ergebnis der wp-Core-Funktion locate_template
  2. $Vorlagenname das ist nur der Dateiname
  3. $template_path Das ist der WooCommerce-Pfad für Vorlagen

Sie können also überprüfen, ob $template_name das ist, was Sie abfangen möchten, und den Pfad ändern, wenn er wahr ist, wie folgt

function intercept_wc_template($template, $template_name, $template_path) {
    if ($template_name == 'that_template.php') {
        $template="the/path/of/your/plugin/template.php";
    }
    return $template;
}

add_filter('woocommerce_locate_template', 'intercept_wc_template', 20, 3);

Ich habe es nicht getestet, also entschuldigen Sie mögliche Syntaxfehler 🙂

Ich hoffe es hilft!

— Update 1: Ich habe ein Semikolon vergessen 😛 —
— Update 2: Ich habe einen Fehler gemacht! —

  • Danke für deine Antwort Lorenzo Zottar. Ich habe Ihren Code ausprobiert und unten ist der Code, aber ich sehe, dass keine Änderungen an der Produktvorlage vorgenommen werden.

    – krishna89

    7. September 2015 um 22:40 Uhr

  • Hier ist der Code, den ich versucht habe function intercept_wc_template($template, $template_name, $template_path) { if ($template_name == 'content-single-product.php') { //um_product_path is the plugin path $template = locate_template(um_product_path.'woocommerce/single-product/content-single-product.php'); } return $template; } add_filter('woocommerce_locate_template', 'intercept_wc_template', 20, 3);

    – krishna89

    7. September 2015 um 22:41 Uhr


  • Versuchen Sie hinzuzufügen var_dump($template); vor dem return $template um zu debuggen, ob der Pfad korrekt ist und ob die if-Anweisungen funktionieren. Die Zeichenfolge wird oben auf Ihrer Seite angezeigt, wenn Sie eine Woocommerce-Seite aufrufen. Der Filter funktioniert, also könnte es ein Problem mit Ihrem Pfad oder ein Problem in der if-Anweisung sein 🙂

    – Lorenzo Zottar

    7. September 2015 um 22:54 Uhr

  • Ich habe gerade den var_dump auf der Produktseite überprüft. Beachten Sie, dass sich die var_dump-Zeichenfolge auf den ursprünglichen Woocommerce-Vorlagenordner oder meinen Themen-Woocommerce-Ordner bezieht, aber nicht auf meinen Plugin-Ordner.

    – krishna89

    7. September 2015 um 23:00 Uhr

  • Das Problem liegt also in der if-Anweisung: ändern Sie die var_dump in var_dump($template_name); und gehen Sie zu der Seite, die Sie abfangen möchten, und überprüfen Sie den genauen Namen der Vorlage. Allerdings habe ich einen Fehler gemacht, Sie müssen nicht locate_template verwenden, sondern einfach die Variable $template überschreiben: Ich habe es gerade auf meinem lokalen Rechner getestet. Ich werde meine Antwort bearbeiten.

    – Lorenzo Zottar

    7. September 2015 um 23:22 Uhr

Ich musste den obigen Code ändern, damit er korrekt mit der von mir benötigten Vorlagendatei übereinstimmt, die in meinem Fall “variable.php” war.

$template_name muss der vollständige Woocommerce-Root-Pfad sein, siehe unten:

Siehe den geänderten Code unten:

function intercept_wc_template($template, $template_name, $template_path) {
    if ($template_name == 'single-product/add-to-cart/variable.php') {
        $template="wp-content/themes/theme-name/woocommerce/single-product/add-to-cart/variable.php";
    }

    return $template;
}

add_filter('woocommerce_locate_template', 'intercept_wc_template', 20, 3);

Benutzer-Avatar
Jonas Lundman

Wenn jemand ab 2021 damit zu kämpfen hat, sollte erwähnt werden, dass die Filter 'woocommerce_locate_template' filtert nicht alle Vorlagen im WooCommerce-Ordner. Stattdessen müssen Sie zwei andere Funktionen filtern:

add_filter('wc_get_template', 'entex_wc_get_template', 20, 5);
add_filter('wc_get_template_part', 'entex_wc_get_template_part', 20, 3);

Zum Beispiel die Root-Woocommerce-Vorlage content-single-product.php muss mit wc_get_template_part gefiltert werden.

Das funktioniert für unser Plugin:

function template_base(){
    return untrailingslashit(plugin_dir_path( __FILE__ )) .'/templates/';
}

function entex_wc_get_template($template, $template_name, $args, $template_path, $default_path){

    /* custom theme templates has priority */
    if(strpos($template, '/themes/') !== FALSE) return $template;

    static $cache = array();
    if(isset($cache[$template_name])) return $cache[$template_name];
    
    $plugin_template = wc_locate_template($template_name, WC()->template_path(), $this->template_base());
    if($plugin_template && file_exists($plugin_template)){
        $template = $plugin_template;
        $cache[$template_name] = $template;
    }
    return $template;
}

function entex_wc_get_template_part($template, $slug, $name){
    
    /* custom theme templates has priority */
    if(strpos($template, '/themes/') !== FALSE) return $template;
    
    $template_name="";
    if($name){
        $template_name = "{$slug}-{$name}.php";
    } else if($slug){
        $template_name = "{$slug}.php";
    }
    if(!$template_name) return $template;
    
    static $cache = array();
    if(isset($cache[$template_name])) return $cache[$template_name];
    
    $plugin_template = template_base().$template_name;
    if($plugin_template && file_exists($plugin_template)){
        $template = $plugin_template;
        $cache[$template_name] = $template;
    }
    return $template;
} 

Dies wird aus der PHP-Klasse herausgerissen und hier eingefügt, also ist der Code hoffentlich nicht beschädigt.

Wir empfehlen, die Vorlagen für eine sauberere Leistung zu registrieren, wenn Sie nur wenige verwenden, und so etwas früh in den Funktionen hinzuzufügen:

if(!in_array($template_name, array(
    'archive-product.php',
    'content-product.php',
    'content-product-cat.php',
    'content-single-product.php',
    'content-widget-product.php',
    'checkout/form-checkout.php',
    'checkout/thankyou.php',
    'loop/loop-start.php',
    'loop/loop-end.php'
))) return $template;

1383970cookie-checkWoocommerce – Alternative für woocommerce_locate_template

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

Privacy policy