File "acf-field-functions.php"

Full path: /home/kosmetik/public_html/wp-content/plugins/advanced-custom-fields/includes/acf-field-functions.php
File size: 18.05 B
MIME-type: text/x-php
Charset: utf-8

Download   Open   Edit   Advanced Editor   Back

<?php

acf_register_store('fields')->prop('multisite', true);
function acf_get_field($id = 0)
{
    if (is_object($id)) {
        $id = $id->ID;
    }
    $store = acf_get_store('fields');
    if ($store->has($id)) {
        return $store->get($id);
    }
    if (acf_is_local_field($id)) {
        $field = acf_get_local_field($id);
    } else {
        $field = acf_get_raw_field($id);
    }
    if (!$field) {
        return false;
    }
    $field = acf_validate_field($field);
    $field['prefix'] = 'acf';
    $field = apply_filters('acf/load_field', $field);
    $store->set($field['key'], $field);
    $store->alias($field['key'], $field['ID'], $field['name']);
    return $field;
}
acf_add_filter_variations('acf/load_field', array('type', 'name', 'key'), 0);
function acf_get_raw_field($id = 0)
{
    $post = acf_get_field_post($id);
    if (!$post) {
        return false;
    }
    if ($post->post_type !== 'acf-field') {
        return false;
    }
    $field = (array) maybe_unserialize($post->post_content);
    $field['ID'] = $post->ID;
    $field['key'] = $post->post_name;
    $field['label'] = $post->post_title;
    $field['name'] = $post->post_excerpt;
    $field['menu_order'] = $post->menu_order;
    $field['parent'] = $post->post_parent;
    return $field;
}
function acf_get_field_post($id = 0)
{
    if (is_numeric($id)) {
        return get_post($id);
    } elseif (is_string($id)) {
        $type = acf_is_field_key($id) ? 'key' : 'name';
        $cache_key = acf_cache_key("acf_get_field_post:{$type}:{$id}");
        $post_id = wp_cache_get($cache_key, 'acf');
        if ($post_id === false) {
            $posts = get_posts(array('posts_per_page' => 1, 'post_type' => 'acf-field', 'orderby' => 'menu_order title', 'order' => 'ASC', 'suppress_filters' => false, 'cache_results' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, "acf_field_{$type}" => $id));
            $post_id = $posts ? $posts[0]->ID : 0;
            wp_cache_set($cache_key, $post_id, 'acf');
        }
        if ($post_id) {
            return get_post($post_id);
        }
    }
    return false;
}
function acf_is_field_key($id = '')
{
    if (is_string($id) && substr($id, 0, 6) === 'field_') {
        return true;
    }
    return apply_filters('acf/is_field_key', false, $id);
}
function acf_validate_field($field = array())
{
    if (is_array($field) && !empty($field['_valid'])) {
        return $field;
    }
    $field = wp_parse_args($field, array('ID' => 0, 'key' => '', 'label' => '', 'name' => '', 'prefix' => '', 'type' => 'text', 'value' => null, 'menu_order' => 0, 'instructions' => '', 'required' => false, 'id' => '', 'class' => '', 'conditional_logic' => false, 'parent' => 0, 'wrapper' => array()));
    $field['ID'] = (int) $field['ID'];
    $field['menu_order'] = (int) $field['menu_order'];
    $field['wrapper'] = wp_parse_args($field['wrapper'], array('width' => '', 'class' => '', 'id' => ''));
    $field['_name'] = $field['name'];
    $field['_valid'] = 1;
    $field = apply_filters('acf/validate_field', $field);
    return $field;
}
acf_add_filter_variations('acf/validate_field', array('type'), 0);
function acf_get_valid_field($field = false)
{
    return acf_validate_field($field);
}
function acf_translate_field($field = array())
{
    $l10n = acf_get_setting('l10n');
    $l10n_textdomain = acf_get_setting('l10n_textdomain');
    if ($l10n && $l10n_textdomain) {
        $field['label'] = acf_translate($field['label']);
        $field['instructions'] = acf_translate($field['instructions']);
        $field = apply_filters('acf/translate_field', $field);
    }
    return $field;
}
acf_add_filter_variations('acf/translate_field', array('type'), 0);
add_action('acf/validate_field', 'acf_translate_field');
function acf_get_fields($parent)
{
    if (!is_array($parent)) {
        $parent = acf_get_field_group($parent);
        if (!$parent) {
            return array();
        }
    }
    $fields = array();
    if (acf_have_local_fields($parent['key'])) {
        $raw_fields = acf_get_local_fields($parent['key']);
        foreach ($raw_fields as $raw_field) {
            $fields[] = acf_get_field($raw_field['key']);
        }
    } else {
        $raw_fields = acf_get_raw_fields($parent['ID']);
        foreach ($raw_fields as $raw_field) {
            $fields[] = acf_get_field($raw_field['ID']);
        }
    }
    $fields = apply_filters('acf/load_fields', $fields, $parent);
    return $fields;
}
function acf_get_raw_fields($id = 0)
{
    $cache_key = acf_cache_key("acf_get_field_posts:{$id}");
    $post_ids = wp_cache_get($cache_key, 'acf');
    if ($post_ids === false) {
        $posts = get_posts(array('posts_per_page' => -1, 'post_type' => 'acf-field', 'orderby' => 'menu_order', 'order' => 'ASC', 'suppress_filters' => true, 'cache_results' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, 'post_parent' => $id, 'post_status' => array('publish', 'trash')));
        $post_ids = array();
        foreach ($posts as $post) {
            $post_ids[] = $post->ID;
        }
        wp_cache_set($cache_key, $post_ids, 'acf');
    }
    $fields = array();
    foreach ($post_ids as $post_id) {
        $fields[] = acf_get_raw_field($post_id);
    }
    return $fields;
}
function acf_get_field_count($parent)
{
    if (acf_have_local_fields($parent['key'])) {
        $raw_fields = acf_get_local_fields($parent['key']);
    } else {
        $raw_fields = acf_get_raw_fields($parent['ID']);
    }
    return apply_filters('acf/get_field_count', count($raw_fields), $parent);
}
function acf_clone_field($field, $clone_field)
{
    $field['_clone'] = $clone_field['key'];
    $field = apply_filters('acf/clone_field', $field, $clone_field);
    return $field;
}
acf_add_filter_variations('acf/clone_field', array('type'), 0);
function acf_prepare_field($field)
{
    if (!empty($field['_prepare'])) {
        return $field;
    }
    if ($field['key']) {
        $field['name'] = $field['key'];
    }
    if ($field['prefix']) {
        $field['name'] = "{$field['prefix']}[{$field['name']}]";
    }
    $field['id'] = acf_idify($field['name']);
    $field['_prepare'] = true;
    $field = apply_filters('acf/prepare_field', $field);
    return $field;
}
acf_add_filter_variations('acf/prepare_field', array('type', 'name', 'key'), 0);
function acf_render_fields($fields, $post_id = 0, $el = 'div', $instruction = 'label')
{
    if (is_array($post_id)) {
        $args = func_get_args();
        $fields = $args[1];
        $post_id = $args[0];
    }
    $fields = apply_filters('acf/pre_render_fields', $fields, $post_id);
    $fields = array_filter($fields);
    if ($fields) {
        foreach ($fields as $field) {
            if ($field['value'] === null) {
                $field['value'] = acf_get_value($post_id, $field);
            }
            acf_render_field_wrap($field, $el, $instruction);
        }
    }
    do_action('acf/render_fields', $fields, $post_id);
}
function acf_render_field_wrap($field, $element = 'div', $instruction = 'label')
{
    $field = acf_validate_field($field);
    $field = acf_prepare_field($field);
    if (!$field) {
        return;
    }
    $elements = array('div' => 'div', 'tr' => 'td', 'td' => 'div', 'ul' => 'li', 'ol' => 'li', 'dl' => 'dt');
    if (isset($elements[$element])) {
        $inner_element = $elements[$element];
    } else {
        $element = $inner_element = 'div';
    }
    $wrapper = array('id' => '', 'class' => 'acf-field', 'width' => '', 'style' => '', 'data-name' => $field['_name'], 'data-type' => $field['type'], 'data-key' => $field['key']);
    $wrapper['class'] .= " acf-field-{$field['type']}";
    if ($field['key']) {
        $wrapper['class'] .= " acf-field-{$field['key']}";
    }
    if ($field['required']) {
        $wrapper['class'] .= ' is-required';
        $wrapper['data-required'] = 1;
    }
    $wrapper['class'] = str_replace('_', '-', $wrapper['class']);
    $wrapper['class'] = str_replace('field-field-', 'field-', $wrapper['class']);
    if ($field['wrapper']) {
        $wrapper = acf_merge_attributes($wrapper, $field['wrapper']);
    }
    $width = acf_extract_var($wrapper, 'width');
    if ($width) {
        $width = acf_numval($width);
        if ($element !== 'tr' && $element !== 'td') {
            $wrapper['data-width'] = $width;
            $wrapper['style'] .= " width:{$width}%;";
        }
    }
    $wrapper = array_map('trim', $wrapper);
    $wrapper = array_filter($wrapper);
    $wrapper = apply_filters('acf/field_wrapper_attributes', $wrapper, $field);
    if (!empty($field['conditional_logic'])) {
        $wrapper['data-conditions'] = $field['conditional_logic'];
    }
    if (!empty($field['conditions'])) {
        $wrapper['data-conditions'] = $field['conditions'];
    }
    $attributes_html = acf_esc_attr($wrapper);
    echo "<{$element} {$attributes_html}>" . "\n";
    if ($element !== 'td') {
        echo "<{$inner_element} class=\"acf-label\">" . "\n";
        acf_render_field_label($field);
        if ($instruction == 'label') {
            acf_render_field_instructions($field);
        }
        echo "</{$inner_element}>" . "\n";
    }
    echo "<{$inner_element} class=\"acf-input\">" . "\n";
    acf_render_field($field);
    if ($instruction == 'field') {
        acf_render_field_instructions($field);
    }
    echo "</{$inner_element}>" . "\n";
    echo "</{$element}>" . "\n";
}
function acf_render_field($field)
{
    $field = acf_validate_field($field);
    $field = acf_prepare_field($field);
    if (!$field) {
        return;
    }
    do_action('acf/render_field', $field);
}
acf_add_action_variations('acf/render_field', array('type', 'name', 'key'), 0);
function acf_render_field_label($field)
{
    $label = acf_get_field_label($field);
    if ($label) {
        echo '<label' . ($field['id'] ? ' for="' . esc_attr($field['id']) . '"' : '') . '>' . acf_esc_html($label) . '</label>';
    }
}
function acf_get_field_label($field, $context = '')
{
    $label = $field['label'];
    if ($context == 'admin' && $label === '') {
        $label = __('(no label)', 'acf');
    }
    if ($field['required']) {
        $label .= ' <span class="acf-required">*</span>';
    }
    $label = apply_filters('acf/get_field_label', $label, $field, $context);
    return $label;
}
function acf_render_field_instructions($field)
{
    if ($field['instructions']) {
        echo '<p class="description">' . acf_esc_html($field['instructions']) . '</p>';
    }
}
function acf_render_field_setting($field, $setting, $global = false)
{
    $setting = acf_validate_field($setting);
    $setting['wrapper']['data-key'] = $setting['name'];
    $setting['wrapper']['class'] .= ' acf-field-setting-' . $setting['name'];
    if (!$global) {
        $setting['wrapper']['data-setting'] = $field['type'];
    }
    $setting['prefix'] = $field['prefix'];
    if ($setting['value'] === null) {
        if (isset($field[$setting['name']])) {
            $setting['value'] = $field[$setting['name']];
        } elseif (isset($setting['default_value'])) {
            $setting['value'] = $setting['default_value'];
        }
    }
    if (isset($setting['_append'])) {
        $setting['wrapper']['data-append'] = $setting['_append'];
    }
    acf_render_field_wrap($setting, 'tr', 'label');
}
function acf_update_field($field, $specific = array())
{
    $field = acf_validate_field($field);
    $field = wp_unslash($field);
    $field = acf_parse_types($field);
    if ($field['conditional_logic']) {
        $field['conditional_logic'] = array_filter($field['conditional_logic']);
        $field['conditional_logic'] = array_values($field['conditional_logic']);
        $field['conditional_logic'] = array_map('array_filter', $field['conditional_logic']);
        $field['conditional_logic'] = array_map('array_values', $field['conditional_logic']);
    }
    if ($field['parent'] && !is_numeric($field['parent'])) {
        $parent = acf_get_field_post($field['parent']);
        $field['parent'] = $parent ? $parent->ID : 0;
    }
    $field = apply_filters('acf/update_field', $field);
    $_field = $field;
    acf_extract_vars($_field, array('ID', 'key', 'label', 'name', 'prefix', 'value', 'menu_order', 'id', 'class', 'parent', '_name', '_prepare', '_valid'));
    $save = array('ID' => $field['ID'], 'post_status' => 'publish', 'post_type' => 'acf-field', 'post_title' => $field['label'], 'post_name' => $field['key'], 'post_excerpt' => $field['name'], 'post_content' => maybe_serialize($_field), 'post_parent' => $field['parent'], 'menu_order' => $field['menu_order']);
    if ($specific) {
        $specific[] = 'ID';
        $save = acf_get_sub_array($save, $specific);
    }
    remove_filter('content_save_pre', 'wp_targeted_link_rel');
    $save = wp_slash($save);
    if ($field['ID']) {
        wp_update_post($save);
    } else {
        $field['ID'] = wp_insert_post($save);
    }
    acf_flush_field_cache($field);
    do_action('acf/updated_field', $field);
    return $field;
}
acf_add_filter_variations('acf/update_field', array('type', 'name', 'key'), 0);
function _acf_apply_unique_field_slug($slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug)
{
    if ($post_type === 'acf-field') {
        return $original_slug;
    }
    return $slug;
}
add_filter('wp_unique_post_slug', '_acf_apply_unique_field_slug', 999, 6);
function acf_flush_field_cache($field)
{
    acf_get_store('fields')->remove($field['key']);
    wp_cache_delete(acf_cache_key("acf_get_field_post:name:{$field['name']}"), 'acf');
    wp_cache_delete(acf_cache_key("acf_get_field_post:key:{$field['key']}"), 'acf');
    wp_cache_delete(acf_cache_key("acf_get_field_posts:{$field['parent']}"), 'acf');
}
function acf_delete_field($id = 0)
{
    $field = acf_get_field($id);
    if (!$field || !$field['ID']) {
        return false;
    }
    wp_delete_post($field['ID'], true);
    acf_flush_field_cache($field);
    do_action('acf/delete_field', $field);
    return true;
}
acf_add_action_variations('acf/delete_field', array('type', 'name', 'key'), 0);
function acf_trash_field($id = 0)
{
    $field = acf_get_field($id);
    if (!$field || !$field['ID']) {
        return false;
    }
    wp_trash_post($field['ID'], true);
    do_action('acf/trash_field', $field);
    return true;
}
function acf_untrash_field($id = 0)
{
    $field = acf_get_field($id);
    if (!$field || !$field['ID']) {
        return false;
    }
    wp_untrash_post($field['ID'], true);
    acf_flush_field_cache($field);
    do_action('acf/untrash_field', $field);
    return true;
}
function _acf_untrash_field_post_status($new_status, $post_id, $previous_status)
{
    return get_post_type($post_id) === 'acf-field' ? $previous_status : $new_status;
}
add_action('wp_untrash_post_status', '_acf_untrash_field_post_status', 10, 3);
function acf_prefix_fields(&$fields, $prefix = 'acf')
{
    foreach ($fields as &$field) {
        $field['prefix'] = $prefix . substr($field['prefix'], 3);
    }
}
function acf_get_sub_field($id, $field)
{
    $sub_field = false;
    if (isset($field['sub_fields'])) {
        $sub_field = acf_search_fields($id, $field['sub_fields']);
    }
    $sub_field = apply_filters('acf/get_sub_field', $sub_field, $id, $field);
    return $sub_field;
}
acf_add_filter_variations('acf/get_sub_field', array('type'), 2);
function acf_search_fields($id, $fields)
{
    foreach (array('key', 'name', '_name', '__name') as $key) {
        foreach ($fields as $field) {
            if (isset($field[$key]) && $field[$key] === $id) {
                return $field;
            }
        }
    }
    return false;
}
function acf_is_field($field = false, $id = '')
{
    return is_array($field) && isset($field['key']) && isset($field['name']);
}
function acf_get_field_ancestors($field)
{
    $ancestors = array();
    while ($field['parent'] && ($field = acf_get_field($field['parent']))) {
        $ancestors[] = $field['ID'] ? $field['ID'] : $field['key'];
    }
    return $ancestors;
}
function acf_duplicate_fields($fields = array(), $parent_id = 0)
{
    $keys = array();
    foreach ($fields as $field) {
        usleep(1);
        $keys[$field['key']] = uniqid('field_');
    }
    acf_append_data('generated_keys', $keys);
    foreach ($fields as $field) {
        $field_id = $field['ID'] ? $field['ID'] : $field['key'];
        $duplicates[] = acf_duplicate_field($field_id, $parent_id);
    }
    return $duplicates;
}
function acf_duplicate_field($id = 0, $parent_id = 0)
{
    $field = acf_get_field($id);
    if (!$field) {
        return false;
    }
    $field['ID'] = 0;
    $keys = acf_get_data('generated_keys');
    if (isset($keys[$field['key']])) {
        $field['key'] = $keys[$field['key']];
    } else {
        $field['key'] = uniqid('field_');
    }
    if ($parent_id) {
        $field['parent'] = $parent_id;
    }
    if ($field['conditional_logic']) {
        foreach ($field['conditional_logic'] as $group_i => $group) {
            foreach ($group as $rule_i => $rule) {
                $field['conditional_logic'][$group_i][$rule_i]['field'] = isset($keys[$rule['field']]) ? $keys[$rule['field']] : $rule['field'];
            }
        }
    }
    $field = apply_filters('acf/duplicate_field', $field);
    return acf_update_field($field);
}
acf_add_filter_variations('acf/duplicate_field', array('type'), 0);
function acf_prepare_fields_for_export($fields = array())
{
    return array_map('acf_prepare_field_for_export', $fields);
}
function acf_prepare_field_for_export($field)
{
    acf_extract_vars($field, array('ID', 'prefix', 'value', 'menu_order', 'id', 'class', 'parent', '_name', '_prepare', '_valid'));
    return apply_filters('acf/prepare_field_for_export', $field);
}
acf_add_filter_variations('acf/prepare_field_for_export', array('type'), 0);
function acf_prepare_fields_for_import($fields = array())
{
    $fields = array_values($fields);
    $i = 0;
    while ($i < count($fields)) {
        $field = acf_prepare_field_for_import($fields[$i]);
        if (isset($field['key'])) {
            $fields[$i] = $field;
        } else {
            array_splice($fields, $i, 1, $field);
        }
        $i++;
    }
    return apply_filters('acf/prepare_fields_for_import', $fields);
}
function acf_prepare_field_for_import($field)
{
    return apply_filters('acf/prepare_field_for_import', $field);
}
acf_add_filter_variations('acf/prepare_field_for_import', array('type'), 0);