YITH WooCommerce Custom Order Status funktioniert nicht unter PHP8? Doch!

Ich sollte wieder mehr BeitrĂ€ge schreiben. Gelegentlich liest das jemand und kann damit sogar was anfangen 🙂

Also gut…was gibt’s heute?

Nach Umstellung auf PHP8 funktioniert das YITH WooCommerce Custom Order Status-Plugin nicht mehr?

Das ist ganz einfach zu beheben. Gut wenn man ein Error-Logfile hat oder Fehler direkt angezeigt bekommt, denn da steht dann etwa das hier:

Deprecated: Array and string offset access syntax with curly braces is deprecated in /wp-content/plugins/yith-woocommerce-custom-order-status/plugin-fw/lib/yit-plugin-gradients.php line 443

Das bedeutet, daß es ab PHP8 verboten ist, ArrayElemente mit geschweiften Klammern anzusprechen, und das ist hier der Fall:

Das hier:

$base[‚R‘] = hexdec( $color{0} . $color{1} );
$base[‚G‘] = hexdec( $color{2} . $color{3} );
$base[‚B‘] = hexdec( $color{4} . $color{5} );

muß ersetzt werden durch das hier:

$base[‚R‘] = hexdec( $color[0] . $color[1] );
$base[‚G‘] = hexdec( $color[2] . $color[3] );
$base[‚B‘] = hexdec( $color[4] . $color[5] );

 

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 🙂

7 Tips, wie man seinen Webmaster verliert

(Inspiriert von hier, ĂŒbersetzt und erweitert)

  1. Geben Sie verwirrende, unklare und knappe Anweisungen und lassen Sie den Webmaster rÀtseln, was das zu bedeuten hat. Nachfragen lassen Sie aus Zeitmangel nicht zu. Wenn er alles richtig gemacht hat, sagen Sie gar nichts. Wenn er etwas falsch gemacht hat, machen Sie ihn zur Sau, schieben Sie ihm die gesamte Schuld in die Schuhe und drohen mit Ihrem Anwalt.
  2. Obwohl Sie keine Ahnung vom Internet haben, sollten Sie immer darauf bestehen, daß Ihr Webmaster die Dinge genauso umsetzt, wie Sie das wĂŒnschen, anstatt so, wie er das fĂŒr Ihre Website fĂŒr richtig hĂ€lt.
  3. Handeln Sie zu Anfang stark um den Preis und deuten FolgeauftrÀge an. Feilschen Sie danach aber auch um jede Viertelstunde der FolgeauftrÀge.
  4. Verlangen Sie regelmĂ€ĂŸig Extra-Arbeiten…mal eben schnell hier was machen…und dann noch hier…und seien Sie stinksauer, wenn Sie die Zeit dafĂŒr auf der Rechnung wiederfinden.
  5. Wenn der Webmaster fragt, was Sie auf Ihrer neuen WebSite gerne selbst Ă€ndern möchten, sagen Sie „alles!“. Wenn das stark modifizierte Content-Management-System fertig ist schicken Sie ihm aber trotzdem alle Änderungen als mehrseitiges DOC oder PDF zu und verlangen, daß er das fĂŒr Sie Ă€ndert.
  6. Lassen Sie ihn viel Zeit mit der Beantwortung Ihrer Anfragen verbringen (z.B. fĂŒr Geschwindigkeits-Optimierung, SEO, AdWords, das richtige Plugin unter 67 verschiedenen Möglichkeiten etc.), sagen Sie „Danke“, wenn er das Ergebnis ausfĂŒhrlich prĂ€sentiert, aber sonst auch nichts.
  7. Lassen Sie sich fĂŒr jeden kleinen geplanten Vorgang eine genaue ZeitschĂ€tzung geben. Dann gehen Sie zu Ihrem Ex-Programmierer oder jemandem aus Ihrer Verwandschaft („der 14-jĂ€hrige Sohn vom Schwager kann auch Internet“), fragen Ihn was er dafĂŒr nehmen wĂŒrde, und danach prĂ€sentieren Sie diese Zahl Ihrem Webmaster.

 

…Fortsetzung folgt…

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#4 – NĂŒtzliche Plugins

Hier noch ein paar sinnvolle Plugins zur DSGVO:

  1. WP GDPR Compliance
    Erstellt Checkboxen und Infotexte neben Kontaktformularen
  2. Disable Comments
    Überall die Kommentarfunktion entfernen
  3. Ginger – EU Cookie Law
    Erstellt eine Cookie-Nervbox und blockiert auch tatsĂ€chlich viele Cookies, wenn der Benutzer auf „Nein“ klickt
  4. Antispam Bee
    Perfekter Ersatz fĂŒr das datenschutzkatastrophale Akismet.
    Es mĂŒssen bei der Biene nur die 3 Optionen links unten abgewĂ€hlt werden.
    Ich habe zusĂ€tzlich noch (links mitte) „“ deaktiviert…man weiß ja nie…

DSGVO#2 – Emojis und Gravatare entfernen

In WordPress 4.x (ich glaube 4.2) sind Emojis hinzugekommen. Die befinden sich auf einem zentralen Server.
Sind schnell ausgebaut: In die functions.php folgendes eintragen:

/* Entfernt die Emojis/Scripte/Styles im Frontend */
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );

/* Entfernt die Emojis/Scripte/Styles im Backend */
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );

Gravatare werden zentral ĂŒber einen Server von Automattic zusammengefĂŒhrt. Datenschutzrechtlich auch sehr bedenklich.
Sind aber auch schnell deaktiviert:

Einstellungen -> Diskussion: unten den Haken bei „Avatare benutzen“ wegmachen und speichern.