Just whipped this up as a demo for someone, and thought it would make a great addition here as well.
The idea was to be able to link a category to a page. So if you have a page about Beavers, you can link it to your blog category called Beaver News.
This code is almost a plugin – it will work with some tweaking, but won’t do anything out-of-the-box.
It adds a category selection dropdown to the Edit Page screen, and saves the value as meta. (As-is, you aren’t allowed to not select a category, with a little hacking that should be fixable).
The code at the end includes a demo of how you might use this page meta on the frontend. This code, however, only outputs it in a meta box on the Edit Page screen.
add_action('add_meta_boxes', 'create_box' );
function create_box() {
add_meta_box( 'related_category', 'Related Category', 'box_html', 'page', 'side');
}
function box_html() {
global $post;
$selected = get_post_meta( $post->ID, '_related_category', true );
wp_nonce_field( plugin_basename(__FILE__), 'related_cat_nonce' );
wp_dropdown_categories( array('hide_empty' => false, 'show_count' => true, 'name' => 'related_cat', 'selected' => $selected ) );
}
add_action('save_post', 'save_box' );
function save_box( $post_id ) {
if ( !wp_verify_nonce( $_POST['related_cat_nonce'], plugin_basename(__FILE__) ) )
return $post_id;
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
if ( 'page' == $_POST['post_type'] && !current_user_can( 'edit_page', $post_id ) )
return $post_id;
if (!isset($_POST['related_cat']))
return $post_id;
else {
$related_cat = $_POST['related_cat'];
update_post_meta( $post_id, '_related_category', $related_cat, get_post_meta( $post_id, '_related_category', true ) );
}
}
// this just puts the feed in a meta box on the appropriate page
// it can be ripped out and added to the page template
add_action('add_meta_boxes', 'create_box_display' );
function create_box_display() {
add_meta_box( 'related_category_display', 'Related Category Display', 'box_html_display', 'page', 'side');
}
function box_html_display() {
global $post;
$selected = get_post_meta( $post->ID, '_related_category', true );
$related = get_posts('numberposts=5&category='.$selected);
foreach($related as $p) {
echo '<h4>'.$p->post_title.'</h4>';
echo wpautop($p->post_content);
echo '<hr />';
}
}