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;
}