<?php add_action( 'rest_api_init', function () { $controller = new WPCF7_REST_Controller; $controller->register_routes(); }, 10, 0 ); class WPCF7_REST_Controller { const route_namespace = 'contact-form-7/v1'; public function register_routes() { register_rest_route( self::route_namespace, '/contact-forms', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_contact_forms' ), 'permission_callback' => function () { if ( current_user_can( 'wpcf7_read_contact_forms' ) ) { return true; } else { return new WP_Error( 'wpcf7_forbidden', __( "You are not allowed to access contact forms.", 'contact-form-7' ), array( 'status' => 403 ) ); } }, ), array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'create_contact_form' ), 'permission_callback' => function () { if ( current_user_can( 'wpcf7_edit_contact_forms' ) ) { return true; } else { return new WP_Error( 'wpcf7_forbidden', __( "You are not allowed to create a contact form.", 'contact-form-7' ), array( 'status' => 403 ) ); } }, ), ) ); register_rest_route( self::route_namespace, '/contact-forms/(?P<id>\d+)', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_contact_form' ), 'permission_callback' => function ( WP_REST_Request $request ) { $id = (int) $request->get_param( 'id' ); if ( current_user_can( 'wpcf7_edit_contact_form', $id ) ) { return true; } else { return new WP_Error( 'wpcf7_forbidden', __( "You are not allowed to access the requested contact form.", 'contact-form-7' ), array( 'status' => 403 ) ); } }, ), array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array( $this, 'update_contact_form' ), 'permission_callback' => function ( WP_REST_Request $request ) { $id = (int) $request->get_param( 'id' ); if ( current_user_can( 'wpcf7_edit_contact_form', $id ) ) { return true; } else { return new WP_Error( 'wpcf7_forbidden', __( "You are not allowed to access the requested contact form.", 'contact-form-7' ), array( 'status' => 403 ) ); } }, ), array( 'methods' => WP_REST_Server::DELETABLE, 'callback' => array( $this, 'delete_contact_form' ), 'permission_callback' => function ( WP_REST_Request $request ) { $id = (int) $request->get_param( 'id' ); if ( current_user_can( 'wpcf7_delete_contact_form', $id ) ) { return true; } else { return new WP_Error( 'wpcf7_forbidden', __( "You are not allowed to access the requested contact form.", 'contact-form-7' ), array( 'status' => 403 ) ); } }, ), ) ); register_rest_route( self::route_namespace, '/contact-forms/(?P<id>\d+)/feedback', array( array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'create_feedback' ), 'permission_callback' => '__return_true', ), ) ); register_rest_route( self::route_namespace, '/contact-forms/(?P<id>\d+)/refill', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_refill' ), 'permission_callback' => '__return_true', ), ) ); } public function get_contact_forms( WP_REST_Request $request ) { $args = array(); $per_page = $request->get_param( 'per_page' ); if ( null !== $per_page ) { $args['posts_per_page'] = (int) $per_page; } $offset = $request->get_param( 'offset' ); if ( null !== $offset ) { $args['offset'] = (int) $offset; } $order = $request->get_param( 'order' ); if ( null !== $order ) { $args['order'] = (string) $order; } $orderby = $request->get_param( 'orderby' ); if ( null !== $orderby ) { $args['orderby'] = (string) $orderby; } $search = $request->get_param( 'search' ); if ( null !== $search ) { $args['s'] = (string) $search; } $items = WPCF7_ContactForm::find( $args ); $response = array(); foreach ( $items as $item ) { $response[] = array( 'id' => $item->id(), 'slug' => $item->name(), 'title' => $item->title(), 'locale' => $item->locale(), ); } return rest_ensure_response( $response ); } public function create_contact_form( WP_REST_Request $request ) { $id = (int) $request->get_param( 'id' ); if ( $id ) { return new WP_Error( 'wpcf7_post_exists', __( "Cannot create existing contact form.", 'contact-form-7' ), array( 'status' => 400 ) ); } $args = $request->get_params(); $args['id'] = -1; // Create $context = $request->get_param( 'context' ); $item = wpcf7_save_contact_form( $args, $context ); if ( ! $item ) { return new WP_Error( 'wpcf7_cannot_save', __( "There was an error saving the contact form.", 'contact-form-7' ), array( 'status' => 500 ) ); } $response = array( 'id' => $item->id(), 'slug' => $item->name(), 'title' => $item->title(), 'locale' => $item->locale(), 'properties' => $this->get_properties( $item ), 'config_errors' => array(), ); if ( wpcf7_validate_configuration() ) { $config_validator = new WPCF7_ConfigValidator( $item ); $config_validator->validate(); $response['config_errors'] = $config_validator->collect_error_messages(); if ( 'save' == $context ) { $config_validator->save(); } } return rest_ensure_response( $response ); } public function get_contact_form( WP_REST_Request $request ) { $id = (int) $request->get_param( 'id' ); $item = wpcf7_contact_form( $id ); if ( ! $item ) { return new WP_Error( 'wpcf7_not_found', __( "The requested contact form was not found.", 'contact-form-7' ), array( 'status' => 404 ) ); } $response = array( 'id' => $item->id(), 'slug' => $item->name(), 'title' => $item->title(), 'locale' => $item->locale(), 'properties' => $this->get_properties( $item ), ); return rest_ensure_response( $response ); } public function update_contact_form( WP_REST_Request $request ) { $id = (int) $request->get_param( 'id' ); $item = wpcf7_contact_form( $id ); if ( ! $item ) { return new WP_Error( 'wpcf7_not_found', __( "The requested contact form was not found.", 'contact-form-7' ), array( 'status' => 404 ) ); } $args = $request->get_params(); $context = $request->get_param( 'context' ); $item = wpcf7_save_contact_form( $args, $context ); if ( ! $item ) { return new WP_Error( 'wpcf7_cannot_save', __( "There was an error saving the contact form.", 'contact-form-7' ), array( 'status' => 500 ) ); } $response = array( 'id' => $item->id(), 'slug' => $item->name(), 'title' => $item->title(), 'locale' => $item->locale(), 'properties' => $this->get_properties( $item ), 'config_errors' => array(), ); if ( wpcf7_validate_configuration() ) { $config_validator = new WPCF7_ConfigValidator( $item ); $config_validator->validate(); $response['config_errors'] = $config_validator->collect_error_messages(); if ( 'save' == $context ) { $config_validator->save(); } } return rest_ensure_response( $response ); } public function delete_contact_form( WP_REST_Request $request ) { $id = (int) $request->get_param( 'id' ); $item = wpcf7_contact_form( $id ); if ( ! $item ) { return new WP_Error( 'wpcf7_not_found', __( "The requested contact form was not found.", 'contact-form-7' ), array( 'status' => 404 ) ); } $result = $item->delete(); if ( ! $result ) { return new WP_Error( 'wpcf7_cannot_delete', __( "There was an error deleting the contact form.", 'contact-form-7' ), array( 'status' => 500 ) ); } $response = array( 'deleted' => true ); return rest_ensure_response( $response ); } public function create_feedback( WP_REST_Request $request ) { $url_params = $request->get_url_params(); $item = null; if ( ! empty( $url_params['id'] ) ) { $item = wpcf7_contact_form( $url_params['id'] ); } if ( ! $item ) { return new WP_Error( 'wpcf7_not_found', __( "The requested contact form was not found.", 'contact-form-7' ), array( 'status' => 404 ) ); } $unit_tag = wpcf7_sanitize_unit_tag( $request->get_param( '_wpcf7_unit_tag' ) ); $result = $item->submit(); $response = array_merge( $result, array( 'into' => sprintf( '#%s', $unit_tag ), 'invalid_fields' => array(), ) ); if ( ! empty( $result['invalid_fields'] ) ) { $invalid_fields = array(); foreach ( (array) $result['invalid_fields'] as $name => $field ) { $name = sanitize_html_class( $name ); $invalid_fields[] = array( 'into' => sprintf( 'span.wpcf7-form-control-wrap.%s', $name ), 'message' => $field['reason'], 'idref' => $field['idref'], 'error_id' => sprintf( '%1$s-ve-%2$s', $unit_tag, $name ), ); } $response['invalid_fields'] = $invalid_fields; } $response = wpcf7_apply_filters_deprecated( 'wpcf7_ajax_json_echo', array( $response, $result ), '5.2', 'wpcf7_feedback_response' ); $response = apply_filters( 'wpcf7_feedback_response', $response, $result ); return rest_ensure_response( $response ); } public function get_refill( WP_REST_Request $request ) { $id = (int) $request->get_param( 'id' ); $item = wpcf7_contact_form( $id ); if ( ! $item ) { return new WP_Error( 'wpcf7_not_found', __( "The requested contact form was not found.", 'contact-form-7' ), array( 'status' => 404 ) ); } $response = wpcf7_apply_filters_deprecated( 'wpcf7_ajax_onload', array( array() ), '5.2', 'wpcf7_refill_response' ); $response = apply_filters( 'wpcf7_refill_response', array() ); return rest_ensure_response( $response ); } private function get_properties( WPCF7_ContactForm $contact_form ) { $properties = $contact_form->get_properties(); $properties['form'] = array( 'content' => (string) $properties['form'], 'fields' => array_map( function ( WPCF7_FormTag $form_tag ) { return array( 'type' => $form_tag->type, 'basetype' => $form_tag->basetype, 'name' => $form_tag->name, 'options' => $form_tag->options, 'raw_values' => $form_tag->raw_values, 'labels' => $form_tag->labels, 'values' => $form_tag->values, 'pipes' => $form_tag->pipes instanceof WPCF7_Pipes ? $form_tag->pipes->to_array() : $form_tag->pipes, 'content' => $form_tag->content, ); }, $contact_form->scan_form_tags() ), ); $properties['additional_settings'] = array( 'content' => (string) $properties['additional_settings'], 'settings' => array_filter( array_map( function ( $setting ) { $pattern = '/^([a-zA-Z0-9_]+)[\t ]*:(.*)$/'; if ( preg_match( $pattern, $setting, $matches ) ) { $name = trim( $matches[1] ); $value = trim( $matches[2] ); if ( in_array( $value, array( 'on', 'true' ), true ) ) { $value = true; } elseif ( in_array( $value, array( 'off', 'false' ), true ) ) { $value = false; } return array( $name, $value ); } return false; }, explode( "\n", $properties['additional_settings'] ) ) ), ); return $properties; } private function get_argument_schema() { return array( 'id' => array( 'description' => __( "Unique identifier for the contact form.", 'contact-form-7' ), 'type' => 'integer', 'required' => true, ), ); } }