PluginProbe ʕ •ᴥ•ʔ
Image Widget / 3.1.5
Image Widget v3.1.5
trunk 1.0 2.0 2.1 2.2 2.2.1 2.2.2 3.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.2 3.2.1 3.2.10 3.2.11 3.2.2 3.2.3 3.2.4 3.2.5 3.2.7 3.2.8 3.2.9 3.3 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 4.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.0.9 4.1 4.1.1 4.1.2 4.2 4.2.1 4.2.2 4.3 4.3.1 4.4 4.4.1 4.4.11 4.4.12 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6 4.4.7 4.4.8 4.4.9
image-widget / image-widget.php
image-widget Last commit date
lang 16 years ago image-widget.js 16 years ago image-widget.php 16 years ago readme.txt 16 years ago screenshot-1.png 16 years ago screenshot-2.png 16 years ago screenshot-3.png 16 years ago
image-widget.php
357 lines
1 <?php
2 /*
3 Plugin Name: Image Widget
4 Plugin URI: http://wordpress.org/extend/plugins/image-widget/
5 Description: Simple image widget that uses native Wordpress upload thickbox to add image widgets to your site.
6 Author: Shane and Peter, Inc.
7 Version: 3.1.5
8 Author URI: http://www.shaneandpeter.com
9 */
10
11 // Load the widget on widgets_init
12 function load_sp_image_widget() {
13 register_widget('SP_Image_Widget');
14 }
15 add_action('widgets_init', 'load_sp_image_widget');
16
17 /**
18 * SP Image Widget class
19 *
20 * @author Shane & Peter, Inc. (Peter Chester)
21 **/
22 class SP_Image_Widget extends WP_Widget {
23
24 var $pluginDomain = 'sp_image_widget';
25
26 /**
27 * SP Image Widget constructor
28 *
29 * @return void
30 * @author Shane & Peter, Inc. (Peter Chester)
31 */
32 function SP_Image_Widget() {
33 $this->loadPluginTextDomain();
34 $widget_ops = array( 'classname' => 'widget_sp_image', 'description' => __( 'Showcase a single image with a Title, URL, and a Description', $this->pluginDomain ) );
35 $control_ops = array( 'id_base' => 'widget_sp_image' );
36 $this->WP_Widget('widget_sp_image', __('Image Widget', $this->pluginDomain), $widget_ops, $control_ops);
37
38 global $pagenow;
39 if (WP_ADMIN) {
40 if ( 'widgets.php' == $pagenow ) {
41 wp_enqueue_style( 'thickbox' );
42 wp_enqueue_script( $control_ops['id_base'], WP_PLUGIN_URL.'/image-widget/image-widget.js',array('thickbox'), false, true );
43 add_action( 'admin_head-widgets.php', array( $this, 'admin_head' ) );
44 } elseif ( 'media-upload.php' == $pagenow || 'async-upload.php' == $pagenow ) {
45 add_filter( 'image_send_to_editor', array( $this,'image_send_to_editor'), 1, 8 );
46 add_filter( 'gettext', array( $this, 'replace_text_in_thitckbox' ), 1, 3 );
47 add_filter( 'media_upload_tabs', array( $this, 'media_upload_tabs' ) );
48 }
49 }
50
51 }
52
53 function loadPluginTextDomain() {
54 load_plugin_textdomain( $this->pluginDomain, false, trailingslashit(basename(dirname(__FILE__))) . 'lang/');
55 }
56
57 /**
58 * Retrieve resized image URL
59 *
60 * @param int $id Post ID or Attachment ID
61 * @param int $width desired width of image (optional)
62 * @param int $height desired height of image (optional)
63 * @return string URL
64 * @author Shane & Peter, Inc. (Peter Chester)
65 */
66 function get_image_url( $id, $width=false, $height=false ) {
67
68 /**/
69 // Get attachment and resize but return attachment path (needs to return url)
70 $attachment = wp_get_attachment_metadata( $id );
71 $attachment_url = wp_get_attachment_url( $id );
72 if (isset($attachment_url)) {
73 if ($width && $height) {
74 $uploads = wp_upload_dir();
75 $imgpath = $uploads['basedir'].'/'.$attachment['file'];
76 if ($image = image_resize( $imgpath, $width, $height )) {
77 $image = path_join( dirname($attachment_url), basename($image) );
78 } else {
79 $image = $attachment_url;
80 }
81 } else {
82 $image = $attachment_url;
83 }
84 if (isset($image)) {
85 return $image;
86 }
87 }
88 }
89
90 /**
91 * Test context to see if the uploader is being used for the image widget or for other regular uploads
92 *
93 * @return void
94 * @author Shane & Peter, Inc. (Peter Chester)
95 */
96 function is_sp_widget_context() {
97 if ( isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'],$this->id_base) !== false ) {
98 return true;
99 } elseif ( isset($_REQUEST['_wp_http_referer']) && strpos($_REQUEST['_wp_http_referer'],$this->id_base) !== false ) {
100 return true;
101 } elseif ( isset($_REQUEST['widget_id']) && strpos($_REQUEST['widget_id'],$this->id_base) !== false ) {
102 return true;
103 }
104 return false;
105 }
106
107 /**
108 * Somewhat hacky way of replacing "Insert into Post" with "Insert into Widget"
109 *
110 * @param string $translated_text text that has already been translated (normally passed straight through)
111 * @param string $source_text text as it is in the code
112 * @param string $domain domain of the text
113 * @return void
114 * @author Shane & Peter, Inc. (Peter Chester)
115 */
116 function replace_text_in_thitckbox($translated_text, $source_text, $domain) {
117 if ( $this->is_sp_widget_context() ) {
118 if ('Insert into Post' == $source_text) {
119 return __('Insert Into Widget', $this->pluginDomain );
120 }
121 }
122 return $translated_text;
123 }
124
125 /**
126 * Filter image_end_to_editor results
127 *
128 * @param string $html
129 * @param int $id
130 * @param string $alt
131 * @param string $title
132 * @param string $align
133 * @param string $url
134 * @param array $size
135 * @return string javascript array of attachment url and id or just the url
136 * @author Shane & Peter, Inc. (Peter Chester)
137 */
138 function image_send_to_editor( $html, $id, $caption, $title, $align, $url, $size, $alt = '' ) {
139 // Normally, media uploader return an HTML string (in this case, typically a complete image tag surrounded by a caption).
140 // Don't change that; instead, send custom javascript variables back to opener.
141 // Check that this is for the widget. Shouldn't hurt anything if it runs, but let's do it needlessly.
142 if ( $this->is_sp_widget_context() ) {
143 if ($alt=='') $alt = $title;
144 ?>
145 <script type="text/javascript">
146 // send image variables back to opener
147 var win = window.dialogArguments || opener || parent || top;
148 win.IW_html = '<?php echo addslashes($html) ?>';
149 win.IW_img_id = '<?php echo $id ?>';
150 win.IW_alt = '<?php echo addslashes($alt) ?>';
151 win.IW_caption = '<?php echo addslashes($caption) ?>';
152 win.IW_title = '<?php echo addslashes($title) ?>';
153 win.IW_align = '<?php echo $align ?>';
154 win.IW_url = '<?php echo $url ?>';
155 win.IW_size = '<?php echo $size ?>';
156 //alert("sending variables: id: "+win.IW_img_id+"\n"+"alt: "+win.IW_alt+"\n"+"title: "+win.IW_title+"\n"+"align: "+win.IW_align+"\n"+"url: "+win.IW_url+"\n"+"size: "+win.IW_size);
157 </script>
158 <?php
159 }
160 return $html;
161 }
162
163 /**
164 * Remove from url tab until that functionality is added to widgets.
165 *
166 * @param array $tabs
167 * @return void
168 * @author Shane & Peter, Inc. (Peter Chester)
169 */
170 function media_upload_tabs($tabs) {
171 if ( $this->is_sp_widget_context() ) {
172 unset($tabs['type_url']);
173 }
174 return $tabs;
175 }
176
177
178 /**
179 * Widget frontend output
180 *
181 * @param array $args
182 * @param array $instance
183 * @return void
184 * @author Shane & Peter, Inc. (Peter Chester)
185 */
186 function widget( $args, $instance ) {
187 extract($args);
188 $title = apply_filters('widget_title', empty($instance['title']) ? '' : $instance['title']);
189 echo $before_widget;
190 if ( !empty( $title ) ) { echo $before_title . $title . $after_title; }
191 if (!empty($instance['image'])) {
192 if ($instance['link']) {
193 echo '<a class="'.$this->widget_options['classname'].'-image-link" href="'.$instance['link'].'" target="'.$instance['linktarget'].'">';
194 }
195 if ($instance['imageurl']) {
196 echo "<img src=\"{$instance['imageurl']}\" style=\"";
197 if (!empty($instance['width']) && is_numeric($instance['width'])) {
198 echo "max-width: {$instance['width']}px;";
199 }
200 if (!empty($instance['height']) && is_numeric($instance['height'])) {
201 echo "max-height: {$instance['height']}px;";
202 }
203 echo "\"";
204 if (!empty($instance['align']) && $instance['align'] != 'none') {
205 echo " class=\"align{$instance['align']}\"";
206 }
207 if (!empty($instance['alt'])) {
208 echo " alt=\"{$instance['alt']}\"";
209 } else {
210 echo " alt=\"{$instance['title']}\"";
211 }
212 echo " />";
213 }
214
215 if ($instance['link']) { echo '</a>'; }
216 }
217 if (!empty($instance['description'])) {
218 $text = apply_filters( 'widget_text', $instance['description'] );
219 echo '<div class="'.$this->widget_options['classname'].'-description" >';
220 echo wpautop($text);
221 echo "</div>";
222 }
223 echo $after_widget;
224 }
225
226 /**
227 * Update widget options
228 *
229 * @param object $new_instance Widget Instance
230 * @param object $old_instance Widget Instance
231 * @return object
232 * @author Shane & Peter, Inc. (Peter Chester)
233 */
234 function update( $new_instance, $old_instance ) {
235 $instance = $old_instance;
236 $instance['title'] = strip_tags($new_instance['title']);
237 if ( isset($new_instance['description']) ) {
238 if ( current_user_can('unfiltered_html') ) {
239 $instance['description'] = $new_instance['description'];
240 } else {
241 $instance['description'] = wp_filter_post_kses($new_instance['description']);
242 }
243 }
244 $instance['link'] = $new_instance['link'];
245 $instance['image'] = $new_instance['image'];
246 $instance['imageurl'] = $this->get_image_url($new_instance['image'],$new_instance['width'],$new_instance['height']); // image resizing not working right now
247 $instance['linktarget'] = $new_instance['linktarget'];
248 $instance['width'] = $new_instance['width'];
249 $instance['height'] = $new_instance['height'];
250 $instance['align'] = $new_instance['align'];
251 $instance['alt'] = $new_instance['alt'];
252
253 return $instance;
254 }
255
256 /**
257 * Form UI
258 *
259 * @param object $instance Widget Instance
260 * @return void
261 * @author Shane & Peter, Inc. (Peter Chester)
262 */
263 function form( $instance ) {
264
265 $instance = wp_parse_args( (array) $instance, array(
266 'title' => '',
267 'description' => '',
268 'link' => '',
269 'linktarget' => '',
270 'width' => '',
271 'height' => '',
272 'image' => '',
273 'imageurl' => '',
274 'align' => '',
275 'alt' => ''
276 ) );
277 ?>
278
279 <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', $this->pluginDomain); ?></label>
280 <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr(strip_tags($instance['title'])); ?>" /></p>
281
282 <p><label for="<?php echo $this->get_field_id('image'); ?>"><?php _e('Image:', $this->pluginDomain); ?></label>
283 <?php
284 $media_upload_iframe_src = "media-upload.php?type=image&widget_id=".$this->id; //NOTE #1: the widget id is added here to allow uploader to only return array if this is used with image widget so that all other uploads are not harmed.
285 $image_upload_iframe_src = apply_filters('image_upload_iframe_src', "$media_upload_iframe_src");
286 $image_title = __(($instance['image'] ? 'Change Image' : 'Add Image'), $this->pluginDomain);
287 ?><br />
288 <a href="<?php echo $image_upload_iframe_src; ?>&TB_iframe=true" id="add_image-<?php echo $this->get_field_id('image'); ?>" class="thickbox-image-widget" title='<?php echo $image_title; ?>' onClick="set_active_widget('<?php echo $this->id; ?>');return false;" style="text-decoration:none"><img src='images/media-button-image.gif' alt='<?php echo $image_title; ?>' align="absmiddle" /> <?php echo $image_title; ?></a>
289 <div id="display-<?php echo $this->get_field_id('image'); ?>"><?php
290 if ($instance['imageurl']) {
291 echo "<img src=\"{$instance['imageurl']}\" alt=\"{$instance['title']}\" style=\"";
292 if ($instance['width'] && is_numeric($instance['width'])) {
293 echo "max-width: {$instance['width']}px;";
294 }
295 if ($instance['height'] && is_numeric($instance['height'])) {
296 echo "max-height: {$instance['height']}px;";
297 }
298 echo "\"";
299 if (!empty($instance['align']) && $instance['align'] != 'none') {
300 echo " class=\"align{$instance['align']}\"";
301 }
302 echo " />";
303 }
304 ?></div>
305 <br clear="all" />
306 <input id="<?php echo $this->get_field_id('image'); ?>" name="<?php echo $this->get_field_name('image'); ?>" type="hidden" value="<?php echo $instance['image']; ?>" />
307 </p>
308
309 <p><label for="<?php echo $this->get_field_id('description'); ?>"><?php _e('Caption:', $this->pluginDomain); ?></label>
310 <textarea rows="8" class="widefat" id="<?php echo $this->get_field_id('description'); ?>" name="<?php echo $this->get_field_name('description'); ?>"><?php echo format_to_edit($instance['description']); ?></textarea></p>
311
312 <p><label for="<?php echo $this->get_field_id('link'); ?>"><?php _e('Link:', $this->pluginDomain); ?></label>
313 <input class="widefat" id="<?php echo $this->get_field_id('link'); ?>" name="<?php echo $this->get_field_name('link'); ?>" type="text" value="<?php echo esc_attr(strip_tags($instance['link'])); ?>" /><br />
314 <select name="<?php echo $this->get_field_name('linktarget'); ?>" id="<?php echo $this->get_field_id('linktarget'); ?>">
315 <option value="_self"<?php selected( $instance['linktarget'], '_self' ); ?>><?php _e('Stay in Window', $this->pluginDomain); ?></option>
316 <option value="_blank"<?php selected( $instance['linktarget'], '_blank' ); ?>><?php _e('Open New Window', $this->pluginDomain); ?></option>
317 </select></p>
318
319 <p><label for="<?php echo $this->get_field_id('width'); ?>"><?php _e('Width:', $this->pluginDomain); ?></label>
320 <input id="<?php echo $this->get_field_id('width'); ?>" name="<?php echo $this->get_field_name('width'); ?>" type="text" value="<?php echo esc_attr(strip_tags($instance['width'])); ?>" onchange="changeImgWidth('<?php echo $this->id; ?>')" /></p>
321
322 <p><label for="<?php echo $this->get_field_id('height'); ?>"><?php _e('Height:', $this->pluginDomain); ?></label>
323 <input id="<?php echo $this->get_field_id('height'); ?>" name="<?php echo $this->get_field_name('height'); ?>" type="text" value="<?php echo esc_attr(strip_tags($instance['height'])); ?>" onchange="changeImgHeight('<?php echo $this->id; ?>')" /></p>
324
325 <p><label for="<?php echo $this->get_field_id('align'); ?>"><?php _e('Align:', $this->pluginDomain); ?></label>
326 <select name="<?php echo $this->get_field_name('align'); ?>" id="<?php echo $this->get_field_id('align'); ?>" onchange="changeImgAlign('<?php echo $this->id; ?>')">
327 <option value="none"<?php selected( $instance['align'], 'none' ); ?>><?php _e('none', $this->pluginDomain); ?></option>
328 <option value="left"<?php selected( $instance['align'], 'left' ); ?>><?php _e('left', $this->pluginDomain); ?></option>
329 <option value="center"<?php selected( $instance['align'], 'center' ); ?>><?php _e('center', $this->pluginDomain); ?></option>
330 <option value="right"<?php selected( $instance['align'], 'right' ); ?>><?php _e('right', $this->pluginDomain); ?></option>
331 </select></p>
332
333 <p><label for="<?php echo $this->get_field_id('alt'); ?>"><?php _e('Alternate Text:', $this->pluginDomain); ?></label>
334 <input id="<?php echo $this->get_field_id('alt'); ?>" name="<?php echo $this->get_field_name('alt'); ?>" type="text" value="<?php echo esc_attr(strip_tags($instance['alt'])); ?>" /></p>
335 <?php
336 }
337
338 /**
339 * Admin header css
340 *
341 * @return void
342 * @author Shane & Peter, Inc. (Peter Chester)
343 */
344 function admin_head() {
345 ?>
346 <style type="text/css">
347 .aligncenter {
348 display: block;
349 margin-left: auto;
350 margin-right: auto;
351 }
352 </style>
353 <?php
354 }
355 }
356 ?>
357