SEO Plugin for WordPress | Sponsored Plugin Review

This plugin fills a void in the SEO plugins that are available for WordPress.  Most SEO plugins tend to focus on keywords, titles, and metatags.  While those are important, one of the areas that is missed is how Search Engines rank your links based on how your backlinks are titled.

Google has an algorithm that filters for link spam and other search engines (including Google) look for keyword rich links.  Your keyword rich post is not benefited when sites are linking to it with “click here.”

But how can you control the text that people use in linking to your site?  SEO Link Rotator fills this void by giving you the ability to rotate the link text that people use when copying a link to your site.  Much like social bookmarking plugins that provide a “link to me” type of button, SEO Link Rotator provides a button to provide a link, but it rotates through up to 5 possible sets of link text that you define via the WP admin.

Pros

This plugin is a snap to set up.  And there is a free version that allows you to try before you buy.  (The free version is fully functional, but does not allow you to set 5 possible links.  It defaults the the post title.)

Not only is it easy to set up and install, it’s easy to start using.  Once activated, it will automatically place a button at the end of each post, encouraging your readers to link back to you.  No edits to your theme are required.  If you are using the pro version, you can set your 5 possible text links on the post edit panel.

Cons

As a WP Plugin developer, I am generally a little more critical of plugins from both an operability standpoint and how the plugin is built and coded.  The SEO Link Rotator plugin is pretty well written from a php development standpoint.

This is more nitpicky rather than a major flaw, but I’d like to see admin panel functions broken out to a separately loaded file rather than the main plugin file.  While this isn’t a concern for someone running a blog that doesn’t get much traffic or is on a dedicated server, if you have a high traffic blog or are on a shared system, this is extra and unnecessary bulk that should be trimmed.  I would suggest the developers consider breaking out the admin functions to a separate file that loads only if the user is an admin.  This makes for a much more efficient plugin for busy sites.

Give it a try

Overall, I like the plugin.  It is not an “also-ran” of the many social bookmarking/linking plugins out there already; ditto for the meta-tag SEO plugins.  This plugin is unique, and as I said before, it fills a void in the the WP SEO plugin arena.  Give SEO Link Rotator a try.  With the free version, you can easily determine if this plugin is right for you.

This is a sponsored review for which I received compensation.

Posted in Blogging Tips, Plugin Reviews, WordPress | Tagged , , | 5 Comments

Problogger offers special November discount

I’ve written about Darren Rowse and his 31 Days to Build a Better Blog course before.  I think very highly of Darren, his book, and his course.

This month, Darren has been offering both the 31 DBBB course/ebook AND his new(er) book Copywriting Scorecard for Bloggers for 25% off.  But you MUST ACT NOW to get the discount!  This is only for the month of November (which, by the way, ends tomorrow).  The discount code is November25 (think 25% off for November).  Enter this code when prompted at checkout to get your discount.

31 Days to Build a Better Blog

Copywriting Scorecard for Bloggers

Both ebooks are regularly $19.95, but with the discount, they are $14.95 apiece. I recommend you get both – especially since they are not usually on sale!

Posted in Blogging Tips | Leave a comment

WP-Members™ new feature release

I am very excited to announce an upgrade to the ever-popular (and FREE!) WP-Members™ plugin. This is tentatively going to be the 2.3.3 release, although depending on how much gets completed, it may push us to call this 2.4.

Update 11/12/2010: As a new feature release, I am releasing this as 2.4.  The beta version is now available at http://wordpress.org/extend/plugins/wp-members/download/.  Just download the zip of 2.4.  This tag will remain as any updates are made to the beta, so you’ll always have the most recent release.

First, some bug fixes

Since the 2.3.2 release, there haven’t been too many bugs, which is good. 2.3.2 was a bug fix release itself and it is always a little embarrassing to have a new bug come out with the bug fix release. However, some unnoticed (and pre-2.3.2) bugs have become apparent and will be corrected in this release.  The most notable are the non-widget sidebar function and the stripslashes admin bug.  Both of these have current (and easy fixes), but they are fully corrected in the upcoming release.

If anyone notices any other bugs, be sure to let me know soon so we can attempt to get fixes in prior to this release.

And, some new features

