374 lines
13 KiB
PHP
374 lines
13 KiB
PHP
<?php
|
|
|
|
if ( ! defined( "ABSPATH" ) ) {
|
|
exit();
|
|
}
|
|
|
|
class WpdiscuzHelperOptimization implements WpDiscuzConstants {
|
|
|
|
private $options;
|
|
/**
|
|
* @var $dbManager WpdiscuzDBManager
|
|
*/
|
|
private $dbManager;
|
|
/**
|
|
* @var $helperEmail WpdiscuzHelperEmail
|
|
*/
|
|
private $helperEmail;
|
|
private $helper;
|
|
|
|
public function __construct( $options, $dbManager, $helperEmail, $helper ) {
|
|
$this->options = $options;
|
|
$this->dbManager = $dbManager;
|
|
$this->helperEmail = $helperEmail;
|
|
$this->helper = $helper;
|
|
add_action( "deleted_comment", [ &$this, "cleanCommentRelatedRows" ], 10, 2 );
|
|
add_action( "delete_user", [ &$this, "deleteUserRelatedData" ], 11 );
|
|
add_action( "profile_update", [ &$this, "onProfileUpdate" ], 10, 2 );
|
|
add_action( "admin_post_removeVoteData", [ &$this, "removeVoteData" ] );
|
|
add_action( "admin_post_removeSocialAvatars", [ &$this, "removeSocialAvatars" ] );
|
|
add_action( "admin_post_resetPhrases", [ &$this, "resetPhrases" ] );
|
|
add_action( "transition_comment_status", [ &$this, "statusEventHandler" ], 10, 3 );
|
|
add_action( "edit_comment", [ &$this, "commentEdited" ], 10, 2 );
|
|
add_action( "post_updated", [ &$this, "actionsOnUpdatedPost" ] );
|
|
add_action( "deleted_post", [ &$this, "actionsOnDeletedPost" ] );
|
|
add_action( "updated_option", [ &$this, "optionUpdated" ] );
|
|
add_action( "bp_members_avatar_uploaded", [ &$this, "bpAvatarUploaded" ] );
|
|
add_action( "wpforo_update_profile_after", [ &$this, "wpfProfileUpdate" ] );
|
|
add_action( "deactivate_plugin", [ &$this, "pluginDeactivated" ] );
|
|
add_action( "wpdiscuz_clean_post_cache", [ &$this, "cleanPostCache" ] );
|
|
add_action( "wpdiscuz_clean_all_caches", [ &$this, "cleanAllCaches" ] );
|
|
if ( $this->isApplicableToRequest() ) {
|
|
add_filter( 'comments_pre_query', [ &$this, "addCustomVariables" ], PHP_INT_MAX, 2 );
|
|
add_filter( 'the_comments', [ &$this, "deleteCustomVariable" ], PHP_INT_MIN, 2 );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* recursively get new comments tree
|
|
* return array of comments' ids
|
|
*/
|
|
public function getTreeByParentId( $commentId, &$tree ) {
|
|
if ( ! in_array( $commentId, $tree ) ) {
|
|
$tree[] = $commentId;
|
|
}
|
|
|
|
$children = $this->dbManager->getCommentsByParentId( $commentId );
|
|
|
|
if ( $children && is_array( $children ) ) {
|
|
foreach ( $children as $child ) {
|
|
$this->getTreeByParentId( $child, $tree );
|
|
}
|
|
}
|
|
|
|
return $tree;
|
|
}
|
|
|
|
public function getCommentParentsTree( $commentId, &$tree ) {
|
|
|
|
if ( is_array( $tree ) && ! in_array( $commentId, $tree ) ) {
|
|
$tree[] = $commentId;
|
|
}
|
|
|
|
$comment = get_comment( $commentId );
|
|
|
|
if ( $comment && $comment->comment_parent ) {
|
|
$this->getCommentParentsTree( $comment->comment_parent, $tree );
|
|
}
|
|
|
|
$tree = array_values(array_filter(array_map('intval', $tree)));
|
|
|
|
return array_reverse($tree);
|
|
}
|
|
|
|
/**
|
|
* add new comment id in comment meta if status is approved
|
|
*
|
|
* @param type $newStatus the comment new status
|
|
* @param type $oldStatus the comment old status
|
|
* @param type $comment current comment object
|
|
*/
|
|
public function statusEventHandler( $newStatus, $oldStatus, $comment ) {
|
|
if ( $newStatus === "approved" ) {
|
|
$currentUser = wp_get_current_user();
|
|
if ( ( ! empty( $currentUser->user_email ) && $currentUser->user_email !== $comment->comment_author_email ) && $this->options->subscription["isNotifyOnCommentApprove"] ) {
|
|
$this->helperEmail->notifyOnApproving( $comment );
|
|
}
|
|
$this->notifyOnApprove( $comment );
|
|
}
|
|
do_action( "wpdiscuz_reset_comments_cache", $comment->comment_post_ID );
|
|
}
|
|
|
|
public function commentEdited( $comment_ID, $data ) {
|
|
do_action( "wpdiscuz_reset_comments_cache", $data["comment_post_ID"] );
|
|
}
|
|
|
|
public function actionsOnUpdatedPost( $post_ID ) {
|
|
do_action( "wpdiscuz_reset_comments_cache", $post_ID );
|
|
}
|
|
|
|
public function actionsOnDeletedPost( $post_id ) {
|
|
$this->dbManager->removeRatings( $post_id );
|
|
$this->dbManager->deleteFeedbackFormsForPost( $post_id );
|
|
do_action( "wpdiscuz_reset_comments_cache", $post_id );
|
|
}
|
|
|
|
public function optionUpdated( $option ) {
|
|
if ( in_array( $option, [
|
|
"page_comments",
|
|
"comments_per_page",
|
|
"thread_comments",
|
|
"thread_comments_depth",
|
|
"default_comments_page",
|
|
"comment_order"
|
|
] ) ) {
|
|
do_action( "wpdiscuz_reset_comments_cache" );
|
|
}
|
|
}
|
|
|
|
public function bpAvatarUploaded( $userId ) {
|
|
$user = get_user_by( "id", $userId );
|
|
do_action( "wpdiscuz_reset_users_cache", $userId . "_" . $user->user_email . "_" . $user->display_name );
|
|
}
|
|
|
|
public function wpfProfileUpdate( $user ) {
|
|
$wpUser = get_user_by( "id", $user["userid"] );
|
|
do_action( "wpdiscuz_reset_users_cache", $wpUser->ID . "_" . $wpUser->user_email . "_" . $wpUser->display_name );
|
|
do_action( "wpdiscuz_reset_comments_cache" );
|
|
}
|
|
|
|
public function pluginDeactivated( $plugin ) {
|
|
if ( in_array( $plugin, [
|
|
"wpdiscuz/class.WpdiscuzCore.php",
|
|
"wpforo/wpforo.php",
|
|
"buddypress/bp-loader.php",
|
|
"ultimate-member/ultimate-member.php"
|
|
], true ) ) {
|
|
do_action( "wpdiscuz_reset_users_cache" );
|
|
do_action( "wpdiscuz_reset_comments_cache" );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* get the current comment root comment
|
|
*
|
|
* @param int $commentId the current comment id
|
|
*
|
|
* @return WP_Comment comment
|
|
*/
|
|
public function getCommentRoot( $commentId, $commentStatusIn, $includeUnapproved = null ) {
|
|
$comment = get_comment( $commentId );
|
|
$condition = false;
|
|
if ( ! is_null( $includeUnapproved ) ) {
|
|
if ( is_numeric( $includeUnapproved ) ) {
|
|
if ( $comment->user_id == $includeUnapproved ) {
|
|
$condition = true;
|
|
}
|
|
} else if ( $comment->comment_author_email === $includeUnapproved ) {
|
|
$condition = true;
|
|
}
|
|
}
|
|
if ( in_array( $comment->comment_approved, $commentStatusIn ) || ( $comment->comment_approved === "0" && $condition ) ) {
|
|
if ( $comment && $comment->comment_parent ) {
|
|
return $this->getCommentRoot( $comment->comment_parent, $commentStatusIn, $includeUnapproved );
|
|
} else {
|
|
return $comment;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public function getCommentDepth( $commentId, &$depth = 1 ) {
|
|
$comment = get_comment( $commentId );
|
|
if ( $comment->comment_parent && ( $depth < $this->options->wp["threadCommentsDepth"] ) ) {
|
|
$depth ++;
|
|
|
|
return $this->getCommentDepth( $comment->comment_parent, $depth );
|
|
} else {
|
|
return $depth;
|
|
}
|
|
}
|
|
|
|
private function notifyOnApprove( $comment ) {
|
|
$postId = $comment->comment_post_ID;
|
|
$commentId = $comment->comment_ID;
|
|
$email = $comment->comment_author_email;
|
|
$parentComment = get_comment( $comment->comment_parent );
|
|
if ( apply_filters( "wpdiscuz_enable_user_mentioning", $this->options->subscription["enableUserMentioning"] ) && $this->options->subscription["sendMailToMentionedUsers"] && ( $mentionedUsers = $this->helper->getMentionedUsers( $comment->comment_content ) ) ) {
|
|
$this->helperEmail->sendMailToMentionedUsers( $mentionedUsers, $comment );
|
|
}
|
|
do_action( "wpdiscuz_before_sending_emails", $commentId, $comment );
|
|
$this->helperEmail->notifyPostSubscribers( $postId, $commentId, $email );
|
|
$this->helperEmail->notifyFollowers( $postId, $commentId, $email );
|
|
if ( $parentComment ) {
|
|
$parentCommentEmail = $parentComment->comment_author_email;
|
|
$this->helperEmail->notifyAllCommentSubscribers( $postId, $commentId, $email );
|
|
if ( $parentCommentEmail !== $email ) {
|
|
$this->helperEmail->notifyCommentSubscribers( $parentComment->comment_ID, $commentId, $email );
|
|
}
|
|
}
|
|
}
|
|
|
|
public function removeVoteData() {
|
|
if ( isset( $_GET["_wpnonce"] ) && wp_verify_nonce( $_GET["_wpnonce"], "removeVoteData" ) && current_user_can( "manage_options" ) ) {
|
|
$this->dbManager->removeVotes();
|
|
do_action( "wpdiscuz_remove_vote_data" );
|
|
wp_redirect( admin_url( "admin.php?page=" . self::PAGE_SETTINGS . "&wpd_tab=" . self::TAB_GENERAL ) );
|
|
}
|
|
}
|
|
|
|
public function removeSocialAvatars() {
|
|
if ( isset( $_GET["_wpnonce"] ) && wp_verify_nonce( $_GET["_wpnonce"], "removeSocialAvatars" ) && current_user_can( "manage_options" ) ) {
|
|
$this->dbManager->removeSocialAvatars();
|
|
wp_redirect( admin_url( "admin.php?page=" . self::PAGE_SETTINGS . "&wpd_tab=" . self::TAB_GENERAL ) );
|
|
}
|
|
}
|
|
|
|
public function resetPhrases() {
|
|
if ( isset( $_GET["_wpnonce"] ) && wp_verify_nonce( $_GET["_wpnonce"], "reset_phrases_nonce" ) && current_user_can( "manage_options" ) ) {
|
|
$this->dbManager->deletePhrases();
|
|
wp_redirect( admin_url( "admin.php?page=" . self::PAGE_PHRASES ) );
|
|
}
|
|
}
|
|
|
|
public function cleanCommentRelatedRows( $commentId, $comment = null ) {
|
|
$this->dbManager->deleteSubscriptions( $commentId );
|
|
$this->dbManager->deleteVotes( $commentId );
|
|
if ( $comment && ! empty( $comment->comment_post_ID ) ) {
|
|
$this->cleanPostCache( $comment->comment_post_ID );
|
|
}
|
|
}
|
|
|
|
public function onProfileUpdate( $userId, $oldUser ) {
|
|
$user = get_user_by( "id", $userId );
|
|
if ( $user && $oldUser ) {
|
|
if ( ( $user->user_email !== $oldUser->user_email || $user->display_name !== $oldUser->display_name || $user->user_url !== $oldUser->user_url ) && $this->dbManager->userHasComments( $userId ) ) {
|
|
$this->dbManager->updateCommenterData( $user->user_email, $user->display_name, $user->user_url, $userId );
|
|
}
|
|
$this->dbManager->updateUserInfo( $user, $oldUser );
|
|
}
|
|
do_action( "wpdiscuz_reset_comments_cache" );
|
|
do_action( "wpdiscuz_reset_users_cache", $userId . "_" . $oldUser->user_email . "_" . $oldUser->display_name );
|
|
}
|
|
|
|
public function deleteUserRelatedData( $id ) {
|
|
$user = get_user_by( "id", $id );
|
|
if ( $user && $user->user_email ) {
|
|
$this->dbManager->deleteSubscriptionsByEmail( $user->user_email );
|
|
$this->dbManager->deleteFollowersByEmail( $user->user_email );
|
|
$this->dbManager->deleteFollowsByEmail( $user->user_email );
|
|
}
|
|
$this->dbManager->deleteUserVotes( $id );
|
|
}
|
|
|
|
public function cleanPostCache( $postId ) {
|
|
if ( apply_filters( "wpdiscuz_manage_post_cache_clearing", true ) ) {
|
|
clean_post_cache( $postId );
|
|
if ( defined( "LSCWP_V" ) ) {
|
|
do_action( "litespeed_purge_post", $postId );
|
|
}
|
|
if ( function_exists( "rocket_clean_post" ) ) {
|
|
rocket_clean_post( $postId );
|
|
}
|
|
if ( function_exists( "wpfc_clear_post_cache_by_id" ) ) {
|
|
wpfc_clear_post_cache_by_id( $postId );
|
|
}
|
|
if ( function_exists( "fvm_purge_all" ) ) {
|
|
fvm_purge_all();
|
|
}
|
|
if ( function_exists( "fvm_purge_others" ) ) {
|
|
fvm_purge_others();
|
|
}
|
|
if ( function_exists( "w3tc_flush_post" ) ) {
|
|
w3tc_flush_post( $postId );
|
|
}
|
|
if ( is_callable( [ "WPO_Page_Cache", "delete_single_post_cache" ] ) ) {
|
|
WPO_Page_Cache::delete_single_post_cache( $postId );
|
|
}
|
|
if ( class_exists( "\SiteGround_Optimizer\Supercacher\Supercacher" ) ) {
|
|
\SiteGround_Optimizer\Supercacher\Supercacher::purge_cache();
|
|
\SiteGround_Optimizer\Supercacher\Supercacher::flush_memcache();
|
|
\SiteGround_Optimizer\Supercacher\Supercacher::delete_assets();
|
|
}
|
|
}
|
|
|
|
update_post_meta( $postId, self::POSTMETA_STATISTICS, [] );
|
|
}
|
|
|
|
public function cleanAllCaches() {
|
|
if ( apply_filters( "wpdiscuz_manage_all_cache_clearing", true ) ) {
|
|
wp_cache_flush();
|
|
if ( class_exists( "\LiteSpeed\Purge" ) ) {
|
|
\LiteSpeed\Purge::purge_all();
|
|
}
|
|
if ( function_exists( "rocket_clean_domain" ) ) {
|
|
rocket_clean_domain();
|
|
}
|
|
if ( function_exists( "wpfc_clear_all_cache" ) ) {
|
|
wpfc_clear_all_cache( true );
|
|
}
|
|
$fvm = get_option( "fastvelocity_min_ignore" );
|
|
if ( is_string( $fvm ) && strpos( $fvm, "/wp-content/plugins/wpdiscuz/*" ) === false ) {
|
|
if ( $fvm ) {
|
|
$fvm .= "\n";
|
|
}
|
|
$fvm .= "/wp-content/plugins/wpdiscuz/*";
|
|
update_option( "fastvelocity_min_ignore", $fvm );
|
|
}
|
|
if ( function_exists( "fvm_purge_all" ) ) {
|
|
fvm_purge_all();
|
|
}
|
|
if ( function_exists( "fvm_purge_others" ) ) {
|
|
fvm_purge_others();
|
|
}
|
|
if ( function_exists( "w3tc_flush_all" ) ) {
|
|
w3tc_flush_all();
|
|
}
|
|
if ( class_exists( "autoptimizeCache" ) ) {
|
|
autoptimizeCache::clearall();
|
|
}
|
|
if ( class_exists( "\SiteGround_Optimizer\Supercacher\Supercacher" ) ) {
|
|
\SiteGround_Optimizer\Supercacher\Supercacher::purge_cache();
|
|
\SiteGround_Optimizer\Supercacher\Supercacher::flush_memcache();
|
|
\SiteGround_Optimizer\Supercacher\Supercacher::delete_assets();
|
|
}
|
|
}
|
|
}
|
|
|
|
//Integration with Redis or Memcached
|
|
|
|
private function isApplicableToRequest() {
|
|
if ( ! wp_doing_ajax() ) {
|
|
return false;
|
|
}
|
|
if ( ! isset( $_REQUEST["action"] ) || sanitize_text_field( $_REQUEST["action"] ) !== "wpdLoadMoreComments" ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function addCustomVariables( $comment_data, $query ) {
|
|
$query->query_var_defaults["wpdiscuz"] = "temporary_from_" . __CLASS__ . "::" . __METHOD__;
|
|
$this->addWpDiscuzParams( $query );
|
|
|
|
return $comment_data;
|
|
}
|
|
|
|
public function deleteCustomVariable( $_comments, $query ) {
|
|
unset( $query->query_var_defaults["wpdiscuz"] );
|
|
|
|
return $_comments;
|
|
}
|
|
|
|
|
|
private function addWpDiscuzParams( $query ) {
|
|
$query->query_vars["wpdiscuz"] = wp_array_slice_assoc( $_REQUEST, $this->getWpDiscuzSpecificArgs() );
|
|
}
|
|
|
|
private function getWpDiscuzSpecificArgs() {
|
|
return [ "lastParentId", "isFirstLoad", "offset", "sorting" ];
|
|
}
|
|
}
|