web/wp-content/plugins/acf-extended/includes/acfe-field-group-functions.php (335 lines of code) (raw):
<?php
if(!defined('ABSPATH')){
exit;
}
/**
* acfe_get_post_id_field_groups
*
* Get all field groups for a specific Post ID
*
* @param int $post_id
*
* @return array
*/
function acfe_get_post_id_field_groups($post_id = 0){
/**
* @string $post_id 12 | term_46 | user_22 | my-option | comment_89 | widget_56 | menu_74 | menu_item_96 | block_my-block | blog_55 | site_36 | attachment_24
* @string $id 12 | 46 | 22 | my-option | 89 | widget_56 | 74 | 96 | block_my-block | 55 | 36 | 24
* @string $type post | term | user | option | comment | option | term | post | block | blog | blog | post
*/
$post_id = acf_get_valid_post_id($post_id);
// extract
extract(acf_decode_post_id($post_id));
/** @var $type */
/** @var $id */
// vars
$field_groups = array();
$post_type = '';
$taxonomy = '';
// check post id is attachment
if($type === 'post' && get_post_type($id) === 'attachment'){
$post_id = "attachment_{$id}";
}
// override attachment
if($type === 'post' && acfe_starts_with($post_id, 'attachment_')){
$type = 'attachment';
// override menu
}elseif($type === 'term' && acfe_starts_with($post_id, 'menu_')){
$type = 'menu';
// override user list
}elseif($post_id === 'user_options'){
$type = 'user_list';
// override attachment list
}elseif($post_id === 'attachment_options'){
$type = 'attachment_list';
// override post type list
}elseif($type === 'option' && strpos($post_id, 'tax_') === false && strpos($post_id, '_options') !== false){
// check post types for post_type_list
$post_types = acf_get_post_types();
$found = false;
// loop
foreach($post_types as $_post_type){
if($post_id !== "{$_post_type}_options") continue;
$found = $_post_type;
break;
}
if($found){
$post_type = $found;
$type = 'post_type_list';
}
// override taxonomy list
}elseif($type === 'option' && strpos($post_id, 'tax_') === 0 && strpos($post_id, '_options') !== false){
// check taxonomies for taxonomy_list
$taxonomies = acf_get_taxonomies();
$found = false;
// loop
foreach($taxonomies as $_taxonomy){
if($post_id !== "tax_{$_taxonomy}_options") continue;
$found = $_taxonomy;
break;
}
if($found){
$taxonomy = $found;
$type = 'taxonomy_list';
}
// override settings page
}elseif($type === 'option' && in_array($post_id, array('options-general', 'options-writing', 'options-reading', 'options-discussion', 'options-media', 'options-permalink'))){
$type = 'settings_page';
}
// user
if($type === 'user'){
$keys = array();
foreach(array('edit', 'new') as $user_form){
$_field_groups = acf_get_field_groups(array(
'user_id' => $id,
'user_form' => $user_form,
));
foreach($_field_groups as $_field_group){
if(in_array($_field_group['key'], $keys)) continue;
$keys[] = $_field_group['key'];
$field_groups[] = $_field_group;
}
}
// attachment
}elseif($type === 'attachment'){
$field_groups = acf_get_field_groups(array(
'attachment_id' => $id,
'attachment' => $id,
));
// taxonomy
}elseif($type === 'term'){
$term = get_term($id);
if($term && !is_wp_error($term)){
$taxonomy = $term->taxonomy;
$field_groups = acf_get_field_groups(array(
'taxonomy' => $taxonomy,
'term_id' => $id,
));
}
// post type
}elseif($type === 'post'){
$post_type = get_post_type($post_id);
$field_groups = acf_get_field_groups(array(
'post_id' => $post_id,
'post_type' => $post_type,
));
// options page
}elseif($type === 'option'){
// vars
$keys = array();
$options_pages = array();
// get all options pages using the post id
foreach(acf_get_options_pages() as $page){
if($page['post_id'] !== $id) continue;
$options_pages[] = $page;
}
foreach($options_pages as $page){
$_field_groups = acf_get_field_groups(array(
'options_page' => $page['menu_slug'],
));
foreach($_field_groups as $_field_group){
if(in_array($_field_group['key'], $keys)) continue;
$keys[] = $_field_group['key'];
$field_groups[] = $_field_group;
}
}
// nav menu
}elseif($type === 'menu'){
$field_groups = acf_get_field_groups(array(
'screen' => 'nav_menu',
'post_id' => $id,
));
// user list
}elseif($type === 'user_list'){
$field_groups = acf_get_field_groups(array(
'user_list' => 1,
));
// attachment list
}elseif($type === 'attachment_list'){
$field_groups = acf_get_field_groups(array(
'attachment_list' => 1,
));
// post type list
}elseif($type === 'post_type_list'){
$field_groups = acf_get_field_groups(array(
'post_type_list' => $post_type,
));
// taxonomy list
}elseif($type === 'taxonomy_list'){
$field_groups = acf_get_field_groups(array(
'taxonomy_list' => $taxonomy,
));
// settings page
}elseif($type === 'settings_page'){
$field_groups = acf_get_field_groups(array(
'wp_settings' => $post_id
));
}
return $field_groups;
}
/**
* acfe_get_locations_array
*
* Legacy way to retrieve Field Groups Locations data in ACF 5.8
*
* @param $locations
*
* @return array
*/
function acfe_get_locations_array($locations){
$return = array();
$types = acf_get_location_rule_types();
if(!$locations || !$types){
return $return;
}
$icon_default = 'admin-generic';
$icons = array(
'edit' => array(
'post_type',
'post_template',
'post_status',
'post_format',
'post',
),
'media-default' => array(
'page_template',
'page_type',
'page_parent',
'page',
),
'admin-users' => array(
'current_user',
'user_form',
),
'welcome-widgets-menus' => array(
'widget',
'nav_menu',
'nav_menu_item',
),
'category' => array(
'taxonomy',
'post_category',
'post_taxonomy',
),
'admin-comments' => array(
'comment',
),
'paperclip' => array(
'attachment',
),
'admin-settings' => array(
'options_page',
),
'businessman' => array(
'current_user_role',
'user_role',
),
'admin-appearance' => array(
'acfe_template'
)
);
$rules = array();
foreach($types as $key => $type){
foreach($type as $slug => $name){
$icon = $icon_default;
foreach($icons as $_icon => $icon_slugs){
if(!in_array($slug, $icon_slugs)){
continue;
}
$icon = $_icon;
break;
}
$rules[ $slug ] = array(
'name' => $slug,
'label' => $name,
'icon' => $icon
);
}
}
foreach($locations as $group){
if(!acf_maybe_get($rules, $group['param']) || !acf_maybe_get($group, 'value')){
continue;
}
// init
$rule = $rules[ $group['param'] ];
// vars
$icon = $rule['icon'];
$name = $rule['name'];
$label = $rule['label'];
$operator = $group['operator'] === '==' ? '=' : $group['operator'];
$value = $group['value'];
// Exception for Post/Page/page Parent ID
if(in_array($group['param'], array('post', 'page', 'page_parent'))){
$value = get_the_title((int) $value);
}else{
// Validate value
$values = acf_get_location_rule_values($group);
if(!empty($values) && is_array($values)){
foreach($values as $value_slug => $value_name){
if($value != $value_slug){
continue;
}
$value = $value_name;
if(is_array($value_name) && isset($value_name[$value_slug])){
$value = $value_name[$value_slug];
}
break;
}
}
}
// html
$title = $label . ' ' . $operator . ' ' . $value;
$atts = array(
'class' => 'acf-js-tooltip dashicons dashicons-' . $icon,
'title' => $title
);
if($operator === '!='){
$atts['style'] = 'color: #ccc;';
}
$html = '<span ' . acf_esc_atts($atts) . '></span>';
$return[] = array(
'html' => $html,
'icon' => $icon,
'title' => $title,
'name' => $name,
'label' => $label,
'operator' => $operator,
'value' => $value,
);
}
return $return;
}
/**
* acfe_render_field_group_locations_html
*
* Legacy way to display Field Groups Locations in ACF 5.8
*
* @param $field_group
*/
function acfe_render_field_group_locations_html($field_group){
foreach($field_group['location'] as $groups){
$html = acfe_get_locations_array($groups);
if($html){
$array = array();
foreach($html as $location){
$array[] = $location['html'];
}
echo implode(' ', $array);
}
}
}
/**
* acfe_add_field_groups_metabox
*
* @param array $args
*/
function acfe_add_field_groups_metabox($args = array()){
$args = wp_parse_args($args, array(
'id' => 'acfe-field-groups',
'title' => __('Field Groups', 'acfe'),
'screen' => '',
'context' => 'normal',
'priority' => 'default',
'field_groups' => array(),
));
add_meta_box($args['id'], $args['title'], function($object, $data) use($args){
$field_groups = $data['args'];
acfe_render_field_groups_details($field_groups);
?><script type="text/javascript">
(function($){
if(typeof acf === 'undefined'){
return;
}
var metabox = acf.newPostbox(<?php echo wp_json_encode(array(
'id' => $args['id'],
'key' => '',
'style' => 'default',
'label' => 'left',
'edit' => false
)); ?>);
<?php if(empty($field_groups)){ ?>
metabox.hide();
<?php } ?>
})(jQuery);
</script>
<?php
}, $args['screen'], $args['context'], $args['priority'], $args['field_groups']);
}
/**
* acfe_render_field_groups_details
*
* @param $field_groups
*
* @return void
*/
function acfe_render_field_groups_details($field_groups){
foreach($field_groups as $field_group){
// no field group ID found
if(empty($field_group['ID'])){
// get raw field group from db
$raw_field_group = acf_get_raw_field_group($field_group['key']);
// raw field group found
if($raw_field_group && !empty($raw_field_group['ID'])){
$field_group['ID'] = $raw_field_group['ID'];
}
}
// vars
$fields = acf_get_fields($field_group);
$url = $field_group['ID'] ? admin_url("post.php?post={$field_group['ID']}&action=edit") : false;
$edit = $url ? '(<a href="' . $url . '">' . __('edit'). '</a>)' : '';
?>
<div class="acf-field">
<div class="acf-label">
<label><?php echo $field_group['title']; ?> <?php echo $edit; ?></label>
<p class="description"><code style="font-size:12px;"><?php echo $field_group['key']; ?></code></p>
</div>
<div class="acf-input">
<?php if(!empty($fields)){ ?>
<?php $details = acfe_get_fields_details_recursive($fields); ?>
<table class="acf-table">
<thead>
<th class="acf-th" width="25%" style="background: #fcfcfc;"><strong><?php _e('Label', 'acfe'); ?></strong></th>
<th class="acf-th" width="25%" style="background: #fcfcfc;"><strong><?php _e('Name', 'acfe'); ?></strong></th>
<th class="acf-th" width="25%" style="background: #fcfcfc;"><strong><?php _e('Key', 'acfe'); ?></strong></th>
<th class="acf-th" width="25%" style="background: #fcfcfc;"><strong><?php _e('Type', 'acfe'); ?></strong></th>
</thead>
<tbody>
<?php foreach($details as $field){ ?>
<?php
$field_name = $field['name'] ? '<code style="font-size:12px;">' . $field['name'] . '</code>' : '';
$field_key = $field['key'] ? '<code style="font-size:12px;">' . $field['key'] . '</code>' : '';
?>
<tr class="acf-row">
<td width="25%" style="border-color:#e1e1e1;"><?php echo $field['label']; ?></td>
<td width="25%" style="border-color:#e1e1e1;"><?php echo $field_name; ?></td>
<td width="25%" style="border-color:#e1e1e1;"><?php echo $field_key; ?></td>
<td width="25%" style="border-color:#e1e1e1;"><?php echo $field['type']; ?></td>
</tr>
<?php } ?>
</tbody>
</table>
<?php } ?>
</div>
</div>
<?php }
}