File "api-helpers.php"

Full path: /home/kosmetik/public_html/wp-content/plugins/advanced-custom-fields/includes/api/api-helpers.php
File size: 46.7 B
MIME-type: text/x-php
Charset: utf-8

Download   Open   Edit   Advanced Editor   Back

<?php

function acf_is_array($array)
{
    return is_array($array) && !empty($array);
}
function acf_has_setting($name = '')
{
    return acf()->has_setting($name);
}
function acf_raw_setting($name = '')
{
    return acf()->get_setting($name);
}
function acf_update_setting($name, $value)
{
    $name = acf_validate_setting($name);
    return acf()->update_setting($name, $value);
}
function acf_validate_setting($name = '')
{
    return apply_filters('acf/validate_setting', $name);
}
function acf_get_setting($name, $value = null)
{
    $name = acf_validate_setting($name);
    if (acf_has_setting($name)) {
        $value = acf_raw_setting($name);
    }
    $value = apply_filters("acf/settings/{$name}", $value);
    return $value;
}
function acf_append_setting($name, $value)
{
    $setting = acf_raw_setting($name);
    if (!is_array($setting)) {
        $setting = array();
    }
    $setting[] = $value;
    return acf_update_setting($name, $setting);
}
function acf_get_data($name)
{
    return acf()->get_data($name);
}
function acf_set_data($name, $value)
{
    return acf()->set_data($name, $value);
}
function acf_append_data($name, $data)
{
    $prev_data = acf()->get_data($name);
    if (is_array($prev_data)) {
        $data = array_merge($prev_data, $data);
    }
    acf()->set_data($name, $data);
}
function acf_init()
{
    acf()->init();
}
function acf_has_done($name)
{
    if (acf_raw_setting("has_done_{$name}")) {
        return true;
    }
    acf_update_setting("has_done_{$name}", true);
    return false;
}
function acf_get_external_path($file, $path = '')
{
    return plugin_dir_path($file) . $path;
}
function acf_get_external_dir($file, $path = '')
{
    return acf_plugin_dir_url($file) . $path;
}
function acf_plugin_dir_url($file)
{
    $path = plugin_dir_path($file);
    $path = wp_normalize_path($path);
    $check_path = wp_normalize_path(realpath(WP_PLUGIN_DIR));
    if (strpos($path, $check_path) === 0) {
        return str_replace($check_path, plugins_url(), $path);
    }
    $check_path = wp_normalize_path(realpath(WP_CONTENT_DIR));
    if (strpos($path, $check_path) === 0) {
        return str_replace($check_path, content_url(), $path);
    }
    $check_path = wp_normalize_path(realpath(ABSPATH));
    if (strpos($path, $check_path) === 0) {
        return str_replace($check_path, site_url('/'), $path);
    }
    return plugin_dir_url($file);
}
function acf_parse_args($args, $defaults = array())
{
    $args = wp_parse_args($args, $defaults);
    $args = acf_parse_types($args);
    return $args;
}
function acf_parse_types($array)
{
    return array_map('acf_parse_type', $array);
}
function acf_parse_type($v)
{
    if (is_string($v)) {
        $v = trim($v);
        if (is_numeric($v) && strval(intval($v)) === $v) {
            $v = intval($v);
        }
    }
    return $v;
}
function acf_get_view($path = '', $args = array())
{
    if (substr($path, -4) !== '.php') {
        $path = acf_get_path("includes/admin/views/{$path}.php");
    }
    if (file_exists($path)) {
        extract($args);
        include $path;
    }
}
function acf_merge_atts($atts, $extra = array())
{
    if (empty($extra)) {
        return $atts;
    }
    $extra = array_map('trim', $extra);
    $extra = array_filter($extra);
    foreach ($extra as $k => $v) {
        if ($k == 'class' || $k == 'style') {
            $atts[$k] .= ' ' . $v;
        } else {
            $atts[$k] = $v;
        }
    }
    return $atts;
}
function acf_nonce_input($nonce = '')
{
    echo '<input type="hidden" name="_acf_nonce" value="' . wp_create_nonce($nonce) . '" />';
}
function acf_extract_var(&$array, $key, $default = null)
{
    if (is_array($array) && array_key_exists($key, $array)) {
        $v = $array[$key];
        unset($array[$key]);
        return $v;
    }
    return $default;
}
function acf_extract_vars(&$array, $keys)
{
    $r = array();
    foreach ($keys as $key) {
        $r[$key] = acf_extract_var($array, $key);
    }
    return $r;
}
function acf_get_sub_array($array, $keys)
{
    $r = array();
    foreach ($keys as $key) {
        $r[$key] = $array[$key];
    }
    return $r;
}
function acf_get_post_types($args = array())
{
    $post_types = array();
    $exclude = acf_extract_var($args, 'exclude', array());
    $exclude[] = 'acf-field';
    $exclude[] = 'acf-field-group';
    $objects = get_post_types($args, 'objects');
    foreach ($objects as $i => $object) {
        if (in_array($i, $exclude)) {
            continue;
        }
        if ($object->_builtin && !$object->public) {
            continue;
        }
        $post_types[] = $i;
    }
    $post_types = apply_filters('acf/get_post_types', $post_types, $args);
    return $post_types;
}
function acf_get_pretty_post_types($post_types = array())
{
    if (empty($post_types)) {
        $post_types = acf_get_post_types();
    }
    $ref = array();
    $r = array();
    foreach ($post_types as $post_type) {
        $label = acf_get_post_type_label($post_type);
        $r[$post_type] = $label;
        if (!isset($ref[$label])) {
            $ref[$label] = 0;
        }
        $ref[$label]++;
    }
    foreach (array_keys($r) as $i) {
        $post_type = $r[$i];
        if ($ref[$post_type] > 1) {
            $r[$i] .= ' (' . $i . ')';
        }
    }
    return $r;
}
function acf_get_post_type_label($post_type)
{
    $label = $post_type;
    if (post_type_exists($post_type)) {
        $obj = get_post_type_object($post_type);
        $label = $obj->labels->singular_name;
    }
    return $label;
}
function acf_verify_nonce($value)
{
    $nonce = acf_maybe_get_POST('_acf_nonce');
    if (!$nonce || !wp_verify_nonce($nonce, $value)) {
        return false;
    }
    $_POST['_acf_nonce'] = false;
    return true;
}
function acf_verify_ajax()
{
    $nonce = isset($_REQUEST['nonce']) ? $_REQUEST['nonce'] : '';
    if (!$nonce || !wp_verify_nonce($nonce, 'acf_nonce')) {
        return false;
    }
    do_action('acf/verify_ajax');
    return true;
}
function acf_get_image_sizes()
{
    $sizes = array('thumbnail' => __('Thumbnail', 'acf'), 'medium' => __('Medium', 'acf'), 'large' => __('Large', 'acf'));
    $all_sizes = get_intermediate_image_sizes();
    if (!empty($all_sizes)) {
        foreach ($all_sizes as $size) {
            if (isset($sizes[$size])) {
                continue;
            }
            $label = str_replace('-', ' ', $size);
            $label = ucwords($label);
            $sizes[$size] = $label;
        }
    }
    foreach (array_keys($sizes) as $s) {
        $data = acf_get_image_size($s);
        if ($data['width'] && $data['height']) {
            $sizes[$s] .= ' (' . $data['width'] . ' x ' . $data['height'] . ')';
        }
    }
    $sizes['full'] = __('Full Size', 'acf');
    $sizes = apply_filters('acf/get_image_sizes', $sizes);
    return $sizes;
}
function acf_get_image_size($s = '')
{
    global $_wp_additional_image_sizes;
    $_sizes = $_wp_additional_image_sizes;
    $data = array('width' => isset($_sizes[$s]['width']) ? $_sizes[$s]['width'] : get_option("{$s}_size_w"), 'height' => isset($_sizes[$s]['height']) ? $_sizes[$s]['height'] : get_option("{$s}_size_h"));
    return $data;
}
function acf_version_compare($left = '', $compare = '>', $right = '')
{
    if ($left === 'wp') {
        global $wp_version;
        $left = $wp_version;
    }
    return version_compare($left, $right, $compare);
}
function acf_get_full_version($version = '1')
{
    if ($pos = strpos($version, '-')) {
        $version = substr($version, 0, $pos);
    }
    return $version;
}
function acf_get_terms($args)
{
    $args = wp_parse_args($args, array('taxonomy' => null, 'hide_empty' => false, 'update_term_meta_cache' => false));
    if (acf_version_compare('wp', '<', '4.5')) {
        return get_terms($args['taxonomy'], $args);
    }
    return get_terms($args);
}
function acf_get_taxonomy_terms($taxonomies = array())
{
    $taxonomies = acf_get_array($taxonomies);
    $taxonomies = acf_get_pretty_taxonomies($taxonomies);
    $r = array();
    foreach (array_keys($taxonomies) as $taxonomy) {
        $label = $taxonomies[$taxonomy];
        $is_hierarchical = is_taxonomy_hierarchical($taxonomy);
        $terms = acf_get_terms(array('taxonomy' => $taxonomy, 'hide_empty' => false));
        if (empty($terms)) {
            continue;
        }
        if ($is_hierarchical) {
            $terms = _get_term_children(0, $terms, $taxonomy);
        }
        $r[$label] = array();
        foreach ($terms as $term) {
            $k = "{$taxonomy}:{$term->slug}";
            $r[$label][$k] = acf_get_term_title($term);
        }
    }
    return $r;
}
function acf_decode_taxonomy_terms($strings = false)
{
    if (empty($strings)) {
        return false;
    }
    $terms = array();
    foreach ($strings as $string) {
        $data = acf_decode_taxonomy_term($string);
        $taxonomy = $data['taxonomy'];
        $term = $data['term'];
        if (!isset($terms[$taxonomy])) {
            $terms[$taxonomy] = array();
        }
        $terms[$taxonomy][] = $term;
    }
    return $terms;
}
function acf_decode_taxonomy_term($value)
{
    $data = array('taxonomy' => '', 'term' => '');
    if (is_numeric($value)) {
        $data['term'] = $value;
    } elseif (is_string($value)) {
        $value = explode(':', $value);
        $data['taxonomy'] = isset($value[0]) ? $value[0] : '';
        $data['term'] = isset($value[1]) ? $value[1] : '';
    } else {
        return false;
    }
    if (is_numeric($data['term'])) {
        global $wpdb;
        if (!$data['taxonomy']) {
            $data['taxonomy'] = $wpdb->get_var($wpdb->prepare("SELECT taxonomy FROM {$wpdb->term_taxonomy} WHERE term_id = %d LIMIT 1", $data['term']));
        }
        $term = get_term_by('slug', $data['term'], $data['taxonomy']);
        if (!$term) {
            $term = get_term($data['term'], $data['taxonomy']);
        }
        if (!$term) {
            return false;
        }
        $data['taxonomy'] = $term->taxonomy;
        $data['term'] = $term->slug;
    }
    return $data;
}
function acf_array($val = array())
{
    return (array) $val;
}
function acf_unarray($val)
{
    if (is_array($val)) {
        return reset($val);
    }
    return $val;
}
function acf_get_array($var = false, $delimiter = '')
{
    if (is_array($var)) {
        return $var;
    }
    if (acf_is_empty($var)) {
        return array();
    }
    if (is_string($var) && $delimiter) {
        return explode($delimiter, $var);
    }
    return (array) $var;
}
function acf_get_numeric($value = '')
{
    $numbers = array();
    $is_array = is_array($value);
    foreach ((array) $value as $v) {
        if (is_numeric($v)) {
            $numbers[] = (int) $v;
        }
    }
    if (empty($numbers)) {
        return false;
    }
    if (!$is_array) {
        $numbers = $numbers[0];
    }
    return $numbers;
}
function acf_get_posts($args = array())
{
    $posts = array();
    $args = wp_parse_args($args, array('posts_per_page' => -1, 'post_type' => '', 'post_status' => 'any', 'update_post_meta_cache' => false, 'update_post_term_cache' => false));
    if (!$args['post_type']) {
        $args['post_type'] = acf_get_post_types();
    }
    if ($args['post__in']) {
        $args['post__in'] = array_map('intval', acf_array($args['post__in']));
    }
    $posts = get_posts($args);
    $posts = array_filter($posts);
    if ($posts && $args['post__in']) {
        $order = array();
        foreach ($posts as $i => $post) {
            $order[$i] = array_search($post->ID, $args['post__in']);
        }
        array_multisort($order, $posts);
    }
    return $posts;
}
function _acf_query_remove_post_type($sql)
{
    global $wpdb;
    if (strpos($sql, "{$wpdb->posts}.ID IN") === false) {
        return $sql;
    }
    $glue = 'AND';
    $bits = explode($glue, $sql);
    foreach ($bits as $i => $bit) {
        if (strpos($bit, "{$wpdb->posts}.post_type") !== false) {
            unset($bits[$i]);
        }
    }
    $sql = implode($glue, $bits);
    return $sql;
}
function acf_get_grouped_posts($args)
{
    $data = array();
    $args = wp_parse_args($args, array('posts_per_page' => -1, 'paged' => 0, 'post_type' => 'post', 'orderby' => 'menu_order title', 'order' => 'ASC', 'post_status' => 'any', 'suppress_filters' => false, 'update_post_meta_cache' => false));
    $post_types = acf_get_array($args['post_type']);
    $post_types_labels = acf_get_pretty_post_types($post_types);
    $is_single_post_type = count($post_types) == 1;
    if ($is_single_post_type) {
        $args['post_type'] = reset($post_types);
    }
    if (!$is_single_post_type) {
        add_filter('posts_orderby', '_acf_orderby_post_type', 10, 2);
    }
    $posts = get_posts($args);
    if (!$is_single_post_type) {
        remove_filter('posts_orderby', '_acf_orderby_post_type', 10, 2);
    }
    foreach ($post_types as $post_type) {
        $this_posts = array();
        $this_group = array();
        foreach ($posts as $post) {
            if ($post->post_type == $post_type) {
                $this_posts[] = $post;
            }
        }
        if (empty($this_posts)) {
            continue;
        }
        if (is_post_type_hierarchical($post_type) && empty($args['s'])) {
            $post_id = $this_posts[0]->ID;
            $parent_id = acf_maybe_get($args, 'post_parent', 0);
            $offset = 0;
            $length = count($this_posts);
            $all_posts = get_posts(array_merge($args, array('posts_per_page' => -1, 'paged' => 0, 'post_type' => $post_type)));
            foreach ($all_posts as $i => $post) {
                if ($post->ID == $post_id) {
                    $offset = $i;
                    break;
                }
            }
            $ordered_posts = get_page_children($parent_id, $all_posts);
            if (count($ordered_posts) == count($all_posts)) {
                $this_posts = array_slice($ordered_posts, $offset, $length);
            }
        }
        foreach ($this_posts as $post) {
            $this_group[$post->ID] = $post;
        }
        $label = $post_types_labels[$post_type];
        $data[$label] = $this_group;
    }
    return $data;
}
function _acf_orderby_post_type($ordeby, $wp_query)
{
    global $wpdb;
    $post_types = $wp_query->get('post_type');
    if (is_array($post_types)) {
        $post_types = implode("','", $post_types);
        $ordeby = "FIELD({$wpdb->posts}.post_type,'{$post_types}')," . $ordeby;
    }
    return $ordeby;
}
function acf_get_post_title($post = 0, $is_search = false)
{
    $post = get_post($post);
    $title = '';
    $prepend = '';
    $append = '';
    if (!$post) {
        return '';
    }
    $title = get_the_title($post->ID);
    if ($title === '') {
        $title = __('(no title)', 'acf');
    }
    if (get_post_status($post->ID) != 'publish') {
        $append .= ' (' . get_post_status($post->ID) . ')';
    }
    if ($post->post_type !== 'attachment') {
        $ancestors = get_ancestors($post->ID, $post->post_type);
        $prepend .= str_repeat('- ', count($ancestors));
    }
    $title = $prepend . $title . $append;
    return $title;
}
function acf_order_by_search($array, $search)
{
    $weights = array();
    $needle = strtolower($search);
    foreach (array_keys($array) as $k) {
        $array['_' . $k] = acf_extract_var($array, $k);
    }
    foreach ($array as $k => $v) {
        $weight = 0;
        $haystack = strtolower($v);
        $strpos = strpos($haystack, $needle);
        if ($strpos !== false) {
            $weight = strlen($search);
            if ($strpos == 0) {
                $weight++;
            }
        }
        $weights[$k] = $weight;
    }
    array_multisort($weights, SORT_DESC, $array);
    foreach (array_keys($array) as $k) {
        $array[substr($k, 1)] = acf_extract_var($array, $k);
    }
    return $array;
}
function acf_get_pretty_user_roles($allowed = false)
{
    $editable_roles = get_editable_roles();
    $allowed = acf_get_array($allowed);
    $roles = array();
    foreach ($editable_roles as $role_name => $role_details) {
        if (!empty($allowed) && !in_array($role_name, $allowed)) {
            continue;
        }
        $roles[$role_name] = translate_user_role($role_details['name']);
    }
    return $roles;
}
function acf_get_grouped_users($args = array())
{
    $r = array();
    $args = wp_parse_args($args, array('users_per_page' => -1, 'paged' => 0, 'role' => '', 'orderby' => 'login', 'order' => 'ASC'));
    $i = 0;
    $min = 0;
    $max = 0;
    $users_per_page = acf_extract_var($args, 'users_per_page');
    $paged = acf_extract_var($args, 'paged');
    if ($users_per_page > 0) {
        $paged = max(0, $paged);
        $min = ($paged - 1) * $users_per_page + 1;
        $max = $paged * $users_per_page;
    }
    $user_roles = acf_get_pretty_user_roles($args['role']);
    if (is_array($args['role'])) {
        global $wp_version, $wpdb;
        $roles = acf_extract_var($args, 'role');
        if (version_compare($wp_version, '4.4', '>=')) {
            $args['role__in'] = $roles;
        } else {
            $blog_id = get_current_blog_id();
            $meta_query = array('relation' => 'OR');
            foreach ($roles as $role) {
                $meta_query[] = array('key' => $wpdb->get_blog_prefix($blog_id) . 'capabilities', 'value' => '"' . $role . '"', 'compare' => 'LIKE');
            }
            $args['meta_query'] = $meta_query;
        }
    }
    $users = get_users($args);
    foreach ($user_roles as $user_role_name => $user_role_label) {
        $this_users = array();
        $this_group = array();
        foreach (array_keys($users) as $key) {
            if (!in_array($user_role_name, $users[$key]->roles)) {
                continue;
            }
            $user = acf_extract_var($users, $key);
            $i++;
            if ($min && $i < $min) {
                continue;
            }
            if ($max && $i > $max) {
                break;
            }
            $this_users[$user->ID] = $user;
        }
        if (empty($this_users)) {
            continue;
        }
        $r[$user_role_label] = $this_users;
    }
    return $r;
}
function acf_json_encode($json)
{
    return json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
function acf_str_exists($needle, $haystack)
{
    if (is_string($haystack) && strpos($haystack, $needle) !== false) {
        return true;
    }
    return false;
}
function acf_debug()
{
    $args = func_get_args();
    $s = array_shift($args);
    $o = '';
    $nl = "\r\n";
    $o .= '<script type="text/javascript">' . $nl;
    $o .= 'console.log("' . $s . '"';
    if (!empty($args)) {
        foreach ($args as $arg) {
            if (is_object($arg) || is_array($arg)) {
                $arg = json_encode($arg);
            } elseif (is_bool($arg)) {
                $arg = $arg ? 'true' : 'false';
            } elseif (is_string($arg)) {
                $arg = '"' . $arg . '"';
            }
            $o .= ', ' . $arg;
        }
    }
    $o .= ');' . $nl;
    $o .= '</script>' . $nl;
    echo $o;
}
function acf_debug_start()
{
    acf_update_setting('debug_start', memory_get_usage());
}
function acf_debug_end()
{
    $start = acf_get_setting('debug_start');
    $end = memory_get_usage();
    return $end - $start;
}
function acf_encode_choices($array = array(), $show_keys = true)
{
    if (!is_array($array)) {
        return $array;
    }
    if (empty($array)) {
        return '';
    }
    $string = '';
    if ($show_keys) {
        foreach ($array as $k => $v) {
            if (strval($k) == strval($v)) {
                continue;
            }
            $array[$k] = $k . ' : ' . $v;
        }
    }
    $string = implode("\n", $array);
    return $string;
}
function acf_decode_choices($string = '', $array_keys = false)
{
    if (is_array($string)) {
        return $string;
    } elseif (is_numeric($string)) {
    } elseif (!is_string($string)) {
        return array();
    } elseif ($string === '') {
        return array();
    }
    $array = array();
    $lines = explode("\n", $string);
    foreach ($lines as $line) {
        $k = trim($line);
        $v = trim($line);
        if (acf_str_exists(' : ', $line)) {
            $line = explode(' : ', $line);
            $k = trim($line[0]);
            $v = trim($line[1]);
        }
        $array[$k] = $v;
    }
    if ($array_keys) {
        return array_keys($array);
    }
    return $array;
}
function acf_str_replace($string = '', $search_replace = array())
{
    $ignore = array();
    unset($search_replace['']);
    foreach ($search_replace as $search => $replace) {
        if (in_array($search, $ignore)) {
            continue;
        }
        if (strpos($string, $search) === false) {
            continue;
        }
        $string = str_replace($search, $replace, $string);
        $ignore[] = $replace;
    }
    return $string;
}
acf_update_setting('php_to_js_date_formats', array('Y' => 'yy', 'y' => 'y', 'm' => 'mm', 'n' => 'm', 'F' => 'MM', 'M' => 'M', 'l' => 'DD', 'D' => 'D', 'd' => 'dd', 'j' => 'd', 'S' => ''));
acf_update_setting('php_to_js_time_formats', array('a' => 'tt', 'A' => 'TT', 'h' => 'hh', 'g' => 'h', 'H' => 'HH', 'G' => 'H', 'i' => 'mm', 's' => 'ss'));
function acf_split_date_time($date_time = '')
{
    $php_date = acf_get_setting('php_to_js_date_formats');
    $php_time = acf_get_setting('php_to_js_time_formats');
    $chars = str_split($date_time);
    $type = 'date';
    $data = array('date' => '', 'time' => '');
    foreach ($chars as $i => $c) {
        if (isset($php_date[$c])) {
            $type = 'date';
        } elseif (isset($php_time[$c])) {
            $type = 'time';
        }
        $data[$type] .= $c;
    }
    $data['date'] = trim($data['date']);
    $data['time'] = trim($data['time']);
    return $data;
}
function acf_convert_date_to_php($date = '')
{
    $php_to_js = acf_get_setting('php_to_js_date_formats');
    $js_to_php = array_flip($php_to_js);
    return acf_str_replace($date, $js_to_php);
}
function acf_convert_date_to_js($date = '')
{
    $php_to_js = acf_get_setting('php_to_js_date_formats');
    return acf_str_replace($date, $php_to_js);
}
function acf_convert_time_to_php($time = '')
{
    $php_to_js = acf_get_setting('php_to_js_time_formats');
    $js_to_php = array_flip($php_to_js);
    return acf_str_replace($time, $js_to_php);
}
function acf_convert_time_to_js($time = '')
{
    $php_to_js = acf_get_setting('php_to_js_time_formats');
    return acf_str_replace($time, $php_to_js);
}
function acf_update_user_setting($name, $value)
{
    $user_id = get_current_user_id();
    $settings = get_user_meta($user_id, 'acf_user_settings', true);
    $settings = acf_get_array($settings);
    if (acf_is_empty($value)) {
        unset($settings[$name]);
    } else {
        $settings[$name] = $value;
    }
    return update_metadata('user', $user_id, 'acf_user_settings', $settings);
}
function acf_get_user_setting($name = '', $default = false)
{
    $user_id = get_current_user_id();
    $settings = get_user_meta($user_id, 'acf_user_settings', true);
    $settings = acf_get_array($settings);
    if (!isset($settings[$name])) {
        return $default;
    }
    return $settings[$name];
}
function acf_in_array($value = '', $array = false)
{
    if (!is_array($array)) {
        return false;
    }
    return in_array($value, $array);
}
function acf_get_valid_post_id($post_id = 0)
{
    $preload = apply_filters('acf/pre_load_post_id', null, $post_id);
    if ($preload !== null) {
        return $preload;
    }
    $_post_id = $post_id;
    if (!$post_id) {
        $post_id = (int) get_the_ID();
        if (!$post_id) {
            $post_id = get_queried_object();
        }
    }
    if (is_object($post_id)) {
        if (isset($post_id->post_type, $post_id->ID)) {
            $post_id = $post_id->ID;
        } elseif (isset($post_id->roles, $post_id->ID)) {
            $post_id = 'user_' . $post_id->ID;
        } elseif (isset($post_id->taxonomy, $post_id->term_id)) {
            $post_id = 'term_' . $post_id->term_id;
        } elseif (isset($post_id->comment_ID)) {
            $post_id = 'comment_' . $post_id->comment_ID;
        } else {
            $post_id = 0;
        }
    }
    if ($post_id === 'option') {
        $post_id = 'options';
    }
    if ($post_id == 'options') {
        $dl = acf_get_setting('default_language');
        $cl = acf_get_setting('current_language');
        if ($cl && $cl !== $dl) {
            $post_id .= '_' . $cl;
        }
    }
    $post_id = apply_filters('acf/validate_post_id', $post_id, $_post_id);
    return $post_id;
}
function acf_get_post_id_info($post_id = 0)
{
    $info = array('type' => 'post', 'id' => 0);
    if (!$post_id) {
        return $info;
    }
    if (is_numeric($post_id)) {
        $info['id'] = (int) $post_id;
    } elseif (is_string($post_id)) {
        $glue = '_';
        $type = explode($glue, $post_id);
        $id = array_pop($type);
        $type = implode($glue, $type);
        $meta = array('post', 'user', 'comment', 'term');
        if (!in_array($type, $meta) && acf_isset_termmeta($type)) {
            $type = 'term';
        }
        if (is_numeric($id) && in_array($type, $meta)) {
            $info['type'] = $type;
            $info['id'] = (int) $id;
        } else {
            $info['type'] = 'option';
            $info['id'] = $post_id;
        }
    }
    $info = apply_filters('acf/get_post_id_info', $info, $post_id);
    return $info;
}
function acf_isset_termmeta($taxonomy = '')
{
    if (get_option('db_version') < 34370) {
        return false;
    }
    if ($taxonomy && !taxonomy_exists($taxonomy)) {
        return false;
    }
    return true;
}
function acf_upload_files($ancestors = array())
{
    $file = array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => '', 'size' => '');
    foreach (array_keys($file) as $k) {
        $file[$k] = $_FILES['acf'][$k];
    }
    if (!empty($ancestors)) {
        foreach ($ancestors as $a) {
            foreach (array_keys($file) as $k) {
                $file[$k] = $file[$k][$a];
            }
        }
    }
    if (is_array($file['name'])) {
        foreach (array_keys($file['name']) as $k) {
            $_ancestors = array_merge($ancestors, array($k));
            acf_upload_files($_ancestors);
        }
        return;
    }
    if ($file['error']) {
        return;
    }
    $_POST['_acfuploader'] = end($ancestors);
    $attachment_id = acf_upload_file($file);
    array_unshift($ancestors, 'acf');
    acf_update_nested_array($_POST, $ancestors, $attachment_id);
}
function acf_upload_file($uploaded_file)
{
    require_once ABSPATH . '/wp-admin/includes/media.php';
    require_once ABSPATH . '/wp-admin/includes/file.php';
    require_once ABSPATH . '/wp-admin/includes/image.php';
    $upload_overrides = array('test_form' => false);
    $file = wp_handle_upload($uploaded_file, $upload_overrides);
    if (isset($file['error'])) {
        return $file['error'];
    }
    $url = $file['url'];
    $type = $file['type'];
    $file = $file['file'];
    $filename = basename($file);
    $object = array('post_title' => $filename, 'post_mime_type' => $type, 'guid' => $url);
    $id = wp_insert_attachment($object, $file);
    wp_update_attachment_metadata($id, wp_generate_attachment_metadata($id, $file));
    do_action('wp_create_file_in_uploads', $file, $id);
    return $id;
}
function acf_update_nested_array(&$array, $ancestors, $value)
{
    if (empty($ancestors)) {
        $array = $value;
        return true;
    }
    $k = array_shift($ancestors);
    if (isset($array[$k])) {
        return acf_update_nested_array($array[$k], $ancestors, $value);
    }
    return false;
}
function acf_is_screen($id = '')
{
    if (!function_exists('get_current_screen')) {
        return false;
    }
    $current_screen = get_current_screen();
    if (!$current_screen) {
        return false;
    } elseif (is_array($id)) {
        return in_array($current_screen->id, $id);
    } else {
        return $id === $current_screen->id;
    }
}
function acf_maybe_get($array = array(), $key = 0, $default = null)
{
    return isset($array[$key]) ? $array[$key] : $default;
}
function acf_maybe_get_POST($key = '', $default = null)
{
    return isset($_POST[$key]) ? $_POST[$key] : $default;
}
function acf_maybe_get_GET($key = '', $default = null)
{
    return isset($_GET[$key]) ? $_GET[$key] : $default;
}
function acf_get_attachment($attachment)
{
    $response = apply_filters('acf/pre_load_attachment', null, $attachment);
    if ($response !== null) {
        return $response;
    }
    $attachment = get_post($attachment);
    if (!$attachment) {
        return false;
    }
    if ($attachment->post_type !== 'attachment') {
        return false;
    }
    $meta = wp_get_attachment_metadata($attachment->ID);
    $attached_file = get_attached_file($attachment->ID);
    if (strpos($attachment->post_mime_type, '/') !== false) {
        list($type, $subtype) = explode('/', $attachment->post_mime_type);
    } else {
        list($type, $subtype) = array($attachment->post_mime_type, '');
    }
    $response = array('ID' => $attachment->ID, 'id' => $attachment->ID, 'title' => $attachment->post_title, 'filename' => wp_basename($attached_file), 'filesize' => 0, 'url' => wp_get_attachment_url($attachment->ID), 'link' => get_attachment_link($attachment->ID), 'alt' => get_post_meta($attachment->ID, '_wp_attachment_image_alt', true), 'author' => $attachment->post_author, 'description' => $attachment->post_content, 'caption' => $attachment->post_excerpt, 'name' => $attachment->post_name, 'status' => $attachment->post_status, 'uploaded_to' => $attachment->post_parent, 'date' => $attachment->post_date_gmt, 'modified' => $attachment->post_modified_gmt, 'menu_order' => $attachment->menu_order, 'mime_type' => $attachment->post_mime_type, 'type' => $type, 'subtype' => $subtype, 'icon' => wp_mime_type_icon($attachment->ID));
    if (isset($meta['filesize'])) {
        $response['filesize'] = $meta['filesize'];
    } elseif (file_exists($attached_file)) {
        $response['filesize'] = filesize($attached_file);
    }
    $sizes_id = 0;
    switch ($type) {
        case 'image':
            $sizes_id = $attachment->ID;
            $src = wp_get_attachment_image_src($attachment->ID, 'full');
            if ($src) {
                $response['url'] = $src[0];
                $response['width'] = $src[1];
                $response['height'] = $src[2];
            }
            break;
        case 'video':
            $response['width'] = acf_maybe_get($meta, 'width', 0);
            $response['height'] = acf_maybe_get($meta, 'height', 0);
            if ($featured_id = get_post_thumbnail_id($attachment->ID)) {
                $sizes_id = $featured_id;
            }
            break;
        case 'audio':
            if ($featured_id = get_post_thumbnail_id($attachment->ID)) {
                $sizes_id = $featured_id;
            }
            break;
    }
    if ($sizes_id) {
        $sizes = get_intermediate_image_sizes();
        $sizes_data = array();
        foreach ($sizes as $size) {
            $src = wp_get_attachment_image_src($sizes_id, $size);
            if ($src) {
                $sizes_data[$size] = $src[0];
                $sizes_data[$size . '-width'] = $src[1];
                $sizes_data[$size . '-height'] = $src[2];
            }
        }
        $response['sizes'] = $sizes_data;
    }
    return apply_filters('acf/load_attachment', $response, $attachment, $meta);
}
function acf_get_truncated($text, $length = 64)
{
    $text = trim($text);
    $the_length = strlen($text);
    $return = substr($text, 0, $length - 3);
    if ($the_length > $length - 3) {
        $return .= '...';
    }
    return $return;
}
function acf_current_user_can_admin()
{
    if (acf_get_setting('show_admin') && current_user_can(acf_get_setting('capability'))) {
        return true;
    }
    return false;
}
function acf_get_filesize($size = 1)
{
    $unit = 'MB';
    $units = array('TB' => 4, 'GB' => 3, 'MB' => 2, 'KB' => 1);
    if (is_string($size)) {
        $custom = strtoupper(substr($size, -2));
        foreach ($units as $k => $v) {
            if ($custom === $k) {
                $unit = $k;
                $size = substr($size, 0, -2);
            }
        }
    }
    $bytes = floatval($size) * pow(1024, $units[$unit]);
    return $bytes;
}
function acf_format_filesize($size = 1)
{
    $bytes = acf_get_filesize($size);
    $units = array('TB' => 4, 'GB' => 3, 'MB' => 2, 'KB' => 1);
    foreach ($units as $k => $v) {
        $result = $bytes / pow(1024, $v);
        if ($result >= 1) {
            return $result . ' ' . $k;
        }
    }
    return $bytes . ' B';
}
function acf_get_valid_terms($terms = false, $taxonomy = 'category')
{
    $terms = acf_get_array($terms);
    $terms = array_map('intval', $terms);
    if (!function_exists('wp_get_split_term') || empty($terms)) {
        return $terms;
    }
    foreach ($terms as $i => $term_id) {
        $new_term_id = wp_get_split_term($term_id, $taxonomy);
        if ($new_term_id) {
            $terms[$i] = $new_term_id;
        }
    }
    return $terms;
}
function acf_validate_attachment($attachment, $field, $context = 'prepare')
{
    $errors = array();
    $file = array('type' => '', 'width' => 0, 'height' => 0, 'size' => 0);
    if ($context == 'upload') {
        $file['type'] = pathinfo($attachment['name'], PATHINFO_EXTENSION);
        $file['size'] = filesize($attachment['tmp_name']);
        if (strpos($attachment['type'], 'image') !== false) {
            $size = getimagesize($attachment['tmp_name']);
            $file['width'] = acf_maybe_get($size, 0);
            $file['height'] = acf_maybe_get($size, 1);
        }
    } elseif ($context == 'prepare') {
        $use_path = isset($attachment['filename']) ? $attachment['filename'] : $attachment['url'];
        $file['type'] = pathinfo($use_path, PATHINFO_EXTENSION);
        $file['size'] = acf_maybe_get($attachment, 'filesizeInBytes', 0);
        $file['width'] = acf_maybe_get($attachment, 'width', 0);
        $file['height'] = acf_maybe_get($attachment, 'height', 0);
    } else {
        $file = array_merge($file, $attachment);
        $use_path = isset($attachment['filename']) ? $attachment['filename'] : $attachment['url'];
        $file['type'] = pathinfo($use_path, PATHINFO_EXTENSION);
    }
    if ($file['width'] || $file['height']) {
        $min_width = (int) acf_maybe_get($field, 'min_width', 0);
        $max_width = (int) acf_maybe_get($field, 'max_width', 0);
        if ($file['width']) {
            if ($min_width && $file['width'] < $min_width) {
                $errors['min_width'] = sprintf(__('Image width must be at least %dpx.', 'acf'), $min_width);
            } elseif ($max_width && $file['width'] > $max_width) {
                $errors['max_width'] = sprintf(__('Image width must not exceed %dpx.', 'acf'), $max_width);
            }
        }
        $min_height = (int) acf_maybe_get($field, 'min_height', 0);
        $max_height = (int) acf_maybe_get($field, 'max_height', 0);
        if ($file['height']) {
            if ($min_height && $file['height'] < $min_height) {
                $errors['min_height'] = sprintf(__('Image height must be at least %dpx.', 'acf'), $min_height);
            } elseif ($max_height && $file['height'] > $max_height) {
                $errors['max_height'] = sprintf(__('Image height must not exceed %dpx.', 'acf'), $max_height);
            }
        }
    }
    if ($file['size']) {
        $min_size = acf_maybe_get($field, 'min_size', 0);
        $max_size = acf_maybe_get($field, 'max_size', 0);
        if ($min_size && $file['size'] < acf_get_filesize($min_size)) {
            $errors['min_size'] = sprintf(__('File size must be at least %s.', 'acf'), acf_format_filesize($min_size));
        } elseif ($max_size && $file['size'] > acf_get_filesize($max_size)) {
            $errors['max_size'] = sprintf(__('File size must not exceed %s.', 'acf'), acf_format_filesize($max_size));
        }
    }
    if ($file['type']) {
        $mime_types = acf_maybe_get($field, 'mime_types', '');
        $file['type'] = strtolower($file['type']);
        $mime_types = strtolower($mime_types);
        $mime_types = str_replace(array(' ', '.'), '', $mime_types);
        $mime_types = explode(',', $mime_types);
        $mime_types = array_filter($mime_types);
        if (!empty($mime_types) && !in_array($file['type'], $mime_types)) {
            if (count($mime_types) > 1) {
                $last1 = array_pop($mime_types);
                $last2 = array_pop($mime_types);
                $mime_types[] = $last2 . ' ' . __('or', 'acf') . ' ' . $last1;
            }
            $errors['mime_types'] = sprintf(__('File type must be %s.', 'acf'), implode(', ', $mime_types));
        }
    }
    $errors = apply_filters("acf/validate_attachment/type={$field['type']}", $errors, $file, $attachment, $field, $context);
    $errors = apply_filters("acf/validate_attachment/name={$field['_name']}", $errors, $file, $attachment, $field, $context);
    $errors = apply_filters("acf/validate_attachment/key={$field['key']}", $errors, $file, $attachment, $field, $context);
    $errors = apply_filters('acf/validate_attachment', $errors, $file, $attachment, $field, $context);
    return $errors;
}
add_filter('acf/settings/uploader', '_acf_settings_uploader');
function _acf_settings_uploader($uploader)
{
    if (!current_user_can('upload_files')) {
        $uploader = 'basic';
    }
    return $uploader;
}
function acf_translate($string)
{
    $l10n = acf_get_setting('l10n');
    $textdomain = acf_get_setting('l10n_textdomain');
    if (!$l10n) {
        return $string;
    }
    if (!$textdomain) {
        return $string;
    }
    if (is_array($string)) {
        return array_map('acf_translate', $string);
    }
    if (!is_string($string)) {
        return $string;
    }
    if ($string === '') {
        return $string;
    }
    if (acf_get_setting('l10n_var_export')) {
        if (substr($string, 0, 7) === '!!__(!!') {
            return $string;
        }
        return "!!__(!!'" . $string . "!!', !!'" . $textdomain . "!!')!!";
    }
    return __($string, $textdomain);
}
function acf_maybe_add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1)
{
    if (did_action($tag) && !doing_action($tag)) {
        call_user_func($function_to_add);
    } else {
        add_action($tag, $function_to_add, $priority, $accepted_args);
    }
}
function acf_is_row_collapsed($field_key = '', $row_index = 0)
{
    $collapsed = acf_get_user_setting('collapsed_' . $field_key, '');
    if ($collapsed === '') {
        $collapsed = acf_extract_var($_COOKIE, "acf_collapsed_{$field_key}", '');
        $collapsed = str_replace('|', ',', $collapsed);
        acf_update_user_setting('collapsed_' . $field_key, $collapsed);
    }
    $collapsed = explode(',', $collapsed);
    $collapsed = array_filter($collapsed, 'is_numeric');
    return in_array($row_index, $collapsed);
}
function acf_get_attachment_image($attachment_id = 0, $size = 'thumbnail')
{
    $url = wp_get_attachment_image_src($attachment_id, 'thumbnail');
    $alt = get_post_meta($attachment_id, '_wp_attachment_image_alt', true);
    if (!$url) {
        return '';
    }
    $value = '<img src="' . $url . '" alt="' . $alt . '" />';
}
function acf_get_post_thumbnail($post = null, $size = 'thumbnail')
{
    $data = array('url' => '', 'type' => '', 'html' => '');
    $post = get_post($post);
    if (!$post) {
        return $data;
    }
    $thumb_id = $post->ID;
    $mime_type = acf_maybe_get(explode('/', $post->post_mime_type), 0);
    if ($post->post_type === 'attachment') {
        if ($mime_type === 'audio' || $mime_type === 'video') {
            $thumb_id = get_post_thumbnail_id($post->ID);
        }
    } else {
        $thumb_id = get_post_thumbnail_id($post->ID);
    }
    $data['url'] = wp_get_attachment_image_src($thumb_id, $size);
    $data['url'] = acf_maybe_get($data['url'], 0);
    if (!$data['url'] && $post->post_type === 'attachment') {
        $data['url'] = wp_mime_type_icon($post->ID);
        $data['type'] = 'icon';
    }
    $data['html'] = '<img src="' . $data['url'] . '" alt="" />';
    return $data;
}
function acf_get_browser()
{
    if (isset($_SERVER['HTTP_USER_AGENT'])) {
        $agent = $_SERVER['HTTP_USER_AGENT'];
        $browsers = array('Firefox' => 'firefox', 'Trident' => 'msie', 'MSIE' => 'msie', 'Edge' => 'edge', 'Chrome' => 'chrome', 'Safari' => 'safari');
        foreach ($browsers as $k => $v) {
            if (strpos($agent, $k) !== false) {
                return $v;
            }
        }
    }
    return '';
}
function acf_is_ajax($action = '')
{
    $is_ajax = false;
    if (defined('DOING_AJAX') && DOING_AJAX) {
        $is_ajax = true;
    }
    if ($action && acf_maybe_get($_POST, 'action') !== $action) {
        $is_ajax = false;
    }
    return $is_ajax;
}
function acf_format_date($value, $format)
{
    if (!$value) {
        return $value;
    }
    $unixtimestamp = 0;
    if (is_numeric($value) && strlen($value) !== 8) {
        $unixtimestamp = $value;
    } else {
        $unixtimestamp = strtotime($value);
    }
    return date_i18n($format, $unixtimestamp);
}
function acf_clear_log()
{
    unlink(WP_CONTENT_DIR . '/debug.log');
}
function acf_log()
{
    $args = func_get_args();
    foreach ($args as $i => $arg) {
        if (is_array($arg) || is_object($arg)) {
            $arg = print_r($arg, true);
        } elseif (is_bool($arg)) {
            $arg = 'bool(' . ($arg ? 'true' : 'false') . ')';
        }
        $args[$i] = $arg;
    }
    error_log(implode(' ', $args));
}
function acf_dev_log()
{
    if (defined('ACF_DEV') && ACF_DEV) {
        call_user_func_array('acf_log', func_get_args());
    }
}
function acf_doing($event = '', $context = '')
{
    acf_update_setting('doing', $event);
    acf_update_setting('doing_context', $context);
}
function acf_is_doing($event = '', $context = '')
{
    $doing = false;
    if (acf_get_setting('doing') === $event) {
        $doing = true;
    }
    if ($context && acf_get_setting('doing_context') !== $context) {
        $doing = false;
    }
    return $doing;
}
function acf_is_plugin_active()
{
    $basename = acf_get_setting('basename');
    if (!function_exists('is_plugin_active')) {
        include_once ABSPATH . 'wp-admin/includes/plugin.php';
    }
    return is_plugin_active($basename);
}
function acf_send_ajax_results($response)
{
    $response = wp_parse_args($response, array('results' => array(), 'more' => false, 'limit' => 0));
    if ($response['limit'] && $response['results']) {
        $total = 0;
        foreach ($response['results'] as $result) {
            $total++;
            if (!empty($result['children'])) {
                $total += count($result['children']);
            }
        }
        if ($total >= $response['limit']) {
            $response['more'] = true;
        }
    }
    wp_send_json($response);
}
function acf_is_sequential_array($array)
{
    if (!is_array($array)) {
        return false;
    }
    foreach ($array as $key => $value) {
        if (is_string($key)) {
            return false;
        }
    }
    return true;
}
function acf_is_associative_array($array)
{
    if (!is_array($array)) {
        return false;
    }
    foreach ($array as $key => $value) {
        if (is_string($key)) {
            return true;
        }
    }
    return false;
}
function acf_add_array_key_prefix($array, $prefix)
{
    $array2 = array();
    foreach ($array as $k => $v) {
        $k2 = $prefix . $k;
        $array2[$k2] = $v;
    }
    return $array2;
}
function acf_remove_array_key_prefix($array, $prefix)
{
    $array2 = array();
    $l = strlen($prefix);
    foreach ($array as $k => $v) {
        $k2 = substr($k, 0, $l) === $prefix ? substr($k, $l) : $k;
        $array2[$k2] = $v;
    }
    return $array2;
}
function acf_strip_protocol($url)
{
    return str_replace(array('http://', 'https://'), '', $url);
}
function acf_connect_attachment_to_post($attachment_id = 0, $post_id = 0)
{
    if (!$attachment_id || !is_numeric($attachment_id)) {
        return false;
    }
    if (!$post_id || !is_numeric($post_id)) {
        return false;
    }
    if (!apply_filters('acf/connect_attachment_to_post', true, $attachment_id, $post_id)) {
        return false;
    }
    $post = get_post($attachment_id);
    if ($post && $post->post_type == 'attachment' && $post->post_parent == 0) {
        wp_update_post(array('ID' => $post->ID, 'post_parent' => $post_id));
        return true;
    }
    return true;
}
function acf_encrypt($data = '')
{
    if (!function_exists('openssl_encrypt')) {
        return base64_encode($data);
    }
    $key = wp_hash('acf_encrypt');
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $encrypted_data = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
    return base64_encode($encrypted_data . '::' . $iv);
}
function acf_decrypt($data = '')
{
    if (!function_exists('openssl_decrypt')) {
        return base64_decode($data);
    }
    $key = wp_hash('acf_encrypt');
    list($encrypted_data, $iv) = explode('::', base64_decode($data), 2);
    return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}
