Meta Boxes For Page Templates

Adding meta boxes to posts is fairly easy using the documentation found in the Codex. Restricting them to post types is a no-brainer, the functionality is built in using the fourth parameter of the add_meta_box() function. How about restricting meta boxes to page templates? All you need is 2 extra lines of code to detect which post you are currently on when using the function.

add_action( 'add_meta_boxes', 'my_meta_boxes' );

function my_meta_boxes() {
	$post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'] ;

	if( get_post_meta( $post_id, '_wp_page_template', true) == 'template-mashup.php' ) {

	    add_meta_box(
	        'classico_post_types',
	        __( 'Select Content Types', TEXTDOMAIN ),
	        'my_meta_boxes_box',
	        'page',
	        'side',
	        'high'
	    );

    }
}

All I’ve added is the detection of the post ID and to determine the template I grab the info from the _wp_page_template meta field.

Automated Beanstalk Revision Notifications

I use Beanstalk as an SVN server and I absolutely love it! One of the great features it has is Webhooks which can run before and/or after a deployment. You can read a bit about this on the Beanstalk Support Center, but here’s a quick and dirty working example.

include('wp-load.php');

$data = @file_get_contents('php://input');
$data = json_decode( $data );

add_filter(
	'wp_mail_content_type',
	create_function('', 'return "text/html";')
);

$headers[] = 'From: Daniel Pataki <myemail@mydomain.com>';

ob_start();
?>
	<p>
		"<?php echo $data->comment ?>"
	</p>

	<h3 style='margin:0 0 3px 0; padding: 0 0 3px 0; border-bottom:1px solid #ddd'>
		Details
	</h3>

	<table>
		<tr>
			<td style='text-align:right; padding-right:11px;'>
				<strong>repository</strong>:
			</td>
			<td> <?php echo $data->repository ?></td>
		</tr>
		<tr>
			<td style='text-align:right; padding-right:11px;'>
				<strong>revision</strong>:
			</td>
			<td> <?php echo $data->revision ?></td>
		</tr>
		<tr>
			<td style='text-align:right; padding-right:11px;'>
				<strong>date</strong>:
			</td>
			<td> <?php echo $data->deployed_at ?></td>
		</tr>
		<tr>
			<td style='text-align:right; padding-right:11px;'>
				<strong>server</strong>:
			</td>
			<td> <?php echo $data->environment ?></td>
		</tr>
		<tr>
			<td style='text-align:right; padding-right:11px;'>
				<strong>programmer</strong>:
			</td>
			<td> <?php echo $data->author_name ?></td>
		</tr>
	</table>

<?php
$message = ob_get_clean();

wp_mail( 
	'imsendingittoyou@mail.com', 
	$data->repository . ' | new revision (' . $data->revision . ')', 
	$message,
	$headers 
);

I include wp-load.php just because WordPress is there anyway and it gives me access to wp_mail(). You can use the regular old mail() function or any other method of course.

The point here is that the data can be retrieved using file_get_contents('php://input') and once you json_decode() it you can use all the available parameters. If you use my code, you’ll get something like the image below in Gmail.

An email triggered by a Beanstalk Webook

Get All Google Web Fonts

Google Web Fonts is a wonderfully easy way to add beautiful fonts to your website using CSS only, if you’re still using cufon, shame on you!

Using Google Web Fonts is very easy, but if you build themes or similar things you might want to show your users a list of available fonts. It turns out this is pretty easy to do, just get the contents of the following url.

https://www.googleapis.com/webfonts/v1/webfonts?key=your_api_key

To get an API key you might want to visit the Developer Console. From here on out it’s a trivial matter to present the data, especially since the data is returned in json.

$fonts = json_decode( 
        file_get_contents( 'https://www.googleapis.com/webfonts/v1/webfonts?key=' . WEBFONTS_API_KEY ) 
);

Avoiding Counters In Loops

When writing code I try to keep things clean but one thing has always bothered me, using $i (or something similar) as a counter, incrementing it after each step. Here’s an alternative approach which you can use with arrays to get around those pesky counters.

$navigation = array( 'Home', 'Contact', 'About' );

foreach( $item = current( $navigation ) ) {
    $current = ( key( $navigation ) == 0 ) ? 'current' : '';
    echo '<a class="' . $current . '" href="#">' . $item . '</a>';
    next( $item );
}

While not much shorter, it is much better because the current value is now inherently contained inside the actual array keys. If something doesn’t work here you can be pretty sure the problem is in the loop and if it seems to work, you can be pretty sure it actually does.

If you haven’t seen this before take a look at the current() function on the PHP codex, it has all the similar functions listed below for moving pointers and such, very handy!

WordPress Pagination Links

For ages and I ages I used a plugin for WordPress pagination when there has been a solution since 2.1 to do this easily! Don’t get me wrong, wp_pagenavi is a great plugin but I prefer not to use plugins needlessly.

The paginate_links() function allows you to create easy-to-customize pagination which you can use outside the loop as well.

$list = new WP_Query($query_args);
$pagination = array(
	'base'       => str_replace( 99999, '%#%', get_pagenum_link( 99999 ) ),
	'format'     => '?paged=%#%',
	'current'    => max( 1, get_query_var( 'paged' ) ),
	'total'      => $list->max_num_pages,
	'next_text'  => 'next',
	'prev_text'  => 'previous'			
);
echo '<div class="pagination primary-links">';
echo paginate_links( $pagination );
echo '</div>';

Since the function does not use the loop directly you can use it for listing anything as long as you know the current page and the total number of pages.

$list = range(1, 200);
$items_per_page = 12;
$pagination = array(
	'base'       => get_bloginfo( 'url' ) . '/mypage/%_%',
	'format'     => '?paged=%#%',
	'current'    => $_GET['current_page'],
	'total'      => ceil( max($list) / $items_per_page ),
	'next_text'  => 'go forth',
	'prev_text'  => 'go back'			
);
echo '<div class="pagination primary-links">' . paginate_links( $pagination ) . '</div>';