How to debug your WordPress plugin

If you are developing a plugin on WordPress, you will need to debug your code as you go.

To enable debugging, go to your wp-config.php file.

Find the line…
[source language=“php“]define(‚WP_DEBUG‘, false);[/source]

Replace the line above with the following…
[source language=“php“]
// Turns WordPress debugging on
define(‚WP_DEBUG‘, true);

// Tells WordPress to log everything to the /wp-content/debug.log file
define(‚WP_DEBUG_LOG‘, true);

// Doesn’t force the PHP ‚display_errors‘ variable to be on
define(‚WP_DEBUG_DISPLAY‘, false);

// Hides errors from being displayed on-screen
@ini_set(‚display_errors‘, 0);
[/source]

Now you all warnings and errors will show up in the /wp-content/debug.log file, including WordPress warnings of deprecated functions.

You can write directly to this log from your plugin using the error_log() function.

Typically…
[source language=“php“]
//output some debug string
error_log( ‚this works yo‘ );

//output some array/object
error_log( print_r( $some_obj_or_array, 1 ) );
[/source]

Kudos to this post. It has some good plugin development tips, including how to enable debugging on WordPress.

HTML5 Data attributes in HTML and jQuery

When writing javascript, it is often necessary to include metadata in the HTML markup, to help define some element or behaviour. There are common options available. You can use hidden inputs and/or standard attributes like class or title to store this metadata. However with HTML5’s data attribute, storing and parsing this data has become a whole lot easier and cleaner.

The syntax is straightforward. Any attribute prefixed with data- will be treated as data storage.

[source language=“html“]<div class="test" data-foo="bar"></div>[/source]

jQuery accesses this data like so…
[source language=“javascript“]var data = $( ‚div.test‘ ).data( ‚foo‘ ); // returns bar[/source]

Support for the data attribute has been added since jQuery version 1.4.3. jQuery’s implementation is smart enough that it can parse the attribute easily and even determine the correct data type used.

What I have found really useful is the fact that the jQuery can parse JSON syntax and return a JSON object. This makes passing data in PHP trivial, using the json_encode method. We also need to use htmlspecialchars method to escape or convert any quotes in the JSON string.
[source language=“php“]
<?php
$test = array( ‚row‘ => 1, ‚col‘ => 6, ‚color‘ => ‚pink‘ ); //create array of data you want to pass to jquery
$test = json_encode( $test ); //convert array to a JSON string
$test = htmlspecialchars( $test, ENT_QUOTES ); //convert any quotes into HTML entities so JSON string behaves as a proper HTML attribute.
?>
<div class="test" data-complex="<?php echo $test ; ?>"></div>[/source]

The jQuery parses the JSON string like so…
[source language=“javascript“]var test = $( ‚div.test‘ ).data( ‚complex‘ ); // returns JSON Object

console.log( test.color ); // outputs pink![/source]

Important to note that this method is also backward compatible with older browsers, so there is no excuse not to give it a go!

Filter IP addresses with PHP

You may at some stage want to filter an online service based on IP address. In other words, you may want to block or grant access to a request based on their IP address. This can be handled in PHP by doing the following.

If you have the IP addresses, then it is trivial.

[source language=“php“]

//First check IP address is valid
$request_ip = $_SERVER[‚REMOTE_ADDR‘];

if ( !preg_match( "/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/", $request_ip ) )
return false;

$blacklist = array(
‚111.222.12.11‘,
‚222.111.21.22‘,
‚221.112.11.12‘
);

//check that ip is not blacklisted
if ( in_array( $request_ip, $blacklist ) )
return false;

[/source]

If you want to include a range of IP addresses, best to use a regular expression.

[source language=“php“]

$blacklist_ip_range = array(
‚/^122\.244\.(\d+)\.(\d+)/‘, //for IP address in the range 122.244.0.0 – 122.244.255.255
‚/^123\.(\d+)\.(\d+)\.(\d+)/‘, //for IP address in the range 123.0.0.0 – 123.255.255.255
);

foreach( $blacklist_ip_range as $ip ) {
if( preg_match( $ip, $request_ip ) )
return false;
}

[/source]

If you have a better solution, then please let me know.