wp_back/wp-content/plugins/advanced-custom-fields/includes/rest-api/class-acf-rest-embed-links.php

94 lines
2.4 KiB
PHP
Raw Normal View History

2024-05-20 15:37:46 +03:00
<?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;
}
}