├── .gitignore ├── silent.php ├── screenshot-1.png ├── screenshot-2.png ├── js ├── redmond │ ├── images │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ ├── ui-bg_flat_55_fbec88_40x100.png │ │ ├── ui-bg_glass_75_d0e5f5_1x400.png │ │ ├── ui-bg_glass_85_dfeffc_1x400.png │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ ├── ui-bg_inset-hard_100_f5f8f9_1x100.png │ │ ├── ui-bg_inset-hard_100_fcfdfd_1x100.png │ │ └── ui-bg_gloss-wave_55_5c9ccc_500x100.png │ └── jquery-ui-1.7.2.custom.css ├── jquery.ui.progressbar.min.js ├── spin.js └── media.tools.ajax.js ├── README.md ├── readme.txt └── media-tools.php /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /silent.php: -------------------------------------------------------------------------------- 1 | ").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); 15 | this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===c)return this._value();this._setOption("value",a);return this},_setOption:function(a,d){if(a==="value"){this.options.value=d;this._refreshValue();this._trigger("change");this._value()===this.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.max,Math.max(this.min,a))},_refreshValue:function(){var a= 16 | this.value();this.valueDiv.toggleClass("ui-corner-right",a===this.max).width(a+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.6"})})(jQuery); 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Media Tools for WordPress 2 | ========================= 3 | Contributors: c3mdigital 4 | Tags: media, media library, images, featured images, post thumbnails, timthumb 5 | Requires at least: 3.1 6 | Tested up to: 3.5 beta 1 7 | Stable tag: 1.1 8 | Donate link: http://www.redcross.org/ 9 | License: GPLv2 or later 10 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 11 | 12 | A set of tools to help manage your media library. Imports external images and attaches them to your posts, pages or custom post types. 13 | 14 | ### A set of tools to help manage your media library. 15 | 16 | #### Description 17 | 18 | Improvements are coming to the WordPress media library in 3.5. If your not using the media library this plugin will import all the external images found in your posts or pages and import them into the media library and attach them. 19 | 20 | This plugin will help you convert from using Timthumb to WordPress built in featured image / post thumbnail support 21 | 22 | 23 | ### The Tools 24 | 25 | * Import and attach - imports and attaches all external referenced images in your posts 26 | * Set Featured Image - finds the first attached image to post and sets it as the featured image 27 | * Import media from a directory on your server and add them to your media library 28 | * Add post thumbnail support to your site set thumbnail sizes 29 | * More tools coming soon.... 30 | 31 | 32 | Control and filter the import script by post type, author, date range, or category. 33 | 34 | Ajax interface that converts the images with one simple click. 35 | 36 | #### Changelog 37 | 38 | #### 1.1 39 | 40 | * Added jQuery UI Progress bar and now process images individually to prevent time outs 41 | 42 | ##### 1.0 43 | 44 | * Initial version added to WordPress.org 45 | 46 | ##### 1.0.1 47 | 48 | * Added WordPress and PHP version check on activation hook 49 | -------------------------------------------------------------------------------- /readme.txt: -------------------------------------------------------------------------------- 1 | === Media Tools === 2 | Contributors: c3mdigital 3 | Tags: media, media library, images, featured images, post thumbnails, timthumb 4 | Requires at least: 3.1 5 | Tested up to: 3.5 beta 1 6 | Stable tag: 1.1 7 | Donate link: http://www.redcross.org/ 8 | License: GPLv2 or later 9 | License URI: http://www.gnu.org/licenses/gpl-2.0.html 10 | 11 | A set of tools to help manage your media library. Imports external images and attaches them to your posts, pages or custom post types. 12 | 13 | 14 | == Description == 15 | 16 | A set of tools to help manage your media library. 17 | 18 | Big improvements are coming to the WordPress media library in 3.5. If your not using the media library this plugin will import all the external images found in your posts or pages and import them into the media library and attach them. 19 | 20 | This plugin will help you recover from your Timthumb addiction. If you have been using Timthumb now is the time to come clean. 21 | 22 | The Tools 23 | 24 | * Import and attach - imports and attaches all external referenced images in your posts 25 | * Set Featured Image - finds the first attached image to post and sets it as the featured image 26 | * Add post thumbnail support to your site set thumbnail sizes 27 | 28 | Control and filter the import script by post type, author, date range, or category. 29 | 30 | Ajax interface that imports, attaches and sets featured images with one click. 31 | Integrates with the Regenerate Thumbnails plugin to regenerate thumbnail crops based on newly selected image sizes 32 | 33 | == Installation == 34 | 35 | 1. Upload the media-tools folder to your wp-content/plugins dir and activate through the dashboard or 36 | 2. Install or upload directly from the admin dashboard 37 | 38 | The options and tools are located under the tools menu. 39 | 40 | **Please Note: Requires PHP 5.2** 41 | 42 | == Frequently Asked Questions == 43 | 44 | = What does this plugin do? = 45 | 46 | This plugin allows you to go through all your posts, pages, or custom post types and import any externally referenced images into your media library 47 | and attaches them to the post and can even set the first image as the featured image. 48 | 49 | It also enables post thumbnail support if your current theme does not support post thumbnails. You can even define a custom thumbnail image size. 50 | 51 | = I moved my website to a new domain and server and none of my images are showing in the media library or in my posts. How can I fix this? = 52 | 53 | If the images are still on the old server you can use this plugin to re import all of them into your media library. You will want to first delete your 54 | your images from the media library so it un attaches the broken links from your posts then run the import tool to re attach them and import them back into 55 | your media library. 56 | 57 | = Isn't it illegal to download images and show them on my website? = 58 | 59 | If you do not have permission to use the images then yes it is a copyright violation to use other peoples images on your website. It is your 60 | responsibility to make sure you have legal right to use any images. PLEASE DON'T USE THIS PLUGIN TO VIOLATE COPYRIGHT LAWS! 61 | 62 | = Where can I get support for this plugin? = 63 | 64 | For immediate support you can check the #WordPress IRC channel on irc.freenode.net and see if I'm available to help you. Just type ping c3mdigital 65 | and if I'm around I will be glad to help. You can also use the WordPress support forums and I will try to answer as soon as possible. 66 | 67 | == Screenshots == 68 | 69 | 1. The Import and Attachment Tools 70 | 2. The Add additional image sizes options page 71 | 72 | == Changelog == 73 | 74 | = 1.0 = 75 | 76 | * Initial version added to WordPress.org 77 | 78 | == Upgrade Notice == 79 | 80 | Upgrade? This is the first version you don't need to upgrade yet... -------------------------------------------------------------------------------- /js/spin.js: -------------------------------------------------------------------------------- 1 | (function(a,b,c){function g(a,c){var d=b.createElement(a||"div"),e;for(e in c)d[e]=c[e];return d}function h(a){for(var b=1,c=arguments.length;b>1):c.left+e)+"px",top:(c.top=="auto"?i.y-h.y+(a.offsetHeight>>1):c.top+e)+"px"})),d.setAttribute("aria-role","progressbar"),b.lines(d,b.opts);if(!f){var j=0,k=c.fps,m=k/c.speed,o=(1-c.opacity)/(m*c.trail/100),p=m/c.lines;!function q(){j++;for(var a=c.lines;a;a--){var e=Math.max(1-(j+a*p)%m*o,c.opacity);b.opacity(d,c.lines-a,e,c)}b.timeout=b.el&&setTimeout(q,~~(1e3/k))}()}return b},stop:function(){var a=this.el;return a&&(clearTimeout(this.timeout),a.parentNode&&a.parentNode.removeChild(a),this.el=c),this},lines:function(a,b){function e(a,d){return l(g(),{position:"absolute",width:b.length+b.width+"px",height:b.width+"px",background:a,boxShadow:d,transformOrigin:"left",transform:"rotate("+~~(360/b.lines*c+b.rotate)+"deg) translate("+b.radius+"px"+",0)",borderRadius:(b.width>>1)+"px"})}var c=0,d;for(;c',b)}var b=l(g("group"),{behavior:"url(#default#VML)"});!k(b,"transform")&&b.adj?(i.addRule(".spin-vml","behavior:url(#default#VML)"),p.prototype.lines=function(b,c){function f(){return l(a("group",{coordsize:e+" "+e,coordorigin:-d+" "+ -d}),{width:e,height:e})}function k(b,e,g){h(i,h(l(f(),{rotation:360/c.lines*b+"deg",left:~~e}),h(l(a("roundrect",{arcsize:1}),{width:d,height:c.width,left:c.radius,top:-c.width>>1,filter:g}),a("fill",{color:c.color,opacity:c.opacity}),a("stroke",{opacity:0}))))}var d=c.length+c.width,e=2*d,g=-(c.width+c.length)*2+"px",i=l(f(),{position:"absolute",top:g,left:g}),j;if(c.shadow)for(j=1;j<=c.lines;j++)k(j,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(j=1;j<=c.lines;j++)k(j);return h(b,i)},p.prototype.opacity=function(a,b,c,d){var e=a.firstChild;d=d.shadow&&d.lines||0,e&&b+dRunning......Please be patient. This could take a while." ); 63 | bar.progressbar(); 64 | barPercent.html( "0%" ); 65 | var obj = form.serializeObject(e); 66 | $.ajax({ 67 | type: "POST", 68 | url: ajaxurl, 69 | dataType: 'json', 70 | data: { 71 | action: "convert-featured", 72 | args: obj 73 | 74 | }, 75 | success: function(data) { 76 | 77 | var mt_total = data.length; 78 | 79 | var obj = form.serializeObject(e); 80 | var arg = obj['choose-tool']; 81 | $.each(data, function(i, data) { 82 | process(data, arg, mt_total ); 83 | 84 | }) 85 | } 86 | 87 | }); 88 | 89 | function process(data, obj, mt_total ) { 90 | $.ajax({ 91 | type:"POST", 92 | url:ajaxurl, 93 | data:{ 94 | action:"process-data", 95 | args: obj, 96 | ids: data 97 | }, 98 | success:function (response) { 99 | progressStatus(response, mt_total ); 100 | $("#featured-ajax-response").append("
" + response + "
"); 101 | $("#converting").replaceWith("

