File "purge.php"

Full path: /home/kosmetik/public_html/wp-content/plugins/wp-rocket/inc/common/purge.php
File size: 13.36 B
MIME-type: text/x-php
Charset: utf-8

Download   Open   Edit   Advanced Editor   Back

<?php

defined('ABSPATH') || exit;
add_action('switch_theme', 'rocket_clean_domain');
add_action('wp_update_nav_menu', 'rocket_clean_domain');
add_action('update_option_sidebars_widgets', 'rocket_clean_domain');
add_action('update_option_category_base', 'rocket_clean_domain');
add_action('update_option_tag_base', 'rocket_clean_domain');
add_action('permalink_structure_changed', 'rocket_clean_domain');
add_action('add_link', 'rocket_clean_domain');
add_action('edit_link', 'rocket_clean_domain');
add_action('delete_link', 'rocket_clean_domain');
add_action('customize_save', 'rocket_clean_domain');
add_action('update_option_theme_mods_' . get_option('stylesheet'), 'rocket_clean_domain');
function rocket_widget_update_callback($instance)
{
    rocket_clean_domain();
    return $instance;
}
add_filter('widget_update_callback', 'rocket_widget_update_callback');
function rocket_get_purge_urls($post_id, $post)
{
    $purge_urls = [];
    $permalink_structure = get_rocket_sample_permalink($post_id);
    $permalink = str_replace(['%postname%', '%pagename%'], $permalink_structure[1], $permalink_structure[0]);
    if (rocket_extract_url_component($permalink, PHP_URL_PATH) !== '/') {
        $purge_urls[] = $permalink;
    }
    if ('post' === $post->post_type && (int) get_option('page_for_posts') > 0) {
        $purge_urls[] = get_permalink(get_option('page_for_posts'));
    }
    $post_type = $post->post_type;
    if ('post' !== $post_type) {
        $post_type_archive = get_post_type_archive_link($post_type);
        if ($post_type_archive) {
            $filename = 'index';
            if (is_ssl()) {
                $filename .= '-https';
            }
            $post_type_archive = trailingslashit($post_type_archive);
            $purge_urls[] = $post_type_archive . $filename . '.html';
            $purge_urls[] = $post_type_archive . $filename . '.html_gzip';
            $purge_urls[] = $post_type_archive . $filename . $GLOBALS['wp_rewrite']->pagination_base;
        }
    }
    $next_post = get_adjacent_post(false, '', false);
    if ($next_post) {
        $purge_urls[] = get_permalink($next_post);
    }
    $next_in_same_cat_post = get_adjacent_post(true, '', false);
    if ($next_in_same_cat_post && $next_in_same_cat_post !== $next_post) {
        $purge_urls[] = get_permalink($next_in_same_cat_post);
    }
    $previous_post = get_adjacent_post(false, '', true);
    if ($previous_post) {
        $purge_urls[] = get_permalink($previous_post);
    }
    $previous_in_same_cat_post = get_adjacent_post(true, '', true);
    if ($previous_in_same_cat_post && $previous_in_same_cat_post !== $previous_post) {
        $purge_urls[] = get_permalink($previous_in_same_cat_post);
    }
    $cache_purge_pages = get_rocket_option('cache_purge_pages');
    if ($cache_purge_pages) {
        global $blog_id;
        $home_url = get_option('home');
        if (!empty($blog_id) && is_multisite()) {
            switch_to_blog($blog_id);
            $home_url = get_option('home');
            restore_current_blog();
        }
        $home_parts = get_rocket_parse_url($home_url);
        $home_url = "{$home_parts['scheme']}://{$home_parts['host']}";
        $cache_path = rocket_get_constant('WP_ROCKET_CACHE_PATH') . $home_parts['host'];
        foreach ($cache_purge_pages as $page) {
            if (strstr($page, '*')) {
                $matches_files = _rocket_get_recursive_dir_files_by_regex('#' . $page . '#i');
                foreach ($matches_files as $file) {
                    $purge_urls[] = str_replace($cache_path, untrailingslashit($home_url), $file->getPath());
                }
                continue;
            }
            $purge_urls[] = trailingslashit($home_url) . $page;
        }
    }
    $purge_urls[] = get_author_posts_url($post->post_author);
    $parents = get_post_ancestors($post_id);
    if ((bool) $parents) {
        foreach ($parents as $parent_id) {
            $purge_urls[] = get_permalink($parent_id);
        }
    }
    $purge_urls = array_filter($purge_urls, 'is_string');
    return array_flip(array_flip($purge_urls));
}
function rocket_clean_post($post_id, $post = null)
{
    static $done = array();
    if (isset($done[$post_id])) {
        return false;
    }
    $done[$post_id] = 1;
    if (defined('DOING_AUTOSAVE')) {
        return false;
    }
    $purge_urls = [];
    if (is_null($post)) {
        $post = get_post($post_id);
    }
    if (!is_object($post)) {
        return false;
    }
    if ('auto-draft' === $post->post_status || 'draft' === $post->post_status || empty($post->post_type) || 'nav_menu_item' === $post->post_type || 'attachment' === $post->post_type) {
        return false;
    }
    $post_type = get_post_type_object($post->post_type);
    if (!is_object($post_type) || true !== $post_type->public) {
        return false;
    }
    $i18n_plugin = rocket_has_i18n();
    $lang = false;
    if ('wpml' === $i18n_plugin && !rocket_is_plugin_active('woocommerce-multilingual/wpml-woocommerce.php')) {
        $lang = $GLOBALS['sitepress']->get_language_for_element($post_id, 'post_' . get_post_type($post_id));
    } elseif ('polylang' === $i18n_plugin && function_exists('pll_get_post_language')) {
        $lang = pll_get_post_language($post_id);
    }
    $purge_urls = rocket_get_purge_urls($post_id, $post);
    do_action('before_rocket_clean_post', $post, $purge_urls, $lang);
    $purge_urls = apply_filters('rocket_post_purge_urls', $purge_urls, $post);
    rocket_clean_files($purge_urls);
    rocket_clean_home($lang);
    rocket_clean_home_feeds();
    do_action('after_rocket_clean_post', $post, $purge_urls, $lang);
    return true;
}
add_action('wp_trash_post', 'rocket_clean_post');
add_action('delete_post', 'rocket_clean_post');
add_action('clean_post_cache', 'rocket_clean_post');
add_action('wp_update_comment_count', 'rocket_clean_post');
function rocket_clean_post_cache_on_status_change($post_id, $post_data)
{
    if ('publish' !== get_post_field('post_status', $post_id) || 'draft' !== $post_data['post_status']) {
        return;
    }
    $purge_urls = [];
    $post = get_post($post_id);
    if (!is_object($post)) {
        return;
    }
    $i18n_plugin = rocket_has_i18n();
    $lang = false;
    if ('wpml' === $i18n_plugin && !rocket_is_plugin_active('woocommerce-multilingual/wpml-woocommerce.php')) {
        $lang = $GLOBALS['sitepress']->get_language_for_element($post_id, 'post_' . get_post_type($post_id));
    } elseif ('polylang' === $i18n_plugin && function_exists('pll_get_post_language')) {
        $lang = pll_get_post_language($post_id);
    }
    $purge_urls = rocket_get_purge_urls($post_id, $post);
    $purge_urls = apply_filters('rocket_post_purge_urls', $purge_urls, $post);
    do_action('before_rocket_clean_post', $post, $purge_urls, $lang);
    rocket_clean_files($purge_urls);
    rocket_clean_home($lang);
    rocket_clean_home_feeds();
    do_action('after_rocket_clean_post', $post, $purge_urls, $lang);
}
add_action('pre_post_update', 'rocket_clean_post_cache_on_status_change', 10, 2);
function rocket_clean_files_users($urls)
{
    $pattern_urls = [];
    foreach ($urls as $url) {
        $parse_url = get_rocket_parse_url($url);
        $pattern_urls[] = $parse_url['scheme'] . '://' . $parse_url['host'] . '*' . $parse_url['path'];
    }
    return $pattern_urls;
}
add_filter('rocket_clean_files', 'rocket_clean_files_users');
function rocket_post_purge_urls_for_qtranslate($urls)
{
    global $q_config;
    if (!$urls) {
        return [];
    }
    $i18n_plugin = rocket_has_i18n();
    if ('qtranslate' !== $i18n_plugin && 'qtranslate-x' !== $i18n_plugin) {
        return $urls;
    }
    $enabled_languages = $q_config['enabled_languages'];
    $enabled_languages = array_diff($enabled_languages, [$q_config['default_language']]);
    foreach ($urls as $url) {
        foreach ($enabled_languages as $lang) {
            if ('qtranslate' === $i18n_plugin) {
                $urls[] = qtrans_convertURL($url, $lang, true);
            } elseif ('qtranslate-x' === $i18n_plugin) {
                $urls[] = qtranxf_convertURL($url, $lang, true);
            }
        }
    }
    return $urls;
}
add_filter('rocket_post_purge_urls', 'rocket_post_purge_urls_for_qtranslate');
function do_admin_post_rocket_purge_cache()
{
    if (isset($_GET['type'], $_GET['_wpnonce'])) {
        $type_raw = sanitize_key($_GET['type']);
        $type_array = explode('-', $type_raw);
        $type = $type_array[0];
        $id = isset($type_array[1]) && is_numeric($type_array[1]) ? absint($type_array[1]) : 0;
        $taxonomy = isset($_GET['taxonomy']) ? sanitize_title(wp_unslash($_GET['taxonomy'])) : '';
        $url = '';
        if (!wp_verify_nonce(sanitize_key($_GET['_wpnonce']), 'purge_cache_' . $type_raw)) {
            wp_nonce_ays('');
            return;
        }
        if (!current_user_can('rocket_purge_cache')) {
            return;
        }
        switch ($type) {
            case 'all':
                set_transient('rocket_clear_cache', 'all', HOUR_IN_SECONDS);
                $lang = isset($_GET['lang']) && 'all' !== $_GET['lang'] ? sanitize_key($_GET['lang']) : '';
                rocket_clean_domain($lang);
                if ('' === $lang) {
                    rocket_clean_minify();
                    $options = get_option(WP_ROCKET_SLUG);
                    $options['minify_css_key'] = create_rocket_uniqid();
                    $options['minify_js_key'] = create_rocket_uniqid();
                    remove_all_filters('update_option_' . WP_ROCKET_SLUG);
                    update_option(WP_ROCKET_SLUG, $options);
                }
                if (get_rocket_option('manual_preload') && (!defined('WP_ROCKET_DEBUG') || !WP_ROCKET_DEBUG)) {
                    $home_url = get_rocket_i18n_home_url($lang);
                    $args = (array) apply_filters('rocket_preload_after_purge_cache_request_args', ['blocking' => false, 'timeout' => 0.01, 'user-agent' => 'WP Rocket/Homepage_Preload_After_Purge_Cache', 'sslverify' => apply_filters('https_local_ssl_verify', false)]);
                    wp_safe_remote_get($home_url, $args);
                    do_action('rocket_after_preload_after_purge_cache', $home_url, $lang, $args);
                }
                rocket_dismiss_box('rocket_warning_plugin_modification');
                break;
            case 'post':
                rocket_clean_post($id);
                set_transient('rocket_clear_cache', 'post', HOUR_IN_SECONDS);
                break;
            case 'term':
                rocket_clean_term($id, $taxonomy);
                set_transient('rocket_clear_cache', 'term', HOUR_IN_SECONDS);
                break;
            case 'user':
                rocket_clean_user($id);
                set_transient('rocket_clear_cache', 'user', HOUR_IN_SECONDS);
                break;
            case 'url':
                $url = wp_get_referer();
                if (0 !== strpos($url, 'http')) {
                    $parse_url = get_rocket_parse_url(untrailingslashit(home_url()));
                    $url = $parse_url['scheme'] . '://' . $parse_url['host'] . $url;
                }
                if (home_url('/') === $url) {
                    rocket_clean_home();
                } else {
                    rocket_clean_files($url);
                }
                break;
            default:
                wp_nonce_ays('');
                return;
        }
        do_action('rocket_purge_cache', $type, $id, $taxonomy, $url);
        wp_safe_redirect(esc_url_raw(wp_get_referer()));
        rocket_get_constant('WP_ROCKET_IS_TESTING', false) ? wp_die() : exit;
    }
}
add_action('admin_post_purge_cache', 'do_admin_post_rocket_purge_cache');
function do_admin_post_rocket_purge_opcache()
{
    if (!isset($_GET['_wpnonce']) || !wp_verify_nonce(sanitize_key($_GET['_wpnonce']), 'rocket_purge_opcache')) {
        wp_nonce_ays('');
    }
    if (!current_user_can('rocket_purge_opcache')) {
        return;
    }
    $reset_opcache = rocket_reset_opcache();
    if (!$reset_opcache) {
        $op_purge_result = ['result' => 'error', 'message' => __('OPcache purge failed.', 'rocket')];
    } else {
        $op_purge_result = ['result' => 'success', 'message' => __('OPcache successfully purged', 'rocket')];
    }
    set_transient(get_current_user_id() . '_opcache_purge_result', $op_purge_result);
    wp_safe_redirect(esc_url_raw(wp_get_referer()));
    die;
}
add_action('admin_post_rocket_purge_opcache', 'do_admin_post_rocket_purge_opcache');
function rocket_clean_cache_theme_update($wp_upgrader, $hook_extra)
{
    if ('update' !== $hook_extra['action']) {
        return;
    }
    if ('theme' !== $hook_extra['type']) {
        return;
    }
    if (!is_array($hook_extra['themes'])) {
        return;
    }
    $current_theme = wp_get_theme();
    $themes = [$current_theme->get_template(), $current_theme->get_stylesheet()];
    if (empty(array_intersect($hook_extra['themes'], $themes))) {
        return;
    }
    rocket_clean_domain();
}
add_action('upgrader_process_complete', 'rocket_clean_cache_theme_update', 10, 2);
function rocket_clean_post_cache_on_slug_change($post_id, $post_data)
{
    if (in_array(get_post_field('post_status', $post_id), ['draft', 'pending', 'auto-draft'], true)) {
        return;
    }
    $post_name = get_post_field('post_name', $post_id);
    if ($post_name === $post_data['post_name']) {
        return;
    }
    if (empty($post_name)) {
        return;
    }
    rocket_clean_files(get_the_permalink($post_id));
}
add_action('pre_post_update', 'rocket_clean_post_cache_on_slug_change', PHP_INT_MAX, 2);