257 lines
6.1 KiB
PHP
257 lines
6.1 KiB
PHP
|
<?php
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit; // Exit if accessed directly
|
||
|
}
|
||
|
|
||
|
if ( ! class_exists( 'ACF_Local_Meta' ) ) :
|
||
|
|
||
|
class ACF_Local_Meta {
|
||
|
|
||
|
/** @var array Storage for meta data. */
|
||
|
var $meta = array();
|
||
|
|
||
|
/** @var mixed Storage for the current post_id. */
|
||
|
var $post_id = 0;
|
||
|
|
||
|
/**
|
||
|
* __construct
|
||
|
*
|
||
|
* Sets up the class functionality.
|
||
|
*
|
||
|
* @date 8/10/18
|
||
|
* @since 5.8.0
|
||
|
*
|
||
|
* @param void
|
||
|
* @return void
|
||
|
*/
|
||
|
function __construct() {
|
||
|
|
||
|
// add 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
|
||
|
*
|
||
|
* Adds postmeta to storage.
|
||
|
* Accepts data in either raw or request format.
|
||
|
*
|
||
|
* @date 8/10/18
|
||
|
* @since 5.8.0
|
||
|
*
|
||
|
* @param array $meta An array of metdata to store.
|
||
|
* @param mixed $post_id The post_id for this data.
|
||
|
* @param bool $is_main Makes this postmeta visible to get_field() without a $post_id value.
|
||
|
* @return array
|
||
|
*/
|
||
|
function add( $meta = array(), $post_id = 0, $is_main = false ) {
|
||
|
|
||
|
// Capture meta if supplied meta is from a REQUEST.
|
||
|
if ( $this->is_request( $meta ) ) {
|
||
|
$meta = $this->capture( $meta, $post_id );
|
||
|
}
|
||
|
|
||
|
// Add to storage.
|
||
|
$this->meta[ $post_id ] = $meta;
|
||
|
|
||
|
// Set $post_id reference when is the "main" postmeta.
|
||
|
if ( $is_main ) {
|
||
|
$this->post_id = $post_id;
|
||
|
}
|
||
|
|
||
|
// Return meta.
|
||
|
return $meta;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* is_request
|
||
|
*
|
||
|
* Returns true if the supplied $meta is from a REQUEST (serialized <form> data).
|
||
|
*
|
||
|
* @date 11/3/19
|
||
|
* @since 5.7.14
|
||
|
*
|
||
|
* @param array $meta An array of metdata to check.
|
||
|
* @return bool
|
||
|
*/
|
||
|
function is_request( $meta = array() ) {
|
||
|
return acf_is_field_key( key( $meta ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* capture
|
||
|
*
|
||
|
* Returns a flattened array of meta for the given postdata.
|
||
|
* This is achieved by simulating a save whilst capturing all meta changes.
|
||
|
*
|
||
|
* @date 26/2/19
|
||
|
* @since 5.7.13
|
||
|
*
|
||
|
* @param array $values An array of raw values.
|
||
|
* @param mixed $post_id The post_id for this data.
|
||
|
* @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 ) {
|
||
|
acf_update_values( $values, $post_id );
|
||
|
}
|
||
|
|
||
|
// Remove listener filter.
|
||
|
remove_filter( 'acf/pre_update_metadata', array( $this, 'capture_update_metadata' ), 1, 5 );
|
||
|
|
||
|
// Return meta.
|
||
|
return $this->meta[ $post_id ];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* capture_update_metadata
|
||
|
*
|
||
|
* Records all meta activity and returns a non null value to bypass DB updates.
|
||
|
*
|
||
|
* @date 26/2/19
|
||
|
* @since 5.7.13
|
||
|
*
|
||
|
* @param null $null .
|
||
|
* @param (int|string) $post_id The post id.
|
||
|
* @param string $name The meta name.
|
||
|
* @param mixed $value The meta value.
|
||
|
* @param bool $hidden If the meta is hidden (starts with an underscore).
|
||
|
* @return false.
|
||
|
*/
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* remove
|
||
|
*
|
||
|
* Removes postmeta from storage.
|
||
|
*
|
||
|
* @date 8/10/18
|
||
|
* @since 5.8.0
|
||
|
*
|
||
|
* @param mixed $post_id The post_id for this data.
|
||
|
* @return void
|
||
|
*/
|
||
|
function remove( $post_id = 0 ) {
|
||
|
|
||
|
// unset meta
|
||
|
unset( $this->meta[ $post_id ] );
|
||
|
|
||
|
// reset post_id
|
||
|
if ( $post_id === $this->post_id ) {
|
||
|
$this->post_id = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* pre_load_meta
|
||
|
*
|
||
|
* Injects the local meta.
|
||
|
*
|
||
|
* @date 8/10/18
|
||
|
* @since 5.8.0
|
||
|
*
|
||
|
* @param null $null An empty parameter. Return a non null value to short-circuit the function.
|
||
|
* @param mixed $post_id The post_id for this data.
|
||
|
* @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
|
||
|
*
|
||
|
* Injects the local meta.
|
||
|
*
|
||
|
* @date 8/10/18
|
||
|
* @since 5.8.0
|
||
|
*
|
||
|
* @param null $null An empty parameter. Return a non null value to short-circuit the function.
|
||
|
* @param (int|string) $post_id The post id.
|
||
|
* @param string $name The meta name.
|
||
|
* @param bool $hidden If the meta is hidden (starts with an underscore).
|
||
|
* @return mixed
|
||
|
*/
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* pre_load_post_id
|
||
|
*
|
||
|
* Injects the local post_id.
|
||
|
*
|
||
|
* @date 8/10/18
|
||
|
* @since 5.8.0
|
||
|
*
|
||
|
* @param null $null An empty parameter. Return a non null value to short-circuit the function.
|
||
|
* @param mixed $post_id The post_id for this data.
|
||
|
* @return mixed
|
||
|
*/
|
||
|
function pre_load_post_id( $null, $post_id ) {
|
||
|
if ( ! $post_id && $this->post_id ) {
|
||
|
return $this->post_id;
|
||
|
}
|
||
|
return $null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
endif; // class_exists check
|
||
|
|
||
|
/**
|
||
|
* acf_setup_meta
|
||
|
*
|
||
|
* Adds postmeta to storage.
|
||
|
*
|
||
|
* @date 8/10/18
|
||
|
* @since 5.8.0
|
||
|
* @see ACF_Local_Meta::add() for list of parameters.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
function acf_setup_meta( $meta = array(), $post_id = 0, $is_main = false ) {
|
||
|
return acf_get_instance( 'ACF_Local_Meta' )->add( $meta, $post_id, $is_main );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* acf_reset_meta
|
||
|
*
|
||
|
* Removes postmeta to storage.
|
||
|
*
|
||
|
* @date 8/10/18
|
||
|
* @since 5.8.0
|
||
|
* @see ACF_Local_Meta::remove() for list of parameters.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
function acf_reset_meta( $post_id = 0 ) {
|
||
|
return acf_get_instance( 'ACF_Local_Meta' )->remove( $post_id );
|
||
|
}
|