Migrating a WordPress Site to SpinupWP the Easy Way

The wonderful folks at Delicious Brains made SpinupWP available to the general public in May of 2019. Since everything that comes out of Delicious Brains is top notch, SpinupWP caught my eye – but there is a certain inertia that affects some of us (me) when it comes to moving sites between hosts (bit of a misnomer in this case)…so I put it off until I couldn’t bear the poor performance and support of my current web host anymore and thus I gained some ertia.

Launching a new site using SpinupWP was fairly simple and the performance was impressive! My ertia was ready to migrate my existing sites until I saw the official migration guide from SpinupWP. The steps are sysadmin’ish (nothing wrong with that), involve a number of manual and time consuming actions, and I would need to repeat them for each site I wanted to move.

My ertia inertia’ed again and I decided to stick with my current host – until their Varnish cache kept failing (even after they “fixed” it) every few minutes resulting in every site visit hitting the database. I still wasn’t ready to go through the monotonous toil involved in following the official migration instructions repeatedly, so I struck out to find a simpler way–and I’m here today to share it with you!

When To Use This Guide

The SpinupWP site migration guide offers a number of best practices which should be utilized by high traffic / high importance sites. This guide is best utilized by individuals running small or medium traffic sites where a brief period of downtime will not be an issue and where time is a more precious commodity than robust process.

I hope this guide will be particularly useful to individuals without a technical background who are running / managing WordPress sites. To this end, I have included a copious number of screenshots and have attempted to be meticulous in recording even the smallest steps involved in this process.

Assumptions

You will already need to have a SpinupWP account created and have spun up a server, see the official Getting Started documentation for information on how to do so.

You will also need to follow SpinupWP’s directions for setting up transactional emails assuming you do not already have a solution in-place.

Warning: Many web hosts offer email servers as part of their platform. SpinupWP does not (for good reason). You must setup a transactional email solution if you want any emails to be sent by WordPress (e.g registration, comment notification, password reset).

High-Level Overview

Before we dive into the weeds, lets take a quick look at the major steps you’ll be undertaking to migrate your existing site to SpinupWP using my “expedited” process:

  1. Create a New Site on SpinupWP.
    1. Update TXT records with your Domain Name Server (DNS).
  2. Use the freemium plugin UpdraftPlus to create a backup of your existing site.
    1. Sidebar: Using Local Storage.
    2. Sidebar: Using Remote Storage.
    3. Sidebar: Cleaning Up WP.
  3. Modify your computer’s host file to use your new site.
  4. Restore the backup taken earlier using UpdraftPlus to your new site.
  5. Add SpinupWP and Limit Login Attempts Reloaded plugins to your new site.
  6. Update DNS records with your Domain Name Server (DNS) to point to your new server.

Create a New Site on SpinupWP.

Login to your existing SpinupWP account.

Screen Shot of SpinupWP Login Page

Choose “Add Site”

Note: If you are like me, your eyes are drawn to the big pinkish button “Spin Up a New Server” and don’t immediately see an option to “Add Site”. Look underneath the pink button to find the white “Add Site” button.

SpinupWP Dashboard Screenshot

You are now in the “New Site Wizard” and will setup your “Domains”.

Screenshot of SpinupWP Add Site Domain Wizard

Ensure that “Enable HTTPS (SSL/TLS certificates)” is checked and enter the domain name of the site you are migrating to SpinupWP. Usually you’ll be making two entries on this page – mydomain.com and www.mydomain.com – where domain is the name of your site and .com is the top-level domain (TLD, e.g. .com, .net, .org).

Click Next. You will are now asked “Are you ready to point your domains at this server?” The answer is “No” – for the time being we want visitors to mydomain.com to continue going to the old host and not to SpinupWP.

Screenshot of SpinupWP Add Site DNS Wizard

Click Next. You’ll be shown two sets of TXT records you need to add to your domain name server (DNS). Oftentimes your DNS is the same as your Domain Registrar. For the sake of this example (and because I think they are awesome) we’ll be using Cloudflare as our DNS.

Sidebar: Configuring DNS Records with Cloudflare

Open a new tab in your browser and go to Cloudflare’s site. In the header menu you should see a “Log In” option to the left of “Sign Up” and a big orange “Under Attack?” button, click on “Log In”.

Screenshot of Cloudflare Login Window

After logging in you will be presented with the domains you have registered with Cloudflare.

Screenshot of Cloudflare Dashboard

Click on the appropriate domain and you’ll be brought to the Cloudflare Domain Dashboard.

Cloudflare Domain Dashboard Screenshot

Towards the top of this page you will see a number of blue and white buttons – Overview, Analytics, DNS – ahh, that’s the one! Click!

Cloudflare Domain Dashboard DNS Screenshot

You’ll want to add two records. Click on the blue “Add record” button.

Cloudflare DNS Add Record Screenshot

You’ll change the Type of the record to TXT and then copy from your SpinupWP tab the top left column’s content into Name. Leave TTL as is and copy into Content from the SpinupWP tab top-right column. Click Save.

Repeat this step again for the second TXT record, this will be on the SpinupWP tab and you’ll be using the bottom left column for Name and the bottom right column for Content. Click Save.

Once you’ve added these records they should now appear in Cloudflare, something like this:

Cloudflare DNS Records Added Screenshot

End Sidebar, Resume SpinupWP Site Setup

Great work! Go back to the SpinupWP tab and click the pink “I’ve Updated the DNS” button.

Screenshot of SpinupWP Add Site TXT Records Wizard

SpinupWP will check the new records have been added and show a successful confirmation message:

SpinupWP Add Site Wizard DNS TXT Records Confirmed Screenshot

Click Next. You’ve now completed the Domains step of the New Site wizard and moved on to Installation.

SpinupWP Add Site Wizard Install Software Screenshot

Click on WordPress and ensure the checkmark appears next to it. Then click on Next.

You’ll now need to provide some information to SpinupWP about this particular instance of WordPress. Note that the Title, Admin Username, and Admin Password will all be overwritten once you restore your site to this WordPress instance later in this process.

Note: Make sure you copy down the username and password, you’ll need these until you restore your site.

SpinupWP Add Site Wizard WordPress Prompts Screenshot

Click Next.

Congratulations! You’ve left the Installation section of the New Site Wizard and are now working with the Database section.

SpinupWP Add Site Wizard Database Screen Screenshot

You’ll be creating a new database. Note that the database name, username, password, and table prefix are not overwritten when you restore your site later with UpdraftPlus, so make sure you use sensible names and save them somewhere safe!

Note: If the database you restore uses the wp_ prefix then SpinupWP retains their unique prefix, but this is only if you are using the wp_ prefix.

Click Next. Almost done!

SpinupWP Add Site Wizard Settings Screenshot

Choose a logical user name for your site. This is the Linux user name that runs the processes and owns the files on your server.

Unless you have a reason to do otherwise, choose the latest stable release of PHP (currently 7.4) and enable the full page cache. Then Click Next!

You’ll be presented with the Confirmation Wizard page. I’ve split it into two screenshots below.

SpinupWP Add Site Top of Confirmation Screenshot

Review the listed settings. They should match what you’ve entered throughout the wizard.

SpinupWP Add Site Wizard Bottom of Confirmation Screenshot

Ignore the Site Migration Guide note and click “Add Site”.

Wait a second, what is this? Did I fail to setup the site? It seems as if I’ve been dropped into a similar site setup wizard?

SpinupWP Settings Page After Using Add Site Wizard

No, you’ve successfully created the site, unfortunately the SpinupWP dashboard for your new site is confusingly presented. Click on Back to Server on the top left to feel better.

