1 | <?php
|
---|
2 | /*
|
---|
3 | Plugin Name: Google News
|
---|
4 | Description: Displays a selectable Google News RSS feed, inline, widget or in theme.
|
---|
5 | Version: 2.5
|
---|
6 | Author: Olav Kolbu
|
---|
7 | Author URI: http://www.kolbu.com/
|
---|
8 | Plugin URI: http://www.kolbu.com/2008/04/07/google-news-plugin/
|
---|
9 | License: GPL
|
---|
10 |
|
---|
11 | Minor parts of WordPress-specific code from various other GPL plugins.
|
---|
12 |
|
---|
13 | TODO: Multiple widget instances support (possibly)
|
---|
14 | Internationalize more output
|
---|
15 | See if nofollow should be added on links
|
---|
16 | */
|
---|
17 | /*
|
---|
18 | Copyright (C) 2008 kolbu.com (olav AT kolbu DOT com)
|
---|
19 |
|
---|
20 | This program is free software; you can redistribute it and/or modify
|
---|
21 | it under the terms of the GNU General Public License as published by
|
---|
22 | the Free Software Foundation; either version 3 of the License, or
|
---|
23 | (at your option) any later version.
|
---|
24 |
|
---|
25 | This program is distributed in the hope that it will be useful,
|
---|
26 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
27 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
28 | GNU General Public License for more details.
|
---|
29 |
|
---|
30 | You should have received a copy of the GNU General Public License
|
---|
31 | along with this program. If not, see <http://www.gnu.org/licenses/>.
|
---|
32 | */
|
---|
33 |
|
---|
34 | include_once(ABSPATH . WPINC . '/rss.php');
|
---|
35 |
|
---|
36 | global $google_news_instance;
|
---|
37 |
|
---|
38 | if ( ! class_exists('google_news_plugin')) {
|
---|
39 | class google_news_plugin {
|
---|
40 |
|
---|
41 | // So we don't have to query database on every replacement
|
---|
42 | var $settings;
|
---|
43 |
|
---|
44 | var $regions = array(
|
---|
45 | 'Australia' => 'au',
|
---|
46 | 'India' => 'in',
|
---|
47 | 'Israel' => 'en_il',
|
---|
48 | 'Malaysia' => 'en_my',
|
---|
49 | 'New Zealand' => 'nz',
|
---|
50 | 'Pakistan' => 'en_pk',
|
---|
51 | 'Philippines' => 'en_ph',
|
---|
52 | 'Singapore' => 'en_sg',
|
---|
53 | 'العالم العربي (Arabic)' => 'ar_me',
|
---|
54 | '中国版 (China)' => 'cn',
|
---|
55 | '香港版 (Hong Kong)' => 'hk',
|
---|
56 | 'भारत (India)' => 'hi_in',
|
---|
57 | 'தமிழ் (India)' => 'ta_in',
|
---|
58 | 'മലയാളം (India)' => 'ml_in',
|
---|
59 | 'తెలుగు (India)' => 'te_in',
|
---|
60 | 'ישראל (Israel)' => 'iw_il',
|
---|
61 | '日本 (Japan)' => 'jp',
|
---|
62 | '한국 (Korea)' => 'kr',
|
---|
63 | '台灣版 (Taiwan)' => 'tw',
|
---|
64 | 'Viá»t Nam (Vietnam)' => 'vi_vn',
|
---|
65 | '-------------' => 'us',
|
---|
66 | 'België' => 'nl_be',
|
---|
67 | 'Belgique' => 'fr_be',
|
---|
68 | 'Botswana' => 'en_bw',
|
---|
69 | 'Äeská republika' => 'cs_cz',
|
---|
70 | 'Deutschland' => 'de',
|
---|
71 | 'España' => 'es',
|
---|
72 | 'Ethiopia' => 'en_et',
|
---|
73 | 'France' => 'fr',
|
---|
74 | 'Ghana' => 'en_gh',
|
---|
75 | 'Ireland' => 'en_ie',
|
---|
76 | 'Italia' => 'it',
|
---|
77 | 'Kenya' => 'en_ke',
|
---|
78 | 'Magyarország' => 'hu_hu',
|
---|
79 | 'Namibia' => 'en_na',
|
---|
80 | 'Nederland' => 'nl_nl',
|
---|
81 | 'Nigeria' => 'en_ng',
|
---|
82 | 'Norge' => 'no_no',
|
---|
83 | 'Ãsterreich' => 'de_at',
|
---|
84 | 'Polska' => 'pl_pl',
|
---|
85 | 'Portugal' => 'pt:PT_pt',
|
---|
86 | 'Schweiz' => 'de_ch',
|
---|
87 | 'South Africa' => 'en_za',
|
---|
88 | 'Suisse' => 'fr_ch',
|
---|
89 | 'Sverige' => 'sv_se',
|
---|
90 | 'Tanzania' => 'en_tz',
|
---|
91 | 'TÃŒrkiye' => 'tr_tr',
|
---|
92 | 'Uganda' => 'en_ug',
|
---|
93 | 'U.K.' => 'uk',
|
---|
94 | 'Zimbabwe' => 'en_zw',
|
---|
95 | 'Ελλάδα (Greece)' => 'el_gr',
|
---|
96 | 'Россия (Russia)' => 'ru_ru',
|
---|
97 | 'Украина (Ukraine)' => 'ru_ua',
|
---|
98 | 'Україна (Ukraine)' => 'uk_ua',
|
---|
99 | '------------' => 'us',
|
---|
100 | 'Argentina' => 'es_ar',
|
---|
101 | 'Brasil' => 'pt:BR_br',
|
---|
102 | 'Canada English' => 'ca',
|
---|
103 | 'Canada Français' => 'fr_ca',
|
---|
104 | 'Chile' => 'es_cl',
|
---|
105 | 'Colombia' => 'es_co',
|
---|
106 | 'Cuba' => 'es_cu',
|
---|
107 | 'Estados Unidos' => 'es_us',
|
---|
108 | 'México' => 'es_mx',
|
---|
109 | 'Perú' => 'es_pe',
|
---|
110 | 'U.S.' => 'us',
|
---|
111 | 'Venezuela' => 'es_ve',
|
---|
112 | );
|
---|
113 |
|
---|
114 | var $newstypes = array(
|
---|
115 | 'All' => '',
|
---|
116 | 'Top News' => 'h',
|
---|
117 | 'Foreign' => 'w',
|
---|
118 | 'Domestic' => 'n',
|
---|
119 | 'Business' => 'b',
|
---|
120 | 'Sci/Tech' => 't',
|
---|
121 | 'Health' => 'm',
|
---|
122 | 'Sports' => 's',
|
---|
123 | 'Entertainment' => 'e',
|
---|
124 | );
|
---|
125 |
|
---|
126 | var $outputtypes = array(
|
---|
127 | 'Standard' => '',
|
---|
128 | 'Text Only' => 't',
|
---|
129 | 'With Images' => '&imv=1',
|
---|
130 | );
|
---|
131 |
|
---|
132 | var $desctypes = array(
|
---|
133 | 'Short' => '',
|
---|
134 | 'Long' => 'l',
|
---|
135 | );
|
---|
136 |
|
---|
137 | // Constructor
|
---|
138 | function google_news_plugin() {
|
---|
139 |
|
---|
140 | // Form POSTs dealt with elsewhere
|
---|
141 | if ( is_array($_POST) ) {
|
---|
142 | if ( $_POST['google_news-widget-submit'] ) {
|
---|
143 | $tmp = $_POST['google_news-widget-feed'];
|
---|
144 | $alloptions = get_option('google_news');
|
---|
145 | if ( $alloptions['widget-1'] != $tmp ) {
|
---|
146 | if ( $tmp == '*DEFAULT*' ) {
|
---|
147 | $alloptions['widget-1'] = '';
|
---|
148 | } else {
|
---|
149 | $alloptions['widget-1'] = $tmp;
|
---|
150 | }
|
---|
151 | update_option('google_news', $alloptions);
|
---|
152 | }
|
---|
153 | } else if ( $_POST['google_news-options-submit'] ) {
|
---|
154 | // noop
|
---|
155 | } else if ( $_POST['google_news-submit'] ) {
|
---|
156 | // noop
|
---|
157 | }
|
---|
158 | }
|
---|
159 |
|
---|
160 | add_filter('the_content', array(&$this, 'insert_news'));
|
---|
161 | add_action('admin_menu', array(&$this, 'admin_menu'));
|
---|
162 | add_action('plugins_loaded', array(&$this, 'widget_init'));
|
---|
163 |
|
---|
164 | // Hook for theme coders/hackers
|
---|
165 | add_action('google_news', array(&$this, 'display_feed'));
|
---|
166 |
|
---|
167 | // Makes it backwards compat pre-2.5 I hope
|
---|
168 | if ( function_exists('add_shortcode') ) {
|
---|
169 | add_shortcode('google-news', array(&$this, 'my_shortcode_handler'));
|
---|
170 | }
|
---|
171 |
|
---|
172 | }
|
---|
173 |
|
---|
174 | // *************** Admin interface ******************
|
---|
175 |
|
---|
176 | // Callback for admin menu
|
---|
177 | function admin_menu() {
|
---|
178 | add_options_page('Google News Options', 'Google News',
|
---|
179 | 'administrator', __FILE__,
|
---|
180 | array(&$this, 'plugin_options'));
|
---|
181 | add_management_page('Google News', 'Google News',
|
---|
182 | 'administrator', __FILE__,
|
---|
183 | array(&$this, 'admin_manage'));
|
---|
184 |
|
---|
185 | }
|
---|
186 |
|
---|
187 | // Settings -> Google News
|
---|
188 | function plugin_options() {
|
---|
189 |
|
---|
190 | if (get_bloginfo('version') >= '2.7') {
|
---|
191 | $manage_page = 'tools.php';
|
---|
192 | } else {
|
---|
193 | $manage_page = 'edit.php';
|
---|
194 | }
|
---|
195 | print <<<EOT
|
---|
196 | <div class="wrap">
|
---|
197 | <h2>Google News</h2>
|
---|
198 | <p>This plugin allows you to define a number of Google News
|
---|
199 | feeds and have them displayed anywhere in content, in a widget
|
---|
200 | or in a theme. Any number of inline replacements or theme
|
---|
201 | inserts can be made, but only one widget instance is
|
---|
202 | permitted in this release. To use the feeds insert one or more
|
---|
203 | of the following special html comments or Shortcodes
|
---|
204 | anywhere in user content. Note that Shortcodes, i.e. the
|
---|
205 | ones using square brackets, are only available in
|
---|
206 | WordPress 2.5 and above.<p>
|
---|
207 | <ul><li><b><--google-news--></b> (for default feed)</li>
|
---|
208 | <li><b><--google-news#feedname--></b></li>
|
---|
209 | <li><b>[google-news]</b> (also for default feed)</li>
|
---|
210 | <li><b>[google-news name="feedname"]</b></li></ul><p>
|
---|
211 | To insert in a theme call <b>do_action('google_news');</b> or
|
---|
212 | alternatively <b>do_action('google_news', 'feedname');</b><p>
|
---|
213 | To manage feeds, go to <a href="$manage_page?page=google-news/google_news.php">Manage -> Google News</a>, where you will also find more information.<p>
|
---|
214 | <a href="http://www.kolbu.com/donations/">Donations Page</a>... ;-)<p>
|
---|
215 | <a href="http://www.kolbu.com/2008/04/07/google-news-plugin/">Widget Home Page</a>, leave a comment if you have questions etc.<p>
|
---|
216 | <a href="http://www.google.com/support/news/bin/answer.py?hl=en&answer=59255">Google Terms Of Use</a><p>
|
---|
217 |
|
---|
218 |
|
---|
219 | EOT;
|
---|
220 | }
|
---|
221 |
|
---|
222 | // Manage -> Google News
|
---|
223 | function admin_manage() {
|
---|
224 | // Edit/delete links
|
---|
225 | $mode = trim($_GET['mode']);
|
---|
226 | $id = trim($_GET['id']);
|
---|
227 |
|
---|
228 | $this->upgrade_options();
|
---|
229 |
|
---|
230 | $alloptions = get_option('google_news');
|
---|
231 |
|
---|
232 | $flipregions = array_flip($this->regions);
|
---|
233 | $flipnewstypes = array_flip($this->newstypes);
|
---|
234 | $flipoutputtypes = array_flip($this->outputtypes);
|
---|
235 | $flipdesctypes = array_flip($this->desctypes);
|
---|
236 |
|
---|
237 | if ( is_array($_POST) && $_POST['google_news-submit'] ) {
|
---|
238 |
|
---|
239 | $newoptions = array();
|
---|
240 | $id = $_POST['google_news-id'];
|
---|
241 |
|
---|
242 | $newoptions['name'] = $_POST['google_news-name'];
|
---|
243 | $newoptions['title'] = $_POST['google_news-title'];
|
---|
244 | $newoptions['region'] = $_POST['google_news-region'];
|
---|
245 | $newoptions['newstype'] = $_POST['google_news-newstype'];
|
---|
246 | $newoptions['outputtype'] = $_POST['google_news-outputtype'];
|
---|
247 | $newoptions['desctype'] = $_POST['google_news-desctype'];
|
---|
248 | $newoptions['numnews'] = $_POST['google_news-numnews'];
|
---|
249 | $newoptions['query'] = $_POST['google_news-query'];
|
---|
250 | $newoptions['feedtype'] = $flipregions[$newoptions['region']].' : '.
|
---|
251 | $flipnewstypes[$newoptions['newstype']];
|
---|
252 |
|
---|
253 | if ( $alloptions['feeds'][$id] == $newoptions ) {
|
---|
254 | $text = 'No change...';
|
---|
255 | $mode = 'main';
|
---|
256 | } else {
|
---|
257 | $alloptions['feeds'][$id] = $newoptions;
|
---|
258 | update_option('google_news', $alloptions);
|
---|
259 |
|
---|
260 | $mode = 'save';
|
---|
261 | }
|
---|
262 | } else if ( is_array($_POST) && $_POST['google_news-options-cachetime-submit'] ) {
|
---|
263 | if ( $_POST['google_news-options-cachetime'] != $alloptions['cachetime'] ) {
|
---|
264 | $alloptions['cachetime'] = $_POST['google_news-options-cachetime'];
|
---|
265 | update_option('google_news', $alloptions);
|
---|
266 | $text = "Cache time changed to {$alloptions[cachetime]} seconds.";
|
---|
267 | } else {
|
---|
268 | $text = "No change in cache time...";
|
---|
269 | }
|
---|
270 | $mode = 'main';
|
---|
271 | }
|
---|
272 |
|
---|
273 | if ( $mode == 'newfeed' ) {
|
---|
274 | $newfeed = 0;
|
---|
275 | foreach ($alloptions['feeds'] as $k => $v) {
|
---|
276 | if ( $k > $newfeed ) {
|
---|
277 | $newfeed = $k;
|
---|
278 | }
|
---|
279 | }
|
---|
280 | $newfeed += 1;
|
---|
281 |
|
---|
282 | $text = "Please configure new feed and press Save.";
|
---|
283 | $mode = 'main';
|
---|
284 | }
|
---|
285 |
|
---|
286 | if ( $mode == 'save' ) {
|
---|
287 | $text = "Saved feed {$alloptions[feeds][$id][name]} [$id].";
|
---|
288 | $mode = 'main';
|
---|
289 | }
|
---|
290 |
|
---|
291 | if ( $mode == 'edit' ) {
|
---|
292 | if ( ! empty($text) ) {
|
---|
293 | echo '<!-- Last Action --><div id="message" class="updated fade"><p>'.$text.'</p></div>';
|
---|
294 | }
|
---|
295 | $text = "Editing feed {$alloptions[feeds][$id][name]} [$id].";
|
---|
296 |
|
---|
297 | $edit_id = $id;
|
---|
298 | $mode = 'main';
|
---|
299 | }
|
---|
300 |
|
---|
301 | if ( $mode == 'delete' ) {
|
---|
302 |
|
---|
303 | $text = "Deleted feed {$alloptions[feeds][$id][name]} [$id].";
|
---|
304 |
|
---|
305 | unset($alloptions['feeds'][$id]);
|
---|
306 |
|
---|
307 | update_option('google_news', $alloptions);
|
---|
308 |
|
---|
309 | $mode = 'main';
|
---|
310 | }
|
---|
311 |
|
---|
312 | // main
|
---|
313 | if ( empty($mode) or ($mode == 'main') ) {
|
---|
314 |
|
---|
315 | if ( ! empty($text) ) {
|
---|
316 | echo '<!-- Last Action --><div id="message" class="updated fade"><p>'.$text.'</p></div>';
|
---|
317 | }
|
---|
318 | print '<div class="wrap">';
|
---|
319 | print ' <h2>';
|
---|
320 | print _e('Manage Google News Feeds','google_news');
|
---|
321 | print '</h2>';
|
---|
322 | print ' <table id="the-list-x" width="100%" cellspacing="3" cellpadding="3">';
|
---|
323 | print ' <thead>';
|
---|
324 | print ' <tr>';
|
---|
325 | print ' <th scope="col">';
|
---|
326 | print _e('Key','google_news');
|
---|
327 | print '</th>';
|
---|
328 | print ' <th scope="col">';
|
---|
329 | print _e('Name','google_news');
|
---|
330 | print '</th>';
|
---|
331 | print ' <th scope="col">';
|
---|
332 | print _e('Admin-defined title','google_news');
|
---|
333 | print '</th>';
|
---|
334 | print ' <th scope="col">';
|
---|
335 | print _e('Region','google_news');
|
---|
336 | print '</th>';
|
---|
337 | print ' <th scope="col">';
|
---|
338 | print _e('Type','google_news');
|
---|
339 | print '</th>';
|
---|
340 | print ' <th scope="col">';
|
---|
341 | print _e('Output','google_news');
|
---|
342 | print '</th>';
|
---|
343 | print ' <th scope="col">';
|
---|
344 | print _e('Item length','google_news');
|
---|
345 | print '</th>';
|
---|
346 | print ' <th scope="col">';
|
---|
347 | print _e('Max items','google_news');
|
---|
348 | print '</th>';
|
---|
349 | print ' <th scope="col">';
|
---|
350 | print _e('Optional query filter','google_news');
|
---|
351 | print '</th>';
|
---|
352 | print ' <th scope="col" colspan="3">';
|
---|
353 | print _e('Action','google_news');
|
---|
354 | print '</th>';
|
---|
355 | print ' </tr>';
|
---|
356 | print ' </thead>';
|
---|
357 |
|
---|
358 | if (get_bloginfo('version') >= '2.7') {
|
---|
359 | $manage_page = 'tools.php';
|
---|
360 | } else {
|
---|
361 | $manage_page = 'edit.php';
|
---|
362 | }
|
---|
363 |
|
---|
364 | if ( $alloptions['feeds'] || $newfeed ) {
|
---|
365 | $i = 0;
|
---|
366 |
|
---|
367 | foreach ($alloptions['feeds'] as $key => $val) {
|
---|
368 | if ( $i % 2 == 0 ) {
|
---|
369 | print '<tr class="alternate">';
|
---|
370 | } else {
|
---|
371 | print '<tr>';
|
---|
372 | }
|
---|
373 | if ( isset($edit_id) && $edit_id == $key ) {
|
---|
374 | print "<form name=\"google_news_options\" action=\"".
|
---|
375 | htmlspecialchars($_SERVER['REQUEST_URI']).
|
---|
376 | "\" method=\"post\" id=\"google_news_options\">";
|
---|
377 |
|
---|
378 | print "<th scope=\"row\">".$key."</th>";
|
---|
379 | print '<td><input size="10" maxlength="20" id="google_news-name" name="google_news-name" type="text" value="'.$val['name'].'" /></td>';
|
---|
380 | print '<td><input size="20" maxlength="20" id="google_news-title" name="google_news-title" type="text" value="'.$val['title'].'" /></td>';
|
---|
381 | print '<td><select name="google_news-region">';
|
---|
382 | $region = $val['region'];
|
---|
383 | foreach ($this->regions as $k => $v) {
|
---|
384 | print '<option '.(strcmp($v,$region)?'':'selected').' value="'.$v.'" >'.$k.'</option>';
|
---|
385 | }
|
---|
386 | print '</select></td>';
|
---|
387 | print '<td><select name="google_news-newstype">';
|
---|
388 | $newstype = $val['newstype'];
|
---|
389 | foreach ($this->newstypes as $k => $v) {
|
---|
390 | print '<option '.(strcmp($v,$newstype)?'':'selected').' value="'.$v.'" >'.$k.'</option>';
|
---|
391 | }
|
---|
392 | print '</select></td>';
|
---|
393 | print '<td><select name="google_news-outputtype">';
|
---|
394 | $outputtype = $val['outputtype'];
|
---|
395 | foreach ($this->outputtypes as $k => $v) {
|
---|
396 | print '<option '.(strcmp($v,$outputtype)?'':'selected').' value="'.$v.'" >'.$k.'</option>';
|
---|
397 | }
|
---|
398 | print '</select></td>';
|
---|
399 | print '<td><select name="google_news-desctype">';
|
---|
400 | $desctype = $val['desctype'];
|
---|
401 | foreach ($this->desctypes as $k => $v) {
|
---|
402 | print '<option '.(strcmp($v,$desctype)?'':'selected').' value="'.$v.'" >'.$k.'</option>';
|
---|
403 | }
|
---|
404 | print '</select></td>';
|
---|
405 | print '<td><input size="3" maxlength="3" id="google_news-numnews" name="google_news-numnews" type="text" value="'.$val['numnews'].'" /></td>';
|
---|
406 | print '<td><input size="10" maxlength="50" id="google_news-query" name="google_news-query" type="text" value="'.$val['query'].'" /></td>';
|
---|
407 | print '<td><input type="submit" value="Save »">';
|
---|
408 | print "</td>";
|
---|
409 | print "<input type=\"hidden\" id=\"google_news-id\" name=\"google_news-id\" value=\"$edit_id\" />";
|
---|
410 | print "<input type=\"hidden\" id=\"google_news-submit\" name=\"google_news-submit\" value=\"1\" />";
|
---|
411 | print "</form>";
|
---|
412 | } else {
|
---|
413 | print "<th scope=\"row\">".$key."</th>";
|
---|
414 | print "<td>".$val['name']."</td>";
|
---|
415 | print "<td>".$val['title']."</td>";
|
---|
416 | print "<td>".$flipregions[$val['region']]."</td>";
|
---|
417 | print "<td>".$flipnewstypes[$val['newstype']]."</td>";
|
---|
418 | print "<td>".$flipoutputtypes[$val['outputtype']]."</td>";
|
---|
419 | print "<td>".$flipdesctypes[$val['desctype']]."</td>";
|
---|
420 | print "<td>".$val['numnews']."</td>";
|
---|
421 | print "<td>".$val['query']."</td>";
|
---|
422 | print "<td><a href=\"$manage_page?page=google-news/google_news.php&mode=edit&id=$key\" class=\"edit\">";
|
---|
423 | print __('Edit','google_news');
|
---|
424 | print "</a></td>\n";
|
---|
425 | print "<td><a href=\"$manage_page?page=google-news/google_news.php&mode=delete&id=$key\" class=\"delete\" onclick=\"javascript:check=confirm( '".__("This feed entry will be erased. Delete?",'google_news')."');if(check==false) return false;\">";
|
---|
426 | print __('Delete', 'google_news');
|
---|
427 | print "</a></td>\n";
|
---|
428 | }
|
---|
429 | print '</tr>';
|
---|
430 |
|
---|
431 | $i++;
|
---|
432 | }
|
---|
433 | if ( $newfeed ) {
|
---|
434 |
|
---|
435 | print "<form name=\"google_news_options\" action=\"".
|
---|
436 | htmlspecialchars($_SERVER['REQUEST_URI']).
|
---|
437 | "\" method=\"post\" id=\"google_news_options\">";
|
---|
438 |
|
---|
439 | print "<th scope=\"row\">".$newfeed."</th>";
|
---|
440 | print '<td><input size="10" maxlength="20" id="google_news-name" name="google_news-name" type="text" value="NEW" /></td>';
|
---|
441 | print '<td><input size="20" maxlength="20" id="google_news-title" name="google_news-title" type="text" value="" /></td>';
|
---|
442 | print '<td><select name="google_news-region">';
|
---|
443 | $region = 'us';
|
---|
444 | foreach ($this->regions as $k => $v) {
|
---|
445 | print '<option '.(strcmp($v,$region)?'':'selected').' value="'.$v.'" >'.$k.'</option>';
|
---|
446 | }
|
---|
447 | print '</select></td>';
|
---|
448 | print '<td><select name="google_news-newstype">';
|
---|
449 | foreach ($this->newstypes as $k => $v) {
|
---|
450 | print '<option value="'.$v.'" >'.$k.'</option>';
|
---|
451 | }
|
---|
452 | print '</select></td>';
|
---|
453 | print '<td><select name="google_news-outputtype">';
|
---|
454 | foreach ($this->outputtypes as $k => $v) {
|
---|
455 | print '<option value="'.$v.'" >'.$k.'</option>';
|
---|
456 | }
|
---|
457 | print '</select></td>';
|
---|
458 | print '<td><select name="google_news-desctype">';
|
---|
459 | foreach ($this->desctypes as $k => $v) {
|
---|
460 | print '<option value="'.$v.'" >'.$k.'</option>';
|
---|
461 | }
|
---|
462 | print '</select></td>';
|
---|
463 | print '<td><input size="3" maxlength="3" id="google_news-numnews" name="google_news-numnews" type="text" value="5" /></td>';
|
---|
464 | print '<td><input size="10" maxlength="50" id="google_news-query" name="google_news-query" type="text" value="" /></td>';
|
---|
465 | print '<td><input type="submit" value="Save »">';
|
---|
466 | print "</td>";
|
---|
467 | print "<input type=\"hidden\" id=\"google_news-id\" name=\"google_news-id\" value=\"$newfeed\" />";
|
---|
468 | print "<input type=\"hidden\" id=\"google_news-newfeed\" name=\"google_news-newfeed\" value=\"1\" />";
|
---|
469 | print "<input type=\"hidden\" id=\"google_news-submit\" name=\"google_news-submit\" value=\"1\" />";
|
---|
470 | print "</form>";
|
---|
471 | } else {
|
---|
472 | print "</tr><tr><td colspan=\"12\"><a href=\"$manage_page?page=google-news/google_news.php&mode=newfeed\" class=\"newfeed\">";
|
---|
473 | print __('Add extra feed','google_news');
|
---|
474 | print "</a></td></tr>";
|
---|
475 |
|
---|
476 | }
|
---|
477 | } else {
|
---|
478 | print '<tr><td colspan="12" align="center"><b>';
|
---|
479 | print __('No feeds found(!)','google_news');
|
---|
480 | print '</b></td></tr>';
|
---|
481 | print "</tr><tr><td colspan=\"12\"><a href=\"$manage_page?page=google-news/google_news.php&mode=newfeed\" class=\"newfeed\">";
|
---|
482 | print __('Add feed','google_news');
|
---|
483 | print "</a></td></tr>";
|
---|
484 | }
|
---|
485 | print ' </table>';
|
---|
486 | print '<h2>';
|
---|
487 | print _e('Global configuration parameters','google_news');
|
---|
488 | print '</h2>';
|
---|
489 | print ' <form method="post">';
|
---|
490 | print ' <table id="the-cachetime" cellspacing="3" cellpadding="3">';
|
---|
491 | print '<tr><td><b>Cache time:</b></td>';
|
---|
492 | print '<td><input size="6" maxlength="6" id="google_news-options-cachetime" name="google_news-options-cachetime" type="text" value="'.$alloptions['cachetime'].'" /> seconds</td>';
|
---|
493 | print '<input type="hidden" id="google_news-options-cachetime-submit" name="google_news-options-cachetime-submit" value="1" />';
|
---|
494 | print '<td><input type="submit" value="Save »"></td></tr>';
|
---|
495 | print ' </table>';
|
---|
496 | print '</form>';
|
---|
497 |
|
---|
498 | print '<h2>';
|
---|
499 | print _e('Information','google_news');
|
---|
500 | print '</h2>';
|
---|
501 | print ' <table id="the-list-x" width="100%" cellspacing="3" cellpadding="3">';
|
---|
502 | print '<tr><td><b>Key</b></td><td>Unique identifier used internally.</td></tr>';
|
---|
503 | print '<tr><td><b>Name</b></td><td>Optional name to be able to reference a specific feed as e.g. ';
|
---|
504 | print ' <b><!--google_news#myname--></b>. ';
|
---|
505 | print ' If more than one feed shares the same name, a random among these will be picked each time. ';
|
---|
506 | print ' The one(s) without a name will be treated as the default feed(s), i.e. used for <b><!--google_news--></b> ';
|
---|
507 | print ' or widget feed type <b>*DEFAULT*</b>. If you have Wordpress 2.5 ';
|
---|
508 | print ' or above, you can also use Shortcodes on the form <b>[google-news]</b> ';
|
---|
509 | print ' (for default feed) or <b>[google-news name="feedname"]</b>. And finally ';
|
---|
510 | print ' you can use <b>do_action(\'google_news\');</b> or <b>do_action(\'google_news\', \'feedname\');</b> ';
|
---|
511 | print ' in themes.</td></tr>';
|
---|
512 | print '<tr><td><b>Admin-defined title</b></td><td>Optional feed title. If not set, a reasonable title based on ';
|
---|
513 | print 'Region and Type will be used. Note Google Terms of Service require you to show that the feeds come from ';
|
---|
514 | print 'Google News.</td></tr>';
|
---|
515 | print '<tr><td><b>Region</b></td><td>The region/language of the feed.</td></tr>';
|
---|
516 | print '<tr><td><b>Type</b></td><td>The type of news to present.</td></tr>';
|
---|
517 | print '<tr><td><b>Output</b></td><td>Text only, allow for images or images with most news items. Note that ';
|
---|
518 | print 'there will be text in all three cases.</td></tr>';
|
---|
519 | print '<tr><td><b>Item length</b></td><td>Single sentence news items or 2-3 lines of text.</td></tr>';
|
---|
520 | print '<tr><td><b>Max items</b></td><td>Maximum number of news items to show for this feed. If the feed contains ';
|
---|
521 | print 'less than the requested items, only the number of items in the feed will obviously be displayed.</td></tr>';
|
---|
522 | print '<tr><td><b>Optional query filter</b></td><td>Pass the requested news through a query filter for very ';
|
---|
523 | print 'detailed control over the type of news to show. E.g. only sports news about the Yankees.</td></tr>';
|
---|
524 | print '<tr><td colspan="12">In all cases, output will depend on original news source and can and will ';
|
---|
525 | print 'differ from source to source. Google hasn\'t really done a great job with respect to formatting. ';
|
---|
526 | print 'Note specifically that a query filter will change the output slightly, as this is how Google wants it.</td></tr>';
|
---|
527 | print '<tr><td><b>Cache time</b></td><td>Minimum number of seconds that WordPress should cache a Google News feed before fetching it again.</td></tr>';
|
---|
528 | print ' </table>';
|
---|
529 | print '</div>';
|
---|
530 | }
|
---|
531 | }
|
---|
532 |
|
---|
533 | // ************* Output *****************
|
---|
534 |
|
---|
535 | // The function that gets called from themes
|
---|
536 | function display_feed($data) {
|
---|
537 | global $settings;
|
---|
538 | $settings = get_option('google_news');
|
---|
539 | print $this->random_feed($data);
|
---|
540 | unset($settings);
|
---|
541 | }
|
---|
542 |
|
---|
543 | // Callback for inline replacement
|
---|
544 | function insert_news($data) {
|
---|
545 | global $settings;
|
---|
546 |
|
---|
547 | // Allow for multi-feed sites
|
---|
548 | $tag = '/<!--google-news(|#.*?)-->/';
|
---|
549 |
|
---|
550 | // We may have old style options
|
---|
551 | $this->upgrade_options();
|
---|
552 |
|
---|
553 | // Avoid getting this for each callback
|
---|
554 | $settings = get_option('google_news');
|
---|
555 |
|
---|
556 | $result = preg_replace_callback($tag,
|
---|
557 | array(&$this, 'inline_replace_callback'), $data);
|
---|
558 |
|
---|
559 | unset($settings);
|
---|
560 |
|
---|
561 | return $result;
|
---|
562 | }
|
---|
563 |
|
---|
564 |
|
---|
565 | // *********** Widget support **************
|
---|
566 | function widget_init() {
|
---|
567 |
|
---|
568 | // Check for the required plugin functions. This will prevent fatal
|
---|
569 | // errors occurring when you deactivate the dynamic-sidebar plugin.
|
---|
570 | if ( !function_exists('register_sidebar_widget') )
|
---|
571 | return;
|
---|
572 |
|
---|
573 | register_widget_control('Google News',
|
---|
574 | array(&$this, 'widget_control'), 200, 100);
|
---|
575 |
|
---|
576 | // wp_* has more features, presumably fixed at a later date
|
---|
577 | register_sidebar_widget('Google News',
|
---|
578 | array(&$this, 'widget_output'));
|
---|
579 |
|
---|
580 | }
|
---|
581 |
|
---|
582 | function widget_control() {
|
---|
583 |
|
---|
584 | // We may have old style options
|
---|
585 | $this->upgrade_options();
|
---|
586 |
|
---|
587 | $alloptions = get_option('google_news');
|
---|
588 | $thisfeed = $alloptions['widget-1'];
|
---|
589 |
|
---|
590 | print '<p><label for="google_news-feed">Select feed:</label>';
|
---|
591 | print '<select style="vertical-align:middle;" name="google_news-widget-feed">';
|
---|
592 |
|
---|
593 | $allfeeds = array();
|
---|
594 | foreach ($alloptions['feeds'] as $k => $v) {
|
---|
595 | $allfeeds[strlen($v['name'])?$v['name']:'*DEFAULT*'] = 1;
|
---|
596 | }
|
---|
597 | foreach ($allfeeds as $k => $v) {
|
---|
598 | print '<option '.($k==$thisfeed?'':'selected').' value="'.$k.'" >'.$k.'</option>';
|
---|
599 | }
|
---|
600 | print '</select><p>';
|
---|
601 | print '<input type="hidden" id="google_news-widget-submit" name="google_news-widget-submit" value="1" />';
|
---|
602 |
|
---|
603 |
|
---|
604 | }
|
---|
605 |
|
---|
606 | // Called every time we want to display ourselves as a sidebar widget
|
---|
607 | function widget_output($args) {
|
---|
608 | extract($args); // Gives us $before_ and $after_ I presume
|
---|
609 |
|
---|
610 | // We may have old style options
|
---|
611 | $this->upgrade_options();
|
---|
612 |
|
---|
613 | $alloptions = get_option('google_news');
|
---|
614 | $matching_feeds = array();
|
---|
615 | foreach ($alloptions['feeds'] as $k => $v) {
|
---|
616 | if ( (string)$v['name'] == $alloptions['widget-1'] ) {
|
---|
617 | $matching_feeds[] = $k;
|
---|
618 | }
|
---|
619 | }
|
---|
620 | if ( ! count($matching_feeds) ) {
|
---|
621 | if ( ! strlen($alloptions['widget-1']) ) {
|
---|
622 | $content = '<ul><b>No default feed available</b></ul>';
|
---|
623 | } else {
|
---|
624 | $content = "<ul>Unknown feed name <b>{$alloptions[widget-1]}</b> used</ul>";
|
---|
625 | }
|
---|
626 | echo $before_widget;
|
---|
627 | echo $before_title . __('Google News<br>Error','google_news') . $after_title . '<div>';
|
---|
628 | echo $content;
|
---|
629 | echo '</div>' . $after_widget;
|
---|
630 | return;
|
---|
631 | }
|
---|
632 | $feed_id = $matching_feeds[rand(0, count($matching_feeds)-1)];
|
---|
633 | $options = $alloptions['feeds'][$feed_id];
|
---|
634 |
|
---|
635 | $feedtype = $options['feedtype'];
|
---|
636 | $cachetime = $alloptions['cachetime'];
|
---|
637 |
|
---|
638 | if ( strlen($options['title']) ) {
|
---|
639 | $title = $options['title'];
|
---|
640 | } else {
|
---|
641 | $title = 'Google News<br>'.$feedtype;
|
---|
642 | }
|
---|
643 |
|
---|
644 | echo $before_widget;
|
---|
645 | echo $before_title . $title . $after_title . '<div>';
|
---|
646 | echo $this->get_feed($options, $cachetime);
|
---|
647 | echo '</div>' . $after_widget;
|
---|
648 | }
|
---|
649 |
|
---|
650 | // ************** The actual work ****************
|
---|
651 | function get_feed(&$options, $cachetime) {
|
---|
652 |
|
---|
653 | if ( ! isset($options['region']) ) {
|
---|
654 | return 'Options not set, visit plugin configuation screen.';
|
---|
655 | }
|
---|
656 |
|
---|
657 | $region = $options['region'] ? $options['region'] : 'us';
|
---|
658 | $newstype = $options['newstype'];
|
---|
659 | $outputtype = $options['outputtype'];
|
---|
660 | $query = $options['query'];
|
---|
661 | $numnews = $options['numnews'] ? $options['numnews'] : 5;
|
---|
662 | $desctype = $options['desctype'];
|
---|
663 |
|
---|
664 | $result = '<ul>';
|
---|
665 | $feedurl = 'http://news.google.com/news?output=rss';
|
---|
666 |
|
---|
667 | // This will also handle mixed mode text/image, when
|
---|
668 | // we get the parsing under control...
|
---|
669 | if ( $outputtype == 't' ) {
|
---|
670 | $region = 't'.$region; // Consistent API, wassat?
|
---|
671 | } else if ( strlen($outputtype) ) {
|
---|
672 | $feedurl .= $outputtype;
|
---|
673 | }
|
---|
674 | $feedurl .= "&ned=$region";
|
---|
675 | if ( strlen($newstype) ) {
|
---|
676 | $feedurl .= "&topic=$newstype";
|
---|
677 | }
|
---|
678 | if ( strlen($query) ) {
|
---|
679 | if ( substr($query,0,3) == 'OR ' ) {
|
---|
680 | $squery = urlencode(strtolower(substr($query,3)));
|
---|
681 | $feedurl .= "&as_oq=$squery";
|
---|
682 | } else {
|
---|
683 | $squery = urlencode(strtolower($query));
|
---|
684 | $feedurl .= "&q=$squery";
|
---|
685 | }
|
---|
686 | }
|
---|
687 |
|
---|
688 | // Using the WP RSS fetcher (MagpieRSS). It has serious
|
---|
689 | // GC problems though.
|
---|
690 | define('MAGPIE_CACHE_AGE', $cachetime);
|
---|
691 | define('MAGPIE_CACHE_ON', 1);
|
---|
692 | define('MAGPIE_DEBUG', 1);
|
---|
693 |
|
---|
694 | $rss = fetch_rss($feedurl);
|
---|
695 |
|
---|
696 | if ( ! is_object($rss) ) {
|
---|
697 | return 'Google News unavailable</ul>';
|
---|
698 | }
|
---|
699 | $rss->items = array_slice($rss->items, 0, $numnews);
|
---|
700 | foreach ( $rss->items as $item ) {
|
---|
701 | $description = $this->html_decode($item['description']);
|
---|
702 |
|
---|
703 | // All this is bound to break, but Google
|
---|
704 | // doesn't know usable markup from squat
|
---|
705 |
|
---|
706 | // As per Google TOC, we need to retain related link
|
---|
707 | preg_match('|(<a class=p [^>]+><nobr>[^<]+</nobr></a>)|',
|
---|
708 | $description, $related);
|
---|
709 |
|
---|
710 | // Try some tricks to lose useless markup
|
---|
711 | $bloc = strpos($description, '<font');
|
---|
712 | if ( $bloc ) {
|
---|
713 | $description = substr($description, $bloc);
|
---|
714 | }
|
---|
715 | $eloc = strpos($description, '<a href=',
|
---|
716 | strpos($description, '<a href=')+1);
|
---|
717 | if ( $eloc ) {
|
---|
718 | $description = substr($description,0,$eloc);
|
---|
719 | }
|
---|
720 |
|
---|
721 | // No markup in tooltips
|
---|
722 | $tooltip = preg_replace('/<[^>]+>/','',$description);
|
---|
723 | $patterns = array(
|
---|
724 | '/<(td|tr|table|div|font|ul|li)[^>]*>/',
|
---|
725 | '/<.(td|tr|table|div|font|ul|li)[^>]*>/',
|
---|
726 | );
|
---|
727 | $replacements = array(
|
---|
728 | '',
|
---|
729 | '',
|
---|
730 | );
|
---|
731 | $description = preg_replace($patterns, $replacements,
|
---|
732 | $description);
|
---|
733 | $description = preg_replace('|<br>|', '', $description, 1);
|
---|
734 | $description = preg_replace('|(<img src[^>]+>)<br>([^<]+</a>)|',
|
---|
735 | '\\1\\2<br>', $description, 1);
|
---|
736 | $description = preg_replace('|</div><br><div|', '</div><div',
|
---|
737 | $description);
|
---|
738 | $description .= $related[1];
|
---|
739 |
|
---|
740 | $title = $this->html_decode($item['title']);
|
---|
741 | $date = $item['pubdate'];
|
---|
742 | $link = $item['link'];
|
---|
743 | if ( strlen($desctype) ) {
|
---|
744 | $result .= "<li>$description</li>";
|
---|
745 | } else {
|
---|
746 | $result .= "<li><a href=\"$link\" target=\"_blank\" ".
|
---|
747 | "title=\"$tooltip\">$title<br>$related[1]</a></li>";
|
---|
748 | }
|
---|
749 | }
|
---|
750 | return $result.'</ul>';
|
---|
751 | }
|
---|
752 |
|
---|
753 | // *********** Shortcode support **************
|
---|
754 | function my_shortcode_handler($atts, $content=null) {
|
---|
755 | global $settings;
|
---|
756 | $settings = get_option('google_news');
|
---|
757 | return $this->random_feed($atts['name']);
|
---|
758 | unset($settings);
|
---|
759 | }
|
---|
760 |
|
---|
761 |
|
---|
762 | // *********** inline replacement callback support **************
|
---|
763 | function inline_replace_callback($matches) {
|
---|
764 |
|
---|
765 | if ( ! strlen($matches[1]) ) { // Default
|
---|
766 | $feedname = '';
|
---|
767 | } else {
|
---|
768 | $feedname = substr($matches[1], 1); // Skip #
|
---|
769 | }
|
---|
770 | return $this->random_feed($feedname);
|
---|
771 | }
|
---|
772 |
|
---|
773 | // ************** Support functions ****************
|
---|
774 |
|
---|
775 | function random_feed($name) {
|
---|
776 | global $settings;
|
---|
777 |
|
---|
778 | $matching_feeds = array();
|
---|
779 | foreach ($settings['feeds'] as $k => $v) {
|
---|
780 | if ( (string)$v['name'] == $name ) {
|
---|
781 | $matching_feeds[] = $k;
|
---|
782 | }
|
---|
783 | }
|
---|
784 | if ( ! count($matching_feeds) ) {
|
---|
785 | if ( ! strlen($name) ) {
|
---|
786 | return '<ul><b>No default feed available</b></ul>';
|
---|
787 | } else {
|
---|
788 | return "<ul>Unknown feed name <b>$name</b> used</ul>";
|
---|
789 | }
|
---|
790 | }
|
---|
791 | $feed_id = $matching_feeds[rand(0, count($matching_feeds)-1)];
|
---|
792 | $feed = $settings['feeds'][$feed_id];
|
---|
793 |
|
---|
794 | if ( strlen($feed['title']) ) {
|
---|
795 | $title = $feed['title'];
|
---|
796 | } else {
|
---|
797 | $title = 'Google News : '.$feed['feedtype'];
|
---|
798 | }
|
---|
799 |
|
---|
800 | $result = '<!-- Start Google News code -->';
|
---|
801 | $result .= "<div id=\"google-news-inline\"><h3>$title</h3>";
|
---|
802 | $result .= $this->get_feed($feed, $settings['cachetime']);
|
---|
803 | $result .= '</div><!-- End Google News code -->';
|
---|
804 | return $result;
|
---|
805 | }
|
---|
806 |
|
---|
807 | function html_decode($in) {
|
---|
808 | $patterns = array(
|
---|
809 | '/&/',
|
---|
810 | '/"/',
|
---|
811 | '/</',
|
---|
812 | '/>/',
|
---|
813 | );
|
---|
814 | $replacements = array(
|
---|
815 | '&',
|
---|
816 | '"',
|
---|
817 | '<',
|
---|
818 | '>',
|
---|
819 | );
|
---|
820 | $tmp = preg_replace($patterns, $replacements, $in);
|
---|
821 | return preg_replace('/'/','\'',$tmp);
|
---|
822 |
|
---|
823 | }
|
---|
824 |
|
---|
825 | // Unfortunately, we didn't finalize on a data structure
|
---|
826 | // until version 2.1ish of the plugin so we need to upgrade
|
---|
827 | // if needed
|
---|
828 | function upgrade_options() {
|
---|
829 | $options = get_option('google_news');
|
---|
830 |
|
---|
831 | if ( !is_array($options) ) {
|
---|
832 |
|
---|
833 | // From 1.0
|
---|
834 | $oldoptions = get_option('widget_google_news_widget');
|
---|
835 | if ( is_array($oldoptions) ) {
|
---|
836 | $flipregions = array_flip($this->regions);
|
---|
837 | $flipnewstypes = array_flip($this->newstypes);
|
---|
838 |
|
---|
839 | $tmpfeed = array();
|
---|
840 | $tmpfeed['title'] = $oldoptions['title'];
|
---|
841 | $tmpfeed['name'] = '';
|
---|
842 | $tmpfeed['numnews'] = $oldoptions['numnews'];
|
---|
843 | $tmpfeed['region'] = $oldoptions['region'];
|
---|
844 | $tmpfeed['newstype'] = $oldoptions['newstype'];
|
---|
845 | $tmpfeed['outputtype'] = $oldoptions['outputtype'];
|
---|
846 | $tmpfeed['query'] = $oldoptions['query'];
|
---|
847 | $tmpfeed['feedtype'] = $flipregions[$tmpfeed['region']].
|
---|
848 | ' : '.
|
---|
849 | $flipnewstypes[$tmpfeed['newstype']];
|
---|
850 |
|
---|
851 | $options = array();
|
---|
852 | $options['feeds'] = array( $tmpfeed );
|
---|
853 | $options['widget-1'] = 0;
|
---|
854 | $options['cachetime'] = 300;
|
---|
855 |
|
---|
856 | delete_option('widget_google_news_widget');
|
---|
857 | update_option('google_news', $options);
|
---|
858 | } else {
|
---|
859 | // First time ever
|
---|
860 | $options = array();
|
---|
861 | $options['feeds'] = array( $this->default_feed() );
|
---|
862 | $options['widget-1'] = 0;
|
---|
863 | $options['cachetime'] = 300;
|
---|
864 | update_option('google_news', $options);
|
---|
865 | }
|
---|
866 | } else {
|
---|
867 | // From 2.0/2.0.1 to 2.1
|
---|
868 | if ( array_key_exists('region', $options) ) {
|
---|
869 | $newoptions = array('feeds' => array( $options));
|
---|
870 | $newoptions['feeds'][0]['name'] = '';
|
---|
871 | $newoptions['widget-1'] = 0;
|
---|
872 | $newoptions['cachetime'] = 300;
|
---|
873 | update_option('google_news', $newoptions);
|
---|
874 |
|
---|
875 | } else if ( 0 ) {
|
---|
876 | // Messed up options, start from scratch
|
---|
877 | $options = array();
|
---|
878 | $options['feeds'] = array( $this->default_feed() );
|
---|
879 | $options['widget-1'] = 0;
|
---|
880 | $options['cachetime'] = 300;
|
---|
881 | update_option('google_news', $options);
|
---|
882 | }
|
---|
883 | }
|
---|
884 | }
|
---|
885 |
|
---|
886 | function default_feed() {
|
---|
887 | return array( 'numnews' => 5,
|
---|
888 | 'region' => 'us',
|
---|
889 | 'name' => '',
|
---|
890 | 'feedtype' => 'U.S. : All');
|
---|
891 | }
|
---|
892 | }
|
---|
893 |
|
---|
894 | // Instantiate
|
---|
895 | $google_news_instance &= new google_news_plugin();
|
---|
896 |
|
---|
897 | }
|
---|
898 | ?>
|
---|