WordPress Cron Job setup with WP-Cron.php

When setting up a cron job for WordPress we need to address a few issues. Do you really need to worry about setting up a separate cron job? Once you set it up, how do you stop it from sending you an email everytime? And once you set it up, how do you stop it from filling up your server with files?

WHY DO YOU NEED A SEPARATE CRON JOB FOR YOUR WORDPRESS SITE?

So the issue is, that by default, everytime somebody views a page on your WordPress site, the wp-cron job is run. This is not really an issue if you have less than 60 page views per hour (or 1 page view per minute). When you have a low traffic site, then there is not much else going on that wp-cron can interfere with. However IF you are getting more that 60 page views per hour, then it can start to become a much bigger issue and really slow your site down.

Lets consider an example where you are a high traffic site getting about 3,000 page views per hour (50 page views per minute). This would mean that wp-cron is being called and run for every single page view, meaning its being called and run 3000 times an hour. What if you get 30,000 page views per hour? Well now it is really interfering and causing a problem.

SETTING UP A CRON JOB

There are a multitude of sites that will teach you how to setup a cron job, so I will not go into all the details here. I will only briefly give you the two methods that you can use with their command line argument that you need.

Disbable wp-cron on page view

Regardless of which method you use, you will need to disable the wp-cron from running everytime somebody views a page on your site. You will need to edit your wp-config.php file and add the following lines at the top of the file. You can actually add them anywhere in the file really, just as long as they are after the  <?php  tag on the first line.

//Disable internal wp-cron function - setup external cron job instead.
define('DISABLE_WP_CRON', true);

Method #1 – WGET (recommended for WordPress)

The preferred way to setup an external cron job for WordPress is to use the WGET method. Make sure you include the --delete-after option otherwise your server will fill up with thousands of files named wp-cron.php.1 , wp-cron.php.2 , etc.

Use this line:
wget --delete-after http://mydomain.com/wp-cron.php

If this method keeps sending you an email everytime it runs, then you can stop the email by sending the output to a file instead with the --output-file option. This will only ever create one small file on your server as it will overwrite itself each time and will therefore not get big.

Use this line:
wget --output-file=cronlog_wp-cron.txt --delete-after http://mydomain.com/wp-cron.php

Method #2 – PHP Command Line Tool

The other method is to use the PHP Command Line tool from the cron. This is usually my preferred way to setup most cron jobs, however this creates an error in the WordPress wp-cron.php file where a require_once fails to load wp-load.php so it is not recommended.

Use this line:
/usr/local/bin/php -f /home/myroot/public_html/wp-cron.php

You may have to ask your web host where the php command line tool is located and adjust the /usr/local/bin/php accordingly. Also, you may have to ask your web host what your /myroot/ should be as well.

And if this method keeps sending you an email everytime it runs, then you can stop the email by sending the output to /dev/null instead.

Use this line:
/usr/local/bin/php -f /home/myroot/public_html/wp-cron.php > /dev/null

 

Please let me know if this was helpful by commenting below.

Best WordPress Plugins

Here is a list of my favorite and what I consider the best wordpress plugins available.

Antispam Bee by Sergej Muller

AVH Extended Categories Widget by Peter van der Does

Bad Behavior by Michael Hampton

Better WP Security by Bit51

Contact Form DB by Michael Simpson

Drop Shadow Boxes by Steven Henty

Fast Secure Contact Form by Mike Challis

Ozh’ Admin Drop Down Menu by Ozh

PC Custom CSS by Peter Coughlin

Show Hide Author by Michael Spyratos

Slideshow by StefanBoonstra

Swerve by MKDO Ltd.

TW Disable Revisions by Igor Vuckovic

TW Recent Posts Widget by Igor Vuckovic

Widget Logic by Alan Trewartha

WP-PluginsUsed by Lester GamerZ Chan

XYZ WP Newsletter by xyzscripts.com

WordPress Change Theme CSS in Real-Time

Have you ever wanted to change your WordPress theme CSS in real-time so you can see exactly what your changes are doing as you make them? What about being able to actually apply those changes quickly so you can override the existing CSS of the theme?

Well I found this great post about how to use Firebug add-on for Firefox and the PC Custom CSS plugin for WordPress so you can make live theme changes and apply them almost instantly:
http://wptribe.net/how-to-change-fonts-in-wordpress/

This post saved me a ton of time! Enjoy.

My Favorite WordPress Plugins

Just want to give a shout out to my favorite WordPress plugins. Here they are, in no particular order:

Bad Behavior – http://bad-behavior.ioerror.us/
Prevents spam without having to use CAPTCHA.

