certainlyakey
7/23/2014 - 8:17 PM

Metaboxes that appear only on certain pages/posts

Metaboxes that appear only on certain pages/posts

//Metaboxes that appear only on certain pages/posts - see https://github.com/rilwis/meta-box/blob/master/demo/better-include.php. Requires rw_maybe_include function, see below

global $meta_boxes;
$meta_boxes = array();

$prefix = 'lmmb_';


$prefix_pages = 'page_';
$meta_boxes[] = array(
	 'title' => 'Настройки модулей'
	,'id' => $prefix_pages.'modules'
	,'pages' => array( 'page' )
	,'fields' => array(
		array(
			 'name' => 'Выберите цвет'
			,'id' => $prefix_pages . 'modules_color'
			,'type' => 'color'
		)
	)
	,'only_on' => array(
		// 'id' => array( 1, 2 ),
		// 'slug' => array( 'news', 'blog' ),
		// 'template' => array( 'fullwidth.php', 'simple.php' ),
		'parent' => array( 19 )
	)
);


function lm_mb_register_meta_boxes( ) {

	global $meta_boxes;
	// Make sure there's no errors when the plugin is deactivated or during upgrade
	if ( class_exists( 'RW_Meta_Box' ) ) {
		foreach ( $meta_boxes as $meta_box ) {
					if ( isset( $meta_box['only_on'] ) && ! rw_maybe_include( $meta_box['only_on'] ) ) {
				continue;
			}
			new RW_Meta_Box( $meta_box );
		}
	}

	// return $meta_boxes;
}


add_action( 'admin_init', 'lm_mb_register_meta_boxes' );


/**
 * Check if meta boxes is included
 *
 * @return bool
 */
function rw_maybe_include( $conditions ) {
	// Include in back-end only
	if ( ! defined( 'WP_ADMIN' ) || ! WP_ADMIN ) {
		return false;
	}
	// Always include for ajax
	if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
		return true;
	}
	if ( isset( $_GET['post'] ) ) {
		$post_id = intval( $_GET['post'] );
	}
	elseif ( isset( $_POST['post_ID'] ) ) {
		$post_id = intval( $_POST['post_ID'] );
	}
	else {
		$post_id = false;
	}
	$post_id = (int) $post_id;
	$post    = get_post( $post_id );
	foreach ( $conditions as $cond => $v ) {
		// Catch non-arrays too
		if ( ! is_array( $v ) ) {
			$v = array( $v );
		}
		switch ( $cond ) {
			case 'id':
				if ( in_array( $post_id, $v ) ) {
					return true;
				}
			break;
			case 'parent':
				if ($post) {
					$post_parent = $post->post_parent;
					if ( in_array( $post_parent, $v ) ) {
						return true;
					}
				}
			break;
			case 'slug':
				$post_slug = $post->post_name;
				if ( in_array( $post_slug, $v ) ) {
					return true;
				}
			break;
			case 'category': //post must be saved or published first
				$categories = get_the_category( $post->ID );
				$catslugs = array();
				foreach ( $categories as $category )
				{
					array_push( $catslugs, $category->slug );
				}
				if ( array_intersect( $catslugs, $v ) )
				{
					return true;
				}
			break;
			case 'template':
				$template = get_post_meta( $post_id, '_wp_page_template', true );
				if ( in_array( $template, $v ) )
				{
					return true;
				}
			break;
		}
	}
	// If no condition matched
	return false;
}