-1,
'post_type' => 'acf',
'orderby' => 'menu_order title',
'order' => 'asc',
'suppress_filters' => false,
));
// populate acfs
if( $posts ){ foreach( $posts as $post ){
$array[] = array(
'id' => $post->ID,
'title' => $post->post_title,
'menu_order' => $post->menu_order,
);
}}
// set cache
wp_cache_set( 'field_groups', $array, 'acf' );
return $array;
}
/*
* get_fields
*
* @description: returns all fields for a field group
* @since: 3.6
* @created: 26/01/13
*/
function get_fields( $fields, $post_id )
{
// global
global $wpdb;
// loaded by PHP already?
if( !empty($fields) )
{
return $fields;
}
// get field from postmeta
$rows = $wpdb->get_results( $wpdb->prepare("SELECT meta_key FROM $wpdb->postmeta WHERE post_id = %d AND meta_key LIKE %s", $post_id, 'field_%'), ARRAY_A);
if( $rows )
{
foreach( $rows as $row )
{
$field = apply_filters('acf/load_field', false, $row['meta_key'], $post_id );
$fields[ $field['order_no'] ] = $field;
}
// sort
ksort( $fields );
}
// return
return $fields;
}
/*
* get_location
*
* @description:
* @since: 3.6
* @created: 26/01/13
*/
function get_location( $location, $post_id )
{
// loaded by PHP already?
if( !empty($location) )
{
return $location;
}
// vars
$groups = array();
$group_no = 0;
// get all rules
$rules = get_post_meta($post_id, 'rule', false);
if( is_array($rules) )
{
foreach( $rules as $rule )
{
// if field group was duplicated, it may now be a serialized string!
$rule = maybe_unserialize($rule);
// does this rule have a group?
// + groups were added in 4.0.4
if( !isset($rule['group_no']) )
{
$rule['group_no'] = $group_no;
// sperate groups?
if( get_post_meta($post_id, 'allorany', true) == 'any' )
{
$group_no++;
}
}
// add to group
$groups[ $rule['group_no'] ][ $rule['order_no'] ] = $rule;
// sort rules
ksort( $groups[ $rule['group_no'] ] );
}
// sort groups
ksort( $groups );
}
// return fields
return $groups;
}
/*
* get_options
*
* @description:
* @since: 3.6
* @created: 26/01/13
*/
function get_options( $options, $post_id )
{
// loaded by PHP already?
if( !empty($options) )
{
return $options;
}
// defaults
$options = array(
'position' => 'normal',
'layout' => 'no_box',
'hide_on_screen' => array(),
);
// vars
$position = get_post_meta($post_id, 'position', true);
if( $position )
{
$options['position'] = $position;
}
$layout = get_post_meta($post_id, 'layout', true);
if( $layout )
{
$options['layout'] = $layout;
}
$hide_on_screen = get_post_meta($post_id, 'hide_on_screen', true);
if( $hide_on_screen )
{
$hide_on_screen = maybe_unserialize($hide_on_screen);
$options['hide_on_screen'] = $hide_on_screen;
}
// return
return $options;
}
/*
* validate_page
*
* @description:
* @since 3.2.6
* @created: 23/06/12
*/
function validate_page()
{
// global
global $pagenow, $typenow;
// vars
$return = false;
// validate page
if( in_array( $pagenow, array('post.php', 'post-new.php') ) )
{
// validate post type
if( $typenow == "acf" )
{
$return = true;
}
}
// return
return $return;
}
/*
* admin_enqueue_scripts
*
* @description: run after post query but before any admin script / head actions. A good place to register all actions.
* @since: 3.6
* @created: 26/01/13
*/
function admin_enqueue_scripts()
{
// validate page
if( ! $this->validate_page() ){ return; }
// settings
$this->settings = apply_filters('acf/get_info', 'all');
// no autosave
wp_dequeue_script( 'autosave' );
// custom scripts
wp_enqueue_script(array(
'acf-field-group',
));
// custom styles
wp_enqueue_style(array(
'acf-global',
'acf-field-group',
));
// actions
do_action('acf/field_group/admin_enqueue_scripts');
add_action('admin_head', array($this,'admin_head'));
}
/*
* admin_head
*
* @description:
* @since 3.1.8
* @created: 23/06/12
*/
function admin_head()
{
// global
global $wp_version, $post;
// l10n
$l10n = array(
'move_to_trash' => __("Move to trash. Are you sure?",'acf'),
'checked' => __("checked",'acf'),
'no_fields' => __("No toggle fields available",'acf'),
'title' => __("Field group title is required",'acf'),
'copy' => __("copy",'acf'),
'or' => __("or",'acf'),
'fields' => __("Fields",'acf'),
'parent_fields' => __("Parent fields",'acf'),
'sibling_fields' => __("Sibling fields",'acf'),
'hide_show_all' => __("Hide / Show All",'acf')
);
?>
settings['path'] . 'core/views/meta_box_fields.php' );
}
/*
* html_location
*
* @description:
* @since 1.0.0
* @created: 23/06/12
*/
function html_location()
{
include( $this->settings['path'] . 'core/views/meta_box_location.php' );
}
/*
* html_options
*
* @description:
* @since 1.0.0
* @created: 23/06/12
*/
function html_options()
{
include( $this->settings['path'] . 'core/views/meta_box_options.php' );
}
/*
* screen_settings
*
* @description:
* @since: 3.6
* @created: 26/01/13
*/
function screen_settings( $current )
{
$current .= '
' . __("Fields",'acf') . '
';
$current .= '' . __("Show Field Key:",'acf');
$current .= '';
$current .= '';
$current .= '
';
return $current;
}
/*
* ajax_render_options
*
* @description: creates the HTML for a field's options (field group edit page)
* @since 3.1.6
* @created: 23/06/12
*/
function ajax_render_options()
{
// vars
$options = array(
'field_key' => '',
'field_type' => '',
'post_id' => 0,
'nonce' => ''
);
// load post options
$options = array_merge($options, $_POST);
// verify nonce
if( ! wp_verify_nonce($options['nonce'], 'acf_nonce') )
{
die(0);
}
// required
if( ! $options['field_type'] )
{
die(0);
}
// find key (not actual field key, more the html attr name)
$options['field_key'] = str_replace("fields[", "", $options['field_key']);
$options['field_key'] = str_replace("][type]", "", $options['field_key']) ;
// render options
$field = array(
'type' => $options['field_type'],
'name' => $options['field_key']
);
do_action('acf/create_field_options', $field );
die();
}
/*
* ajax_render_location
*
* @description: creates the HTML for the field group location metabox. Called from both Ajax and PHP
* @since 3.1.6
* @created: 23/06/12
*/
function ajax_render_location( $options = array() )
{
// defaults
$defaults = array(
'group_id' => 0,
'rule_id' => 0,
'value' => null,
'param' => null,
);
$is_ajax = false;
if( isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'acf_nonce') )
{
$is_ajax = true;
}
// Is AJAX call?
if( $is_ajax )
{
$options = array_merge($defaults, $_POST);
}
else
{
$options = array_merge($defaults, $options);
}
// vars
$choices = array();
// some case's have the same outcome
if($options['param'] == "page_parent")
{
$options['param'] = "page";
}
switch($options['param'])
{
case "post_type":
// all post types except attachment
$choices = apply_filters('acf/get_post_types', array(), array('attachment'));
break;
case "page":
$post_type = 'page';
$posts = get_posts(array(
'posts_per_page' => -1,
'post_type' => $post_type,
'orderby' => 'menu_order title',
'order' => 'ASC',
'post_status' => 'any',
'suppress_filters' => false,
'update_post_meta_cache' => false,
));
if( $posts )
{
// sort into hierachial order!
if( is_post_type_hierarchical( $post_type ) )
{
$posts = get_page_children( 0, $posts );
}
foreach( $posts as $page )
{
$title = '';
$ancestors = get_ancestors($page->ID, 'page');
if($ancestors)
{
foreach($ancestors as $a)
{
$title .= '- ';
}
}
$title .= apply_filters( 'the_title', $page->post_title, $page->ID );
// status
if($page->post_status != "publish")
{
$title .= " ($page->post_status)";
}
$choices[ $page->ID ] = $title;
}
// foreach($pages as $page)
}
break;
case "page_type" :
$choices = array(
'front_page' => __("Front Page",'acf'),
'posts_page' => __("Posts Page",'acf'),
'top_level' => __("Top Level Page (parent of 0)",'acf'),
'parent' => __("Parent Page (has children)",'acf'),
'child' => __("Child Page (has parent)",'acf'),
);
break;
case "page_template" :
$choices = array(
'default' => __("Default Template",'acf'),
);
$templates = get_page_templates();
foreach($templates as $k => $v)
{
$choices[$v] = $k;
}
break;
case "post" :
$post_types = get_post_types();
unset( $post_types['page'], $post_types['attachment'], $post_types['revision'] , $post_types['nav_menu_item'], $post_types['acf'] );
if( $post_types )
{
foreach( $post_types as $post_type )
{
$posts = get_posts(array(
'numberposts' => '-1',
'post_type' => $post_type,
'post_status' => array('publish', 'private', 'draft', 'inherit', 'future'),
'suppress_filters' => false,
));
if( $posts)
{
$choices[$post_type] = array();
foreach($posts as $post)
{
$title = apply_filters( 'the_title', $post->post_title, $post->ID );
// status
if($post->post_status != "publish")
{
$title .= " ($post->post_status)";
}
$choices[$post_type][$post->ID] = $title;
}
// foreach($posts as $post)
}
// if( $posts )
}
// foreach( $post_types as $post_type )
}
// if( $post_types )
break;
case "post_category" :
$terms = get_terms( 'category', array( 'hide_empty' => false ) );
if( !empty($terms) ) {
foreach( $terms as $term ) {
$choices[ $term->term_id ] = $term->name;
}
}
break;
case "post_format" :
$choices = get_post_format_strings();
break;
case "post_status" :
$choices = array(
'publish' => __( 'Published', 'acf'),
'pending' => __( 'Pending Review', 'acf'),
'draft' => __( 'Draft', 'acf'),
'future' => __( 'Future', 'acf'),
'private' => __( 'Private', 'acf'),
'inherit' => __( 'Revision', 'acf'),
'trash' => __( 'Trash', 'acf'),
);
break;
case "user_type" :
global $wp_roles;
$choices = $wp_roles->get_names();
if( is_multisite() )
{
$choices['super_admin'] = __('Super Admin', 'acf');
}
break;
case "taxonomy" :
$choices = array();
$simple_value = true;
$choices = apply_filters('acf/get_taxonomies_for_select', $choices, $simple_value);
break;
case "ef_taxonomy" :
$choices = array('all' => __('All', 'acf'));
$taxonomies = get_taxonomies( array('public' => true), 'objects' );
foreach($taxonomies as $taxonomy)
{
$choices[ $taxonomy->name ] = $taxonomy->labels->name;
}
// unset post_format (why is this a public taxonomy?)
if( isset($choices['post_format']) )
{
unset( $choices['post_format']) ;
}
break;
case "ef_user" :
global $wp_roles;
$choices = array_merge( array('all' => __('All', 'acf')), $wp_roles->get_names() );
break;
case "ef_media" :
$choices = array('all' => __('All', 'acf'));
break;
}
// allow custom location rules
$choices = apply_filters( 'acf/location/rule_values/' . $options['param'], $choices );
// create field
do_action('acf/create_field', array(
'type' => 'select',
'name' => 'location[' . $options['group_id'] . '][' . $options['rule_id'] . '][value]',
'value' => $options['value'],
'choices' => $choices,
));
// ajax?
if( $is_ajax )
{
die();
}
}
/*
* name_save_pre
*
* @description: 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
* @since 1.0.0
* @created: 23/06/12
*/
function name_save_pre($name)
{
// validate
if( !isset($_POST['post_type']) || $_POST['post_type'] != 'acf' )
{
return $name;
}
// need a title
if( !$_POST['post_title'] )
{
$_POST['post_title'] = 'Unnamed Field Group';
}
$name = 'acf_' . sanitize_title($_POST['post_title']);
return $name;
}
/*
* save_post
*
* @description: Saves the field / location / option data for a field group
* @since 1.0.0
* @created: 23/06/12
*/
function save_post($post_id)
{
// do not save if this is an auto save routine
if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
{
return $post_id;
}
// verify nonce
if( !isset($_POST['acf_nonce']) || !wp_verify_nonce($_POST['acf_nonce'], 'field_group') )
{
return $post_id;
}
// only save once! WordPress save's a revision as well.
if( wp_is_post_revision($post_id) )
{
return $post_id;
}
/*
* save fields
*/
// vars
$dont_delete = array();
if( isset($_POST['fields']) && is_array($_POST['fields']) )
{
$i = -1;
// remove clone field
unset( $_POST['fields']['field_clone'] );
// loop through and save fields
foreach( $_POST['fields'] as $key => $field )
{
$i++;
// order + key
$field['order_no'] = $i;
$field['key'] = $key;
// save
do_action('acf/update_field', $field, $post_id );
// add to dont delete array
$dont_delete[] = $field['key'];
}
}
unset( $_POST['fields'] );
// delete all other field
$keys = get_post_custom_keys($post_id);
foreach( $keys as $key )
{
if( strpos($key, 'field_') !== false && !in_array($key, $dont_delete) )
{
// this is a field, and it wasn't found in the dont_delete array
do_action('acf/delete_field', $post_id, $key);
}
}
/*
* save location rules
*/
if( isset($_POST['location']) && is_array($_POST['location']) )
{
delete_post_meta( $post_id, 'rule' );
// clean array keys
$_POST['location'] = array_values( $_POST['location'] );
foreach( $_POST['location'] as $group_id => $group )
{
if( is_array($group) )
{
// clean array keys
$group = array_values( $group );
foreach( $group as $rule_id => $rule )
{
$rule['order_no'] = $rule_id;
$rule['group_no'] = $group_id;
add_post_meta( $post_id, 'rule', $rule );
}
}
}
unset( $_POST['location'] );
}
/*
* save options
*/
if( isset($_POST['options']) && is_array($_POST['options']) )
{
update_post_meta($post_id, 'position', $_POST['options']['position']);
update_post_meta($post_id, 'layout', $_POST['options']['layout']);
update_post_meta($post_id, 'hide_on_screen', $_POST['options']['hide_on_screen']);
}
unset( $_POST['options'] );
}
}
new acf_field_group();
?>