web/wp-content/plugins/acf-extended/includes/local-meta.php (103 lines of code) (raw):
<?php
if(!defined('ABSPATH')){
exit;
}
if(!class_exists('ACFE_Local_Meta')):
class ACFE_Local_Meta{
// vars
var $meta = array();
var $curr_id = array();
var $main_id = array();
/**
* construct
*/
function __construct(){
// Filters
add_filter('acf/pre_load_post_id', array($this, 'pre_load_post_id'), 1, 2);
add_filter('acf/pre_load_meta', array($this, 'pre_load_meta'), 1, 2);
add_filter('acf/pre_load_metadata', array($this, 'pre_load_metadata'), 1, 4);
}
/**
* add
*
* @param $meta
* @param $post_id
* @param $is_main
*
* @return array|mixed
*/
function add($meta = array(), $post_id = 0, $is_main = false){
// Capture meta
if($this->is_request($meta)){
$meta = $this->capture($meta, $post_id);
}
// Add to storage
$this->meta[$post_id] = $meta;
// Add to current ID
$this->curr_id[] = $post_id;
// Add to main ID
if($is_main){
$this->main_id[] = $post_id;
}
// Return meta.
return $meta;
}
/**
* remove
*/
function remove(){
// unset meta
unset($this->meta[end($this->curr_id)]);
// reset main id
if(end($this->curr_id) === end($this->main_id)){
// remove last value of main id
array_pop($this->main_id);
}
// remove last value of current id
array_pop($this->curr_id);
}
/**
* pre_load_post_id
*
* acf/pre_load_post_id:1
*
* @param $null
* @param $post_id
*
* @return false|mixed
*/
function pre_load_post_id($null, $post_id){
if(!$post_id && $this->main_id && end($this->curr_id) === end($this->main_id)){
return end($this->main_id);
}
return $null;
}
/**
* is_request
*
* @param $meta
*
* @return bool
*/
function is_request($meta = array()){
return acf_is_field_key(key($meta));
}
/**
* capture
*
* @param $values
* @param $post_id
*
* @return array
*/
function capture($values = array(), $post_id = 0){
// Reset meta.
$this->meta[ $post_id ] = array();
// Listen for any added meta.
add_filter('acf/pre_update_metadata', array($this, 'capture_update_metadata'), 1, 5);
// Simulate update.
if($values){
// Get hook variations
$hook = acf_get_store('hook-variations')->get('acf/update_value');
// Clone Hook
$_hook = $hook;
unset($_hook['variations'][1]); // unset name
unset($_hook['variations'][2]); // unset key
// Update hook variations
acf_get_store('hook-variations')->set('acf/update_value', $_hook);
// update values
acf_update_values($values, $post_id);
// Reset hook variations back to default
acf_get_store('hook-variations')->set('acf/update_value', $hook);
}
// Remove listener filter.
remove_filter('acf/pre_update_metadata', array($this, 'capture_update_metadata'), 1);
// Return meta.
return $this->meta[ $post_id ];
}
/**
* capture_update_metadata
*
* acf/pre_update_metadata:1
*
* @param $null
* @param $post_id
* @param $name
* @param $value
* @param $hidden
*
* @return bool
*/
function capture_update_metadata($null, $post_id, $name, $value, $hidden){
$name = ($hidden ? '_' : '') . $name;
$this->meta[ $post_id ][ $name ] = $value;
// Return non null value to escape update process.
return true;
}
/**
* pre_load_meta
*
* acf/pre_load_meta:1
*
* @param $null
* @param $post_id
*
* @return mixed
*/
function pre_load_meta($null, $post_id){
if(isset($this->meta[ $post_id ])){
return $this->meta[ $post_id ];
}
return $null;
}
/**
* pre_load_metadata
*
* acf/pre_load_metadata:1
*
* @param $null
* @param $post_id
* @param $name
* @param $hidden
*
* @return mixed|string
*/
function pre_load_metadata($null, $post_id, $name, $hidden){
$name = ($hidden ? '_' : '') . $name;
if(isset($this->meta[ $post_id ])){
if(isset($this->meta[ $post_id ][ $name ])){
return $this->meta[ $post_id ][ $name ];
}
return '__return_null';
}
return $null;
}
}
endif;
/**
* acfe_setup_meta
*
* @param $meta
* @param $post_id
* @param $is_main
*
* @return mixed
*/
function acfe_setup_meta($meta = array(), $post_id = 0, $is_main = false){
return acf_get_instance('ACFE_Local_Meta')->add($meta, $post_id, $is_main);
}
/**
* acfe_reset_meta
*
* @return mixed
*/
function acfe_reset_meta(){
return acf_get_instance('ACFE_Local_Meta')->remove();
}
/**
* acfe_get_local_post_ids
* @return array
*/
function acfe_get_local_post_ids(){
$post_ids = array();
// ACF local meta
$acf_meta = acf_get_instance('ACF_Local_Meta')->meta;
$post_ids = array_merge($post_ids, array_keys($acf_meta));
// ACFE local meta
$acfe_meta = acf_get_instance('ACFE_Local_Meta')->meta;
$post_ids = array_merge($post_ids, array_keys($acfe_meta));
return array_unique($post_ids);
}
/**
* acfe_get_local_post_id
* @return false|mixed
*/
function acfe_get_local_post_id(){
$post_ids = acfe_get_local_post_ids();
return end($post_ids);
}
/**
* acfe_is_local_post_id
*
* @param $post_id
*
* @return bool
*/
function acfe_is_local_post_id($post_id){
return in_array($post_id, acfe_get_local_post_ids());
}
/**
* acfe_is_local_meta
* @return bool
*/
function acfe_is_local_meta(){
return !empty(acfe_get_local_post_ids());
}