Rechtssicherer Online-Shop – WooCommerce und das deutsche Recht

Von Flatpack
WordPress hat sich zu einem der beliebtesten Content-Management-System entwickelt. Neben den umfangreichen Basisfunktionen werden viele weitere in Form von Plugins installiert. Warum also nicht auch einen kompletten Online-Shop über WordPress erstellen? Mit WooCommerce gibt es ein mächtiges und zudem auch noch kostenloses Plugin, das aus einem Blog einen ausgewachsenen Shop macht. Das deutsche Recht verlangt jedoch einige Dinge, die im Basisplugin nicht existieren. Wie bekommt man WooCommerce in Deutschland rechtssicher?

Dieser Artikel kann keine Rechtsberatung darstellen. Bei spezifischen Anforderungen sollte daher immer ein Anwalt konsultiert werden.

Zahlreiche neue Gesetze zum Verbraucherschutz haben in den letzten Jahren das Leben der Online-Shop Betreiber schwerer gemacht. Schon kleinste Fehler wurden mit teuren Abmahnungen bestraft. Dieser Artikel richtet sich in erster Linie an diejenigen, die ein bestehendes WordPress Theme weiter nutzen und nicht auf die Aktualisierung von Plugins vertrauen möchten. Mit wenigen Änderungen an den WordPress und WooCommerce Templates lässt sich der Shop an das deutsche Recht anpassen. Es ist also ein wenig Programmierkenntnis erforderlich.

Anpassen von WooCommerce Templates

Damit Änderungen an den Templates von WooCommerce auch nach einem Update Bestand haben, müssen diese in das Verzeichnis unseres Themes kopiert werden. Dort wird ein Unterordner woocommerce erstellt, in den dann unter Beibehaltung des Pfades die Templatedateien kopiert werden. Soll also aus dem Plugin Verzeichnis die Datei /templates/checkout/review-order.php angepasst werden, dann wird diese Datei in unser Themeverzeichnis unter /woocommerce/checkout/review-order.php kopiert.

Button-Lösung umsetzen

Die Button-Lösung erfordert einige Änderungen am Checkout-Prozess in WooCommerce. Im ersten Schritt ist eine klare Bezeichnung des Buttons erforderlich. Zulässig sind zum Beispiel Kaufen, Jetzt kaufen, Kostenpflichtig bestellen oder Zahlungspflichtig bestellen. Zusätzlich muss dieser Button auch am Ende des Bestellprozesses stehen. Es dürfen keine weiteren Informationen mehr folgen. Am einfachsten setzt man diese beiden Schritte um, indem der Kauf-Button an das Ende der Datei /checkout/review-order.php gesetzt wird:

Im gleichen Zuge habe ich den Original-Button in der Datei /checkout/payment.php auskommentiert:

Korrekte Preisauszeichnung und Versandkosten

Dem Kunden müssen immer die vollständigen Preise inkl. aller Preisbestandteile genannt werden. Handelt es sich um einen reinen B2B Shop, dann ist die Angabe der enthaltenen Mehrwertsteuer verpflichtend. Diese muss auch unmittelbar in der Nähe des Preises stehen. Auch die Versandkosten müssen stets für den Kunden sichtbar sein. Das kann durch eine direkte Preisangabe oder durch einen Verweis auf eine separate Versandkostentabelle sein. Entsprechend müssen die folgenden Templates angepasst werden:

  1. order/order-details.php
    Aus Zeile<td><?php echo $total[‚value']; ?></td> wurde in meinem Fall <td><?php echo preg_replace(„/\(Enthält.*MwSt\.\)/","<small>&nbsp;inkl. MwSt.</small>",strip_tags(str_replace(„via Versandkosten","",$total[‚value']))); ?></td>
    Dadurch habe ich mich auch gleich des lästigen Textesvia Versandkosten entledigt.
  2. single-product/add-to-cart/variation.php
    Wer mit Variationen arbeitet, muss auch hier die Mehrwertsteuer einfügen. Die Variable{{{ data.variation.price_html }}} gibt lediglich den reinen Preis aus und muss folgendermaßen geändert werden: <span class="price_mwst">Preis für gewählte Variation: </span> {{{ data.variation.price_html }}} <span class="price_mwst">inkl. MwSt., <a href="/zahlung-und-versandkosten/" target="_blank">versandkostenfreie Lieferung</a></span>
    Durch die class price_mwst habe ich diesen Zusatz über CSS nach meinen Vorstellungen formatiert.
  3. single-product/price.php
    Auch in diesem Template muss<?php echo $product->get_price_html(); ?> noch um <span class="price_mwst">inkl. MwSt., <a href="/zahlung-und-versandkosten/" target="_blank">versandkostenfreie Lieferung</a></span> ergänzt werden.
  4. Preisangaben in Listen
    In den verschiedenen Auflistungen (Artikelübersicht, Suche usw.) darf diese Angabe natürlich auch nicht fehlen. Um hier nicht in vielen weiteren Dateien Änderungen vornehmen zu müssen, habe ich den Weg über CSS gewählt.
    .woocom-list-content .price .amount:after {
    	content:" inkl. MwSt.";
    }
    .sidebar-content ul.cart_list li a, .sidebar-content ul.product_list_widget li .amount:after {
    	content: " inkl. MwSt.";
    }
    .shop_table.cart .cart_item .amount:after, .cart-subtotal .amount:after {
    	content: " inkl. MwSt." !important;
    } 
    

    Diese 3 Deklarationen habe ich in /woocommerce/woocommerce.css eingefügt. Das Erscheinungsbild kann an diesen Stellen auch gleich noch durch weitere Parameter angepasst werden.

