\d+)', array( 'args' => $this->id_arg(), 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'submit' ), // Public by design: anyone may submit a published form. Abuse is // handled by SpamGuard (honeypot, signed token, rate limit). 'permission_callback' => '__return_true', ) ); register_rest_route( self::NS, '/track/(?P\d+)', array( 'args' => array_merge( $this->id_arg(), array( 'event' => array( 'type' => 'string', 'enum' => array( 'view', 'start' ), 'required' => true, ), ) ), 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'track' ), 'permission_callback' => '__return_true', ) ); } /** * POST /submit/{id}. * * @param WP_REST_Request $request Request. * @return \WP_REST_Response */ public function submit( WP_REST_Request $request ) { $params = $request->get_json_params(); if ( ! is_array( $params ) ) { $params = $request->get_body_params(); } $input = array( 'fields' => isset( $params['fields'] ) && is_array( $params['fields'] ) ? Handler::clean( $params['fields'] ) : array(), 'pf_token' => isset( $params['pf_token'] ) && is_string( $params['pf_token'] ) ? $params['pf_token'] : '', SpamGuard::HONEYPOT => isset( $params[ SpamGuard::HONEYPOT ] ) && is_string( $params[ SpamGuard::HONEYPOT ] ) ? $params[ SpamGuard::HONEYPOT ] : '', 'page_url' => isset( $params['page_url'] ) && is_string( $params['page_url'] ) ? $params['page_url'] : '', 'meta' => isset( $params['meta'] ) && is_array( $params['meta'] ) ? Handler::clean( $params['meta'] ) : array(), ); $result = Handler::process( (int) $request['id'], $input ); $status = $result['status']; unset( $result['status'] ); $response = rest_ensure_response( $result ); $response->set_status( $status ); return $response; } /** * POST /track/{id}. Counts a view or a first interaction. * * @param WP_REST_Request $request Request. * @return \WP_REST_Response */ public function track( WP_REST_Request $request ) { $form = FormRepository::find( (int) $request['id'] ); if ( $form && 'published' === $form['status'] ) { Stats::bump( $form['id'], 'view' === $request['event'] ? 'views' : 'starts' ); } return rest_ensure_response( array( 'ok' => true ) ); } }