One of the most requests (and the most needed) new features for the plugin is CAPTCHA support.  If you do not know what CAPTCHA is, it makes things difficult for automated/computerized processes to utilize the forms on your website/blog.  The Official CAPTCHA Site has some good information on this.  In our case, we want to prevent automated signups full of spam.  So I have added a new option of placing a CAPTCHA in the registration form.

There were many possibilities in going down this road.  There are a number of WP plugins that provide CAPTCHA for comments, contact, etc.  I had considered the possibility of leveraging one or more of those.  But that brought in a slew of potential landmines when compatibility is considered as well as future upgrades and how to pick one over the other.  So I chose to go with what I consider to be the standard: reCAPTCHA.  The reCAPTCHA project was chosen for a number of reasons:

  1. It is a project of Carnagie Mellon University, where the concept of CAPTCHA was introduced.
  2. It is now a project of  Google Labs / Google Code.
  3. It helps with the digitization of books.
  4. It is FREE!

It is also widely used, so (a) it will not be foreign to a number of your users and (2) if you are already using reCAPTCHA, it should integrate with your existing site.

There are unforeseen pitfalls in any new feature release and this is no exception.  While I have tried to build this with compatibility in mind, there could be potential collisions if you are using an existing plugin such as the WP-reCAPTCHA plugin.  I tried to consider how other processes utilized reCAPTCHA and tried to keep this (a) restricted to WP-Members™ and (b) built in a way that it shouldn’t interfere with other instances of reCAPTCHA in the site.  It holds its own settings for the reCAPTCHA keys and calls its own library.  Please note: if you are already using reCAPTCHA in other areas of your site, even though I’ve tried to make this compatible, there could be potential problems I haven’t noticed.

Another new process is the addition of localization.  I had been working diligently toward full localization support earlier in development, but somewhere along the way I introduced a slew of new features (essentially when the admin panel was introduced) with the intention of coming back to clean it up later.  Well… I never did.  Until now.

While I am not going to say that this release will have full support, I have diligently gone through and tried to make sure that we are ready to flip the switch.  From this release I will release a thorough POT file for anyone interested in translating.  For those of you that need foreign language support, there is already a list of potential translators that have come to me so we should have support in the future for quite a few languages.

Two other features that I want to get done, but may have to be put off are:

  • Bulk Registration Moderation
  • Bulk User Export

I’m trying to get those done for this release, but there’s quite a bit of work yet on already growing admin panel.

As always, if you have feature requests, feel free to let me know.  Just keep in mind that requesting doesn’t equal immediate implementation.

Posted in WP-Members | Tagged , , | 7 Comments

WP-Members™ ™ 2.3 Bug Fix – Non-widget Sidebar Login

An astute user recently pointed out an unknown bug that was introduced in the WP-Members™ 2.3.0 release and carries through the current 2.3.2 release.

If the user calls the wpmem_inc_sidebar function directly (as in the case of not using the widget), you will get a fatal error. I made some file structure changes in 2.3.0 in the area of the sidebar, the widget, and the login status and manually calling the function got overlooked. Fortunately, this effects a small number of users, there is an easy workaround, and I’ve already added a fix in the upcoming 2.3.3 feature release.

If you are effected by this bug and need a fix before the 2.3.3 release, you can do the following:

  • Open wp-members.php
  • At the end of the file, before the closing php tag (“?>”), add this:
    include_once('wp-members-sidebar.php');
  • Save the file
Posted in WP-Members | Tagged , , | 16 Comments

Write a simple WP plugin to add the trademark symbol (™) to your mark

You have a trademark you need to mark on your WordPress site, but you don’t want to search through the site to find each occurrence and update each post?  I have developed a plugin for you that will ™ or ® your content on the fly.  But if you are the do-it-yourselfer type, then here’s a way to make a simple plugin to filter every instance of your trademark in posts, pages, and titles.

It is assumed that the reader has a basic working knowledge of PHP as I am not going to go into explaining the particulars of the PHP constructs.  While you could just copy and paste, it will be easier if you know the basics.

Filter the Content

The first function will go through the_content and replace every instance of your trademark with your trademark(tm).  We will call this tm_the_content.  WP stores the content of a post or a page in the variable $content, which we will pass to the function.

function tm_the_content( $content )
{
   ... we'll add code here later ...
}