Using UpdraftPlus to Create a Backup

Now that we have a brand new WordPress install setup on SpinupWP we can actually get to work. Log in to your existing WordPress site and install the freemium UpdraftPlus plugin:

Plugins –> Add New –> Search for “UpdraftPlus” –> Install –> Activate

Once the plugin is activated it can be accessed under:

Settings –> UpdraftPlus Backups –> Backup/Restore Tab.

UpdraftPlus Dashboard Screenshot
  1. Click on the Big Blue “Backup Now” button. A modal window will open.
  2. Make sure you have checked off “Include your database in the backup”, “Include your files in the backup”
  3. If you have configured (see sidebar below) remote storage, ensure “Send this backup to remote storage” is checked.
  4. Click “Backup Now” at the bottom right of the modal window.

You’ll be returned to the main UpdraftPlus page and you’ll be able to watch the progress of the backup. It should look something like this:

UpdraftPlus Backing Up Screenshot

Once the backup has completed you’ll see the Existing Backups section has files relating to your recent backup:

UpdraftPlus Existing Backups Screenshot

If you are using remote storage you are all set!

Sidebar: Using Local Storage

If you don’t want to setup remote storage, UpdraftPlus will save the backup files to your current host. You can then download your backup files to your computer and then upload them later to the new site.

In order to download the files you need to:

  1. Click on the button representing each type of backup data: Database, Plugins, Themes, Uploads, Others.
  2. On the same page will appear an option to download files of a specific data type. You need to click on each file and download it to your local computer.

Note: If your site is large UpdraftPlus will break the data across multiple files. For each file listed you’ll need to click on it to download. If there are three files listed under Database you’ll need to click on each individually (another perk to using remote storage).

Sidebar: Using Remote Storage

UpdraftPlus can save your backups to your local web host or a number of remote storage options. Click on the Settings tab to the right of the Backup/Restore tab to configure remote storage.

UpdraftPlus Settings for Storage Screenshot

Consumer level storage options include Dropbox, Google Drive, and Microsoft OneDrive. If you use one of these services I’d recommend using an account dedicated only to backups, separate from the account you use daily. If your site is compromised (hacked) in the future you don’t want the hackers to gain access to your files as well!

For more business oriented options Amazon S3, Microsoft Azure, and Google Cloud are available.

Select your desired remote storage provider and then Save at the bottom of the page.

You’ll be prompted to authenticate (login) to your storage provider. Once you’ve done so, UpdraftPlus will be able to backup files to and restore files from your remote storage.

Sidebar: Cleaning Up WP

Over time WP has a tendency to collect garbage. Themes we’ve forgotten to delete, plugins we no longer use, database tables or entries that are irrelevant. To speed up your site migration you can eliminate some of these files/data and thus decrease the time it takes to backup and restore.

Warning: I’d recommend taking a bloated backup first (before you make any changes!). It is far too easy to accidentally delete something you actually need.

Go through the following steps to clean things up:

  1. Check under Appearance –> Themes for unused themes and remove.
  2. Check under Plugins –> Installed Plugins for unused plugins and remove.
  3. Install the Advanced Database Cleaner (ADC) plugin and use it to scan for garbage entries in your database and remove.
  4. Use ADC’s Table tab to remove garbage tables.
  5. Use ADC’s Table tab Optimize option to reduce the size of your db tables.
  6. If you are looking for a nightmare, try cleaning up the media library.

Modifying Host Files

Next we need to “restore” our site to the new WP instance we’ve created on SpinupWP. To make this easy lets change our host file so that the IP address of our SpinupWP site is set as the location of our mydomain.com.

I’ve included brief instructions on modifying your host file below. If the instructions don’t work for you, see this more exhaustive article on configuring hosts files by How-To Geek.

Windows

  1. Click on Start
  2. Begin typing “notepad”
  3. When the “Notepad” app appears as an option, right-click on it and choose “Run as administrator”.
  4. When prompted, allow it to run as administrator.
  5. In Notepad go to File –> Open
  6. Navigate to and open: c:\windows\system32\drivers\etc\hosts

macOS/Linux

Open Terminal and enter the command: sudo nano /etc/hosts

General Instructions

You’ll add a record to this text file that looks something like this:

172.217.165.142 mydomain.com

The IP address is on the left and the domain of the site you are moving is on the right. You can find your site’s new IP address in SpinupWP.

Save the File.

What Is Happening Here?

Normally when we visit a website our browser contacts a DNS server which provides the IP address for the site we want to visit. When we add a record to our hosts file we tell our computer not to use the DNS record but instead to use the information in our host file.

If you’ve made this update to your host file, when you navigate to mydomain.com you should now see your new WordPress instance and not your existing site.

IMPORTANT: You will probably need to close your browser and reopen it before this will work. It seems browsers cache the IP address.

Restore the UpdraftPlus Backup to Your New Site

With your host file updated, use your browser to visit your new sites administration page (e.g. mydomain.com/wp-admin).

Note: You’ll login with the credentials you created while adding the new site (via SpinupWP’s Add Site Wizard), not the credentials for mydomain.com you use regularly on your site.

Once logged in you need to install UpdraftPlus on this site:

Plugins –> Add New –> Search for “UpdraftPlus” –> Install –> Activate

Next we’ll navigate to the UpdraftPlus dashboard:

Settings –> UpdraftPlus Backups

Using Remote Storage

If you used remote storage to perform the backup on your old site you can restore from this remote storage to the new site.

  1. Click on the Settings tab.
  2. Under Remote Storage choose the same storage option you used previously.
  3. Click Save and then authenticate with the same credentials you used previously.
  4. Click on the Backup / Restore Tab.
  5. Under Existing Backups click on “Rescan remote storage”.
Updraft Plus Existing Backups Screenshot

After a minute or two you should see the backup you created earlier listed under Existing Backups. (Wife’s Editorial Comment: this would be a good time to get a snack).

Using Local Storage

If you used local storage and downloaded the backup files to your local computer you’ll need to upload them to the new site before they can be restored.

  1. Under Existing Backups choose Upload backup files
  2. Select all the backup files you want to upload.

After a moment your backup should appear under Existing Backups.

UpdraftPlus Existing Backups Screenshot

Performing the Actual Restore

Once you have your backup files loaded into UpdraftPlus you can click the Restore button under Actions. This will launch a restore wizard:

UpdraftPlus Restore Wizard Screenshot
  1. Ensure that all the available components are checked: Plugins, Themes, Uploads, Others, and Database.
  2. Click Next.
  3. You’ll be presented with the option to exclude some tables from the restore – don’t.
  4. Click the Restore button.

Rare Problem: If, for some reason, your WordPress database tables don’t have a prefix, UpdraftPlus will restore the tables but they will not be accessible. You either need to add a prefix to your database tables before making the transfer or after. I hope to write a separate article explaining how to accomplish this soon.

UpdraftPlus Performing Restore Activity Log Screenshot

UpdraftPlus will present a nice window informing you of all the activities it is taking. If successful you should eventually see a big green checkmark next to “Restore successful!”.

  1. Click on Return to UpdraftPlus configuration.
  2. You may be booted out to the WordPress login page.
  3. If you aren’t automatically booted, log out of WordPress.
  4. Log back in (mydomain.com/wp-admin) using your old site’s username and password.

Remember: When you restored the old site to your new site you overwrote the username and password you created while adding the site to SpinupWP. You’ll use your username/password from the old site going forward.

Add SpinupWP and Limit Logins Reloaded Plugins

