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: 2
Forks: 2
Open Issues: 1
Type:wordpress-plugin
Requires
- php: >=7.0.4
- composer/installers: ~1.0
- thefrosty/wp-utilities: ^1.2.2
Requires (Dev)
- phpunit/phpunit: 6.*
- squizlabs/php_codesniffer: ^3.2
README
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 );