Posted on

SLP versions: Power add-on, Experience add-on version 4.6.1 updates to import functions


Store Locator Plus 4.6.1 Highlights

• Allow add-ons to load JS on a per-admin-tab basis. Reduces browser overhead and memory footprint on admin pages.

• Simplify and improve the new option manager. More consistent option handling, more security option management, better performance.

•  Checkbox on/off validation for all add ons – fixes instant checkbox saving on admin panel for some add on options

• All language files are now pulled from the MySLP website.  • Missing translations? See MySLP and add your translation updates there.

Change Log for SLP Power Add-on

Posted on

VVV For WordPress Development

Now that 4.3 has been released I am taking a few days to reconfigure my production environment for WordPress plugin development. After a number of issues running the self-contained GUI development environment that included WordPress core, full plugin development, and all of my supporting infrastructure including phpStorm, SmartGit, and a series of Grunt scripts in an all-in-one Vagrant-based Virtualbox, I decided to try something new. Losing 20 minutes every few days because the self-contained GUI in Virtualbox could not sync between guest and host was too much. Something in the Virtualbox or CentOS 7 upgrades over the past year broke something fundamental in GUI I/O and I’ve been unable to track it down. Time for a change.

My change? Learning Varying Vagrant Vagrants. For those that are not familiar with VVV for WordPress development you may want to check it out here:

What is VVV?

VVV is a virtual development environment for WordPress.    It spins up a headless (no GUI interface) Virtualbox that contains three separate versions of WordPress (stable, dev, and trunk) as well as a myriad of tools like phpMyAdmin.   All of the settings are in place to allow your local system, my OS/X desktop for my setup, to interact with the local WordPress install from your preferred web browser.

The upside is there is a lot of community support , articles, and various tools-and-trick available to you for doing almost anything you want.    A lot of the “cool dev tricks” I never had fully working, like interactive XDebug support in phpStorm, are readily available.     It is also super-easy to switch between WordPress releases which is cool if you are sending core patches or need to test on the upcoming major release.

The downside is that you need to setup all of your development tools locally on your desktop.   Guess what happens if your computer dies?   Yup, another few hours of setting it up again.   With my prior custom self-contained virtual environment I only need to save my Virtualbox, usually by creating a Vagrant image, any time I made notable changes to my tool kit; by doing so I could restore it easily to ANY desktop ANYWHERE in the world and have EXACTLY the same environment in no more time than it takes to spin up a VVV based box.

In short, VVV is a virtual machine store on your local desktop with several WordPress installs ready-and-waiting behind your browser screen.

My Startup Tricks

I develop a number of WordPress plugins, so having full development tools and my source code are key to productivity.  Here are some things I needed to tweak on the default VVV setup to get going.

Linking Plugin Source

I am primarily developing plugins and I want them on all of the WordPress installs provided by VVV.  I can “take over” a VVV server-based directory with a local directory my mapping the local directory to the destination with a Vagrant Customfile.    Go to the base location where you placed your VVV install, you will know you are in the right place as it has the Vagrantfile for the VVV box, and create a new file named “Customfile”.

Here is my mapping entries to take over the plugin directory on all 3 WordPress installs that come with VVV:

config.vm.synced_folder "/Users/lancecleveland/Store Locator Plus/plugin_code", "/srv/www/wordpress-default/wp-content/plugins", :owner => "www-data", :mount_options => [ "dmode=775", "fmode=774" ]

config.vm.synced_folder "/Users/lancecleveland/Store Locator Plus/plugin_code", "/srv/www/wordpress-develop/wp-content/plugins", :owner => "www-data", :mount_options => [ "dmode=775", "fmode=774" ]

config.vm.synced_folder "/Users/lancecleveland/Store Locator Plus/plugin_code", "/srv/www/wordpress-trunk/wp-content/plugins", :owner => "www-data", :mount_options => [ "dmode=775", "fmode=774" ]

Configuring XDebug

phpStorm comes with an XDebug listener.  This allows you to set breaks in your PHP code files, inspect variables in real-time, and do a lot of other things that are much more efficient than var_dump or print_r or die littered throughout the code.     The are a number of articles and videos on using XDebug with phpStorm.  Check it out, it is a great debugging tool.   For now, how to enable it with VVV:

Turning on XDebug is easy with VVV.

Go to the VVV install directory.

Enter Vagrant via SSH: vagrant ssh

Turn on Xdebug from the SSH command line on the virtual machine: xdebug_on

That’s it, I can now use my  local phpStorm tool to debug my VVV files.

Here is THE XDebug + VVV + phpStorm video to watch to do this.

Useful Meta

With VVV installed these URLs should work in your browser.

Users and passwords:

  • For the WP installs:  wp / wp
  • For WP Admin Users: admin / password
  • MySQL Root: root / root
    • Default DB Name: wordpress_default
    • Trunk DB Name: wordpress_trunk
    • Develop DB Name: wordpress_develop


  • Local directories (relative to Vagrant install): ./www
  • Server-Side directories: /srv/www
Posted on

Selenium IDE Running Suites of Suites

For over a year now I’ve been running over a dozen Selenium IDE test suites every time I update the Store Locator Plus base plugin.  It is a manual process that is time consuming, though less consuming than manual testing by several orders of magnitude.   Today I learned how to be even more efficient with my time, which my forthcoming customer support and QA team will hopefully appreciate when they come on-board this summer.

Here is the Stack Overflow summary I posted on my automated “suite of suites” process which took me several days of searching and testing to discover.

I have a few dozen test suites built in Selenium IDE to assist with testing my Store Locator Plus WordPress plugin. Sometimes I need to run a single Selenium test suite. However when I release a new version of the base plugin I want to run a dozen test suites one-after-another.

While not a perfect fit for your use case of creating several “master suites”, I did find a pair of Selenium IDE plugins that allow me to create a single “favorites list of suites” and run all of my favorites back-to-back.

It may be possible to investigate & modify the plugin JavaScript to create several different “favorites lists” that may suit your needs. In the meantime you can get at least one “master list of suites” by combining these Selenium IDE add-ons:

After installing each of these add-ons (technically Mozilla Firefox plugins) you will see a favorites button inside the Selenium IDE interface. Mark your favorite suites and you will have your “list”. You can now select “Favorites / Run All” from the Selenium IDE menu.

You may want to be careful about the sequence in which you mark your favorites. I marked them in the order I wanted them to run. Open test suite #1, favorite, test suite #2 favorite etc. then “run all”. Worked great and shows me the total run count and fail count across all suites (and thus tests) that were executed. The log, sadly, appears to be reset at each suite however.

Posted on

Analyzing WordPress PHP Memory Consumption

