1 | <?php
|
---|
2 | /*
|
---|
3 | Plugin Name: AlexaRank
|
---|
4 | Plugin URI: http://www.fliptel.de/wordpress-plugins
|
---|
5 | Description: Displays the Alexa traffic ranking in the sidebar of your blog via widget or anywhere else. <a href="options-general.php?page=alexarank/alexarank.php">Configure here</a>. Check out more <a href="http://www.fliptel.de/wordpress-plugins">Wordpress Plugins</a> by <a href="http://www.fliptel.de">Fliptel</a>.
|
---|
6 | Version: 0.2
|
---|
7 | Author: fliptel
|
---|
8 | Author URI: http://www.fliptel.de
|
---|
9 | */
|
---|
10 |
|
---|
11 | /**
|
---|
12 | * v0.2 13.07.2009 fixed css, some templates got brocken thx to sullivan
|
---|
13 | * v0.1 09.07.2009 initial release
|
---|
14 | */
|
---|
15 |
|
---|
16 | if(!class_exists('AlexaRank')):
|
---|
17 | class AlexaRank {
|
---|
18 | var $id;
|
---|
19 | var $version;
|
---|
20 | var $title;
|
---|
21 | var $name;
|
---|
22 | var $options;
|
---|
23 | var $path;
|
---|
24 | var $cache_file;
|
---|
25 | var $locale;
|
---|
26 | var $url;
|
---|
27 | var $layouts;
|
---|
28 |
|
---|
29 | function AlexaRank() {
|
---|
30 | $this->id = 'alexarank';
|
---|
31 | $this->title = 'AlexaRank';
|
---|
32 | $this->version = '0.2';
|
---|
33 | $this->name = $this->title. ' v'. $this->version;
|
---|
34 | $this->path = dirname(__FILE__);
|
---|
35 | $this->url = get_bloginfo('wpurl'). '/wp-content/plugins/' . $this->id;
|
---|
36 |
|
---|
37 | $this->layouts = array(
|
---|
38 | array(
|
---|
39 | 'icon' => '0.gif',
|
---|
40 | 'width' => 80,
|
---|
41 | 'height' => 30,
|
---|
42 | 'text' => array(
|
---|
43 | 'width' => 20,
|
---|
44 | 'x' => 30,
|
---|
45 | 'y' => 20,
|
---|
46 | 'font' => 1,
|
---|
47 | 'color' => '808080'
|
---|
48 | ),
|
---|
49 | 'image' => array(
|
---|
50 | 'x' => 31,
|
---|
51 | 'y' => 15,
|
---|
52 | 'w' => 40,
|
---|
53 | 'h' => 3,
|
---|
54 | 'color' => '1b13b7'
|
---|
55 | )
|
---|
56 | ),
|
---|
57 | array(
|
---|
58 | 'icon' => '1.gif',
|
---|
59 | 'width' => 80,
|
---|
60 | 'height' => 15,
|
---|
61 | 'text' => null,
|
---|
62 | 'image' => array(
|
---|
63 | 'x' => 35,
|
---|
64 | 'y' => 6,
|
---|
65 | 'w' => 40,
|
---|
66 | 'h' => 3,
|
---|
67 | 'color' => '1b13b7'
|
---|
68 | )
|
---|
69 | ),
|
---|
70 | array(
|
---|
71 | 'icon' => '2.gif',
|
---|
72 | 'width' => 80,
|
---|
73 | 'height' => 15,
|
---|
74 | 'text' => array(
|
---|
75 | 'width' => 32,
|
---|
76 | 'x' => 15,
|
---|
77 | 'y' => 1,
|
---|
78 | 'font' => 2,
|
---|
79 | 'color' => '808080'
|
---|
80 | ),
|
---|
81 | 'image' => null
|
---|
82 | ),
|
---|
83 | array(
|
---|
84 | 'icon' => '3.gif',
|
---|
85 | 'width' => 80,
|
---|
86 | 'height' => 15,
|
---|
87 | 'text' => array(
|
---|
88 | 'width' => 32,
|
---|
89 | 'x' => 18,
|
---|
90 | 'y' => 1,
|
---|
91 | 'font' => 2,
|
---|
92 | 'color' => '808080'
|
---|
93 | ),
|
---|
94 | 'image' => null
|
---|
95 | ),
|
---|
96 | array(
|
---|
97 | 'icon' => '4.gif',
|
---|
98 | 'width' => 80,
|
---|
99 | 'height' => 15,
|
---|
100 | 'text' => null,
|
---|
101 | 'image' => array(
|
---|
102 | 'x' => 28,
|
---|
103 | 'y' => 11,
|
---|
104 | 'w' => 40,
|
---|
105 | 'h' => 1,
|
---|
106 | 'color' => '1b13b7'
|
---|
107 | )
|
---|
108 | )
|
---|
109 | );
|
---|
110 |
|
---|
111 | $this->locale = get_locale();
|
---|
112 |
|
---|
113 | if(empty($this->locale)) {
|
---|
114 | $this->locale = 'en_US';
|
---|
115 | }
|
---|
116 |
|
---|
117 | load_textdomain($this->id, sprintf('%s/%s.mo', $this->path, $this->locale));
|
---|
118 |
|
---|
119 | $this->loadOptions();
|
---|
120 |
|
---|
121 | $this->cache_file = $this->path. '/cache/layout'. $this->options['layout']. '.gif';
|
---|
122 |
|
---|
123 | if(!@isset($_GET['image'])) {
|
---|
124 | if(is_admin()) {
|
---|
125 | add_action('admin_menu', array(&$this, 'optionMenu'));
|
---|
126 | }
|
---|
127 | else {
|
---|
128 | add_action('wp_head', array(&$this, 'blogHead'));
|
---|
129 | }
|
---|
130 |
|
---|
131 | add_action('widgets_init', array(&$this, 'initWidgets'));
|
---|
132 | }
|
---|
133 | }
|
---|
134 |
|
---|
135 | function optionMenu() {
|
---|
136 | add_options_page($this->title, $this->title, 8, __FILE__, array(&$this, 'optionMenuPage'));
|
---|
137 | }
|
---|
138 |
|
---|
139 | function optionMenuPage() {
|
---|
140 |
|
---|
141 | if(@$_REQUEST[$this->id]) {
|
---|
142 | @unlink($this->cache_file);
|
---|
143 |
|
---|
144 | $this->updateOptions($_REQUEST[$this->id]);
|
---|
145 |
|
---|
146 | echo '<div id="message" class="updated fade"><p><strong>' . __('Settings saved!', $this->id) . '</strong></p></div>';
|
---|
147 | }
|
---|
148 | ?>
|
---|
149 | <div class="wrap">
|
---|
150 |
|
---|
151 | <h2><?php _e('Settings', $this->id); ?></h2>
|
---|
152 | <form method="post" action="">
|
---|
153 | <table class="form-table">
|
---|
154 | <?php if(!file_exists($this->path. '/cache/') || !is_writeable($this->path. '/cache/')): ?>
|
---|
155 | <tr valign="top"><th scope="row" colspan="3"><span style="color:red;"><?php _e('Warning! The cachedirectory is missing or not writeable!', $this->id); ?></span><br /><em><?php echo $this->path; ?>/cache</em></th></tr>
|
---|
156 | <?php endif; ?>
|
---|
157 | </tr>
|
---|
158 | <tr valign="top">
|
---|
159 | <th scope="row"><?php _e('Title', $this->id); ?></th>
|
---|
160 | <td><input name="<?=$this->id?>[title]" type="text" class="code" value="<?=$this->options['title']?>" /><br /><?php _e('The title is displayed above the badge in widget mode only!', $this->id); ?></td></tr>
|
---|
161 | <th scope="row"><?php _e('Layout', $this->id); ?></th>
|
---|
162 | <td colspan="3">
|
---|
163 | <input name="<?=$this->id?>[layout]" type="radio" class="code" value="0"<?php echo intval($this->options['layout']) == 0 ? ' checked="checked"' : ''; ?> />
|
---|
164 | <img src="<?=$this->url?>/screenshot-1.gif" style="vertical-align:middle;" /><br /><br />
|
---|
165 | <input name="<?=$this->id?>[layout]" type="radio" class="code" value="1"<?php echo intval($this->options['layout']) == 1 ? ' checked="checked"' : ''; ?> />
|
---|
166 | <img src="<?=$this->url?>/screenshot-2.gif" style="vertical-align:middle;" /><br /><br />
|
---|
167 | <input name="<?=$this->id?>[layout]" type="radio" class="code" value="2"<?php echo intval($this->options['layout']) == 2 ? ' checked="checked"' : ''; ?> />
|
---|
168 | <img src="<?=$this->url?>/screenshot-3.gif" style="vertical-align:middle;" /><br /><br />
|
---|
169 | <input name="<?=$this->id?>[layout]" type="radio" class="code" value="3"<?php echo intval($this->options['layout']) == 3 ? ' checked="checked"' : ''; ?> />
|
---|
170 | <img src="<?=$this->url?>/screenshot-4.gif" style="vertical-align:middle;" /><br /><br />
|
---|
171 | <input name="<?=$this->id?>[layout]" type="radio" class="code" value="4"<?php echo intval($this->options['layout']) == 4 ? ' checked="checked"' : ''; ?> />
|
---|
172 | <img src="<?=$this->url?>/screenshot-5.gif" style="vertical-align:middle;" />
|
---|
173 | </td>
|
---|
174 | </tr>
|
---|
175 |
|
---|
176 | </table>
|
---|
177 |
|
---|
178 | <p class="submit">
|
---|
179 | <input type="submit" value="<?php _e('save', $this->id); ?>" name="submit" />
|
---|
180 | </p>
|
---|
181 |
|
---|
182 | </form>
|
---|
183 |
|
---|
184 | </div>
|
---|
185 | <?php
|
---|
186 | }
|
---|
187 | function loadOptions() {
|
---|
188 | if(!($this->options = get_option($this->id))) {
|
---|
189 | $this->options = array(
|
---|
190 | 'title' => 'AlexaRank',
|
---|
191 | 'layout' => 0
|
---|
192 | );
|
---|
193 |
|
---|
194 | add_option($this->id, $this->options, $this->name, 'yes');
|
---|
195 | }
|
---|
196 | }
|
---|
197 |
|
---|
198 | function updateOption($name, $value) {
|
---|
199 | $this->updateOptions(array($name => $value));
|
---|
200 | }
|
---|
201 |
|
---|
202 | function updateOptions($options) {
|
---|
203 | foreach($this->options as $k => $v) {
|
---|
204 | if(array_key_exists($k, $options)) {
|
---|
205 | $this->options[$k] = $options[ $k ];
|
---|
206 | }
|
---|
207 | }
|
---|
208 |
|
---|
209 | update_option($this->id, $this->options);
|
---|
210 | }
|
---|
211 |
|
---|
212 | function blogHead() {
|
---|
213 | printf('<meta name="%s" content="%s/%s" />' . "\n", $this->id, $this->id, $this->version);
|
---|
214 | print( '<style type="text/css">
|
---|
215 | #alexarank, #alexarank small {padding: 0;margin: 0;color: #aaa;font-family: Arial, sans-serif;font-size: 10px;font-style: normal;font-weight: normal;letter-spacing: 0px;text-transform: none; width: 80px;text-align:center;border:0;}
|
---|
216 | #alexarank small a:hover, #alexarank small a:link, #alexarank small a:visited, #alexarank small a:active {color: #aaa;text-decoration:none;cursor: pointer;text-transform: none;font-size:10px;border:0;display:inline;}
|
---|
217 | </style>');
|
---|
218 | }
|
---|
219 |
|
---|
220 | function httpGet($url) {
|
---|
221 |
|
---|
222 | if(!class_exists('Snoopy')) {
|
---|
223 | include_once(ABSPATH. WPINC. '/class-snoopy.php');
|
---|
224 | }
|
---|
225 |
|
---|
226 | $Snoopy = new Snoopy();
|
---|
227 |
|
---|
228 | if(@$Snoopy->fetch($url)) {
|
---|
229 |
|
---|
230 | if(!empty( $Snoopy->results)) {
|
---|
231 | return $Snoopy->results;
|
---|
232 | }
|
---|
233 | }
|
---|
234 |
|
---|
235 | return false;
|
---|
236 | }
|
---|
237 |
|
---|
238 | function normalizeValue($value) {
|
---|
239 | if($value < 0) {
|
---|
240 | return 0;
|
---|
241 | }
|
---|
242 |
|
---|
243 | $rank = intval(floor(log($value) / log(5)));
|
---|
244 |
|
---|
245 | return $rank > 10 ? 10 : 10 - $rank;
|
---|
246 | }
|
---|
247 |
|
---|
248 | function getAlexaRank() {
|
---|
249 | $url = get_bloginfo('wpurl');
|
---|
250 |
|
---|
251 | $url = sprintf('http://data.alexa.com/data?cli=10&dat=snbamz&url=%s', urlencode($url));
|
---|
252 |
|
---|
253 | if(($data = $this->httpGet($url)) !== false) {
|
---|
254 |
|
---|
255 | preg_match('|POPULARITY URL="(.*?)" TEXT="([0-9]+)"|', $data, $matches);
|
---|
256 |
|
---|
257 | if(count($matches) == 3 && !empty($matches[ 2 ])) {
|
---|
258 | return intval($matches[ 2 ]);
|
---|
259 | }
|
---|
260 | }
|
---|
261 |
|
---|
262 | return 0;
|
---|
263 | }
|
---|
264 |
|
---|
265 | function rgbColor(&$img, $rgb) {
|
---|
266 | if( $rgb[ 0 ] == '#' ) {
|
---|
267 | $rgb = substr( $rgb, 1 );
|
---|
268 | }
|
---|
269 |
|
---|
270 | $a = substr($rgb, 0, 2);
|
---|
271 | $b = substr($rgb, 2, 2);
|
---|
272 | $c = substr($rgb, 4, 2);
|
---|
273 |
|
---|
274 | return imagecolorallocate($img, hexdec($a), hexdec($b), hexdec($c));
|
---|
275 | }
|
---|
276 |
|
---|
277 |
|
---|
278 | function getCode() {
|
---|
279 | return sprintf( '<div id="%s"><a class="snap_noshots" href="http://www.fliptel.de/wordpress-plugins#%s" target="_blank"><img src="%s/%s/%s/%s.php?image=1" border="0" alt="%s" title="%s" /></a><br /><small><a href="http://www.fliptel.de/wordpress-plugins" class="snap_noshots" target="_blank">Plugin</a> by <a href="http://www.fliptel.de" class="snap_noshots" target="_blank">Fliptel</a></small></div>', $this->id, $this->id, get_bloginfo('wpurl'), PLUGINDIR, $this->id, $this->id, $this->title, $this->title);
|
---|
280 | }
|
---|
281 |
|
---|
282 | function draw() {
|
---|
283 | clearstatcache();
|
---|
284 |
|
---|
285 | $create = false;
|
---|
286 |
|
---|
287 | if(!file_exists($this->cache_file)) {
|
---|
288 | $create = true;
|
---|
289 | }
|
---|
290 | elseif(time() - filemtime($this->cache_file) > (3600 * 3)) {
|
---|
291 | $create = true;
|
---|
292 | }
|
---|
293 |
|
---|
294 | if($create) {
|
---|
295 |
|
---|
296 | $numeric = $this->getAlexaRank();
|
---|
297 |
|
---|
298 | $layout = $this->layouts[intval($this->options['layout'])];
|
---|
299 |
|
---|
300 | $img = @imagecreatefromgif($this->path. '/img/'. $this->options['layout']. '.gif');
|
---|
301 |
|
---|
302 | if(!is_null($layout['text'])) {
|
---|
303 |
|
---|
304 | $x = intval(round($layout['text']['width'] - ((imagefontwidth($layout['text']['font'])*strlen($numeric==0?'none':number_format($numeric,0,'.','.')))/2) + $layout['text']['x']));
|
---|
305 | $color1 = $this->rgbColor($img, $layout['text']['color']);
|
---|
306 | imagestring($img, $layout['text']['font'], $x, $layout['text']['y'], $numeric == 0 ? 'none' : number_format($numeric,0,'.','.'), $color1);
|
---|
307 | }
|
---|
308 |
|
---|
309 | if(!is_null($layout['image']) && $numeric > 0) {
|
---|
310 | $color2 = $this->rgbColor($img, $layout['image']['color']);
|
---|
311 | imagefilledrectangle($img, $layout['image']['x'], $layout['image']['y'], $layout['image']['x'] + ($this->normalizeValue($numeric)*4)-1, $layout['image']['y'] + $layout['image']['h']-1, $color2);
|
---|
312 | }
|
---|
313 |
|
---|
314 | if(is_writeable($this->path. '/cache')) {
|
---|
315 | imagegif($img, $this->cache_file);
|
---|
316 | }
|
---|
317 | }
|
---|
318 | else {
|
---|
319 | $img = @imagecreatefromgif($this->cache_file);
|
---|
320 | }
|
---|
321 |
|
---|
322 | header( 'Content-Type: image/gif' );
|
---|
323 |
|
---|
324 | @imagegif($img);
|
---|
325 | }
|
---|
326 |
|
---|
327 | function initWidgets() {
|
---|
328 | if(function_exists('register_sidebar_widget')) {
|
---|
329 | register_sidebar_widget($this->title. ' Widget', array(&$this, 'Widget'), null, 'widget_'. $this->id);
|
---|
330 | }
|
---|
331 | }
|
---|
332 |
|
---|
333 | function widget($args) {
|
---|
334 | extract($args);
|
---|
335 |
|
---|
336 | printf('%s%s%s%s%s%s', $before_widget, $before_title, $this->options['title'], $after_title, $this->getCode(), $after_widget);
|
---|
337 | }
|
---|
338 | }
|
---|
339 |
|
---|
340 | function alexarank_display() {
|
---|
341 | global $AlexaRank;
|
---|
342 |
|
---|
343 | if(!isset($AlexaRank)) {
|
---|
344 | $AlexaRank = new AlexaRank();
|
---|
345 | }
|
---|
346 |
|
---|
347 | if($AlexaRank) {
|
---|
348 | echo $AlexaRank->getCode();
|
---|
349 | }
|
---|
350 | }
|
---|
351 | endif;
|
---|
352 |
|
---|
353 | if(@isset($_GET['image'])) {
|
---|
354 | include_once(dirname(__FILE__). '/../../../wp-config.php');
|
---|
355 |
|
---|
356 | if(!isset($AlexaRank)) {
|
---|
357 | $AlexaRank = new AlexaRank();
|
---|
358 | }
|
---|
359 |
|
---|
360 | $AlexaRank->draw();
|
---|
361 | }
|
---|
362 | else {
|
---|
363 | add_action('plugins_loaded', create_function('$AlexaRank_s92231c', 'global $AlexaRank; $AlexaRank = new AlexaRank();'));
|
---|
364 | }
|
---|
365 |
|
---|
366 | ?>
|
---|