Skip to content

Enable object caching for WordPress' REST API. Aids in increased response times of your applications endpoints.

License

Notifications You must be signed in to change notification settings

dwnload/wp-rest-api-object-cache

Repository files navigation

WordPress REST API Object Cache

PHP from Packagist Latest Stable Version Total Downloads License Build Status

Enable object caching for WordPress' REST API. Aids in increased response times of your applications endpoints.

Package Installation (via Composer)

To install this package, edit your composer.json file:

{
    "require": {
        "dwnload/wp-rest-api-object-cache": "^1.3.0"
    }
}

Now run:

$ composer install dwnload/wp-rest-api-object-cache


Actions

Action Argument(s)
Dwnload\WpRestApi\RestApi\RestDispatch::ACTION_CACHE_SKIPPED mixed $result
WP_REST_Server $server
WP_REST_Request $request
Dwnload\WpRestApi\WpAdmin\Admin::ACTION_REQUEST_FLUSH_CACHE string $message
string $type
WP_User $user

How to use actions

use Dwnload\WpRestApi\RestApi\RestDispatch;
add_action( RestDispatch::ACTION_CACHE_SKIPPED, function( $result, \WP_REST_Server $server, \WP_REST_Request $request ) {
	// Do something here, like create a log entry using Wonolog.
}, 10, 3 );
use Dwnload\WpRestApi\WpAdmin\Admin;
add_action( Admin::ACTION_REQUEST_FLUSH_CACHE, function( $message, $type, WP_User $user ) {
	// Do something here, like create a log entry using Wonolog.
}, 10, 3 );

Filters

Filter Argument(s)
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_CACHE_HEADERS array $headers
string $request_uri
WP_REST_Server $server
WP_REST_Request $request
WP_REST_Response $response (rest_pre_dispatch only)
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_CACHE_SKIP boolean $skip ( default: WP_DEBUG )
string $request_uri
WP_REST_Server $server
WP_REST_Request $request
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_API_KEY string $request_uri
WP_REST_Server $server
WP_REST_Request $request
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_API_GROUP string $cache_group
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_CACHE_EXPIRE int $expires
Dwnload\WpRestApi\WpAdmin\Admin::FILTER_CACHE_UPDATE_OPTIONS array $options
Dwnload\WpRestApi\WpAdmin\Admin::FILTER_CACHE_OPTIONS array $options
Dwnload\WpRestApi\WpAdmin\Admin::FILTER_SHOW_ADMIN boolean $show
Dwnload\WpRestApi\WpAdmin\Admin::FILTER_SHOW_ADMIN_MENU boolean $show
Dwnload\WpRestApi\WpAdmin\Admin::FILTER_SHOW_ADMIN_BAR_MENU boolean $show
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_ALLOWED_CACHE_STATUS array $status HTTP Header statuses (defaults to array( 200 )
Dwnload\WpRestApi\RestApi\RestDispatch::FILTER_CACHE_VALIDATE_AUTH boolean $authenticated
WP_REST_Request $request

How to use filters

Sending headers.

use Dwnload\WpRestApi\RestApi\RestDispatch;
add_filter( RestDispatch::FILTER_CACHE_HEADERS, function( array $headers ) : array {
	$headers['Cache-Control'] = 'public, max-age=3600';
	
	return $headers;
} );

Changing the cache expire time.

use Dwnload\WpRestApi\RestApi\RestDispatch;
add_filter( RestDispatch::FILTER_CACHE_EXPIRE, function() : int {
	// https://codex.wordpress.org/Transients_API#Using_Time_Constants
	return ( HOUR_IN_SECONDS * 5 );
} );
use Dwnload\WpRestApi\WpAdmin\Admin;
add_filter( Admin::FILTER_CACHE_OPTIONS, function( array $options ) : array {
	if ( ! isset( $options['timeout'] ) ) {
		$options['timeout'] = array();
	}

	// https://codex.wordpress.org/Transients_API#Using_Time_Constants
	$options['timeout']['length'] = 15;
	$options['timeout']['period'] = DAY_IN_SECONDS;
	
	return $options;
} );

Validating user auth when ?context=edit

use Dwnload\WpRestApi\RestApi\RestDispatch;
add_filter( RestDispatch::FILTER_CACHE_VALIDATE_AUTH, function( bool $auth, WP_REST_Request $request ) : bool {
	// If you are running the Basic Auth plugin.
	if ( $GLOBALS['wp_json_basic_auth_error'] === true ) {
        $authorized = true;
    }
    // Otherwise, maybe do some additional logic on the request for current user...

    return $authorized;
}, 10, 2 );

Skipping cache

use Dwnload\WpRestApi\RestApi\RestDispatch;
add_filter( RestDispatch::FILTER_CACHE_SKIP, function( bool $skip, string $request_uri ) : bool {
	if ( ! $skip && stripos( 'wp-json/dwnload/v2', $request_uri ) !== false ) {
		return true;
	}

	return $skip;
}, 10, 2 );

Deleting cache

Soft delete: Append RestDispatch::QUERY_CACHE_DELETE to your query param: add_query_arg( [ RestDispatch::QUERY_CACHE_DELETE, '1' ], '<url>' ).
soft delete will delete the cache after the current request completes (on WordPress shutdown).

Hard delete: Append RestDispatch::QUERY_CACHE_DELETE && RestDispatch::QUERY_CACHE_FORCE_DELETE to your query param: add_query_arg( [ RestDispatch::QUERY_CACHE_DELETE, '1', RestDispatch::QUERY_CACHE_FORCE_DELETE, '1' ], '<url>' ).
hard delete will delete the cache before the request, forcing it to repopulate.

empty ALL cache on post-save this is not ideal

You can use the WordPress filter save_post if you would like to empty ALL cache on post save.

use Dwnload\WpRestApi\RestApi\RestDispatch;
add_action( 'save_post', function( $post_id ) {
  if ( class_exists( RestDispatch::class ) ) {
    call_user_func( [ ( WpRestApiCache::getRestDispatch(), 'wpCacheFlush' ] );
  }
} );

Maybe better to use transition_post_status

add_action( 'transition_post_status', function(  string $new_status, string $old_status, \WP_Post $post ) {
  if ( 'publish' === $new_status || 'publish' === $old_status ) {
    \wp_cache_flush();
  }
}, 99, 3 );