<?php if ( ! defined( 'ABSPATH' ) ) { exit; } if ( class_exists( 'WC_REST_Connect_Base_Controller' ) ) { return; } abstract class WC_REST_Connect_Base_Controller extends WP_REST_Controller { /** * Endpoint namespace. * * @var string */ protected $namespace = 'wc/v1'; /** * @var WC_Connect_API_Client */ protected $api_client; /** * @var WC_Connect_Service_Settings_Store */ protected $settings_store; /** * @var WC_Connect_Logger */ protected $logger; public function __construct( WC_Connect_API_Client $api_client, WC_Connect_Service_Settings_Store $settings_store, WC_Connect_Logger $logger ) { $this->api_client = $api_client; $this->settings_store = $settings_store; $this->logger = $logger; } public function register_routes() { if ( method_exists( $this, 'get' ) ) { register_rest_route( $this->namespace, '/' . $this->rest_base, array( array( 'methods' => 'GET', 'callback' => array( $this, 'get_internal' ), 'permission_callback' => array( $this, 'check_permission' ), ), ) ); } if ( method_exists( $this, 'post' ) ) { register_rest_route( $this->namespace, '/' . $this->rest_base, array( array( 'methods' => 'POST', 'callback' => array( $this, 'post_internal' ), 'permission_callback' => array( $this, 'check_permission' ), ), ) ); } if ( method_exists( $this, 'put' ) ) { register_rest_route( $this->namespace, '/' . $this->rest_base, array( array( 'methods' => 'PUT', 'callback' => array( $this, 'put_internal' ), 'permission_callback' => array( $this, 'check_permission' ), ), ) ); } if ( method_exists( $this, 'delete' ) ) { register_rest_route( $this->namespace, '/' . $this->rest_base, array( array( 'methods' => 'DELETE', 'callback' => array( $this, 'delete_internal' ), 'permission_callback' => array( $this, 'check_permission' ), ), ) ); } } /** * Consolidate cache prevention mechanisms. */ public function prevent_route_caching() { if ( ! defined( 'DONOTCACHEPAGE' ) ) { define( 'DONOTCACHEPAGE', true ); // Play nice with WP-Super-Cache } // Prevent our REST API endpoint responses from being added to browser cache add_filter( 'rest_post_dispatch', array( $this, 'send_nocache_header' ), PHP_INT_MAX, 2 ); } /** * Send a no-cache header for WCS REST API responses. Prompted by cache issues * on the Pantheon hosting platform. * * See: https://pantheon.io/docs/cache-control/ * * @param WP_REST_Response $response * @param WP_REST_Server $server * * @return WP_REST_Response passthrough $response parameter */ public function send_nocache_header( $response, $server ) { $server->send_header( 'Cache-Control', 'no-cache, must-revalidate, max-age=0' ); return $response; } public function get_internal( $request ) { $this->prevent_route_caching(); return $this->get( $request ); } public function post_internal( $request ) { $this->prevent_route_caching(); return $this->post( $request ); } public function put_internal( $request ) { $this->prevent_route_caching(); return $this->put( $request ); } public function delete_internal( $request ) { $this->prevent_route_caching(); return $this->delete( $request ); } /** * Validate the requester's permissions */ public function check_permission( $request ) { return WC_Connect_Functions::user_can_manage_labels(); } }