From c85c17d4c20d1075df2f1d715f6f3f5f08ab5ca7 Mon Sep 17 00:00:00 2001 From: Erick Hitter <ehitter@gmail.com> Date: Fri, 28 Feb 2014 01:06:01 -0800 Subject: [PATCH] Support cache clearing from post list tables. Fixes #5. --- redis-page-cache/redis-page-cache.php | 71 ++++++++++++++++++++------- 1 file changed, 54 insertions(+), 17 deletions(-) diff --git a/redis-page-cache/redis-page-cache.php b/redis-page-cache/redis-page-cache.php index fd22a02..213117a 100644 --- a/redis-page-cache/redis-page-cache.php +++ b/redis-page-cache/redis-page-cache.php @@ -64,6 +64,8 @@ class Redis_Page_Cache { // Manual invalidations add_action( 'admin_bar_menu', array( $this, 'admin_bar_menu' ), 999 ); + add_action( 'post_row_actions', array( $this, 'quick_edit' ), 999, 2 ); + add_action( 'page_row_actions', array( $this, 'quick_edit' ), 999, 2 ); add_action( 'wp_ajax_redis_page_cache_purge', array( $this, 'ajax_purge' ) ); } @@ -142,8 +144,8 @@ class Redis_Page_Cache { * @return null */ public function register_options() { - register_setting( $this->ns, 'redis-page-cache-seconds', 'absint' ); - register_setting( $this->ns, 'redis-page-cache-unlimited', 'absint' ); + register_setting( $this->ns, $this->ns . '-seconds', 'absint' ); + register_setting( $this->ns, $this->ns . '-unlimited', 'absint' ); } /** @@ -181,7 +183,7 @@ class Redis_Page_Cache { <tr> <th scope="row"><label for="duration-seconds"><?php _e( 'Duration of Caching in Seconds:', 'redis-page-cache' ); ?></label></td> <td> - <input type="text" name="redis-page-cache-seconds" id="duration-seconds" size="15" value="<?php echo (int) get_option( 'redis-page-cache-seconds', 43200 ); ?>" /> + <input type="text" name="<?php echo esc_attr( $this->ns ); ?>-seconds" id="duration-seconds" size="15" value="<?php echo (int) get_option( $this->ns . '-seconds', 43200 ); ?>" /> <p class="description"><?php _e( 'How many seconds would you like to cache individual pages? <strong>Recommended 12 hours or 43200 seconds</strong>.', 'redis-page-cache' ); ?></p> </td> @@ -189,7 +191,7 @@ class Redis_Page_Cache { <tr> <th scope="row"><label for="unlimited-cache"><?php _e( 'Cache Without Expiration?', 'redis-page-cache' ); ?></label></th> <td> - <input type="checkbox" name="redis-page-cache-unlimited" id="unlimited-cache" value="1" <?php checked( true, (bool) get_option( 'redis-page-cache-unlimited', false ) ); ?>/> + <input type="checkbox" name="<?php echo esc_attr( $this->ns ); ?>-unlimited" id="unlimited-cache" value="1" <?php checked( true, (bool) get_option( $this->ns . '-unlimited', false ) ); ?>/> <p class="description"><?php _e( 'If this option is set, the cache never expire. This option overides the setting <em>Duration of Caching in Seconds</em>.', 'redis-page-cache' ); ?></p> </td> @@ -219,8 +221,9 @@ class Redis_Page_Cache { } /** - * Add a purge option to the admin bar for those with proper capabilities + * Add a single-page purge option to the admin bar for those with proper capabilities * + * @action admin_bar_menu * @return null */ public function admin_bar_menu() { @@ -237,30 +240,64 @@ class Redis_Page_Cache { } // What are we trying to clear? - $page_url = set_url_scheme( esc_url( $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ) ); - - $flush_url = add_query_arg( array( - 'action' => 'redis_page_cache_purge', - 'nonce' => wp_create_nonce( $page_url ), - 'url' => urlencode( $page_url ), - ), admin_url( 'admin-ajax.php' ) ); + $url = set_url_scheme( esc_url( $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ) ); $wp_admin_bar->add_menu( array( - 'id' => 'redis-page-cache', + 'id' => $this->ns, 'parent' => false, 'title' => __( 'Clear Page Cache', 'redis-page-cache' ), - 'href' => $flush_url, + 'href' => $this->get_ajax_purge_url( $url ), ) ); } + /** + * Add a purge link to the Quick Edit actions in post tables + * + * @param array $actions + * @param object $post + * @action post_row_actions + * @action page_row_actions + * @return array + */ + public function quick_edit( $actions, $post ) { + $actions[ $this->ns ] = '<a href="' . esc_url( $this->get_ajax_purge_url( get_permalink( $post->ID ) ) ) . '">' . __( 'Clear cache', 'redis-page-cache' ) . '</a>'; + + return $actions; + } + + /** + * Build URL for Ajax purge requests + * + * @param string $url + * @return string + */ + private function get_ajax_purge_url( $url ) { + $url = remove_query_arg( $this->ns . '-purge', $url ); + + $url = add_query_arg( array( + 'action' => 'redis_page_cache_purge', + 'nonce' => wp_create_nonce( $url ), + 'url' => urlencode( $url ), + ), admin_url( 'admin-ajax.php' ) ); + + return $url; + } + /** * Purge a page from cache via an Ajax request * + * @action wp_ajax_redis_page_cache_purge * @return null */ public function ajax_purge() { - $url = esc_url_raw( urldecode( $_GET['url'] ) ); - $redirect = add_query_arg( 'redis-page-cache-purge', 'failed', $url ); + $url = esc_url_raw( urldecode( $_GET['url'] ) ); + + if ( isset( $_SERVER['HTTP_REFERER'] ) ) { + $redirect = $_SERVER['HTTP_REFERER']; + } else { + $redirect = $url; + } + $redirect = add_query_arg( $this->ns . '-purge', 'failed', $redirect ); // Check nonce and referrer if ( ! check_ajax_referer( $url, 'nonce', false ) ) { @@ -275,7 +312,7 @@ class Redis_Page_Cache { // Checks passed, so we purge and redirect with success noted in the query string $this->purge( $url ); - $redirect = add_query_arg( 'redis-page-cache-purge', 'success', $redirect ); + $redirect = add_query_arg( $this->ns . '-purge', 'success', $redirect ); wp_safe_redirect( $redirect, 302 ); } } -- GitLab