We will use str_replace to find the instances of Our-Trademark (replacing “Our-Trademark” with the actual trademark text you are working with) in $content and replaced it with Our-Trademark(tm).  Note, I am using &#0153 for the trademark symbol, but you could put in place <sup> superscript or <div> and CSS, or what suits your fancy.  I like keeping it simple, though.  (Note: you can also replace &#0153 with &#174; to get the registered trademark symbol (r) ).

$content = str_replace("Our-Trademark", "Our-Trademark™", $content);

Now $content has all instances of Our-Trademark replaced with our trademark(tm), but we need to send back the filtered content:

return $content;

Functions and Filters:

function tm_the_content($content)
{
  $content = str_replace("Our-Trademark", "Our-Trademark&#0153", $content);
  return $content;
}

WordPress stores the title of a post or a page in the variable $title.  Filtering $title is exactly the same as filtering $content, so we can build our function tm_the_title by essentially copying tm_the_content and changing $content to $title:

function tm_the_title($title)
{
  $title = str_replace("Our-Trademark", "Our-Trademark&#0153", $title);
  return $title;
}

And you thought this was going to be hard.  ;-)

Now we need to fire these functions at the appropriate time.  As I mentioned earlier, in WordPress, we do this by using add_filter.

In case you were unaware, WordPress has a built-in function called add_filter() that will fire a function to filter your content.  We will use two instances of add_filter() to filter both the_content, the function that gets the $content of a post or a page, and the_title, the function that gets, you guessed it, the $title.

When you use add_filter(), you need to send the function two things, what you are filtering, and the function to use to do the filtering:

add_filter( $tag, $function_to_add, $priority, $accepted_args );

The last two parameters are optional, and in this case, we will only be using the first two.  We will use this twice in our plugin to fire each of our functions:

add_filter('the_content', 'tm_the_content');
add_filter('the_title', 'tm_the_title');

Put it all together:

<?php
add_filter('the_content', 'tm_the_content');
function tm_the_content($content)
{
  $content = str_replace("Our-Trademark", "Our-Trademark&#0153", $content);
  return $content;
}

add_filter('the_title', 'tm_the_title');
function tm_the_title($title)
{
  $title = str_replace("Our-Trademark", "Our-Trademark&#0153", $title);
  return $title;
}
?>

Here is a sample of the code.

Well that’s it.  I hope that you will find this snippet of code useful.

Posted in Blogging Tips, WordPress | Tagged , , , , , , | 1 Comment

Howto: Write a simple keyword meta tag plugin for WordPress

There are various SEO plugins available for WordPress, but let’s say you have some unique needs or for some other reason want to write your own.  How would you go about doing that?

Well, this tutorial is going to show you how to write a very simple plugin to place a basic keyword meta tag in the head of specific posts in WordPress.  (Note: this is not an advanced course in SEO plugin development.  The purpose here is to give you some foundational information that can be applied to more advance projects.)

We are going to do the process in a simple function.

function my_very_simple_meta()
{
   ... some code here ...
}

Keywords will be stored in a custom field for the post so we will need to know the post ID.  The my_very_simple_meta function will be run outside the Loop, so we will need to find the ID using a method other than the_ID(); .

We will declare the $post global and use $post->ID to return the post’s id.

function my_very_simple_meta()
{
  global $post;
 $postID = $post->ID;
}

As I said, we are going to store the keywords in a custom field for the post.  To retrieve that, we use the WP function get_post_custom_values.  This function needs to know the custom field name and the post id (which we retrieved above). (For more information, see the WordPress Function Reference.)

get_post_custom_values($key, $post_id);

This function returns a value as an array, so we will store it in $arr.

$arr = get_post_custom_values('simple-meta', $postID);

Since this particular array is only going to have one value, the keywords will be in $arr[0] (the first value).  We can write the meta tag with this:

echo "";

Putting that together we get the array, then echo (print) the [0] value of the array in a meta tag:

$arr = get_post_custom_values('simple-meta', $postID);
echo "";

Now, what if this particular post does not have any keywords assigned to a custom field called “simple-meta”?  We’ll need to check that with a conditional statement:

if(get_post_custom_values('simple-meta', $postID)){
  ...something here if the condition is true...
}

If that statement is true, we will get the array and write the meta tag.  Let’s put it all together in the function:

