/** * 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; }