/**
  * get all the meta keys used in all the posts
  *
  * returns an array
  */
 function get_meta_keys($include_hidden = false)
 {
     global $wpdb;
     static $cf_keys = null;
     if ($cf_keys == null) {
         // get the custom field keys
         $cf_keys_limit = 10000;
         // jic
         $cf_keys = $wpdb->get_col("\n                SELECT meta_key\n                FROM {$wpdb->postmeta}\n                GROUP BY meta_key\n                ORDER BY meta_key\n                LIMIT {$cf_keys_limit}");
         if (function_exists('wpcf_get_post_meta_field_names')) {
             $types_fields = wpcf_get_post_meta_field_names();
             foreach ($types_fields as $field) {
                 if (!in_array($field, $cf_keys)) {
                     $cf_keys[] = $field;
                 }
             }
         }
         // exclude these keys.
         $cf_keys_exceptions = array('_edit_last', '_edit_lock', '_wp_page_template', '_wp_attachment_metadata', '_icl_translator_note', '_alp_processed', '_icl_translation', '_thumbnail_id', '_views_template', '_wpml_media_duplicate', '_wpml_media_featured', '_top_nav_excluded', '_cms_nav_minihome', 'wpml_media_duplicate_of', 'wpml_media_lang', 'wpml_media_processed', '_wpv_settings', '_wpv_layout_settings', '_wpv_view_sync', '_wpv_view_template_fields', '_wpv_view_template_mode');
         $cf_keys = array_diff($cf_keys, $cf_keys_exceptions);
         if (!$include_hidden) {
             $options = $this->get_options();
             if (isset($options['wpv_show_hidden_fields'])) {
                 $include_these_hidden = explode(',', $options['wpv_show_hidden_fields']);
             } else {
                 $include_these_hidden = array();
             }
             // exclude hidden fields (starting with an underscore)
             foreach ($cf_keys as $index => $field) {
                 if (strpos($field, '_') === 0) {
                     if (!in_array($field, $include_these_hidden)) {
                         unset($cf_keys[$index]);
                     }
                 }
             }
         }
         if ($cf_keys) {
             natcasesort($cf_keys);
         }
     }
     return $cf_keys;
 }
 /**
  * Retrieve custom fields.
  *
  * @param bool $is_visible
  *
  * @param int $cf_keys_limit limit database results
  *
  * @return array custom field keys
  *
  * @since 1.10
  */
 private function _get_meta_keys_internal($is_visible = true, $cf_keys_limit = 512)
 {
     if ($is_visible) {
         $predicate_function_name = 'custom_field_is_visible';
         $wpv_filter_keys_limit = 'wpv_filter_wpv_get_postmeta_keys_limit';
         $wpv_filter_keys_result = 'wpv_filter_wpv_get_postmeta_keys';
     } else {
         $predicate_function_name = 'custom_field_is_hidden';
         $wpv_filter_keys_limit = 'wpv_filter_wpv_get_hidden_postmeta_keys_limit';
         $wpv_filter_keys_result = 'wpv_filter_wpv_get_hidden_postmeta_keys';
     }
     $cf_keys = array();
     // Filter limit. Allow 3rd parties increase or decrease the limit.
     $cf_keys_limit = apply_filters($wpv_filter_keys_limit, $cf_keys_limit);
     // Verify it is still a number or revert to default
     if (!is_int($cf_keys_limit) || $cf_keys_limit <= 0) {
         $cf_keys_limit = 512;
     }
     // Cache var
     // f(request_signature:string):array = request:array
     static $cf_keys_request_cache = array();
     $cf_request_signature = ($is_visible ? 'visible' : 'hidden') . $cf_keys_limit;
     // We hard-cache default limit for visible and hidden fields
     if ($cf_keys_limit == 512) {
         $wpv_transient_meta_keys = get_transient('wpv_transient_meta_keys_' . $cf_request_signature);
         if ($wpv_transient_meta_keys !== false) {
             $cf_keys_request_cache[$cf_request_signature] = $wpv_transient_meta_keys;
         }
     }
     // Retrieve from db if keys request cache is empty or contains zero elements
     if (empty($cf_keys_request_cache) || !isset($cf_keys_request_cache[$cf_request_signature]) || count($cf_keys_request_cache[$cf_request_signature]) == 0) {
         // Retrieve keys from postmeta (unsorted)
         // If meta_key starts with underscore, it is a hidden field
         // It's limited because DISTINCT queries are slow
         global $wpdb, $WPV_settings;
         $cf_keys_request = $wpdb->get_col($is_visible ? $wpdb->prepare("SELECT DISTINCT meta_key\r\n                                FROM {$wpdb->postmeta}\r\n                                WHERE " . (isset($WPV_settings->wpv_show_hidden_fields) && is_string($WPV_settings->wpv_show_hidden_fields) && strlen($WPV_settings->wpv_show_hidden_fields) > 0 ? "meta_key IN ('" . implode("','", explode(',', $WPV_settings->wpv_show_hidden_fields)) . "') OR " : "") . " /* hidden declared as visible */\r\n                                LEFT(meta_key, 1) <> '_' /* visible */\r\n                                LIMIT %d", $cf_keys_limit) : $wpdb->prepare("SELECT DISTINCT meta_key\r\n                                FROM {$wpdb->postmeta}\r\n                                WHERE LEFT(meta_key, 1) = '_' /* hidden */\r\n                                LIMIT %d", $cf_keys_limit));
         // Retrieve keys from Types (unsorted)
         if (function_exists('wpcf_get_post_meta_field_names')) {
             $types_fields = wpcf_get_post_meta_field_names();
             $types_fields_filtered = array_filter($types_fields, array($this, $predicate_function_name));
             $cf_keys_from_types = array_unique($types_fields_filtered);
             $cf_keys_request = array_merge($cf_keys_request, $cf_keys_from_types);
         }
         // Exclude there keys
         $cf_keys_exceptions = array('_edit_last', '_edit_lock', '_wp_page_template', '_wp_attachment_metadata', '_icl_translator_note', '_alp_processed', '_icl_translation', '_thumbnail_id', '_views_template', '_wpml_media_duplicate', '_wpml_media_featured', '_top_nav_excluded', '_cms_nav_minihome', 'wpml_media_duplicate_of', 'wpml_media_lang', 'wpml_media_processed', '_wpv_settings', '_wpv_layout_settings', '_wpv_view_sync', '_wpv_view_template_fields', '_wpv_view_template_mode', 'dd_layouts_settings');
         $cf_keys_request = array_diff($cf_keys_request, $cf_keys_exceptions);
         // Update cache
         if ($cf_keys_limit == 512) {
             set_transient('wpv_transient_meta_keys_' . $cf_request_signature, $cf_keys_request, WEEK_IN_SECONDS);
         }
         $cf_keys_request_cache[$cf_request_signature] = $cf_keys_request;
     } else {
         $cf_keys_request = $cf_keys_request_cache[$cf_request_signature];
     }
     // Filter result. Allow third-party developers add or remove elements.
     $cf_keys = apply_filters($wpv_filter_keys_result, $cf_keys_request);
     // Remove duplicates and sort result naturally.
     $cf_keys = array_unique($cf_keys);
     // FIXME: Why is sorting done inside the method? (Legacy)
     if ($cf_keys && is_array($cf_keys)) {
         natcasesort($cf_keys);
     }
     return $cf_keys;
 }