dwnload/wp-rest-api-object-cache

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

Installs: 719

Dependents: 0

Suggesters: 0

Security: 0

Stars: 23

Watchers: 3

Forks: 2

Open Issues: 1

Type:wordpress-plugin

1.4.0 2019-04-17 22:49 UTC

This package is auto-updated.

Last update: 2024-11-18 11:29:13 UTC


README

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

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

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 );