We have just reached 5,000 downloads of Advanced Events Registration, the premiere event registration and management plugin for WordPress.

To celebrate, we offering $10 off the purchase price of premium version of the plugin, to the first 50 people! Use the discount code AER5000 to claim your discount at the time of purchase. Order now and you will also get a first look at version 3* of the new Event Espresso plugin.

*Everyone who has purchased the Advanced Events Registration plugin will also get a free upgrade to the new version shortly after release.

In preparation for the release of Event Espresso (the new name of Advanced Events Registration,) we have just opened up our  new forums.

Many of you have been using the WordPress forums to ask your questions about the Advanced Events Registration plugin. The only problem with that is that I don’t know anyone has posted anything there. I try to login and check every once in a while, but that is very inefficient and some questions go unanswered. I am hoping to change this with our new forums.

So please head on over and say hello, leave us some feedback in the “Suggestion Box” or show off your site in the new “Website Showcase.”

WP-Junkie Shoping Cart Example

WP-Junkie Shoping Cart Example

Tired of adding lots of HTML button code to WordPress posts and pages?

Introducing WP E-Junkie, a quick and easy to use solution for selling product downloads using the WP E-Junkie Shopping Cart system and WordPress. All you need is an E-Junkie account, your E-junkie client id and a self hosted WordPress website.

Buttons are easily added to a post/page by pasting a small shortcode containing the product id any of your products hosted on E-Junkie.com.

The plugin is totally free and custom buttons can even be added via the plugin settings page!

Check out the new WP E-Junkie Shopping Cart, view screen shots, or see the plugin in action.

E-junkie Shopping Cart and Digital Delivery

Beware of “pirated” premium plugins and themes that may add malicious scripts and open back doors into your server and/or your WordPress installations.

Apparently several people have had the misfortune of downloading a pirated version of my Advanced Events Registration plugin from some file sharing websites. One person’s site was entirely overwritten with spam posts and links pirated software. While another persons entire website was completely wiped out.

The website owner (whom I wont mention here) actually threatened to sue me because five years worth of content was completely removed from their blog. When I asked for a copy of their receipt from the purchase of the premium plugin. The person stated they had downloaded it from a free file hosting website. Can you believe it! So I stated the obvious, “You didn’t purchase the plugin from my website, so you will need to contact whomever you received the files from. I am not responsible for code that may be distributed by outside sources.”

Moral of the story:

Premium plugins and themes may be GPL licensed (or not in some cases.) Unless you get them from a trusted source, you may be taking a major risk using them.

Related information:

How Downloading a Premium Theme/Plugin From the Wrong Place Can Ruin Your Site

Downloading a Premium Theme from the Wrong Site can be Expensive

Download Free Premium WordPress theme :What’s the Catch?

WordPress Premium Developer and Author Piracy My Thoughts

The Ethics of WordPress Themes at a Premium

Update alert!  I have been in the process of  renaming, re-branding, and redesigning the Advanced Events Registration plugin for WordPress. The new name for the all-in-one event manager has just been renamed to “Event Espresso“. We are currently shooting for an end of July release.

I have just finished uploading the very first screen shots of version 3 of the Advanced Events Registration (now “Event Espresso“) plugin for WordPress.

Coming soon to the pro version of Advanced Events Registration….Facebook Events integration.

With Facebook Events, you can organize gatherings and parties with your friends, as well as let people in your community know about upcoming events. The Events applications page displays your upcoming events, any invitations you have pending, and links to your own events.

This week I started exploring the possibility of auto-posting new events to Facebook. Imagine having a newly created event automatically appear in your Facebook profile. Lets take it one step further, invite everyone in your friends list to the event when the event is created. Is this possible? We will soon find out.

Using the premiere event management system for WordPress, the possibilities are endless.

I would love to hear from you, so please feel free to drop me a line and offer your suggestions. Your continued support and suggestions are what keeps me motivated to bring you the best event management system on WordPress.

The Authorize.net gateway is now available on the Pro Version page. If you have been patiently waiting for the addition of Authorize.net into the event registration system, your wait is now over! I have spent the last few weeks getting the pro version of the plugin ready for the NEW payment gateways and building the Authorize.net gateway and IPN.

Authorize.net is not the only thing that is new. I have released several other new addons recently as well. I added a “Member Integration Module” and a “Custom Files Addon” to the list of available features for the pro version of the plugin. Be sure to visit the pro version page to see more!

For a couple of weeks I was trying to figure out why the database tables in my plugin weren’t getting updated when the plugin was installed or activated. I had recently written a function (based on this example) to create tables in my WordPress plugin. I finally narrowed it down to the dbDelta function for WordPress. After doing  a few searches on Google I came across this article which explains the the dbDelta function in detail.

