oont-contents/plugins/wpify-woo/deps/wpify/custom-fields/src/Api.php
2025-02-10 13:57:45 +01:00

144 lines
5.3 KiB
PHP

<?php
namespace WpifyWooDeps\Wpify\CustomFields;
use WP_Post;
use WP_REST_Controller;
use WP_REST_Request;
use WP_REST_Response;
use WP_REST_Server;
final class Api extends WP_REST_Controller
{
protected $rest_base = 'wcf';
/**
* @var CustomFields
*/
private $wcf;
private $rest_url;
/**
* Api constructor.
*/
public function __construct(CustomFields $wcf)
{
$this->wcf = $wcf;
add_action('rest_api_init', array($this, 'register_routes'));
}
/**
* @return void
*/
public function register_routes()
{
register_rest_route($this->get_namespace(), '/list', array(array('methods' => WP_REST_Server::CREATABLE, 'callback' => array($this, 'get_list'), 'permission_callback' => function () {
return current_user_can('read');
})));
register_rest_route($this->get_namespace(), '/posts', array(array('methods' => WP_REST_Server::CREATABLE, 'callback' => array($this, 'get_posts'), 'permission_callback' => function () {
return current_user_can('read');
})));
register_rest_route($this->get_namespace(), '/options', array(array('methods' => WP_REST_Server::ALLMETHODS, 'callback' => array($this, 'get_options'), 'permission_callback' => function () {
return current_user_can('read');
})));
}
/**
* @return string
*/
private function get_namespace(): string
{
return $this->rest_base . '/' . substr(md5(__FILE__), 0, 10);
}
/**
* @return string
*/
public function get_rest_url(): string
{
if (!$this->rest_url) {
$this->rest_url = rest_url($this->get_namespace());
}
return $this->rest_url;
}
/**
* @return string
*/
public function get_rest_path(): string
{
return '/' . $this->get_namespace();
}
/**
* @return false|string
*/
public function get_rest_nonce()
{
return wp_create_nonce('wp_rest');
}
/**
* @param WP_REST_Request $request
*
* @return WP_REST_Response
*/
public function get_list(WP_REST_Request $request): WP_REST_Response
{
$params = wp_parse_args($request->get_params(), array('list_type' => 'empty'));
$response = apply_filters('wcf_list_' . $params['list_type'], array(), $params);
return new WP_REST_Response($response, 200);
}
/**
* @param WP_REST_Request $request
*
* @return WP_REST_Response
*/
public function get_posts(WP_REST_Request $request): WP_REST_Response
{
$params = $request->get_params();
$query_args = (!empty($params['query_args']) && is_array($params['query_args'])) ? array() : $params['query_args'];
$query_args = wp_parse_args($query_args, array('post_type' => $params['post_type'], 'posts_per_page' => 20, 's' => $params['search']));
$current_posts = (!empty($params['current_value'])) ? get_posts(array('post_type' => $query_args['post_type'], 'include' => $params['current_value'], 'posts_per_page' => -1, 'post_status' => 'any')) : array();
$query_args['exclude'] = array_map(function (WP_Post $post) {
return $post->ID;
}, $current_posts);
$query_args = apply_filters('wcf_get_posts_args', $query_args, $params);
$posts = array_merge($current_posts, get_posts($query_args));
$response = array_map(array($this, 'transform_post_for_select'), $posts);
return new WP_REST_Response($response, 200);
}
/**
* @param WP_Post $post
*
* @return array
*/
private function transform_post_for_select(WP_Post $post): array
{
return array('value' => $post->ID, 'label' => get_the_title($post) . ' [ID ' . $post->ID . ']', 'excerpt' => get_the_excerpt($post), 'thumbnail' => get_the_post_thumbnail_url($post));
}
public function register_fields_options()
{
foreach ($this->wcf->registered as $registered) {
$data = $registered->get_data();
$registered->fill_selects($data['items'], null, \false);
}
}
public function get_options(WP_REST_Request $request): WP_REST_Response
{
$this->register_fields_options();
$args = $request->get_params();
$callback = $this->wcf->get_api_callback($args['options']);
$items = array();
if (is_callable($callback)) {
$items = $callback($args);
$items = Helpers::normalize_options($items);
if (empty($args['search']) && !empty($args['value']) && (empty($args['type']) || !in_array($args['type'], array('post', 'multi_post')))) {
$default_args = $args;
$default_args['value'] = array();
$set_values = array_map(function ($option) {
return $option['value'];
}, $items);
$default_options = $callback($default_args);
$default_options = Helpers::normalize_options($default_options);
foreach ($default_options as $default_option) {
if (!in_array($default_option['value'], $set_values)) {
$items[] = $default_option;
}
}
}
}
return rest_ensure_response(array_values($items));
}
}