358 lines
6.7 KiB
PHP
358 lines
6.7 KiB
PHP
|
<?php
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit; // Exit if accessed directly.
|
||
|
}
|
||
|
|
||
|
if ( ! class_exists( 'ACF_Data' ) ) :
|
||
|
|
||
|
#[AllowDynamicProperties]
|
||
|
class ACF_Data {
|
||
|
|
||
|
/** @var string Unique identifier. */
|
||
|
var $cid = '';
|
||
|
|
||
|
/** @var array Storage for data. */
|
||
|
var $data = array();
|
||
|
|
||
|
/** @var array Storage for data aliases. */
|
||
|
var $aliases = array();
|
||
|
|
||
|
/** @var bool Enables unique data per site. */
|
||
|
var $multisite = false;
|
||
|
|
||
|
/**
|
||
|
* __construct
|
||
|
*
|
||
|
* Sets up the class functionality.
|
||
|
*
|
||
|
* @date 9/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param array $data Optional data to set.
|
||
|
* @return void
|
||
|
*/
|
||
|
function __construct( $data = false ) {
|
||
|
|
||
|
// Set cid.
|
||
|
$this->cid = acf_uniqid();
|
||
|
|
||
|
// Set data.
|
||
|
if ( $data ) {
|
||
|
$this->set( $data );
|
||
|
}
|
||
|
|
||
|
// Initialize.
|
||
|
$this->initialize();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* initialize
|
||
|
*
|
||
|
* Called during constructor to setup class functionality.
|
||
|
*
|
||
|
* @date 9/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param void
|
||
|
* @return void
|
||
|
*/
|
||
|
function initialize() {
|
||
|
// Do nothing.
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* prop
|
||
|
*
|
||
|
* Sets a property for the given name and returns $this for chaining.
|
||
|
*
|
||
|
* @date 9/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param (string|array) $name The data name or an array of data.
|
||
|
* @param mixed $value The data value.
|
||
|
* @return ACF_Data
|
||
|
*/
|
||
|
function prop( $name = '', $value = null ) {
|
||
|
|
||
|
// Update property.
|
||
|
$this->{$name} = $value;
|
||
|
|
||
|
// Return this for chaining.
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* _key
|
||
|
*
|
||
|
* Returns a key for the given name allowing aliasses to work.
|
||
|
*
|
||
|
* @date 18/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param type $var Description. Default.
|
||
|
* @return type Description.
|
||
|
*/
|
||
|
function _key( $name = '' ) {
|
||
|
return isset( $this->aliases[ $name ] ) ? $this->aliases[ $name ] : $name;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* has
|
||
|
*
|
||
|
* Returns true if this has data for the given name.
|
||
|
*
|
||
|
* @date 9/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param string $name The data name.
|
||
|
* @return boolean
|
||
|
*/
|
||
|
function has( $name = '' ) {
|
||
|
$key = $this->_key( $name );
|
||
|
return isset( $this->data[ $key ] );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* is
|
||
|
*
|
||
|
* Similar to has() but does not check aliases.
|
||
|
*
|
||
|
* @date 7/2/19
|
||
|
* @since 5.7.11
|
||
|
*
|
||
|
* @param type $var Description. Default.
|
||
|
* @return type Description.
|
||
|
*/
|
||
|
function is( $key = '' ) {
|
||
|
return isset( $this->data[ $key ] );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* get
|
||
|
*
|
||
|
* Returns data for the given name of null if doesn't exist.
|
||
|
*
|
||
|
* @date 9/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param string $name The data name.
|
||
|
* @return mixed
|
||
|
*/
|
||
|
function get( $name = false ) {
|
||
|
|
||
|
// Get all.
|
||
|
if ( $name === false ) {
|
||
|
return $this->data;
|
||
|
|
||
|
// Get specific.
|
||
|
} else {
|
||
|
$key = $this->_key( $name );
|
||
|
return isset( $this->data[ $key ] ) ? $this->data[ $key ] : null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* get_data
|
||
|
*
|
||
|
* Returns an array of all data.
|
||
|
*
|
||
|
* @date 9/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param void
|
||
|
* @return array
|
||
|
*/
|
||
|
function get_data() {
|
||
|
return $this->data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* set
|
||
|
*
|
||
|
* Sets data for the given name and returns $this for chaining.
|
||
|
*
|
||
|
* @date 9/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param (string|array) $name The data name or an array of data.
|
||
|
* @param mixed $value The data value.
|
||
|
* @return ACF_Data
|
||
|
*/
|
||
|
function set( $name = '', $value = null ) {
|
||
|
|
||
|
// Set multiple.
|
||
|
if ( is_array( $name ) ) {
|
||
|
$this->data = array_merge( $this->data, $name );
|
||
|
|
||
|
// Set single.
|
||
|
} else {
|
||
|
$this->data[ $name ] = $value;
|
||
|
}
|
||
|
|
||
|
// Return this for chaining.
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* append
|
||
|
*
|
||
|
* Appends data for the given name and returns $this for chaining.
|
||
|
*
|
||
|
* @date 9/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param mixed $value The data value.
|
||
|
* @return ACF_Data
|
||
|
*/
|
||
|
function append( $value = null ) {
|
||
|
|
||
|
// Append.
|
||
|
$this->data[] = $value;
|
||
|
|
||
|
// Return this for chaining.
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* remove
|
||
|
*
|
||
|
* Removes data for the given name.
|
||
|
*
|
||
|
* @date 9/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param string $name The data name.
|
||
|
* @return ACF_Data
|
||
|
*/
|
||
|
function remove( $name = '' ) {
|
||
|
|
||
|
// Remove data.
|
||
|
unset( $this->data[ $name ] );
|
||
|
|
||
|
// Return this for chaining.
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* reset
|
||
|
*
|
||
|
* Resets the data.
|
||
|
*
|
||
|
* @date 22/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param void
|
||
|
* @return void
|
||
|
*/
|
||
|
function reset() {
|
||
|
$this->data = array();
|
||
|
$this->aliases = array();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* count
|
||
|
*
|
||
|
* Returns the data count.
|
||
|
*
|
||
|
* @date 23/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param void
|
||
|
* @return int
|
||
|
*/
|
||
|
function count() {
|
||
|
return count( $this->data );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* query
|
||
|
*
|
||
|
* Returns a filtered array of data based on the set of key => value arguments.
|
||
|
*
|
||
|
* @date 23/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param void
|
||
|
* @return int
|
||
|
*/
|
||
|
function query( $args, $operator = 'AND' ) {
|
||
|
return wp_list_filter( $this->data, $args, $operator );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* alias
|
||
|
*
|
||
|
* Sets an alias for the given name allowing data to be found via multiple identifiers.
|
||
|
*
|
||
|
* @date 18/1/19
|
||
|
* @since 5.7.10
|
||
|
*
|
||
|
* @param type $var Description. Default.
|
||
|
* @return type Description.
|
||
|
*/
|
||
|
function alias( $name = '' /*, $alias, $alias2, etc */ ) {
|
||
|
|
||
|
// Get all aliases.
|
||
|
$args = func_get_args();
|
||
|
array_shift( $args );
|
||
|
|
||
|
// Loop over aliases and add to data.
|
||
|
foreach ( $args as $alias ) {
|
||
|
$this->aliases[ $alias ] = $name;
|
||
|
}
|
||
|
|
||
|
// Return this for chaining.
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* switch_site
|
||
|
*
|
||
|
* Triggered when switching between sites on a multisite installation.
|
||
|
*
|
||
|
* @date 13/2/19
|
||
|
* @since 5.7.11
|
||
|
*
|
||
|
* @param int $site_id New blog ID.
|
||
|
* @param int prev_blog_id Prev blog ID.
|
||
|
* @return void
|
||
|
*/
|
||
|
function switch_site( $site_id, $prev_site_id ) {
|
||
|
|
||
|
// Bail early if not multisite compatible.
|
||
|
if ( ! $this->multisite ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Bail early if no change in blog ID.
|
||
|
if ( $site_id === $prev_site_id ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Create storage.
|
||
|
if ( ! isset( $this->site_data ) ) {
|
||
|
$this->site_data = array();
|
||
|
$this->site_aliases = array();
|
||
|
}
|
||
|
|
||
|
// Save state.
|
||
|
$this->site_data[ $prev_site_id ] = $this->data;
|
||
|
$this->site_aliases[ $prev_site_id ] = $this->aliases;
|
||
|
|
||
|
// Reset state.
|
||
|
$this->data = array();
|
||
|
$this->aliases = array();
|
||
|
|
||
|
// Load state.
|
||
|
if ( isset( $this->site_data[ $site_id ] ) ) {
|
||
|
$this->data = $this->site_data[ $site_id ];
|
||
|
$this->aliases = $this->site_aliases[ $site_id ];
|
||
|
unset( $this->site_data[ $site_id ] );
|
||
|
unset( $this->site_aliases[ $site_id ] );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
endif; // class_exists check
|