94 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| // Exit if accessed directly.
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
| 	exit;
 | |
| }
 | |
| 
 | |
| // If class is already defined, return.
 | |
| if ( class_exists( 'ACF_Rest_Api' ) ) {
 | |
| 	return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Class ACF_Rest_Embed_Links
 | |
|  *
 | |
|  * Manage the addition of embed links on supported REST endpoints.
 | |
|  */
 | |
| class ACF_Rest_Embed_Links {
 | |
| 
 | |
| 	/** @var array Links to add to the response. These can be flagged as embeddable and expanded when _embed is passed with the request. */
 | |
| 	private $links = array();
 | |
| 
 | |
| 	public function initialize() {
 | |
| 		$this->hook_link_handlers();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Hook into all REST-enabled post type, taxonomy, and the user controllers in order to prepare links.
 | |
| 	 */
 | |
| 	private function hook_link_handlers() {
 | |
| 		foreach ( get_post_types( array( 'show_in_rest' => true ) ) as $post_type ) {
 | |
| 			add_filter( "rest_prepare_{$post_type}", array( $this, 'load_item_links' ), 10, 3 );
 | |
| 		}
 | |
| 
 | |
| 		foreach ( get_taxonomies( array( 'show_in_rest' => true ) ) as $taxonomy ) {
 | |
| 			add_filter( "rest_prepare_{$taxonomy}", array( $this, 'load_item_links' ), 10, 3 );
 | |
| 		}
 | |
| 
 | |
| 		add_filter( 'rest_prepare_user', array( $this, 'load_item_links' ), 10, 3 );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Add links to internal property for subsequent use in \ACF_Rest_Embed_Links::load_item_links().
 | |
| 	 *
 | |
| 	 * @param       $post_id
 | |
| 	 * @param array   $field
 | |
| 	 */
 | |
| 	public function prepare_links( $post_id, array $field ) {
 | |
| 		$links = acf_get_field_rest_links( $post_id, $field );
 | |
| 		if ( ! $links ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		foreach ( $links as $link ) {
 | |
| 			// If required array keys are not provided, skip.
 | |
| 			if ( empty( $link['rel'] ) or empty( $link['href'] ) ) {
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			// Use the 'rel' and 'href' to for a key. The key only prevents against the same object
 | |
| 			// appearing more than once within the same 'rel' property.
 | |
| 			$this->links[ $link['rel'] . ':' . $link['href'] ] = $link;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Hook into the rest_prepare_{$type} filters and add links for the object being prepared.
 | |
| 	 *
 | |
| 	 * @param WP_REST_Response        $response
 | |
| 	 * @param WP_Post|WP_User|WP_Term $item
 | |
| 	 * @param WP_REST_Request         $request
 | |
| 	 * @return WP_REST_Response
 | |
| 	 */
 | |
| 	public function load_item_links( $response, $item, $request ) {
 | |
| 		if ( empty( $this->links ) ) {
 | |
| 			return $response;
 | |
| 		}
 | |
| 
 | |
| 		while ( $attributes = array_pop( $this->links ) ) {
 | |
| 			$response->add_link(
 | |
| 				acf_extract_var( $attributes, 'rel' ),
 | |
| 				acf_extract_var( $attributes, 'href' ),
 | |
| 				$attributes
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		// Reset the links prop.
 | |
| 		$this->links = array();
 | |
| 
 | |
| 		return $response;
 | |
| 	}
 | |
| 
 | |
| }
 |