Since I started in 2002, all iterations of portalZINE have been pure english content websites. You can read about the why on my services page.
I had potential customers in Germany complain about that a lot over the past few years. But your own website often suffers, while your customers get all the attention. That is how it is and how it should be!
Creating Multi – Language websites has been part of my services & portfolio for years, with an extreme application setup handling 13 languages in 2014 for the soccer world cup.
Multi-Language setups have come a long way and it was time to showcase that on my own setup as well. Not only to calm those potential customers, but to testdrive new functionality and possibilities on my own setup. portalZINE has always been my testlab for stability and new feature sets.
Most of my static pages are available in English and German now, the blog itself will remain pure English.
Need help setting up a multi language website, get in touch!
Cheers
Alex
I am taking a small easter break to join up with family and friends. We will have perfect weather up here in the north for the coming days.
I wish you all Happy Easter and many lovely days away from routine business life.
Enjoy
Alex
Merry Christmas,
enjoy your off-time with friends and family, as well as the transition into the new year. Looking forward to our work together in 2019.
Even during this small holiday break, I will be keeping an eye on things :)
Kind regards
Alex
ps. During the christmas holidays, baked apples are a must-have for me. Quick recipe below:
WooCommerce Appointments is a commercial booking plugin that allows you to setup appointments with WooCommerce. It has full integration into Google calendar to track appointments of your staff.
Staff availability can be set globally or via each staff members profile. While this is nice, I was looking for an option to actually handle availability via another Google Calendar as well. That was a must have feature for a current project.
What do you do, if that feature is not available yet ? You poke the code!
The magic entry point for the staff availability is the user meta “_wc_appointment_availability“, which is made available through includes/class-wc-product-appointment-staff.php.
A couple of weeks ago I asked support for a simple filter hook to alter the availability on demand from the outside.
The development team added the feature in one of the latest releases, making wc_appointments_staff_availability the entry point for my custom availability changes.
1 2 3 4 5 6 |
add_filter( 'wc_appointments_staff_availability', 'availability_callback', 10, 3 ); function availability_callback($availability, $staff){ // Your changes here return $availability; } |
You can either pull Google Calendar Events directly through the Google Calendar API or use the available iCal export option. In this quick example I will use the private calendar iCal export file.
Lets setup a quick clean calendar, called “Availability”. So simple and catchy :)
For this example I am using the PHP ICS Parser, but any other parser will do. Install it via composer: composer require johngrogg/ics-parser.
Lets create a quick little plugin to get us going and save it to /wp-content/plugins/CustomAvailability/smile.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php use ICal\ICal; /* Plugin Name: WooCommerce Appointments - Custom Availability Plugin URI: https://portalzine.de Description: Attach additional Google Calendar for staff availability Version: 1.0 Author: portalZINE NMN Author URI: https://portalzine.de */ require_once(PATH_TO_VENDOR_DIR."vendor/autoload.php"); class StaffCustomAvailability{ function __construct() { add_filter( 'wc_appointments_staff_availability', array($this, 'staffAvailability'), 10, 3 ); } function staffAvailability($availability, $staff){ // Your changes here return $availability; } } $StaffCustomAvailability = new StaffCustomAvailability(); |
Its time to get the data into the system. I am only pulling and altering the availability for one single user in this example, the user with the USERID “3”. This should provide you with a good starting point.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
function staffAvailability($availability, $staff){ // $staff holds the complete user data // $availability is the current set of rules // Only altering availability for USERID 3 if($staff->data->ID == 3){ $newSet = array(); try { // add the private ics file here $ical = new ICal('URL TO PRIVATE ICS FILE', array( 'defaultSpan' => 2, // Default value 'defaultTimeZone' => 'Europe/Berlin', 'defaultWeekStart' => 'MO', // Default value 'disableCharacterReplacement' => false, // Default value 'skipRecurrence' => false, // Default value 'useTimeZoneWithRRules' => false, // Default value )); } catch (\Exception $e) { die($e); } $forceTimeZone = true; $events = $ical->sortEventsWithOrder($ical->events()); // looping through all events foreach ($events as $event) { // Get Start and end date / time information $dtstart = $ical->iCalDateToDateTime($event->dtstart_array[3], $forceTimeZone); $dtend = $ical->iCalDateToDateTime($event->dtend_array[3], $forceTimeZone); // Define new time:range rule // Adding one rule per day // Added Friday to the calendar + event recurring 4 times, which results in 4 new rules for staff member 3 $newSet[] = array( 'type' => "time:range",// rule type used for this example 'appointable' => "yes", '[priority' => 10, 'from' => $dtstart->format('H:i'), // start time 10:00 'to' => $dtend->format('H:i'), // end time 16:00 'from_date' => $dtstart->format('Y-m-d'), // start date - Friday 'to_date' => $dtend->format('Y-m-d') // end date - Friday ); $availability = $newSet; } } return $availability; } |
The example pulls and parses the ics file on every load, use a transient or REDIS to store data and only refresh in certain intervals.
Hope this gets you started! I build a simple interface around it, with a lot of more rule options. This makes the setup for each staff member a brise. Now each of them can setup a calendar easily and provide me with the ics link :) WooCommerce Appointments rocks …
With Chrome 56, web apps can now communicate with nearby Bluetooth Low Energy devices using the Web Bluetooth API, position sticky is back – making it easy to create elements that scroll normally until sticking to the top of the viewport. And HTML5 by Default is enabled for all users.
Chrome 56 on iOS also adds the ability to scan QR codes directly within Chrome. So many thought QR-Codes were dead, well not so much !
Lakka is a lightweight Linux distribution that transforms a small computer into a full blown game console.
Built on top of the famous RetroArch emulator.
“The DxO ONE plugs directly into your iPhone with a simple click. Once it is connected, the iPhone’s Retina display immediately transforms into the camera’s viewfinder, allowing you to compose the image and adjust every setting.”
Really love the concept, even though I am an Android phone user through and through :)
“Epichrome is made up of two parts: an AppleScript-based Mac application (Epichrome.app) and a companion Chrome extension (Epichrome Helper). Epichrome.app creates Chrome-based site-specific browsers (SSBs) for Mac OSX (Chrome must be installed in order to run them, but they are full Mac apps, each with its own separate Chrome profile).”
Markdown Here is an extension for Chrome, Firefox, and Thunderbird that allows you to write email in Markdown.
“With it, you can write email in Markdown, and then click a button (or context menu item, or use a hotkey) to render the email into good-looking, fully formatted text (HTML, technically).”