SpinupWP automatically adds the SpinupWP and Limit Logins Reloaded plugins when you add a new site. By restoring an UpdraftPlus backup you have deleted these plugins.

  1. Go to Plugins –> Add New –> Search for “SpinupWP”
  2. Install –> Activate.
  3. Go back to Plugins –> Add New –> Search for “Limit Logins Reloaded”
  4. Install –> Activate.

That was easy!

Update Your DNS Server

Okay, to be honest, we aren’t just updating the DNS server. There are a few related steps we’ll be taking as well, but I promise they’ll only take a minute!

  1. You want to visit your site and make sure everything looks/works as expected. You could spend a lot of time here, that’s up to you.
  2. Once you’ve confirmed the site is working properly you should comment out the line we added earlier to your hosts file. The result should look something like this: # 172.217.165.142 mydomain.com
  3. Now you can go update your DNS records. You’ll be replacing the IP address in your mydomain.com and www.mydomain.com records with that of your new site’s IP.
  4. Close out your browser and reopen it (or use another browser). You want to make sure the browser is not still using the IP you set in the host file.

Load up your site, it should be nice and snappy on SpinupWP’s service. Congratulations! You’ve successfully migrated your site to SpinupWP.

Remember: You need to setup transactional emails separately.

Tip: Make sure you remove any unnecessary plugins once you’ve migrated to SpinupWP, this includes any caching plugins you may have been using on your previous host.

When You Get an Invalid Default Value Error While Changing Your MySQL Engine on a Table from MyISAM to InnoDB

Instructions on overcoming a default value error when attempting to convert a MyISAM table to InnoDB.

Recently I noticed one of my older WP site still had some MyISAM tables. These days most folks are running InnoDB due to its advantages over MyISAM. If your WP database is using MyISAM you should probably update to InnoDB as well (ummm, make sure there isn’t some reason you need to stay on MyISAM first!).

Changing the engine for a table should be fairly simple:

ALTER TABLE dbname.prefix_users ENGINE=InnoDB;

But when I tried this I received an unfriendly error about an “Invalid Default Value” in a datetime column.

Ends up MySQL is now more strict in what it allows in a datetime field and it doesn’t like values of all zeroes. An easy way to fix this is to temporarily disable this strictness when running our query. This is controlled in our sql_mode. To get the current values of your MySQL sql_mode:

SELECT @@sql_mode

You want to remove from this list NO_ZERO_IN_DATE and NO_ZERO_DATE. To do this we will use

SET sql_mode = '<listofvalues>';

Replace <listofvalues> with the results of your SELECT @@sql_mode above making sure to remove NO_ZERO_IN_DATE and NO_ZERO_DATE from the list.

You should end up with something like:

SET sql_mode = 'IGNORE_SPACE,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

Put this before your ALTER TABLE statement and this time when you execute the command it should succeed. In sum, you should be running a query that looks something like this:

SET sql_mode = 'IGNORE_SPACE,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
ALTER TABLE dbname.prefix_users ENGINE=InnoDB;

Hope this helps someone else who finds themselves in the same situation!

Selected Bibliography

Headless WordPress

For step-by-step instructions on using WordPress as a headless back-end with Gatsby as the front-end see the GitHub repo

Interesting Note: We’ll be looking particularly at static site generators (SSGs) of which Matt Mullenweg is not a fan.

What is Headless?

  • Some confusion regarding terms due to inconsistent use within community (which tends to happen):
    • In a generic sense, “head” is the front-end (UI) of a site (do we actually use it that way?) so “headless” is a site without a front-end.
    • “Headless” sites have existed in the WordPress ecosystem using the REST API.
    • More recently, the term has been used in association with Static Site Generators (SSG’s) such as Gatsby, where WP serves as the back-end (“headless”) and Gatsby serves as the front-end (“head”).
    • While other languages (Go: Hugo, Ruby: Jekyll) provide SSG’s, the most popular are in JS and these are often referred to as using the Jamstack (JavaScript, API, Markdown).

Why Use Headless?

  • Performance Gains
  • Scalability
  • Reduced Cost (at scale)
  • Security Improvements
  • Decoupled UI
  • Use Latest JS Frameworks
  • Separation of Concerns (SoC)

Downsides of Headless

  • Now maintaining two separate sites – WP back-end and front-end.
  • The complexity of front-end frameworks (e.g. React) reduces productivity in the short-term.
  • Loss of plugin functionality (most WP plugins won’t work in a static environment).
  • Must be rebuilt every time a change occurs.
  • Takes a long time to build (depends).

WP Plugins for Generating Static Sites

WP Static Hosts

WPGraphQL

Learning More

Resources

Questions

  • WP Search? wp-search

Things I’ve Learned Using Flywheel Local

Where Local Lives on Windows

All sites are installed in a Local Sites folder at a path something like C:\Users\username\Local Sites.

The software itself is installed at:

C:\Program Files (x86)\Local\

You can find the component server software used by Local in the extraResources subdirectory. nginx, php, mysql, mariadb, and mailhog are yet one level deeper inside lighting-services.

Within the specific server software folder you’ll probably need to find the desired binary (e.g. if you are confusing a code editor). For me this looks like: \php-7.3.5+6\bin\win64\php.exe.

Note, however that you’ll want to edit the configuration files inside of your specific Project within Local Sites. For example, php.ini can be edited at \Local Sites\nameofsite\conf\php\php.ini.hbs.

Why .hbs? This seems to be the extension for Handlebars Templates and while I normally think of Handlebars being for templating code it apparently can also be used in config files, thus allowing for dynamic values in Local’s config files.

Turning Off PHP Debugging for Local

~/Local Sites/nameofsite/conf/php/php.ini.hbs

Change display_errors = On to display_errors = Off.

Configuring Local to Work with Composer

  • Composer won’t detect Local’s PHP by default, need to navigate to it manually. Path should be something like: C:\Program Files (x86)\Local\resources\extraResources\lightning-services\php-7.3.5+6\bin\win64\php.exe.
    • Don’t allow Composer to setup php.ini file.
  • I’ve been unable to get Composer running with Local with either the Windows Composer installer (see towards bottom of page) or the manual method. The problem appears to be that the local provided PHP binary was compiled without SSL support.
    • Unfortunately, it isn’t as easy as passing an o

What Local Is

  • Local, under the hood, appears to be a fairly straightforward XAMP setup (where X is Windows, Linux, or MacOS). Don’t get me wrong, the UI layer is beautiful and overall its wonderful to worth with.
  • The UI is an Electron app (similar to Slack).
  • It uses the Handlebars Templating language in config files (as mentioned above).
  • It utilizes Google’s SwiftShader, a “high-performance CPU-based implementation of the Vulkan, OpenGL ES, and Direct3D 9 graphics APIs.”
  • In addition to the fundamental packages of nginx (web server), PHP (language server), and MySQL/MariaDB (database servers) it bundles the following with the install:
    • 7-Zip – For managing compressed files
    • Adminer – A database management interface (not sure why phpmyadmin isn’t included instead, I find the latter more intuitive/powerful)
    • WP-CLI – for command-line WP management
    • WP Engine DevKit – not exactly sure how this factors in yet, its tooling from WP Engine for working with WP
    • Mailhog – catches all mail sent by WP and allows you to review it
    • ngrok – allows for sharing of one’s local dev server quickly and easily
      • This worked very well for me!
    • Cygwin – allows one to run some generally Linux native applications
      • rsync – copying/syncing/moving files
      • ssh – SSH duh 🙂

Why I’ve Decided to Stay with VVV…for now…

I’ve used a wide variety of local dev environment solutions. From WAMP to Docker to Vagrant they have all had their benefits and limitations. I don’t expect to find the perfect solution.

