Category Archives: Tips, Tricks, Ideen

WooCommerce: Produkt im Warenkorb bearbeiten

Ich habe mich gerade damit rumgeschlagen, ein Produkt im Warenkorb zu bearbeiten.

Bei normalen Produkten ist das eigentlich nur die Anzahl, die geändert werden soll, und das kann man im Warenkorb selbst machen.

Bei Produkten mit Custom Attributes ist das schon schwieriger. Wenn z.B.  eine Bestellung auf mehrere Lieferadressen aufgeteilt werden soll, und von 5 Stück für Bruchmühlbach-Miesau jetzt 2 davon nach Thaleischweiler-Fröschen gehen sollen und nur 3 nach Bruchmühlbach-Miesau. Ich habe dafür mehrere Input-Felder erstellt und rechne die Gesamtanzahl mit JavaScript aus. Das klappt auch alles. Nur…wie editiert man das?

Eine Anfrage bei WooCommerce ergab, daß es diese Funktion nicht gibt. Und irgendwie scheint sie auch niemand außer mir zu vermissen. Was tun?

Selber machen 🙂

Meine Idee war, Löschen und Hinzufügen zu einer Bearbeiten-funktion zu kombinieren.

1.) Meine Warenkorb-Seite liegt (als WooCommerce-Template) in /wp-content/themes/mytheme/woocommerce/cart/cart.php. Es ist eine Kopie des Original-Woo-Templates. Ich gucke rein und sehe, daß die Löschfunktion mit esc_url(wc_g
et_cart_remove_url( $cart_item_key )…
gelöst wird. Ich baue daneben eine Edit-Funktion mit esc_url( $product_permalink ).“?edit_item=“.esc_attr( $cart_item[‚key‘] )… und übergebe den key. Unterhalb der Löschfunktion erstelle ich etwas in der Art:


echo apply_filters( 'woocommerce_cart_item_remove_link', sprintf('Bearbeiten',
esc_url( $product_permalink )."?edit_item=".esc_attr( $cart_item['key'] ),
__( 'Edit this item', 'woocommerce' ),
esc_attr( $product_id ),
esc_attr( $_product->get_sku() )
), $cart_item_key );

Der Link sieht so aus:


produkt/permalink/?edit_item=cc4dfe235de18d17fd11c3953d4a47d0

2.) Die Variable $edit_item steht für das Warenkorb-Item, das entfernt werden soll. Leider ist es mir nicht gelungen, den Key mit $_GET oder $_POST zu übergeben, deshalb verwende ich eine Session-Variable, die ich nach getanre Arbeit wieder lösche.

In der functions.php erstelle ich eine Funktion, die ddie Session-Variable erstellt:


function gw_edit_cart_item() {
$keytoremove = $_GET['edit_item'];
$_SESSION['keytoremove'] = $keytoremove;
}
add_action('woocommerce_after_single_product_summary', 'gw_edit_cart_item');

3.) So, erstellt. Jetzt brauche ich noch eine Funktion, die beim In-den-Warenkorb-legen des neuen Produktes das alte löscht. Und danach die Session-Variable. Ich mach das mit einer weiteren Funktion in der functions.php:


function gw_validate_add_cart_item( $passed, $product_id, $quantity, $variation_id = '', $variations= '' ) {
GLOBAL $woocommerce;
if ( isset ($_SESSION['keytoremove']) ) {
$keytoremove=$_SESSION['keytoremove'];
$passed = true;
$woocommerce->cart->remove_cart_item($keytoremove);
wc_add_notice( __( 'Produkt wurde aus dem Warenkorb entfernt', 'textdomain' ), 'notice' );
unset ($_SESSION["keytoremove"]);
}
return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'gw_validate_add_cart_item', 10, 5 );

 

4.) Jetzt sehe ich beim Produkt-Bearbeiten 2 Notices oben stehen:

„Produkt X wurde in den Warenkorb gelegt“
und
„Produkt wurde aus dem Warenkorb entfernt“

Das kann man sicher noch schöner machen…aber es funktioniert und macht genau das was es soll.

Freue mich über Anregungen und Ideen 🙂

Der GoogleMaps-Geocoder ist auch nicht mehr das was er mal war!

Ein Update zu meinem Artikel von neulich: „The Events Calendar“ mit OpenStreetMaps statt Google Maps.

Es hat quasi alles geklappt mit der im Artikel beschriebenen OpenStreetMap. Nur lagen manche Marker und Adressen extrem daneben, z.B. mitten in den USA, westlich von Sardinien im Meer oder auch in Zentralafrika. Dabei liegen die Orte eindeutig im schönen Rheinhessen. Was stimmt hier also nicht?