Bei den Versandkosten gibt es noch ein weiteres Problem, das gelöst werden muss. Der Kunde muss immer die vollständigen Kosten sehen können. Es darf kein Auf Anfrage geben. Wird keine Versandkostenpauschale erhoben, müssen alle möglichen Variationen aufgeführt werden. Im Grunde gibt es hier 3 gängige Variationen:

  1. Versandkosten nach Gewicht
  2. Versandkosten nach Lieferort
  3. Versandkosten nach Gewicht und Lieferort

Dies ist durch Templates nur schwer umzusetzen. In meinem Shop verwende ich daher ein Plugin, das mir eine entsprechende Berechnung und die Anzeige im Warenkorb erlaubt: WooCommerce - APG Weight and Postcode/State/Country Shipping

Bei der Berechnung nach Gewicht muss zudem darauf geachtet werden, dass der Kunde jederzeit das Gesamtgewicht errechnen kann. Dazu ist es erforderlich, das Gewicht des einzelnen Produktes auf der Produktseite und auch auf den Übersichtsseiten anzuzeigen.

Bestellbestätigung per Email

WooCommerce sendet zwar automatisch eine Bestellbestätigung an den Kunden, aber in Deutschland ist es sinnvoll in diese auch gleich die AGB und Widerrufsbelehrung einzufügen. Das kann entweder in den Einstellungen von WooCommerce in den Email-Templates erfolgen oder durch wenige Zeilen Code in der functions.php des verwendeten Themes.

Für den Shop müssen ohnehin separate Seiten für AGB, Datenschutz und Widerruf erstellt und aktuell gehalten werden. Der einfachste Weg ist daher, diese Texte in die ausgehenden Bestellbestätigungen zu integrieren. Durch die folgenden Zeilen muss ich lediglich meine Seiten bearbeiten, sofern sich etwas ändert und in den Email ist automatisch die neue Fassung zu sehen.

add_action( 'woocommerce_email_agb', 'email_agb', 5 );
if (!function_exists('email_agb')) {
	function email_agb() {
		global $wpdb;
		$myrows = $wpdb->get_row( "SELECT ID, post_content FROM wp_posts WHERE ID = XXX" );
		echo "<h2>Allgemeine Geschäftsbedingungen (AGB)</h2><br />".$myrows->post_content;
	}
}

add_action( 'woocommerce_email_widerruf', 'email_widerruf', 5 );
if (!function_exists('email_widerruf')) {
	function email_widerruf() {
		global $wpdb;
		$myrows = $wpdb->get_row( "SELECT ID, post_content FROM wp_posts WHERE ID = XXX" );
		echo "<h2>Widerrufsbelehrung / Muster-Widerrufsformular</h2><br />".$myrows->post_content;
	}
}

Die IDs in den beiden Funktionen müssen die der jeweiligen Seite sein. Diese erfährt man ganz einfach über die Statusbar des Browsers, wenn man in der Admin mit der Maus über Bearbeiten der jeweiligen Seite fährt.

Jetzt muss nur noch im Template emails/customer-processing-order.php unter

do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );

folgendes hinzugefügt werden:

do_action( 'woocommerce_email_agb' );
do_action( 'woocommerce_email_widerruf' );

Lieferzeiten angeben

Vorgeschrieben ist auch die Angabe der Lieferzeiten. Diese sollte gut sichtbar auf der Produktseite am Produkt stehen. Gibt es den Übersichtslisten die Möglichkeit, den Artikel in den Warenkorb zu legen, dann muss auch dort die Lieferzeit, Versandkosten und das Produktgewicht stehen.

Um Lieferzeiten angeben zu können, müssen diese zunächst in die Adminstration eingefügt werden. Das geschieht über die folgenden Zeilen, die ans Ende der functions.php gesetzt werden können.

// Felder anzeigen
add_action( 'woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields' );

// Felder speichern
add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save' );
add_action( 'save_post', 'woo_add_custom_order_fields_save' );

function woo_add_custom_general_fields() {
  global $woocommerce, $post;
  echo '<div class="options_group">';
  woocommerce_wp_text_input( 
		array( 
			'id'          => '_text_lieferzeit', 
			'label'       => __( 'Lieferzeit', 'woocommerce' ), 
			'placeholder' => '4-5',
			'desc_tip'    => 'true',
			'description' => __( 'Lieferzeit', 'woocommerce' ) 
		)
	);
  
  echo '</div>';
}

function woo_add_custom_general_fields_save( $post_id ){
	$woocommerce_text_lieferzeit = $_POST['_text_lieferzeit'];
	if( !empty( $woocommerce_text_lieferzeit ) )
		update_post_meta( $post_id, '_text_lieferzeit', esc_attr( $woocommerce_text_lieferzeit ) );
}

Damit die gespeicherten Lieferzeiten auch auf der Produktseite angezeigt werden kann der folgende Code an die gewünschte Stelle (also eine der Dateien im Verzeichnis /single-product/) gesetzt werden:

<?php
		$lzeit = get_post_meta($product->id,"_text_lieferzeit",true);
		if(!$lzeit) $lzeit = "3-5";
	?>
    <p class="liefer_wrapper" style="margin-bottom:15px;margin-top:20px"><strong>Lieferzeit:</strong> <?php echo $lzeit; ?> Werktage</p>

Ich habe hier auch gleich eine Standardzeit von 3-5 Tage angegeben, falls ich mal das Ausfüllen in der Admin vergessen sollte.

Einfache Lösung über Plugin

Wer nicht in seinen eigenen Templates wühlen möchte und ohne Probleme auch ein anderes nutzen kann, der sollte sich das Plugin WooCommerce Germanized ansehen. Der Entwickler verspricht laufende Anpassungen an aktuelle WordPress Versionen und gesetzliche Änderungen.