356 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			356 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
| 	exit; // Exit if accessed directly
 | |
| }
 | |
| 
 | |
| if ( ! class_exists( 'acf_loop' ) ) :
 | |
| 	
 | |
| 	#[AllowDynamicProperties]
 | |
| 	class acf_loop {
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  __construct
 | |
| 		*
 | |
| 		*  This function will setup the class functionality
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    5/03/2014
 | |
| 		*  @since   5.0.0
 | |
| 		*
 | |
| 		*  @param   n/a
 | |
| 		*  @return  n/a
 | |
| 		*/
 | |
| 
 | |
| 		function __construct() {
 | |
| 
 | |
| 			// vars
 | |
| 			$this->loops = array();
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  is_empty
 | |
| 		*
 | |
| 		*  This function will return true if no loops exist
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    3/03/2016
 | |
| 		*  @since   5.3.2
 | |
| 		*
 | |
| 		*  @param   n/a
 | |
| 		*  @return  (boolean)
 | |
| 		*/
 | |
| 
 | |
| 		function is_empty() {
 | |
| 
 | |
| 			return empty( $this->loops );
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  is_loop
 | |
| 		*
 | |
| 		*  This function will return true if a loop exists for the given array index
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    3/03/2016
 | |
| 		*  @since   5.3.2
 | |
| 		*
 | |
| 		*  @param   $i (int)
 | |
| 		*  @return  (boolean)
 | |
| 		*/
 | |
| 
 | |
| 		function is_loop( $i = 0 ) {
 | |
| 
 | |
| 			return isset( $this->loops[ $i ] );
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  get_i
 | |
| 		*
 | |
| 		*  This function will return a valid array index for the given $i
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    3/03/2016
 | |
| 		*  @since   5.3.2
 | |
| 		*
 | |
| 		*  @param   $i (mixed)
 | |
| 		*  @return  (int)
 | |
| 		*/
 | |
| 
 | |
| 		function get_i( $i = 0 ) {
 | |
| 
 | |
| 			// 'active'
 | |
| 			if ( $i === 'active' ) {
 | |
| 				$i = -1;
 | |
| 			}
 | |
| 
 | |
| 			// 'previous'
 | |
| 			if ( $i === 'previous' ) {
 | |
| 				$i = -2;
 | |
| 			}
 | |
| 
 | |
| 			// allow negative to look at end of loops
 | |
| 			if ( $i < 0 ) {
 | |
| 
 | |
| 				$i = count( $this->loops ) + $i;
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			// return
 | |
| 			return $i;
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  add_loop
 | |
| 		*
 | |
| 		*  This function will add a new loop
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    3/03/2016
 | |
| 		*  @since   5.3.2
 | |
| 		*
 | |
| 		*  @param   $loop (array)
 | |
| 		*  @return  n/a
 | |
| 		*/
 | |
| 
 | |
| 		function add_loop( $loop = array() ) {
 | |
| 
 | |
| 			// defaults
 | |
| 			$loop = wp_parse_args(
 | |
| 				$loop,
 | |
| 				array(
 | |
| 					'selector' => '',
 | |
| 					'name'     => '',
 | |
| 					'value'    => false,
 | |
| 					'field'    => false,
 | |
| 					'i'        => -1,
 | |
| 					'post_id'  => 0,
 | |
| 					'key'      => '',
 | |
| 				)
 | |
| 			);
 | |
| 
 | |
| 			// ensure array
 | |
| 			$loop['value'] = acf_get_array( $loop['value'] );
 | |
| 
 | |
| 			// Re-index values if this loop starts from index 0.
 | |
| 			// This allows ajax previews to work ($_POST data contains random unique array keys)
 | |
| 			if ( $loop['i'] == -1 ) {
 | |
| 
 | |
| 				$loop['value'] = array_values( $loop['value'] );
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			// append
 | |
| 			$this->loops[] = $loop;
 | |
| 
 | |
| 			// return
 | |
| 			return $loop;
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  update_loop
 | |
| 		*
 | |
| 		*  This function will update a loop's setting
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    3/03/2016
 | |
| 		*  @since   5.3.2
 | |
| 		*
 | |
| 		*  @param   $i (mixed)
 | |
| 		*  @param   $key (string) the loop setting name
 | |
| 		*  @param   $value (mixed) the loop setting value
 | |
| 		*  @return  (boolean) true on success
 | |
| 		*/
 | |
| 
 | |
| 		function update_loop( $i = 'active', $key = null, $value = null ) {
 | |
| 
 | |
| 			// i
 | |
| 			$i = $this->get_i( $i );
 | |
| 
 | |
| 			// bail early if no set
 | |
| 			if ( ! $this->is_loop( $i ) ) {
 | |
| 				return false;
 | |
| 			}
 | |
| 
 | |
| 			// set
 | |
| 			$this->loops[ $i ][ $key ] = $value;
 | |
| 
 | |
| 			// return
 | |
| 			return true;
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  get_loop
 | |
| 		*
 | |
| 		*  This function will return a loop, or loop's setting for a given index & key
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    3/03/2016
 | |
| 		*  @since   5.3.2
 | |
| 		*
 | |
| 		*  @param   $i (mixed)
 | |
| 		*  @param   $key (string) the loop setting name
 | |
| 		*  @return  (mixed) false on failure
 | |
| 		*/
 | |
| 
 | |
| 		function get_loop( $i = 'active', $key = null ) {
 | |
| 
 | |
| 			// i
 | |
| 			$i = $this->get_i( $i );
 | |
| 
 | |
| 			// bail early if no set
 | |
| 			if ( ! $this->is_loop( $i ) ) {
 | |
| 				return false;
 | |
| 			}
 | |
| 
 | |
| 			// check for key
 | |
| 			if ( $key !== null ) {
 | |
| 
 | |
| 				return $this->loops[ $i ][ $key ];
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			// return
 | |
| 			return $this->loops[ $i ];
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		/*
 | |
| 		*  remove_loop
 | |
| 		*
 | |
| 		*  This function will remove a loop
 | |
| 		*
 | |
| 		*  @type    function
 | |
| 		*  @date    3/03/2016
 | |
| 		*  @since   5.3.2
 | |
| 		*
 | |
| 		*  @param   $i (mixed)
 | |
| 		*  @return  (boolean) true on success
 | |
| 		*/
 | |
| 
 | |
| 		function remove_loop( $i = 'active' ) {
 | |
| 
 | |
| 			// i
 | |
| 			$i = $this->get_i( $i );
 | |
| 
 | |
| 			// bail early if no set
 | |
| 			if ( ! $this->is_loop( $i ) ) {
 | |
| 				return false;
 | |
| 			}
 | |
| 
 | |
| 			// remove
 | |
| 			unset( $this->loops[ $i ] );
 | |
| 
 | |
| 			// reset keys
 | |
| 			$this->loops = array_values( $this->loops );
 | |
| 
 | |
| 			// PHP 7.2 no longer resets array keys for empty value
 | |
| 			if ( $this->is_empty() ) {
 | |
| 				$this->loops = array();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	// initialize
 | |
| 	acf()->loop = new acf_loop();
 | |
| 
 | |
| endif; // class_exists check
 | |
| 
 | |
| 
 | |
| 
 | |
| /*
 | |
| *  acf_add_loop
 | |
| *
 | |
| *  alias of acf()->loop->add_loop()
 | |
| *
 | |
| *  @type    function
 | |
| *  @date    6/10/13
 | |
| *  @since   5.0.0
 | |
| *
 | |
| *  @param   n/a
 | |
| *  @return  n/a
 | |
| */
 | |
| 
 | |
| function acf_add_loop( $loop = array() ) {
 | |
| 
 | |
| 	return acf()->loop->add_loop( $loop );
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| /*
 | |
| *  acf_update_loop
 | |
| *
 | |
| *  alias of acf()->loop->update_loop()
 | |
| *
 | |
| *  @type    function
 | |
| *  @date    6/10/13
 | |
| *  @since   5.0.0
 | |
| *
 | |
| *  @param   n/a
 | |
| *  @return  n/a
 | |
| */
 | |
| 
 | |
| function acf_update_loop( $i = 'active', $key = null, $value = null ) {
 | |
| 
 | |
| 	return acf()->loop->update_loop( $i, $key, $value );
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| /*
 | |
| *  acf_get_loop
 | |
| *
 | |
| *  alias of acf()->loop->get_loop()
 | |
| *
 | |
| *  @type    function
 | |
| *  @date    6/10/13
 | |
| *  @since   5.0.0
 | |
| *
 | |
| *  @param   n/a
 | |
| *  @return  n/a
 | |
| */
 | |
| 
 | |
| function acf_get_loop( $i = 'active', $key = null ) {
 | |
| 
 | |
| 	return acf()->loop->get_loop( $i, $key );
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| /*
 | |
| *  acf_remove_loop
 | |
| *
 | |
| *  alias of acf()->loop->remove_loop()
 | |
| *
 | |
| *  @type    function
 | |
| *  @date    6/10/13
 | |
| *  @since   5.0.0
 | |
| *
 | |
| *  @param   n/a
 | |
| *  @return  n/a
 | |
| */
 | |
| 
 | |
| function acf_remove_loop( $i = 'active' ) {
 | |
| 
 | |
| 	return acf()->loop->remove_loop( $i );
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 |