├── css ├── styles.min.css └── styles.css ├── inc ├── optimus_media.class.php ├── optimus_cli.class.php ├── optimus_management.class.php ├── optimus.class.php ├── optimus_settings.class.php ├── optimus_hq.class.php └── optimus_request.class.php ├── optimus.php ├── js └── scripts.js └── readme.txt /css/styles.min.css: -------------------------------------------------------------------------------- 1 | .manage-column.column-optimus{width:5em;}.optimus.column-optimus div{width:32px;height:32px;position:relative;background:#b4b9be;margin-left:11px;border-radius:16px;}.optimus.column-optimus p{top:0;left:0;color:#fff;width:32px;height:32px;margin:0;z-index:99;position:absolute;text-align:center;font-size:10px;line-height:32px;}.optimus.column-optimus p:before{top:0;left:0;border:16px solid transparent;z-index:-99;content:'';position:absolute;border-radius:16px;transform:rotate(-45deg);-o-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);}.optimus.column-optimus .one p:before{border-right-color:#7ad03a;}.optimus.column-optimus .two p:before{border-right-color:#7ad03a;border-bottom-color:#7ad03a;}.optimus.column-optimus .three p:before{border-left-color:#7ad03a;border-right-color:#7ad03a;border-bottom-color:#7ad03a;}.optimus.column-optimus .four p:before{border-color:#7ad03a;} -------------------------------------------------------------------------------- /css/styles.css: -------------------------------------------------------------------------------- 1 | /* @group Media */ 2 | 3 | .manage-column.column-optimus { 4 | width: 5em; 5 | } 6 | 7 | .optimus.column-optimus div { 8 | width: 32px; 9 | height: 32px; 10 | position: relative; 11 | background: #b4b9be; 12 | margin-left: 11px; 13 | border-radius: 16px; 14 | } 15 | 16 | .optimus.column-optimus p { 17 | top: 0; 18 | left: 0; 19 | color: #fff; 20 | width: 32px; 21 | height: 32px; 22 | margin: 0; 23 | z-index: 99; 24 | position: absolute; 25 | text-align: center; 26 | font-size: 10px; 27 | line-height: 32px; 28 | } 29 | .optimus.column-optimus p:before { 30 | top: 0; 31 | left: 0; 32 | border: 16px solid transparent; 33 | z-index: -99; 34 | content: ''; 35 | position: absolute; 36 | border-radius: 16px; 37 | 38 | transform: rotate(-45deg); 39 | -o-transform: rotate(-45deg); 40 | -ms-transform: rotate(-45deg); 41 | -moz-transform: rotate(-45deg); 42 | -webkit-transform: rotate(-45deg); 43 | } 44 | 45 | .optimus.column-optimus .one p:before { 46 | border-right-color: #7ad03a; 47 | } 48 | .optimus.column-optimus .two p:before { 49 | border-right-color: #7ad03a; 50 | border-bottom-color: #7ad03a; 51 | } 52 | .optimus.column-optimus .three p:before { 53 | border-left-color: #7ad03a; 54 | border-right-color: #7ad03a; 55 | border-bottom-color: #7ad03a; 56 | } 57 | .optimus.column-optimus .four p:before { 58 | border-color: #7ad03a; 59 | } 60 | 61 | /* @end group */ 62 | 63 | /* @group Management */ 64 | 65 | #optimus-bulk-optimizer #media-items .bar.success { 66 | background-color: #7ad03a; 67 | } 68 | 69 | #optimus-bulk-optimizer #media-items .bar.partial { 70 | background-color: #3a91d0; 71 | } 72 | 73 | #optimus-bulk-optimizer #media-items .bar.info { 74 | background-color: #999; 75 | } 76 | 77 | #optimus-bulk-optimizer #media-items .bar.err { 78 | background-color: #bbb; 79 | } 80 | 81 | #optimus-bulk-optimizer .media-item { 82 | box-shadow: 0px 1px 0px #DFDFDF; 83 | min-height: 36px; 84 | margin-bottom: 1px; 85 | position: relative; 86 | width: 100%; 87 | background: none repeat scroll 0% 0% #FFF; 88 | } 89 | 90 | #optimus-bulk-optimizer .progress~.percent { 91 | float: right; 92 | line-height: 36px; 93 | margin-right: 20px; 94 | } 95 | 96 | #optimus-progress span, #optimus-status span { 97 | background: #eaeaea; 98 | background: rgba(0,0,0,.07); 99 | padding: 5px; 100 | } 101 | 102 | /* @end group */ 103 | -------------------------------------------------------------------------------- /inc/optimus_media.class.php: -------------------------------------------------------------------------------- 1 | 'Optimus' 34 | ) 35 | ); 36 | } 37 | 38 | 39 | /** 40 | * Print Optimus values as column 41 | * 42 | * @since 0.0.1 43 | * @change 1.3.0 44 | * 45 | * @param string $column Column name 46 | * @param integer $id Current object ID 47 | */ 48 | 49 | public static function manage_column($column, $id) 50 | { 51 | /* Falsche Spalte? */ 52 | if ( $column !== 'optimus' ) { 53 | return; 54 | } 55 | 56 | echo self::_column_html($id); 57 | } 58 | 59 | 60 | /** 61 | * Returns the formatted column as HTML 62 | * 63 | * @since 0.0.1 64 | * @change 1.3.0 65 | * 66 | * @param intval $id Object ID 67 | * @return string Column HTML 68 | */ 69 | 70 | private static function _column_html($id) 71 | { 72 | /* Attachment metadata */ 73 | $data = (array)wp_get_attachment_metadata($id); 74 | 75 | /* Data exists? */ 76 | if ( empty($data['optimus']) OR ! is_array($data['optimus']) ) { 77 | return; 78 | } 79 | 80 | /* Array init */ 81 | $optimus = $data['optimus']; 82 | 83 | /* Metadata exists? */ 84 | if ( ! isset($optimus['quantity']) OR ! isset($optimus['profit']) ) { 85 | return; 86 | } 87 | 88 | return sprintf( 89 | '

%d%%

', 90 | self::_pie_class( 91 | $optimus['quantity'] 92 | ), 93 | $optimus['profit'] 94 | ); 95 | } 96 | 97 | 98 | /** 99 | * Specifies the CSS class depending on the amount of compressed files 100 | * 101 | * @since 0.0.8 102 | * @change 1.3.0 103 | * 104 | * @param intval $quantity File quantity 105 | * @return string Optimus CSS class 106 | */ 107 | 108 | private static function _pie_class($quantity) 109 | { 110 | /* Init */ 111 | $quantity = (int)$quantity; 112 | 113 | /* Leer? */ 114 | if ( empty($quantity) ) { 115 | return ''; 116 | } 117 | 118 | /* Loop */ 119 | switch(true) { 120 | case ($quantity == 100): 121 | return 'four'; 122 | case ($quantity <= 25): 123 | return 'one'; 124 | case ($quantity <= 50): 125 | return 'two'; 126 | default: 127 | return 'three'; 128 | } 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /inc/optimus_cli.class.php: -------------------------------------------------------------------------------- 1 | 'table', 'num' => 10 ) ); 23 | 24 | $assets = Optimus_Management::bulk_optimizer_assets(); 25 | $assets = array_slice($assets, 0, $assoc_args['num']); 26 | 27 | foreach ($assets as $key=>$img) { 28 | $assets[$key]['result'] = self::_optimize_image($img); 29 | 30 | if ( $assets[$key]['result'] === false ) { 31 | $assets[$key]['profit'] = 0; 32 | $assets[$key]['quantity'] = 0; 33 | $assets[$key]['webp'] = ''; 34 | } else { 35 | $assets[$key]['profit'] = $assets[$key]['result']['optimus']['profit']; 36 | $assets[$key]['quantity'] = $assets[$key]['result']['optimus']['quantity']; 37 | $assets[$key]['webp'] = $assets[$key]['result']['optimus']['webp']; 38 | } 39 | } 40 | 41 | $formatter = new \WP_CLI\Formatter( $assoc_args, 42 | array( 43 | 'ID', 44 | 'post_title', 45 | 'post_mime_type', 46 | 'profit', 47 | 'quantity', 48 | 'webp' 49 | ), 50 | 'optimize' ); 51 | $formatter->display_items( $assets ); 52 | } 53 | 54 | private static function _optimize_image($img) { 55 | /* get metadata */ 56 | $metadata = wp_get_attachment_metadata($img['ID']); 57 | if (!is_array($metadata)) { 58 | // Metadata missing 59 | return false; 60 | } 61 | 62 | /* optimize image */ 63 | $optimus_metadata = Optimus_Request::optimize_upload_images($metadata, $img['ID']); 64 | 65 | if ( !empty($optimus_metadata['optimus']['error']) ) { 66 | return false; 67 | } 68 | 69 | /* check if optimus array empty */ 70 | if ( empty($optimus_metadata['optimus']) ) { 71 | return false; 72 | } 73 | 74 | /* update metadata */ 75 | update_post_meta($img['ID'], '_wp_attachment_metadata', $optimus_metadata); 76 | 77 | return $optimus_metadata; 78 | } 79 | 80 | public static function add_commands() { 81 | $cmd_optimize = function( $args, $assoc_args ) { self::optimize( $args, $assoc_args ); }; 82 | WP_CLI::add_command( 'optimus optimize', $cmd_optimize, array( 83 | 'shortdesc' => 'Bulk optimize some images.', 84 | 'synopsis' => array( 85 | array( 86 | 'type' => 'assoc', 87 | 'name' => 'num', 88 | 'description' => 'Batch size in number of images to process', 89 | 'optional' => true, 90 | 'default' => 10, 91 | ), 92 | array( 93 | 'type' => 'assoc', 94 | 'name' => 'format', 95 | 'description' => 'Output results in format', 96 | 'optional' => true, 97 | 'default' => 'table', 98 | 'options' => array( 'table', 'csv', 'json' ), 99 | ), 100 | ), 101 | )); 102 | } 103 | } 104 | 105 | -------------------------------------------------------------------------------- /optimus.php: -------------------------------------------------------------------------------- 1 |

'); 46 | message.find('p').html(optimusOptimize.bulkDone) 47 | message.insertAfter(jQuery("#optimus-bulk-optimizer h2")) 48 | } 49 | } 50 | 51 | function bulk_optimize_asset(assets, i) { 52 | var asset = assets[i] 53 | var row = jQuery(jQuery('#media-items').children("div")[i]) 54 | row.find('.percent').html(optimusOptimize.optimizing) 55 | jQuery.ajax({ 56 | url: ajaxurl, 57 | type: "POST", 58 | dataType: "json", 59 | data: { 60 | _nonce: optimusOptimize.nonce, 61 | action: 'optimus_optimize_image', 62 | id: assets[i].ID 63 | }, 64 | success: function(data) { 65 | bulk_optimize_callback(null, data, assets, i) 66 | }, 67 | error: function(xhr, textStatus, errorThrown) { 68 | bulk_optimize_callback(errorThrown, {}, assets, i) 69 | } 70 | }) 71 | jQuery('#optimus-progress span').html(i + 1) 72 | } 73 | 74 | function bulk_optimize(assets) { 75 | var list = jQuery('#media-items') 76 | var row 77 | for (var i = 0; i < assets.length; i++) { 78 | row = jQuery('
') 79 | 80 | row.find('.percent').html(optimusOptimize.waiting) 81 | row.find('.filename').html(assets[i].post_title + ' ' + assets[i].post_mime_type + '') 82 | list.append(row) 83 | } 84 | bulk_optimize_asset(assets, 0) 85 | } 86 | window.optimusBulkOptimizer = bulk_optimize 87 | }).call() 88 | 89 | jQuery(document).ready(function() { 90 | if (typeof adminpage != "undefined" && adminpage === "upload-php") { 91 | jQuery('