options = $options;
$this->dbManager = $dbManager;
$this->helper = $helper;
$this->helperEmail = $helperEmail;
$this->wpdiscuzForm = $wpdiscuzForm;
add_action("wp_ajax_wpdStickComment", [&$this, "stickComment"]);
add_action("wp_ajax_wpdCloseThread", [&$this, "closeThread"]);
add_action("wp_ajax_wpdDeactivate", [&$this, "deactivate"]);
add_action("wp_ajax_wpdImportSTCR", [&$this, "importSTCR"]);
add_action("wp_ajax_wpdImportLSTC", [&$this, "importLSTC"]);
add_action("wp_ajax_wpdFollowUser", [&$this, "followUser"]);
add_action("wp_ajax_wpdRegenerateVoteMetas", [&$this, "regenerateVoteMetas"]);
add_action("wp_ajax_wpdRegenerateClosedComments", [&$this, "regenerateClosedComments"]);
add_action("wp_ajax_wpdRegenerateVoteData", [&$this, "regenerateVoteData"]);
add_action("wp_ajax_wpdSyncCommenterData", [&$this, "syncCommenterData"]);
add_action("wp_ajax_wpdRebuildRatings", [&$this, "rebuildRatings"]);
add_action("wp_ajax_wpdFixTables", [&$this, "fixTables"]);
if ($this->options->login["showActivityTab"] || $this->options->login["showSubscriptionsTab"] || $this->options->login["showFollowsTab"]) {
add_action("wp_ajax_wpdDeleteComment", [&$this, "deleteComment"]);
add_action("wp_ajax_wpdCancelSubscription", [&$this, "deleteSubscription"]);
add_action("wp_ajax_wpdCancelFollow", [&$this, "deleteFollow"]);
add_action("wp_ajax_wpdEmailDeleteLinks", [&$this->helperEmail, "emailDeleteLinksAction"]);
add_action("wp_ajax_nopriv_wpdGuestAction", [&$this, "guestAction"]);
}
if ($this->options->content["commentReadMoreLimit"]) {
add_action("wp_ajax_wpdReadMore", [&$this, "readMore"]);
add_action("wp_ajax_nopriv_wpdReadMore", [&$this, "readMore"]);
}
add_action("wp_ajax_wpdRedirect", [&$this, "redirect"]);
add_action("wp_ajax_nopriv_wpdRedirect", [&$this, "redirect"]);
if ($this->options->thread_layouts["showVotingButtons"]) {
add_action("wp_ajax_wpdVoteOnComment", [&$this, "voteOnComment"]);
add_action("wp_ajax_nopriv_wpdVoteOnComment", [&$this, "voteOnComment"]);
}
add_action("wp_ajax_wpdGetInlineCommentForm", [&$this, "getInlineCommentForm"]);
add_action("wp_ajax_nopriv_wpdGetInlineCommentForm", [&$this, "getInlineCommentForm"]);
add_action("wp_ajax_wpdGetLastInlineComments", [&$this, "getLastInlineComments"]);
add_action("wp_ajax_nopriv_wpdGetLastInlineComments", [&$this, "getLastInlineComments"]);
add_action("wp_ajax_wpdEditComment", [&$this, "editComment"]);
add_action("wp_ajax_nopriv_wpdEditComment", [&$this, "editComment"]);
add_action("wp_ajax_wpdUserRate", [&$this, "userRate"]);
add_action("wp_ajax_nopriv_wpdUserRate", [&$this, "userRate"]);
add_action("wp_ajax_wpdUnsubscribe", [&$this, "unsubscribe"]);
add_action("wp_ajax_nopriv_wpdUnsubscribe", [&$this, "unsubscribe"]);
add_action("wp_ajax_wpd_stat_brief", [&$this, "wpd_stat_brief"]);
add_action("wp_ajax_wpd_stat_subs", [&$this, "wpd_stat_subs"]);
add_action("wp_ajax_wpd_stat_graph", [&$this, "wpd_stat_graph"]);
add_action("wp_ajax_wpd_stat_user", [&$this, "wpd_stat_user"]);
add_action("wp_ajax_searchOption", [&$this, "searchOption"]);
add_action("wp_ajax_wpdResetPostRating", [&$this, "resetPostRating"]);
add_action("wp_ajax_wpdResetFieldsRatings", [&$this, "resetFieldsRatings"]);
}
public function stickComment()
{
$this->helper->validateNonce();
$postId = WpdiscuzHelper::sanitize(INPUT_POST, "postId", FILTER_SANITIZE_NUMBER_INT, 0);
$commentId = WpdiscuzHelper::sanitize(INPUT_POST, "commentId", FILTER_SANITIZE_NUMBER_INT, 0);
if ($postId && $commentId) {
$comment = get_comment($commentId);
$userCanStickComment = current_user_can("moderate_comments");
if (!$userCanStickComment) {
$post = get_post($postId);
$currentUser = WpdiscuzHelper::getCurrentUser();
$userCanStickComment = $post && isset($post->post_author) && $currentUser && isset($currentUser->ID) && $post->post_author == $currentUser->ID;
}
if ($userCanStickComment && $comment && isset($comment->comment_ID) && $comment->comment_ID && !$comment->comment_parent) {
$commentarr = ["comment_ID" => $commentId];
if ($comment->comment_type === self::WPDISCUZ_STICKY_COMMENT) {
$commentarr["comment_type"] = WpdiscuzCore::$DEFAULT_COMMENT_TYPE;
$response = esc_html($this->options->getPhrase("wc_stick_comment", ["comment" => $comment]));
} else {
$commentarr["comment_type"] = self::WPDISCUZ_STICKY_COMMENT;
$response = esc_html($this->options->getPhrase("wc_unstick_comment", ["comment" => $comment]));
}
$commentarr["wpdiscuz_comment_update"] = true;
if (wp_update_comment(wp_slash($commentarr))) {
do_action("wpdiscuz_reset_comments_cache", $comment->comment_post_ID);
wp_send_json_success($response);
}
}
}
}
public function closeThread()
{
$this->helper->validateNonce();
$postId = WpdiscuzHelper::sanitize(INPUT_POST, "postId", FILTER_SANITIZE_NUMBER_INT, 0);
$commentId = WpdiscuzHelper::sanitize(INPUT_POST, "commentId", FILTER_SANITIZE_NUMBER_INT, 0);
if ($postId && $commentId) {
$comment = get_comment($commentId);
$userCanCloseComment = current_user_can("moderate_comments");
if (!$userCanCloseComment) {
$post = get_post($postId);
$currentUser = WpdiscuzHelper::getCurrentUser();
$userCanCloseComment = !empty($post->post_author) && !empty($currentUser->ID) && $post->post_author == $currentUser->ID;
}
if ($userCanCloseComment && !empty($comment->comment_ID) && !$comment->comment_parent) {
$children = $comment->get_children([
"format" => "flat",
"status" => "all",
"post_id" => $postId,
]);
$response = [];
$isClosed = intval(get_comment_meta($comment->comment_ID, self::META_KEY_CLOSED, true));
if ($isClosed) {
$response["data"] = esc_html($this->options->getPhrase("wc_close_comment", ["comment" => $comment]));
$response["icon"] = esc_attr("fa-unlock");
} else {
$response["data"] = esc_html($this->options->getPhrase("wc_open_comment", ["comment" => $comment]));
$response["icon"] = esc_attr("fa-lock");
}
update_comment_meta($comment->comment_ID, self::META_KEY_CLOSED, intval(!$isClosed));
if ($children && is_array($children)) {
foreach ($children as $k => $child) {
update_comment_meta($child->comment_ID, self::META_KEY_CLOSED, intval(!$isClosed));
}
}
do_action("wpdiscuz_reset_comments_cache", $comment->comment_post_ID);
wp_send_json_success($response);
}
}
}
public function deactivate()
{
$response = ["code" => 0];
$json = filter_input(INPUT_POST, "deactivateData");
if ($json) {
parse_str($json, $data);
if (isset($data["never_show"]) && ($v = intval($data["never_show"]))) {
update_option(self::OPTION_SLUG_DEACTIVATION, $v);
$response["code"] = "dismiss_and_deactivate";
} else if (isset($data["deactivation_reason"]) && ($reason = trim($data["deactivation_reason"]))) {
if ($reason !== "I'll reactivate it later") {
$pluginData = get_plugin_data(WPDISCUZ_DIR_PATH . "/class.WpdiscuzCore.php");
$blogTitle = get_option("blogname");
$to = "feedback@wpdiscuz.com";
$subject = "[wpDiscuz Feedback - " . $pluginData["Version"] . "] - " . $reason;
$headers = [];
$contentType = "text/html";
$fromName = html_entity_decode($blogTitle, ENT_QUOTES);
$siteUrl = get_site_url();
$parsedUrl = parse_url($siteUrl);
$domain = isset($parsedUrl["host"]) ? WpdiscuzHelper::fixEmailFrom($parsedUrl["host"]) : "";
$fromEmail = "no-reply@" . $domain;
$headers[] = "Content-Type: $contentType; charset=UTF-8";
$headers[] = "From: " . $fromName . " <" . $fromEmail . "> \r\n";
$message = "Deactivation subject: " . $reason . "\r\n" . "
";
if (isset($data["deactivation_reason_desc"]) && ($reasonDesc = trim($data["deactivation_reason_desc"]))) {
$message .= "Deactivation reason: " . $reasonDesc . "\r\n" . "
";
}
if (isset($data["deactivation_feedback_email"]) && ($feedback_email = trim($data["deactivation_feedback_email"]))) {
if (filter_var($feedback_email, FILTER_VALIDATE_EMAIL) === false) {
$response["code"] = "send_and_deactivate";
wp_die(json_encode($response));
}
$to = "support@wpdiscuz.com";
$message .= "Feedback Email: " . $feedback_email . "\r\n" . "
";
}
$subject = html_entity_decode($subject, ENT_QUOTES);
$message = html_entity_decode($message, ENT_QUOTES);
$sent = wp_mail($to, $subject, do_shortcode($message), $headers);
}
$response["code"] = "send_and_deactivate";
}
}
wp_die(json_encode($response));
}
/**
* Import subscriptions from "Subscribe To Comments Reloaded" plugin
*/
public function importSTCR()
{
$this->helper->validateNonce();
$response = ["progress" => 0];
$stcrData = isset($_POST["stcrData"]) ? sanitize_textarea_field($_POST["stcrData"]) : "";
if ($stcrData) {
parse_str($stcrData, $data);
$limit = 50;
$step = isset($data["stcr-step"]) ? intval($data["stcr-step"]) : 0;
$stcrSubscriptionsCount = isset($data["stcr-subscriptions-count"]) ? intval($data["stcr-subscriptions-count"]) : 0;
$nonce = isset($data["wpd-stcr-subscriptions"]) ? trim($data["wpd-stcr-subscriptions"]) : "";
if (wp_verify_nonce($nonce, "wc_tools_form") && $stcrSubscriptionsCount) {
$offset = $limit * $step;
if ($limit && $offset >= 0) {
$subscriptions = $this->dbManager->getStcrSubscriptions($limit, $offset);
if ($subscriptions) {
$this->dbManager->addStcrSubscriptions($subscriptions);
++$step;
$response["step"] = $step;
$progress = $offset ? $offset * 100 / $stcrSubscriptionsCount : $limit * 100 / $stcrSubscriptionsCount;
$response["progress"] = ($prg = intval($progress)) > 100 ? 100 : $prg;
} else {
$response["progress"] = 100;
}
}
}
}
wp_die(json_encode($response));
}
/**
* Import subscriptions from "Lightweight Subscribe To Comments" plugin
*/
public function importLSTC()
{
$this->helper->validateNonce();
$response = ["progress" => 0];
$lstcData = isset($_POST["lstcData"]) ? sanitize_textarea_field($_POST["lstcData"]) : "";
if ($lstcData) {
parse_str($lstcData, $data);
$limit = 50;
$step = isset($data["lstc-step"]) ? intval($data["lstc-step"]) : 0;
$lstcSubscriptionsCount = isset($data["lstc-subscriptions-count"]) ? intval($data["lstc-subscriptions-count"]) : 0;
$nonce = isset($data["wpd-lstc-subscriptions"]) ? trim($data["wpd-lstc-subscriptions"]) : "";
if (wp_verify_nonce($nonce, "wc_tools_form") && $lstcSubscriptionsCount) {
$offset = $limit * $step;
if ($limit && $offset >= 0) {
$subscriptions = $this->dbManager->getLstcSubscriptions($limit, $offset);
if ($subscriptions) {
$this->dbManager->addLstcSubscriptions($subscriptions);
++$step;
$response["step"] = $step;
$progress = $offset ? $offset * 100 / $lstcSubscriptionsCount : $limit * 100 / $lstcSubscriptionsCount;
$response["progress"] = ($prg = intval($progress)) > 100 ? 100 : $prg;
} else {
$response["progress"] = 100;
}
}
}
}
wp_die(json_encode($response));
}
public function deleteComment()
{
$this->helper->validateNonce();
$commentId = WpdiscuzHelper::sanitize(INPUT_POST, "id", FILTER_SANITIZE_NUMBER_INT, 0);
$currentUser = WpdiscuzHelper::getCurrentUser();
if ($commentId && !empty($currentUser->ID) && $this->options->login["showActivityTab"] && ($comment = get_comment($commentId)) && intval($currentUser->ID) === intval($comment->user_id)) {
wp_delete_comment($commentId, true);
$this->helper->getActivityPage();
}
}
public function deleteSubscription()
{
$this->helper->validateNonce();
$subscriptionId = WpdiscuzHelper::sanitize(INPUT_POST, "id", FILTER_SANITIZE_NUMBER_INT, 0);
$currentUser = WpdiscuzHelper::getCurrentUser();
if ($subscriptionId && !empty($currentUser->ID) && $this->options->login["showSubscriptionsTab"] && ($subscription = $this->dbManager->getSubscriptionById($subscriptionId)) && $currentUser->user_email === $subscription->email) {
$this->dbManager->unsubscribeById($subscriptionId);
$this->helper->getSubscriptionsPage();
}
}
public function deleteFollow()
{
$this->helper->validateNonce();
$followId = WpdiscuzHelper::sanitize(INPUT_POST, "id", FILTER_SANITIZE_NUMBER_INT, 0);
$currentUser = WpdiscuzHelper::getCurrentUser();
if ($followId && !empty($currentUser->ID) && $this->options->login["showFollowsTab"] && ($follow = $this->dbManager->getFollowById($followId)) && $currentUser->ID === intval($follow->follower_id)) {
$this->dbManager->unfollowById($followId);
do_action("wpdiscuz_follow_cancelled", (array)$follow);
$this->helper->getFollowsPage();
}
}
public function guestAction()
{
$this->helper->validateNonce();
$guestEmail = isset($_COOKIE["comment_author_email_" . COOKIEHASH]) ? $_COOKIE["comment_author_email_" . COOKIEHASH] : "";
$guestAction = WpdiscuzHelper::sanitize(INPUT_POST, "guestAction", "FILTER_SANITIZE_STRING");
$postId = WpdiscuzHelper::sanitize(INPUT_POST, "postId", FILTER_SANITIZE_NUMBER_INT);
$post = get_post($postId);
$response = [
"code" => 0,
"message" => "
" . esc_html($this->options->getPhrase("wc_user_settings_email_error")) . "
"
];
if ($post && $guestEmail) {
$hashValue = $this->helperEmail->generateUserActionHash($guestEmail);
$mainUrl = home_url("/wpdiscuzsubscription/");
$link = "";
$message = "";
$siteUrl = get_site_url();
$blogTitle = html_entity_decode(get_option("blogname"), ENT_QUOTES);
if ($guestAction === "deletecomments") {
$link = $mainUrl . "deletecomments/?key=$hashValue";
$subject = $this->options->getPhrase("wc_user_settings_delete_all_comments");
$message = $this->options->getPhrase("wc_user_settings_delete_all_comments_message");
if (strpos($message, "[DELETE_COMMENTS_URL]") !== false) {
$message = str_replace("[DELETE_COMMENTS_URL]", $link, $message);
}
} elseif ($guestAction === "deleteSubscriptions") {
$subject = $this->options->getPhrase("wc_user_settings_delete_all_subscriptions");
$link = $mainUrl . "/deleteSubscriptions/?key=$hashValue";
$message = $this->options->getPhrase("wc_user_settings_delete_all_subscriptions_message");
if (strpos($message, "[DELETE_SUBSCRIPTIONS_URL]") !== false) {
$message = str_replace("[DELETE_SUBSCRIPTIONS_URL]", $link, $message);
}
}
$subject = str_replace(["[SITE_URL]", "[BLOG_TITLE]"], [$siteUrl, $blogTitle], $subject);
$message = str_replace(["[SITE_URL]", "[BLOG_TITLE]"], [$siteUrl, $blogTitle], $message);
if ($this->helperEmail->userActionMail($guestEmail, $subject, $message)) {
$response["code"] = 1;
$parts = explode("@", $guestEmail);
$guestEmail = substr($parts[0], 0, min(1, strlen($parts[0]) - 1)) . str_repeat("*", max(1, strlen($parts[0]) - 1)) . "@" . $parts[1];
$response["message"] = "" . esc_html($this->options->getPhrase("wc_user_settings_check_email")) . " ($guestEmail)" . "
";
}
}
wp_die(json_encode($response));
}
public function followUser()
{
$this->helper->validateNonce();
$postId = WpdiscuzHelper::sanitize(INPUT_POST, "postId", FILTER_SANITIZE_NUMBER_INT, 0);
$commentId = WpdiscuzHelper::sanitize(INPUT_POST, "commentId", FILTER_SANITIZE_NUMBER_INT, 0);
if ($postId && $commentId) {
$comment = get_comment($commentId);
if ($comment && $comment->comment_author_email) {
$currentUser = WpdiscuzHelper::getCurrentUser();
if ($currentUser && $currentUser->ID) {
$args = [
"post_id" => $comment->comment_post_ID,
"user_id" => $comment->user_id,
"user_email" => $comment->comment_author_email,
"user_name" => $comment->comment_author,
"follower_id" => $currentUser->ID,
"follower_email" => $currentUser->user_email,
"follower_name" => $currentUser->display_name,
"confirm" => $this->options->subscription["disableFollowConfirmForUsers"],
];
$followExists = $this->dbManager->isFollowExists($comment->comment_author_email, $currentUser->user_email);
if ($followExists) {
$response = [];
if (intval($followExists["confirm"])) { // confirmed follow already exists
$response["code"] = "wc_follow_canceled";
$this->dbManager->cancelFollow($followExists["id"], $followExists["activation_key"]);
$response["followTip"] = esc_attr($this->options->getPhrase("wc_follow_user", ["comment" => $comment]));
do_action("wpdiscuz_follow_cancelled", $args);
} else { // follow exists but not confirmed yet, send confirm email again if neccessary
if ($this->options->subscription["disableFollowConfirmForUsers"]) {
$this->dbManager->confirmFollow($followExists["id"], $followExists["activation_key"]);
$response["code"] = "wc_follow_success";
$response["followClass"] = "wpd-follow-active";
$response["followTip"] = esc_attr($this->options->getPhrase("wc_unfollow_user", ["comment" => $comment]));
do_action("wpdiscuz_follow_added", $args);
} else {
$this->followConfirmAction($comment->comment_post_ID, $followExists["id"], $followExists["activation_key"], $args["follower_email"]);
}
}
wp_send_json_success($response);
} else {
$followData = $this->dbManager->addNewFollow($args);
if ($followData) {
if ($this->options->subscription["disableFollowConfirmForUsers"]) {
$response = [];
$response["code"] = "wc_follow_success";
$response["followClass"] = "wpd-follow-active";
$response["followTip"] = esc_attr($this->options->getPhrase("wc_unfollow_user", ["comment" => $comment]));
do_action("wpdiscuz_follow_added", $args);
$response["callbackFunctions"] = [];
$response = apply_filters("wpdiscuz_ajax_callbacks", $response, $action = "wpdFollowUser");
wp_send_json_success($response);
} else {
$this->followConfirmAction($comment->comment_post_ID, $followData["id"], $followData["activation_key"], $args["follower_email"]);
}
} else {
wp_send_json_error("wc_follow_not_added");
}
}
} else {
wp_send_json_error("wc_follow_login_to_follow");
}
} else {
wp_send_json_error("wc_follow_impossible");
}
}
}
private function followConfirmAction($postId, $id, $key, $email)
{
$send = $this->helperEmail->followConfirmEmail($postId, $id, $key, $email);
if ($send) {
wp_send_json_success(["code" => "wc_follow_email_confirm"]);
} else {
$this->dbManager->cancelFollow($id, $key);
wp_send_json_error("wc_follow_email_confirm_fail");
}
}
public function regenerateVoteMetas()
{
$this->helper->validateNonce();
$response = ["progress" => 0];
$voteRegenerateData = isset($_POST["voteRegenerateData"]) ? $_POST["voteRegenerateData"] : "";
if ($voteRegenerateData) {
parse_str($voteRegenerateData, $data);
$limit = !empty($data["vote-regenerate-limit"]) ? intval($data["vote-regenerate-limit"]) : 500;
$step = !empty($data["vote-regenerate-step"]) ? intval($data["vote-regenerate-step"]) : 0;
$voteRegenerateCount = !empty($data["vote-regenerate-count"]) ? intval($data["vote-regenerate-count"]) : 0;
$voteRegenerateStartId = !empty($data["vote-regenerate-start-id"]) ? intval($data["vote-regenerate-start-id"]) : 0;
$nonce = !empty($data["wpd-vote-regenerate"]) ? trim($data["wpd-vote-regenerate"]) : "";
if (wp_verify_nonce($nonce, "wc_tools_form") && $voteRegenerateCount && $voteRegenerateStartId >= 0 && $limit) {
$voteRegenerateVoteData = $this->dbManager->getVoteRegenerateData($voteRegenerateStartId, $limit);
if ($voteRegenerateVoteData) {
$this->dbManager->regenerateVoteMetas($voteRegenerateVoteData);
++$step;
$progress = $step * $limit * 100 / $voteRegenerateCount;
$response["progress"] = ($p = intval($progress)) > 100 ? 100 : $p;
$response["startId"] = $voteRegenerateVoteData[count($voteRegenerateVoteData) - 1];
if ($response["progress"] == 100) {
update_option(self::OPTION_SLUG_SHOW_VOTE_REG_MESSAGE, "0");
}
} else {
$response["progress"] = 100;
$response["startId"] = 0;
update_option(self::OPTION_SLUG_SHOW_VOTE_REG_MESSAGE, "0");
}
$response["step"] = $step;
}
}
wp_die(json_encode($response));
}
public function regenerateClosedComments()
{
$this->helper->validateNonce();
$response = ["progress" => 0];
$closedRegenerateData = isset($_POST["closedRegenerateData"]) ? sanitize_textarea_field($_POST["closedRegenerateData"]) : "";
if ($closedRegenerateData) {
parse_str($closedRegenerateData, $data);
$limit = !empty($data["closed-regenerate-limit"]) ? intval($data["closed-regenerate-limit"]) : 500;
$step = isset($data["closed-regenerate-step"]) ? intval($data["closed-regenerate-step"]) : 0;
$closedRegenerateCount = isset($data["closed-regenerate-count"]) ? intval($data["closed-regenerate-count"]) : 0;
$closedRegenerateStartId = isset($data["closed-regenerate-start-id"]) ? intval($data["closed-regenerate-start-id"]) : 0;
$nonce = isset($data["wpd-closed-regenerate"]) ? trim($data["wpd-closed-regenerate"]) : "";
if (wp_verify_nonce($nonce, "wc_tools_form") && $closedRegenerateCount && $closedRegenerateStartId >= 0 && $limit) {
$closedRegenerateClosedData = $this->dbManager->getClosedRegenerateData($closedRegenerateStartId, $limit);
if ($closedRegenerateClosedData) {
$this->dbManager->regenerateClosedComments($closedRegenerateClosedData);
++$step;
$progress = $step * $limit * 100 / $closedRegenerateCount;
$response["progress"] = ($p = intval($progress)) > 100 ? 100 : $p;
$response["startId"] = $closedRegenerateClosedData[count($closedRegenerateClosedData) - 1];
if ($response["progress"] == 100) {
update_option(self::OPTION_SLUG_SHOW_CLOSED_REG_MESSAGE, "0");
}
} else {
$response["progress"] = 100;
$response["startId"] = 0;
update_option(self::OPTION_SLUG_SHOW_CLOSED_REG_MESSAGE, "0");
}
$response["step"] = $step;
}
}
wp_die(json_encode($response));
}
public function regenerateVoteData()
{
$response = ["progress" => 0];
$regenerateVoteData = isset($_POST["regenerateVoteData"]) ? sanitize_textarea_field($_POST["regenerateVoteData"]) : "";
if ($regenerateVoteData) {
parse_str($regenerateVoteData, $data);
$limit = !empty($data["regenerate-vote-data-limit"]) ? intval($data["regenerate-vote-data-limit"]) : 500;
$step = isset($data["regenerate-vote-data-step"]) ? intval($data["regenerate-vote-data-step"]) : 0;
$regenerateVoteDataCount = isset($data["regenerate-vote-data-count"]) ? intval($data["regenerate-vote-data-count"]) : 0;
$regenerateVoteDataStartId = isset($data["regenerate-vote-data-start-id"]) ? intval($data["regenerate-vote-data-start-id"]) : 0;
$nonce = isset($data["wpd-regenerate-vote-data"]) ? trim($data["wpd-regenerate-vote-data"]) : "";
if (wp_verify_nonce($nonce, "wc_tools_form") && $regenerateVoteDataCount && $regenerateVoteDataStartId >= 0 && $limit) {
$voteDataRegenerateData = $this->dbManager->getVoteDataRegenerateData($regenerateVoteDataStartId, $limit);
if ($voteDataRegenerateData) {
$this->dbManager->regenerateVoteData($voteDataRegenerateData);
++$step;
$progress = $step * $limit * 100 / $regenerateVoteDataCount;
$response["progress"] = ($p = intval($progress)) > 100 ? 100 : $p;
$response["startId"] = $voteDataRegenerateData[count($voteDataRegenerateData) - 1];
if ($response["progress"] == 100) {
update_option(self::OPTION_SLUG_SHOW_VOTE_DATA_REG_MESSAGE, "0");
}
} else {
$response["progress"] = 100;
$response["startId"] = 0;
update_option(self::OPTION_SLUG_SHOW_VOTE_DATA_REG_MESSAGE, "0");
}
$response["step"] = $step;
}
}
wp_die(json_encode($response));
}
public function syncCommenterData()
{
$this->helper->validateNonce();
$syncCommenterData = !empty($_POST["syncCommenterData"]) ? sanitize_textarea_field($_POST["syncCommenterData"]) : "";
if ($syncCommenterData) {
parse_str($syncCommenterData, $data);
$nonce = !empty($data["wpd-sync-commenters"]) ? trim($data["wpd-sync-commenters"]) : "";
if (wp_verify_nonce($nonce, "wc_tools_form")) {
$this->dbManager->updateCommentersData();
update_option(self::OPTION_SLUG_SHOW_SYNC_COMMENTERS_MESSAGE, "0");
wp_send_json_success();
}
}
wp_send_json_error();
}
public function rebuildRatings()
{
$this->helper->validateNonce();
$response = ["progress" => 0];
$rebuildRatings = isset($_POST["rebuildRatings"]) ? sanitize_textarea_field($_POST["rebuildRatings"]) : "";
if ($rebuildRatings) {
parse_str($rebuildRatings, $data);
$step = isset($data["rebuild-ratings-step"]) ? intval($data["rebuild-ratings-step"]) : 0;
$rebuildRatingsCount = isset($data["rebuild-ratings-count"]) ? intval($data["rebuild-ratings-count"]) : 0;
$rebuildRatingsStartId = isset($data["rebuild-ratings-start-id"]) ? intval($data["rebuild-ratings-start-id"]) : 0;
$nonce = isset($data["wpd-rebuild-ratings"]) ? trim($data["wpd-rebuild-ratings"]) : "";
if (wp_verify_nonce($nonce, "wc_tools_form") && $rebuildRatingsCount && $rebuildRatingsStartId >= 0) {
$limit = 1;
$rebuildRatingsData = $this->dbManager->getRebuildRatingsData($rebuildRatingsStartId, $limit);
if ($rebuildRatingsData) {
$this->dbManager->rebuildRatings($rebuildRatingsData);
++$step;
$progress = $step * $limit * 100 / $rebuildRatingsCount;
$response["progress"] = ($p = intval($progress)) > 100 ? 100 : $p;
$response["startId"] = $rebuildRatingsData[count($rebuildRatingsData) - 1]["meta_id"];
if ($response["progress"] == 100) {
update_option(self::OPTION_SLUG_SHOW_RATING_REBUIL_MSG, "0");
}
} else {
$response["progress"] = 100;
$response["startId"] = 0;
update_option(self::OPTION_SLUG_SHOW_RATING_REBUIL_MSG, "0");
}
$response["step"] = $step;
}
}
wp_die(json_encode($response));
}
public function fixTables()
{
$this->helper->validateNonce();
$fixTables = isset($_POST["fixTables"]) ? sanitize_textarea_field($_POST["fixTables"]) : "";
if ($fixTables) {
parse_str($fixTables, $data);
$nonce = !empty($data["wpd-fix-tables"]) ? trim($data["wpd-fix-tables"]) : "";
if (wp_verify_nonce($nonce, "wc_tools_form")) {
$this->dbManager->fixTables();
wp_send_json_success();
}
}
wp_send_json_error();
}
/**
* loads the comment content on click via ajax
*/
public function readMore()
{
$commentId = WpdiscuzHelper::sanitize(INPUT_POST, "commentId", FILTER_SANITIZE_NUMBER_INT, 0);
if ($commentId) {
$comment = get_comment($commentId);
$form = $this->wpdiscuzForm->getForm($comment->comment_post_ID);
if ($form->isUserCanSeeComments(WpdiscuzHelper::getCurrentUser(), $comment->comment_post_ID)) {
$commentContent = $this->helper->filterCommentText($comment->comment_content);
if ($this->options->content["enableImageConversion"]) {
$commentContent = $this->helper->makeClickable($commentContent);
}
$commentContent = apply_filters("comment_text", $commentContent, $comment, ["is_wpdiscuz_comment" => true]);
$commentContent = apply_filters("wpdiscuz_after_read_more", $commentContent, $comment, ["is_wpdiscuz_comment" => true]);
$inlineContent = "";
if ($inlineFormID = intval(get_comment_meta($comment->comment_ID, self::META_KEY_FEEDBACK_FORM_ID, true))) {
$feedbackForm = $this->dbManager->getFeedbackForm($inlineFormID);
$inlineContent = "";
}
$components = $this->helper->getComponents($form->getTheme(), $form->getLayout());
$response = [
"message" => str_replace(["{TEXT_WRAPPER_CLASSES}", "{TEXT}"], [
"wpd-comment-text",
$inlineContent . $commentContent
], $components["text.html"]),
"callbackFunctions" => [],
];
$response = apply_filters("wpdiscuz_ajax_callbacks", $response, $action = "wpdReadMore");
wp_send_json_success($response);
} else {
wp_send_json_error("error");
}
} else {
wp_send_json_error("error");
}
}
/**
* redirect first commenter to the selected page from options
*/
public function redirect()
{
$commentId = WpdiscuzHelper::sanitize(INPUT_POST, "commentId", FILTER_SANITIZE_NUMBER_INT, 0);
if ($this->options->general["redirectPage"] && $commentId) {
$comment = get_comment($commentId);
if ($comment->comment_ID) {
$userCommentCount = get_comments(["author_email" => $comment->comment_author_email, "count" => true]);
if ($userCommentCount == 1) {
wp_send_json_success(get_permalink($this->options->general["redirectPage"]));
}
}
}
}
public function voteOnComment()
{
$this->helper->validateNonce();
if ($this->helper->isBanned()) {
wp_send_json_error("wc_banned_user");
}
$isUserLoggedIn = is_user_logged_in();
if (!$this->options->thread_layouts["isGuestCanVote"] && !$isUserLoggedIn) {
wp_send_json_error("wc_login_to_vote");
}
$commentId = WpdiscuzHelper::sanitize(INPUT_POST, "commentId", FILTER_SANITIZE_NUMBER_INT, 0);
$voteType = WpdiscuzHelper::sanitize(INPUT_POST, "voteType", FILTER_SANITIZE_NUMBER_INT, 0);
if ($commentId && $voteType && ($voteType != -1 || ($voteType == -1 && $this->options->thread_layouts["enableDislikeButton"]))) {
if ($isUserLoggedIn) {
$userIdOrIp = get_current_user_id();
} else {
$userIdOrIp = md5($this->helper->getRealIPAddr());
}
$isUserVoted = $this->dbManager->isUserVoted($userIdOrIp, $commentId);
$comment = get_comment($commentId);
if (!$isUserLoggedIn && md5($comment->comment_author_IP) == $userIdOrIp) {
wp_send_json_error("wc_deny_voting_from_same_ip");
}
if ($comment->user_id == $userIdOrIp) {
wp_send_json_error("wc_self_vote");
}
$response = [];
if ($isUserVoted != "") {
$isUserVotedInt = intval($isUserVoted);
$vote = $isUserVotedInt + $voteType;
if (($vote >= -1 && $vote <= 1) || ($vote == 2 && !$this->options->thread_layouts["enableDislikeButton"])) {
if ($vote == 2) {
$vote = 0;
$voteType = -1;
}
$this->dbManager->updateVoteType($userIdOrIp, $commentId, $vote, current_time("timestamp"));
$voteCount = intval(get_comment_meta($commentId, self::META_KEY_VOTES, true)) + $voteType;
update_comment_meta($commentId, self::META_KEY_VOTES, "" . $voteCount);
$votesSeparate = get_comment_meta($commentId, self::META_KEY_VOTES_SEPARATE, true);
$votesSeparate = is_array($votesSeparate) ? $votesSeparate : ["like" => 0, "dislike" => 0];
if ($vote == 0) {
if ($isUserVotedInt == 1) {
$votesSeparate["like"] -= 1;
} else if ($isUserVotedInt == -1) {
$votesSeparate["dislike"] -= 1;
}
} else {
if ($voteType == 1) {
$votesSeparate["like"] += 1;
} else if ($voteType == -1) {
$votesSeparate["dislike"] += 1;
}
}
update_comment_meta($commentId, self::META_KEY_VOTES_SEPARATE, $votesSeparate);
do_action("wpdiscuz_update_vote", $voteType, $isUserVoted, $comment);
if ($this->options->thread_layouts["votingButtonsStyle"]) {
$response["buttonsStyle"] = "separate";
$response["likeCount"] = esc_html($votesSeparate["like"]);
$response["likeCountHumanReadable"] = esc_html($this->helper->getNumber($votesSeparate["like"]));
$response["dislikeCount"] = esc_html(-$votesSeparate["dislike"]);
$response["dislikeCountHumanReadable"] = esc_html($this->helper->getNumber(-$votesSeparate["dislike"]));
} else {
$response["buttonsStyle"] = "total";
$response["votes"] = esc_html($voteCount);
$response["votesHumanReadable"] = esc_html($this->helper->getNumber($voteCount));
}
$response["curUserReaction"] = $vote;
} else {
wp_send_json_error("wc_vote_only_one_time");
}
} else {
$this->dbManager->addVoteType($userIdOrIp, $commentId, $voteType, intval($isUserLoggedIn), $comment->comment_post_ID, current_time("timestamp"));
$voteCount = intval(get_comment_meta($commentId, self::META_KEY_VOTES, true)) + $voteType;
update_comment_meta($commentId, self::META_KEY_VOTES, "" . $voteCount);
$votesSeparate = get_comment_meta($commentId, self::META_KEY_VOTES_SEPARATE, true);
$votesSeparate = is_array($votesSeparate) ? $votesSeparate : ["like" => 0, "dislike" => 0];
if ($voteType == 1) {
$votesSeparate["like"] += 1;
} else if ($voteType == -1) {
$votesSeparate["dislike"] += 1;
}
update_comment_meta($commentId, self::META_KEY_VOTES_SEPARATE, $votesSeparate);
do_action("wpdiscuz_add_vote", $voteType, $comment);
if ($this->options->thread_layouts["votingButtonsStyle"]) {
$response["buttonsStyle"] = "separate";
$response["likeCount"] = esc_html($votesSeparate["like"]);
$response["likeCountHumanReadable"] = esc_html($this->helper->getNumber($votesSeparate["like"]));
$response["dislikeCount"] = esc_html(-$votesSeparate["dislike"]);
$response["dislikeCountHumanReadable"] = esc_html($this->helper->getNumber(-$votesSeparate["dislike"]));
} else {
$response["buttonsStyle"] = "total";
$response["votes"] = esc_html($voteCount);
$response["votesHumanReadable"] = esc_html($this->helper->getNumber($voteCount));
}
$response["curUserReaction"] = $voteType;
}
$response["callbackFunctions"] = [];
$response = apply_filters("wpdiscuz_ajax_callbacks", $response, $action = "wpdVoteOnComment");
$response = apply_filters("wpdiscuz_comment_vote", $response);
if ($this->options->thread_display["mostVotedByDefault"]) {
do_action("wpdiscuz_reset_comments_cache", $comment->comment_post_ID);
} else {
do_action("wpdiscuz_reset_comments_extra_cache", $comment->comment_post_ID);
}
do_action("wpdiscuz_clean_post_cache", $comment->comment_post_ID, "comment_voted");
wp_send_json_success($response);
} else {
wp_send_json_error("wc_voting_error");
}
}
public function getInlineCommentForm()
{
$post_id = WpdiscuzHelper::sanitize(INPUT_POST, "postId", FILTER_SANITIZE_NUMBER_INT, 0);
if ($post_id && apply_filters("wpdiscuz_enable_feedback_shortcode_button", true) && $this->dbManager->postHasFeedbackForms($post_id)) {
$currentUser = WpdiscuzHelper::getCurrentUser();
$form = $this->wpdiscuzForm->getForm($post_id);
if ($form->isUserCanComment($currentUser, $post_id)) {
$response = "";
wp_send_json_success($response);
}
}
}
public function getLastInlineComments()
{
$inline_form_id = WpdiscuzHelper::sanitize(INPUT_POST, "inline_form_id", FILTER_SANITIZE_NUMBER_INT, 0);
if ($inline_form_id && apply_filters("wpdiscuz_enable_feedback_shortcode_button", true) && ($inline_form = $this->dbManager->getFeedbackForm($inline_form_id))) {
$args = [
"orderby" => $this->options->thread_display["orderCommentsBy"],
"order" => "DESC",
"number" => 3,
"status" => !$this->options->wp["isPaginate"] && current_user_can("moderate_comments") ? "all" : "approve",
"meta_query" => [
[
"key" => self::META_KEY_FEEDBACK_FORM_ID,
"value" => $inline_form->id,
"compare" => "=",
],
],
];
$comments = get_comments($args);
$content = "";
if ($comments) {
$content .= "";
}
wp_send_json_success($content);
} else {
wp_send_json_error("wc_msg_required_fields");
}
}
/**
* get comment text from db
*/
public function editComment()
{
$this->helper->validateNonce();
$commentId = WpdiscuzHelper::sanitize(INPUT_POST, "commentId", FILTER_SANITIZE_NUMBER_INT, 0);
if ($commentId) {
$comment = get_comment($commentId);
$postID = $comment->comment_post_ID;
$form = $this->wpdiscuzForm->getForm($postID);
$form->initFormFields();
$currentUser = WpdiscuzHelper::getCurrentUser();
$highLevelUser = current_user_can("moderate_comments");
$isCurrentUserCanEdit = $this->helper->isCommentEditable($comment) && $this->helper->canUserEditComment($comment, $currentUser);
if (!intval(get_comment_meta($comment->comment_ID, self::META_KEY_CLOSED, true)) && ($highLevelUser || $isCurrentUserCanEdit)) {
wp_send_json_success($form->renderEditFrontCommentForm($comment));
} else {
wp_send_json_error("wc_comment_edit_not_possible");
}
} else {
wp_send_json_error("wc_comment_edit_not_possible");
}
}
public function userRate()
{
$this->helper->validateNonce();
$rating = WpdiscuzHelper::sanitize(INPUT_POST, "rating", FILTER_SANITIZE_NUMBER_INT, 0);
$post_id = WpdiscuzHelper::sanitize(INPUT_POST, "postId", FILTER_SANITIZE_NUMBER_INT, 0);
/**
* @var $form \wpdFormAttr\Form
*/
$form = $this->wpdiscuzForm->getForm($post_id);
$form->initFormMeta();
$formOptions = $form->getGeneralOptions();
if ($rating && $post_id && $form) {
$currentUser = $this->helper->getCurrentUser();
if (!empty($currentUser->ID)) {
$rateId = $this->dbManager->isUserRated($currentUser->ID, "", $post_id);
if (!$rateId || ($rateId && $formOptions["is_rate_editable"])) {
$this->dbManager->addRate($post_id, $currentUser->ID, "", $rating, current_time("timestamp"), $rateId);
$data = $this->dbManager->getPostRatingData($post_id);
$votes = 0;
foreach ($data as $value) {
$votes += $value;
}
$count = count($data);
update_post_meta($post_id, self::POSTMETA_POST_RATING, round($votes / $count, 1));
update_post_meta($post_id, self::POSTMETA_POST_RATING_COUNT, $count);
do_action("wpdiscuz_add_rating", $rating, $post_id);
do_action("wpdiscuz_clean_post_cache", $post_id, "user_rated");
$response = ["callbackFunctions" => []];
$response = apply_filters("wpdiscuz_ajax_callbacks", $response, $action = "wpdUserRate");
wp_send_json_success($response);
} else {
wp_send_json_error("wc_cannot_rate_again");
}
} else if ($form->getUserCanRateOnPost()) {
$userIp = md5($this->helper->getRealIPAddr());
$rateId = $this->dbManager->isUserRated(0, $userIp, $post_id);
if (!$rateId || ($rateId && $formOptions["is_rate_editable"])) {
$this->dbManager->addRate($post_id, 0, $userIp, $rating, current_time("timestamp"), $rateId);
$data = $this->dbManager->getPostRatingData($post_id);
$votes = 0;
foreach ($data as $value) {
$votes += $value;
}
$count = count($data);
update_post_meta($post_id, self::POSTMETA_POST_RATING, round($votes / $count, 1));
update_post_meta($post_id, self::POSTMETA_POST_RATING_COUNT, $count);
do_action("wpdiscuz_add_rating", $rating, $post_id);
do_action("wpdiscuz_clean_post_cache", $post_id, "user_rated");
$response = ["callbackFunctions" => []];
$response = apply_filters("wpdiscuz_ajax_callbacks", $response, $action = "wpdUserRate");
wp_send_json_success($response);
} else {
wp_send_json_error("wc_cannot_rate_again");
}
} else {
wp_send_json_error("wc_not_allowed_to_rate");
}
} else {
wp_send_json_error("wc_msg_required_fields");
}
}
public function unsubscribe()
{
$this->helper->validateNonce();
$sid = WpdiscuzHelper::sanitize(INPUT_POST, "sid", FILTER_SANITIZE_NUMBER_INT, 0);
$skey = WpdiscuzHelper::sanitize(INPUT_POST, "skey", "FILTER_SANITIZE_STRING");
if ($sid && $skey) {
$this->dbManager->unsubscribe($sid, $skey);
wp_send_json_success(esc_html($this->options->getPhrase("wc_unsubscribe_message")));
}
wp_send_json_error("Something is wrong");
}
public function wpd_stat_brief()
{
check_ajax_referer("wpd-option-nonce", "security");
if (!current_user_can("manage_options")) {
wp_send_json_error("Permission denied");
}
wp_send_json_success(["all" => esc_html($this->dbManager->getCommentsCount()), "inline" => esc_html($this->dbManager->getInlineCommentsCount()), "threads" => esc_html($this->dbManager->getThreadsCount()), "replies" => esc_html($this->dbManager->getRepliesCount()), "users" => esc_html($this->dbManager->getUserCommentersCount()), "guests" => esc_html($this->dbManager->getGuestCommentersCount())]);
}
public function wpd_stat_subs()
{
check_ajax_referer("wpd-option-nonce", "security");
if (!current_user_can("manage_options")) {
wp_die("Permission denied");
}
ob_start();
?>
-
dbManager->getAllSubscribersCount()); ?>
-
dbManager->getPostSubscribersCount()); ?>
-
dbManager->getAllCommentSubscribersCount()); ?>
-
dbManager->getCommentSubscribersCount()); ?>
-
dbManager->getFollowersCount()); ?>
-
dbManager->getFollowingCount()); ?>
dbManager->getGraphAllComments($interval);
$inline = $this->dbManager->getGraphInlineComments($interval);
$diffInline = array_diff(array_keys($all), array_keys($inline));
$diffAll = array_diff(array_keys($inline), array_keys($all));
$combInline = array_combine($diffInline, array_pad([], count($diffInline), 0));
$combAll = array_combine($diffAll, array_pad([], count($diffAll), 0));
foreach ($combAll as $key => $val) {
$all[$key] = $val;
}
foreach ($combInline as $key => $val) {
$inline[$key] = $val;
}
ksort($all);
ksort($inline);
$data = [
"el" => "",
"all" => array_values($all),
"inline" => array_values($inline),
"labels" => array_map(function ($v) {
return esc_html(date("d M", $v));
}, array_keys($all)),
];
wp_send_json_success($data);
}
wp_send_json_error();
}
public function wpd_stat_user()
{
check_ajax_referer("wpd-option-nonce", "security");
if (!current_user_can("manage_options")) {
wp_send_json_error("Permission denied");
}
$orderby = WpdiscuzHelper::sanitize(INPUT_POST, "orderby", "FILTER_SANITIZE_STRING");
$order = WpdiscuzHelper::sanitize(INPUT_POST, "order", "FILTER_SANITIZE_STRING");
$page = WpdiscuzHelper::sanitize(INPUT_POST, "page", "FILTER_SANITIZE_STRING");
if ($orderby && $order && $page) {
ob_start();
?>
|
"
data-orderby="comments">
class="dashicons ">
|
"
data-orderby="subscriptions">
class="dashicons ">
|
"
data-orderby="following">
class="dashicons ">
|
"
data-orderby="followers">
class="dashicons ">
|
"
data-orderby="last_activity">
class="dashicons ">
|
dbManager->getActiveUsers($orderby, $order, $page);
$more = false;
if (count($activeUsers) > 6) {
$more = true;
array_pop($activeUsers);
}
$data["more"] = $more;
foreach ($activeUsers as $k => $val) {
?>
|
> |
> |
> |
> |
> |
options;
$settings = $this->options->settingsArray();
$result = [];
foreach ($settings as $type) {
foreach ($type as $tabKey => $tab) {
foreach ($tab["options"] as $optKey => $val) {
if (stripos($tab["title"], $search) !== false || stripos($tab["title_original"], $search) !== false) {
if (!isset($result[$tabKey])) {
$result[$tabKey] = ["" . esc_html($tab["title"]) . ""];
}
}
if ((isset($val["label"]) && stripos($val["label"], $search) !== false) ||
(isset($val["description"]) && stripos($val["description"], $search) !== false) ||
(isset($val["label_original"]) && stripos($val["label_original"], $search) !== false) ||
(isset($val["description_original"]) && stripos($val["description_original"], $search) !== false) ||
stripos($optKey, $search)) {
$fragment = empty($val["accordion"]) ? "wpd_tab={$tabKey}#wpdOpt-{$optKey}" : "&wpd_tab={$tabKey}#{$val["accordion"]}#wpdOpt-{$optKey}";
if (isset($result[$tabKey])) {
$result[$tabKey][$optKey] = "" . esc_html($val["label"]) . "";
} else {
$result[$tabKey] = ["" . esc_html($tab["title"]) . ""];
if (!isset($result[$tabKey][$optKey])) {
$result[$tabKey][$optKey] = "" . esc_html($val["label"]) . "";
}
}
}
}
}
}
$output = "";
foreach ($result as $tabKey => $tabOptions) {
if (is_array($tabOptions) && !empty($tabOptions)) {
foreach ($tabOptions as $tabOption) {
$output .= $tabOption;
}
}
}
wp_die($output);
}
}
public function resetPostRating()
{
check_ajax_referer("wpd-reset-rating", "security");
$postId = WpdiscuzHelper::sanitize(INPUT_POST, "postId", FILTER_SANITIZE_NUMBER_INT, 0);
if ($postId) {
if (current_user_can("edit_post", $postId)) {
delete_post_meta($postId, self::POSTMETA_POST_RATING);
delete_post_meta($postId, self::POSTMETA_POST_RATING_COUNT);
$this->dbManager->removeRatings($postId);
do_action("wpdiscuz_clean_post_cache", $postId, "ratings_reset");
wp_send_json_success();
}
}
wp_send_json_error();
}
public function resetFieldsRatings()
{
check_ajax_referer("wpd-reset-rating", "security");
$postId = WpdiscuzHelper::sanitize(INPUT_POST, "postId", FILTER_SANITIZE_NUMBER_INT, 0);
if ($postId) {
if (current_user_can("edit_post", $postId)) {
$postMeta = get_post_meta($postId, self::POSTMETA_RATING_COUNT, true);
if ($postMeta) {
foreach ($postMeta as $key => $value) {
$this->dbManager->deleteCommentMeta($key);
update_post_meta($postId, self::POSTMETA_RATING_SEPARATE_AVG . $key, 0);
update_post_meta($postId, self::POSTMETA_RATING_SEPARATE_COUNT . $key, 0);
}
update_post_meta($postId, self::POSTMETA_RATING_COUNT, []);
}
wp_send_json_success();
}
}
wp_send_json_error();
}
}