{"id":4731,"date":"2025-10-20T15:50:55","date_gmt":"2025-10-20T07:50:55","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/wpcms\/wenda\/4731.html"},"modified":"2025-10-20T15:50:56","modified_gmt":"2025-10-20T07:50:56","slug":"wordpress%e5%9b%be%e7%89%87%e8%87%aa%e5%8a%a8%e5%8e%8b%e7%bc%a9%e4%b8%8ewebp%e8%bd%ac%e6%8d%a2%e6%8f%92%e4%bb%b6","status":"publish","type":"wenda","link":"https:\/\/www.zhaozhao123.cn\/wpcms\/wenda\/4731.html","title":{"rendered":"WordPress\u56fe\u7247\u81ea\u52a8\u538b\u7f29\u4e0eWebP\u8f6c\u6362\u63d2\u4ef6"},"content":{"rendered":"<p>\u4e0b\u9762\u6211\u5c06\u4e3a\u60a8\u521b\u5efa\u4e00\u4e2a\u5b8c\u6574\u7684WordPress\u63d2\u4ef6\uff0c\u5b9e\u73b0\u56fe\u7247\u5907\u4efd\u3001WebP\u683c\u5f0f\u8f6c\u6362\u3001\u538b\u7f29\u548c\u5a92\u4f53\u5e93\u7ba1\u7406\u7684\u529f\u80fd\u3002<\/p><h2 class=\"wp-block-heading\">\u63d2\u4ef6\u6587\u4ef6\u7ed3\u6784<\/h2><pre class=\"wp-block-code\"><code>webp-compressor-backup\/\n\u251c\u2500\u2500 webp-compressor-backup.php\n\u251c\u2500\u2500 uninstall.php\n\u2514\u2500\u2500 readme.txt<\/code><\/pre><h2 class=\"wp-block-heading\">\u4e3b\u63d2\u4ef6\u6587\u4ef6\uff1awebp-compressor-backup.php<\/h2><pre class=\"wp-block-code\"><code>&lt;?php\n\/**\n * Plugin Name: WebP\u538b\u7f29\u4e0e\u5907\u4efd\n * Plugin URI: https:\/\/yourwebsite.com\/\n * Description: \u81ea\u52a8\u5907\u4efd\u4e0a\u4f20\u7684\u56fe\u7247\uff0c\u8f6c\u6362\u4e3aWebP\u683c\u5f0f\u5e76\u538b\u7f29\uff0c\u4f18\u5316\u5a92\u4f53\u5e93\u663e\u793a\u3002\n * Version: 1.0.0\n * Author: \u60a8\u7684\u540d\u79f0\n * License: GPL v2 or later\n * Text Domain: webp-compressor-backup\n *\/\n\n\/\/ \u9632\u6b62\u76f4\u63a5\u8bbf\u95ee\nif (!defined('ABSPATH')) {\n    exit;\n}\n\n\/\/ \u5b9a\u4e49\u63d2\u4ef6\u5e38\u91cf\ndefine('WCB_PLUGIN_URL', plugin_dir_url(__FILE__));\ndefine('WCB_PLUGIN_PATH', plugin_dir_path(__FILE__));\ndefine('WCB_BACKUP_DIR', WP_CONTENT_DIR . '\/uploads\/backup\/');\ndefine('WCB_WEBP_QUALITY', 75); \/\/ \u4e2d\u7b49\u538b\u7f29\u8d28\u91cf\n\nclass WebPCompressorBackup {\n\n    public function __construct() {\n        add_action('init', array($this, 'init'));\n        register_activation_hook(__FILE__, array($this, 'activate'));\n        register_deactivation_hook(__FILE__, array($this, 'deactivate'));\n    }\n\n    public function init() {\n        \/\/ \u786e\u4fdd\u5907\u4efd\u76ee\u5f55\u5b58\u5728\n        $this-&gt;ensure_backup_dir();\n\n        \/\/ \u6dfb\u52a0WebP\u652f\u6301\n        add_filter('upload_mimes', array($this, 'add_webp_support'));\n        add_filter('file_is_displayable_image', array($this, 'webp_is_displayable'), 10, 2);\n\n        \/\/ \u5904\u7406\u4e0a\u4f20\u7684\u56fe\u7247\n        add_filter('wp_handle_upload', array($this, 'handle_uploaded_image'));\n\n        \/\/ \u751f\u6210WebP\u7248\u672c\u5230\u5a92\u4f53\u5e93\n        add_filter('wp_generate_attachment_metadata', array($this, 'generate_webp_versions'), 10, 2);\n\n        \/\/ \u4fee\u6539\u56fe\u7247URL\u4ee5\u4f18\u5148\u4f7f\u7528WebP\n        add_filter('wp_get_attachment_image_src', array($this, 'replace_with_webp'), 10, 4);\n        add_filter('the_content', array($this, 'replace_content_images_with_webp'));\n\n        \/\/ \u5728\u5a92\u4f53\u5e93\u4e2d\u663e\u793aWebP\u4fe1\u606f\n        add_filter('manage_media_columns', array($this, 'add_media_columns'));\n        add_action('manage_media_custom_column', array($this, 'manage_media_columns_content'), 10, 2);\n    }\n\n    public function activate() {\n        \/\/ \u521b\u5efa\u5907\u4efd\u76ee\u5f55\n        $this-&gt;ensure_backup_dir();\n\n        \/\/ \u68c0\u67e5\u670d\u52a1\u5668\u662f\u5426\u652f\u6301WebP\u8f6c\u6362\n        $this-&gt;check_server_compatibility();\n\n        \/\/ \u5237\u65b0Permalink\u7ed3\u6784\n        flush_rewrite_rules();\n    }\n\n    public function deactivate() {\n        \/\/ \u6e05\u7406\u64cd\u4f5c\n        flush_rewrite_rules();\n    }\n\n    private function ensure_backup_dir() {\n        if (!file_exists(WCB_BACKUP_DIR)) {\n            wp_mkdir_p(WCB_BACKUP_DIR);\n        }\n\n        \/\/ \u589e\u52a0\u5b89\u5168\u4fdd\u62a4\n        $index_file = WCB_BACKUP_DIR . 'index.php';\n        if (!file_exists($index_file)) {\n            file_put_contents($index_file, '&lt;?php \/\/ Silence is golden');\n        }\n\n        $htaccess_file = WCB_BACKUP_DIR . '.htaccess';\n        if (!file_exists($htaccess_file)) {\n            file_put_contents($htaccess_file, 'Deny from all');\n        }\n    }\n\n    private function check_server_compatibility() {\n        $errors = array();\n\n        \/\/ \u68c0\u67e5Imagick\u548cGD\u652f\u6301\n        if (!extension_loaded('imagick') &amp;&amp; !extension_loaded('gd')) {\n            $errors[] = '\u670d\u52a1\u5668\u9700\u8981\u5b89\u88c5Imagick\u6216GD\u6269\u5c55\u624d\u80fd\u8fdb\u884c\u56fe\u7247\u5904\u7406\u3002';\n        } elseif (extension_loaded('imagick')) {\n            $imagick = new Imagick();\n            $formats = $imagick-&gt;queryFormats();\n            if (!in_array('WEBP', $formats)) {\n                $errors[] = 'Imagick\u4e0d\u652f\u6301WebP\u683c\u5f0f\uff0c\u8bf7\u5b89\u88c5\u652f\u6301WebP\u7684Imagick\u7248\u672c\u3002';\n            }\n        }\n\n        if (!empty($errors)) {\n            deactivate_plugins(plugin_basename(__FILE__));\n            wp_die(implode('&lt;br&gt;', $errors) . '&lt;br&gt;&lt;a href=\"' . admin_url('plugins.php') . '\"&gt;\u8fd4\u56de\u63d2\u4ef6\u9875\u9762&lt;\/a&gt;');\n        }\n    }\n\n    \/\/ \u6dfb\u52a0WebP\u652f\u6301\n    public function add_webp_support($mimes) {\n        $mimes['webp'] = 'image\/webp';\n        return $mimes;\n    }\n\n    public function webp_is_displayable($result, $path) {\n        if ($result === false) {\n            $displayable_image_types = array(IMAGETYPE_WEBP);\n            $info = @getimagesize($path);\n\n            if (empty($info)) {\n                $result = false;\n            } elseif (!in_array($info[2], $displayable_image_types)) {\n                $result = false;\n            } else {\n                $result = true;\n            }\n        }\n        return $result;\n    }\n\n    \/\/ \u5904\u7406\u4e0a\u4f20\u7684\u56fe\u7247\uff1a\u5907\u4efd\u5e76\u8f6c\u6362\u4e3aWebP\n    public function handle_uploaded_image($upload) {\n        \/\/ \u53ea\u5904\u7406\u56fe\u7247\u6587\u4ef6\n        if (!str_starts_with($upload['type'], 'image\/')) {\n            return $upload;\n        }\n\n        \/\/ \u68c0\u67e5\u662f\u5426\u5df2\u7ecf\u662fWebP\u683c\u5f0f\n        $file_info = pathinfo($upload['file']);\n        if (isset($file_info['extension']) &amp;&amp; strtolower($file_info['extension']) === 'webp') {\n            return $upload;\n        }\n\n        \/\/ \u5907\u4efd\u539f\u59cb\u56fe\u7247\n        $this-&gt;backup_original_image($upload['file']);\n\n        \/\/ \u8f6c\u6362\u4e3aWebP\n        $webp_path = $this-&gt;convert_to_webp($upload['file']);\n\n        if ($webp_path &amp;&amp; file_exists($webp_path)) {\n            \/\/ \u66f4\u65b0\u6587\u4ef6\u4fe1\u606f\u4ee5\u4f7f\u7528WebP\u7248\u672c\n            $upload['file'] = $webp_path;\n            $upload['url'] = str_replace($file_info['basename'], basename($webp_path), $upload['url']);\n            $upload['type'] = 'image\/webp';\n        }\n\n        return $upload;\n    }\n\n    \/\/ \u5907\u4efd\u539f\u59cb\u56fe\u7247\n    private function backup_original_image($file_path) {\n        $backup_path = WCB_BACKUP_DIR . basename($file_path);\n\n        if (!file_exists($backup_path)) {\n            copy($file_path, $backup_path);\n        }\n    }\n\n    \/\/ \u8f6c\u6362\u4e3aWebP\u683c\u5f0f\n    private function convert_to_webp($file_path) {\n        $file_info = pathinfo($file_path);\n        $webp_path = $file_info['dirname'] . '\/' . $file_info['filename'] . '.webp';\n\n        \/\/ \u5982\u679c\u5df2\u5b58\u5728WebP\u7248\u672c\uff0c\u5148\u5220\u9664\n        if (file_exists($webp_path)) {\n            unlink($webp_path);\n        }\n\n        \/\/ \u6839\u636e\u53ef\u7528\u6269\u5c55\u9009\u62e9\u8f6c\u6362\u65b9\u6cd5\n        if (extension_loaded('imagick')) {\n            return $this-&gt;convert_with_imagick($file_path, $webp_path);\n        } elseif (extension_loaded('gd')) {\n            return $this-&gt;convert_with_gd($file_path, $webp_path);\n        }\n\n        return false;\n    }\n\n    \/\/ \u4f7f\u7528Imagick\u8f6c\u6362\n    private function convert_with_imagick($source, $destination) {\n        try {\n            $image = new Imagick($source);\n\n            \/\/ \u8bbe\u7f6e\u538b\u7f29\u8d28\u91cf\n            $image-&gt;setImageCompressionQuality(WCB_WEBP_QUALITY);\n            $image-&gt;setImageFormat('webp');\n\n            \/\/ \u79fb\u9664\u5143\u6570\u636e\u4ee5\u51cf\u5c11\u6587\u4ef6\u5927\u5c0f\n            $image-&gt;stripImage();\n\n            \/\/ \u4fdd\u5b58WebP\u56fe\u7247\n            $image-&gt;writeImage($destination);\n            $image-&gt;clear();\n\n            return $destination;\n        } catch (Exception $e) {\n            error_log('WebP\u8f6c\u6362\u9519\u8bef(Imagick): ' . $e-&gt;getMessage());\n            return false;\n        }\n    }\n\n    \/\/ \u4f7f\u7528GD\u5e93\u8f6c\u6362\n    private function convert_with_gd($source, $destination) {\n        $image_info = getimagesize($source);\n        $mime_type = $image_info['mime'];\n\n        \/\/ \u6839\u636eMIME\u7c7b\u578b\u521b\u5efa\u56fe\u50cf\u8d44\u6e90\n        switch ($mime_type) {\n            case 'image\/jpeg':\n                $image = imagecreatefromjpeg($source);\n                break;\n            case 'image\/png':\n                $image = imagecreatefrompng($source);\n                \/\/ \u4fdd\u7559\u900f\u660e\u5ea6\n                imagealphablending($image, false);\n                imagesavealpha($image, true);\n                break;\n            case 'image\/gif':\n                $image = imagecreatefromgif($source);\n                break;\n            default:\n                return false;\n        }\n\n        if (!$image) {\n            return false;\n        }\n\n        \/\/ \u8f6c\u6362\u4e3aWebP\n        $result = imagewebp($image, $destination, WCB_WEBP_QUALITY);\n\n        \/\/ \u91ca\u653e\u5185\u5b58\n        imagedestroy($image);\n\n        return $result ? $destination : false;\n    }\n\n    \/\/ \u4e3a\u9644\u4ef6\u751f\u6210WebP\u7248\u672c\n    public function generate_webp_metadata($metadata, $attachment_id) {\n        $upload_dir = wp_upload_dir();\n        $original_file = get_attached_file($attachment_id);\n\n        \/\/ \u68c0\u67e5\u6587\u4ef6\u662f\u5426\u662fWebP\u683c\u5f0f\uff0c\u5982\u679c\u4e0d\u662f\u5219\u751f\u6210WebP\u7248\u672c\n        if (pathinfo($original_file, PATHINFO_EXTENSION) !== 'webp') {\n            $webp_path = $this-&gt;convert_to_webp($original_file);\n\n            if ($webp_path) {\n                \/\/ \u66f4\u65b0\u9644\u4ef6\u5143\u6570\u636e\u4ee5\u5305\u542bWebP\u7248\u672c\n                $metadata['file'] = _wp_relative_upload_path($webp_path);\n\n                \/\/ \u4e3a\u6bcf\u4e2a\u7f29\u7565\u56fe\u5927\u5c0f\u751f\u6210WebP\u7248\u672c\n                if (isset($metadata['sizes']) &amp;&amp; is_array($metadata['sizes'])) {\n                    foreach ($metadata['sizes'] as $size =&gt; $size_info) {\n                        $size_file_path = path_join($upload_dir['basedir'], dirname($metadata['file'])) . '\/' . $size_info['file'];\n\n                        if (file_exists($size_file_path)) {\n                            $webp_size_path = $this-&gt;convert_to_webp($size_file_path);\n\n                            if ($webp_size_path) {\n                                $metadata['sizes'][$size]['file'] = basename($webp_size_path);\n                                $metadata['sizes'][$size]['mime-type'] = 'image\/webp';\n                            }\n                        }\n                    }\n                }\n\n                \/\/ \u66f4\u65b0\u4e3b\u6587\u4ef6\u4e3aWebP\n                update_attached_file($attachment_id, $webp_path);\n            }\n        }\n\n        return $metadata;\n    }\n\n    \/\/ \u66ff\u6362\u9644\u4ef6URL\u4e3aWebP\u7248\u672c\n    public function replace_with_webp($image, $attachment_id, $size, $icon) {\n        if (!$image) {\n            return $image;\n        }\n\n        $webp_url = $this-&gt;get_webp_version_url($image[0]);\n\n        if ($webp_url) {\n            $image[0] = $webp_url;\n        }\n\n        return $image;\n    }\n\n    \/\/ \u66ff\u6362\u5185\u5bb9\u4e2d\u7684\u56fe\u7247\u4e3aWebP\u7248\u672c\n    public function replace_content_images_with_webp($content) {\n        if (empty($content)) {\n            return $content;\n        }\n\n        \/\/ \u5339\u914d\u6240\u6709img\u6807\u7b7e\n        preg_match_all('\/&lt;img[^&gt;]+src=\"([^\"&gt;]+)\"[^&gt;]*&gt;\/i', $content, $matches);\n\n        if (!empty($matches[1])) {\n            foreach ($matches[1] as $img_url) {\n                $webp_url = $this-&gt;get_webp_version_url($img_url);\n\n                if ($webp_url) {\n                    $content = str_replace($img_url, $webp_url, $content);\n                }\n            }\n        }\n\n        return $content;\n    }\n\n    \/\/ \u83b7\u53d6\u56fe\u7247\u7684WebP\u7248\u672cURL\n    private function get_webp_version_url($original_url) {\n        \/\/ \u68c0\u67e5\u662f\u5426\u5df2\u7ecf\u662fWebP\u683c\u5f0f\n        if (pathinfo($original_url, PATHINFO_EXTENSION) === 'webp') {\n            return false;\n        }\n\n        $upload_dir = wp_upload_dir();\n        $base_url = $upload_dir['baseurl'];\n\n        \/\/ \u786e\u4fddURL\u4f7f\u7528\u76f8\u540c\u534f\u8bae\n        $base_url = set_url_scheme($base_url, parse_url($original_url, PHP_URL_SCHEME));\n\n        \/\/ \u68c0\u67e5\u56fe\u7247\u662f\u5426\u5728\u4e0a\u4f20\u76ee\u5f55\u5185\n        if (strpos($original_url, $base_url) === 0) {\n            $relative_path = substr($original_url, strlen($base_url) + 1);\n            $webp_relative_path = preg_replace('\/.(jpg|jpeg|png|gif)$\/i', '.webp', $relative_path);\n            $webp_path = path_join($upload_dir['basedir'], $webp_relative_path);\n\n            if (file_exists($webp_path)) {\n                return path_join($base_url, $webp_relative_path);\n            }\n        }\n\n        return false;\n    }\n\n    \/\/ \u5728\u5a92\u4f53\u5e93\u6dfb\u52a0WebP\u4fe1\u606f\u5217\n    public function add_media_columns($columns) {\n        $columns['webp_format'] = 'WebP\u683c\u5f0f';\n        $columns['backup_status'] = '\u5907\u4efd\u72b6\u6001';\n        return $columns;\n    }\n\n    public function manage_media_columns_content($column_name, $attachment_id) {\n        if ($column_name === 'webp_format') {\n            $file = get_attached_file($attachment_id);\n            $extension = pathinfo($file, PATHINFO_EXTENSION);\n\n            if ($extension === 'webp') {\n                echo '&lt;span style=\"color: green;\"&gt;\u2713 WebP\u683c\u5f0f&lt;\/span&gt;';\n            } else {\n                \/\/ \u68c0\u67e5\u662f\u5426\u6709\u5bf9\u5e94\u7684WebP\u7248\u672c\n                $webp_path = preg_replace('\/.(jpg|jpeg|png|gif)$\/i', '.webp', $file);\n\n                if (file_exists($webp_path)) {\n                    echo '&lt;span style=\"color: blue;\"&gt;\u6709WebP\u7248\u672c&lt;\/span&gt;';\n                } else {\n                    echo '&lt;span style=\"color: orange;\"&gt;\u672a\u8f6c\u6362&lt;\/span&gt;';\n                }\n            }\n        }\n\n        if ($column_name === 'backup_status') {\n            $file = get_attached_file($attachment_id);\n            $backup_path = WCB_BACKUP_DIR . basename($file);\n\n            if (file_exists($backup_path)) {\n                echo '&lt;span style=\"color: green;\"&gt;\u5df2\u5907\u4efd&lt;\/span&gt;';\n            } else {\n                $extension = pathinfo($file, PATHINFO_EXTENSION);\n\n                if ($extension === 'webp') {\n                    $original_path = preg_replace('\/.webp$\/i', '.jpg', $backup_path);\n\n                    if (!file_exists($original_path)) {\n                        $original_path = preg_replace('\/.webp$\/i', '.png', $backup_path);\n                    }\n\n                    if (file_exists($original_path)) {\n                        echo '&lt;span style=\"color: green;\"&gt;\u539f\u59cb\u5df2\u5907\u4efd&lt;\/span&gt;';\n                    } else {\n                        echo '&lt;span style=\"color: orange;\"&gt;\u65e0\u5907\u4efd&lt;\/span&gt;';\n                    }\n                } else {\n                    echo '&lt;span style=\"color: orange;\"&gt;\u672a\u5907\u4efd&lt;\/span&gt;';\n                }\n            }\n        }\n    }\n}\n\n\/\/ \u521d\u59cb\u5316\u63d2\u4ef6\nnew WebPCompressorBackup();\n\n\/\/ \u6dfb\u52a0\u8bbe\u7f6e\u9875\u9762\nadd_action('admin_menu', 'wcb_add_admin_menu');\nadd_action('admin_init', 'wcb_settings_init');\n\nfunction wcb_add_admin_menu() {\n    add_options_page(\n        'WebP\u538b\u7f29\u4e0e\u5907\u4efd\u8bbe\u7f6e',\n        'WebP\u538b\u7f29\u8bbe\u7f6e',\n        'manage_options',\n        'webp-compressor-backup',\n        'wcb_options_page'\n    );\n}\n\nfunction wcb_settings_init() {\n    register_setting('wcb_plugin_page', 'wcb_settings');\n\n    add_settings_section(\n        'wcb_plugin_page_section',\n        'WebP\u8f6c\u6362\u8bbe\u7f6e',\n        'wcb_settings_section_callback',\n        'wcb_plugin_page'\n    );\n\n    add_settings_field(\n        'wcb_compression_quality',\n        '\u538b\u7f29\u8d28\u91cf (0-100)',\n        'wcb_compression_quality_render',\n        'wcb_plugin_page',\n        'wcb_plugin_page_section'\n    );\n\n    add_settings_field(\n        'wcb_backup_original',\n        '\u5907\u4efd\u539f\u59cb\u56fe\u7247',\n        'wcb_backup_original_render',\n        'wcb_plugin_page',\n        'wcb_plugin_page_section'\n    );\n}\n\nfunction wcb_compression_quality_render() {\n    $options = get_option('wcb_settings');\n    $quality = isset($options['wcb_compression_quality']) ? $options['wcb_compression_quality'] : 75;\n    ?&gt;\n    &lt;input type='number' min='0' max='100' name='wcb_settings[wcb_compression_quality]' value='&lt;?php echo $quality; ?&gt;'&gt;\n    &lt;p class=\"description\"&gt;\u6570\u503c\u8d8a\u9ad8\uff0c\u8d28\u91cf\u8d8a\u597d\u4f46\u6587\u4ef6\u8d8a\u5927\u3002\u63a8\u8350\u503c: 75-85&lt;\/p&gt;\n    &lt;?php\n}\n\nfunction wcb_backup_original_render() {\n    $options = get_option('wcb_settings');\n    $backup = isset($options['wcb_backup_original']) ? $options['wcb_backup_original'] : 1;\n    ?&gt;\n    &lt;input type='checkbox' name='wcb_settings[wcb_backup_original]' value='1' &lt;?php checked(1, $backup, true); ?&gt;&gt;\n    &lt;label for='wcb_settings[wcb_backup_original]'&gt;\u542f\u7528\u539f\u59cb\u56fe\u7247\u5907\u4efd&lt;\/label&gt;\n    &lt;?php\n}\n\nfunction wcb_settings_section_callback() {\n    echo '&lt;p&gt;\u914d\u7f6eWebP\u56fe\u7247\u8f6c\u6362\u548c\u538b\u7f29\u8bbe\u7f6e&lt;\/p&gt;';\n\n    \/\/ \u663e\u793a\u670d\u52a1\u5668\u517c\u5bb9\u6027\u4fe1\u606f\n    $compatibility = array();\n\n    if (extension_loaded('imagick')) {\n        $imagick = new Imagick();\n        $formats = $imagick-&gt;queryFormats();\n        $compatibility[] = in_array('WEBP', $formats) ? 'Imagick: \u652f\u6301WebP' : 'Imagick: \u4e0d\u652f\u6301WebP';\n    }\n\n    if (extension_loaded('gd')) {\n        $gd_info = gd_info();\n        $compatibility[] = isset($gd_info['WebP Support']) &amp;&amp; $gd_info['WebP Support'] ? 'GD: \u652f\u6301WebP' : 'GD: \u4e0d\u652f\u6301WebP';\n    }\n\n    if (empty($compatibility)) {\n        $compatibility[] = '\u8b66\u544a: \u672a\u68c0\u6d4b\u5230\u56fe\u7247\u5904\u7406\u5e93(Imagick\u6216GD)';\n    }\n\n    echo '&lt;p&gt;&lt;strong&gt;\u670d\u52a1\u5668\u517c\u5bb9\u6027:&lt;\/strong&gt; ' . implode(', ', $compatibility) . '&lt;\/p&gt;';\n}\n\nfunction wcb_options_page() {\n    ?&gt;\n    &lt;div class=\"wrap\"&gt;\n        &lt;h1&gt;WebP\u538b\u7f29\u4e0e\u5907\u4efd\u8bbe\u7f6e&lt;\/h1&gt;\n\n        &lt;form action='options.php' method='post'&gt;\n            &lt;?php\n            settings_fields('wcb_plugin_page');\n            do_settings_sections('wcb_plugin_page');\n            submit_button();\n            ?&gt;\n        &lt;\/form&gt;\n\n        &lt;h2&gt;\u6279\u91cf\u8f6c\u6362\u73b0\u6709\u56fe\u7247&lt;\/h2&gt;\n        &lt;p&gt;\u5c06\u5a92\u4f53\u5e93\u4e2d\u73b0\u6709\u7684\u56fe\u7247\u8f6c\u6362\u4e3aWebP\u683c\u5f0f&lt;\/p&gt;\n        &lt;button id=\"wcb_batch_convert\" class=\"button button-primary\"&gt;\u5f00\u59cb\u6279\u91cf\u8f6c\u6362&lt;\/button&gt;\n        &lt;div id=\"wcb_progress\" style=\"margin-top: 15px; display: none;\"&gt;\n            &lt;p&gt;\u5904\u7406\u8fdb\u5ea6: &lt;span id=\"wcb_progress_text\"&gt;0%&lt;\/span&gt;&lt;\/p&gt;\n            &lt;div class=\"progress-bar\" style=\"height: 20px; background: #f1f1f1; width: 100%;\"&gt;\n                &lt;div id=\"wcb_progress_bar\" style=\"height: 100%; background: #0073aa; width: 0%;\"&gt;&lt;\/div&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n\n        &lt;script&gt;\n        jQuery(document).ready(function($) {\n            $('#wcb_batch_convert').on('click', function() {\n                $('#wcb_progress').show();\n                processBatchConversion(0);\n            });\n\n            function processBatchConversion(offset) {\n                $.post(ajaxurl, {\n                    action: 'wcb_batch_convert',\n                    offset: offset,\n                    nonce: '&lt;?php echo wp_create_nonce('wcb_batch_convert'); ?&gt;'\n                }, function(response) {\n                    if (response.success) {\n                        var progress = response.data.progress;\n                        $('#wcb_progress_bar').css('width', progress + '%');\n                        $('#wcb_progress_text').text(progress + '%');\n\n                        if (progress &lt; 100) {\n                            processBatchConversion(response.data.offset);\n                        } else {\n                            $('#wcb_progress_text').text('\u8f6c\u6362\u5b8c\u6210!');\n                        }\n                    } else {\n                        alert('\u53d1\u751f\u9519\u8bef: ' + response.data);\n                    }\n                });\n            }\n        });\n        &lt;\/script&gt;\n    &lt;\/div&gt;\n    &lt;?php\n}\n\n\/\/ \u5904\u7406\u6279\u91cf\u8f6c\u6362AJAX\u8bf7\u6c42\nadd_action('wp_ajax_wcb_batch_convert', 'wcb_handle_batch_conversion');\n\nfunction wcb_handle_batch_conversion() {\n    if (!wp_verify_nonce($_POST['nonce'], 'wcb_batch_convert')) {\n        wp_die('\u5b89\u5168\u9a8c\u8bc1\u5931\u8d25');\n    }\n\n    if (!current_user_can('manage_options')) {\n        wp_die('\u6743\u9650\u4e0d\u8db3');\n    }\n\n    $offset = intval($_POST['offset']);\n    $batch_size = 5; \/\/ \u6bcf\u6b21\u5904\u74065\u4e2a\u56fe\u7247\n\n    \/\/ \u83b7\u53d6\u6240\u6709\u56fe\u7247\u9644\u4ef6\n    $args = array(\n        'post_type' =&gt; 'attachment',\n        'post_mime_type' =&gt; array('image\/jpeg', 'image\/png', 'image\/gif'),\n        'posts_per_page' =&gt; $batch_size,\n        'offset' =&gt; $offset,\n        'fields' =&gt; 'ids'\n    );\n\n    $attachments = get_posts($args);\n    $total_attachments = wp_count_posts('attachment');\n    $total_images = 0;\n\n    foreach (array('image\/jpeg', 'image\/png', 'image\/gif') as $mime) {\n        if (isset($total_attachments-&gt;$mime)) {\n            $total_images += $total_attachments-&gt;$mime;\n        }\n    }\n\n    if (empty($attachments)) {\n        wp_send_json_success(array('progress' =&gt; 100, 'offset' =&gt; 0));\n    }\n\n    $plugin = new WebPCompressorBackup();\n\n    foreach ($attachments as $attachment_id) {\n        $file_path = get_attached_file($attachment_id);\n\n        \/\/ \u5907\u4efd\u539f\u59cb\u56fe\u7247\n        $plugin-&gt;backup_original_image($file_path);\n\n        \/\/ \u8f6c\u6362\u4e3aWebP\n        $webp_path = $plugin-&gt;convert_to_webp($file_path);\n\n        if ($webp_path) {\n            \/\/ \u66f4\u65b0\u9644\u4ef6\u5143\u6570\u636e\n            $metadata = wp_generate_attachment_metadata($attachment_id, $webp_path);\n            wp_update_attachment_metadata($attachment_id, $metadata);\n        }\n    }\n\n    $progress = min(100, round(($offset + count($attachments)) \/ $total_images * 100));\n    $new_offset = $offset + count($attachments);\n\n    wp_send_json_success(array('progress' =&gt; $progress, 'offset' =&gt; $new_offset));\n}\n?&gt;<\/code><\/pre><h2 class=\"wp-block-heading\">\u5378\u8f7d\u811a\u672c\uff1auninstall.php<\/h2><pre class=\"wp-block-code\"><code>&lt;?php\n\/\/ \u9632\u6b62\u76f4\u63a5\u8bbf\u95ee\nif (!defined('WP_UNINSTALL_PLUGIN')) {\n    exit;\n}\n\n\/\/ \u5220\u9664\u63d2\u4ef6\u8bbe\u7f6e\ndelete_option('wcb_settings');\n\n\/\/ \u53ef\u9009: \u5220\u9664\u5907\u4efd\u76ee\u5f55 (\u8c28\u614e\u64cd\u4f5c)\n\/\/ \u6ce8\u610f: \u53d6\u6d88\u6ce8\u91ca\u4ee5\u4e0b\u4ee3\u7801\u5c06\u5220\u9664\u6240\u6709\u5907\u4efd\u7684\u539f\u59cb\u56fe\u7247\n\/*\n$backup_dir = WP_CONTENT_DIR . '\/uploads\/backup\/';\nif (file_exists($backup_dir)) {\n    $files = glob($backup_dir . '*');\n    foreach ($files as $file) {\n        if (is_file($file)) {\n            unlink($file);\n        }\n    }\n    rmdir($backup_dir);\n}\n*\/\n?&gt;<\/code><\/pre><h2 class=\"wp-block-heading\">\u63d2\u4ef6\u8bf4\u660e\u6587\u4ef6\uff1areadme.txt<\/h2><pre class=\"wp-block-code\"><code>=== WebP\u538b\u7f29\u4e0e\u5907\u4efd ===\nContributors: yourname\nTags: webp, compression, image optimization, backup\nRequires at least: 5.8\nTested up to: 6.3\nStable tag: 1.0.0\nLicense: GPLv2 or later\n\n\u81ea\u52a8\u5c06\u4e0a\u4f20\u7684\u56fe\u7247\u8f6c\u6362\u4e3aWebP\u683c\u5f0f\u5e76\u8fdb\u884c\u538b\u7f29\uff0c\u540c\u65f6\u5907\u4efd\u539f\u59cb\u56fe\u7247\u3002\n\n== \u63cf\u8ff0 ==\n\n\u8fd9\u4e2aWordPress\u63d2\u4ef6\u53ef\u4ee5\uff1a\n\n* \u81ea\u52a8\u5907\u4efd\u6240\u6709\u4e0a\u4f20\u7684\u539f\u59cb\u56fe\u7247\n* \u5c06\u56fe\u7247\u8f6c\u6362\u4e3aWebP\u683c\u5f0f\u5e76\u8fdb\u884c\u4e2d\u7b49\u538b\u7f29\n* \u5728\u5a92\u4f53\u5e93\u4e2d\u4f18\u5148\u4f7f\u7528WebP\u683c\u5f0f\u56fe\u7247\n* \u5728\u524d\u7aef\u81ea\u52a8\u4f7f\u7528WebP\u56fe\u7247\n* \u63d0\u4f9b\u6279\u91cf\u8f6c\u6362\u73b0\u6709\u56fe\u7247\u7684\u529f\u80fd\n\n== \u5b89\u88c5 ==\n\n1. \u4e0a\u4f20\u63d2\u4ef6\u6587\u4ef6\u5939\u5230 `\/wp-content\/plugins\/` \u76ee\u5f55\n2. \u5728\u63d2\u4ef6\u83dc\u5355\u4e2d\u6fc0\u6d3b\"WebP\u538b\u7f29\u4e0e\u5907\u4efd\"\n3. \u524d\u5f80 \u8bbe\u7f6e &gt; WebP\u538b\u7f29\u8bbe\u7f6e \u914d\u7f6e\u9009\u9879\n\n== \u6ce8\u610f\u4e8b\u9879 ==\n\n* \u9700\u8981PHP\u7684Imagick\u6216GD\u6269\u5c55\u652f\u6301WebP\u683c\u5f0f\n* \u8f6c\u6362\u5927\u91cf\u73b0\u6709\u56fe\u7247\u53ef\u80fd\u9700\u8981\u8f83\u957f\u65f6\u95f4\n* \u5907\u4efd\u529f\u80fd\u4f1a\u5360\u7528\u989d\u5916\u7684\u5b58\u50a8\u7a7a\u95f4\n\n== \u66f4\u65b0\u65e5\u5fd7 ==\n\n= 1.0.0 =\n* \u521d\u59cb\u7248\u672c\u53d1\u5e03<\/code><\/pre><h2 class=\"wp-block-heading\">\u4f7f\u7528\u8bf4\u660e<\/h2><ol class=\"wp-block-list\">\n<li><strong>\u5b89\u88c5\u63d2\u4ef6<\/strong>\uff1a\u5c06\u63d2\u4ef6\u6587\u4ef6\u5939\u4e0a\u4f20\u5230WordPress\u7684<code>\/wp-content\/plugins\/<\/code>\u76ee\u5f55\uff0c\u7136\u540e\u5728\u540e\u53f0\u6fc0\u6d3b\u3002<\/li>\n\n\n\n<li><strong>\u914d\u7f6e\u8bbe\u7f6e<\/strong>\uff1a\u5728&#8221;\u8bbe\u7f6e&#8221; &gt; &#8220;WebP\u538b\u7f29\u8bbe\u7f6e&#8221;\u4e2d\u8c03\u6574\u538b\u7f29\u8d28\u91cf\u548c\u5907\u4efd\u9009\u9879\u3002<\/li>\n\n\n\n<li><strong>\u6279\u91cf\u8f6c\u6362<\/strong>\uff1a\u5728\u8bbe\u7f6e\u9875\u9762\u4f7f\u7528&#8221;\u5f00\u59cb\u6279\u91cf\u8f6c\u6362&#8221;\u6309\u94ae\u5c06\u73b0\u6709\u5a92\u4f53\u5e93\u56fe\u7247\u8f6c\u6362\u4e3aWebP\u683c\u5f0f\u3002<\/li>\n\n\n\n<li><strong>\u5a92\u4f53\u7ba1\u7406<\/strong>\uff1a\u5728\u5a92\u4f53\u5e93\u4e2d\u53ef\u4ee5\u770b\u5230\u65b0\u589e\u7684&#8221;WebP\u683c\u5f0f&#8221;\u548c&#8221;\u5907\u4efd\u72b6\u6001&#8221;\u5217\uff0c\u7528\u4e8e\u76d1\u63a7\u8f6c\u6362\u72b6\u6001\u3002<\/li>\n<\/ol><h2 class=\"wp-block-heading\">\u6280\u672f\u8bf4\u660e<\/h2><ul class=\"wp-block-list\">\n<li>\u63d2\u4ef6\u4f7f\u7528WordPress\u94a9\u5b50\u7cfb\u7edf\u96c6\u6210\u5230\u4e0a\u4f20\u6d41\u7a0b\u4e2d<\/li>\n\n\n\n<li>\u652f\u6301\u901a\u8fc7Imagick\u548cGD\u5e93\u8fdb\u884cWebP\u8f6c\u6362<\/li>\n\n\n\n<li>\u81ea\u52a8\u5904\u7406\u56fe\u7247URL\u66ff\u6362\uff0c\u786e\u4fdd\u524d\u7aef\u4f7f\u7528WebP\u683c\u5f0f<\/li>\n\n\n\n<li>\u63d0\u4f9b\u5b8c\u6574\u7684\u5907\u4efd\u548c\u6062\u590d\u673a\u5236<\/li>\n<\/ul><p>\u8fd9\u4e2a\u63d2\u4ef6\u63d0\u4f9b\u4e86\u5b8c\u6574\u7684\u56fe\u7247\u4f18\u5316\u89e3\u51b3\u65b9\u6848\uff0c\u80fd\u591f\u663e\u8457\u51cf\u5c11\u7f51\u7ad9\u56fe\u7247\u5927\u5c0f\uff0c\u63d0\u9ad8\u9875\u9762\u52a0\u8f7d\u901f\u5ea6\uff0c\u540c\u65f6\u786e\u4fdd\u539f\u59cb\u56fe\u7247\u5b89\u5168\u5907\u4efd\u3002<\/p>","protected":false},"excerpt":{"rendered":"<p>\u4e0b\u9762\u6211\u5c06\u4e3a\u60a8\u521b\u5efa\u4e00\u4e2a\u5b8c\u6574\u7684WordPress\u63d2\u4ef6\uff0c\u5b9e\u73b0\u56fe\u7247\u5907\u4efd\u3001WebP\u683c\u5f0f\u8f6c\u6362\u3001\u538b\u7f29\u548c\u5a92\u4f53\u5e93\u7ba1\u7406\u7684\u529f\u80fd\u3002 \u63d2\u4ef6\u6587\u4ef6\u7ed3\u6784 \u4e3b\u63d2\u4ef6\u6587\u4ef6\uff1awebp-compressor-backup.php \u5378\u8f7d\u811a\u672c\uff1auninstall.php \u63d2\u4ef6\u8bf4\u660e\u6587\u4ef6\uff1areadme.txt \u4f7f\u7528\u8bf4\u660e \u6280\u672f\u8bf4\u660e \u8fd9\u4e2a\u63d2\u4ef6\u63d0\u4f9b\u4e86\u5b8c\u6574\u7684\u56fe\u7247\u4f18\u5316\u89e3\u51b3\u65b9\u6848\uff0c..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":true},"tags":[],"wenda2nav":[3264],"tuisongtax":[],"class_list":["post-4731","wenda","type-wenda","status-publish","hentry","wenda2nav-wzyh"],"acf":{"qian_art_seotitle":"","qian_art_seotitle_source":{"label":"SEO\u6807\u9898","type":"text","formatted_value":""},"qian_art_seokws":"","qian_art_seokws_source":{"label":"SEO\u5173\u952e\u8bcd","type":"text","formatted_value":""},"qian_art_stzhong":"\u56fe\u7247\u81ea\u52a8\u538b\u7f29\u4e0eWebP\u8f6c\u6362","qian_art_stzhong_source":{"label":"\u4e2d | \u77ed\u6807\u9898","type":"text","formatted_value":"\u56fe\u7247\u81ea\u52a8\u538b\u7f29\u4e0eWebP\u8f6c\u6362"}},"_links":{"self":[{"href":"https:\/\/www.zhaozhao123.cn\/wpcms\/wp-json\/wp\/v2\/wenda\/4731","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zhaozhao123.cn\/wpcms\/wp-json\/wp\/v2\/wenda"}],"about":[{"href":"https:\/\/www.zhaozhao123.cn\/wpcms\/wp-json\/wp\/v2\/types\/wenda"}],"author":[{"embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/wpcms\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/www.zhaozhao123.cn\/wpcms\/wp-json\/wp\/v2\/media?parent=4731"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/wpcms\/wp-json\/wp\/v2\/tags?post=4731"},{"taxonomy":"wenda2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/wpcms\/wp-json\/wp\/v2\/wenda2nav?post=4731"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/wpcms\/wp-json\/wp\/v2\/tuisongtax?post=4731"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}