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.

110 lines
2.5 KiB

9 months ago
<?php
/**
* Handle dynamic fields
*
* @package MetaFieldBlock
* @author Phi Phan <mrphipv@gmail.com>
* @copyright Copyright (c) 2024, Phi Phan
*/
namespace MetaFieldBlock;
// Exit if accessed directly.
defined( 'ABSPATH' ) || exit;
if ( ! class_exists( DynamicField::class ) ) :
/**
* The DynamicField class.
*/
class DynamicField extends CoreComponent {
/**
* Run main hooks
*
* @return void
*/
public function run() {
// Handle value for dynamic fields.
add_action( 'rest_api_init', [ $this, 'register_endpoint_for_dynamic_fields' ] );
// Run shortcode.
add_filter( '_meta_field_block_get_field_value', [ $this, 'run_shortcode' ], 10, 6 );
}
/**
* Handle value for dynamic fields.
*
* @return void
*/
public function register_endpoint_for_dynamic_fields() {
register_rest_route(
'mfb/v1',
'/getDynamicField/',
array(
'methods' => 'GET',
'callback' => [ $this, 'get_dynamic_field' ],
'permission_callback' => function () {
return current_user_can( 'edit_posts' );
},
)
);
}
/**
* Get value for dynamic field
*
* @param WP_Request $request
* @return array
*/
public function get_dynamic_field( $request ) {
global $post;
$post_id = $request->get_param( 'postId' );
if ( $post_id > 0 ) {
$post = get_post( $post_id );
// Set up postdata since this will be needed if post_id was set.
setup_postdata( $post );
}
$attributes = $request->get_param( 'attributes' );
$attributes['fetchRawValue'] = true;
// Create an array representation simulating the output of parse_blocks.
$block = array(
'blockName' => 'mfb/meta-field-block',
'attrs' => $attributes,
'innerHTML' => '',
'innerContent' => array(),
);
return render_block( $block );
}
/**
* Get value for a shortcode
*
* @param string $content
* @param string $field_name
* @param int $object_id
* @param string $object_type
* @param array $attributes
* @param WP_Block $block
* @return mixed
*/
public function run_shortcode( $content, $field_name, $object_id, $object_type, $attributes, $block ) {
if ( 'dynamic' === ( $attributes['fieldType'] ?? '' ) ) {
if ( $field_name && '[' === substr( $field_name, 0, 1 ) && ']' === substr( $field_name, -1 ) ) {
$shortcode_content = do_shortcode( $field_name );
if ( $shortcode_content !== $field_name ) {
$content = $shortcode_content;
}
}
}
return $content;
}
}
endif;