The one I’ve been using for perhaps a year now is VVV, which uses Vagrant under the hood. There are challenges with using it but I’m fairly comfortable with it and at the moment the limitations of Local are too significant for me to make the switch.

FWIW, I’ve outlined the salient issues below:

  1. Closed Source – Local, unlike most other local dev solutions, is closed source. I’m not against using commercial software but being oss is generally a boon, imho.
  2. Premium – Most other local dev solutions are also free. Local’s basic version comes for free but they have a premium version that costs $20/mo. This makes more uncomfortable than a solution that is premium only. freemium’s have a tendency to move basic functionality from the free edition to the premium edition when they don’t see the desired uptake of their premium edition. I’m not saying that will happen with Local, only that it makes me nervous.
  3. Speed – While theoretically Local should be faster than virtual options I haven’t found this to be significantly true. VVV is no speed demon in my experience, but neither is Local. Whatever small amount of performance I might gain isn’t worth the cost in migrating to Local.
  4. Native – In general I prefer my tools to be as portable and self-contained as possible. This means I favor solutions that use virtualization technologies under the hood…Local used to but has now adopted a native approach. Since 3 doesn’t seem to be a huge win (at least for me), 4 becomes a bigger problem.
  5. Compatibility – This is actually the nail in the coffin for me. All of the others I could probably live with but the inability to use certain core development tools with Local (on Windows) just doesn’t work. Specifically, I have been unable to discover how to get Composer working with Local.

Making an Easy Mistake with the gatsby-source-wordpress Plugin

Maybe no one is like me, but I’ve tripped over this same mistake several times now and hope I can spare you the trouble.

In order to configure Gatsby to work with WordPress you use a Gatsby (not WordPress) plugin called gatsby-source-wordpress. You can then write a GraphQL query to pull data from your WordPress site.

Try running gatsby develop and you may run into the same errors I encountered.

ERROR #85923 GRAPHQL
There was an error in your GraphQL query:
Cannot query field "allWordPressPost" on type "Query".

ERROR #98123 WEBPACK
Generating development JavaScript bundle failed...
Cannot query field "allWordPressPost" on type "Query".

The likely reason Gatsby is throwing these errors is because you used allWordPressPost in your query instead of allWordpressPost. See the difference? In Gatsby you DON’T capitalize the letter p.

Its that simple…and yet that makes it all the more easy to overlook.

What’s Changing with Directories Pro Beta?

A Brief Introduction

Sabai Apps makes a Directories Pro development version available. The current version (as of 9/24/18 EST) is 1.2.0-dev77.

They provide the commits from git, but this can be a bit messy to read…and I find writing things down helps me solidify things in my memory. Since I’m already writing it down for my own purposes (to solidify in memory, to familiarize with code, to be able to return to later), I figured I’d share it with anyone else who might be interested (yes, is that 1 other person I see?!).

I should note that while I think these are cleaner/easier to read that the original git commit logs they are also limited in their own ways:

  • I’ve probably mixed things up somewhere, maybe multiple somewheres.
  • I don’t provide full file paths and sometimes there are multiple files with the same name in different paths (I assume from context which one is being referred to can be discerned, or that one can refer to the git commit log).
  • I sometimes choose to skip over items (e.g., spelling corrections, but also things I find for whatever reason less relevant).
  • I often don’t list JS files that have changed, only the PHP files.
  • I’m only providing notes on some of the plugin components in Directories Pro (e.g., no payments), so notes are incomplete.
  • Sometimes (like with dev72) not all of the commit logs are loading, so I can only provide partial updates.

Understanding these limitations, I still think you can get a pretty good idea pretty quickly of what is going on. For those interested in reading the original git commit logs:

2018

