WishlistCast goes open source

Over 5 years ago, I released the first version of Wishlistcast – a plugin to link the Nanacast shopping cart and the popular Wishlist Member membership plugin for WordPress.

Since its release, countless folks have downloaded the free Wishlistcast plugin – and it has benefited greatly from the feedback provided.

In addition, it has connected me with clients, fellow WordPress enthusiasts, Nanacast specialists and opened doors to a wide range of diverse coding projects.

It’s been an absolute blast and I’ve thoroughly enjoyed the ride.

However… all things come to an end… and after turning down several WordPress membership projects this year, and too often finding “wishlistcast”-related queries at the bottom of my inbox – I’ve realised it’s time for me to open Wishlistcast up so others can work on it.

To that end I have open-sourced the code for Wishlistcast. Any WordPress-PHP developer can now access and feel free to modify the code here:


You can download the latest version of the plugin here:


You can get the “PRO” version (previously only available to my personal clients) here:


Note that these are offered completely on an “as-is” basis. (They DO work with latest WordPress and Wishlist Member and Nanacast). I can no longer offer any sort of support or installation service for these plugins. If you need technical help, then any competent WordPress developer will be able to get these up and running. Sites like UpWork.com or Fiverr.com are a good place to find skilled people for small tasks. If you need WordPress specialists for larger projects, then I HIGHLY recommend TopTal.

And if you’re wondering what I’m up to…

Nowadays I’m focussing on realtime and mobile app development using full-stack Javascript and MongoDB (Meteor) – which is quite different from WordPress/PHP and MySQL. If you’re interested, you’ll find me over at wellcraftedapps.com.

How To Link Nanacast.com and WishList Member

Having problems?

Want to use Nanacast for Affiliate Tracking and payment handling and still deliver secured, drip-fed membership content through WordPress using Wishlist Member?

With WishListCast you can do exactly that. Here’s how…

Grab Nanacast

Grab Nanacast through http://nanacast.co (yes, that’s my link) 🙂

Grab and Install WishList Member

Refer to Wishlist documentation for this

Grab and Install WishListCast plugin


Grab WishListCast plugin at http://nanacast.com/wishlist-plugin
Upload through standard WordPress plugin install process

Create a Membership Level in WishList


Refer to Wishlist documentation for how to do this

Collect integration details from the Integration tab in Wishlist


You need to know the "Secret Word" and the SKU for the membership you want to link

Create a Membership in Nanacast

This is the membership we will link to your Wishlist Membership Level
(i.e. signing up to this Nanacast membership will add you to Wishlist)
Refer to Nanacast documentation for how to do this.

Add "Password" as a custom field


Click on Notifications / Custom fields in your Nanacast membership and add password from the list of pre-defined custom fields.

This is the same as if you were using MemberLock

Tick the box to "not show password field and Auto-Generate Password Instead"

Link to WishListCast from your Nanacast Membership Custom Fields/Notifications


This is where you will link Nanacast to Wishlist through the WishListCast plugin


If you have multiple membership levels you want to join you can use a "pipe" (|) to separate them, eg.

Note: Line breaks here are for readability – the command goes all in one long line.