BM Custom Login – http://www.binarymoon.co.uk/projects/bm-custom-login/ 
Customize your WordPress login screen.

Developer Formatter – http://wordpress.org/extend/plugins/devformatter/ 
Uses GeSHi server-side highlighting to display your code in a post.

Fast Secure Contact Form – http://www.fastsecurecontactform.com/ 
Contact form. 

HTML Purified – http://urbangiraffe.com/plugins/html-purified/ 
Replaces default HTML filters. 

Link Indication – http://sw-guide.de/wordpress/plugins/link-indication-plugin/ 
Open external links in new window. 

Ozh’ Admin Drop Down Menu – http://planetozh.com/blog/my-projects/wordpress-admin-menu-drop-down-css/ 
A much better Admin menu plugin. 

Sociable for WordPress 3.0 – http://wordpress.org/extend/plugins/sociable-30/ 
Let people easily link to your post thru social networks. 

the_excerpt Reloaded – http://robsnotebook.com/the-excerpt-reloaded/ 
A much better excerpt plugin for your posts. 

WP-PageNavi – http://wordpress.org/extend/plugins/wp-pagenavi/ 
Page navigation. 

WYSIWYG Inline Code Command – http://wordpress.org/extend/plugins/wysiwyg-inline-code-command/ 
Easily add inline code to your post.

Permalinks and Categories Paging Problem: Page Navigation Fix

I started using WordPress at about version 2.5 and when I customized my permalinks, I had a problem when there was more than one page. Only the first page of posts would display, and clicking Previous or Next to all other pages showed up as “404 sorry, nothing found!” The paging problem has something to with WordPress thinking that /page/ is a sub-category name as opposed to being a reference to a specific page.

So here is a very small plugin that attempts to fix the problem:

Click here to download the WP-PageNavigation Fix plugin.

I remember for sure that it worked in WP v2.7 and 2.8 but have not tested it on any other older versions, although it should probably work without a problem. The problem does not seem to be present in WP v3+ so I have not needed to use the plugin anymore since upgrading, but maybe somebody else has come across the problem.

Thanks to Doug Smith at http://barefootdevelopment.blogspot.com/2007/11/fix-for-wordpress-paging-problem.html

Change Spellchecker Highlight in WordPress

Being color blind, I find the little red squiggly line that appears under mis-spelled words in WordPress TinyMCE editor window to be very hard to see. So I decided to change it to a solid yellow background, which makes it a lot easier to see my spelling errors!

Before:

After:

You just need to replace one graphics file with your background of choice.
The file is located here:
/wp-includes/js/tinymce/plugins/spellchecker/img/wline.gif

Here is how to do it:

STEP 1

Rename the wline.gif file to something like wline.gif.ORIG so that you have the original in case you want to change it back.

STEP 2

The original wline.gif file is 4 pixels wide by 3 pixels high, but I made my background 3 pixels wide by 12 pixels high. Use any photo editor that can create .gifs and make it transparent unless you want a solid background like I have.

Download my yellow wline.gif here.

STEP 3

Put your new wline.gif file in the
/wp-includes/js/tinymce/plugins/spellchecker/img/
directory and you should be good to go. You may have to clear your browser cache to get the new image to take affect.

WordPress Custom Comment Error Page

I am currently using WordPress version 3.2.1 and one mild annoyance with this version and previous versions, is the way errors on comments are handled. If you do not fill in a required field (usually Name/Email) or you forget to write something in the Comment field, then it takes you to a completely new page with a tiny error message in the middle of the screen. There are currently no hooks for this, so the only solution is to hack the core wp−comments−post.php file.

When there is an error in your comment, it takes you to a boring new page that looks like this:

With the modified code, it takes you back to your comment page and shows the error on the page, like this pic. Try it the comments at the bottom of this page by leaving the Name and/or Email field blank and clicking POST COMMENT:

DISCLAIMER: You make these changes below at your own risk! Backup your original files before you change them. I am not responsible if something breaks or stops working.

STEP 1

The following code is what actually displays the error message. Add it to your themes comments.php  file,  just above the call to the comment_form() function (download here):

STEP 2

Make a copy of your wp-comments-post.php to something like wp-comments-post.php.ORIG  so that you have a backup of the original file.

STEP 3

Replace the wp-comments-post.php with this one below (download here), and you are done!
Note that the modifications start at about line 75.
Also note that this is for WordPress v3.2.1 only:

comment_status) ) {
do_action('comment_id_not_found', $comment_post_ID);
exit;
}

// get_post_status() will get the parent status for attachments.
$status = get_post_status($post);

$status_obj = get_post_status_object($status);

