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


Learning More



  • 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.

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

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:



  • 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).


  • 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).


  • 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).


  • 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).


  • 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).


  • 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.