function my_very_simple_meta()
{
  global $post;
 $postID = $post->ID;

 if(get_post_custom_values('simple-meta', $postID)) {
 $arr = get_post_custom_values('simple-meta', $postID);
    echo "&lt;meta name=\"keywords\" content=\"".$arr[0]."\" /&gt;";
  }
}

Great.  That is going to write a keyword meta tag if there is a custom field for the post called “simple-meta”.  And we can do it outside the Loop.  Now how do we get that into the <html><head> of the document?

WordPress has another fantastic action called wp_head().

add_action('wp_head', 'my_very_simple_meta');

This will fire our new function at the end of the head.

Putting it all together now in a finished file:

<?php
/*
Plugin Name: My Very Simple Meta
Plugin URI:  http://butlerblog.com/plugins/my_very_simple_meta
Description: This is a very simple plugin to place custom keyword meta tags in the &lt;head&gt; of a post or page.
Version:     0.1
Author:      Chad Butler
Author URI:  http://butlerblog.com/
*/

function my_very_simple_meta()
{
  global $post;
 $postID = $post->ID;

 if(get_post_custom_values('simple-meta', $postID)) {
 $arr = get_post_custom_values('simple-meta', $postID);
    echo "&lt;meta name=\"keywords\" content=\"".$arr[0]."\" /&gt;";
  }
}

add_action('wp_head', 'my_very_simple_meta');
?>

[View a formatted sample here.]

Exciting!  “But how do I use it,” you ask?  Save your file as something like my-very-simple-meta.php and load this to your plugins folder.  Go to the WP plugin admin and activate it.  (Note: if you copied the example verbatim, you’ll find the plugin as “My Very Simple Meta” in your list of plugins.)

Once activated, you’ll need to add keywords to a post or a page that you are going to use this for.  Create a custom field called simple-meta and put your keywords in the value field.  That’s it.  If you view the source of your page, you should see these keywords in the head as a meta keyword tag.  You are on your way to becoming a super SEO WordPress plugin guru.

Posted in WordPress | Tagged | 2 Comments

WP-Members™ ™ 2.3.2 Bug Fix – Apostrophe/Quotation marks in dialogs

Following the release of WP-Members™ 2.3.2, there was a bug brought to my attention by an astute user:

If you are using apostrophes in the custom dialog messages via the plugin’s admin panel, there will be slashes put into your content as the plugin neglects to clean up user input with “stripslashes.”  This bug actually effects all releases from 2.2.0 on to 2.3.2.

This has been address in my next release (which will include bug fixes, but will also be a feature release as we add CAPTCHA).  In the meantime, if it effects you, you can make some simple changes to correct it:

Change line 28 of wp-members-dialogs.php from:

<?php echo $wpmem_dialogs[0]; ?>

to:

<?php echo stripslashes($wpmem_dialogs[0]); ?>

Change line 195 of wp-member-admin.php from:

<textarea id="" name="<?php echo " rows="3" cols="50"><?php echo $wpmem_dialogs[$row]; ?></textarea>

to:

<textarea id="" name="<?php echo " rows="3" cols="50"><?php echo stripslashes($wpmem_dialogs[$row]); ?></textarea>

Hope this helps.

Posted in WP-Members | Tagged , , | 7 Comments

Statement regarding the use of the name wp-Member by SmartMediaPro

I recently became aware of a plugin using the name wp-Member.  This has come to my attention in the form of support issues posted in the wordpress.org forum and tagged wp-members (my plugin).  “[Plugin: WP-Members] Broken upon install — support not helpful — don’t buy.”

While that specific post has since been removed at the request of the original poster since it was not in fact referencing my WP-Members™ plugin, it makes evident a more important issue.  The plugin this user was actually referencing was not mine, but rather a plugin called wp-Member, offered by SmartMediaPro, and this is not the first occurrence of such confusion.

WP-Members™ vs. wp-Member

To make this as clear as possible, I will use the names specifically as they are marketed.  WP-Members is the plugin developed and released by me.  It is maintained in the official WordPress Plugin Repository.  It is both free and open source.  If a user of the forums on wordpress.org tags their post wp-members it will be tagged to my plugin (and my attention).  In contrast, the wp-Member plugin is a commercial plugin from SmartMediaPro.  It is neither free nor open source.  The issues that have been posted in the wordpress.org forums seem to stem from the fact that they require the installation of ionCube, a tool for encrypting php source code.

