






if (!defined('ABSPATH')) exit; define('CDN_IMG_DOMAIN', 'https://img.avbjx.top'); define('CDN_THUMB_DOMAIN', 'https://thumb.avbjx.top'); define('CDN_SECRET', 'gK9#dPz8qLr2$Wx6FvYc@JtMmRbQ!zHs'); define('CDN_EXPIRE_STEP', 1800); function generate_cdn_signed_url($url) { if (is_admin() || !$url || strpos($url, 'proxy.php?f=') !== false) return $url; if (strpos($url, '/wp-content/uploads/') === false) return $url; $parsed = parse_url($url); $path = isset($parsed['path']) ? ltrim($parsed['path'], '/') : ''; $path = preg_replace('#^(wp-content/)?uploads/#i', '', $path); $path = rawurldecode($path); $t = floor(time() / CDN_EXPIRE_STEP) * CDN_EXPIRE_STEP; $s = hash_hmac('sha256', $path . $t, CDN_SECRET); return CDN_IMG_DOMAIN . '/proxy.php?f=' . rawurlencode($path) . '&t=' . $t . '&s=' . $s; } function generate_cdn_thumb_url($url) { if (!$url || strpos($url, 'data:') === 0) return $url; $url = strtok($url, '?'); $pos = strpos($url, '/wp-content/uploads/'); if ($pos === false) return $url; return CDN_THUMB_DOMAIN . substr($url, $pos) . '?width=285&height=461&fit=cover'; } function cdn_sign_html($html) { if (empty($html)) return $html; libxml_use_internal_errors(true); $doc = new DOMDocument('1.0', 'UTF-8'); $doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); foreach ($doc->getElementsByTagName('img') as $img) { $src = $img->getAttribute('src'); $class = $img->getAttribute('class'); $is_thumb = preg_match('/\\bthumb\\b/i', $class) || strpos($src, '/uploads/cache/') !== false; if ($src) $img->setAttribute('src', $is_thumb ? generate_cdn_thumb_url($src) : generate_cdn_signed_url($src)); $srcset = $img->getAttribute('srcset'); if ($srcset) { $entries = explode(',', $srcset); $new_entries = []; foreach ($entries as $entry) { $entry = trim($entry); if (!$entry) continue; $space = strrpos($entry, ' '); $url = $space !== false ? substr($entry, 0, $space) : $entry; $desc = $space !== false ? substr($entry, $space + 1) : ''; $new_url = $is_thumb ? generate_cdn_thumb_url($url) : generate_cdn_signed_url($url); $new_entries[] = trim($new_url . ' ' . $desc); } $img->setAttribute('srcset', implode(', ', $new_entries)); } } return $doc->saveHTML(); } add_action('template_redirect', function () { if (is_admin() || defined('REST_REQUEST')) return; ob_start('cdn_sign_html'); }); add_filter('rest_prepare_post', function ($response) { $data = $response->get_data(); if (!empty($data['content']['rendered'])) { $data['content']['rendered'] = cdn_sign_html($data['content']['rendered']); } $response->set_data($data); return $response; }, 10); remove_all_filters('wp_get_attachment_url'); remove_all_filters('wp_get_attachment_image_url'); remove_all_filters('wp_get_attachment_image_src'); remove_all_filters('wp_prepare_attachment_for_js'); add_filter('register_taxonomy_args', function ($args, $taxonomy) { if ($taxonomy === 'format') $args['rest_base'] = 'format_terms'; return $args; }, 10, 2);
댓글0