web/wp-content/plugins/acf-extended/includes/modules/performance/module-performance.php (145 lines of code) (raw):
<?php
if(!defined('ABSPATH')){
exit;
}
if(!class_exists('acfe_performance')):
class acfe_performance{
// vars
public $name = '';
public $meta_key = '';
public $option_key = '';
public $bypass = false;
public $compile = false;
/**
* construct
*/
function __construct(){
// setup
$this->initialize();
// register store
acf_register_store("acfe/performance_meta/{$this->name}")->prop('multisite', true);
// check setting
if(!acfe_is_performance_enabled()){
return;
}
// hooks
$this->add_filter('acf/pre_load_meta', array($this, 'pre_load_meta'), 999, 2);
$this->add_filter('acf/pre_load_metadata', array($this, 'pre_load_metadata'), 999, 4);
$this->add_filter('acf/pre_update_metadata', array($this, 'pre_update_metadata'), 999, 5);
$this->add_filter('acf/pre_delete_metadata', array($this, 'pre_delete_metadata'), 999, 4);
$this->add_filter('acf/update_value', array($this, 'update_value'), 999, 3);
$this->add_action('acf/save_post', array($this, 'pre_save_post'), 1);
$this->add_action('acf/save_post', array($this, 'save_post'), 999);
}
/**
* initialize
*/
function initialize(){
// ...
}
/**
* add_action
*
* @param $tag
* @param $function_to_add
* @param $priority
* @param $accepted_args
*/
function add_action($tag = '', $function_to_add = '', $priority = 10, $accepted_args = 1){
if(is_callable($function_to_add)){
add_action($tag, $function_to_add, $priority, $accepted_args);
}
}
/**
* add_filter
*
* @param $tag
* @param $function_to_add
* @param $priority
* @param $accepted_args
*/
function add_filter($tag = '', $function_to_add = '', $priority = 10, $accepted_args = 1){
if(is_callable($function_to_add)){
add_filter($tag, $function_to_add, $priority, $accepted_args);
}
}
/**
* pre_save_post
*
* the 'compile' logic allows to gather all meta into the $store
* and udpate the 'acf' array only one time to avoid multiple db update calls
*
* @param $post_id
*
* @hook acf/save_post:1
*
* @function acf_save_post()
*/
function pre_save_post($post_id = 0){
// start compile
if($this->is_enabled($post_id)){
$this->compile = $post_id;
}
}
/**
* save_post
*
* @param $post_id
*
* @hook acf/save_post:999
*
* @function acf_save_post()
*/
function save_post($post_id = 0){
// compile enabled
if($this->compile === $post_id){
// get compiled store
$acf = $this->get_store($post_id);
// update with compiled data
$this->update_meta($acf, $post_id);
// end of compile
// free compile for an eventual another acf_save_post() call
$this->compile = false;
// convert meta
// has to be after compile reset to actually update meta
acfe_do_performance_convert($post_id);
// rollback
if($this->get_config('mode') === 'rollback'){
acfe_do_performance_rollback($post_id);
}
}
}
/**
* get_store
*
* @param $post_id
*
* @return array|mixed|null
*/
function get_store($post_id){
// check store
$store = acf_get_store("acfe/performance_meta/{$this->name}");
// store found
if(!$store->has($post_id)){
// get meta
$acf = $this->get_meta($post_id);
$acf = acf_get_array($acf);
// set store: acf meta
$store->set($post_id, $acf);
}
return $store->get($post_id);
}
/**
* update_store
*
* @param $post_id
* @param $value
*/
function update_store($post_id, $value){
// get store
$store = acf_get_store("acfe/performance_meta/{$this->name}");
// update store
$store->set($post_id, $value);
}
/**
* get_meta_key
*
* @param $post_id
*
* @return array|mixed|string|string[]
*/
function get_meta_key($post_id){
/**
* @var $type
* @var $id
*/
extract(acf_decode_post_id($post_id));
// get option key
if($type === 'option'){
$option_key = $this->option_key;
$option_key = str_replace('%id%', $id, $option_key);
return $option_key;
// get meta key
}else{
return $this->meta_key;
}
}
/**
* get_meta
*
* @param $post_id
*
* @return false|mixed|null
*/
function get_meta($post_id){
/**
* @var $type
* @var $id
*/
extract(acf_decode_post_id($post_id));
// meta key
$meta_key = $this->get_meta_key($post_id);
// get option
if($type === 'option'){
$value = get_option($meta_key, null);
// get meta
}else{
$value = acf_get_metadata($post_id, $meta_key);
}
return $value;
}
/**
* update_meta
*
* @param $value
* @param $post_id
*
* @return bool|int
*/
function update_meta($value, $post_id){
/**
* @var $type
* @var $id
*/
extract(acf_decode_post_id($post_id));
// meta key
$meta_key = $this->get_meta_key($post_id);
// update option
if($type === 'option'){
$value = wp_unslash($value);
$autoload = (bool) acf_get_setting('autoload');
return update_option($meta_key, $value, $autoload);
// update meta
}else{
return acf_update_metadata($post_id, $meta_key, $value);
}
}
/**
* delete_meta
*
* @param $post_id
*
* @return bool
*/
function delete_meta($post_id){
/**
* @var $type
* @var $id
*/
extract(acf_decode_post_id($post_id));
// meta key
$meta_key = $this->get_meta_key($post_id);
// delete option
if($type === 'option'){
return delete_option($meta_key);
// delete meta
}else{
return delete_metadata($type, $id, $meta_key);
}
}
/**
* do_bypass
*
* executes a callback within a bypass scope
* allowing to get/update/delete 'real' meta
*
* @param $func
* @param $args
*/
function do_bypass($func, $args = array()){
if(is_callable($func)){
$this->bypass = true;
$return = call_user_func_array($func, $args);
$this->bypass = false;
return $return;
}
return false;
}
/**
* is_enabled
*
* @param $post_id
*
* @return bool
*/
function is_enabled($post_id = 0){
return acfe_get_object_performance_engine_name($post_id) === $this->name;
}
/**
* get_config
*
* @param $key
*
* @return mixed|null
*/
function get_config($key = ''){
return acfe_get_performance_config($key);
}
}
endif;
// register store
acf_register_store('acfe-performance');
/**
* acfe_register_performance_engine
*
* @param $class
*
* @return bool
*/
function acfe_register_performance_engine($class){
// instantiate
$engine = new $class();
// add to store
acf_get_store('acfe-performance')->set($engine->name, $engine);
// return
return true;
}
/**
* acfe_get_performance_engines
*
* @return array|mixed|null
*/
function acfe_get_performance_engines(){
return acf_get_store('acfe-performance')->get();
}
/**
* acfe_get_performance_engine
*
* @param $engine
*
* @return acfe_performance|array|mixed|null
*/
function acfe_get_performance_engine($engine){
if($engine instanceof acfe_performance){
return $engine;
}
return acf_get_store('acfe-performance')->get($engine);
}
/**
* acfe_query_performance_engine
*
* @param $query
* @param $operator
*
* @return false|mixed
*/
function acfe_query_performance_engine($query = array(), $operator = 'AND'){
$engines = acfe_query_performance_engines($query, $operator);
return current($engines);
}
/**
* acfe_query_performance_engines
*
* @param $query
* @param $operator
*
* @return false|mixed
*/
function acfe_query_performance_engines($query = array(), $operator = 'AND'){
return acf_get_store('acfe-performance')->query($query, $operator);
}