123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- <?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 );
- }
|