Results

"); 102 | 103 | }, 104 | complete:function (response) { 105 | 106 | ajaxDone(response); 107 | 108 | } 109 | }); 110 | } 111 | function ajaxDone(data) { 112 | $.ajax({ 113 | type: "POST", 114 | url: ajaxurl, 115 | data: { 116 | action: "ajax-done" 117 | }, 118 | success: function(done) { 119 | spinner.stop(); 120 | $("#my-message").html("

Image processing complete.

"); 121 | $("#my-message").show(); 122 | } 123 | }) 124 | } 125 | 126 | return false; 127 | 128 | }); 129 | 130 | function progressStatus(response, mt_total) { 131 | 132 | bar.progressbar("value", ( mt_count / mt_total ) * 100); 133 | barPercent.html(Math.round(( mt_count / mt_total ) * 1000) / 10 + "%"); 134 | 135 | mt_count = mt_count + 1; 136 | } 137 | 138 | 139 | 140 | $("select#choose-tool").change(function(e) { 141 | var tool = ''; 142 | $("select#choose-tool option:selected").each(function(e) { 143 | tool += $(this).text(); 144 | }); 145 | $("#submit").val(tool); 146 | 147 | }).trigger("change"); 148 | }); 149 | 150 | }(jQuery); -------------------------------------------------------------------------------- /js/redmond/jquery-ui-1.7.2.custom.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI CSS Framework 3 | * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) 4 | * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. 5 | */ 6 | 7 | /* Layout helpers 8 | ----------------------------------*/ 9 | .ui-helper-hidden { display: none; } 10 | .ui-helper-hidden-accessible { position: absolute; left: -99999999px; } 11 | .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } 12 | .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } 13 | .ui-helper-clearfix { display: inline-block; } 14 | /* required comment for clearfix to work in Opera \*/ 15 | * html .ui-helper-clearfix { height:1%; } 16 | .ui-helper-clearfix { display:block; } 17 | /* end clearfix */ 18 | .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } 19 | 20 | 21 | /* Interaction Cues 22 | ----------------------------------*/ 23 | .ui-state-disabled { cursor: default !important; } 24 | 25 | 26 | /* Icons 27 | ----------------------------------*/ 28 | 29 | /* states and images */ 30 | .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } 31 | 32 | 33 | /* Misc visuals 34 | ----------------------------------*/ 35 | 36 | /* Overlays */ 37 | .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } 38 | 39 | 40 | 41 | /* 42 | * jQuery UI CSS Framework 43 | * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) 44 | * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. 45 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=06_inset_hard.png&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=02_glass.png&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px 46 | */ 47 | 48 | 49 | /* Component containers 50 | ----------------------------------*/ 51 | .ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; } 52 | .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; } 53 | .ui-widget-content { border: 1px solid #a6c9e2; background: #fcfdfd url(images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x; color: #222222; } 54 | .ui-widget-content a { color: #222222; } 55 | .ui-widget-header { border: 1px solid #4297d7; background: #5c9ccc url(images/ui-bg_gloss-wave_55_5c9ccc_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } 56 | .ui-widget-header a { color: #ffffff; } 57 | 58 | /* Interaction states 59 | ----------------------------------*/ 60 | .ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #c5dbec; background: #dfeffc url(images/ui-bg_glass_85_dfeffc_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #2e6e9e; outline: none; } 61 | .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2e6e9e; text-decoration: none; outline: none; } 62 | .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #79b7e7; background: #d0e5f5 url(images/ui-bg_glass_75_d0e5f5_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1d5987; outline: none; } 63 | .ui-state-hover a, .ui-state-hover a:hover { color: #1d5987; text-decoration: none; outline: none; } 64 | .ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #79b7e7; background: #f5f8f9 url(images/ui-bg_inset-hard_100_f5f8f9_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #e17009; outline: none; } 65 | .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #e17009; outline: none; text-decoration: none; } 66 | 67 | /* Interaction Cues 68 | ----------------------------------*/ 69 | .ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #fad42e; background: #fbec88 url(images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x; color: #363636; } 70 | .ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #363636; } 71 | .ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } 72 | .ui-state-error a, .ui-widget-content .ui-state-error a { color: #cd0a0a; } 73 | .ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #cd0a0a; } 74 | .ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } 75 | .ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; } 76 | .ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } 77 | 78 | /* Icons 79 | ----------------------------------*/ 80 | 81 | /* states and images */ 82 | .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_469bdd_256x240.png); } 83 | .ui-widget-content .ui-icon {background-image: url(images/ui-icons_469bdd_256x240.png); } 84 | .ui-widget-header .ui-icon {background-image: url(images/ui-icons_d8e7f3_256x240.png); } 85 | .ui-state-default .ui-icon { background-image: url(images/ui-icons_6da8d5_256x240.png); } 86 | .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_217bc0_256x240.png); } 87 | .ui-state-active .ui-icon {background-image: url(images/ui-icons_f9bd01_256x240.png); } 88 | .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } 89 | .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } 90 | 91 | /* positioning */ 92 | .ui-icon-carat-1-n { background-position: 0 0; } 93 | .ui-icon-carat-1-ne { background-position: -16px 0; } 94 | .ui-icon-carat-1-e { background-position: -32px 0; } 95 | .ui-icon-carat-1-se { background-position: -48px 0; } 96 | .ui-icon-carat-1-s { background-position: -64px 0; } 97 | .ui-icon-carat-1-sw { background-position: -80px 0; } 98 | .ui-icon-carat-1-w { background-position: -96px 0; } 99 | .ui-icon-carat-1-nw { background-position: -112px 0; } 100 | .ui-icon-carat-2-n-s { background-position: -128px 0; } 101 | .ui-icon-carat-2-e-w { background-position: -144px 0; } 102 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 103 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 104 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 105 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 106 | .ui-icon-triangle-1-s { background-position: -64px -16px; } 107 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 108 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 109 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 110 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 111 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 112 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 113 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 114 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 115 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 116 | .ui-icon-arrow-1-s { background-position: -64px -32px; } 117 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 118 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 119 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 120 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 121 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 122 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 123 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 124 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 125 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 126 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 127 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 128 | .ui-icon-arrowthick-1-n { background-position: 0 -48px; } 129 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 130 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 131 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 132 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 133 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 134 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 135 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 136 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 137 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 138 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 139 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 140 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 141 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 142 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 143 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 144 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 145 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 146 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 147 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 148 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 149 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 150 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 151 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 152 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 153 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 154 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 155 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 156 | .ui-icon-arrow-4 { background-position: 0 -80px; } 157 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 158 | .ui-icon-extlink { background-position: -32px -80px; } 159 | .ui-icon-newwin { background-position: -48px -80px; } 160 | .ui-icon-refresh { background-position: -64px -80px; } 161 | .ui-icon-shuffle { background-position: -80px -80px; } 162 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 163 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 164 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 165 | .ui-icon-folder-open { background-position: -16px -96px; } 166 | .ui-icon-document { background-position: -32px -96px; } 167 | .ui-icon-document-b { background-position: -48px -96px; } 168 | .ui-icon-note { background-position: -64px -96px; } 169 | .ui-icon-mail-closed { background-position: -80px -96px; } 170 | .ui-icon-mail-open { background-position: -96px -96px; } 171 | .ui-icon-suitcase { background-position: -112px -96px; } 172 | .ui-icon-comment { background-position: -128px -96px; } 173 | .ui-icon-person { background-position: -144px -96px; } 174 | .ui-icon-print { background-position: -160px -96px; } 175 | .ui-icon-trash { background-position: -176px -96px; } 176 | .ui-icon-locked { background-position: -192px -96px; } 177 | .ui-icon-unlocked { background-position: -208px -96px; } 178 | .ui-icon-bookmark { background-position: -224px -96px; } 179 | .ui-icon-tag { background-position: -240px -96px; } 180 | .ui-icon-home { background-position: 0 -112px; } 181 | .ui-icon-flag { background-position: -16px -112px; } 182 | .ui-icon-calendar { background-position: -32px -112px; } 183 | .ui-icon-cart { background-position: -48px -112px; } 184 | .ui-icon-pencil { background-position: -64px -112px; } 185 | .ui-icon-clock { background-position: -80px -112px; } 186 | .ui-icon-disk { background-position: -96px -112px; } 187 | .ui-icon-calculator { background-position: -112px -112px; } 188 | .ui-icon-zoomin { background-position: -128px -112px; } 189 | .ui-icon-zoomout { background-position: -144px -112px; } 190 | .ui-icon-search { background-position: -160px -112px; } 191 | .ui-icon-wrench { background-position: -176px -112px; } 192 | .ui-icon-gear { background-position: -192px -112px; } 193 | .ui-icon-heart { background-position: -208px -112px; } 194 | .ui-icon-star { background-position: -224px -112px; } 195 | .ui-icon-link { background-position: -240px -112px; } 196 | .ui-icon-cancel { background-position: 0 -128px; } 197 | .ui-icon-plus { background-position: -16px -128px; } 198 | .ui-icon-plusthick { background-position: -32px -128px; } 199 | .ui-icon-minus { background-position: -48px -128px; } 200 | .ui-icon-minusthick { background-position: -64px -128px; } 201 | .ui-icon-close { background-position: -80px -128px; } 202 | .ui-icon-closethick { background-position: -96px -128px; } 203 | .ui-icon-key { background-position: -112px -128px; } 204 | .ui-icon-lightbulb { background-position: -128px -128px; } 205 | .ui-icon-scissors { background-position: -144px -128px; } 206 | .ui-icon-clipboard { background-position: -160px -128px; } 207 | .ui-icon-copy { background-position: -176px -128px; } 208 | .ui-icon-contact { background-position: -192px -128px; } 209 | .ui-icon-image { background-position: -208px -128px; } 210 | .ui-icon-video { background-position: -224px -128px; } 211 | .ui-icon-script { background-position: -240px -128px; } 212 | .ui-icon-alert { background-position: 0 -144px; } 213 | .ui-icon-info { background-position: -16px -144px; } 214 | .ui-icon-notice { background-position: -32px -144px; } 215 | .ui-icon-help { background-position: -48px -144px; } 216 | .ui-icon-check { background-position: -64px -144px; } 217 | .ui-icon-bullet { background-position: -80px -144px; } 218 | .ui-icon-radio-off { background-position: -96px -144px; } 219 | .ui-icon-radio-on { background-position: -112px -144px; } 220 | .ui-icon-pin-w { background-position: -128px -144px; } 221 | .ui-icon-pin-s { background-position: -144px -144px; } 222 | .ui-icon-play { background-position: 0 -160px; } 223 | .ui-icon-pause { background-position: -16px -160px; } 224 | .ui-icon-seek-next { background-position: -32px -160px; } 225 | .ui-icon-seek-prev { background-position: -48px -160px; } 226 | .ui-icon-seek-end { background-position: -64px -160px; } 227 | .ui-icon-seek-first { background-position: -80px -160px; } 228 | .ui-icon-stop { background-position: -96px -160px; } 229 | .ui-icon-eject { background-position: -112px -160px; } 230 | .ui-icon-volume-off { background-position: -128px -160px; } 231 | .ui-icon-volume-on { background-position: -144px -160px; } 232 | .ui-icon-power { background-position: 0 -176px; } 233 | .ui-icon-signal-diag { background-position: -16px -176px; } 234 | .ui-icon-signal { background-position: -32px -176px; } 235 | .ui-icon-battery-0 { background-position: -48px -176px; } 236 | .ui-icon-battery-1 { background-position: -64px -176px; } 237 | .ui-icon-battery-2 { background-position: -80px -176px; } 238 | .ui-icon-battery-3 { background-position: -96px -176px; } 239 | .ui-icon-circle-plus { background-position: 0 -192px; } 240 | .ui-icon-circle-minus { background-position: -16px -192px; } 241 | .ui-icon-circle-close { background-position: -32px -192px; } 242 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 243 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 244 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 245 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 246 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 247 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 248 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 249 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 250 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 251 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 252 | .ui-icon-circle-check { background-position: -208px -192px; } 253 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 254 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 255 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 256 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 257 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 258 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 259 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 260 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 261 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 262 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 263 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 264 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 265 | 266 | 267 | /* Misc visuals 268 | ----------------------------------*/ 269 | 270 | /* Corner radius */ 271 | .ui-corner-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; } 272 | .ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; } 273 | .ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; } 274 | .ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; } 275 | .ui-corner-top { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; } 276 | .ui-corner-bottom { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; } 277 | .ui-corner-right { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; } 278 | .ui-corner-left { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; } 279 | .ui-corner-all { -moz-border-radius: 5px; -webkit-border-radius: 5px; } 280 | 281 | /* Overlays */ 282 | .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } 283 | .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; }/* Accordion 284 | ----------------------------------*/ 285 | .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } 286 | .ui-accordion .ui-accordion-li-fix { display: inline; } 287 | .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } 288 | .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; } 289 | .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } 290 | .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; } 291 | .ui-accordion .ui-accordion-content-active { display: block; }/* Datepicker 292 | ----------------------------------*/ 293 | .ui-datepicker { width: 17em; padding: .2em .2em 0; } 294 | .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } 295 | .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } 296 | .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } 297 | .ui-datepicker .ui-datepicker-prev { left:2px; } 298 | .ui-datepicker .ui-datepicker-next { right:2px; } 299 | .ui-datepicker .ui-datepicker-prev-hover { left:1px; } 300 | .ui-datepicker .ui-datepicker-next-hover { right:1px; } 301 | .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } 302 | .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } 303 | .ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; } 304 | .ui-datepicker select.ui-datepicker-month-year {width: 100%;} 305 | .ui-datepicker select.ui-datepicker-month, 306 | .ui-datepicker select.ui-datepicker-year { width: 49%;} 307 | .ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; } 308 | .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } 309 | .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } 310 | .ui-datepicker td { border: 0; padding: 1px; } 311 | .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } 312 | .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } 313 | .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } 314 | .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } 315 | 316 | /* with multiple calendars */ 317 | .ui-datepicker.ui-datepicker-multi { width:auto; } 318 | .ui-datepicker-multi .ui-datepicker-group { float:left; } 319 | .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } 320 | .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } 321 | .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } 322 | .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } 323 | .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } 324 | .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } 325 | .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } 326 | .ui-datepicker-row-break { clear:both; width:100%; } 327 | 328 | /* RTL support */ 329 | .ui-datepicker-rtl { direction: rtl; } 330 | .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } 331 | .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } 332 | .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } 333 | .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } 334 | .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } 335 | .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } 336 | .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } 337 | .ui-datepicker-rtl .ui-datepicker-group { float:right; } 338 | .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } 339 | .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } 340 | 341 | /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ 342 | .ui-datepicker-cover { 343 | display: none; /*sorry for IE5*/ 344 | display/**/: block; /*sorry for IE5*/ 345 | position: absolute; /*must have*/ 346 | z-index: -1; /*must have*/ 347 | filter: mask(); /*must have*/ 348 | top: -4px; /*must have*/ 349 | left: -4px; /*must have*/ 350 | width: 200px; /*must have*/ 351 | height: 200px; /*must have*/ 352 | }/* Dialog 353 | ----------------------------------*/ 354 | .ui-dialog { position: relative; padding: .2em; width: 300px; } 355 | .ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: relative; } 356 | .ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; } 357 | .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } 358 | .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } 359 | .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } 360 | .ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } 361 | .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } 362 | .ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } 363 | .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } 364 | .ui-draggable .ui-dialog-titlebar { cursor: move; } 365 | /* Progressbar 366 | ----------------------------------*/ 367 | .ui-progressbar { height:2em; text-align: left; } 368 | .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable 369 | ----------------------------------*/ 370 | .ui-resizable { position: relative;} 371 | .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} 372 | .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } 373 | .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; } 374 | .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; } 375 | .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; } 376 | .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; } 377 | .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } 378 | .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } 379 | .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } 380 | .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider 381 | ----------------------------------*/ 382 | .ui-slider { position: relative; text-align: left; } 383 | .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } 384 | .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; } 385 | 386 | .ui-slider-horizontal { height: .8em; } 387 | .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } 388 | .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } 389 | .ui-slider-horizontal .ui-slider-range-min { left: 0; } 390 | .ui-slider-horizontal .ui-slider-range-max { right: 0; } 391 | 392 | .ui-slider-vertical { width: .8em; height: 100px; } 393 | .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } 394 | .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } 395 | .ui-slider-vertical .ui-slider-range-min { bottom: 0; } 396 | .ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs 397 | ----------------------------------*/ 398 | .ui-tabs { padding: .2em; zoom: 1; } 399 | .ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; } 400 | .ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; } 401 | .ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; } 402 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; } 403 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } 404 | .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ 405 | .ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; } 406 | .ui-tabs .ui-tabs-hide { display: none !important; } 407 | -------------------------------------------------------------------------------- /media-tools.php: -------------------------------------------------------------------------------- 1 | add_image_sizes(); 48 | $this->actions(); 49 | } 50 | 51 | /** 52 | * Plugin Activation hook function to check for Minimum PHP and WordPress versions 53 | * @param string $wp Minimum version of WordPress required for this plugin 54 | * @param string $php Minimum version of PHP required for this plugin 55 | */ 56 | function activate( $wp = '3.1', $php = '5.2.4' ) { 57 | global $wp_version; 58 | if ( version_compare( PHP_VERSION, $php, '<' ) ) 59 | $flag = 'PHP'; 60 | elseif 61 | ( version_compare( $wp_version, $wp, '<' ) ) 62 | $flag = 'WordPress'; 63 | else 64 | return; 65 | $version = 'PHP' == $flag ? $php : $wp; 66 | deactivate_plugins( basename( __FILE__ ) ); 67 | wp_die('