New in v1.1.0 – Set a Default User Role
You can now set a default WordPress role for the new user by adding &role=roleName (e.g. &role=subscriber to the link command e.g.

If you do not specify a role, then the "New User Default Role" from your WordPress Dashboard Settings | General will be used.
If you want the new user to have NO WordPress role use &role=none

Test by creating a New member


Add a new member in Nanacast.

The member will appear in your Wishlist Members

Check member appears in WishList Members


At this point, integration is working.

If you Unsubscribe the member in Nanacast, they will be Cancelled in Wishlist (simulate PayPal / credit card recurring payment stopped).
If you Resubscribe the member in Nanacast, they are Re-Activated in Wishlist (simulate PayPal / credit card recurring payment resuming)

Set Thank You Email


Make sure that the email you send to new members directs them to your Wishlist membership site (default is Nanacast).
To do this, just change the Website URL.

Bulk uploading existing members from Nanacast to Wishlist


If you have existing Nanacast members, you can easily bulk upload them to your Wishlist site by going to your Nanacast membership list (click View Active)

Upgrading existing members – make Nanacast members "Pending"


Hit Check/Uncheck All and change status to "Pending" – this will send an unsubscribe message to Wishlist (as the members don’t exist in Wishlist yet, this will have no effect).

Upgrading existing members – find "Pending" members


Next we use the Advanced Search functionality to find the existing Pending members

Upgrade existing members – find "Pending" members cont’d


Search for subscriber’s with "Pending" status

Upgrade existing members – set status to Subscribed


You may optionally Resend email receipt – this will send your subscribers the "thank you" email with their Wishlist login details.

Disable the WordPress Upgrade Nag

I love WordPress – it’s awesome and it let’s me build fantastic and functional sites for my clients.

But I HATE that upgrade nag you get whenever a new release comes out.

Because invariably, one of my clients will log in, see the “WordPress 3.0 is available! Please update now.” message, and think that they are supposed to click the link. And you can guess the rest of the story… we’ll spend the next 2 hours restoring the site from backup because two of their critical plugins aren’t yet compatible with the latest version of WordPress.

As an aside, I’ve lately been using iTheme’s brilliant BackupBuddy plugin to copy client’s entire sites to a test domain to trial new plugins and generally test upgrades. Highly recommended – really makes transferring sites between domains a snap!

Anyway, I finally decided to bite the bullet and hide the upgrade nag message for everyone who is logged in to the site except for me.

Here’s the code I used – it goes in your theme’s functions.php file – or custom-functions.php if you’re using Thesis. Obvioulsy change the user name from “steve” to YOUR user name (check top-right corner of Admin dashboard – Howdy, xxxxx).

function hide_update_notice() {
 global $user_login , $user_email;
 if ($user_login != "steve") {
 remove_action( 'admin_notices', 'update_nag', 3 );
add_action( 'admin_notices', 'hide_update_notice', 1 );

I borrowed heavily from http://gunnerpress.com/wordpress/disable-non-admins-from-seeing-the-wp-version-update-notification and Yoast’s http://yoast.com/disable-update-nag/ in pulling this together. Thanks!

Effective Problem Solving

Do you get frustrated by technology? When things go wrong – as they inevitably do – how do you go about solving them? Do you even know where to turn for help?

I was recently asked how it was that I seemed to just “know” how to fix stuff. My initial response was that it   comes naturally – but then I wondered if I could somehow break down my thinking process and give you a way to be a better problem-solver…

It’s kinda weird to think about my own thinking, but here goes…

0. Mindset – Assume that the Problem is ME until proven otherwise

I start with the assumption that the problem is caused completely by me or my own faulty equipment. This way, I allow myself to take full responsibility for finding and fixing the problem – rather than assuming it is caused by someone else which dis-empowers me from being able to fix the problem.

A lot of people hit a technical problem and immediately jump to the conclusion that “oh, that software doesn’t work” – in spite of the fact that hundreds or even thousands of other people are successfully using it to do whatever it is that supposedly “doesn’t work”.

Accept that the problem may very well be you or your machine or your particular configuration, and it enables you to tackle the problem with the mindset that it CAN BE FOUND and FIXED!

1. Define the problem and the desired outcome

Start by identifying and defining the problem as well as the desired outcome (which may be as simple as “problem no longer exists!”). You want to make sure you are focused on the right issue – don’t spend a bunch of time fixing the car engine when the real reason it won’t go is four flat tyres!

2. Identify all possible contributors

With technology, there are many, many moving parts at work. I brainstorm all the likely culprits.

For example, let’s say that I am having trouble accessing a particular website.

My list might look like this:

a. Target website server might be “down”

b. Trouble with my Internet Service Provider

c. Trouble with my local network (in my home/office)

d. Trouble with my browser

I don’t drill into esoteric possibilities on the first pass (like faulty hardware) in the early stage – just hit the “big ticket” possibilities.

3. Eliminate Possible Causes

I then use a process of elimination to remove culprits from my list.

Taking the list above, I would for example:

a. Try to access another common website – e.g. Amazon.com

If I can get through to Amazon.com, it pretty much eliminates the network (both local and my ISP), and also demonstrates that my browser is working to some degree (there may be issues with a particular plugin that affects the target website though).

b. Try to access the target website from a different machine or device (e.g. my iPhone)

If I can get to the target machine from a different device, then the problem is not with the target website being “down” in any way. It is starting to look more and more like a problem on my machine or possibly my browser settings.

c. Clear browser cache completely. Stop and restart browser. Try target website again

Chances are this will fix the issue, but if not…

d. Try accessing from a different browser (e.g. Safari)

If this works, it means that the problem is in my normal browser – probably a plugin

e. Check for updates on all software I am using in the process

There may be a critical update that solves my exact problem

4. Repeat Steps 2 and 3 Until Problem Solved or Out of Ideas

Each iteration through the steps may uncover fresh paths to explore or new details that lead me closer to a solution. I will keep brainstorming possible causes and ways to test each theory until I’ve either fixed the problem, run out of ideas, OR I’ve reached the limit of what I am able to do on my own and need help from a specialist.

The good thing about going through the brainstorming and elimination steps is that I have probably identified the right person or company I need to speak with to move forward – whether that is my internet service provider, my software manufacturer or the hardware manufacturer.

5. Document What I Have Found and Ask For Help

If I haven’t solved the problem, I will quickly outline the tests I have run and the outcomes and take it to the RELEVANT specialist who can help me.

If I’m not sure which specialist to ask, I ask my network to help me identify them. e.g. “I’m having a problem displaying XYZ site in Safari on my Mac – but it works OK in FireFox. Where do you think would be the best place to get help?”

Hope this helps!


Fun with Regular Expressions (RegEx)

I’ve been having fun with Regular Expressions today!

I was after a solution for one of my clients who posed this challenge…

When someone clicks on my ads, I want to send them to my index page (index.php), and I want to pass in information about the campaign as well as the keyword.

At the moment, these are parameters, so I do this with (for example) “http://www.mydomain.com/index.php?campaign=EDUC1&keyword=mind-mapping“, but it looks ugly in their browser URL bar.

I’d really rather the whole thing was a url, but I don’t want to set up copies of my index page for every campaign and keyword combination.

Is there a way to do this?

I suggested that we could send them through to a url that looked more like this:

Which I accomplished with some regular expressions in the .htaccess file.

While I was doing this I found a really useful (and free!) online Regular Expression testing tool – saved me a bunch of time with uploading .htaccess files and testing them.

Here’s how I did it…

.htaccess changes

First, we need to ensure that their web-server’s rewrite engine is switched on:

RewriteEngine on

Then we need to replace anything that looks like this:

with this:

Regular Expressions (RegEx) to the rescue:

RewriteRule ^([^/\.]+)/([^/\.]+)/?$ /index.php?campaign=$1&keyword=$2 [L]

A RewriteRule takes the general form of:

RewriteRule <search-string> <replace-string> [FLAGS]

Let’s take our solution apart one piece at a time…

[^/\.]+ - matches any string of characters ([...]) EXCEPT (^) a forward-slash (/) or a full-stop (.)

(…)  – round brackets identify a “group” and saves it with a name for use later on. The first group is called $1, the second is called $2 and so on.

^  – matches from the start of the line

/? $ – matches an OPTIONAL (?) forward-slash(/) at the end of the line ($)

putting it all back together, this will match (campaign)/(keyword-phrase) as well as (campaign)/(keyword-phrase)/. The campaign and keyword-phrase are saved as groups $1 and $2 respectively, ready to be used in the replacement url: /index.php?campaign=$1&keyword=$2

Now, the only problem is that relative references to images and other files from within the index.php will be pointing to the wrong place. This is because the user’s browser thinks it is pointing to /EDUC1/some-keyword so references to images/some-pic.jpeg would be interpreted as /EDUC1/images/some-pic.jpeg. Of course, they are really in simply /images/some-pic.jpeg.

We fix this with another bit of RegEx magic:

RewriteRule .+/images/(.*) /images/$1 [L]

So all together the changes look like this:

RewriteEngine on
RewriteRule .+/images/(.*) /images/$1 [L] RewriteRule ^([^/\.]+)/([^/\.]+)/?$ /index.php?campaign=$1&keyword=$2 [L]

Check out this webmasterworld page for more information on using mod-rewrite, regular expressions and .htaccess.