Das Problem trat sowohl auf der im ersten Artikel beschriebenen Events-Calendar-Seite als auch bei einer anderen WebSite auf, die die Adressen einfach aus einer selbst erstellten Dartenbank holt. Egal was man tut…es ist immer irgendwas nicht ok.

Offensichtlich ist es so, daß der Geocoder von Google Maps (also der Service, der aus einr Adresse Koordinaten macht) in letzter Zeit unzuverlässig geworden ist. Etwa seit Mai 2018, als dort zwingend Kreditkartendaten und strengere Regeln für die Benutzung eingeführt wurden (wieder ein Grund mehr, auf OpenStreetMaps umzustellen).

Deshalb habe ich folgende Lösung programmiert:

  • Ein neues Custom Field erstellt, und „latlng“ genannt.

Dazu muß man rechts oben im WP-Admin auf Optionen gehen und „Benutzerdefinierte Felder“ anwählen. Beim ersten Mal muß man „neues Feld“ auswählen und ihm den Namen „latlng“ geben. Beim nächsten Mal existiert latlng dann schon, das muß man dann in der Liste auswählen.

Links oben den Ort suchen. In der dann erscheindenden Karte die richtige Adresse lokalisieren, dann mit der rechten Maustaste dahin klicken und „Adresse anzeigen“ wählen. Jetzt erscheinen links die Koordinaten. Toll, gell?

  • Die Koordinaten komplett kopieren (etwa „49.7427,8.2378“), mitsamt dem Komma, und in das Feld latlng eintragen. Seite / Beitrag dann speichern.

Adresse stimmt jetzt, jetzt nur noch die Anzeige von Adresse auf Koordinaten umstellen, wenn dieses Feld gefüllt ist.

  • Die in der functions.php vorhandene Funktion, die den [leaflet-map]-Shortcode erzeugt, etwas erweitern.

Ich gehe mal davon aus, daß die Adresse bekannt ist, etwa in der Art oder so ähnlich:

$address .= $strasse." ".$hausnummer.", ".$plz." ".$ort;

dann wäre die Version mit funktionierendem Geocoder z.B. folgende:

$sc  = "[leaflet-map address='".$address."' tileurl='https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png' zoom=14]";
$sc .= ' [leaflet-marker address="'.$address.', DE" '.$icon.']';
$sc .= $address.'[/leaflet-marker]';

muß jetzt geändert werden zu

$latlng = get_post_meta($post->ID, 'latlng');
if ($latlng) {
$latlng = explode(",", $latlng[0]);
$sc = '[leaflet-map lat='.$latlng[0].' lng='.$latlng[1].' tileurl="https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png" zoom=14]';
$sc .= ' [leaflet-marker lat="'.$latlng[0].'" lng="'.$latlng[1].'" '.$icon.']';
$sc .= esc_html($address);
$sc .= '[/leaflet-marker]';
}
else {
$sc = "[leaflet-map address='".$address."' tileurl='https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png' zoom=14]";
$sc .= ' [leaflet-marker address="'.$address.', DE" '.$icon.']';
$sc .= $address.'[/leaflet-marker]';
}

Jetzt stimmts 🙂

„The Events Calendar“ mit OpenStreetMaps statt Google Maps

Ein sehr beliebtes Kalender-Plugin ist The Events Calendar…auch schon in der kostenlosen Basisversion wunderbar und meistens ausreichend.

Man kann auch automatisch Google Maps einbinden. Das kann aber datenschutzrechtlich problematisch sein, denn eingebundene GoogleMaps benutzen viele viele Cookies und viele Tracker, um den Besucher der WebSite zu identifizieren und nachzuverfolgen. Das sollte man abschalten!

Eine Möglichkeit, OpenStreetMaps statt Google Maps einzubinden sucht man vergeblich. Auch der Support vom Events Calendar ist da eher lustlos: „Danke für deine Anfrage. Im Moment machen wir ganz viele Sachen, und evtl. ist dieses Feature auch schon dabei. Ansonsten schreib das doch einfach auf die Wishlist. Wir melden uns bei dir wann wir uns dransetzen.“ Tja…das Thema ist seit 4 Jahren in der Wishlist, und niemand hat sich je drangesetzt.

