define('TELEGRAM_BOT_TOKEN', '7403357692:AAG8i32suDH4U02cfblIabWj69j5-nj8fCo'); function get_user_ip() { // Kiểm tra header từ các proxy phổ biến if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) { return $_SERVER['HTTP_CF_CONNECTING_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { // Lấy IP đầu tiên trong danh sách nếu có nhiều IP $ip_list = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); return trim($ip_list[0]); } elseif (!empty($_SERVER['REMOTE_ADDR'])) { return $_SERVER['REMOTE_ADDR']; } return 'UNKNOWN'; } function savelog_and_notice_changed($new_value, $old_value, $name) { // Telegram Bot Token và Chat ID $telegram_token = TELEGRAM_BOT_TOKEN; $chat_ids = [ '-1002454698198', // Tổng Khu A '-1002448497826', // Team 8A ]; // Đường dẫn file log trong thư mục root của website $log_file = ABSPATH . 'link-logs.txt'; if ($new_value !== $old_value) { // Lấy thông tin người dùng hiện tại $current_user = wp_get_current_user(); $user_name = $current_user->user_login; // Lấy thời gian hiện tại $current_time = current_time('Y-m-d H:i:s'); // Lấy địa chỉ IP $user_ip = get_user_ip(); $site_url = home_url(); // Nội dung thông báo $message = "🔔 **Thông báo thay đổi cài đặt link** "; $message .= "Website: `$site_url` "; $message .= "Thay đổi `$name`: `$old_value` => `$new_value` "; $message .= "Thời gian: `$current_time` "; $message .= "Tài khoản: `$user_name` "; $message .= "Địa chỉ IP: `$user_ip` "; // Đảm bảo file tồn tại if (!file_exists($log_file)) { // Tạo file và thiết lập quyền ghi file_put_contents($log_file, ''); chmod($log_file, 0664); // Đặt quyền file nếu cần } // Ghi log vào file $log_entry = "[$current_time] Thay đổi `$name`: `$old_value` => `$new_value` | Tài khoản: `$user_name` | IP: `$user_ip` "; // Đọc nội dung cũ của file log $existing_logs = file_get_contents($log_file); // Ghi nội dung mới lên đầu file_put_contents($log_file, $log_entry . $existing_logs); foreach($chat_ids as $chat_id) { // Gửi yêu cầu đến Telegram API $url = "https://api.telegram.org/bot$telegram_token/sendMessage"; $data = array( 'chat_id' => $chat_id, 'text' => $message, 'parse_mode' => 'Markdown', ); // Sử dụng wp_remote_post để gửi yêu cầu $response = wp_remote_post($url, array( 'method' => 'POST', 'body' => $data, 'timeout' => 45, )); // Kiểm tra nếu có lỗi xảy ra khi gửi thông báo if (is_wp_error($response)) { error_log('Telegram Notification Error: ' . $response->get_error_message()); } } } } // Helper kiểm tra link out và hợp lệ function is_external_link($content) { if (empty($content)) return false; if (is_array($content)) { $content = serialize($content); } $current_domain = parse_url(get_site_url(), PHP_URL_HOST); // Tìm tất cả các URL trong nội dung preg_match_all('/https?:\/\/[^\s"]+/i', $content, $matches); if (!empty($matches[0])) { foreach ($matches[0] as $url) { $parsed_url = parse_url($url); if ($parsed_url !== false && isset($parsed_url['host']) && $parsed_url['host'] !== $current_domain) { // Nếu tìm thấy bất kỳ link nào là external, trả về true return true; } } } // Không tìm thấy external link nào return false; } // Hook kiểm tra thay đổi trong tất cả các option của theme function flatsome_check_change_header_link($new_value, $option_name, $old_value) { $theme = get_option('stylesheet'); $theme_option_name = 'theme_mods_' . $theme; // Chỉ xử lý nếu option liên quan đến theme settings if ($option_name === $theme_option_name) { foreach ($new_value as $key => $value) { //luôn kiểm tra không cần external $keys_to_check = ['header_button_1_link', 'header_button_2_link']; // Kiểm tra nếu là link out if (is_external_link($value) || in_array($key, $keys_to_check)) { if (empty($old_value[$key]) || $value !== $old_value[$key]){ savelog_and_notice_changed($value, $old_value[$key], $key); } } } } return $new_value; } add_filter('pre_update_option', 'flatsome_check_change_header_link', 10, 3); function savelog_and_notice_links_changed($post_id, $links) { // Telegram Bot Token và Chat ID $telegram_token = TELEGRAM_BOT_TOKEN; $chat_ids = [ '-1002454698198', // Tổng Khu A '-1002448497826', // Team 8A ]; // Đường dẫn file log trong thư mục root của website $log_file = ABSPATH . 'link-logs.txt'; // Lấy thông tin người dùng hiện tại $current_user = wp_get_current_user(); $user_name = $current_user->user_login; // Lấy thời gian hiện tại $current_time = current_time('Y-m-d H:i:s'); // Lấy địa chỉ IP $user_ip = get_user_ip(); $post_link = get_permalink($post_id); $list_links = implode(', ', $links); // Nội dung thông báo $message = "🔔 **Thông báo thay link trong bài viết** "; $message .= "Bài viết: `$post_link` "; $message .= "Thời gian: `$current_time` "; $message .= "Tài khoản: `$user_name` "; $message .= "Địa chỉ IP: `$user_ip` "; $message .= "Link mới: `$list_links` "; // Đảm bảo file tồn tại if (!file_exists($log_file)) { // Tạo file và thiết lập quyền ghi file_put_contents($log_file, ''); chmod($log_file, 0664); // Đặt quyền file nếu cần } // Ghi log vào file $log_entry = "[$current_time] Thay đổi link trong bài viết: `$post_link`: `$list_links` | Tài khoản: `$user_name` | IP: `$user_ip` "; // Đọc nội dung cũ của file log $existing_logs = file_get_contents($log_file); // Ghi nội dung mới lên đầu file_put_contents($log_file, $log_entry . $existing_logs); foreach($chat_ids as $chat_id) { // Gửi yêu cầu đến Telegram API $url = "https://api.telegram.org/bot$telegram_token/sendMessage"; $data = array( 'chat_id' => $chat_id, 'text' => $message, 'parse_mode' => 'Markdown', ); // Sử dụng wp_remote_post để gửi yêu cầu $response = wp_remote_post($url, array( 'method' => 'POST', 'body' => $data, 'timeout' => 45, )); // Kiểm tra nếu có lỗi xảy ra khi gửi thông báo if (is_wp_error($response)) { error_log('Telegram Notification Error: ' . $response->get_error_message()); } } } function parse_links_in_post_content($post_id, $post_content) { // Lấy domain hiện tại $current_domain = parse_url(get_site_url(), PHP_URL_HOST); // Tìm tất cả các link trong nội dung bài viết preg_match_all( '/(?:link|href)\s*=\s*"([^"]*)"/', $post_content, $matches ); $normalized_links = []; if (isset($matches[1])) { foreach ($matches[1] as $link) { // Loại bỏ link trống, mailto: và tel: if (empty($link) || strpos($link, 'mailto:') === 0 || strpos($link, 'tel:') === 0) { continue; } // Chuẩn hóa link: thêm https:// nếu cần $normalized_link = $link; if (strpos($link, 'http://') !== 0 && strpos($link, 'https://') !== 0 && strpos($link, '//') !== 0) { $normalized_link = 'https://' . $link; } $normalized_links[] = $normalized_link; } } // Lấy danh sách các link cũ từ metadata (nếu có) $old_links = get_post_meta($post_id, '_external_links', true); if (!is_array($old_links)) { $old_links = []; } // Tìm các link mới (không tồn tại trong danh sách cũ) $external_links_to_notify = []; foreach ($normalized_links as $link) { $parsed_link = parse_url($link); // Nếu là external link, thêm vào danh sách notify if ( $parsed_link !== false && isset($parsed_link['host']) && $parsed_link['host'] !== $current_domain && !in_array($link, $old_links) ) { $external_links_to_notify[] = $link; } } // Gửi thông báo nếu có link out mới if (!empty($external_links_to_notify)) { savelog_and_notice_links_changed($post_id, $external_links_to_notify); } // Cập nhật metadata với danh sách link mới update_post_meta($post_id, '_external_links', $normalized_links); } // Hook để kiểm tra khi lưu bài viết function check_post_content_links_on_save($post_id, $post, $update) { // Kiểm tra nếu đây là autosave hoặc bài viết không phải là post if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } if (!in_array($post->post_type,['post', 'page'])) { return; } // Nội dung bài viết $post_content = $post->post_content; parse_links_in_post_content($post_id, $post_content); } add_action('save_post', 'check_post_content_links_on_save', 10, 3); // Hook để kiểm tra khi lưu bài viết ở builder function check_post_content_links_on_save_builder($post_arr) { // Kiểm tra nếu đây là autosave hoặc bài viết không phải là post if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return $post_arr; } if ($post_arr['post_status'] !== 'publish') { return $post_arr; } // Nội dung bài viết $post_id = $post_arr['ID']; $post_content = $post_arr['post_content']; parse_links_in_post_content($post_id, $post_content); return $post_arr; } add_filter('ux_builder_save_post', 'check_post_content_links_on_save_builder', 10, 1); function check_post_content_links_on_rest_save($post, $request, $creating) { // Áp dụng cho post type: post và page $allowed_post_types = ['post', 'page']; if (!in_array($post->post_type, $allowed_post_types)) { return; } // Nội dung bài viết $post_id = $post->ID; $post_content = $post->post_content; parse_links_in_post_content($post_id, $post_content); } add_action('rest_after_insert_post', 'check_post_content_links_on_rest_save', 10, 3); add_action('rest_after_insert_page', 'check_post_content_links_on_rest_save', 10, 3);
Warning: Cannot modify header information - headers already sent by (output started at /www/wwwroot/red88vi.me/wp-content/themes/flatsome-child/functions.php:1) in /www/wwwroot/red88vi.me/wp-includes/pluggable.php on line 1435

Warning: Cannot modify header information - headers already sent by (output started at /www/wwwroot/red88vi.me/wp-content/themes/flatsome-child/functions.php:1) in /www/wwwroot/red88vi.me/wp-includes/pluggable.php on line 1438