It is very clear that these two names amount to what is known in trademark law as “confusing similarity.”  A similar concept is “likelihood of confusion.”  It should be obvious that, since these two products are active in the same marketplace, there is most certainly likelihood of confusion and confusing similarity.

Date of First Use

In order to emphasize that my date of first use of the name WP-Members™ precedes that of SmartMediaPro’s wp-Member, I have, where possible, referenced third party links for date claims.  I find this to be more accurate and reliable than the timestamp on an individual blog.

When the original WP-Members™ plugin was released publicly, there were no other membership-focused plugins for WordPress of which I am aware, let alone any called WP-Members™ (or wp-Member).  The May 31, 2006 beta release announcement is not only documented on my blog, but also documented by third party archive.org.  The plugin’s page was first bookmarked by a user on bookmarking site delicious.com June 27, 2006 and listed in the WordPress Codex as early as July 13, 2006 as cached at archive.org. WP-Members™ was approved and added to the the official wordpress.org repository on 12/15/2007 as documented in WordPress’s subversion tracking.

In contrast, SmartMediaPro announced their release of wp-Member v1.1 on wp-member.com on August 27, 2008.  That seems to be the earliest post on the blog.  The domain was registered on July 7, 2008 (they also registered wp-members.com in 2010).  I cannot find a commercial use of the name prior to 2008.

If that is the case, it places my first use of WP-Members™ a full 2 years prior to their release and my inclusion in the wordpress.org plugin repository 7 months prior to their domain name purchase (the earliest date).

Going Forward

While this confusion does hurt both parties, I am doing what I can to create separation.  Understand that I have absolutely no relationship with SmartMediaPro nor the plugin wp-Member.  Additionally, based what I have outlined above, I do not believe that SmartMediaPro has a legitimate claim to the name WP-Members.

Although a commercial, pro version is in development, The Original WP-Members will remain a free product and will continue to be open source.  If the WP-Members™ that you are using was not free and is not open source, it’s not the original and official version.

Posted in WP-Members | Tagged , , | Leave a comment

WP-Members™ readme file update

It was pointed out by an astute user in the wordpress.org forums that my readme file had a mistake…

http://wordpress.org/support/topic/plugin-wp-members-not-blocking-pages

I basically wrote things backward in the readme file.

Had I worded it correctly, it is supposed to be intuitive:

  • if default = block then unblock = true to unblock

-OR-

  • if default = unblock, block = true to block
Posted in WP-Members | Tagged , , | 1 Comment

WP-Members™ to include reCAPTCHA

There has been a recurring feature request for some type of CAPTCHA support in the WP-Members™ membership plugin.  I have held off for awhile as I needed to make some decisions on which direction to go on this project.  I could reinvent the wheel by creating an internal CAPTCHA process unique to WP-Members, but that’s not really appealing for a multitude of reasons.  I had requests to support specific existing WP CAPTCHA plugins, but that wasn’t really a workable possibility either as I would have to pick one to support at the expense of others, or I would support multiple thereby complicating the process.

I settled on including reCAPTCHA.  This decision was made for a number of reasons.  First, it’s a widget that I can easily include in the existing code without too much recoding.  This means I don’t have to reinvent the wheel.  I like that!

Second, and just as important, I like the fact that it is supported by Google Labs.  This provides some long-term viability.  I like that, too!

I’ve already got some tests running, so I might have this ready to release sooner than expected.  I’ll let everyone know when I have a target date.  Honestly, the CAPTCHA part works fine.  The heavy lifting is going to be programming this to be an optional parameter in the plugin and accommodating users who are upgrading without screwing up their existing installs (always a challenge that too many plugin authors overlook).

Because WP-Members™ is used in a variety of applications, I can’t assume that users don’t already use reCAPTCHA in some form or another on their site already.  So another challenge will be to make sure this addition does not collide with other potential possibilities (i.e. users of the WP-reCAPTCHA plugin or others).  I found that when I tried to test various other plugins that I got collisions if both were installed.  So, I’ll need to be testing that as well.

If you’re not familiar with CAPTCHA and why you should use it, here’s some background:

Posted in WP-Members | Tagged , , | Leave a comment