<?php /** * REST controller for miscellaneous endpoints. * * @package Kliken Marketing for Google */ namespace Kliken\WcPlugin; defined( 'ABSPATH' ) || exit; /** * REST API Misc controller class. * * @extends WC_REST_CRUD_Controller */ class REST_Misc_Controller extends \WC_REST_CRUD_Controller { /** * Endpoint namespace. * * @var string */ protected $namespace = 'wc-kliken/v1'; /** * Register the routes we need. */ public function register_routes() { register_rest_route( $this->namespace, '/google-token', [ [ 'methods' => \WP_REST_Server::CREATABLE, 'callback' => [ $this, 'save_google_token' ], 'permission_callback' => function () { return current_user_can( 'manage_options' ); }, ], ] ); register_rest_route( $this->namespace, '/facebook-token', [ [ 'methods' => \WP_REST_Server::CREATABLE, 'callback' => [ $this, 'save_facebook_token' ], 'permission_callback' => function () { return current_user_can( 'manage_options' ); }, ], ] ); register_rest_route( $this->namespace, '/shipping/wc-services', [ [ 'methods' => \WP_REST_Server::READABLE, 'callback' => [ $this, 'get_wc_services_shipping_methods' ], 'permission_callback' => [ $this, 'get_shipping_methods_permissions_check' ], ], ] ); } /** * Save Facebook Verification Token to database so we can later on display it as a header's meta. * * @param \WP_REST_Request $request Full details about the request. * @return \WP_Error|\WP_REST_Response */ public function save_facebook_token( $request ) { // If we know more about Facebook's token specifications, we can have more strict rules // For now, just sanitize the token as a text string (no tags, no simple injections). $token = sanitize_text_field( $request->get_param( 'token' ) ); if ( ! $token ) { return new \WP_Error( 'rest_bad_request', __( 'Invalid Data.', 'kliken-marketing-for-google' ), [ 'status' => 400 ] ); } $saved_settings = Helper::get_plugin_options(); $saved_settings['facebook_token'] = $token; // Save the token to database. update_option( Helper::get_option_key(), $saved_settings ); // But WP_REST_Response is only available since 4.4? return new \WP_REST_Response( null, 201 ); } /** * Save Google Verification Token to database so we can later on display it as a header's meta. * * @param \WP_REST_Request $request Full details about the request. * @return \WP_Error|\WP_REST_Response */ public function save_google_token( $request ) { // If we know more about Google's token specifications, we can have more strict rules // For now, just sanitize the token as a text string (no tags, no simple injections). $token = sanitize_text_field( $request->get_param( 'token' ) ); if ( ! $token ) { return new \WP_Error( 'rest_bad_request', __( 'Invalid Data.', 'kliken-marketing-for-google' ), [ 'status' => 400 ] ); } $saved_settings = Helper::get_plugin_options(); $saved_settings['google_token'] = $token; // Save the token to database. update_option( Helper::get_option_key(), $saved_settings ); // But WP_REST_Response is only available since 4.4? return new \WP_REST_Response( null, 201 ); } /** * Get shipping services associated with a WooCommerce Services Carrier shipping method. * Because for some reason, WooCommerce does not return that with their API endpoints. * * @param \WP_REST_Request $request Full details about the request. * @return \WP_Error|\WP_REST_Response */ public function get_wc_services_shipping_methods( $request ) { $id = (int) $request['id']; $carrier_name = $request['carrier']; // Get the option from database. $data = get_option( "woocommerce_wc_services_{$carrier_name}_{$id}_form_settings" ); if ( ! $data || empty( $data ) || empty( $data->services ) ) { return new \WP_Error( 'no_wc_services', __( 'Invalid Data.', 'kliken-marketing-for-google' ), [ 'status' => 404 ] ); } $carrier_services = []; foreach ( $data->services as $key => $service ) { if ( true !== $service['enabled'] ) { continue; } array_push( $carrier_services, [ 'service_name' => $service['id'], 'adjustment' => $service['adjustment'], 'adjustment_type' => $service['adjustment_type'], ] ); } $response = rest_ensure_response( [ 'carrier_name' => $data->title, 'carrier_services' => $carrier_services, ] ); return $response; } /** * Check whether a given request has permission to view shipping methods. * * @param \WP_REST_Request $request Full details about the request. * @return \WP_Error|boolean */ public function get_shipping_methods_permissions_check( $request ) { if ( ! wc_rest_check_manager_permissions( 'shipping_methods', 'read' ) ) { return new \WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'kliken-marketing-for-google' ), [ 'status' => rest_authorization_required_code() ] ); } return true; } }