The Media Tools plugin requires'.$flag.' version '.$version.' or greater.

','Plugin Activation Error', array( 'response'=>200, 'back_link'=>TRUE ) ); 68 | } 69 | 70 | function actions() { 71 | add_action( 'admin_menu', array ( $this, 'admin_menu' ) ); 72 | add_action( 'init', array( $this, 'load_settings' ) ); 73 | add_action( 'admin_enqueue_scripts', array ( $this, 'media_tools_js' ) ); 74 | add_action( 'wp_ajax_convert-featured', array ( $this, 'ajax_handler' ) ); 75 | add_action( 'wp_ajax_process-data', array( $this, 'process_image' ) ); 76 | add_action( 'ap_ajax_ajax-done', array( $this, 'ajax_complete') ); 77 | add_action( 'admin_init', array( $this, 'register_media_options' ) ); 78 | add_action( 'admin_init', array ( $this, 'register_media_tools' ) ); 79 | } 80 | 81 | function load_settings() { 82 | $this->media_tools = (array)get_option( $this->media_tools_key ); 83 | $this->media_settings = (array) get_option( $this->media_settings_key ); 84 | $this->media_settings = array_merge( array( 'img_handle' => '', 'img_width' => '', 'img_height' => '', 'img_crop' => '' ), $this->media_settings ); 85 | $this->media_tools = array_merge( array ( ), $this->media_tools ); 86 | } 87 | 88 | function register_media_tools() { 89 | $this->media_settings_tabs[$this->media_tools_key] = 'Media Tools'; 90 | register_setting( $this->media_tools_key, $this->media_tools_key ); 91 | } 92 | 93 | function register_media_options() { 94 | $this->media_settings_tabs[$this->media_settings_key] = 'Media Options'; 95 | register_setting( $this->media_settings_key, $this->media_settings_key ); 96 | add_settings_section( 'media_options_general', 'Add additional image size', array( $this, 'section_description' ), $this->media_settings_key ); 97 | add_settings_field( 'img_handle', 'Image Handle', array( $this, 'field_media_options' ), $this->media_settings_key, 'media_options_general' ); 98 | add_settings_field( 'img_width', 'Image Width', array ( $this, 'field_width_options' ), $this->media_settings_key, 'media_options_general' ); 99 | add_settings_field( 'img_height', 'Image Height', array ( $this, 'field_height_options' ), $this->media_settings_key, 'media_options_general' ); 100 | add_settings_field( 'img_crop', 'Image Crop Factor', array ( $this, 'field_crop_options' ), $this->media_settings_key, 'media_options_general' ); 101 | } 102 | 103 | function section_description() { 104 | echo 'WordPress custom featured image sizes require a handle, height, width, and crop factor'; 105 | } 106 | /** @todo Validation function for text input fields */ 107 | function field_media_options() { ?> 108 |
109 | 112 | 113 | 116 | 117 | 120 | 124 | '; 128 | wp_nonce_field( 'options.php' ); 129 | echo '
'; 130 | $this->show_thumb_sizes(); 131 | echo '
'; 132 | echo '
'; 133 | settings_fields( $tab ); 134 | do_settings_sections( $tab ); 135 | submit_button( 'Add Image Size'); 136 | echo '
'; 137 | echo ''; 138 | echo '
'; 139 | if ( class_exists( 'RegenerateThumbnails' ) ) { 140 | $regen = new RegenerateThumbnails(); 141 | $regen->regenerate_interface(); 142 | 143 | } else { 144 | _e( '