function acf_parse_markdown($text = '')
{
    $text = trim($text);
    $rules = array('/=== (.+?) ===/' => '<h2>$1</h2>', '/== (.+?) ==/' => '<h3>$1</h3>', '/= (.+?) =/' => '<h4>$1</h4>', '/\\[([^\\[]+)\\]\\(([^\\)]+)\\)/' => '<a href="$2">$1</a>', '/(\\*\\*)(.*?)\\1/' => '<strong>$2</strong>', '/(\\*)(.*?)\\1/' => '<em>$2</em>', '/`(.*?)`/' => '<code>$1</code>', '/\\n\\*(.*)/' => "\n<ul>\n\t<li>\$1</li>\n</ul>", '/\\n[0-9]+\\.(.*)/' => "\n<ol>\n\t<li>\$1</li>\n</ol>", '/<\\/ul>\\s?<ul>/' => '', '/<\\/ol>\\s?<ol>/' => '');
    foreach ($rules as $k => $v) {
        $text = preg_replace($k, $v, $text);
    }
    $text = wpautop($text);
    return $text;
}
function acf_get_sites()
{
    $results = array();
    $sites = get_sites(array('number' => 0));
    if ($sites) {
        foreach ($sites as $site) {
            $results[] = get_site($site)->to_array();
        }
    }
    return $results;
}
function acf_convert_rules_to_groups($rules, $anyorall = 'any')
{
    $groups = array();
    $index = 0;
    foreach ($rules as $rule) {
        $group = acf_extract_var($rule, 'group_no');
        $order = acf_extract_var($rule, 'order_no');
        if ($group === null) {
            $group = $index;
            if ($anyorall == 'any') {
                $index++;
            }
        }
        if ($order === null) {
            $order = isset($groups[$group]) ? count($groups[$group]) : 0;
        }
        $groups[$group][$order] = $rule;
        ksort($groups[$group]);
    }
    ksort($groups);
    return $groups;
}
function acf_register_ajax($name = '', $callback = false, $public = false)
{
    $action = "acf/ajax/{$name}";
    add_action("wp_ajax_{$action}", $callback);
    if ($public) {
        add_action("wp_ajax_nopriv_{$action}", $callback);
    }
}
function acf_str_camel_case($string = '')
{
    return lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $string))));
}
function acf_array_camel_case($array = array())
{
    $array2 = array();
    foreach ($array as $k => $v) {
        $array2[acf_str_camel_case($k)] = $v;
    }
    return $array2;
}
function acf_is_block_editor()
{
    if (function_exists('get_current_screen')) {
        $screen = get_current_screen();
        if ($screen && method_exists($screen, 'is_block_editor')) {
            return $screen->is_block_editor();
        }
    }
    return false;
}