September

  • 23rd
    • Added BuddyPress activity support to listings/reviews and its comments. (ContentTypesHelper)
    • Moved BNFW related functions to a helper class. (BnfwHelper)
  • 22nd
    • Prefix Directories admin notice messages with [directories]. (Platform)
    • Add rel=”noopener” to links with target=”_blank”. (UserIdentityHtmlHelper, DefaultRenderer, WhatsAppRenderer)
    • Added check if directory exists. (TemplateElement)
    • Refactoring code. (OptionsField)
    • Add link to location API registration sites. (AlgoliaAutocompleteApi, GeoNamesTimezoneApi, MapboxGeocodingApi)
  • 21st
    • Output log messages while importing. (WPAllImport/Importer)
    • Fixed global Exception instances not being caught (LocationCSVImporter).
    • Refactored code. (LocationCSVImporter, ApiHelper)
    • Ensure geocoding API returns 2-character uppercase country code. (GoogleMapsGeocodingApi, MapboxGeocodingApi, NominatimGeocodingApi)
    • Fixed invalid timezone API request URL. (GeoNamesTimezoneApi)
    • Fixed CSV importer/exporter not handling Timezone column. (LocationCSVExporter, LocationCSVImporter)
  • 20th
    • More code for WP All Import add-on. (EntityImporter, FieldImporter, IWpAllImporter, MapImporter, SocialImporter, WPImporter, Import, functions.php, LocationCSVImporter, LocationComponent)
    • No longer stops processing video field when fetching thumbail has failed. (VideoType)
    • Refactoring. (RangeType)
    • Do not show time selection field. (FeaturedFieldWidget)
    • Moved payment CSV import/export classes to directories-payments plugin. (CSVComponent, PaymentExporter, PaymentImporter)
  • 19th
    • More code for WP All Import add-on. (FieldImporter, MapImporter, WordPressContentComponent, EntityImporter, SocialImporter, WPImporter, WPAllImport/Importer)
    • Allow passing custom setting value for each search form field. (FormHelper).
    • Bump version. (FieldImporter)
    • Fixed taxonomy term page not showing correct content on certain occasion. (Platform)
  •  18th
    • Refactoring Display_Render helper $attr parameter, merging with $options. (RenderHelper, entity_display.html.php, FilterFormHelper)
    • Bump version. (FieldImporter)
    • Some changes on how HTML classes are generated for each post/term. (WordPress/Template, EntityComponent, WordPressContentComponent)
    • Changed filter entity_[bundle_name]_html_classes to entity_html_classes. (EntityComponent)
  • 17th
    • Refactoring ViewEntities controller. (ViewEntities)
    • Fixed fatal error in Manage Displays section in the backend. (AdminElementHelper)
    • Added support for Algolia Places API autocomplete library. (location-algolia-autocomplete.js, AlgoliaAutocompleteApi, LocationComponent)
    • Show Powered by Google only when Google Maps API is enabled. (TextFormField).
    • Removed redundant function call. (location-googlemaps-autocomplete.js, location-textfield.js)
  • 16th
    • Fixed issues upgrading from version 1.1.x to 1.2.0. (schema/1.2.0-dev.55.php, schema/latest.php, phing/model.yml)
    • Refactor how custom single term/post pages are generated. (Platform, EntityComponent, PageSettingsFormHelper, ShortcodesHelper)
    • Removed unused shortcode. (DirectoryProComponent)
  • 15th
    • Remove unused variable (ViewEntities).
    • Fix category term and child item search not working at times (KeywordField, PostFieldQuery).
    • Allow skipping entering guest info when submitting content as guest (AbstractAddEntity, LoginOrRegister, FrontendSubmitComponent, SettingsFormHelper).
  • 13th
    • Allow sorting terms by custom SQL (TaxonomyTermsHelper, Storage, Query).
    • Add support for Category Order and Taxonomy Terms Order plugin (WordPressContentComponent).
    • Fix undefined variable PHP error (RenderHelper).
    • Fix guest author post always showing Guest as author (UserIdentityHtmlHelper, UserIdentityFetcher, AuthorFieldRenderer, FrontendSubmitComponent).
    • Fix issues with get_post_custom() called by other plugins (WordPressContentComponent).
  • 12th
    • Refactoring Display component IElement classes (large number of files).
    • Additional changes to [drts-entity] shortcode (ShortcodesHelper, WordPressComponent).
    • Bump version (ShortcodesHelper).
    • Do not show 0 in lat/lng input fields when no coordinates (LatLngFormField, AddressFormField).
    • Show shortcode syntax for Detailed display only under Manage Displays (WordPressComponent).
    • Refactoring display element methods. (FormDisplayElement)
    • Disabled suggest place option if no autocomplete API library is set. (TextFormField, AddressSearchField)
  •  11th
    • Bump version on a number of files.
    • Refactoring display elements methods (EditPost, CaptchaDisplayElement, RatingsDisplayElement).
    • Accept “separator” and “key” parameters with [drts-entity] shrotcode (WordPressComponent).
    • Add new column to hold permanent element ID for each display element (1.2.0-dev.55.php, CreateHelper, DisplayHelper, ElementGateway).
    • Refactoring display elements methods (large number of files).
    • Disable suggest place option if no autocomplete API library is set (TextFormField, AddressSearchField)/
  •  10th
    • Added subscriptions dashboard panel (VotesDashboardPanel).
    • Hide empty dashboard panel links (PostsPanel).
    • Do not set current user as author by default when importing (Import, PostEntityType).
    • Fixed contact form with Gravity Forms not showing confirmation message (FormHelper).
    • Make sure additional features are unapplied when order is canceled (FormPaymentFeature, PhotosPaymentFeature, LocationsPaymentFeature).
  • 9th
    • Fixed some issues with & in URL (LinkToHelper, UrlHelper).
    • Changed “Visit Frontend” to “Visit Directory” (Directories, DirectoryComponent).
    • Added plan type parameter (FormPaymentFeature, PhotosPaymentFeature, LocationsPaymentFeature).
  • 8th
    • Added filter to customize map marker content (MarkerHelper).
    • Fixed method parameter declarations (DisplayComponent, ViewComponent, VotingComponent, and WordPressContentComponent).
    • Fixed undefined variable PHP notice level error (AdminContent).
    • Allow city/province values to be entered through input text fields (AddressFieldWidget, AddressFormField).
    • Fixed address column not always being populated (AddressFieldTYpe).
  • 6th
    • Fixed array to string conversion PHP error (AdminElementHelper).
    • Now allows other map/location fields to be used to display listings on map (MapViewMode, location_entities.html.php, location_entities_container.json.php, LocationComponent).
    • Removed debug code (AdminContent).
    • Removed unused method parameters (CustomButton, IButton, AbstractElement, ButtonElement, ColumnElement, ColumnsElement, GroupElement, HtmlElement, IElement, JavascriptElement, LabelsElement, SeparatorElement, StatisticsElement, TabElement, TabsElement, TemplateElement, TextElement, RenderHelper, ChildTermsDisplayElement, FieldDisplayElement, FieldListDisplayElement, FormDisplayElement, ParentFieldDisplayElement, AbstractEntitiesDisplayElement, ChildEntitiesDisplayElement, FilterDisplayElement, DisplayButton, CommentsDisplayElement, AbstractPostDisplayButton, AddEntityDisplayButton, CaptchaDisplayElement, RatingsDisplayElement, ClaimEntityDisplayButton, FormDisplayElement).
    • Fixed FontAwesome icon for categories not showing up on category pages (PageTitleHelper).
    • Fixed invalid namespace for Responsive Lightbox class (PhotoSliderFieldRenderer).
    • Added Responsive Lightbox & Gallery plugin support for lightbox effect (PhotoSliderFieldRenderer, SliderHelper).
  • 5th
    • Moved form related CSS to global CSS files (Form, ScriptsHelper).
    • Passed assoc array as filter param for modifying taxonomy term order  (TaxonomyTermsHelper).
    • Fixed forced reloading taxonomy term cache not working (ToolsHelper).
    • Added/refactored more code for theming (AbstractPlatform, Platform, SliderField, TextFormField, AddressSearchField).
    • Added/refactored more code for new Map view (map_entities.html.php, map_map.html.php, MapComponent, MapViewMode, location_entities.html.php, location_entities_container.json.php, location_entities_googlemap.html.php, location_map.html.php, LocationComponent).
    • Removed unused CSS class (TextFormField).
  • 4th
    • Added getOptions() method to map-googlepmaps.js, location-leaflet-map.js.
    • Removed unused method parameter (MarkerHelper).
    • Fixed invalid assignment to array (GoogleMapsGeocodingApi).
  • 3rd
    • Refactored code (DisplaysHelper and AbstractMode).
    • Added new Map view mode and Map\FieldType\ICoordinates interface (ICoordinates, map_entities.html.php, MapFieldType, MapComponent, MapViewMode, AddressFieldType).
    • Added filter to modify sort order of cached taxonomy terms (TaxonomyTermsHelper).
    • Refactored [drts-entity] shortcode (WordPressComponent).
    • Fixed incorrect method declaration in FacebookMessengerLinkFieldRenderer.
    • Added content modification plugin for Yoast SEO (wordpress-admin-yoastseo.js, AdminContent).
    • Remove unused “public” attribute of view info (DashboardViewMode, PhotoSliderViewMode).
  • 2nd
    • Added option to display logout button on frontend dashboard (DashboardComponent, DashboardViewMode, NavHelper).
    • Added FB messenger link field renderer (AccountsFieldRenderer, FacebookMessengerLinkFieldRenderer, FacebookPageFieldRenderer, TwitterFeedFieldRenderer, SocialComponent).
    • Added autocomplete=”off” to search form fields (KeywordField, TextFormField).
    • Now shows time selection field in 24hr format by default (form-field-datepicker.js).
    • Added more translatable phrases (DateHelper, AddressFieldFilter).
    • Changed error level from critical to warning in UninstallHelper.
    • Enabled theming. Available themes: default, dark, orange (Platform).
  • 1st
    • Add thumbnail_scaled image size (PostsSystemWidget, AbstractRenderer, AbstractMode, ImageFieldType, WordPressContentComponent, photoslider_entities.html.php, PhotoSliderFieldRenderer)).
    • Fixed some issues with privatable option (DirectoryType, Bundle, FeatureSettingsFormHelper).

