├── .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 |
121 |
122 |
123 |
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 '';
215 |
216 | foreach( $this->media_settings_tabs as $tab_key => $tab_caption ) :
217 | $active = $current_tab == $tab_key ? 'nav-tab-active' : '';
218 | echo 'media_tabs_key. '&tab='.$tab_key. '>' .$tab_caption. ' ';
219 | endforeach;
220 | 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 |
236 |
237 |
238 | ' ); ?>
239 |
240 |
241 |
248 |
249 |
250 |
320 |
321 |
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 .= '';
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, ' ]*src\s*=\s*(["\'])(.*?)\1#im';
489 | preg_match( $regex, $html, $matches );
490 | unset( $regex );
491 | unset( $html );
492 | if ( is_array( $matches ) && ! empty( $matches ) ) {
493 | return $matches[2];
494 |
495 | } else {
496 | return false;
497 | }
498 | } else {
499 | return false;
500 | }
501 | }
502 |
503 | /**
504 | * Extracts all images in content adds to media library if external and updates content with new url
505 | * @param object $post The post object
506 | * @return array|bool Post id and images converted on success false if no images found in source
507 | */
508 | function extract_multi( $post ) {
509 | $html = $post->post_content;
510 | $path = wp_upload_dir();
511 | $path = $path['baseurl'];
512 | $error = 0;
513 | $response = '';
514 | if ( stripos( $html, ' ]*src\s*=\s*(["\'])(.*?)\1#im';
517 | preg_match_all( $regex, $html, $matches );
518 |
519 | if ( is_array( $matches ) && ! empty( $matches ) ) {
520 | $new = array();
521 | $old = array();
522 | foreach( $matches[2] as $img ) {
523 | /** Compare image source against upload directory to prevent adding same attachment multiple times */
524 |
525 | if ( stripos( $img, $path ) !== false ) {
526 | $response .= 'Img already in media library ';
527 | continue;
528 | }
529 |
530 | $tmp = download_url( $img );
531 |
532 | preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $img, $matches);
533 | $file_array['name'] = basename($matches[0]);
534 | $file_array['tmp_name'] = $tmp;
535 | // If error storing temporarily, unlink
536 | if ( is_wp_error( $tmp ) ) {
537 | @unlink($file_array['tmp_name']);
538 | $file_array['tmp_name'] = '';
539 | continue;
540 | }
541 |
542 | $id = media_handle_sideload( $file_array, $post->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 '' . $wp_locale->get_month( $month ) . ' ' . $date->year . ' ';
661 | }
662 | }
663 |
664 | }
--------------------------------------------------------------------------------