if ( !comments_open($comment_post_ID) ) {
do_action('comment_closed', $comment_post_ID);
wp_die( __('Sorry, comments are closed for this item.') );
} elseif ( 'trash' == $status ) {
do_action('comment_on_trash', $comment_post_ID);
exit;
} elseif ( !$status_obj->public && !$status_obj->private ) {
do_action('comment_on_draft', $comment_post_ID);
exit;
} elseif ( post_password_required($comment_post_ID) ) {
do_action('comment_on_password_protected', $comment_post_ID);
exit;
} else {
do_action('pre_comment_on_post', $comment_post_ID);
}

$comment_author = ( isset($_POST['author']) ) ? trim(strip_tags($_POST['author'])) : null;
$comment_author_email = ( isset($_POST['email']) ) ? trim($_POST['email']) : null;
$comment_author_url = ( isset($_POST['url']) ) ? trim($_POST['url']) : null;
$comment_content = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;

// If the user is logged in
$user = wp_get_current_user();
if ( $user->ID ) {
if ( empty( $user->display_name ) )
$user->display_name=$user->user_login;
$comment_author = $wpdb->escape($user->display_name);
$comment_author_email = $wpdb->escape($user->user_email);
$comment_author_url = $wpdb->escape($user->user_url);
if ( current_user_can('unfiltered_html') ) {
if ( wp_create_nonce('unfiltered-html-comment_' . $comment_post_ID) != $_POST['_wp_unfiltered_html_comment'] ) {
kses_remove_filters(); // start with a clean slate
kses_init_filters(); // set up the filters
}
}
} else {
if ( get_option('comment_registration') || 'private' == $status )
wp_die( __('Sorry, you must be logged in to post a comment.') );
}

$comment_type = '';

//MOD Customize comment error message.
$comment_error_true = false; //MOD new code
if ( '' == $comment_content ) {
$comment_error_msg = __('Comment ERROR: Please type a comment.'); //MOD new code
$comment_error_true = true; //MOD new code
//wp_die( __('Error: please type a comment.') ); //original
}

if ( get_option('require_name_email') && !$user->ID ) {
if ( '' == $comment_author ) {
$comment_error_msg = __('Comment ERROR: Please enter your Name.
Note: If your comment text disappeared, try clicking your browser BACK button.'); //MOD new code
$comment_error_true = true; //MOD new code
//wp_die( __('Error: please fill the required fields (name, email).') ); //original
} elseif ( !is_email($comment_author_email)) {
$comment_error_msg = __('Comment ERROR: Please enter a valid Email address.
Note: If your comment text disappeared, try clicking your browser BACK button.'); //MOD new code
$comment_error_true = true; //MOD new code
//wp_die( __('Error: please enter a valid email address.') ); //original
}
}

//MOD Original code is now in the ELSE statement
if (true == $comment_error_true) { //MOD new code

//Set this to false to use default wp_die page
$use_comment_custom_error_page = true; //MOD new code

if ($use_comment_custom_error_page) { //MOD new code
$location = get_permalink() . '?comment_error_msg=' . urlencode($comment_error_msg); //MOD new code
if ( !$user->ID ) { //MOD new code
$comment_cookie_lifetime = apply_filters('comment_cookie_lifetime', 30000000); //MOD new code
setcookie('comment_author_' . COOKIEHASH, $comment_author, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN); //MOD new code
setcookie('comment_author_email_' . COOKIEHASH, $comment_author_email, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN); //MOD new code
setcookie('comment_author_url_' . COOKIEHASH, esc_url($comment_author_url), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN); //MOD new code
//setcookie('comment_content_' . COOKIEHASH, $comment_content, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN); //MOD new code //TO DO: Figure out how to get Comment field to re-appear and not be deleted.
} //MOD new code
} else { //MOD new code
wp_die($comment_error_msg); //MOD new code //This performs the default comment error page action
} //MOD new code
} else { //MOD new code

//Original unmodified code STARTS here
$comment_parent = isset($_POST['comment_parent']) ? absint($_POST['comment_parent']) : 0;

$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID');

$comment_id = wp_new_comment( $commentdata );

$comment = get_comment($comment_id);
if ( !$user->ID ) {
$comment_cookie_lifetime = apply_filters('comment_cookie_lifetime', 30000000);
setcookie('comment_author_' . COOKIEHASH, $comment->comment_author, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
setcookie('comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
setcookie('comment_author_url_' . COOKIEHASH, esc_url($comment->comment_author_url), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
}

$location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id;
$location = apply_filters('comment_post_redirect', $location, $comment);
//Original unmodified code ENDS here

} //MOD new code

wp_redirect($location);
exit;
?>