344 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			344 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| // Exit if accessed directly.
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
| 	exit;
 | |
| }
 | |
| 
 | |
| // Register store.
 | |
| acf_register_store( 'location-types' );
 | |
| 
 | |
| /**
 | |
|  * Registers a location type.
 | |
|  *
 | |
|  * @date    8/4/20
 | |
|  * @since   5.9.0
 | |
|  *
 | |
|  * @param   string $class_name The location class name.
 | |
|  * @return  (ACF_Location|false)
 | |
|  */
 | |
| function acf_register_location_type( $class_name ) {
 | |
| 	$store = acf_get_store( 'location-types' );
 | |
| 
 | |
| 	// Check class exists.
 | |
| 	if ( ! class_exists( $class_name ) ) {
 | |
| 		$message = sprintf( __( 'Class "%s" does not exist.', 'acf' ), $class_name );
 | |
| 		_doing_it_wrong( __FUNCTION__, $message, '5.9.0' );
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	// Create instance.
 | |
| 	$location_type = new $class_name();
 | |
| 	$name          = $location_type->name;
 | |
| 
 | |
| 	// Check location type is unique.
 | |
| 	if ( $store->has( $name ) ) {
 | |
| 		$message = sprintf( __( 'Location type "%s" is already registered.', 'acf' ), $name );
 | |
| 		_doing_it_wrong( __FUNCTION__, $message, '5.9.0' );
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	// Add to store.
 | |
| 	$store->set( $name, $location_type );
 | |
| 
 | |
| 	/**
 | |
| 	 * Fires after a location type is registered.
 | |
| 	 *
 | |
| 	 * @date    8/4/20
 | |
| 	 * @since   5.9.0
 | |
| 	 *
 | |
| 	 * @param   string $name The location type name.
 | |
| 	 * @param   ACF_Location $location_type The location type instance.
 | |
| 	 */
 | |
| 	do_action( 'acf/registered_location_type', $name, $location_type );
 | |
| 
 | |
| 	// Return location type instance.
 | |
| 	return $location_type;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns an array of all registered location types.
 | |
|  *
 | |
|  * @date    8/4/20
 | |
|  * @since   5.9.0
 | |
|  *
 | |
|  * @param   void
 | |
|  * @return  array
 | |
|  */
 | |
| function acf_get_location_types() {
 | |
| 	return acf_get_store( 'location-types' )->get();
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns a location type for the given name.
 | |
|  *
 | |
|  * @date    18/2/19
 | |
|  * @since   5.7.12
 | |
|  *
 | |
|  * @param   string $name The location type name.
 | |
|  * @return  (ACF_Location|null)
 | |
|  */
 | |
| function acf_get_location_type( $name ) {
 | |
| 	return acf_get_store( 'location-types' )->get( $name );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns a grouped array of all location rule types.
 | |
|  *
 | |
|  * @date    8/4/20
 | |
|  * @since   5.9.0
 | |
|  *
 | |
|  * @param   void
 | |
|  * @return  array
 | |
|  */
 | |
| function acf_get_location_rule_types() {
 | |
| 	$types = array();
 | |
| 
 | |
| 	// Default categories.
 | |
| 	$categories = array(
 | |
| 		'post'  => __( 'Post', 'acf' ),
 | |
| 		'page'  => __( 'Page', 'acf' ),
 | |
| 		'user'  => __( 'User', 'acf' ),
 | |
| 		'forms' => __( 'Forms', 'acf' ),
 | |
| 	);
 | |
| 
 | |
| 	// Loop over all location types and append to $type.
 | |
| 	$location_types = acf_get_location_types();
 | |
| 	foreach ( $location_types as $location_type ) {
 | |
| 
 | |
| 		// Ignore if not public.
 | |
| 		if ( ! $location_type->public ) {
 | |
| 			continue;
 | |
| 		}
 | |
| 
 | |
| 		// Find category label from category name.
 | |
| 		$category = $location_type->category;
 | |
| 		if ( isset( $categories[ $category ] ) ) {
 | |
| 			$category = $categories[ $category ];
 | |
| 		}
 | |
| 
 | |
| 		// Append
 | |
| 		$types[ $category ][ $location_type->name ] = esc_html( $location_type->label );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the location rule types.
 | |
| 	 *
 | |
| 	 * @date    8/4/20
 | |
| 	 * @since   5.9.0
 | |
| 	 *
 | |
| 	 * @param   array $types The location rule types.
 | |
| 	 */
 | |
| 	return apply_filters( 'acf/location/rule_types', $types );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns a validated location rule with all props.
 | |
|  *
 | |
|  * @date    8/4/20
 | |
|  * @since   5.9.0
 | |
|  *
 | |
|  * @param   array $rule The location rule.
 | |
|  * @return  array
 | |
|  */
 | |
| function acf_validate_location_rule( $rule = array() ) {
 | |
| 
 | |
| 	// Apply defaults.
 | |
| 	$rule = wp_parse_args(
 | |
| 		$rule,
 | |
| 		array(
 | |
| 			'id'       => '',
 | |
| 			'group'    => '',
 | |
| 			'param'    => '',
 | |
| 			'operator' => '==',
 | |
| 			'value'    => '',
 | |
| 		)
 | |
| 	);
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the location rule to ensure is valid.
 | |
| 	 *
 | |
| 	 * @date    8/4/20
 | |
| 	 * @since   5.9.0
 | |
| 	 *
 | |
| 	 * @param   array $rule The location rule.
 | |
| 	 */
 | |
| 	$rule = apply_filters( "acf/location/validate_rule/type={$rule['param']}", $rule );
 | |
| 	$rule = apply_filters( 'acf/location/validate_rule', $rule );
 | |
| 	return $rule;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns an array of operators for a given rule.
 | |
|  *
 | |
|  * @date    30/5/17
 | |
|  * @since   5.6.0
 | |
|  *
 | |
|  * @param   array $rule The location rule.
 | |
|  * @return  array
 | |
|  */
 | |
| function acf_get_location_rule_operators( $rule ) {
 | |
| 	$operators = ACF_Location::get_operators( $rule );
 | |
| 
 | |
| 	// Get operators from location type since 5.9.
 | |
| 	$location_type = acf_get_location_type( $rule['param'] );
 | |
| 	if ( $location_type ) {
 | |
| 		$operators = $location_type->get_operators( $rule );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the location rule operators.
 | |
| 	 *
 | |
| 	 * @date    30/5/17
 | |
| 	 * @since   5.6.0
 | |
| 	 *
 | |
| 	 * @param   array $types The location rule operators.
 | |
| 	 */
 | |
| 	$operators = apply_filters( "acf/location/rule_operators/type={$rule['param']}", $operators, $rule );
 | |
| 	$operators = apply_filters( "acf/location/rule_operators/{$rule['param']}", $operators, $rule );
 | |
| 	$operators = apply_filters( 'acf/location/rule_operators', $operators, $rule );
 | |
| 	return $operators;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns an array of values for a given rule.
 | |
|  *
 | |
|  * @date    30/5/17
 | |
|  * @since   5.6.0
 | |
|  *
 | |
|  * @param   array $rule The location rule.
 | |
|  * @return  array
 | |
|  */
 | |
| function acf_get_location_rule_values( $rule ) {
 | |
| 	$values = array();
 | |
| 
 | |
| 	// Get values from location type since 5.9.
 | |
| 	$location_type = acf_get_location_type( $rule['param'] );
 | |
| 	if ( $location_type ) {
 | |
| 		$values = $location_type->get_values( $rule );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the location rule values.
 | |
| 	 *
 | |
| 	 * @date    30/5/17
 | |
| 	 * @since   5.6.0
 | |
| 	 *
 | |
| 	 * @param   array $types The location rule values.
 | |
| 	 */
 | |
| 	$values = apply_filters( "acf/location/rule_values/type={$rule['param']}", $values, $rule );
 | |
| 	$values = apply_filters( "acf/location/rule_values/{$rule['param']}", $values, $rule );
 | |
| 	$values = apply_filters( 'acf/location/rule_values', $values, $rule );
 | |
| 	return $values;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns true if the provided rule matches the screen args.
 | |
|  *
 | |
|  * @date    30/5/17
 | |
|  * @since   5.6.0
 | |
|  *
 | |
|  * @param   array $rule The location rule.
 | |
|  * @param   array $screen The screen args.
 | |
|  * @param   array $field The field group array.
 | |
|  * @return  bool
 | |
|  */
 | |
| function acf_match_location_rule( $rule, $screen, $field_group ) {
 | |
| 	$result = false;
 | |
| 
 | |
| 	// Get result from location type since 5.9.
 | |
| 	$location_type = acf_get_location_type( $rule['param'] );
 | |
| 	if ( $location_type ) {
 | |
| 		$result = $location_type->match( $rule, $screen, $field_group );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the result.
 | |
| 	 *
 | |
| 	 * @date    30/5/17
 | |
| 	 * @since   5.6.0
 | |
| 	 *
 | |
| 	 * @param   bool $result The match result.
 | |
| 	 * @param   array $rule The location rule.
 | |
| 	 * @param   array $screen The screen args.
 | |
| 	 * @param   array $field_group The field group array.
 | |
| 	 */
 | |
| 	$result = apply_filters( "acf/location/match_rule/type={$rule['param']}", $result, $rule, $screen, $field_group );
 | |
| 	$result = apply_filters( 'acf/location/match_rule', $result, $rule, $screen, $field_group );
 | |
| 	$result = apply_filters( "acf/location/rule_match/{$rule['param']}", $result, $rule, $screen, $field_group );
 | |
| 	$result = apply_filters( 'acf/location/rule_match', $result, $rule, $screen, $field_group );
 | |
| 	return $result;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns ann array of screen args to be used against matching rules.
 | |
|  *
 | |
|  * @date    8/4/20
 | |
|  * @since   5.9.0
 | |
|  *
 | |
|  * @param   array $screen The screen args.
 | |
|  * @param   array $deprecated The field group array.
 | |
|  * @return  array
 | |
|  */
 | |
| function acf_get_location_screen( $screen = array(), $deprecated = false ) {
 | |
| 
 | |
| 	// Apply defaults.
 | |
| 	$screen = wp_parse_args(
 | |
| 		$screen,
 | |
| 		array(
 | |
| 			'lang' => acf_get_setting( 'current_language' ),
 | |
| 			'ajax' => false,
 | |
| 		)
 | |
| 	);
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the result.
 | |
| 	 *
 | |
| 	 * @date    30/5/17
 | |
| 	 * @since   5.6.0
 | |
| 	 *
 | |
| 	 * @param   array $screen The screen args.
 | |
| 	 * @param   array $deprecated The field group array.
 | |
| 	 */
 | |
| 	return apply_filters( 'acf/location/screen', $screen, $deprecated );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Alias of acf_register_location_type().
 | |
|  *
 | |
|  * @date    31/5/17
 | |
|  * @since   5.6.0
 | |
|  *
 | |
|  * @param   string $class_name The location class name.
 | |
|  * @return  (ACF_Location|false)
 | |
|  */
 | |
| function acf_register_location_rule( $class_name ) {
 | |
| 	return acf_register_location_type( $class_name );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Alias of acf_get_location_type().
 | |
|  *
 | |
|  * @date    31/5/17
 | |
|  * @since   5.6.0
 | |
|  *
 | |
|  * @param   string $class_name The location class name.
 | |
|  * @return  (ACF_Location|false)
 | |
|  */
 | |
| function acf_get_location_rule( $name ) {
 | |
| 	return acf_get_location_type( $name );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Alias of acf_validate_location_rule().
 | |
|  *
 | |
|  * @date    30/5/17
 | |
|  * @since   5.6.0
 | |
|  *
 | |
|  * @param   array $rule The location rule.
 | |
|  * @return  array
 | |
|  */
 | |
| function acf_get_valid_location_rule( $rule ) {
 | |
| 	return acf_validate_location_rule( $rule );
 | |
| }
 |