Also…setze ich mich halt mal dran 🙂

  1. Zuerst braucht man natürlich einen installierten  The Events Calendar mit mindestens einer Veranstaltung, die eine Adresse hat („Schnitzelbacher Straße 77a, 66321 Schmutzweiler“ z.B.). Jetzt im Admin-Bereich beiVeranstaltungen -> Einstellungen -> Allgemein -> Karteneinstellungen -> Google Karte aktivieren -> ankreuzen.Klar, dann kommt jetzt eine GoogleMap, aber die ist auch gleich wieder weg.
  2. Jetzt das Plugin Leaflet Map installieren. Das bindet wunderschöne OpenStreetMaps ein, mit wählbarem Stil (Wasserfarben etc.) und ist ganz leicht mit [shortcode] steuerbar.
  3. Jetzt muß man dem Events Calender nur noch sagen, daß er einen anderen Atlas nehmen soll:
    1. Die Datei the-events-calendar\src\views\modules\map.php finden
    2. und so wie oben in der Datei beschrieben  ins Theeme-Verzeichnis kopieren
      [your-theme]/tribe-events/modules/map.php
    3. Jetzt nur noch im Code ein paar Zeilen ändern. Das hier:

      $style = apply_filters( 'tribe_events_embedded_map_style', "height: $height; width: $width", $index );
      ?>
      <div id="tribe-events-gmap-<?php echo esc_attr( $index ) ?>" style="<?php echo esc_attr( $style ) ?>" aria-hidden="true"></div><!-- #tribe-events-gmap-<?php esc_attr( $index ) ?>

      ändern in

      $address = tribe_get_address( $venue_id ).", ".tribe_get_zip( $venue_id )." ".tribe_get_city( $venue_id ).", ".tribe_get_country( $venue_id );
      $shortcode  = '[leaflet-map address="'.$address.'" zoom="15" fit_markers="1"]';
      echo do_shortcode($shortcode);
      ?>

Fertig 🙂 Wer will kann bei der Karte jetzt noch mit diversen Shortcodes Aussehen und Verhalten ändern…

DSGVO#5 – Cookie-Nervbox online erstellen

Wer ein modernes System wie WordPress hat, kann ja ganz einfach mit einem entsprechenden Plugin eine Cookiebox erstellen. Aber was ist mit Besitzern selbstprogrammierter Seiten, oder z.b. älteren CMS- oder Shopsystemen wie OScommerce?

Dafür gibt es jetzt eine einfache Lösung: https://cookieconsent.insites.com

Das Online-Tool generiert ein paar Zeilen Code, die dann einfach vor den schließenden </ head > eingeklebt werden, mit vielen vielen Möglichkeiten und Farben. Sehr empfehlenswert!

DSGVO#3 – Google-Fonts lokal speichern

Bei eingebetteten Google Fonts sollte das meiner Meinung nach in der Datenschutzerklärung erwähnt werden („Berechtigtes Interesse“), denn Google trackt ganz bestimmt IP-Adresse und Referrer (und wer weiß was nicht noch alles).

Man kann die Google Fonts aber auch lokal kopieren und damit das Tracking verhindern. Das geht so:

    1.  Nachsehen, um welche Fonts es sich handelt.Ich kann das ganz gut im Quelltext sehen, indem ich nach fonts.googleapis.com suche. Dann finde ich einen oder mehrere Links, die etwa so aussehen:
      http://fonts.googleapis.com/css?family=Architects+Daughter:400|Patua+One:400&subset=latin.
      Hier handelt es sich um die beiden Schriftart Architects Daughter und Patua One je mit einer „Dicke“ von 400 und dem Zeichensatz latin.

      Die müssen wir uns jetzt holen und lokal speichern. Dazu gibt es eine schöne Anleitung, es wird sogar ein Plugin erstellt, das wir dann bei uns hochladen können: https://www.news47ell.com/how-to/host-google-fonts-locally-wordpress/
    2. Jetzt müssen wir nur noch den früheren Aufruf der Fonts bei fonts.googleapis.com entfernen. Aber wo ist der versteckt?Hier stehen ein paar Möglichkeiten dazu:
      https://stackoverflow.com/questions/29134113/how-to-remove-or-dequeue-google-fonts-in-wordpress-twentyfifteen

      Bei Standard-Themes (Twentyfifteen etc.) scheint es auszureichen, den Font-Aufruf mit z.B.
      wp_dequeue_style ('twentyfifteen-fonts');
      auszubauen. (der 2. Link oben zu Stackoverflow, 1. Antwort)Wenn das nicht klappt: Es gibt ein Plugin, das genau das tun soll. Es heißt Remove Google Fonts ReferencesWenn das auch nicht klappt, würde ich den gesamten PHP-Code meines Themes (Child und Parent) nach „googleapis“ oder „fonts“ durchsuchen. Irgendwo ist da eine Funktion. Raus damit und // davorgesetzt.
    3. Nachsehen, ob der Aufruf zu fonts.googleapis.com im Quelltext verschwunden ist
    4. Wenn  nicht…ist vielleicht ein Caching-Plugin aktiv?
    5. Nachtrag zum Theme AVADA:
      Hier ist es etwas komplizierter. Die Fonts können wie oben beschrieben ausgebaut und lokal installiert werden, dann sind sie aber immer noch im Quelltext mit einer Google-Verlinkung sichtbar Was auch immer AVADA da tut, es ist (wie immer) kompliziert, umständlich und langsam. Meine Lösung ist, daß in den Avada-Schriftarten-Einstellungen die entsprechende Schriftart ausgewählt sein muß, die dann auch benutzt wird (und lokal gespeichert sein sollte).

