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