- Customise the edit page', array($this, 'meta_box_options'), 'acf', 'normal', 'high');
}
else
{
// find post type and add wysiwyg support
$post_type = get_post_type($post);
// get style for page
$metabox_ids = $this->get_input_metabox_ids(array('post_id' => $post->ID), false);
$style = isset($metabox_ids[0]) ? $this->get_input_style($metabox_ids[0]) : '';
echo '';
// fields admin_head
foreach($this->fields as $field)
{
$this->fields[$field->name]->admin_head();
}
// add css + javascript
echo '';
echo '';
echo '';
echo '';
// get acf's
$acfs = $this->get_field_groups();
if($acfs)
{
foreach($acfs as $acf)
{
// hide / show
$show = in_array($acf['id'], $metabox_ids) ? "true" : "false";
// add meta box
add_meta_box(
'acf_' . $acf['id'],
$acf['title'],
array($this, 'meta_box_input'),
$post_type,
$acf['options']['position'],
'default',
array( 'fields' => $acf['fields'], 'options' => $acf['options'], 'show' => $show )
);
}
}
}
}
}
/*--------------------------------------------------------------------------------------
*
* get_field_groups
*
* This function returns an array of post objects found in the get_pages and the
* register_field_group calls.
*
* @author Elliot Condon
* @since 3.0.6
*
*-------------------------------------------------------------------------------------*/
function get_field_groups()
{
// return cache
$cache = wp_cache_get('acf_field_groups');
if($cache != false)
{
return $cache;
}
// vars
$acfs = array();
// get acf's
$result = get_pages(array(
'numberposts' => -1,
'post_type' => 'acf',
'sort_column' => 'menu_order',
'order' => 'ASC',
));
// populate acfs
if($result)
{
foreach($result as $acf)
{
$acfs[] = array(
'id' => $acf->ID,
'title' => get_the_title($acf->ID),
'fields' => $this->get_acf_fields($acf->ID),
'location' => $this->get_acf_location($acf->ID),
'options' => $this->get_acf_options($acf->ID),
'menu_order' => $acf->menu_order,
);
}
}
// hook to load in registered field groups
$acfs = apply_filters('acf_register_field_group', $acfs);
// update cache
wp_cache_set('acf_field_groups', $acfs);
// return
if(empty($acfs))
{
return false;
}
return $acfs;
}
/*--------------------------------------------------------------------------------------
*
* admin_footer
*
* @author Elliot Condon
* @since 1.0.0
*
*-------------------------------------------------------------------------------------*/
function admin_footer()
{
// acf edit list
if($GLOBALS['pagenow'] == 'edit.php' && isset($GLOBALS['post_type']) && $GLOBALS['post_type'] == 'acf')
{
include('core/admin/page_acf.php');
}
// input meta boxes
if(in_array($GLOBALS['pagenow'], array('post.php', 'post-new.php')) && $GLOBALS['post_type'] != 'acf')
{
//wp_preload_dialogs( array( 'plugins' => 'safari,inlinepopups,spellchecker,paste,wordpress,media,fullscreen,wpeditimage,wpgallery,tabfocus' ) );
?>
get_acf_field($key, $post_id);
$return[$field['order_no']] = $field;
}
}
ksort($return);
}
// return fields
return $return;
}
/*--------------------------------------------------------------------------------------
*
* get_acf_field
* - returns a field
*
* @author Elliot Condon
* @since 1.0.0
*
*-------------------------------------------------------------------------------------*/
function get_acf_field($field_name, $post_id = false)
{
// vars
$post_id = $post_id ? $post_id : $this->get_post_meta_post_id($field_name);
$field = false;
// if this acf ($post_id) is trashed don't use it's fields
if(get_post_status($post_id) != "trash")
{
$field = get_post_meta($post_id, $field_name, true);
}
// field could be registered via php, and not in db at all!
if(!$field)
{
// hook to load in registered field groups
$acfs = apply_filters('acf_register_field_group', array());
if($acfs)
{
// loop through acfs
foreach($acfs as $acf)
{
// loop through fields
if($acf['fields'])
{
foreach($acf['fields'] as $field)
{
if($field['key'] == $field_name)
{
return $field;
}
}
}
// if($acf['fields'])
}
// foreach($acfs as $acf)
}
// if($acfs)
}
// if(!$field)
return $field;
}
/*--------------------------------------------------------------------------------------
*
* get_post_meta_post_id
* - returns the post_id for a meta_key
*
* @author Elliot Condon
* @since 1.0.0
*
*-------------------------------------------------------------------------------------*/
function get_post_meta_post_id($field_name)
{
global $wpdb;
$post_id = $wpdb->get_var( $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = %s", $field_name) );
if($post_id) return (int)$post_id;
return false;
}
/*--------------------------------------------------------------------------------------
*
* create_field
*
* @author Elliot Condon
* @since 1.0.0
*
*-------------------------------------------------------------------------------------*/
function create_field($field)
{
if(!isset($this->fields[$field['type']]) || !is_object($this->fields[$field['type']]))
{
_e('Error: Field Type does not exist!','acf');
return false;
}
// defaults
if(!isset($field['class'])) $field['class'] = $field['type'];
$this->fields[$field['type']]->create_field($field);
}
/*--------------------------------------------------------------------------------------
*
* get_acf_location
*
* @author Elliot Condon
* @since 1.0.0
*
*-------------------------------------------------------------------------------------*/
function get_acf_location($post_id)
{
// vars
$return = array(
'rules' => array(),
'allorany' => get_post_meta($post_id, 'allorany', true) ? get_post_meta($post_id, 'allorany', true) : 'all',
);
// get all fields
$rules = get_post_meta($post_id, 'rule', false);
if($rules)
{
foreach($rules as $rule)
{
$return['rules'][$rule['order_no']] = $rule;
}
}
ksort($return['rules']);
// return fields
return $return;
}
/*--------------------------------------------------------------------------------------
*
* get_acf_options
*
* @author Elliot Condon
* @since 1.0.0
*
*-------------------------------------------------------------------------------------*/
function get_acf_options($post_id)
{
// defaults
$options = array(
'position' => get_post_meta($post_id, 'position', true) ? get_post_meta($post_id, 'position', true) : 'normal',
'layout' => get_post_meta($post_id, 'layout', true) ? get_post_meta($post_id, 'layout', true) : 'default',
'show_on_page' => get_post_meta($post_id, 'show_on_page', true) ? get_post_meta($post_id, 'show_on_page', true) : array(),
);
// If this is a new acf, there will be no custom keys!
if(!get_post_custom_keys($post_id))
{
$options['show_on_page'] = array('the_content', 'discussion', 'custom_fields', 'comments', 'slug', 'author');
}
// return
return $options;
}
/*--------------------------------------------------------------------------------------
*
* save_post
*
* @author Elliot Condon
* @since 1.0.0
*
*-------------------------------------------------------------------------------------*/
function save_post($post_id)
{
// do not save if this is an auto save routine
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id;
// only save once! WordPress save's twice for some strange reason.
global $flag;
if ($flag != 0) return $post_id;
$flag = 1;
// set post ID if is a revision
if(wp_is_post_revision($post_id))
{
$post_id = wp_is_post_revision($post_id);
}
// include save files
if(isset($_POST['save_fields']) && $_POST['save_fields'] == 'true') include('core/actions/save_fields.php');
if(isset($_POST['save_input']) && $_POST['save_input'] == 'true') include('core/actions/save_input.php');
}
/*--------------------------------------------------------------------------------------
*
* save_name
* - this function intercepts the acf post obejct and adds an "acf_" to the start of
* it's name to stop conflicts between acf's and page's urls
*
* @author Elliot Condon
* @since 1.0.0
*
*-------------------------------------------------------------------------------------*/
function save_name($name)
{
if (isset($_POST['post_type']) && $_POST['post_type'] == 'acf')
{
$name = 'acf_' . sanitize_title_with_dashes($_POST['post_title']);
}
return $name;
}
/*--------------------------------------------------------------------------------------
*
* get_value
*
* @author Elliot Condon
* @since 3.0.0
*
*-------------------------------------------------------------------------------------*/
function get_value($post_id, $field)
{
if(!isset($this->fields[$field['type']]) || !is_object($this->fields[$field['type']]))
{
return '';
}
return $this->fields[$field['type']]->get_value($post_id, $field);
}
/*--------------------------------------------------------------------------------------
*
* get_value_for_api
*
* @author Elliot Condon
* @since 3.0.0
*
*-------------------------------------------------------------------------------------*/
function get_value_for_api($post_id, $field)
{
if(!isset($this->fields[$field['type']]) || !is_object($this->fields[$field['type']]))
{
return '';
}
return $this->fields[$field['type']]->get_value_for_api($post_id, $field);
}
/*--------------------------------------------------------------------------------------
*
* update_value
*
* @author Elliot Condon
* @since 3.0.0
*
*-------------------------------------------------------------------------------------*/
function update_value($post_id, $field, $value)
{
$this->fields[$field['type']]->update_value($post_id, $field, $value);
}
/*--------------------------------------------------------------------------------------
*
* update_field
*
* @author Elliot Condon
* @since 3.0.0
*
*-------------------------------------------------------------------------------------*/
function update_field($post_id, $field)
{
// format the field (select, repeater, etc)
$field = $this->pre_save_field($field);
// save it!
update_post_meta($post_id, $field['key'], $field);
}
/*--------------------------------------------------------------------------------------
*
* pre_save_field
*
* @author Elliot Condon
* @since 3.0.0
*
*-------------------------------------------------------------------------------------*/
function pre_save_field($field)
{
// format the field (select, repeater, etc)
return $this->fields[$field['type']]->pre_save_field($field);
}
/*--------------------------------------------------------------------------------------
*
* format_value_for_input
*
* @author Elliot Condon
* @since 3.0.0
*
*-------------------------------------------------------------------------------------*/
//function format_value_for_input($value, $field)
//{
// return $this->fields[$field['type']]->format_value_for_input($value, $field);
//}
/*--------------------------------------------------------------------------------------
*
* format_value_for_api
*
* @author Elliot Condon
* @since 3.0.0
*
*-------------------------------------------------------------------------------------*/
function format_value_for_api($value, $field)
{
if(!isset($this))
{
// called form api!
}
else
{
// called from object
}
return $this->fields[$field['type']]->format_value_for_api($value, $field);
}
/*--------------------------------------------------------------------------------------
*
* create_format_data
*
* @author Elliot Condon
* @since 3.0.0
*
*-------------------------------------------------------------------------------------*/
function create_format_data($field)
{
return $this->fields[$field['type']]->create_format_data($field);
}
/*--------------------------------------------------------------------------------------
*
* get_input_metabox_ids
* - called by function.fields to hide / show metaboxes
*
* @author Elliot Condon
* @since 2.0.5
*
*-------------------------------------------------------------------------------------*/
function get_input_metabox_ids($overrides = array(), $json = true)
{
// overrides
if(isset($_POST))
{
if(isset($_POST['post_id']) && $_POST['post_id'] != 'false') $overrides['post_id'] = $_POST['post_id'];
if(isset($_POST['page_template']) && $_POST['page_template'] != 'false') $overrides['page_template'] = $_POST['page_template'];
if(isset($_POST['page_parent']) && $_POST['page_parent'] != 'false') $overrides['page_parent'] = $_POST['page_parent'];
if(isset($_POST['page_type']) && $_POST['page_type'] != 'false') $overrides['page_type'] = $_POST['page_type'];
if(isset($_POST['page']) && $_POST['page'] != 'false') $overrides['page'] = $_POST['page'];
if(isset($_POST['post']) && $_POST['post'] != 'false') $overrides['post'] = $_POST['post'];
if(isset($_POST['post_category']) && $_POST['post_category'] != 'false') $overrides['post_category'] = $_POST['post_category'];
if(isset($_POST['post_format']) && $_POST['post_format'] != 'false') $overrides['post_format'] = $_POST['post_format'];
if(isset($_POST['taxonomy']) && $_POST['taxonomy'] != 'false') $overrides['taxonomy'] = $_POST['taxonomy'];
}
// create post object to match against
$post = isset($overrides['post_id']) ? get_post($_POST['post_id']) : false;
// find all acf objects
$acfs = $this->get_field_groups();
// blank array to hold acfs
$return = array();
if($acfs)
{
foreach($acfs as $acf)
{
$add_box = false;
if($acf['location']['allorany'] == 'all')
{
// ALL
$add_box = true;
if($acf['location']['rules'])
{
foreach($acf['location']['rules'] as $rule)
{
// if any rules dont return true, dont add this acf
if(!$this->match_location_rule($post, $rule, $overrides))
{
$add_box = false;
}
}
}
}
elseif($acf['location']['allorany'] == 'any')
{
// ANY
$add_box = false;
if($acf['location']['rules'])
{
foreach($acf['location']['rules'] as $rule)
{
// if any rules return true, add this acf
if($this->match_location_rule($post, $rule, $overrides))
{
$add_box = true;
}
}
}
}
if($add_box == true)
{
$return[] = $acf['id'];
}
}
}
if($json)
{
echo json_encode($return);
die;
}
else
{
return $return;
}
}
/*--------------------------------------------------------------------------------------
*
* get_input_style
* - called by admin_head to generate acf css style (hide other metaboxes)
*
* @author Elliot Condon
* @since 2.0.5
* @updated 3.0.6
*
*-------------------------------------------------------------------------------------*/
function get_input_style($acf_id = false)
{
// vars
$acfs = $this->get_field_groups();
$html = "";
// find acf
if($acfs)
{
foreach($acfs as $acf)
{
if($acf['id'] == $acf_id)
{
// add style to html
if(!in_array('the_content',$acf['options']['show_on_page']))
{
$html .= '#postdivrich {display: none;} ';
}
if(!in_array('custom_fields',$acf['options']['show_on_page']))
{
$html .= '#postcustom, #screen-meta label[for=postcustom-hide] { display: none; } ';
}
if(!in_array('discussion',$acf['options']['show_on_page']))
{
$html .= '#commentstatusdiv, #screen-meta label[for=commentstatusdiv-hide] {display: none;} ';
}
if(!in_array('comments',$acf['options']['show_on_page']))
{
$html .= '#commentsdiv, #screen-meta label[for=commentsdiv-hide] {display: none;} ';
}
if(!in_array('slug',$acf['options']['show_on_page']))
{
$html .= '#slugdiv, #screen-meta label[for=slugdiv-hide] {display: none;} ';
}
if(!in_array('author',$acf['options']['show_on_page']))
{
$html .= '#authordiv, #screen-meta label[for=authordiv-hide] {display: none;} ';
}
break;
}
// if($acf['id'] == $acf_id)
}
// foreach($acfs as $acf)
}
//if($acfs)
return $html;
}
/*--------------------------------------------------------------------------------------
*
* the_input_style
* - called by function.fields to hide / show other metaboxes
*
* @author Elliot Condon
* @since 2.0.5
*
*-------------------------------------------------------------------------------------*/
function the_input_style()
{
// overrides
if(isset($_POST['acf_id']))
{
echo $this->get_input_style($_POST['acf_id']);
}
die;
}
/*--------------------------------------------------------------------------------------
*
* match_location_rule
*
* @author Elliot Condon
* @since 2.0.0
*
*-------------------------------------------------------------------------------------*/
function match_location_rule($post, $rule, $overrides = array())
{
if(!$post)
{
// post is false! that's okay if the rule is for user_type or options_page
if($rule['param'] != 'user_type' && $rule['param'] != 'options_page')
{
return false;
}
}
switch ($rule['param']) {
// POST TYPE
case "post_type":
$post_type = isset($overrides['post_type']) ? $overrides['post_type'] : get_post_type($post);
if($rule['operator'] == "==")
{
if($post_type == $rule['value'])
{
return true;
}
return false;
}
elseif($rule['operator'] == "!=")
{
if($post_type != $rule['value'])
{
return true;
}
return false;
}
break;
// PAGE
case "page":
$page = isset($overrides['page']) ? $overrides['page'] : $post->ID;
if($rule['operator'] == "==")
{
if($page == $rule['value'])
{
return true;
}
return false;
}
elseif($rule['operator'] == "!=")
{
if($page != $rule['value'])
{
return true;
}
return false;
}
break;
// PAGE
case "page_type":
$page_type = isset($overrides['page_type']) ? $overrides['page_type'] : $post->post_parent;
if($rule['operator'] == "==")
{
if($rule['value'] == "parent" && $page_type == "0")
{
return true;
}
if($rule['value'] == "child" && $page_type != "0")
{
return true;
}
return false;
}
elseif($rule['operator'] == "!=")
{
if($rule['value'] == "parent" && $page_type != "0")
{
return true;
}
if($rule['value'] == "child" && $page_type == "0")
{
return true;
}
return false;
}
break;
// PAGE PARENT
case "page_parent":
$page_parent = isset($overrides['page_parent']) ? $overrides['page_parent'] : $post->post_parent;
if($rule['operator'] == "==")
{
if($page_parent == $rule['value'])
{
return true;
}
return false;
}
elseif($rule['operator'] == "!=")
{
if($page_parent != $rule['value'])
{
return true;
}
return false;
}
break;
// PAGE
case "page_template":
$page_template = isset($overrides['page_template']) ? $overrides['page_template'] : get_post_meta($post->ID,'_wp_page_template',true);
if($rule['operator'] == "==")
{
if($page_template == $rule['value'])
{
return true;
}
if($rule['value'] == "default" && !$page_template)
{
return true;
}
return false;
}
elseif($rule['operator'] == "!=")
{
if($page_template != $rule['value'])
{
return true;
}
return false;
}
break;
// POST
case "post":
$post_id = isset($overrides['post']) ? $overrides['post'] : $post->ID;
if($rule['operator'] == "==")
{
if($post_id == $rule['value'])
{
return true;
}
return false;
}
elseif($rule['operator'] == "!=")
{
if($post_id != $rule['value'])
{
return true;
}
return false;
}
break;
// POST CATEGORY
case "post_category":
$cats = array();
if(isset($overrides['post_category']))
{
$cats = $overrides['post_category'];
}
else
{
$all_cats = get_the_category($post->ID);
foreach($all_cats as $cat)
{
$cats[] = $cat->term_id;
}
}
if($rule['operator'] == "==")
{
if($cats)
{
if(in_array($rule['value'], $cats))
{
return true;
}
}
return false;
}
elseif($rule['operator'] == "!=")
{
if($cats)
{
if(!in_array($rule['value'], $cats))
{
return true;
}
}
return false;
}
break;
// PAGE PARENT
/*
case "post_format":
$post_format = isset($overrides['post_format']) ? $overrides['post_format'] : get_post_format();
if($rule['operator'] == "==")
{
if($post_format == $rule['value'])
{
return true;
}
return false;
}
elseif($post_format == "!=")
{
if($post->post_parent != $rule['value'])
{
return true;
}
return false;
}
break;
*/
// USER TYPE
case "user_type":
if($rule['operator'] == "==")
{
if(current_user_can($rule['value']))
{
return true;
}
return false;
}
elseif($rule['operator'] == "!=")
{
if(!current_user_can($rule['value']))
{
return true;
}
return false;
}
break;
// Options Page
case "options_page":
if($rule['operator'] == "==")
{
if(get_admin_page_title() == $rule['value'])
{
return true;
}
return false;
}
elseif($rule['operator'] == "!=")
{
if(get_admin_page_title() != $rule['value'])
{
return true;
}
return false;
}
break;
// Post Format
case "post_format":
$post_format = isset($overrides['post_format']) ? has_post_format($overrides['post_format'],$post->ID) : has_post_format($rule['value'],$post->ID);
if($rule['operator'] == "==")
{
if($post_format)
{
return true;
}
return false;
}
elseif($rule['operator'] == "!=")
{
if(!$post_format)
{
return true;
}
return false;
}
break;
// Taxonomy
case "taxonomy":
$terms = array();
if(isset($overrides['taxonomy']))
{
$terms = $overrides['taxonomy'];
}
else
{
$taxonomies = get_object_taxonomies($post->post_type);
if($taxonomies)
{
foreach($taxonomies as $tax)
{
$all_terms = get_the_terms($post->ID, $tax);
if($all_terms)
{
foreach($all_terms as $all_term)
{
$terms[] = $all_term->term_id;
}
}
}
}
}
if($rule['operator'] == "==")
{
if($terms)
{
if(in_array($rule['value'], $terms))
{
return true;
}
}
return false;
}
elseif($rule['operator'] == "!=")
{
if($terms)
{
if(!in_array($rule['value'], $terms))
{
return true;
}
}
return false;
}
break;
}
}
/*--------------------------------------------------------------------------------------
*
* is_field_unlocked
*
* @author Elliot Condon
* @since 3.0.0
*
*-------------------------------------------------------------------------------------*/
function is_field_unlocked($field_name)
{
switch ($field_name) {
case 'repeater':
if(md5($this->get_license_key($field_name)) == "bbefed143f1ec106ff3a11437bd73432"){ return true; }else{ return false; }
break;
case 'options_page':
if(md5($this->get_license_key($field_name)) == "1fc8b993548891dc2b9a63ac057935d8"){ return true; }else{ return false; }
break;
case 'flexible_content':
if(md5($this->get_license_key($field_name)) == "d067e06c2b4b32b1c1f5b6f00e0d61d6"){ return true; }else{ return false; }
break;
}
}
/*--------------------------------------------------------------------------------------
*
* is_field_unlocked
*
* @author Elliot Condon
* @since 3.0.0
*
*-------------------------------------------------------------------------------------*/
function get_license_key($field_name)
{
return get_option('acf_' . $field_name . '_ac');
}
/*--------------------------------------------------------------------------------------
*
* admin_message
*
* @author Elliot Condon
* @since 2.0.5
*
*-------------------------------------------------------------------------------------*/
function admin_message($message = "", $type = 'updated')
{
$GLOBALS['acf_mesage'] = $message;
$GLOBALS['acf_mesage_type'] = $type;
function my_admin_notice()
{
echo ''.$GLOBALS['acf_mesage'].'
';
}
add_action('admin_notices', 'my_admin_notice');
}
/*--------------------------------------------------------------------------------------
*
* get_taxonomies_for_select
*
*---------------------------------------------------------------------------------------
*
* returns a multidimentional array of taxonomies grouped by the post type / taxonomy
*
* @author Elliot Condon
* @since 3.0.2
*
*-------------------------------------------------------------------------------------*/
function get_taxonomies_for_select()
{
$post_types = get_post_types();
$choices = array();
if($post_types)
{
foreach($post_types as $post_type)
{
$post_type_object = get_post_type_object($post_type);
$taxonomies = get_object_taxonomies($post_type);
if($taxonomies)
{
foreach($taxonomies as $taxonomy)
{
if(!is_taxonomy_hierarchical($taxonomy)) continue;
$terms = get_terms($taxonomy, array('hide_empty' => false));
if($terms)
{
foreach($terms as $term)
{
$choices[$post_type_object->label . ': ' . $taxonomy][$term->term_id] = $term->name;
}
}
}
}
}
}
return $choices;
}
function in_taxonomy($post, $ids)
{
$terms = array();
$taxonomies = get_object_taxonomies($post->post_type);
if($taxonomies)
{
foreach($taxonomies as $tax)
{
$all_terms = get_the_terms($post->ID, $tax);
if($all_terms)
{
foreach($all_terms as $all_term)
{
$terms[] = $all_term->term_id;
}
}
}
}
if($terms)
{
if(is_array($ids))
{
foreach($ids as $id)
{
if(in_array($id, $terms))
{
return true;
}
}
}
else
{
if(in_array($ids, $terms))
{
return true;
}
}
}
return false;
}
}
?>