芝麻web文件管理V1.00
编辑当前文件:/home/freeclou/optimyar/wp-content/plugins/wpdiscuz/utils/class.WpdiscuzCache.php
<?php if (!defined("ABSPATH")) { exit(); } class WpdiscuzCache implements WpDiscuzConstants { public $wpUploadsDir; private $options; private $helper; public function __construct($options, $helper) { $this->options = $options; $this->helper = $helper; $this->wpUploadsDir = wp_upload_dir(); add_action("admin_post_purgeAllCaches", [&$this, "purgeAllCaches"]); add_action("admin_post_purgePostCaches", [&$this, "purgePostCaches"]); add_action("wpdiscuz_reset_users_cache", [&$this, "resetUsersCache"]); add_action("wpdiscuz_reset_comments_cache", [&$this, "resetCommentsCache"]); add_action("wpdiscuz_reset_comments_extra_cache", [&$this, "resetExtraCache"]); add_action("comment_post", [&$this, "commentPost"], 248, 3); add_action("edit_comment", [&$this, "editComment"], 249, 2); } public function purgeAllCaches() { if (current_user_can("manage_options") && isset($_GET["_wpnonce"]) && wp_verify_nonce(sanitize_text_field($_GET["_wpnonce"]), "purgeAllCaches")) { $this->resetCommentsCache(); $this->resetUsersCache(); } $referer = wp_get_referer(); if (strpos($referer, "page=" . self::PAGE_SETTINGS) === false) { $redirect = $referer; } else { $redirect = admin_url("admin.php?page=" . self::PAGE_SETTINGS . "&wpd_tab=" . self::TAB_GENERAL); } wp_redirect($redirect); exit(); } public function purgePostCaches() { if (current_user_can("manage_options") && isset($_GET["_wpnonce"]) && !empty($_GET["post_id"]) && wp_verify_nonce(sanitize_text_field($_GET["_wpnonce"]), "purgePostCaches")) { $this->resetCommentsCache(sanitize_text_field($_GET["post_id"])); $this->resetUsersCache(); } wp_redirect(wp_get_referer()); exit(); } public function deleteGravatarsFolder() { if (!class_exists("WP_Filesystem_Direct")) { require_once ABSPATH . "wp-admin/includes/class-wp-filesystem-base.php"; require_once ABSPATH . "wp-admin/includes/class-wp-filesystem-direct.php"; } $fs = new WP_Filesystem_Direct([]); $fs->rmdir($this->wpUploadsDir["basedir"] . "/wpdiscuz/cache/gravatars/", true); } /* * User and Comment Cache */ public function getUserCache($userKey) { return $this->getCache($this->getUserCacheFileinfo($userKey)); } public function getCommentsCache($commentsArgs) { return $this->getCache($this->getCommentsCacheFileinfo($commentsArgs)); } public function getExtraCache($args) { return $this->getCache($this->getExtraCacheFileinfo($args)); } public function setUserCache($userKey, $user) { unset($user["author_title"], $user["commentWrapRoleClass"]); return $this->setCache($this->getUserCacheFileinfo($userKey), $user); } public function setCommentsCache($commentsArgs, $commentList, $commentData) { if (!$this->helper->isUnapprovedInTree($commentList)) { $data = ["commentList" => $commentList, "commentData" => $commentData]; return $this->setCache($this->getCommentsCacheFileinfo($commentsArgs), $data); } return false; } public function setExtraCache($commentsArgs, $extraData) { return $this->setCache($this->getExtraCacheFileinfo($commentsArgs), $extraData); } public function resetUsersCache($userKey = "") { if ($userKey) { $dirs = $this->getUserCacheFileinfo($userKey); $path = $dirs["path"]; } else { $dirs = $this->getCacheDirectories(); $path = $dirs["users"]; } $this->resetCache($path); } public function resetCommentsCache($postId = 0) { $dirs = $this->getCacheDirectories(); $path = $dirs["comments"] . ($postId ? ($postId . "/") : ""); $this->resetCache($path); } public function resetExtraCache($postId) { $dirs = $this->getCacheDirectories(); $path = $dirs["comments"] . $postId . "/" . $dirs["extra"]; $this->resetCache($path); } private function getCache($fileInfo) { // removing stat caches to avoid unexpected results clearstatcache(); if ($this->options->general["isCacheEnabled"] && file_exists($fileInfo["path"])) { /** * delete old cached file * !!!IMPORTANT * do not use current_time here as it returns WP time */ if (is_file($fileInfo["path"]) && time() > @filemtime($fileInfo["path"]) + ($this->options->general["cacheTimeout"] * DAY_IN_SECONDS)) { @unlink($fileInfo["path"]); return []; } if (is_readable($fileInfo["path"]) && ($cache = maybe_unserialize(file_get_contents($fileInfo["path"]))) && is_array($cache)) { return $cache; } } return []; } private function setCache($fileInfo, $data) { if ($this->options->general["isCacheEnabled"]) { // removing stat caches to avoid unexpected results clearstatcache(); if (!is_dir($fileInfo["dir"])) { wp_mkdir_p($fileInfo["dir"]); } $htaccces = ".htaccess"; if (is_dir($fileInfo["basedir"]) && !file_exists($fileInfo["basedir"] . $htaccces)) { file_put_contents($fileInfo["basedir"] . $htaccces, "Deny from all"); } if (is_writable($fileInfo["dir"]) && ($data = serialize($data))) { return file_put_contents($fileInfo["path"], $data); } } return false; } private function resetCache($path) { if (!class_exists("WP_Filesystem_Direct")) { require_once ABSPATH . "wp-admin/includes/class-wp-filesystem-base.php"; require_once ABSPATH . "wp-admin/includes/class-wp-filesystem-direct.php"; } $fs = new WP_Filesystem_Direct([]); $fs->rmdir($path, true); } private function getUserCacheFileinfo($userKey) { $dirs = $this->getCacheDirectories(); $fileName = md5($userKey); return [ "basedir" => $dirs["users"], "dir" => $dirs["users"], "name" => $fileName, "path" => $dirs["users"] . $fileName, ]; } private function getCommentsCacheFileinfo($commentsArgs) { $dirs = $this->getCacheDirectories(); $fileDir = $dirs["comments"] . $commentsArgs["post_id"] . "/"; $fileName = md5(implode(",", $commentsArgs["user_roles"]) . $commentsArgs["wpdType"] . $commentsArgs["last_parent_id"] . $commentsArgs["page"] . $commentsArgs["order"] . $commentsArgs["orderby"]) . "_" . $commentsArgs["last_parent_id"]; return [ "basedir" => $dirs["comments"], "name" => $fileName, "path" => $fileDir . $fileName, "dir" => $fileDir, ]; } private function getExtraCacheFileinfo($commentsArgs) { $dirs = $this->getCacheDirectories(); $fileDir = $dirs["comments"] . $commentsArgs["post_id"] . "/" . $dirs["extra"] . "/"; $fileName = md5(implode(",", $commentsArgs["user_roles"]) . $commentsArgs["wpdType"] . $commentsArgs["last_parent_id"] . $commentsArgs["page"] . $commentsArgs["order"] . $commentsArgs["orderby"]) . "_" . $commentsArgs["last_parent_id"]; return [ "basedir" => $dirs["extra"], "name" => $fileName, "path" => $fileDir . $fileName, "dir" => $fileDir, ]; } private function getCacheDirectories() { return [ "comments" => $this->wpUploadsDir["basedir"] . self::COMMENTS_CACHE_DIR, "users" => $this->wpUploadsDir["basedir"] . self::USERS_CACHE_DIR, "extra" => self::EXTRA_CACHE_DIR, ]; } public function commentPost($comment_ID, $approved, $commentdata) { if (!empty($commentdata['comment_post_ID'])) { $this->resetCommentsCache($commentdata['comment_post_ID']); $this->resetUsersCache(); } } public function editComment($comment_ID, $commentdata) { if (!empty($commentdata['comment_post_ID'])) { $this->resetCommentsCache($commentdata['comment_post_ID']); $this->resetUsersCache(); } } }