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.", __METHOD__ ), [ 'status' => 405 ] ); } /** * Register endpoints. */ abstract public function register_endpoints(); /** * Register processors. */ public function register_processors() { } /** * Register internal endpoints. */ protected function register_internal_endpoints() { register_rest_route( $this->get_namespace(), '/' . $this->get_rest_base(), [ [ 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_items' ), 'args' => [], 'permission_callback' => function ( $request ) { return $this->get_permission_callback( $request ); }, ], ] ); } /** * Register endpoint. * * @param string $endpoint_class * * @return \Elementor\Data\Base\Endpoint */ protected function register_endpoint( $endpoint_class ) { $endpoint_instance = new $endpoint_class( $this ); // TODO: Validate instance like in register_sub_endpoint(). $endpoint_route = $this->get_name() . '/' . $endpoint_instance->get_name(); $this->endpoints[ $endpoint_route ] = $endpoint_instance; $command = $endpoint_route; $format = $endpoint_instance::get_format(); if ( $command ) { $format = $command . '/' . $format; } else { $format = $format . $command; } // `$e.data.registerFormat()`. Manager::instance()->register_endpoint_format( $command, $format ); return $endpoint_instance; } /** * Register a processor. * * That will be later attached to the endpoint class. * * @param string $processor_class * * @return \Elementor\Data\Base\Processor $processor_instance */ protected function register_processor( $processor_class ) { $processor_instance = new $processor_class( $this ); // TODO: Validate processor instance. $command = $processor_instance->get_command(); if ( ! isset( $this->processors[ $command ] ) ) { $this->processors[ $command ] = []; } $this->processors[ $command ] [] = $processor_instance; return $processor_instance; } /** * Register. * * Endpoints & processors. */ protected function register() { $this->register_internal_endpoints(); $this->register_endpoints(); // Aka hooks. $this->register_processors(); } /** * Retrieves a recursive collection of all endpoint(s), items. * * Get items recursive, will run overall endpoints of the current controller. * For each endpoint it will run `$endpoint->getItems( $request ) // the $request passed in get_items_recursive`. * Will skip $skip_endpoints endpoint(s). * * Example, scenario: * Controller 'test-controller'. * Controller endpoints: 'endpoint1', 'endpoint2'. * Endpoint2 get_items method: `get_items() { return 'test' }`. * Call `Controller.get_items_recursive( ['endpoint1'] )`, result: [ 'endpoint2' => 'test' ]; * * @param array $skip_endpoints * * @return array */ public function get_items_recursive( $skip_endpoints = [] ) { $response = []; foreach ( $this->endpoints as $endpoint ) { // Skip self. if ( in_array( $endpoint, $skip_endpoints, true ) ) { continue; } $response[ $endpoint->get_name() ] = $endpoint->get_items( null ); } return $response; } /** * Get permission callback. * * Default controller permi