web/wp-content/plugins/acf-extended/includes/modules/performance/module-performance-functions.php (355 lines of code) (raw):
<?php
if(!defined('ABSPATH')){
exit;
}
/**
* acfe_get_performance_config
*
* @param $key
*
* @return mixed|null
*/
function acfe_get_performance_config($key = ''){
// default config
$config = array(
'engine' => 'ultra', // ultra | hybrid
'mode' => 'production', // test | production | rollback
'ui' => false, // sidebar metabox
'post_types' => array(), // allowed post types (all)
'taxonomies' => array(), // allowed taxonomies (all)
'users' => false, // allowed user roles (none)
'options' => false, // allowed option id (none)
);
// deprecated single meta filters
if($config['engine'] === 'ultra'){
$config['post_types'] = acfe_apply_filters_deprecated('acfe/modules/single_meta/post_types', array($config['post_types']), '0.8.9.3', 'acfe/modules/performance/config');
$config['taxonomies'] = acfe_apply_filters_deprecated('acfe/modules/single_meta/taxonomies', array($config['taxonomies']), '0.8.9.3', 'acfe/modules/performance/config');
$config['users'] = acfe_apply_filters_deprecated('acfe/modules/single_meta/users', array($config['users']), '0.8.9.3', 'acfe/modules/performance/config');
$config['options'] = acfe_apply_filters_deprecated('acfe/modules/single_meta/options', array($config['options']), '0.8.9.3', 'acfe/modules/performance/config');
}
// use setting
$setting = acf_get_setting('acfe/modules/performance');
// setting = ultra | hybrid
if(is_string($setting) && !empty($setting)){
$config['engine'] = $setting;
// setting = array('engine' => 'ultra'...)
}elseif(is_array($setting) && !empty($setting)){
$config = array_merge($config, $setting);
}
// filter
$config = apply_filters('acfe/modules/performance/config', $config);
// return key
if(!empty($key)){
return acf_maybe_get($config, $key);
}
// return
return $config;
}
/**
* acfe_do_performance_bypass
*
* @param $func
* @param $args
*
* @return mixed
*/
function acfe_do_performance_bypass($func, $args = array()){
// get engine
$engine = acfe_get_performance_config('engine');
// get engine
$engine = acfe_get_performance_engine($engine);
// return
return $engine->do_bypass($func, $args);
}
/**
* acfe_is_performance_enabled
*
* @return bool
*/
function acfe_is_performance_enabled(){
return (bool) acf_get_setting('acfe/modules/performance');
}
/**
* acfe_is_object_performance_enabled
*
* @param $post_id
*
* @return bool
*/
function acfe_is_object_performance_enabled($post_id = 0){
// check setting
if(!acfe_is_performance_enabled()){
return false;
}
// check post id
if(!$post_id){
return false;
}
// check local post id
if(acfe_is_local_post_id($post_id)){
return false;
}
// get config
$config = acfe_get_performance_config();
// validate engine exists
if(!acfe_get_performance_engine($config['engine'])){
return false;
}
/**
* @var $type
* @var $id
*/
extract(acf_decode_post_id($post_id));
// validate id
if(!$id){
return false;
}
switch($type){
// post types
case 'post': {
// get post type
$post_type = get_post_type($id);
// validate
if(!$post_type){
return false;
}
return acfe_is_object_type_performance_enabled('post', $post_type);
}
// taxonomies
case 'term': {
// get term
$term = get_term($id);
// validate
if(is_wp_error($term) || !is_a($term, 'WP_Term')){
return false;
}
// get taxonomy
$taxonomy = $term->taxonomy;
return acfe_is_object_type_performance_enabled('term', $taxonomy);
}
// users
case 'user': {
// get user
$user = get_userdata($id);
// validate
if(!($user) || !is_a($user, 'WP_User')){
return false;
}
// get roles
$roles = acf_get_array($user->roles);
// array of users
foreach($roles as $role){
if(acfe_is_object_type_performance_enabled('user', $role)){
return true;
}
}
return false;
}
// options pages
case 'option': {
return acfe_is_object_type_performance_enabled('option', $id);
}
}
// type not supported
// block types...
return false;
}
/**
* acfe_is_object_type_performance_enabled
*
* @param $type
* @param $object
*
* @return bool
*/
function acfe_is_object_type_performance_enabled($type, $object){
// get config
$config = acfe_get_performance_config();
switch($type){
// post types
case 'post': {
/**
* $post_types
*
* false = disallow all
* true = allow all
* array() = allow all
* array('post') = allow specific
*/
// vars
$restricted = acfe_get_setting('reserved_post_types', array());
$post_types = $config['post_types'];
// no post types allowed
if($post_types === false){
return false;
}
// reserved post type
if(in_array($object, $restricted)){
return false;
}
// allow all post types
if($post_types === true){
return true;
}
// array of specific post types
if(!empty($post_types)){
// always append 'revision' to allowed post types
if(!in_array('revision', $post_types)){
$post_types[] = 'revision';
}
if(!in_array($object, $post_types)){
return false;
}
}
// allowed (empty array)
return true;
}
// taxonomies
case 'term': {
/**
* $taxonomies
*
* false = disallow all
* true = allow all
* array() = allow all
* array('cat') = allow specific
*/
// vars
$restricted = acfe_get_setting('reserved_taxonomies', array());
$taxonomies = $config['taxonomies'];
// no taxonomies allowed
if($taxonomies === false){
return false;
}
// reserved taxonomy
if(in_array($object, $restricted)){
return false;
}
// allow all taxonomies
if($taxonomies === true){
return true;
}
// taxonomy not allowed
if(!empty($taxonomies) && !in_array($object, $taxonomies)){
return false;
}
// allowed (empty array)
return true;
}
// users
case 'user': {
/**
* $users
*
* false = disallow all
* true = allow all
* array() = allow all
* array('editor') = allow specific
*/
// vars
$users = $config['users'];
// no users allowed
if($users === false){
return false;
// allow all users
}elseif($users === true){
return true;
}
// taxonomy not allowed
if(!empty($users) && !in_array($object, $users)){
return false;
}
// allowed (empty array)
return true;
}
// options pages
case 'option': {
/**
* $options
*
* false = disallow all
* true = allow all
* array() = allow all
* array('options') = allow specific
*/
// vars
$options = $config['options'];
// no options allowed
if($options === false){
return false;
// allow all options
}elseif($options === true){
return true;
}
// option not allowed
if(!empty($options) && !in_array($object, $options)){
return false;
}
// allowed (empty array)
return true;
}
}
// type not supported
// block types...
return false;
}
/**
* acfe_get_object_performance_engine
*
* @param $post_id
*
* @return false|mixed|null
*/
function acfe_get_object_performance_engine($post_id){
// get engine name
$name = acfe_get_object_performance_engine_name($post_id);
if(!$name){
return false;
}
return acfe_get_performance_engine($name);
}
/**
* acfe_get_object_performance_other_engines
*
* @param $post_id
*
* @return false|mixed
*/
function acfe_get_object_performance_other_engines($post_id){
// get engine name
$name = acfe_get_object_performance_engine_name($post_id);
if(!$name){
return false;
}
return acfe_query_performance_engines(array('name' => $name), 'NOT');
}
/**
* acfe_get_object_performance_engine_name
*
* @param $post_id
*
* @return false|mixed|null
*/
function acfe_get_object_performance_engine_name($post_id){
// check enabled
$enabled = acfe_is_object_performance_enabled($post_id);
if(!$enabled){
return false;
}
return acfe_get_performance_config('engine');
}
/**
* acfe_get_object_performance_mode
*
* @param $post_id
*
* @return false|mixed|null
*/
function acfe_get_object_performance_mode($post_id){
// check enabled
$enabled = acfe_is_object_performance_enabled($post_id);
if(!$enabled){
return false;
}
return acfe_get_performance_config('mode');
}
/**
* acfe_do_performance_convert
*
* Converts Ultra/Hybrid meta to the current engine
*
* @param $post_id
*/
function acfe_do_performance_convert($post_id){
// validate enabled
if(!acfe_is_object_performance_enabled($post_id)){
return;
}
// get current engine data
$engine = acfe_get_object_performance_engine($post_id);
$acf = $engine->get_store($post_id);
// other engines
$other_engines = acfe_get_object_performance_other_engines($post_id);
// loop
foreach($other_engines as $other_engine){
// get other meta
$other_acf = $other_engine->get_store($post_id);
// other meta found
if(!empty($other_acf)){
// loop other meta
foreach($other_acf as $name => $value){
// vars
$hidden = acfe_starts_with($name, '_');
$prefix = $hidden ? '_' : '';
$name = ltrim($name, '_');
switch($other_engine->name){
// other engine: ultra
case 'ultra': {
if(!isset($acf["{$prefix}{$name}"])){
acf_update_metadata($post_id, $name, $value, $hidden);
}
break;
}
// other engine: hybrid
case 'hybrid': {
if(!isset($acf["{$prefix}{$name}"])){
// _my_field = field_5f9f9f9f9f9f9 exists
// my_field = my value doesn't exist
if(!isset($acf[ $name ])){
// try to find in normal meta
$meta = $engine->do_bypass(function($post_id, $name){
return acf_get_metadata($post_id, $name, false);
}, array($post_id, $name));
// normal meta found
// update both meta in current engine
if($meta !== null){
acf_update_metadata($post_id, $name, $value, $hidden);
acf_update_metadata($post_id, $name, $meta, false);
}
}else{
acf_update_metadata($post_id, $name, $value, $hidden);
}
}
break;
}
}
// delete other engine meta
$other_engine->delete_meta($post_id);
}
}
}
}
/**
* acfe_do_performance_rollback
*
* Rollback Ultra/Hybrid meta to normal meta
*
* @param $post_id
*
* @return bool
*/
function acfe_do_performance_rollback($post_id = 0){
// validate enabled
if(!acfe_is_object_performance_enabled($post_id)){
return false;
}
// check mode
if(acfe_get_performance_config('mode') !== 'rollback'){
return false;
}
// other engines
$engines = acfe_get_object_performance_other_engines($post_id);
// add current engine at the end
// this fix an issue where the current engine would be processed first
// and the second engine would regenerate again meta leaving residue
$engines[] = acfe_get_object_performance_engine($post_id);
// loop
foreach($engines as $engine){
// get compiled store
$acf = $engine->get_store($post_id);
if(!empty($acf)){
foreach($acf as $name => $value){
// check if _textarea => field_64148c317fcba
$hidden = acfe_starts_with($name, '_');
$name = ltrim($name, '_');
// update as normal meta
acf_update_metadata($post_id, $name, $value, $hidden);
}
}
// clean acf
$engine->delete_meta($post_id);
}
return true;
}
/**
* acfe_get_object_performance_status
*
* @param $post_id
*
* @return array|false
*/
function acfe_get_object_performance_status($post_id){
// check enabled
$enabled = acfe_is_object_performance_enabled($post_id);
if(!$enabled){
return false;
}
// get meta
$meta = acfe_get_object_performance_meta($post_id);
// ready = meta not found
// active = meta found
$name = $meta !== null ? 'active' : 'ready';
$title = $meta !== null ? __('Active', 'acfe') : __('Ready', 'acfe');
$config = acfe_get_performance_config();
$meta_key = acfe_get_performance_engine($config['engine'])->get_meta_key($post_id);
$return = array(
'name' => $name,
'title' => $title,
'message' => '',
);
switch($name){
case 'active': {
$return['message'] = __('Performance Mode is active.', 'acfe') . "<br/>" . sprintf(__('The \'%s\' meta was found on this object and is effective.', 'acfe'), $meta_key);
break;
}
case 'ready': {
$return['message'] = __('Performance Mode is ready.', 'acfe') . "<br/>" . sprintf(__('The \'%s\' meta will be created when object will be saved.', 'acfe'), $meta_key);
break;
}
}
return $return;
}
/**
* acfe_get_object_performance_conflict
*
* @param $post_id
*
* @return false|mixed|null
*/
function acfe_get_object_performance_conflict($post_id){
// check enabled
$enabled = acfe_is_object_performance_enabled($post_id);
if(!$enabled){
return false;
}
$return = false;
// get object engine name
$engine = acfe_get_object_performance_engine_name($post_id);
switch($engine){
// ultra
case 'ultra': {
$hybrid = acfe_get_performance_engine('hybrid');
if($hybrid){
// vars
$meta = $hybrid->get_meta($post_id);
$meta_key = $hybrid->get_meta_key($post_id);
// hybrid meta found
if($meta !== null){
$return = array(
'engine' => 'hybrid',
'meta' => $meta,
'title' => __('Hybrid meta found', 'acfe'),
'message' => sprintf(__('Hybrid engine \'%s\' meta found.', 'acfe'), $meta_key). "<br/>" . __("This meta will be converted to Ultra engine upon save.", 'acfe'),
);
}
}
break;
}
// hybrid
case 'hybrid': {
$ultra = acfe_get_performance_engine('ultra');
if($ultra){
// vars
$meta = $ultra->get_meta($post_id);
$meta_key = $ultra->get_meta_key($post_id);
// ultra meta found
if($meta !== null){
$return = array(
'engine' => 'ultra',
'meta' => $meta,
'title' => __('Ultra meta found', 'acfe'),
'message' => sprintf(__('Ultra engine \'%s\' meta found.', 'acfe'), $meta_key). "<br/>" . __("This meta will be converted to Hybrid engine upon save.", 'acfe'),
);
}
}
break;
}
}
return $return;
}
/**
* acfe_get_object_performance_meta
*
* @param $post_id
*
* @return false|mixed|null
*/
function acfe_get_object_performance_meta($post_id){
// get engine
$engine = acfe_get_object_performance_engine($post_id);
// validate
if(empty($engine)){
return null;
}
// return
return $engine->get_meta($post_id);
}
/**
* acfe_delete_object_performance_meta
*
* @param $post_id
*
* @return false|mixed|null
*/
function acfe_delete_object_performance_meta($post_id){
// get engine
$engine = acfe_get_object_performance_engine($post_id);
// validate
if(empty($engine)){
return false;
}
// return
return $engine->delete_meta($post_id);
}
/**
* acfe_is_single_meta_enabled
*
* @param $post_id
*
* @return bool
* @deprecated
*/
function acfe_is_single_meta_enabled($post_id = 0){
// return global setting
if(!$post_id){
acfe_deprecated_function('acfe_is_single_meta_enabled()', '0.8.9.3', 'acfe_is_performance_enabled()');
return acfe_is_performance_enabled() && acfe_get_performance_config('engine') === 'ultra';
}
// return object performance setting
acfe_deprecated_function('acfe_is_single_meta_enabled()', '0.8.9.3', 'acfe_is_object_performance_enabled()');
return acfe_get_object_performance_engine_name($post_id) === 'ultra';
}
/**
* acfe_get_single_meta
*
* @param $post_id
*
* @return mixed
* @deprecated
*/
function acfe_get_single_meta($post_id){
acfe_deprecated_function('acfe_get_single_meta()', '0.8.9.3', 'acfe_get_object_performance_meta()');
return acfe_get_performance_engine('ultra')->get_meta($post_id);
}
/**
* acfe_delete_single_meta
*
* @param $post_id
*
* @return bool
* @deprecated
*/
function acfe_delete_single_meta($post_id){
acfe_deprecated_function('acfe_delete_single_meta()', '0.8.9.3', 'acfe_delete_object_performance_meta()');
return acfe_get_performance_engine('ultra')->delete_meta($post_id);
}