Создать копию изображения при загрузке PNG
Когда я загружаю PNG, нужно сохранить оригинал и создать миниатюры и копию оригинала в формате .jpg
есть плагин png-to-jpg он конвертирует все PNG при загрузке в JPG - но он убивает оригинал PNG - а мне важны оригиналы
хочу чтоб когда загружу
big_cover_01.png - сохранился оригинал
big_cover_01.jpg – создалась копия оригинала в формате JPG (файлу можно присвоить имя размера)
big_cover_01-2000×2000.jpg – миниатюра в JPG
big_cover_01-150×150.jpg - миниатюра в JPG
вызывать желательно бы по функции
wp_get_attachment_image_url(1,"large") wp_get_attachment_image_url(1,"jpg-like-original-png") wp_get_attachment_image_url(1,"medium")
Вот весь код плагина - может кто знает как заставить его оставлять оригиналы PNG, а новому файлу big_cover_01.jpg присваивать размер add_image_size( 'jpg-like-original-png', 99999, 99999 );
<?php /* Plugin Name: PNG to JPG Plugin URI: http://kubiq.sk Description: Convert PNG images to JPG, free up web space and speed up your webpage Version: 2.0 Author: Jakub Novák Author URI: http://kubiq.sk */ if (!class_exists('png_to_jpg')) { class png_to_jpg { var $domain = 'png_to_jpg'; var $plugin_admin_page; var $settings; var $tab; function __construct(){ $mo = plugin_dir_path(__FILE__) . 'languages/' . get_locale() . '.mo'; load_textdomain($this->domain, $mo); add_action( 'admin_menu', array( &$this, 'plugin_menu_link' ) ); add_action( 'init', array( &$this, 'plugin_init' ) ); add_action( 'admin_notices', array( &$this, 'server_gd_library' ) ); add_filter( 'wp_handle_upload', array( &$this, 'upload_converting' ) ); add_action( 'wp_ajax_hasTransparency', array( &$this, 'hasTransparency' ) ); add_action( 'wp_ajax_convert_old_png', array( &$this, 'convert_old_png' ) ); } function activate() { if( ! get_option('png_to_jpg_settings', 0) ){ update_option( "png_to_jpg_settings", array( "general" => array( "upload_convert" => 0, "jpg_quality" => "90" ) ) ); } } function filter_plugin_actions($links, $file) { $settings_link = '<a href="tools.php?page=' . basename(__FILE__) . '">' . __('Settings') . '</a>'; array_unshift( $links, $settings_link ); return $links; } function plugin_menu_link() { $this->plugin_admin_page = add_submenu_page( 'tools.php', __( 'PNG to JPG', $this->domain ), __( 'PNG to JPG', $this->domain ), 'manage_options', basename(__FILE__), array( $this, 'admin_options_page' ) ); add_filter( 'plugin_action_links_' . plugin_basename(__FILE__), array($this, 'filter_plugin_actions'), 10, 2 ); } function plugin_init(){ $this->settings = get_option('png_to_jpg_settings'); } function plugin_admin_tabs( $current = 'general' ) { $tabs = array( 'general' => __('General'), 'convert' => __('Convert existing PNGs', $this->domain), 'info' => __('Help') ); ?> <h2 class="nav-tab-wrapper"> <?php foreach( $tabs as $tab => $name ){ ?> <a class="nav-tab <?php echo ( $tab == $current ) ? "nav-tab-active" : "" ?>" href="?page=<?php echo basename(__FILE__) ?>&tab=<?php echo $tab ?>"><?php echo $name ?></a> <?php } ?> </h2><br><?php } function admin_options_page() { if ( get_current_screen()->id != $this->plugin_admin_page ) return; $this->tab = ( isset( $_GET['tab'] ) ) ? $_GET['tab'] : 'general'; if(isset($_POST['plugin_sent'])) $this->settings[ $this->tab ] = $_POST; update_option( "png_to_jpg_settings", $this->settings ); ?> <div class="wrap"> <h2><?php _e( 'PNG to JPG', $this->domain ); ?></h2> <?php if(isset($_POST['plugin_sent'])) echo '<div class="updated"><p>'.__( 'Settings saved.' ).'</p></div>'; ?> <form method="post" action="<?php admin_url( 'tools.php?page=' . basename(__FILE__) ); ?>"> <input type="hidden" name="plugin_sent" value="1"><?php $this->plugin_admin_tabs( $this->tab ); switch ( $this->tab ) : case 'general' : $this->tab_general(); break; case 'convert' : $this->tab_convert(); break; case 'info' : $this->tab_info(); break; endswitch; ?> </form> </div><?php } function server_gd_library() { if( !function_exists('imagecreatefrompng') ) { echo '<div class="error"><p>' . __( "<em>PNG to JPG</em> requires gd library enabled!", $this->domain ) . '</p></div>' . "\n"; } } function tab_general(){ ?> <table class="form-table"> <tr> <th> <label for="q_field_1"><?php _e("PNG to JPG convert quality", $this->domain) ?></label> </th> <td> <input type="number" min="1" max="100" step="1" name="jpg_quality" placeholder="90" value="<?php echo $this->settings[ $this->tab ]["jpg_quality"]; ?>" id="q_field_1"> % </td> </tr> <tr> <th> <label for="q_field_2"><?php _e("Convert PNG to JPG during upload", $this->domain) ?></label> </th> <td><?php $this->q_select(array( "name" => "upload_convert", "id" => "q_field_2", "value" => $this->settings[ $this->tab ]["upload_convert"], "options" => array( __("No") => 0, __("Yes") => 1, __("Yes, but only images without transparency", $this->domain) => 2 ) )); ?> </td> </tr> </table> <p class="submit"><input type="submit" class="button button-primary button-large" value="<?php _e( 'Save' ) ?>"></p><?php } function tab_convert(){ global $wpdb; $nonce = wp_create_nonce('convert_old_png'); wp_enqueue_media(); $query_images = new WP_Query(array( 'post_type' => 'attachment', 'post_mime_type' => 'image/png', 'post_status' => 'inherit', 'posts_per_page' => -1, 'no_found_rows' => 1 )); ?> <div class="below-h2 error"> <p> <?php _e('Converted images will be fixed only in these tables: ', $this->domain) ?> <em><?php echo "{$wpdb->prefix}posts, {$wpdb->prefix}postmeta, {$wpdb->prefix}options, {$wpdb->prefix}revslider_slides"; ?></em>. <?php _e('If you need support for more database tables from various plugins, let me know by mail to info@kubiq.sk', $this->domain) ?> </p> </div> <div class="below-h2 error"><p><?php _e('Do you have backup? This operation will alter your original images and cannot be undone!', $this->domain) ?></p></div> <div id="transparency_status_message" class="below-h2 updated"><p><img src="<?php echo admin_url('/images/loading.gif') ?>" alt="" style="vertical-align:sub"> <span><?php _e("Please wait, I'm getting transparency status for images...",$this->domain) ?></span></p></div> <br> <button type="button" class="button button-primary convert-pngs"><?php _e("Convert selected to JPG",$this->domain) ?></button> <button type="button" class="button button-default select-transparent"><?php _e("Select all transparent PNGs",$this->domain) ?></button> <button type="button" class="button button-default select-non-transparent"><?php _e("Select all non-transparent PNGs",$this->domain) ?></button> <br><br> <table class="wp-list-table widefat striped media"> <thead> <tr> <th class="check-column"><input type="checkbox"></th> <th><?php _e('Media') ?></th> <th><?php _e('Has transparency', $this->domain) ?></th> </tr> </thead> <tbody><?php foreach ( $query_images->posts as $image ) { $image->link = wp_get_attachment_url( $image->ID ); ?> <tr data-id="<?php echo $image->ID ?>" data-url="<?php echo $image->link ?>" data-transparency="-"> <th scope="row" class="check-column"> <input type="checkbox" name="media[]" value="<?php echo $image->ID ?>" disabled="disabled"> </th> <td class="title column-title has-row-actions column-primary"> <strong class="has-media-icon"> <a href="<?php echo $image->link ?>"> <span class="media-icon image-icon"> <?php echo wp_get_attachment_image( $image->ID, 'thumbnail' ) ?> </span> <?php echo $image->post_title ?> </a> </strong> <p class="filename"> <?php echo basename($image->link) ?> </p> </td> <td class="transparency"></td> </tr><?php } ?> </tbody> </table> <br> <button type="button" class="button button-primary convert-pngs"><?php _e("Convert selected to JPG",$this->domain) ?></button> <button type="button" class="button button-default select-transparent"><?php _e("Select all transparent PNGs",$this->domain) ?></button> <button type="button" class="button button-default select-non-transparent"><?php _e("Select all non-transparent PNGs",$this->domain) ?></button> <div id="png_preview" class="media-modal wp-core-ui" style="display:none"> <button type="button" class="button-link media-modal-close"><span class="media-modal-icon"></span></button> <div class="media-modal-content"> <div class="edit-attachment-frame mode-select hide-menu hide-router"> <div class="media-frame-title"><h1><?php _e('Attachment Details') ?></h1></div> <div class="media-frame-content"></div> </div> </div> </div> <style type="text/css" media="screen"> .widefat thead .check-column{ padding: 10px 0 0 4px; } #png_preview .media-frame-content{ background: url(<?php echo plugins_url( 'images/bgt.gif', __FILE__ ); ?>) top left repeat; } </style> <script> jQuery(document).ready(function($) { $(".has-media-icon a").click(function(event) { event.preventDefault(); $("#png_preview .media-frame-content").html('<img src="'+this.href+'" alt="">'); $("#png_preview").show(); }); $(document).keyup(function(event) { if( $("#png_preview").is(":visible") ){ var keycode = (event.keyCode ? event.keyCode : event.which); if( keycode == 27 ){ $("#png_preview").hide(); } } }); $("#png_preview .media-modal-close").click(function(event) { event.preventDefault(); $("#png_preview").hide(); }); $(".select-transparent").click(function(event) { event.preventDefault(); $("tr[data-transparency] input").prop("checked",false); $("tr[data-transparency=1] input").prop("checked","checked"); }); $(".select-non-transparent").click(function(event) { event.preventDefault(); $("tr[data-transparency] input").prop("checked",false); $("tr[data-transparency=0] input").prop("checked","checked"); }); $(".convert-pngs").click(function(event) { event.preventDefault(); $("#transparency_status_message span").text("<?php _e("Please wait, I'm converting your PNG images...", $this->domain) ?>"); $("#transparency_status_message").show(); $("tbody tr input").prop("disabled", "disabled"); delete_selected_pngs(); }); get_transparency(); function get_transparency(){ var $el = $('tbody tr[data-transparency="-"]').first(); if( $el.length ){ $.post( "<?php echo admin_url('admin-ajax.php'); ?>", { action: "hasTransparency", id: $el.attr("data-id"), png_url: $el.attr("data-url") }, function(response){ var transparency = parseInt(response); $el.attr("data-transparency", transparency); $el.find(".transparency").html( transparency == 1 ? "YES" : "NO" ); get_transparency(); }); }else{ $("#transparency_status_message").hide(); $("tbody tr input").prop("disabled", false); } } function delete_selected_pngs(){ var $el = $("tbody tr input:checked").first(); if( $el.length ){ var $tr = $el.parent().parent(); $.post( "<?php echo admin_url('admin-ajax.php'); ?>", { action: "convert_old_png", id: $tr.attr("data-id"), nonce: "<?php echo $nonce ?>" }, function(response){ $tr.remove(); delete_selected_pngs(); }); }else{ $("#transparency_status_message").html('<p><?php _e('Done') ?>.</p>'); $("tbody tr input").prop("disabled", false); } } }); </script><?php } function tab_info(){ ?> <p><?php _e('Any ideas, problems, issues?', $this->domain) ?></p> <p>Ing. Jakub Novák</p> <p><a href="mailto:info@kubiq.sk" target="_blank">info@kubiq.sk</a></p> <p><a href="https://kubiq.sk/" target="_blank">https://kubiq.sk</a></p><?php } function q_select( $field_data = array(), $print = 1, $cols = array( 'value' => 'ID', 'text' => 'post_title' ) ){ if(!is_object($field_data)) $field_data = (object)$field_data; $field_data->value = is_array($field_data->value) ? $field_data->value : array($field_data->value); $select = "<select name='{$field_data->name}' id='{$field_data->id}'".( isset($field_data->multiple) ? " multiple" : "").( isset($field_data->size) ? " size='{$field_data->size}'" : "").">"; if( isset($field_data->placeholder) ) $select .= "<option value='' disabled>{$field_data->placeholder}</option>"; foreach($field_data->options as $option => $value){ if( isset( $value->ID ) || isset( $value->term_id ) ){ $post_id = isset( $value->ID ) ? $value->ID : $value->term_id; $value = (array)$value; if ( class_exists( 'PLL_Model' ) ){ $post_lang = pll_get_post_language( $post_id ); if( pll_default_language() != $post_lang ) continue; } $select .= "<option value='".$value[ $cols['value'] ]."'".( in_array( $value[ $cols['value'] ] , $field_data->value ) ? " selected" : "").">".$value[ $cols['text'] ]."</option>"; }else{ $select .= "<option value='{$value}'".( in_array($value, $field_data->value) ? " selected" : "").">{$option}</option>"; } } $select .= "</select>"; if($print) echo $select; else return $select; } function upload_converting( $params ){ if( $params['type'] == 'image/png' ) { if( $this->settings["general"]["upload_convert"] == 1 ){ $params = $this->convert_image( $params ); }elseif( $this->settings["general"]["upload_convert"] == 2 ){ if( ! $this->hasTransparency( $params ) ){ $params = $this->convert_image( $params ); } } } return $params; } function convert_image( $params ){ $img = imagecreatefrompng($params['file']); $bg = imagecreatetruecolor(imagesx($img), imagesy($img)); imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255)); imagealphablending($bg, 1); imagecopy($bg, $img, 0, 0, 0, 0, imagesx($img), imagesy($img)); $newPath = preg_replace("/\.png$/", ".jpg", $params['file']); $newUrl = preg_replace("/\.png$/", ".jpg", $params['url']); if ( imagejpeg( $bg, $newPath, $this->settings["general"]["jpg_quality"] ) ){ unlink($params['file']); $params['file'] = $newPath; $params['url'] = $newUrl; $params['type'] = 'image/jpeg'; return $params; } return 0; } function hasTransparency( $params ) { $transparent = 0; if ( isset($_POST['png_url']) ){ $image = $this->getFullPath( $_POST['png_url'] ); }else{ $image = $params['file']; } $contents = file_get_contents( $image ); if ( ord ( file_get_contents( $image, false, null, 25, 1 ) ) & 4 ) $transparent = 1; if ( stripos( $contents, 'PLTE' ) !== false && stripos( $contents, 'tRNS' ) !== false ) $transparent = 1; if ( isset($_POST['png_url']) ){ echo $transparent; exit(); }else{ return $transparent; } } function getFullPath( $url ){ return str_replace( home_url("/"), ABSPATH, $url ); } function convert_old_png(){ if ( defined('DOING_AJAX') && DOING_AJAX ){ if ( ! wp_verify_nonce( $_POST['nonce'], 'convert_old_png' ) ) die ( 'Wrong nonce!'); $image = get_post($_POST['id']); $image->link = wp_get_attachment_url( $image->ID ); $image->path = $this->getFullPath( $image->link ); $params = array( "ID" => $image->ID, "file" => $image->path, "url" => $image->link, ); if( $this->convert_image( $params ) ){ $this->update_image_data( $image ); } } exit(); } function update_image_data( $image ){ global $wpdb; $replaces = array( basename( $image->link ) ); $thumbs = wp_get_attachment_metadata( $image->ID ); foreach ( $thumbs['sizes'] as $img ) { if( file_exists( dirname($image->path)."/".$img['file'] ) ){ $replaces[] = $img['file']; unlink( dirname($image->path)."/".$img['file'] ); } } wp_update_post(array( 'ID' => $image->ID, 'post_mime_type' => 'image/jpeg' )); $wpdb->update( $wpdb->posts, array( 'guid' => preg_replace("/\.png$/", ".jpg", $image->guid) ), array( 'ID' => $image->ID ), array( '%s' ), array( '%d' ) ); $meta = get_post_meta( $image->ID, '_wp_attached_file', 1 ); $meta = preg_replace("/\.png$/", ".jpg", $meta); update_post_meta( $image->ID, '_wp_attached_file', $meta ); require_once( ABSPATH . 'wp-admin/includes/image.php' ); $newPath = preg_replace("/\.png$/", ".jpg", $image->path); $attach_data = wp_generate_attachment_metadata( $image->ID, $newPath ); wp_update_attachment_metadata( $image->ID, $attach_data ); foreach( $replaces as $image ){ $new_image = substr( $image, 0, -3 ) . "jpg"; // WP: wp_posts $wpdb->query(" UPDATE {$wpdb->posts} SET post_content = REPLACE( post_content, '{$image}', '{$new_image}') WHERE post_content LIKE '%{$image}%' "); // WP: wp_postmeta $wpdb->query(" UPDATE {$wpdb->postmeta} SET meta_value = REPLACE( meta_value, '{$image}', '{$new_image}') WHERE meta_value LIKE '%{$image}%' "); // WP: wp_options $wpdb->query(" UPDATE {$wpdb->options} SET option_value = REPLACE( option_value, '{$image}', '{$new_image}') WHERE option_value LIKE '%{$image}%' "); // Revolution Slider: wp_revslider_slides $wpdb->query(" UPDATE {$wpdb->prefix}revslider_slides SET params = REPLACE( params, '{$image}', '{$new_image}'), layers = REPLACE( layers, '{$image}', '{$new_image}') WHERE params LIKE '%{$image}%' OR layers LIKE '%{$image}%' "); } } } } if (class_exists('png_to_jpg')) { $png_to_jpg_var = new png_to_jpg(); register_activation_hook( __FILE__, array( $png_to_jpg_var, 'activate' ) ); }