Lösung für WooCommerce URLs und Polylang

Hier möchte ich euch erklären, wie ich WooCommerce und Polylang URLs harmonieren lassen habe.

Das Problem

Man stoßt immer wieder auf Probleme, wenn man versucht, zwei grundlegende Funktionen eines Systemes auf Plug-ins aufzubauen.

In diesem Fall habe ich mit den Plug-ins Polylang und WooCommerce gearbeitet. Dabei habe ich musste feststellen, dass diese Plugins an einigen Punkten nicht gut miteinander harmonieren, was jedoch normal ist und vorkommen kann, wenn man mit mehreren Plugins arbeitet.

Die Besucher der Webseite, welche sich die Seite auf Englisch anschauen, haben ihren Warenkorb gefüllt und würden gerne zum Abschluss diesen betrachten. Sie klicken auf Shopping cart und werden auf eine deutschsprachige Warenkorbseite weitergeleitet.

Sie wechseln die Sprache auf der Warenkorbseite jedoch geschieht dasselbe auf der Kassenseite sowie auf der Übersichtsseite des Kaufs.

Die Analyse des Problems
Hierauf habe ich mir das Template angeschaut und musste feststellen, dass dort nur folgendes ausgeführt wird:

 echo esc_url( wc_get_checkout_url() ); 
header.php

Also habe ich auf Google geguckt, ob jemand ebenfalls mit diesem Problem konfrontiert war und wurde dann auch fündig.

 

Jesper Lund’s Lösungsansatz

Der Programmierer Jesper Lund hat bereits eine Lösung veröffentlicht gehabt.
Ich erkläre euch mal eben seinen Lösungsansatz:

WooCommerce bietet den Nutzern im Backend die Möglichkeit, eine Seite ,,Kasse, Warenkorb und AGB“ zu wählen. Dies ist unumgänglich, da die IDs der Seiten bei jedem  anders sein können. Wenn jemand z. B. die Seiten bereits angelegt hat und im Nachhinein WooCommerce installiert, kann man die bereits angelegten Seiten dort auswählen.

Seite: xyz.com/wp-admin/admin.php?page=wc-settings&tab=checkout

Da die Seiten, welche man jedoch übersetzt hat, andere IDs haben, werden diese nicht automatisch von WooCommerce erkannt, sondern die Besucher der Webseite, egal welche Sprache Sie verwenden, werden immer auf die dort angegebene Seite weiter geleitet.

Dafür holt sich WooCommerce in der folgenden Datei mit der folgenden Funktion die Permalinks der Seiten, die man dort ausgewählt hat:

/**
* Retrieve page permalink.
*
* @param string $page
* @return string
*/
function wc_get_page_permalink( $page ) {
$page_id = wc_get_page_id( $page );
$permalink = 0 < $page_id ? get_permalink( $page_id ) : get_home_url();
return apply_filters( 'woocommerce_get_' . $page . '_page_permalink', $permalink );
}
Datei: /woocommerce/includes/wc-page-functions.php

Jesper hat hier einfach die Variable $page_id manipuliert, indem er Polylang zwischengeschaltet hat

 

 $page = function_exists('pll_get_post') ? apply_filters( 'woocommerce_get_' . $page . '_page_id', pll_get_post ( get_option('woocommerce_' . $page . '_page_id' ) ) ) : apply_filters( 'woocommerce_get_' . $page . '_page_id', get_option('woocommerce_' . $page . '_page_id' ) ); 
Jesper's Lösunbgsansatz

Diese Lösung ist sehr gut, jedoch verbirgt sich ein grundlegendes Problem dahinter!

Bei jedem Update von WooCommerce wird diese Datei erneuert und man muss diese ersetzen, was bedeutet dass, man es nicht einmalig programmieren und es automatisch laufen lassen kann.

 

Die oben genannte Lösung ist natürlich nicht lang anhaltend und deswegen habe ich mich nach anderen Lösungen umgeschaut. Ich wurde fündig und habe gelernt, dass man sogenannte Filter Hooks verwenden kann, um WooCommerce Werte zu manipulieren.

WooCommerce verfügt zu diesem Thema drei Filter:

  • woocommerce_get_checkout_url
  • woocommerce_get_cart_url
  • woocommerce_get_terms_url

Diese drei Filter kann man direkt in die functions.php-Datei eintragen und dies ist eine Lang anhaltende Lösung


add_filter('woocommerce_get_checkout_url', function($url){
	return get_permalink(pll_get_post(get_option( 'woocommerce_checkout_page_id' )));
});
add_filter('woocommerce_get_cart_url', function($url){
	return get_permalink(pll_get_post(get_option( 'woocommerce_cart_page_id' )));
});
add_filter('woocommerce_get_terms_url', function($url){
	return get_permalink(pll_get_post(get_option( 'woocommerce_terms_page_id' )));
});
Meine Lösung