August

  • 31st
    • Fixed excerpt_more filters referencing wrong post (PostContentFieldRenderer)
    • Fixed undefined variable error in map-googlemaps.js.
  • 30th
    • Added add-on for WP All Import (IWpAllImportImporter, Importer, rapid-addon).
  • 28th
    • Refactored Display_Render() helper.
    • Removed unused element_id template variable (view_entity.html.php, ViewEntity).
    • Added element_id parameter for rendering single element with [drts-entity] (WordPressComponent).
    • Fix compatibility issues with FontAwesome in themes or other plugins (Dashboard).
  • 26th
    • Exclude internal bundles from system slugs (FrontendSubmitComponent).
    • Refactoring Display_Render() helper (RenderHelper).
  • 23rd
    • Allow empty string in field query for DateType (DateType).
    • Removed unused code from Platform.
    • Added Entity_Path helper (EnetityComponent, PermalinkUrlHelper).
    • Added [drts-entity] shortcode (WordPressComponent).
    • Redraw map only when array of markers are returned (locaiton-map.js).
  • 22nd
    • Show map on directory index page when map is positioned at top on mobile (location-map.js).
  • 21st
    • Make sure AddDirectory controller is overridden (DirectoryProComponent).
  • 19th
    • Added [drts-field] shortcode (WordPressComponent).
    • Moved Display_ElementTypes helper to Display_Elements_types (ListElements, ElementsFormField, AdminElementHelper, ElementTypesHelper, ElementsHelper).
    • Fix fatal error trying to fetch non existing directory type (FiltersSystemWidget).
  • 15th
    • Use radius setting value for search my location radius (AddressFieldFilter).
    • Show map on directory index page when map is positioned at top (location_entities.html.php, location_entities_googlemap.html.php).
  • 13th
    • Renamed select2 css file (ScriptsHelper).
    • Fixed undefined variable JS error (GoogleMapsApiHelper).
    • Let user specify location search radius on search (SliderField, FormHelper, TextFormField, AddressSearchField).
  • 12th
    • Changed language phrase (AddressFieldFilter).
    • Use radius setting value for search my location radius (AddressFieldFilter).
  • 11th
    • Fixed open now label not showing correctly (OpenNowDisplayLabel, OpeningHoursFieldRenderer).
    • Removed duplicate code (AddressFieldFilter).
    • Change language phrase (AddressSearchField).
    • Set radius to 1 km/mi by default for Current Location search/filter (TextFormField, FilterFieldHelper.
  • 10th
    • Fixed filter form widget not showing when using shortcode on default page (FiltersSystemWidget).
  •  9th
    • AbstractUpdater now logs error message only.
    • Updated responsive settings (WordPressHomePage).
  • 7th
    • Added search filter feature to icon picker form field (form.css, form-field-iconpicker.js, form-field-picker.js).
  • 3rd
    • Added permalink_url token (TokensHelper).
    • Allow showing custom label instead of original title (TitleFieldRenderer).
    • Added new sync taxonomy terms tool (ToolsHelper).
    • Added option to specify table join type (Storage, PostFieldQuery).
    • Allow users with delete others claim to approve/reject claims (StatusFieldType, StatusFieldWidget).
  • 2nd
    • Version bump (Assets, AbstractPlatform, Platform, MapFieldRenderer, GoogleMapsApiHelper, AdminContent, among others)
    • Remove git comment (Platform).
  • 1st
    • Remove unused Use statements (DeleteDirectory, AbstractDisplays).
    • Added more checks for internal type bundles (DashboardViewMode, EntityComponent, DisplaysHelper, Bundle, ContactComponent).
    • Fixed routes being deleted (DisplayComponent).
    • Fixed displays admin path issue (ElementsFormField).
    • Refactored label settings page (Edit).
    • Fixed status dropdown not showing up on dashboard (NavHelper).
    • Added new no_content bundle info key (Bundle).
    • Set default admin bundle path if not set (AbstractBundleType).
    • Do not include internal type bundles in content type options (ReferenceFieldType).
    • Sync reference fields on create entity success event (EntityComponent).
    • Fetch values for structured data properties from taxonomy terms (AddressFieldType).

July

  • 30th
    • Use template to customize single post type page (Platform).
    • Fixed hidden address fields not being filled (AddressFormField).
  • 29th
    • Added filter to force is_page on category archive page (Platform).
  • 28th
    • Enabled import/export of voting_vote type fields (VotingExporter, VotingImporter).
    • Imported vote value must always be a PHP array (VotingImporter).
    • Customize Slick to prevent conflict with themes (photoslider.js, slick.custom.js, slick.js, SliderHelper, PhotoSliderViewMode).
    • Updated leaflet JS library files.
  • 27th
    • Fixed missing argument warning error (Platform).
  • 26th
    • Fixed unmerged code (DropdownButtonLinksHelper).
    • Prefix data-toggle attribute with app name (Dashboard, DropDownButtonLinksHelper, TabsElement, ButtonsField, CheckboxField, ColorPaletteField, EditorField, RadiosField, MapFieldRenderer, dashboard_dashbaord.html.php).
    • Change prefix of data-toggle from app name to BS prefix (Dashboard, dashboard_dashboard.html.php).
  • 24th
    • Load scripts in footer by default (GoogleMapsApi, ApiHelper, AbstractGoogleMapsApi, GeoNamesTimezoneApi, MapboxGeocodingApi, NominatimGeocodingApi, LeafletMapApi).
    • Fix bundle info referencing current value instead of default info (Edit).
    • Fix icon not being imported for each option through CSV import (OptionsField).
    • Moved Fieldset component to new directories-fieldset project (AddFieldset, Fieldsets, FieldsetEntityBundleType, FieldsetEntity, FieldsetEntityType, FieldsetComponent).
  • 23rd
    • Use -sabai_app_fullname- placeholder instead of hardcoded “directories” (AddDirectory, DeleteDirectory, Directories, EditDirectory, DirectoryComponent, TypesHelper, ElementsFormField, AdminContent, WordPressContentComponent, DirectoryProComponent).
    • Add check for internal type bundles (ContentTypes, ContentTypesHelper).
    • Make sure BundlesHelper always returns an array (BundlesHelper).
    • Skip filtering by entity type on bundles since names are always unique (EntityComponent).
    • Accept URL for any social account field (SocialComponent).
    • Fixed review body field being displayed at top (ReviewEntityBundleType).
    • Added new Fieldset compoennt (AddFieldset, Fieldsets, FieldsetEntityBundleType, FieldsetEntity, FieldsetEntityType, FieldsetComponent).
  • 21st
    • Added link target option to screenshot field renderer (FieldDisplayelement, AbstractRenderer, ImageRenderer, ScreenshotFieldRenderer).
    • Fixed setting is_singular to true on archive page causing SEO issues (Platform).
    • Fixed parent entity name/link not appearing when posting child entity (AddChildEntity).
    • Load scripts in footer by default (AbstractPostDisplayButton, ApiHelper, SliderHelper).
  • 20th
    • Fixed fatal error where 7th parameter is not being an array (ElementsFormField, AdminElementHelper).
    • Fixed streetview not working (map-googlemaps.js).
  • 19th
    • Properly close file opened with finfo_open() (FileTypeHelper).
    • Refactor screenshot renderer (AbstractPlatform, Platform, ImageRenderer, ScreenshotFieldRenderer).
    • Fixed fatal error when rendering screenshot image as background (ImageRenderer).
  • 18th
    • Added link to URL option (ImageRenderer, ScreenshotFieldRenderer).
    • Added filter to customize default No Image image (NoImageHelper).
    • Force check un-updated components on plugin update (Platform).
    • Added fix for single term page not rendering properly with some themes (Platform).
    • Removed console debug data (location-field.js).
    • Fixed invalid method param type (ScreenshotFieldRenderer).
  • 17th
    • Fixed custom bundle info value disappearing on directory update (ReviewComponent, EntityComponent, Bundle, WordPressContentComponent, ContactComponent, LocationComponent).
  • 16th
    • Fixed render as background option not working in certain case (ImageRenderer); later this change was reverted.
    • Refactored component upgrade() method (AbstractComponent, ComponentHelper).
    • Replaced bootstrap-growl with sweetalert2 JS library (AbstractPlatform).
    • Added code for properly upgrading to version 1.2.0 (ApiHelper, MapComponent).
    • Fixed undefined index notice error causing JS error (MapComponent, GoogleMapsAutocompleteApi, GoogleMapsGeocodingApi).
    • Show loading indicator when “Find on map” button is clicked (location-field.js).
    • Do not load location JS if no map provider (AddressFormField).
  • 15th
    • Added downloadUrl() method (AbstractPlatform, Platform).
    • Refactored “cacheable” display element setting (AddElement, EditElement, ElementsFormField, AdminElementHelper, AdvacnedSettingsFormHelper, FieldDisplayElement, ReferenceFieldRenderer, AbstractType, AbstractEntitiesDisplayElement).
    • Refactored color settings form (IconRenderer, UtilHelper).
    • Refactored Image field renderer (ImageRenderer).
    • Added post thumbnail settings (ContentTypesHelper, PermalinkSettingsFormHelper, WordPressContentComponent).
    • Added ScreenshotFieldRenderer (DirectoryProComponent, ScreenshotFieldRender).
  • 14th
    • Added links to plugin page (main.php).
    • Refactoring Form.php.
    • Do not shown error when map provider is not selected (MapFieldRenderer).
    • Refactored AbstractFileRenderer.php.
    • Added link to documentation under map library settings section (MapComponent).
    • Fixed files with mp4 extension not being inserted (MediaManagerFormField).
    • Fixed required indicator not showing (PageSetingsFormHelper).
    • Display video/audio files using shortcode (FileFieldRenderer, FileFieldType, FileFieldWidget).
    • Added option to specify countries to restrict geocoding results (GoogleMapsGeocodingApi, MapboxGeocodingApi).
  • 13th
    • Added fix for Customizr theme (Platform).
  • 12th
    • Fixed exception not being caught (ExportDirectory).
  • 11th
    • Bump version (IsSearchRequestedHelper).
  • 9th
    • Allow view image field setting to be required (AbstractMode).
    • Fixed single category page not showing correct page title with some themes (Platform).
    • Forced upgrade components on reload all components (SystemComponent).
    • Fixed photo sldier image fiedl options always required (PhotoSliderViewMode).
    • Refactoring (LocationComponent).
  • 8th
    • Add new Recalculate Review Ratings tool (RecalculateRatingsHelper, ReviewComponent).
    • No caching reviews on listing page by default (directory_listing_displays.php).
    • Fix custom formatted address not showing when no location term assigned (AddressFieldRenderer).
    • Fixed photoslider zoom setting overriding photoslider link setting (photoslider_entities.html.php, PhotoSliderViewMode).
    • Added option to add country restriction to geocoding API (GeoNamesTimezoneApi, GoogleMapsAutocompelteApi, GoogleMapsGeocodingApi).
  • 6th
    • Made changes to parameters for Entity_Field_options helper (FieldHelper, PersonalDataHelper, AbstractMode, ContactComponent, OpenNowDisplayLabel, PhotoSliderFieldRenderer).
    • Changes to Entity_Image helper (EntityComponent, TermsFieldType, PageTitleHelper, PermalinkHelper, MarkerHelper, AdminContent, photoslider_entities.html.php).
    • Changes on handling entity image/icon fields (PostsSystemWidegt, Edit, QueryEntities, ChildTermsDisplayElement, TitleFieldRenderer, ImageHelper, TaxonomyTermsHelper, UtilHelper).
    • Fixed fatal error on merging component config (ComponentHelper).
    • Fixed icon field not showing (IconWidget).
    • Fixed bundles with no entity permissions (PermissionsHelper, WordPressContentComponent).
    • Added is_user bundle info variable (DashboardViewMode, Bundle, ContactComponent).
    • Allow multiple countries for Google Autocomplete component restriction (GoogleMapsAutocompleteApi).
    • Some changes on handling entity image/icon fields (location_entities.html.php, location_entities_container.json.php, PhotoSliderViewMode).
    • Refactoring (LocationComponent).
  • 4th
    • Fix PHP documentor comment error (FieldHelper).
    • Fixed undefined variable error (DashboardComponent).
    • Do not add accordion CSS class if only 1 panel (dashbaord_dashboard.html.php).
  • 3rd
    • Disable directions API, show error if no map provider configured.
    • Display better form error messages in form header (AddElement, EditElement, AdminElementsHelper, Form, AddView, EditView).
    • Disable directions API, show error if no map provider configured. (MapFieldRenderer, MapFieldWidget).
    • Added class to froce overflow visible (directory_listing_displays.php).
    • Fixed undefined variable error (locaiton-leaflet-map.js).
    • Cache geocoding results up to maximum of thirty days (ApiHelper).
  •  2nd
    • Attachments are now associated with entity on creation/update.
    • Use Attr application helper to render form data attributes (Application, AbstractField, Form).
    • Escape form error messages (AdminContent).
    • Display better form error messages in form header (Form).
    • Require Google Maps API key (AbstractGoogleMapsApi).
    • Do not show map if no API configured (ApiHelper, AddressFormField, LocationComponent).
    • Refactoring AdminContent.
    • Associate attachments with entity on create/update (WordPressContentComponent).
  • 1st
    • Add WordPressUser component to directories-user.
    • Process post and term entity types only (ContentTypesHelper).
    • Remove div.fluid-width-video-wrapper added by jquery.fitvids.js (photoslider.js).

June

  • 29th
    • Refactoring new location API (MapComponent, GeoNamesTimezoneApi, GoogleMapsAutocompleteApi, GoogleMapsGeocodingApi, GoogleMapsTimezoneApi, MapboxGeocodingApi, NominatimGeocodingApi, LocationComponent).
    • Fixed lat/lng values not being retrieved correctly (location-textfield.js).
  • 28th
    • Do not rquire Google Maps API keys (AbstractGoogleMapsApi)..
    • Set Google Maps API as initial default (LocationComponent).
    • Add more variables to be passed to entity_field_render filter hooks.
    • Add hook to allow customization of content rendered for each file field (AbstractFileRenderer).
    • Bump version (AbstractSystem).
    • File titles can now be imported if name and title are separated by pipe “|” (WPImporter).
    • Allow non alphanum characters to be used as choice option values (ChoiceType).
    • Show log in the console instead of throwing an error for each API (location-api.js).
  • 23rd
    • Fixed custom address format option not being displayed (AddressFieldRenderer).
  • 22nd
    • Remove option to render OSM titles on Google Maps.
    • Removed unused code from PostEntityType, TermEntity, TermEntityType.
    • Added new experimental WordPressUser component.
  • 19th
    • Removed unused method from UploadHelper.
    • Fixed fatal error on fetching non-existing directory type (AddDirectory, PostsSystemWidget).
  • 17th
    • Added option to throw exception on error (FieldHelper).
    • Changed parameter name (AbstractEntity).
    • Removed redundant code from IsRoutableHelper.
    • Removed unused code from ReferencingEntitiesFormDisplayElement.php.
    • Added entity bundle to params passed to fieldTypeSettingsForm() method.
    • Added option to sync entity reference fields (EntityComponent, ReferenceFieldType).
  • 16th
    • Shared node_modules among all projects.
  • 15th
    • Allow grouping by extra fields (Query.php).
    • Fix attributes not being processed properly (Link.php).
    • Fix undefined index PHP error (OptionsField).
    • Refactoring NavHelper.
    • Let view mode instance modify query on view entities.
    • Refactoring SearchComponent.
    • Removed debugging code from core.js.
    • Added new Buttons form field.
    • Added new Glossary view filter.
    • Removed unused file (GridClass).
    • Fixed filter labels not being escaped properly (ColorFilter, GlossaryFieldFilter, AddressFieldFilter).
    • Added getTimeZone() method to Platform.
    • Properly required Map/Location API settings (GoogleMapsApi, AbstractGoogleMapsApi).
    • Ignored #max_length setting for input field if #separator is set (TextField).
    • Fixed missing argument fatal error (RenderHelper).
    • Fixed undefined variable error (location-googlemaps-timezone.js).
    • Fixed address being overwritten on “Find on map” (location-field.js).
    • Do not modify address input fields on “Find on Map” button click (location-field.js).
    • Properly namespace location API setting parameters passed to JS GoogleMapsAutoCompleteApi).
    • Rename geocoding provider name (GoogleMapsGeocodingApi, NominatimGeocodingApi).
    • Added viewport() method to Map API helper (LocationFakerGenerator, ApiHelper).
    • Use the timezone ID returned by the Platform as default (AddressFormField).
    • Added Mapbox geocoding API (MapboxGeocodingApi, LocationComponent).
    • Use center lat/lng and radius to filter if no viewport (FilterFieldHelper).
    • Removed unused code from location-mapbox-geocoding.js.
    • Fixed country setting not passed to JS (MapboxGeocodingApi).
    • Changed language phrase (MapboxGeocodingApi).
  • 14th
    • Fix phrase not being translated (FrontendSubmit).
  • 12th
    • Added new icon picker form field and JS library.
    • Refactoring core.js.
  • 9th
    • Bump version (PostsPanel).
    • Open edit post form with normal page instead of in modal window (EditPost, DashboardComponent, AbstractPostDisplayButton, PostsPanel)
    • Fix redundant call to Entity_Tokens_replace() helper.
    • Fix redundant calls to generate cache ID (RenderHelper).
    • Allow specific display to be rendered (ViewEntity).
    • Allow specific element to be displayed with [drts-directory-listing].
    • Fix specified element not being displayed with [drts-directory-listing] (RenderHelper).
    • Refactoring (ReferencingEntitiesFormDisplayElement).
    • Do not load autocomplete JS files if not required (AddressFormField).
  • 7th
    • Return two letter country code (location-nominatim-geocoding.js).
    • Populate address column with other address components if empty (AddressFieldRenderer, AddressFieldType).
    • Bump version (DirectoryProComponent).
    • Add missing slash to shortcode path atts (DirectoryProComponent).
  • 6th
    • Refactoring Map/Location API (ApiHelper, LocationComponent).
    • Require GeoNames user naem if GeoNames timezone API is selected (GeoNamesTimezoneApi).
    • Fixed Map/Location API loading issues (AddressFormField, TextFormField, ApiHelper, LocationComponent).
  • 5th
    • Added more location API providers, pass settings to API JavaScript (AbstractGoogleMapsApi, GeoNamesTimezoneApi, GoogleMapsAutocompleteApi, GoogleMapsGeocodingApi, GoogleMapsTimeZoneApi, IApi, IAutocompleteApi, IGeocodingApi, ITimezoneApi, NominatimGeocodingApi, ApiHelper, LocationComponent).
    • Refactoring Location API (similar to above; DirectoryType, GoogleMapsAutocompleteApi, TextFormField, AddressSearchField).
  • 4th
    • Change helper name (LocationCSVImporter, LocationFakeGenerator, AddressFieldType, ToolsHelper, FilterFieldHelper).
    • Add new Location API changes (AbstractGoogleMapsApi, GoogleMapsAutocompleteApi, GoogleMapsGeocodingApi, GoogleMapsTimezoneApi, IGeocodingApi, NominatimGeocodingApi, AddressFieldWidget, AddressFormField, ApiHelper, LocationComponent, LeafletMapApi).
    • Changed geocoding provider name (NominatimGeocodingApi).
  • 3rd
    • Removed Leaflet component (ApiHelper, LeafletComponent).
    • Added suport for other map API libraries (AddressFieldType, AddressFieldWidget, AddressFormField, ApiHelper, DrawMapOptionsHelper, LocationComponent, AbstractGoogleMapsApi, GoogleMapsAutocompleteApi, GoogleMapsGeocodingApi, GoogleMapsTimezoneApi, IAutoCompleteApi, ITimezoneApi, IAutocompleteApis, ITimezoneApis, LeafletMapApi).