This weekend I have been processing a large 200,000 location data file for a Store Locator Plus customer.   This is one of the larger files I have processed on my test system and it is the first file over 60,000 locations I’ve processed since Store Locator Plus 4.2 and WordPress 4.x have been released.    This large file processing and the geocoding required is taxing several systems in the Store Locator Plus hierarchy.  WordPress, Google OEM API calls, and the locator are all showing their weak spots with this volume of data processing.   They can all handle it to some degree, but maximizing efficiency is the key.

The temporary solution to most of the issues is to increase memory and process limits.   These are some of the key findings, as posted on the CSV Import documentation pages for Store Locator Plus:

Check your php.ini post_max_size setting if doing a direct file import versus a cron URL based import. post_max_size is typically set to 8 (MiB) on most servers.   This is typically enough for around 25,000 locations but it depends on how long your descriptions are and how many data fields you have filled out.   SLP 4.2.41 will warn you if you try to upload a file larger than your post_max_size limit.

Check your php.ini memory_limit setting and make sure it is large enough to handle the WordPress overhead plus the size of your CSV file times two.   The WordPress database interface and the CSV file processing will consume lots of memory.  The more plugins, widgets, and advanced theme features you have more more memory WordPress will use and the more PHP memory will leak over time. A setting of 256M is enough for approximately 15,000 locations.

Check your wp-config WP_MEMORY_LIMIT.   You may need to add this define to wp-config.php.  define(‘WP_MEMORY_LIMIT’ , ‘256M’).  The number needs to be equal-to or less-than the php.ini memory-limit.    It is the WordPress-specific memory limit and works with php.ini memory_limit.

Check your wp-config WP_MAX_MEMORY_LIMIT.   You may need to add this define to wp-config.php.  define(‘WP_MAX_MEMORY_LIMIT’ , ‘256M’).   This is the WordPress admin interface memory limit and works like WP_MEMORY_LIMIT for admin pages.

Set Duplicates Handling to Add especially if you know you do not have duplicate locations in your data.  SLP 4.2.41 further improves the performance when using ‘add’ mode by eliminating extra data reads from the database.

Set Server-To-Server speed to Fast under the General Settings tab unless you are on a shared host or experience a large number of uncoded locations during import.

Set the PHP Time Limit to 0 (unlimited) under the General Settings tab.   For hosting providers that allow your web apps to change this, the unlimited value will let the import run to completion.

Keep in mind Google limits you to 2500 latitude/longitude (geocoding) lookups per 24 hours per server IP address.  If you are on a shared host you share that limit with all other sites on that host.

However, even with all of these settings tweaked to fairly high values for my VirtualBox development system running on a MacBook Pro Retina host, the 4GB of RAM allocated to WordPress still is not enough.   The system eventually runs out of memory when the file gets close to the 45,000 location mark.  Luckily the “skip duplicate addresses” option allows the process to continue.    The “out of memory” error still rears its ugly head in the wpdb  WordPress database engine and is a problem for handling larger files.

Enter Xdebug and memory profiling.   Somewhere buried in the Store Locator Plus code, WordPress code, PHP MySQL interface, or PHP core engine there is a memory leak.  With a complex application environment finding the leak is going to be a monumental task.  It may not be something I can fix, but if I can mitigate the memory usage when processing large files that will help enterprise-class sites use Store Locator Plus with confidence.

Getting Xdebug On CentOS 7

If you follow my blog posts on development you will know that I run a self-contained WordPress development environment.  The system uses Vagrant to fire up a VirtualBox guest that runs CentOS 7 with GUI tools along with a full WordPress install including my plugin code.   This gives me a 2GB “box file” that I can ship around and have my full self-contained development environment on any system capable of running VirutalBox.   Here is how I get Xdebug connected to my local Apache server running WordPress.

Install xdebug from the yum install script.

# sudo yum install php-pecl-xdebug.x86_64

Turn on xdebug in the php.ini file

# find / -name


#sudo vim /etc/php.ini


Check if xdebug is installed:

# php --version

... PHP 5.4.16
.... with xdebug v2.2.7

Enable some xdebug features by editing php.ini again.

Read about XDebug Profiling.

Read about XDebug Tracing.

# sudo vim /etc/php.ini

xdebug.default_enable=1  ; turns on xdebug any time a PHP page loads on this local server

xdebug.idekey="PHPSTORM" ; in case I turn on the automated listener for built-in PHP Storm debugging/tracing

xdebug.profiler_enable = 1 ; turn on the profiler which creates cachegrind files for stack trace/CPU execution analysis

xdebug.profiler_enable_trigger = 1;  turn on a cookie "hook" so third party browser plugins can turn the profiler on/off with a bookmark link

xdebug.profiler_output_dir = "/var/www/xdebug" ; make sure this directory is writable by apache and readable by your local user

xdebug.auto_trace = 1 ; when any page loads, enable the trace output for capturing memory data

xdebug.show_mem_delta = 1 ; this is what tells trace to trace memory consumption changes on each function call

xdebug.trace_output_dir = "/var/www/xdebug" ; same idea as the profiler output, this will be where trace txt files go

Restart the web server to get the php.ini settings in effect:

# sudo service httpd restart

At this point I can now open any WordPress page including the admin pages.   Shortly after the page has rendered the web server will finish the processing through xdebug and a trace* file will appear in /var/www/xdebug.   I can now see the stack trace of the functions that were called within WordPress with the memory consumption at each call.     This is the start of tracking down which processes are eating up RAM while loading a large CSV file without adding thousands of debugging output lines in the web app.

Be warned, if you are tracing large repetitive processes your trace file can be many GiB in size, make sure you have the disk space to run a full trace.

Posted on

Selenium IDE Includes AKA “Rollups”

Selenium IDE is used extensively to test the Store Locator Plus family of plugins.    As the testing continue to expand so do the rules being tested.   Today the addition of a rule that checks that the PHP notice “use of undefined constant” needed to be added.     There is an existing set of other PHP warnings and notices that was added last month that is in 30+ Selenium Scripts.  They were all copied by hand into each test.

Now I need to add one more rule to that test set.   Copy and paste into 30 files?  There HAS to be a better way.

Turns out there is a better way, but it requires a little JavaScript coding to make it happen.   Selenium IDE does not have an “include <file>” option in the base set of commands.   Personally I think they need to add it to the base command set as it will make it far easier for people to write “test subsets” and then include them in every test.    The solution is using something called a “rollup”.    A rollup is a label for a group of commands you want to execute in many places in your test scripts.

My original test suites looked something like this:

Selenium Test for PHP Warnings
Selenium Test for PHP Warnings

In the “old days”, yesterday to be precise, I would copy-and-paste this set of Selenium IDE tests into a LOT of test files.

