You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
2.9 KiB
133 lines
2.9 KiB
9 months ago
|
<?php
|
||
|
/**
|
||
|
* The RestFields
|
||
|
*
|
||
|
* @package MetaFieldBlock
|
||
|
* @author Phi Phan <mrphipv@gmail.com>
|
||
|
* @copyright Copyright (c) 2023, Phi Phan
|
||
|
*/
|
||
|
|
||
|
namespace MetaFieldBlock;
|
||
|
|
||
|
// Exit if accessed directly.
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
if ( ! class_exists( RestFields::class ) ) :
|
||
|
/**
|
||
|
* The RestFields class.
|
||
|
*/
|
||
|
class RestFields extends CoreComponent {
|
||
|
/**
|
||
|
* Array of public object types
|
||
|
*/
|
||
|
protected $object_types = [];
|
||
|
|
||
|
/**
|
||
|
* Run main hooks
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function run() {
|
||
|
// Load public object types.
|
||
|
add_action( 'init', [ $this, 'load_public_object_types' ] );
|
||
|
|
||
|
// Expose all custom rest fields for public object types.
|
||
|
add_action( 'rest_api_init', [ $this, 'expose_custom_rest_fields' ], PHP_INT_MAX );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Load public object types.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function load_public_object_types() {
|
||
|
if ( empty( $this->object_types ) ) {
|
||
|
$this->object_types = $this->get_public_object_types();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Load all available rest fields for public object types
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function expose_custom_rest_fields() {
|
||
|
global $wp_rest_additional_fields;
|
||
|
|
||
|
if ( count( $this->object_types ) > 0 ) {
|
||
|
$object_types = array_reduce(
|
||
|
$this->object_types,
|
||
|
function ( $previous, $object_type ) use ( $wp_rest_additional_fields ) {
|
||
|
if ( isset( $wp_rest_additional_fields[ $object_type ] ) ) {
|
||
|
$field_names = array_filter(
|
||
|
array_keys( $wp_rest_additional_fields[ $object_type ] ),
|
||
|
function ( $key ) {
|
||
|
return 'acf' !== $key; // Ignore acf.
|
||
|
}
|
||
|
);
|
||
|
|
||
|
if ( count( $field_names ) > 0 ) {
|
||
|
$previous[ $object_type ] = array_values( $field_names );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $previous;
|
||
|
},
|
||
|
[]
|
||
|
);
|
||
|
|
||
|
if ( count( $object_types ) > 0 ) {
|
||
|
foreach ( $object_types as $object_type => $fields ) {
|
||
|
register_rest_field(
|
||
|
$object_type,
|
||
|
'mfb_rest_fields',
|
||
|
array(
|
||
|
'get_callback' => function () use ( $fields ) {
|
||
|
return $fields;
|
||
|
},
|
||
|
'schema' => array(
|
||
|
'type' => 'array',
|
||
|
),
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get all public object types
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
private function get_public_object_types() {
|
||
|
// Try cache.
|
||
|
$cache_key = 'get_public_object_types';
|
||
|
$object_types = wp_cache_get( $cache_key, 'mfb' );
|
||
|
if ( $object_types === false ) {
|
||
|
$post_types = get_post_types(
|
||
|
[
|
||
|
'public' => true,
|
||
|
'show_in_rest' => true,
|
||
|
]
|
||
|
);
|
||
|
|
||
|
$object_types = [];
|
||
|
if ( ! empty( $post_types ) ) {
|
||
|
$object_types = array_keys( $post_types );
|
||
|
}
|
||
|
|
||
|
$other_types = apply_filters( 'meta_field_block_get_additional_public_types_for_rest', [] );
|
||
|
|
||
|
if ( ! empty( $other_types ) ) {
|
||
|
$object_types = array_merge( $object_types, $other_types );
|
||
|
}
|
||
|
|
||
|
wp_cache_set( $cache_key, $object_types, 'mfb' );
|
||
|
}
|
||
|
|
||
|
return $object_types;
|
||
|
}
|
||
|
}
|
||
|
endif;
|