May

  • 31st
    • Added Leaflet component (but removed Jun 3) (ApiHelper, LeafletComponent).
  •  30th
    • Refactoring (FrontendSubmitComponent, ReviewComponent, LocationComponent).
  • 29th
    • Bump version (ApiHelper, LeafletComponent, location_entities_html.php).
    • Removed Leaflet component (ApiHelper, LeafletComponent, location_entities.html.php).
  • 28th
    • Add option to enable/disable frontend submission per directory (ReviewEntityBundleType, AddEntity, LoginOrRegister, FrontendSubmitComponent, SubmittableBundlesHelper).
  • 26th
    • Anonymize on erasure only when current data is not empty (GuestFieldType).
  • 25th
    • Make sure rating criteria slugs are not more than 40 characters (ReviewEntityBundleType).
  • 24th
    • Add more address component values for better geocoding results (ToolsHelper).
    • Set colorable info key to false (StatusDisplayLabel, OpenNowDisplayLabel).
  • 22nd
    • Enabled AJAX submit for login/register forms (frontendsubmit_login_register_form.html.php, LoginOrRegister).
    • Fixed dashboard panel settings not saving (DashboardComponent).
    • Fixed dashboard panels not appearing when using dashboard shortcode (DashboardComponent).
    • Fixed dashboard panel issues (dashbaord_dashboard.html.php, DashboardComponent).
    • Make sure child bundle exists (AddEntityDisplayButton)
    • Re-init reCAPTCHA fields after submit fail (CaptchaHelper, reCAPTCHAComponent).
    • More fixes to have reCAPTCHA field work with AJAX submission (frontendsubmit_login_register_form.html.php, CaptchaHelper).
  • 21st
    • Removed code for deprecated cookie (LoginOrRegister).
    • Removed form build ID from form to skip rendering shortcode (LoginOrRegister).
    • Refactoring (AddDirectory).
  • 19th
    • Implemented IPersonalData and IPersonalDataAuthor interfaces (GuestFieldType).
    • Removed use of guest info cookie (AbstractAddEntity, AddChildEntity, AddEntity, LoginOrRegister).
    • Added check to make sure Directories plugin is already activated (main.php).
    • Bumped version (AddressFieldWidget).
  • 18th
    • Fixed redirection error after guest login to add a child entity (LoginOrRegister).
  • 17th
    • Fixed call to undefined Countries helper fatal error (AddressFormField).
  • 15th
    • Fixed reCAPTCHA field option not displaying for registration form (reCAPTCHAComponent).
    • Added privacy policy consent checkbox to forms for GDPR compliance (LoginOrRegister, SettingsFormHelper).
  • 14th
    • Prevent warrning error message (SliderHelper).
  • 5th
    • Fixed add child entity controller not checking permission (AddChildEntity).
    • Added location address component class to select location fields (AddressFieldWidget).
    • Moved all date/time helpers to System Component (OpeningHoursFieldRenderer).
  • 4th
    • Redirect to referenced item page if any on submit success (AbstractAddEntity).
    • Fixed trying to load map settings from Location instead of Map component (AddressFieldWidget).
  • 1st
    • Change attr name from data-value-name to data-alt-value (AddressFieldWidget).

April

  • 30th
    • Fixed frontend dashboard panel labels always being empty in backend settings.
    • Updated dashboard view settings (PostsPanel).
    • Passed entity reference ID and field name to add entity from (AbstractAddEntity, AbstractSubmitEnttiy).
    • Update view settings (directory_listing_views.php).
  • 29th
    • Updated gulp files.
  •  28th
    • Initial Commit.
    • Moving Files.