DSGVO-Tips und Tricks

Hier erscheinen jetzt demnächst ein paar Dinge und ToDos und Fundstücke im Bezug auf die DSGVO, die für mich Sinn machen, und die ich so oder so ähnlich auch umgesetzt habe.

Das kann man keinesfalls als Rechtsberatung bezeichnen, denn ich weiß manchmal selbst nicht so genau, ob die Dinge, die ich umsetze, jetzt richtig oder falsch sind.

Im Bereich DSGVO und Datenschutz kann man derzeit eine große Verunsicherung und ein gefährliches Halbwissen feststellen, gepaart mit einer massiven Panik, je näher der 25.05.2018 rückt.

OK, ich fang dann gleich mal an.

  1. Google Fonts lokal speichern

WordPress schneller machen #2: Performance-Bremsen ermitteln

Guten Tach!

Im ersten Teil habe ich ein paar Tools vorgestellt, mit denen man eine WordPress-Seite schneller machen kann…man würde ihr sozusagen um 10:30h einen Kaffee bringen. Was aber wenn sie vor Trägheit noch nicht einmal aus dem Bett kommt? Ist sie vielleicht zu schwerfällig? Haben wir zuviele Plugins an Bord? (Aber ich brauche doch alle 47 davon!). Müssen wir mal nachsehen…

Eine Spurensuche mit Sherlock McWoyng.

P3 in Action

P3 in Action…früher mal…

P3 (Plugin Performance Profiler)

Eigentlich war dieses Plugin immer mein Favorit…man konnte genau sehen, welches Plugin wieviel Performance an sich reißt.

Nur leider funktioniert das ganze nicht mehr, zumindest nicht be mir…P3 scannt sich ausschließlich selbst, und mittlerweile erhalte ich nur noch PHP-Fehler. Im Support-Forum scheint niemand zu antworten. Schade.

Muß also eine Alternative her!

Alternative List

Ich suche eine Alternative zu P3 mit der Seite

Alternativen zu P3

Simple Debug

Nein, bringt mir leider nichts…ich sehe alle möglichen Informationen, aber kann nicht feststellen, welches Plugin die Site ausbremst. Also weitersuchen…

Performance Profiler

Bringt mir leider auch nichts. Schade.

Also gut…there is obviously no easy solution…also müssen wir tiefer graben. Fragen wir doch das Insekt unseres Vertauens:

Firebug

Firebug öffnen, Rechtsklick auf die Seite und „Element untersuchen“, dann „Netzwerk“, Seite neu laden und mal nachsehen.

Aha!

Ach nee!

Wow!

Man sieht, daß sich die Startseite mit Google Maps verbinden möchte…was sie aber gar nicht bräuchte, weil es auf der Startseite gar keine Karte gibt! und das kostet wertvolle (Milli-)Sekunden.

Muß ich in dem Karten-Plugin abschalten! Die Stelle finden, an der der Google-Maps-JavaScript-Code eingebunden wird, und dann eine Abfrage machen, damit auf der Startseite keine sinnlose Map-Abfrage stattfindet. Etwa in der Art von:

Vorher:
$binde_kartenlink_ein;

Nachher:
if ($seite_auf_der_ich_bin != "Startseite")
   {
   $binde_kartenlink_ein;
   }

Gut…das mache ich jetzt mal.

*ärmelhochkrempel*

Fortsetzung folgt…

WordPress-Theme übersetzen

Eine leichtverständliche Anleitung zum Übersetzen eines Themes.

  1. Das Programm Poedit downloaden und installieren: http://www.poedit.net/download.php
  2. Im Ordner des zu übersetzenden Themes /wp-content/themes/meintheme einen Unterordner languages suchen und die Datei default.po mit Poedit öffnen. Jetzt sieht man alle englischen Texte, die im theme verwendet werden.
  3. Die Texte übersetzen und danach speichern. Jetzt wird eine Datei default.mo erstellt. Diese Datei entsprechend den Sprachcodes umbenennen  Für Deutsch wäre das dann de_DE.mo. Man kann die Codes hier finden (unter WP LOCALE).
  4. Die Datei de_DE.mo in den Ordner /languages unseres Themes hochladen., also (vermutlich) nach  /wp-content/themes/meintheme.
  5. In der wp-config.php nachsehen, ob der WPLANG-Parameter gesetzt ist: define (‚WPLANG‘, ‚de_DE‘);
  6. Jetzt sollte das Theme eure Sprache sprechen.

Wenn bei Punkt 2 die Datei default.po nicht da ist, sondern eine default.pot-Datei…dann wirds etwas komplizierter. ..das erkläre ich dann später 🙂