Regenerate Thumbnails

' ); 145 | printf( __('

Install Regenerate Thumbnails to crop all images that you have uploaded to your blog. This is useful if you\'ve changed any of the thumbnail dimensions above or on the media settings page

' ), admin_url( 'options-media.php') ); 146 | 147 | $url = current_user_can( 'install_plugins' ) ? wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=regenerate-thumbnails' ), 'install-plugin_regenerate-thumbnails' ) : 'http://wordpress.org/extend/plugins/regenerate-thumbnails/'; 148 | _e( 'Install Regenerate Thumbnails' ); 149 | } 150 | 151 | } 152 | 153 | function add_image_sizes() { 154 | $ops = (array) get_option( $this->media_settings_key ); 155 | if ( ! empty( $ops ) && isset( $ops['img_crop'] ) && isset( $ops['img_handle'] ) && isset( $ops['img_width'] ) && isset( $ops['img_height'] ) ) { 156 | $crop = $ops['img_crop'] == '1' ? true : false; 157 | add_image_size( $ops['img_handle'] , (int) $ops['img_width'], (int) $ops['img_height'], $crop ); 158 | } 159 | } 160 | 161 | function show_thumb_sizes() { 162 | global $_wp_additional_image_sizes; ?> 163 |

164 |
    165 | $props ) { 166 | $crop = true == $props['crop'] ? 'Hard Crop' : 'Soft Crop'; 167 | _e( '
  • '.$size.'

    ' ); 168 | _e( 'Width: '.$props['width'].'
    ' ); 169 | _e( 'Height: '.$props['height'].'
    ' ); 170 | _e( 'Crop: ' .$crop.'
    ' ); 171 | _e( '
  • ' ); 172 | } 173 | echo '
'; 174 | } 175 | 176 | /** 177 | * Enqueue javascript for media tools admin page 178 | * @param string $hook reference to current admin page 179 | */ 180 | function media_tools_js( $hook ) { 181 | if( 'tools_page_media_tabs' != $hook ) 182 | return; 183 | wp_enqueue_script( 'media-tools-ajax', plugins_url( 'js/media.tools.ajax.js', __FILE__), array( 'jquery', 'jquery-spin' ), '1.0.1' ); 184 | wp_enqueue_script( 'jquery-spin', plugins_url( 'js/spin.js', __FILE__), array('jquery' ) ); 185 | wp_enqueue_script( 'jquery-ui-progressbar', plugins_url( 'js/jquery.ui.progressbar.min.js', __FILE__ ), array ( 'jquery-ui-core', 'jquery-ui-widget' ), '1.8.6' ); 186 | wp_enqueue_style( 'jquery-ui-redmond', plugins_url( 'js/redmond/jquery-ui-1.7.2.custom.css', __FILE__ ), array (), '1.7.2' ); 187 | } 188 | 189 | function admin_menu() { 190 | add_submenu_page( 'tools.php', 'Media Tools', 'Media Tools', 'manage_options', $this->media_tabs_key, array( $this, 'admin_media_page') ); 191 | } 192 | 193 | function admin_media_page() { 194 | $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : $this->media_tools_key; ?> 195 |
196 | menu_tabs( $tab ); 197 | 198 | switch ( $tab ) : 199 | case $this->media_tools_key : 200 | $this->home_tab(); 201 | break; 202 | case $this->media_settings_key : 203 | $this->options_tab( $tab ); 204 | break; 205 | endswitch; ?> 206 |
207 | 208 | media_tools_key; 213 | echo '

'; 214 | echo ''; 221 | } 222 | 223 | function home_tab() { 224 | global $wpdb; 225 | $title = __( 'WordPress Media Tools' ); ?> 226 | 227 |
228 |

229 | 230 |

' ); ?> 231 |

232 | 233 |
234 |
235 | 241 |
242 |

243 |

244 | 245 | 246 |

247 |
248 | 249 |

250 |
251 |

256 | 257 |

258 |

259 |

260 | 261 |

262 |
    263 |
  • __( 'All' ) ) ); ?>
  • 264 |
  • get_col( "SELECT DISTINCT post_author FROM {$wpdb->posts} WHERE post_type = 'post'" ); 265 | wp_dropdown_users( array ( 'include' => $authors, 'name' => 'post_author', 'multi' => true, 'show_option_all' => __( 'All' ) ) );?> 266 |
  • 267 |
  • 268 | 272 | 276 |
  • 277 |
  • 278 | 285 |
  • 286 |