Today I decided to be smart about it, happens every now-and-then… must be a full moon or something, and find out how to to an “include” of those commands.   The trick is to create a file called something like “rollups.js”.     My file is called slp_rollups.js.     It is a standard JavaScript file that I place in the same directory as all of my Selenium IDE test scripts (which happen to be nothing more than HTML snippets).

To replace those 4 commands with a rollup I created this slp_rollup.js file:

 * For use in Selenium IDE.
 * You will need to add this to Selenium under Options / Options in the Selenium Menu.
 * Put this under Selenium Core Extensions:
 * ~/selenium-ide-for-slp/sideflow.js , ~/selenium-ide-for-slp/slp_rollups.js
var manager = new RollupManager();

 * check_for_syntax_errors
 * This rollup tests for php syntax errors, warnings, and notices.
    name: 'check_for_syntax_errors',
    description: 'Check for PHP syntax errors, notices, warnings.',
    args: [],
    commandMatchers: [],
    getExpandedCommands: function(args) {
        var commands = [];

            command: 'assertNotText',
            target: '//body',
            value: '*Notice: Undefined*'

            command: 'assertNotText',
            target: '//body',
            value: '**Notice: Trying to get*'

            command: 'assertNotText',
            target: '//body',
            value: '*Notice: Use of*'

            command: 'assertNotText',
            target: '//body',
            value: '*Fatal error:*'

        return commands;

To activate this I update Selenium IDE by going to Options/Options and adding this new slp_rollup.js file to the Selenium Core Extensions. Since I also use the sideflow.js file to provide Go To / If and other looping constructs I add both sideflow.js and slp_rollups.js to my extensions list by separating the file names with a comma.

Selenium IDE Options
Selenium IDE Options with sideflow and slp_rollups enabled.

Now I can replace that block of 4 commands with the following single command in ALL 30 scripts. The best part is the next time I need to add another test for a new warning or error I only edit ONE file, the slp_rollups.js file which means less editing, less copy & paste, and less commits to the git repository.

Selenium IDE Implementing Rollups
Selenium IDE Implementing Rollups
Posted on

Project Management / Online Collaboration Tools Review

If you’ve been following my threads for the past month you’ll know that I’ve been searching for a new project management and online collaboration tool for a new company that is launching in early 2015.   For the past year I’ve been using Trello for Charleston Software Associatesbase projects.

As a single-man operation with occasional support from outside contractors, Trello worked well.  For a larger project, however, it quickly became overwhelming.  10 lists, 300+ cards.  It was a nightmare to find what people were working on, what should be done next, or just finding an important document. The quest was on to find a new task and project management tool.

After reaching out to a half-dozen of my highly-respected CTO-level peers I’ve come to a realization.  There is no good online collaboration / project management tool.   The answers that came back often were accompanied with “it seems to be working OK, I guess” or “we never found one we really liked”.   This is from people that are running operations with anywhere from a dozen to hundreds of employees.   They’ve done their homework.    Nobody came back with a “you must use THIS, it rocks”.

What Are People Using?

It seems a combination of tools, many of which I’ve already explored.  Most corporate teams are using a project/issue management tool for the tech team, a basic task management tool for the rest of the team, a group chat application, and Google Docs.

JIRA for Tech Issue Management

JIRA was a common refrain, but only for the technical team and usually directly related to code development and issue tracking.   Apparently it is good for tech geeks but not simplistic enough for executive and management teams.   Having used JIRA in the past, I know where they are coming from.  It is great for complex technical projects where code commits, issue tracking, bug reports, and other software development lifecycle (SDLC) tasks arise.  Not good for general business task/project management.  If you need a PHD in computer science to use a web app it is not a good tool for the entire business team.

Basecamp, Trello

For task management there was no clear answer.  The answers were different from nearly everyone that responded.  Basecamp was repeated twice. Trello had two “votes”.  People are all-over-the-map on this one.  Apparently there is not a single outstanding task/project management tool for executive teams.  This is where everyone seems to be making a compromise between “too simplistic” or “overly complex”.   Personally I think Basecamp could run away with this category, but it is readily apparent that they have been established for so long that they are no longer in competitive development node; meaning no significant new features will be released any time soon.

Skype, Google Hangouts, HipChat, Slack

Group chat was another area where I received a different answer from everyone that responded.   Skype seems to be the go-to default for many people I’ve worked with in the past, but in my small sample-set there was literally not a single repeat recommendation.  Personally I prefer Google Hangouts.  Their recent updates work far better on a variety of devices and OS deployments.  Google Hangouts has also added a quick-download for doing live broadcast streaming, audio conference calls, video conference calls, and screen sharing from a fairly simple UI (they call it “On Air”).  For my deployments Google Hangouts works far more consistently than Skype.  Skype, however, seems to be the defacto standard as 90% of remote teams I work with all seem to have a Skype account.   I think Google Hangouts with their free International calling minutes and improve broadcast/screencast options will soon make a dent in Skype’s dominance.

Google On Air provides broadcast live video, live screencasts, conference calling, video conferences, and more.  Too bad they make it a "hidden" feature.   Go to Google Plus and start a video chat.  It's easy if you find the link!
Google On Air provides broadcast live video, live screencasts, conference calling, video conferences, and more. Too bad they make it a “hidden” feature. Go to Google Plus and start a video chat. It’s easy if you find the link!

Google Docs

This is the only option that was fairly ubiquitous.  NOBODY mentioned Microsoft Office as an online document sharing/collaborative editing tool.  Seems like Google has run away with this category much to the chagrin of Microsoft.   Microsoft Office was, and still is, the desktop document editing standard.   In the online world, however, they have ceded this position to Google Docs.   From my personal experience Google Docs has a long way to go to match MS Office when it comes to document formatting and related tools, but for online collaboration is is simple, free, and easy to setup.  Microsoft makes it too difficult and costly to get started with their online collaboration tools.  The other downside is it would take a month to port the hundreds of documents from my Google Drive to the online MS Office offering.  Bottom line, if you are doing online document sharing use Google Docs.   Another bonus –  Google Drive, where you Google Docs live, integrates with all of the up-to-date web apps including most of those noted above.

THE Online Collaboration Tool

I’ve not found THE perfect online collaboration tool.   It simply doesn’t exist or has been created but is so low profile it isn’t on any radar including Google search.   I’ve tried over a dozen products at this point and have run into a myriad of issues as noted in my past articles.

As an aside, I have migrated my personal and CSA tasks from Trello to Asana as I have outgrown the simple format of Trello.  However Asana is not a perfect fit but is my compromise solution as anyone on my CSA team will be technophiles and won’t need training on using Asana.

The trials and tribulations of searching for the right tool included:

Trello – too simplistic for large projects.  Basecamp – search and document attachments suck.  Asana – too confusing for most users and no project-level tasks/docs is a major setback.   Teamwork – too complex.  JIRA – too tech-centric and too complex.   Glimp – too young and buggy.  There are a dozen others.    Including recent tests from companies pitching their wares to me on Twitter such as Proofhub that starts off with a blank screen after signing up; not a confidence-inspiring start.

ProofHub Initial Sign-On Screen
ProofHub Initial Sign-On Screen

Seems like online collaboration and project/task management is a market ripe for a new entry to take over the market.

Posted on

Finding WordPress Programmers

I am on a quest to find good programmers that are well versed in WordPress.   After speaking with multiple investors it is obvious that to bring Store Locator Plus to the next level I need to have talented self-sufficient staff.    I need to “up the game” from part-time support and coding positions to a senior-level PHP/WordPress expert that can be my “right hand man” when I’m not available.   This is especially important as my new media entertainment company is getting a lot of interest and starting to command more of my time every week.

The quest for a WordPress programmer is on.

Seeking :  Senior WordPress Programmer

Only apply for the position if:

  • You are an INDIVIDUAL, not a company and not an individual representing a company.
  • You have hands-on WordPress theme or plugin coding experience.
  • You write and speak English fluently.

Key skills I am seeking:

  • Well versed in WordPress coding.
  • Understand hooks and filters and have experience implementing them.
  • Possess extensive WordPress theme and/or plugin development experience.
  • Utilize proper object-oriented methodologies in their PHP implementations.
  • Use version control, git preferred, and comment documentation in phpDoc format.
  • Know and adhere to WordPress Core coding standards.

I will give preference to applicants that are geographically closest to Charleston SC USA.   Communications improve with fewer time zone differences.   They are even better when we can meet over coffee or beer on a routine basis.

Where I’m Looking

Rather than use my usual “go to” sources to find local programmers or low-to-mid-range programmers, I decided my current needs are best served by scouring the WordPress community for people that are going to be a better fit and require little training.   The usual suspects like Elance and Craigslist have failed to produce quality applicants in the past.  I’m going to completely forgo Elance as I don’t need to be spammed with 300 applicants that don’t read the requirements and are programming sweat-shops in India or some other low-cost/low-quality production shop.    (No hate mail please, I know they are not ALL like that but in my experience 9.5 of 10 of responses on these types of site are EXACTLY that).

Code Poet : WordPress Developers on G+

Code Poet links directed me off the site in fairly short order and landed me in the WordPress Developers Google group.  This is a discussion group about all kinds of WordPress “codish” topics.   There is a jobs section.  Not sure how much traffic it gets.  We’ll see.

Read my “seeking WordPress/PHP developer” post.

WordPress Developers on G+
WordPress Developers on G+

WP Hired

Free listings, quick and easy to setup.   You can upgrade to 30 day listings for $60/month.  I would post the job listing, but it takes a bit of time to be approved and listed.   They do allow for formatting of your listing and will link to your site and social media accounts.  That is a nice feature.  Not sure about the volume of traffic though.

Another free listing site that is WordPress-centric.  Requires some basic HTML if you want to format the listing.  Another waiting period so no links to that posting to see how it looks.

Jobs WordPress Net
Jobs WordPress Net
Posted on

Back to Basecamp ; Asana No Longer Viable

That didn’t take long.   After spending a few days with Asana my team decided that they could not work with that project management tool.   After spending several hours on training email, live screen casting, and phone calls I agree.

Deal Breaker : No HTML Formatting

One BIG issue was the complete lack of HTML formatting including inline image retention and CSS styling of content that is pasted into discussions and descriptions.  Asana has the annoying habit of stripping any-and-all HTML elements down to bare text.    Cleaner and more consistent interface?  Sure?  Boring as heck, hell yes.  LOSING CRITICAL ELEMENTS like charts and graphs that were part of the original content?  A deal breaker.

Asana’s response to that issue:

NOV 11, 2014  |  05:23PM PST
Hi Lance,

Thanks for the request for HTML formatting and hyperlinks in discussions of Asana. We don’t have these additions planned for the near term, but we will note your suggestion to help inform future product developments.

We appreciate knowing what you think about the product. Let me know if I can help you with anything else.



No Project-Level Documents or Discussions

I told my team that EVERYTHING needed to be attached to a task.  It is the only way to get documents into the system or to hold discussions.    After a few days it became clear that this is a really horrible design flaw.   A perfect example, creating the pitch deck.   That was the first task “Finalize Pitch Deck”.    It had all sorts of relevant comments and discussions.   Most importantly it had the in-progress and eventually FINAL Pitch Deck attached to it.
Guess what?  You CLOSE tasks when they are finished.
Guess what else?   My team started asking almost immediately “where the hell did that pitch deck link go”?   Now try explaining “go find completed tasks, it is hidden in there, no go find the task that is one of hundreds completed this month to find THE task with THAT document”.    A nightmare.
One of the things we need is place to store and find final versions of documents.  You know… the type of documents that perpetual beyond the life of a single task.    Things that are project-level or even corporate-level documents.      Asana completely fails in this regard.
Asana’s response to that issue:
NOV 10, 2014  |  03:39PM PST
Hi Lance,

Thank you for writing in with your request for project-level attachments. We don’t have that functionality at this time. I will note your feedback for the product team to consider.

As a workaround, you can also find all attachments across multiple projects using Search Views (

Please let me know if you have any other questions or suggestions.



The Other Stuff

There were also the “smaller” issues.  Important but not deal-breakers.  Things like…

Calendar Times

Adding times to event due dates so that the “Meet with Cecil and execute contract” task will be USEFUL when syncing to Google Calendar.  Without a time you end up creating TWO calendar entries, a day-long entry from Asana (the only option) and a time-specific entry in Google.   Asana’s response:
NOV 11, 2014  |  11:45AM PST
Hi Lance,

Thanks for the request for time options with due dates. We don’t currently have this on our near-term roadmap, but might consider adding this in the future.

In the meantime, I would suggest including this information in brackets at the beginning of task titles for visual clarity (see attached screenshot):

[2:00 – 4:00PM] Long walk on the beach.

Let me know if you need anything else.




The ability to add [My Website]( to make simple text links would have been nice, especially for the 255 character URLS some sites create these days.   The response?
NOV 11, 2014  |  05:19PM PST
Hi Lance,

Thanks for the detailed request for markdown support in Asana.

While we don’t have related changes planned for the near term, we will consider it and note your suggestion.

When we receive a request for a feature that’s not on our current roadmap (usually because we’ve discussed it and decided to save it for later), we label the inquiry so that when we next set priorities or decide to work on that feature, we can easily find customer requests. We prioritize on a number of factors beyond the number of requests (including staffing, cost, overall product goals), but that is certainly valuable information and we appreciate hearing your case.

We appreciate knowing what you think about the product, and your experience as a new user.

As always, you can review existing functionality in the Asana Guide:

Let me know if I can help you with anything else.




At the end of the day I did not find Asana a bad option.  I liked it better than Trello and Basecamp in many ways. However it is not about me, it is about making my team more productive and giving them the tools they need to communicate more efficiently.    The resounding vote was “use Basecamp it is far easier”.    That is saying something as they had used Basecamp for exactly two days and Asana for exactly two days and easily voted for Basecamp.
Given the fact that I spent a total of 6+ hours training my people on Asana and 15 minutes on Basecamp, the choice was clear.   If we are going to be productive Basecamp was the only choice at this juncture.
Sadly an easy-to-use yet full-featured project management and online collaboration tool has yet to surface.  I’ve tried dozens and none fit the bill of “easy enough for my executive team without lacking significant functionality”.
Do you have a project management/online collaboration tool you use and LOVE?   Tell me why!
Posted on

Asana Intro – Creating Tasks

This article is from a note I sent to my team about a new project that I am helping drive forward.  Hopefully the post will give people that are considering Asana some insight on how to use the app despite the shortcomings I’ve noted in other articles.    Asana isn’t completely unusable, I just wish they would respond just once with something other than “sorry you cannot do that and is not being considered for development at the moment”.

On to the “task creation and management” cheat-sheet for my team:


First step – CREATE A TASK
This gives you a place to log / attach stuff.    If we are not trying to accomplish a goal (aka “a task”) in relation to what you are sharing then you need to ask if this truly warrants going in Asana.
There are about 20 ways to create a new task like this the 2 simple ways:
1) Team Discussions In Asana
BTW – this should be how we do ALL BASIC PROJECT COMMUNICATION versus sending email.  It keeps the project stuff out of my inbox and in an organized/self-contained/searchable space we can all reference (Asana).
Click “Team Discussions” in the left sidebar just under the team name “Executive”:
Team Discusions
Team Discussions

Now that you are in there start typing your message.
Use the AT SIGN TRICK (@) to notify Ed that the message is for him.  Whenever you type @Ed and tab-complete the entry it will put the message in Ed’s inbox on Asana as well as post it on the board for everyone to see.
Notifying A Team Member
Notifying A Team Member

As you enter the message use the at sign trick again to create a task.    When you type @do this you will see a drop-down where it will say “New Task “do this”.  Select New Task and fill out the pop up box with the task details.
Asana - adding a task
Adding a task from a discussion.

​Fill out as much of the dialog box as you can.    The more you add the better IMO.  Assign a person, assign a due date, attach to a project, attach any relevant files or screen shots, add a description.
Asana - adding task details.
Asana – adding task details.

When you are done you can go to that task and add your commentary to the task.
That is where Ed can paste his dialogue and where Vincent can add his notes.
Just remember to type @<name> when you are doing stuff like “@Lance – please check this out and comment”.  That ensures it appears on my “Asana Radar” under tasks, inbox, etc.
Where To “Attach The Task”?
The big question is often “where the hell do I attach this”.    The short answer: don’t worry about it.    Make a best effort to put it somewhere sane.
Asana search is pretty good at finding stuff.   To give Asana more hints attach tags when creating stuff such as tagging that message with “Mojo” (just click the sales tag icon).
If you put something in the “wrong place” it can easily be moved  by clicking the right-side of any task on the “box handle” and dragging it somewhere.
– Move to different project:  drag it to the project list on the left of the screen.   It will go to the very top of the task list for that project.

– Move it into an existing task as a sub-task:  click on the target task to open the right-side-screen (1), drag the task to be moved into the now-open details for the “parent task” (2 & 3):
Moving a task.
Moving a task.

Organizing Things
I don’t have the “secret formula” on organizing this stuff.     Should tasks like “Mojo Research” and all others like it be a whole separate project called “Competitive Research”?    Maybe.    Then the task would go there.
Should it just be under one of the tasks under the “Market Research” project?  That is how I started organizing that topic.   Maybe not the best fit.  Luckily you can easily drag tasks around should we create a new “Competitive Research” project, dragging the “About The COMPETITION” task under there.
SIDE NOTE : it just dawned on me…. this dragging stuff around means we should probably have created SUBTASKS under the “About The COMPETITION Articles” task.    One for each competitor:   “Mojo Research”, “Spojo Research”, “Pojo Research”, and “General Co. Research”.    The reason?   If we did create a Competitive Research project we could “explode” the subtasks by dragging them out of the parent project and making them individual entries under the new project. 
The last option?    Make it a subtask under Finalize Business Plan since that is why we need to do competitive research TODAY.
The question to ask is “Why are we doing this NOW?”   Why are we researching Mojo?  For the hell of it?  Or are we trying to accomplish a short term goal?   IMO Mojo Research is critical to answering questions from investors.    As such it should go under “Obtain Seed Funding” and further should be in the “Finalize Business Plan” task.     That is our “guide to answering investor questions”.
By asking “Why are we doing this NOW?” and “Where does this BELONG?”   we will avoid “going down too many rabbit holes” (to steal Kent’s expression).
Posted on

Asana Project Management, Close But Not Perfect

After spending the past 2 weeks looking at Project Management tools as a replacement for the overly simplistic Trello, we settled on Basecamp.   Within a week of using Basecamp and not being able to find the content and documents we were looking for in the deluge of newly-added content to the project we decided it was making the team LESS productive.    Time to move on.   After reading another half-dozen articles on Project Management software and what other people found and liked/disliked we decided to give Asana a try.

It looks promising out of the gate, but it is not without its flaws.  Some of those flaws are significant but not significant enough to make it unusable.   Overall we decided that Asana was better at finding and referencing information.   We also liked the near real-time chat feature called “Team Discussion”.  Thus, we are moving to our THIRD project management app within 90 days.   Sadly we are doing so knowing we are making compromises.    For something this important it feels wrong making compromises, but we have yet to find the right app for us.

What We Like

Everything is driven primarily by tasks.    That keeps all content emanating from a single objective-based origin.   However projects are not always so well structured and team collaboration often needs to be more fluid.     Task-centric project management is both a blessing and a curse for Asana.   It is a blessing because you always know to look under a task for most discussions and to find a related document.   It is a curse because some things, like an over-arching project document should not be buried deep inside a task.

The near-real-time updates on the screen are helpful when multiple team members are working on a project.  You can see what other people are saying without refreshing the page.  That is nice.

It is easy to move to other projects or tasks without having to always go back to the main starting point.  Basecamp always seems like you have to “jump back to the beginning” to find what you are looking for.

The search engine and tags are great.   It is far better, and faster, than Basecamp at locating relevant items.  The personal tags on items makes it even easier to find stuff you mark as important to a specific keyword. Very nice.

Tasks can have subtasks.    That is a great feature as the main project can stay focused on primary objectives.  Subtasks and their related commentary get buried in the main task, which we feel is a good thing.


The Shortcomings

NEARLY ZERO HTML formatting in discussions    Grab an article and paste it into Asana; goodbye images, text links, and most of the text formatting.    That is a good way to make most research articles useless as graphs, charts, and related hyperlinks go away.

Asana v. Basecamp Copy and Paste Content
Asana v. Basecamp Copy and Paste Content; Basecamp is the clear winner here. We can live without out this feature, but it will be painful.

Inability to create text-based hyperlinks.  Paste in a full HTTP address and you get a nice link.   Have a long link like this:  and that creates a long sucky message in Asana.  Especially if you have several such links.    Something like this Basecamp Ed Sheeran Article would be far nicer.  Markdown anyone?  Not in Asana.

You can close a parent task even if the subtasks are not completed.  No warning.  Nada.  It just closes out the parent task.    I guess that can be good in some cases, but I would like to at least have a warning come up saying “you are closing this while sub tasks are not completed, is that OK”.

You cannot assign a task to multiple people.    I guess the Asana folks subscribe to the same flawed thinking that Basecamp subscribes to when it comes to project management.   One person is responsible for a task.   That may make sense, such as setting a project lead, but smaller companies often assemble teams where any member can work on, and close, a task when completed.     I want several people to have responsibility for a task.  ESPECIALLY when you have parent tasks with subtasks.

You cannot attach a document to a project.  You can only attach documents to tasks.    That means there are no over-arching project documents.  That is just not reflective of how the world works, even in a pure Project Management sense.

You can only email content to add a task not augment a discussion.   Yes, they are trying to eliminate email.  However when I am traveling the best and fastest method to communicate on my tiny phone screen is a simple email app.   I should be able to subscribe/unsubscribe to  a task or discussion and thus turn on/off the “email spigot”.    However it should be a two-way spigot where I can reply and have it append the ongoing discussion in Asana.



So far it seems better organized than Basecamp, but this is our first 24 hours with the app.    Having already discovered some major shortcomings makes us nervous.    Hopefully we don’t run into many more issues as we’ve already burned enough time on the team switching project management apps.    That is what happens when you are a lean & mean startup that is trying to move quickly.   No time to thoroughly review and test project management apps while we are already speeding down the runway for takeoff.

Posted on

Basecamp Falls Short, Still The Best Option

As the lead on a major new project, Perpetual Media, I have been searching for a better project management app.    For the past year I’ve been using Trello.   Trello is great for simple task lists for myself and for the single-man-show that is Charleston Software Associates.    However Trello falls far short when it comes to large complex projects with a big team, many tasks, multiple documents, due dates, task dependencies and more.

Enter Basecamp

Having been at this software and management gig for two decades, I’ve come across Basecamp many times in the past.    I’ve used it both for my companies and as a consultant for other companies that ran the Basecamp projects.     After a brief search for alternatives I moved the Perpetual Media project from Trello to Basecamp as the project team grew and task management became more complex.  Within 48 hours I had logged a significant number of shortcomings.

Sadly, every time I communicated with Basecamp support they very quickly responded to my inquiries with “Sorry, you cannot do that in Basecamp at the moment.”    Yes, Basecamp support was lightning fast.  That was great.    But fast support is easy when you only need to press the canned “you cannot do that” response button.  Makes it easy to work through an incoming support queue.

What Is Wrong With Basecamp?

Here is my short list compiled in the first 24 hours of use while managing a team of 3 other people that are not as geeky as I.   The biggest problems by far are the TONS of duplicate links and content, disconnected discussion threads, and search that does not always find what I need within the project.

Cannot link existing discussion to new task.

Start a discussion, then derive a task from that discussion.  You cannot make this discussion the default thread for the task.

This is an issue as now any comments made under the task creates a second discussion.  Which leads to the next issue.

Cannot merge discussions.

See above.

Not too mention you cannot merge multiple related threads into a single discussion.

Every Task, Discussion Etc. Creates A New File

Start a discussion, attach a Google Doc file (GD file) i .e. a Pitch Deck .   It adds a file to the file list on the project.

Create a task based on that discussion.   There is no way to reference that pre-existing GD file.    Thus you need to attach the very same GD File, creating a second copy of the GD file.

Cannot Assign Task To Multiple People

Create  a task to assign to a team or a few individual people?   Cannot be done.   Hugely lame.    Should allow for at least assignment to a team.

Cannot Create Subtasks

Create a task that has subtasks?  Not possible.     Good-bye any concept of dependencies or “this needs to be done before that is done” or even “this big task requires these several small tasks be done”.

BC Docs (Notes/Text Docs)  has no indent feature.

Docs, like this on Basecamp, has no way to indent paragraphs.   Or bullets lists so you can have standard bullet indents.

Create a Link in a BC Doc – links  you off-BC

Add a link like this: to a BC note and now every time you click it  you are off BC instead of having it open in a new tab.

Cannot Rearrange Order of Primary Sections on a Project

You cannot re-arrange the page layout of a project.   For example you cannot put the To Do list above the discussions.  As per the above topics the current layout leads to people creating stand-alone discussions first when they should be discussions attached to a To Do item.   Since there is no merge discussions this creates threads about the same topic that are never connected.  It become a laborious process to track down all relevant comments/discussion.

Seeking A Solution

Gahhh…. the more I use BaseCamp the more cumbersome it becomes!   I’ve reviewed at least 6 other PM tools.   Most are overly complex.  BaseCamp is the best SIMPLE interface I’ve found so far.

However, after searching for a phrase I know I had in a discussion and getting 12 WRONG results,  I’m on the PM search again this morning.

Someone, somewhere MUST have made a Project Management Tool that does not SUCK!

Before we make another jump, which consumes far too much energy, I am going to research and setup, and try to get things done in whatever tool I find before inviting anyone to the app.   For now use BaseCamp but I don’t think it will be long-lived.

Based on their canned “sorry BaseCamp cannot do that now” response and how many people I’m finding that have complained about the very same shortcomings for YEARS, I don’t think BaseCamp has any real interest on improving their user experience. Sad for such a good start.

A lesson for PM:  continually innovate & improve or die.


Alternatives To Basecamp

Here are some alternatives I tried.  I did not perform in-depth reviews.  My primary goal is to get a job done.     If something was difficult/confusing when getting started I dumped it.    Apps should be intuitive and get you “out of the gate” without performing 10 hours of setup or reading 12 pages of documentation (yes, I know I MUST improve that for my Store Locator Plus experience for my customers!).   If a project management tool required me to perform ANY setup other than start typing a project name, inviting some people, and typing a task name before using it the project was out.    Here is  what I found.


Pros: Simple account creation, simple setup, good user interface that makes it very easy to start creating “task groups” (lists) and tasks (cards).   Easy to assign multiple people and due dates to cards.

Cons: Hard to find and manage the calendar interface, event/time based entries seem secondary, no good overall document management/pool, no over-arching “view or discussion” for a project as a whole, my users found it difficult to find things.

Bottom line: for a large complex project you quickly end up with far too many cards and lists due to the “task list is king” focus of Trello.   Great for simpler projects and to-do list.  I use it for my personal “do this today/tomorrow/next week” reminders and task management.


I’ve used JIRA in the past.  It is a big complex beast that takes some time to setup.    I didn’t evaluate that tool this time around due to multiple crashes and problems when trying to get it setup as the “next step” in my Bitbucket repository management.   I tried to setup a small team of programmers to help with Bitbucket tasks, but JIRA imported things incorrect, took an inordinate amount of time to configure and setup, and after spending hours on email and live chat with the tech support team to be left with a “we need to look into this” result, I decided JIRA was not for me.   A week later they got back to me to tell me they “reset the project” and “try again”.    Try wasting 12 hours getting it to work for a second time and hope it went OK?  No thank you.

Why I didn’t consider it for this project?   I am familiar with the UI and it  is far too complex for my team to work efficiently in the system.

Software should NOT be training users it should be serving the users silently and without fail.


I signed up for Mavenlink and tried to get my first project and tasks started.   After 15 minutes answering questions to get the project configured, half of the time spent on “set the template and look-and-feel of the project”, I gave up.   Far too much time configuring and “turning dials” rather than “jumping right in” to creating projects and tasks and attaching related documents.   I should not have to decide on the best UI for my users.   They should provide a default and let me tune it later.  I don’t want a tool I need to configure.

There are also far too many buttons and menus all over the place.  This will confuse the members of my team as they hunt for “what to click” to get their job done.

I quickly dismissed Mavenlink due to the “overloaded UI”.


Podio, now owned by Citrix, was written off almost immediately.   It took me far too long to dig around their overly-enterprise 90’s style web menus to find screen shots and information about the Podio product.    Once I found what I was looking for I could tell that simple UX and modern design style was not their strong suit.   They are geared toward large bloated enterprises that are used to 80’s and 90’s style user interface architecture with 3,000 menus and a myriad of complex setup rules that they feel make an app better.    Bigger is not always better.    Sometimes simple works best.


I got a little further with TeamworkPM than some of the other apps I tried.   The sign up was simple and the interface is a decent compromise between overly-complext menu-driven systems like Mavenlink and Podio and the simplistic UI of Basecamp or Trello.    I created projects and tasks quickly but the next major element for my project management tool was adding Google Docs to the tasks.

The failure to quickly and easily attach pre-existing Google Docs to the tasks was a failure.     We use Google Docs extensively as I prefer their collaborative editing and discussion suite over solo desktop-based solutions.   The inability to easily add Google Docs to the project was an immediate set back and terminated my evaluation of TeamworkPM.    When I go to files/add files it should provide me with a Google Docs or Upload option.   Basecamp nailed it.   TeamworkPM would do well to emulate that part of the Basecamp experience.



Still Searching

I am on the quest to find the right PM for  us.     I need  a simple UI.   I need to be able to add my team members, create a project, assign tasks, and attach Google Docs with ease.     When I attach a document or start a discussion I should not end up creating 300 duplicates of the same content.   Finally I must be able to search and find the relevant content within a project or across all projects with ease.

On to some more project management app reviews.    I may even post about my findings if I find the right one or add to the list of failed attempts.

Have a suggestion and not a “pitch”?   Share!

Posted on

Getting Started With SLPDev Cent 7 Vagrant Box

This article is for the Store Locator Plus development team that is helping maintain the Store Locator Plus plugin family.   It is a basic outline on how to get the SLPDev Cent 7 virtual machine, a private distribution given to qualified developers, personalized and ready for use to start working on the Store Locator Plus plugins.

Get The Box

The first step is to get the latest SLPDev Cent 7 Vagrant box image from Charleston Software Associates.   The image is approximately 2GB and requires a working Vagrant installation on your laptop or desktop computer along with a working install of VirtualBox.   You will use the provided image to create a new VirtualBox machine with the a self-contained GUI development environment for the Store Locator Plus WordPress plugin.

What Is On The Box

The box is configured according to the CentOS 7 WP Dev Kit specification with a few additions.    An ssh key has been configured to provide easy access to the repositories. The WordPress installation has been completed with a site title “SLPDev” and an admin user login of vagrant / vagrant.   You get to the WordPress site by opening Firefox via Applications/Favorites and surfing to http://localhost/.

All of the current Store Locator Plus plugins are installed via the BitBucket git repositories including:

  • Store Locator Plus
  • Contact Extender
  • Directory Builder
  • Enhanced Map
  • Enhanced Results
  • Enhanced Search
  • Event Location Manager (in development, debaat/CSA)
  • Janitor
  • Location Extender
  • Pro Pack
  • Real Estate Extender (in development, aknight/CSA)
  • Social Media Extender (debaat)
  • Store Pages
  • User Managed Locations (debaat)
  • Widgets

The Selenium IDE test suite is installed in the vagrant home directory as is the WordPress Dev Kit with the Store Locator Plus publication scripts.

Personalize The Box

Before starting development you will want to change several identifiers so your code updates can be attributed to you.    You will need to run SmartGit and enter your BitBucket username and password credentials to access the repositories.    You will also want to configure git to set your username and email as the default commit author.

Git / SmartGit Update

Run the following commands from the Linux command line terminal (Applications / Favorites):

git config --global ''

git config --global 'Your Name'

The next thing you should do for SLP development is open the SmartGit repository and pull (rebase, not merge as the default mode) and fetch the latest updates for any plugins you are going to work on.

Posted on

Good git Behavior for the CSA Code Team

I am in the midst of training and evaluating people that are interested in working on the Store Locator Plus code projects.   Some people are veteran coders.  Others are learning coding in a team environment for the first time.    Here are some basic guidelines on using git when working on the CSA codebase that can be useful if you are using git version control for any team project.

Use Descriptive Commit Messages

Your commits messages should be descriptive at least 99% of the time.   These are not good commit messages:

Inline image 1
When the team or project lead goes to integrate your code with the work everyone else has contributed they should have some clue what each commit was doing.     A single word is NEVER a good commit message.   At the very least you should almost always be using a noun and a verb in a commit message.   Debug actions would be at least a little better than “debug”.   Better yet, us a short sentence.

Create Separate Debugging Branches

Since we are on the topic of debug commits, they should rarely be in  your “mainline” branch of code.  Yes debugging happens.    Yes, they often end up in a series of commits on a code branch especially when working on a complex piece of code.  However if you start out with a cycle of coding where you know “I’m going to do a lot of debugging to figure out what is going on here” then it is almost always a good idea to start by creating a new “debug_this_whacky_thing” branch and dumping all your “code barf” in there until you figure things out.
When you do, go back to the “real_work” branch and check that out and put the valuable pieces of code from your learned lessons in that branch.
If you manage to stumble across a useful piece of code on your “testing_stuff” branch you can always add it on to your “real_work” branch with something called “cherry picking”.    That is a git command and in SmartGit is simple to execute.  Checkout the real_work branch, then go select the one or two commits that did something useful from the debugging_code_barf branch and “cherry pick” them.

Commit Often

Small frequent commits are better with just about any version control system and ESPECIALLY when using git.   It tends to create fewer code conflicts during a merge.     This does not mean committing every single line of code on a per-commit basis.   However you should commit every time you write code that changed something and are at a “stopping point”.    Typically this is at the point of “ok I am going to test this now and see if it does what I expected”.    Often it is best to do a “dry run” and make sure there are no blatant errors such as syntax errors before committing.     Try to commit unbroken, if not functional, code.    In other words it should not crash whatever you are working on with an immediate and obvious “your forgot a curly bracket” error.

Use Branches

Like the debugging branch noted above, any time you start a new concept, path,  model, design, or feature start a new branch.   Try to work from a root point, such as the last major release of a product or the last tested-to-be-working version of the software.    Unless your new concept requires the code of a prior effort going back to the root “last working base copy we published” is a good starting point.    The project or team lead will merge code into a prerelease or production (master) branch or an integration branch to create a new product release version.
If you have done work on several feature branches that are not dependent on each other but work better together, create your own integration branch.   “my_super_pack” branch can be a merge-commit of your “feature_a”, “super_awesome_feature”, and “feature_b” branches.

CSA Branch Standards

At CSA I like to use a 3-branch methodology for managing projects.    The branches are master, prerelease, and integration. All 3 branches are only aligned when a new production version is released and there is no ongoing development on the project.
master – always points to the latest production release available to the general public.   This is where the current commit pointer ends up after integration and prerelease phases are complete and the production scripts are executed.  This branch is always tagged with the current production release number.  Developers only start new branches here if a prerelease branch does not exist.
git master branch
prerelease – always points to the latest release of the software that was published to the public in prerelease format.  Prerelease software is not fully tested, though usually has passed the rudimentary functional testing.  this is considered the “beta” version of the next master release.  All CSA Premier Members and beta test groups are given access to prerelease software.    This branch is always tagged with the current software version number, which is bumped if further changes are needed before “going to production”.   Developers almost always start new branches here.
git prerelease branch
integration – this branch points to the current integration branch used by the project manager to pull together developer commits in preparation for conflict resolution and rudimentary software testing prior to being given an official “prerelease” stamp.  This is the release used for internal testing and development and should be considered unstable.    Developers rarely start new code branches on this branch.
git integration branch


Posted on

Adding gotoIf and other Flow Control to Selenium IDE

selenium ide

Some of my Selenium IDE test scripts make use of the gotoIf command.   Flow control logic like the gotoIf and label statements are not part of the standard Selenium IDE core library.   Like most apps these days, Selenium IDE has a method for extending the base functionality with plugins and core extensions.   The “sideflow” core extension from darenderidder is an extension that provides the oft-referenced goto controls for Selenium IDE.

Adding sideflow Flow Control To Selenium

I like to keep current with any repository updates, so I use git to clone the repository into my documents folder on my Vagrant WP Dev Kit CentOS box.    Using SmartGit I clone via the github URL:

Open Selnium IDE, go to the Options menu and select options.  Under the Selenum Core extensions browse to the sideflow.js file that was cloned via git.

Installing Selenium IDE SideFlow Extension
Installing Selenium IDE SideFlow Extension

The other option is to just download the sideflow.js file here.   No promises or guarantees this is current or will work on every system.  You should really grab the code from the source.

Example Selenium IDE Script

Here is an example script that uses flow control to ensure only ONE Store Locator Plus locations page is added. If the page already exists it skips the page setup process on my test site.

<tr><td rowspan="1" colspan="3">SLP - Add Page, SLPLUS</td></tr>
<!--Open WP Pages Interface-->
	<td>xpath=//table[@class='wp-list-table widefat fixed pages']//td[@class='post-title page-title column-title']//a[contains(text(),'Locations')]</td>
Posted on

Improved Grunt Tasks for the Vagrant WordPress Dev Box

Grunt WordPress Dev Kit

Last week I found myself having to rebuild my WordPress plugin development box after a “laptop fiasco”.   While it was a lot of work it feels as though I am in a better position to not only recover my environment quickly but also distribute it to other developers that are interested in assisting with plugin development.

If you are interested you can read more about it in the related WordPress Workflow and related WordPress Development Kit articles.

This morning I realized that having a new almost-fully-configured Vagrant box for my WordPress Development Kit allows me to make assumptions in my Grunt tasks.    While it would be more flexible to create options-based tasks where users can set their own configuration for things like MySQL usernames and passwords, the WP Dev Kit Vagrant box assumption allows me to bypass that for now and come back to it when time allows.  Fast turnaround and fewer interruptions in my already-busy work flow is paramount this week.

Today’s WordPress Dev Kit Updates

The official tag I’ve assigned to the newest WordPress Dev Kit is version 0.5.0.  Here is what has been added.

WordPress Database Reset

One of the tasks I do fairly often is to “clear the data cruft” from my development box WordPress tables.  I  accomplish this by dropping the WordPress database and recreating it.

The Vagrant box makes this far easier as I know that when I spin up the WP Dev Kit Vagrant box it already has the WordPress MySQL tables setup.  I also know the username and password.  As such I can execute a simple drop/create table as the privileges are already in place in the meta data for MySQL and will carry over.   Thus I only need to execute a single mysql-cli command to get the data reset.

To get this working in Grunt I added the grunt-ssh module and created a ‘resetdb’ target.

I can now reset my WordPress table with a simple grunt command:

$ grunt shell:resetdb

Online Documentation

The other change I made today will help me remember how the heck all this stuff works.  Now that the dev kit has grown to a couple of commands I know I will soon be forgetting the nuances to certain build and workflow processes.   I started creating my own Markdown files I realized that Bitbucket has a system for using .md files on the repository wiki.    The easy solution was to add the Bitbucket wiki as a submodule to the WP Dev Kit repository and edit the file there.    Doing so means that any doc update will also be published immediately when pushed back to the repo at the WP Dev Kit Bitbucket Wiki.

Now back to getting the Store Locator Plus and Enhanced Results first-pass testing run and prerelease copies published for my Premier Members.