oont-contents/plugins/w3-total-cache/Util_AttachToActions.php
2025-02-08 15:10:23 +01:00

264 lines
7.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* File: Util_AttachToActions.php
*
* @package W3TC
*/
namespace W3TC;
/**
* Class Util_AttachToActions
*
* Attaches to wp actions related to content change, which should fire flushes of html content
*/
class Util_AttachToActions {
/**
* Flush actions.
*
* @return void
*/
public static function flush_posts_on_actions() {
static $attached = false;
if ( $attached ) {
return;
}
$attached = true;
$o = new Util_AttachToActions();
// posts.
add_action( 'pre_post_update', array( $o, 'on_pre_post_update' ), 0, 2 );
add_action( 'save_post', array( $o, 'on_post_change' ), 0, 2 );
add_filter( 'pre_trash_post', array( $o, 'on_post_change' ), 0, 2 );
add_action( 'before_delete_post', array( $o, 'on_post_change' ), 0, 2 );
add_action( 'attachment_updated', array( $o, 'on_post_change' ), 0, 2 );
// comments.
add_action( 'comment_post', array( $o, 'on_comment_change' ), 0 );
add_action( 'edit_comment', array( $o, 'on_comment_change' ), 0 );
add_action( 'delete_comment', array( $o, 'on_comment_change' ), 0 );
add_action( 'wp_set_comment_status', array( $o, 'on_comment_status' ), 0, 2 );
add_action( 'trackback_post', array( $o, 'on_comment_change' ), 0 );
add_action( 'pingback_post', array( $o, 'on_comment_change' ), 0 );
/**
* Fires after the theme is switched.
*
* See 'after_switch_theme'.
*
* @since 1.5.0
* @since 4.5.0 Introduced the `$old_theme` parameter.
*
* @see w3tc_flush_posts()
*
* @link https://developer.wordpress.org/reference/hooks/switch_theme/
*
* @param string $new_name Name of the new theme.
* @param WP_Theme $new_theme WP_Theme instance of the new theme.
* @param WP_Theme $old_theme WP_Theme instance of the old theme.
*/
add_action( 'switch_theme', 'w3tc_flush_posts', 0, 0 );
/**
* Fires after a navigation menu has been successfully updated.
*
* @since 3.0.0
*
* @see w3tc_flush_posts()
*
* @link https://developer.wordpress.org/reference/hooks/wp_update_nav_menu/
*
* @param int $menu_id ID of the updated menu.
* @param array $menu_data An array of menu data.
*/
add_action( 'wp_update_nav_menu', 'w3tc_flush_posts', 0, 0 );
/**
* Terms.
*/
/**
* Fires immediately before the given terms are edited (inserted or updated).
*
* @since 2.9.0
* @since 6.1.0 The `$args` parameter was added.
*
* @see w3tc_flush_posts()
*
* @link https://developer.wordpress.org/reference/hooks/edited_terms/
*
* @param int $term_id Term ID.
* @param string $taxonomy Taxonomy slug.
* @param array $args Arguments passed to wp_update_term().
*/
add_action( 'edited_term', 'w3tc_flush_posts', 0, 0 );
/**
* Fires after a term is deleted from the database and the cache is cleaned.
*
* The 'delete_$taxonomy' hook is also available for targeting a specific
* taxonomy.
*
* @since 2.5.0
* @since 4.5.0 Introduced the `$object_ids` argument.
*
* @see w3tc_flush_posts()
*
* @link https://developer.wordpress.org/reference/hooks/delete_term/
*
* @param int $term Term ID.
* @param int $tt_id Term taxonomy ID.
* @param string $taxonomy Taxonomy slug.
* @param WP_Term $deleted_term Copy of the already-deleted term.
* @param array $object_ids List of term object IDs.
*/
add_action( 'delete_term', 'w3tc_flush_posts', 0, 0 );
/**
* Multisite.
*/
if ( Util_Environment::is_wpmu() ) {
/**
* Fires once a site has been deleted from the database.
*
* @since 5.1.0
*
* @see w3tc_flush_posts()
*
* @link https://developer.wordpress.org/reference/hooks/wp_delete_site/
*
* @param WP_Site $old_site Deleted site object.
*/
add_action( 'wp_delete_site', 'w3tc_flush_posts', 0, 0 );
/**
* Fires once a site has been updated in the database.
*
* @since 5.1.0
*
* @link https://developer.wordpress.org/reference/hooks/wp_update_site/
*
* @param WP_Site $new_site New site object.
* @param WP_Site $old_site Old site object.
*/
add_action( 'wp_update_site', array( $o, 'on_update_site' ), 0, 2 );
}
}
/**
* Pre-Post changed action for published post changed to draft which invalidates the published URL.
*
* @link https://developer.wordpress.org/reference/hooks/pre_post_update/
*
* @param integer $post_id Post ID.
* @param array $data Array of unslashed post data.
*
* @return void
*/
public function on_pre_post_update( $post_id, $data = null ) {
if ( is_null( $data ) ) {
$data = get_post( $post_id, ARRAY_A );
}
// if attachment changed - parent post has to be flushed
// since there are usually attachments content like title
// on the page (gallery).
if ( isset( $data['post_type'] ) && 'attachment' === $data['post_type'] ) {
$post_id = $data['post_parent'];
$data = get_post( $post_id, ARRAY_A );
}
if ( ! isset( $data['post_status'] ) || 'draft' !== $data['post_status'] ) {
return;
}
$cacheflush = Dispatcher::component( 'CacheFlush' );
$cacheflush->flush_post( $post_id );
}
/**
* Post changed action
*
* @link https://developer.wordpress.org/reference/hooks/save_post/
* @link https://developer.wordpress.org/reference/hooks/pre_trash_post/
* @link https://developer.wordpress.org/reference/hooks/before_delete_post/
*
* @param int|bool $post_id Post ID or a boolean if running on the "pre_trash_post" hook filter.
* @param WP_Post $post Post.
*
* @return int|bool|null
*/
public function on_post_change( $post_id, $post = null ) {
if ( is_null( $post ) ) {
$post = get_post( $post_id );
}
$config = Dispatcher::config();
$cacheflush = Dispatcher::component( 'CacheFlush' );
// If the post is an attachment, we need to get and flush its parent post.
if ( isset( $post->post_type ) && 'attachment' === $post->post_type &&
Util_Environment::is_flushable_post( get_post( $post->post_parent ), 'posts', $config ) ) {
$cacheflush->flush_post( $post->post_parent );
}
// Check if the original post is flushable.
if ( Util_Environment::is_flushable_post( $post, 'posts', $config ) ) {
$cacheflush->flush_post( $post_id );
}
return $post_id;
}
/**
* Comment change action.
*
* @param integer $comment_id Comment ID.
*/
public function on_comment_change( $comment_id ) {
$post_id = 0;
if ( $comment_id ) {
$comment = get_comment( $comment_id, ARRAY_A );
$post_id = ( ! empty( $comment['comment_post_ID'] ) ? (int) $comment['comment_post_ID'] : 0 );
}
$this->on_post_change( $post_id );
}
/**
* Comment status action fired immediately after transitioning a comments status from one to another
* in the database and removing the comment, but prior to all status transition hooks.
*
* @link https://developer.wordpress.org/reference/functions/wp_set_comment_status/
*
* @param integer $comment_id Comment ID.
* @param string $status Status.
*/
public function on_comment_status( $comment_id, $status ) {
$this->on_comment_change( $comment_id );
}
/**
* Callback: Flush posts after a multisite blog is updated.
*
* @since 2.7.6
*
* @link https://developer.wordpress.org/reference/hooks/wp_update_site/
* @param \WP_Site $new_site New site object.
* @param \WP_Site $old_site Old site object.
*/
public function on_update_site( \WP_Site $new_site, \WP_Site $old_site ) {
if (
$new_site->domain !== $old_site->domain ||
$new_site->path !== $old_site->path ||
$new_site->public !== $old_site->public ||
$new_site->archived !== $old_site->archived ||
$new_site->lang_id !== $old_site->lang_id
) {
w3tc_flush_posts();
}
}
}