Files
2026-04-28 15:13:50 +02:00

129 lines
3.0 KiB
PHP

<?php
/**
* REST API Initialization
*
* @package MetaCommerce
*/
namespace WooCommerce\Facebook\API\Plugin;
defined( 'ABSPATH' ) || exit;
/**
* Class to initialize the REST API functionality. Generates the JS request API template consumed by @connection-api-client.js
* and initializes the REST API Framework Controller.
*
* @since 3.5.0
*/
class InitializeRestAPI {
/**
* Constructor.
*
* @since 3.5.0
*/
public function __construct() {
// Register hooks
add_action( 'admin_enqueue_scripts', [ $this, 'generate_js_request_framework' ] );
$this->init_rest_api_framework();
}
/**
* Initialize the Controller handler.
*
* @since 3.5.0
*/
private function init_rest_api_framework() {
new \WooCommerce\Facebook\API\Plugin\Controller();
}
/**
* Check if the REST framework should be generated.
*
* @since 3.5.0
*
* @return bool
*/
public function should_generate_rest_framework() {
if ( ! facebook_for_woocommerce()->is_plugin_settings() ) {
return false;
}
return true;
}
/**
* Get the API definitions.
*
* @since 3.5.0
*
* @return array
*/
public function get_api_definitions() {
wp_enqueue_script(
'plugin-api-client',
facebook_for_woocommerce()->get_plugin_url() . '/assets/js/admin/plugin-api-client.js',
[ 'jquery' ],
\WC_Facebookcommerce::VERSION,
true // Important: Load in footer
);
// Create a dummy WP_REST_Request object
$dummy_request = new \WP_REST_Request();
// Collect API definitions from all handlers
$api_definitions = [];
$api_definitions = [];
foreach ( Controller::get_js_enabled_requests() as $request_class ) {
// Skip if class doesn't exist
if ( ! class_exists( $request_class ) ) {
continue;
}
// Check if the class is JS exposable
if ( ! method_exists( $request_class, 'is_js_exposable' ) || ! $request_class::is_js_exposable() ) {
continue;
}
try {
// Create an instance of the request class with the dummy request
$request = new $request_class( $dummy_request );
// Get the JS API definition directly from the request class
if ( method_exists( $request, 'get_js_api_definition' ) ) {
$definition = $request->get_js_api_definition();
$class_name = $definition['className'];
$api_definitions[ $class_name ] = $definition;
}
} catch ( \Exception $e ) {
// Log error but continue with other requests
error_log( 'Meta for WooCommerce: Error creating request class ' . $request_class . ': ' . $e->getMessage() );
}
}
return $api_definitions;
}
/**
* Enqueue and localize the API JavaScript.
*
* @since 3.5.0
*
* @return void
*/
public function generate_js_request_framework() {
if ( ! $this->should_generate_rest_framework() ) {
return;
}
$api_definitions = $this->get_api_definitions();
// Localize the script with API data
wp_localize_script(
'plugin-api-client',
'fb_api_data',
[
'api_url' => rest_url( Controller::API_NAMESPACE . '/' ),
'endpoints' => $api_definitions,
]
);
}
}