Come to find out I was missing a space between a ‘‘ and a ‘(‘ as seen below.

$sql_create_table = "CREATE TABLE " . $wp_table_name . "( " . $sql . " );";

Here is how it should have looked:

$sql_create_table = "CREATE TABLE " . $wp_table_name . "  (  " . $sql . "  )  ;";

Notice the spaces highlighted in green? That was the killer. So for a while, every time I added a new field to a table in database install file. For a while I was using a function (seen below) to alter the table and add the new fields.

function add_column_if_not_exist($db, $column, $column_attr = "VARCHAR( 255 ) NULL" ){
global $wpdb;
$exists = false;
$columns = $wpdb->query("show columns from $db");
while($c = $wpdb->get_row($columns)){
if($c['Field'] == $column){
$exists = true;
break;
}
}
if(!$exists){
if (!$wpdb->query("ALTER TABLE `$db` ADD `$column`  $column_attr")){
$error = 'There was a problem adding columns to the database.';
}
}
return $error;
}

So, if you are having trouble with the dbDelta function when writing a Wrodpress plugin. Be aware of extra spaces :)

Here is more information about the dbDelta function and creating tables with plugins:

http://codex.wordpress.org/Creating_Tables_with_Plugins

http://wordpress.org/tags/dbdelta-1

http://hungred.com/how-to/wordpress-dbdelta-function/

http://designoplasty.com/2009/05/15/not-using-dbdelta-with-wordpress/

Here is a very useful function I have written to install/update the database tables in your custom WordPress plugin. Basically I have used the examples given on the “Creating Tables with Plugins” page at WordPress.org.

In your main plugin file (ex. my_plugin.php) I define my plugin version:

define("MY_PLUGIN_VERSION", "2.16" ); //Declare the plugin version. This way we know the tables are always up to date. I usually declare this in my main plugin file.
require_once("includes/functions.php");
require_once("includes/database_install.php");
register_activation_hook(__FILE__,'my_plugin_data_tables_install');

Then in my functions.php file:

function my_plugin_run_install ($table_name, $table_version, $sql) {
		   global $wpdb;
		   $wp_table_name = $wpdb->prefix . $table_name;
		   if($wpdb->get_var("SHOW TABLES LIKE '".$table_name."'") != $table_name) {
				$sql_create_table = "CREATE TABLE " . $wp_table_name . " ( " . $sql . " ) ;";
				require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
				dbDelta($sql_create_table);
 
			//create option for table version
				$option_name = $table_name.'_tbl_version';
				$newvalue = $table_version;
				  if ( get_option($option_name) ) {
					    update_option($option_name, $newvalue);
					  } else {
					    $deprecated=' ';
					    $autoload='no';
					    add_option($option_name, $newvalue, $deprecated, $autoload);
				  }
			//create option for table name
				$option_name = $table_name.'_tbl';
				$newvalue = $wp_table_name;
				  if ( get_option($option_name) ) {
					    update_option($option_name, $newvalue);
					  } else {
					    $deprecated=' ';
					    $autoload='no';
					    add_option($option_name, $newvalue, $deprecated, $autoload);
				  }
		}
 
	// Code here with new database upgrade info/table Must change version number to work.
	$installed_ver = get_option( $table_name.'_tbl_version' );
	     if( $installed_ver != $table_version ) {
		  $sql_create_table = "CREATE TABLE " . $wp_table_name . " ( " . $sql . " ) ;";
	      require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
	      dbDelta($sql_create_table);
	      update_option( $table_name.'_tbl_version', $table_version );
	      }
	    }

Using the function is quite simple and can save a few lines of code. especially if you need to install several new tables.

Here is an example of database_install.php:

function my_plugin_data_tables_install () {
$table_version = MY_PLUGIN_VERSION; //Call the plugin version.
//Install the first table
$table_name = "my_first_plugin_tbl";
$sql = "id mediumint(9) NOT NULL AUTO_INCREMENT,
	  time bigint(11) DEFAULT '0' NOT NULL,
	  name tinytext NOT NULL,
	  text text NOT NULL,
	  url VARCHAR(100) NOT NULL,
	  UNIQUE KEY id (id)";
my_plugin_run_install  ($table_name, $table_version, $sql);
 
//Install the second table
$table_name = "my_second_plugin_tbl";
$sql = "id mediumint(9) NOT NULL AUTO_INCREMENT,
	   category_name VARCHAR(100) DEFAULT NULL,
	   category_identifier VARCHAR(45) DEFAULT NULL,
	   category_desc TEXT,
	   display_desc VARCHAR (4) DEFAULT NULL,
	  UNIQUE KEY id (id)";
my_plugin_run_install  ($table_name, $table_version, $sql);
}

I hope this helps some of the WordPress plugin authors out there.

I have recently seen several websites that I maintain, as well as several that I don’t maintain, hacked by some kind of bot net. It has been a really good learning experience to say the least.

Most of the hacked websites were running WordPress, so my first thought that it was some kind of security exploit in WordPress. Then I was asked to investigate of a few static HTML or PHP driven websites without WordPress installations. All of the hacks were very similar and had their index.php, index.html, and .htaccess files modified. In the index.php and index.html files there was javascript code and iframe virus codes appended to the end of the file that would try to install different variants of badware/malware to unsuspecting visitors. I even seen a file that had stripped out part of the code within the file and replaced it with the malicious javascript and  iframe virus browser exploits. Therefore completely breaking the file (luckily we had a backup of the now broken file and were able to to get the site working again.) Continue reading “WordPress/Website Security Exploits” »