287 | 288 |

289 |
    290 |
  • get_col( "SELECT DISTINCT post_author FROM {$wpdb->posts} WHERE post_type = 'page'" ); 292 | wp_dropdown_users( array ( 'include' => $authors, 'name' => 'page_author', 'multi' => true, 'show_option_all' => __( 'All' ) ) );?> 293 |
  • 294 |
  • 295 | 299 | 303 |
  • 304 |
  • 305 | 311 |
  • 312 |
313 | 314 | false, 'can_export' => true, 'show_ui' => true ), 'objects' ) as $post_type ) : ?> 315 |

316 | 317 | 318 | 319 |
320 | 321 |
322 |
323 |
324 | 325 |
326 | 327 | query( $args ); 371 | foreach( $ids as $id ) { 372 | $id_array[] = (int)$id; 373 | } 374 | 375 | die( json_encode( $id_array ) ); 376 | } 377 | 378 | function ajax_complete() { 379 | die( 'Done....'); 380 | } 381 | 382 | function process_image() { 383 | $response = ''; 384 | $data[] = ''; 385 | $error = 0; 386 | if ( isset( $_POST['ids'] ) ) 387 | $ids = $_POST['ids']; 388 | 389 | $data['choose-tool'] = $_POST['args']; 390 | 391 | $post = get_post( $ids ); 392 | $response .= '

'.get_the_title( $post->ID ) . '

'; 393 | 394 | if ( 'import-media' == $data['choose-tool'] ) { 395 | $response .= 'Running import media tool
'; 396 | $res = $this->extract_multi( $post ); 397 | $response .= $res['response']; 398 | $error = $error + (int)$res['error']; 399 | die( sprintf( $response . '
Media tool complete (Post ID %1$s) in %2$s seconds. %3$d errors', esc_html( $post->ID ), timer_stop(), $error = $error > 0 ? $error : 'no' ) ); 400 | 401 | 402 | } elseif ( 'convert-import' == $data['choose-tool'] ) { 403 | $response .= 'Running import and set featured image tool
'; 404 | $res = $this->extract_multi( $post ); 405 | $response .= $res['response']; 406 | $error = $error + (int)$res['error']; 407 | 408 | } 409 | /** If the post already has an attached thumbnail continue with the loop */ 410 | if ( has_post_thumbnail( $post->ID ) ) { 411 | $response .= 'Featured image already set
'; 412 | die( sprintf( $response . '
Media tool complete (Post ID %1$s) in %2$s seconds. %3$d errors', esc_html( $post->ID ), timer_stop(), $error = $error > 0 ? $error : 'no' ) ); 413 | } 414 | /** @var $attachments array of attached images to the post */ 415 | 416 | $attachments = $this->get_attach( $post->ID ); 417 | 418 | if ( ! $attachments ) { 419 | $img = $this->extract_image( $post ); 420 | if( empty( $img ) ) { 421 | $response .= 'No images found
'; 422 | die( sprintf( $response . '
Media tool complete (Post ID %1$s) in %2$s seconds. %3$d errors', esc_html( $post->ID ), timer_stop(), $error = $error > 0 ? $error : 'no' ) ); 423 | 424 | } 425 | 426 | /** @var $file string or WP_Error of image attached to the post */ 427 | $file = media_sideload_image( $img, (int)$post->ID ); 428 | if ( is_wp_error( $file ) ) { 429 | $response .= 'Upload Error: Could not upload image. Check for malformed img src url
'; 430 | $error++; 431 | } else { 432 | 433 | $atts = $this->get_attach( $post->ID ); 434 | foreach ( $atts as $a ) { 435 | $img = set_post_thumbnail( $post->ID, $a['ID'] ); 436 | if ( $img ) { 437 | $thumb = wp_get_attachment_thumb_url( $a['ID'] ); 438 | $response .= '
'; 439 | $response .= '' . get_the_title( $a['ID'] ) . ' Set as Featured Image


'; 440 | } 441 | } 442 | unset( $atts ); 443 | unset( $a ); 444 | } 445 | } else { 446 | 447 | foreach( $attachments as $a ) { 448 | $img = set_post_thumbnail( $post->ID, $a['ID'] ); 449 | if ( $img ) { 450 | $thumb = wp_get_attachment_thumb_url( $a['ID'] ); 451 | $response .= '
'; 452 | $response .= '' . get_the_title( $a['ID'] ) . ' Set as Featured Image


'; 453 | } 454 | } 455 | unset( $attachments ); 456 | unset( $a ); 457 | } 458 | 459 | die( sprintf( $response.'
Media tool complete (Post ID %1$s) in %2$s seconds. %3$d errors', esc_html( $post->ID ), timer_stop(), $error = $error > 0 ? $error : 'no' ) ); 460 | 461 | 462 | } 463 | 464 | 465 | 466 | /** 467 | * Queries for attached images 468 | * @param int $post_id The post id to check if attachments exist 469 | * @return array|bool The 1st attached on success false if no attachments 470 | */ 471 | function get_attach( $post_id ) { 472 | return get_children( array ( 473 | 'post_parent' => $post_id, 474 | 'post_type' => 'attachment', 475 | 'post_mime_type' => 'image', 476 | 'posts_per_page' => (int)1 477 | ), ARRAY_A ); 478 | } 479 | 480 | /** 481 | * Extracts the first image in the post content 482 | * @param object $post the post object 483 | * @return bool|string false if no images or img src 484 | */ 485 | function extract_image( $post ) { 486 | $html = $post->post_content; 487 | if ( stripos( $html, 'post_content; 510 | $path = wp_upload_dir(); 511 | $path = $path['baseurl']; 512 | $error = 0; 513 | $response = ''; 514 | if ( stripos( $html, 'ID ); 543 | 544 | if ( ! is_wp_error( $id ) ) { 545 | $url = wp_get_attachment_url( $id ); 546 | $thumb = wp_get_attachment_thumb_url( $id ); 547 | array_push( $new, $url ); 548 | array_push( $old, $img ); 549 | 550 | $response .= '


'; 551 | $response .= ''.get_the_title( $id ). ' Imported and attached

'; 552 | } else { 553 | $response .= 'Upload Error: Could not upload image. Check for malformed img src url
'; 554 | $error ++; 555 | } 556 | } 557 | if( !empty( $new ) ) { 558 | $content = str_ireplace( $old, $new, $html ); 559 | $post_args = array( 'ID' => $post->ID, 'post_content' => $content, ); 560 | if ( !empty( $content ) ) 561 | $post_id = wp_update_post( $post_args ); 562 | if ( isset( $post_id ) ) 563 | $response .= 'Post Content updated for Post: '.esc_html( $post->post_title).'
'; 564 | return array( 'error' => $error, 'response' => $response ); 565 | } else 566 | $response .= 'No external images found for ' . esc_html( $post->post_title ) . '
'; 567 | return array ( 'error' => $error, 'response' => $response ); 568 | 569 | } else { 570 | $response .= 'Error processing images for '. esc_html( $post->post_title ) .'
'; 571 | return array ( 'error' => $error, 'response' => $response ); 572 | } 573 | } else { 574 | $response .= 'No images found for ' . esc_html( $post->post_title) . '
'; 575 | return array ( 'error' => $error, 'response' => $response ); 576 | } 577 | } 578 | 579 | /** 580 | * Queries the posts based on the form field data 581 | * The database MySql queries were inspired jacked from the WordPress Export tool 582 | * 583 | * @param array $args The ajax form array formatted for the query 584 | * @return array $post_ids an array of post ids from the query result 585 | */ 586 | function query( $args = array() ) { 587 | global $wpdb, $post; 588 | 589 | $defaults = array( 'content' => 'all', 'author' => false, 'category' => false, 590 | 'start_date' => false, 'end_date' => false, 'status' => false, ); 591 | $args = wp_parse_args( $args, $defaults ); 592 | 593 | if ( 'all' != $args['content'] && post_type_exists( $args['content'] ) ) { 594 | $ptype = get_post_type_object( $args['content'] ); 595 | if ( ! $ptype->can_export ) 596 | $args['content'] = 'post'; 597 | 598 | $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $args['content'] ); 599 | } else { 600 | $post_types = get_post_types(); 601 | $post_types = array_diff( $post_types, array( 'attachment', 'revision', 'nav_menu_item' ) ); 602 | $esses = array_fill( 0, count($post_types), '%s' ); 603 | $where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types ); 604 | } 605 | 606 | if ( $args['status'] && ( 'post' == $args['content'] || 'page' == $args['content'] ) ) 607 | $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_status = %s", $args['status'] ); 608 | else 609 | $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'"; 610 | 611 | $join = ''; 612 | if ( $args['category'] && 'post' == $args['content'] ) { 613 | if ( $term = term_exists( $args['category'], 'category' ) ) { 614 | $join = "INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)"; 615 | $where .= $wpdb->prepare( " AND {$wpdb->term_relationships}.term_taxonomy_id = %d", $term['term_taxonomy_id'] ); 616 | } 617 | } 618 | 619 | if ( 'post' == $args['content'] || 'page' == $args['content'] ) { 620 | if ( $args['author'] ) 621 | $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_author = %d", $args['author'] ); 622 | 623 | if ( $args['start_date'] ) 624 | $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date >= %s", date( 'Y-m-d', strtotime($args['start_date']) ) ); 625 | 626 | if ( $args['end_date'] ) 627 | $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_date < %s", date( 'Y-m-d', strtotime('+1 month', strtotime($args['end_date'])) ) ); 628 | } 629 | 630 | $post_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} $join WHERE $where" ); 631 | 632 | return $post_ids; 633 | } 634 | 635 | /** 636 | * Converts the data ranges to a string for the query 637 | * @param string $post_type 638 | */ 639 | function convert_date_options( $post_type = 'post' ) { 640 | global $wpdb, $wp_locale; 641 | 642 | $months = $wpdb->get_results( $wpdb->prepare( " 643 | SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month 644 | FROM $wpdb->posts 645 | WHERE post_type = %s AND post_status != 'auto-draft' 646 | ORDER BY post_date DESC 647 | ", $post_type 648 | ) 649 | ); 650 | 651 | $month_count = count( $months ); 652 | if ( ! $month_count || ( 1 == $month_count && 0 == $months[0]->month ) ) 653 | return; 654 | 655 | foreach ( $months as $date ) { 656 | if ( 0 == $date->year ) 657 | continue; 658 | 659 | $month = zeroise( $date->month, 2 ); 660 | echo ''; 661 | } 662 | } 663 | 664 | } --------------------------------------------------------------------------------