PluginProbe
FeedWordPress / 2011.0512
FeedWordPress v2011.0512
trunk 0.8 0.9 0.91 0.95 0.96 0.97 0.98 0.981 0.99 0.991 0.992 0.993 2008.1030 2008.1101 2008.1105 2008.1214 2009.0612 2009.0613 2009.0618 2009.0707 2009.1111 2009.1112 2010.0127 2010.0528 All 65 releases
feedwordpress / feeds-page.php

feeds-page.php in FeedWordPress 2011.0512, at feeds-page.php

952 lines 36.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 require_once(dirname(__FILE__) . '/admin-ui.php');
3 require_once(dirname(__FILE__) . '/magpiemocklink.class.php');
4 require_once(dirname(__FILE__) . '/feedfinder.class.php');
5 require_once(dirname(__FILE__) . '/updatedpostscontrol.class.php');
6
7 class FeedWordPressFeedsPage extends FeedWordPressAdminPage {
8 var $HTTPStatusMessages = array (
9 200 => 'OK. FeedWordPress had no problems retrieving the content at this URL but the content does not seem to be a feed, and does not seem to include links to any feeds.',
10 201 => 'Created',
11 202 => 'Accepted',
12 203 => 'Non-Authoritative information',
13 204 => 'No Content',
14 205 => 'Reset Content',
15 206 => 'Partial Content',
16 300 => 'Multiple Choices',
17 301 => 'Moved Permanently',
18 302 => 'Found',
19 303 => 'See Other',
20 304 => 'Not Modified',
21 305 => 'Use Proxy',
22 307 => 'Temporary Redirect',
23 400 => 'Bad Request',
24 401 => 'Unauthorized. This URL probably needs a username and password for you to access it.',
25 402 => 'Payment Required',
26 403 => 'Forbidden. The URL is not made available for the machine that FeedWordPress is running on.',
27 404 => 'Not Found. There is nothing at this URL. Have you checked the address for typos?',
28 405 => 'Method Not Allowed',
29 406 => 'Not Acceptable',
30 407 => 'Proxy Authentication Required',
31 408 => 'Request Timeout',
32 409 => 'Conflict',
33 410 => 'Gone. This URL is no longer available on this server and no forwarding address is known.',
34 411 => 'Length Required',
35 412 => 'Precondition Failed',
36 413 => 'Request Entity Too Large',
37 414 => 'Request URI Too Long',
38 415 => 'Unsupported Media Type',
39 416 => 'Requested Range Not Satisfiable',
40 417 => 'Expectation Failed',
41 500 => 'Internal Server Error. Something unexpected went wrong with the configuration of the server that hosts this URL. You might try again later to see if this issue has been resolved.',
42 501 => 'Not Implemented',
43 502 => 'Bad Gateway',
44 503 => 'Service Unavailable. The server is currently unable to handle the request due to a temporary overloading or maintenance of the server that hosts this URL. This is probably a temporary condition and you should try again later to see if the issue has been resolved.',
45 504 => 'Gateway Timeout',
46 505 => 'HTTP Version Not Supported',
47 );
48 var $updatedPosts = NULL;
49
50 var $special_settings = array ( /* Regular expression syntax is OK here */
51 'cats',
52 'cat_split',
53 'fetch timeout',
54 'freeze updates',
55 'hardcode name',
56 'hardcode url',
57 'hardcode description',
58 'hardcode categories', /* Deprecated */
59 'comment status',
60 'terms',
61 'map authors',
62 'munge permalink',
63 'ping status',
64 'post status',
65 'postmeta',
66 'query parameters',
67 'resolve relative',
68 'syndicated post type',
69 'tags',
70 'unfamiliar author',
71 'unfamliar categories', /* Deprecated */
72 'unfamiliar category',
73 'unfamiliar post_tag',
74 'add/.*',
75 'update/.*',
76 'feed/.*',
77 'link/.*',
78 'match/.*',
79 );
80
81 /**
82 * Constructs the Feeds page object
83 *
84 * @param mixed $link An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings
85 */
86 function FeedWordPressFeedsPage ($link = -1) {
87 if (is_numeric($link) and -1 == $link) :
88 $link = FeedWordPressAdminPage::submitted_link();
89 endif;
90
91 FeedWordPressAdminPage::FeedWordPressAdminPage('feedwordpressfeeds', $link);
92
93 $this->dispatch = 'feedwordpress_admin_page_feeds';
94 $this->pagenames = array(
95 'default' => 'Feeds',
96 'settings-update' => 'Syndicated feed',
97 'open-sheet' => 'Feed and Update',
98 );
99 $this->filename = __FILE__;
100 $this->updatedPosts = new UpdatedPostsControl($this);
101
102 $this->special_settings = apply_filters('syndicated_feed_special_settings', $this->special_settings, $this);
103 } /* FeedWordPressFeedsPage constructor */
104
105 function display () {
106 global $fwp_post;
107 global $post_source;
108
109 $this->boxes_by_methods = array(
110 'feed_information_box' => __('Feed Information'),
111 'global_feeds_box' => __('Update Scheduling'),
112 'updated_posts_box' => __('Updated Posts'),
113 'custom_settings_box' => __('Custom Feed Settings (for use in templates)'),
114 'fetch_settings_box' => __('Settings for Fetching Feeds (Advanced)'),
115 );
116 if ($this->for_default_settings()) :
117 unset($this->boxes_by_methods['custom_settings_box']);
118 endif;
119
120 // Allow overriding of normal source for FeedFinder, which may
121 // be called from multiple points.
122 if (isset($post_source) and !is_null($post_source)) :
123 $source = $post_source;
124 else :
125 $source = $this->dispatch;
126 endif;
127
128 if (isset($_REQUEST['feedfinder'])
129 or (isset($_REQUEST['action']) and $_REQUEST['action']=='feedfinder')
130 or (isset($_REQUEST['action']) and $_REQUEST['action']==FWP_SYNDICATE_NEW)) :
131 // If this is a POST, validate source and user credentials
132 FeedWordPressCompatibility::validate_http_request(/*action=*/ $source, /*capability=*/ 'manage_links');
133
134 return $this->display_feedfinder(); // re-route to Feed Finder page
135 endif;
136
137 parent::display();
138 return false; // Don't continue
139 } /* FeedWordPressFeedsPage::display() */
140
141 function ajax_interface_js () {
142 FeedWordPressAdminPage::ajax_interface_js();
143 ?>
144
145 jQuery(document).ready( function () {
146 contextual_appearance('automatic-updates-selector', 'cron-job-explanation', null, 'no');
147 contextual_appearance('time-limit', 'time-limit-box', null, 'yes');
148 contextual_appearance('use-default-update-window-no', 'update-scheduling-note', null, null, 'block', true);
149 jQuery('#use-default-update-window-yes, #use-default-update-window-no').click( function () {
150 contextual_appearance('use-default-update-window-no', 'update-scheduling-note', null, null, 'block', true);
151 } );
152
153 var els = ['name', 'description', 'url'];
154 for (var i = 0; i < els.length; i++) {
155 contextual_appearance(
156 /*item=*/ 'basics-hardcode-'+els[i],
157 /*appear=*/ 'basics-'+els[i]+'-view',
158 /*disappear=*/ 'basics-'+els[i]+'-edit',
159 /*value=*/ 'no',
160 /*visibleStyle=*/ 'block',
161 /*checkbox=*/ true
162 );
163 } /* for */
164 } );
165
166 <?php
167 }
168
169 /*static*/ function updated_posts_box ($page, $box = NULL) {
170 ?>
171 <table class="edit-form">
172 <?php $page->updatedPosts->display(); ?>
173 </table>
174 <?php
175 } /* FeedWordPressFeedsPage::updated_posts_box() */
176
177 /*static*/ function global_feeds_box ($page, $box = NULL) {
178 $automatic_updates = get_option('feedwordpress_automatic_updates');
179 $update_time_limit = (int) get_option('feedwordpress_update_time_limit');
180
181 // Hey, ho, let's go...
182 ?>
183
184 <table class="edit-form">
185 <?php if ($page->for_default_settings()) : ?>
186
187 <tr>
188 <th scope="row">Updates:</th>
189 <td><select id="automatic-updates-selector" name="automatic_updates" size="1" onchange="contextual_appearance('automatic-updates-selector', 'cron-job-explanation', null, 'no');">
190 <option value="shutdown"<?php echo ($automatic_updates=='shutdown')?' selected="selected"':''; ?>>automatically check for updates after pages load</option>
191 <option value="init"<?php echo ($automatic_updates=='init')?' selected="selected"':''; ?>>automatically check for updates before pages load</option>
192 <option value="no"<?php echo (!$automatic_updates)?' selected="selected"':''; ?>>cron job or manual updates</option>
193 </select>
194 <div id="cron-job-explanation" class="setting-description">
195 <p>If you want to use a cron job,
196 you can perform scheduled updates by sending regularly-scheduled
197 requests to <a href="<?php bloginfo('home'); ?>?update_feedwordpress=1"><code><?php bloginfo('url') ?>?update_feedwordpress=1</code></a>
198 For example, inserting the following line in your crontab:</p>
199 <pre style="font-size: 0.80em"><code>*/10 * * * * /usr/bin/curl --silent <?php bloginfo('url'); ?>?update_feedwordpress=1</code></pre>
200 <p class="setting-description">will check in every 10 minutes
201 and check for updates on any feeds that are ready to be polled for updates.</p>
202 </div>
203 </td>
204 </tr>
205
206 <?php else : /* Feed-specific settings */ ?>
207
208 <tr>
209 <th scope="row"><?php _e('Last update') ?>:</th>
210 <td><?php
211 if (isset($page->link->settings['update/last'])) :
212 echo fwp_time_elapsed($page->link->settings['update/last'])." ";
213 else :
214 echo " none yet";
215 endif;
216 ?></td></tr>
217
218 <tr><th><?php _e('Next update') ?>:</th>
219 <td><?php
220 $holdem = (isset($page->link->settings['update/hold']) ? $page->link->settings['update/hold'] : 'scheduled');
221 ?>
222 <select name="update_schedule">
223 <option value="scheduled"<?php echo ($holdem=='scheduled')?' selected="selected"':''; ?>>update on schedule <?php
224 echo " (";
225 if (isset($page->link->settings['update/ttl']) and is_numeric($page->link->settings['update/ttl'])) :
226 if (isset($page->link->settings['update/timed']) and $page->link->settings['update/timed']=='automatically') :
227 echo 'next: ';
228 $next = $page->link->settings['update/last'] + ((int) $page->link->settings['update/ttl'] * 60);
229 if (strftime('%x', time()) != strftime('%x', $next)) :
230 echo strftime('%x', $next)." ";
231 endif;
232 echo strftime('%X', $page->link->settings['update/last']+((int) $page->link->settings['update/ttl']*60));
233 else :
234 echo "every ".$page->link->settings['update/ttl']." minute".(($page->link->settings['update/ttl']!=1)?"s":"");
235 endif;
236 else:
237 echo "next scheduled update";
238 endif;
239 echo ")";
240 ?></option>
241 <option value="next"<?php echo ($holdem=='next')?' selected="selected"':''; ?>>update ASAP</option>
242 <option value="ping"<?php echo ($holdem=='ping')?' selected="selected"':''; ?>>update only when pinged</option>
243 </select></td></tr>
244
245 <?php endif; ?>
246
247 <tr>
248 <th scope="row"><?php print __('Update scheduling:') ?></th>
249 <td><p style="margin-top:0px">How long should FeedWordPress wait between updates before it considers this feed ready to be polled for updates again?</p>
250 <?php
251
252 $this->setting_radio_control(
253 'update/window', 'update_window',
254 array(&$this, 'update_window_edit_box'),
255 array(
256 'global-setting-default' => DEFAULT_UPDATE_PERIOD,
257 'default-input-name' => 'use_default_update_window',
258 'default-input-id' => 'use-default-update-window-yes',
259 'default-input-id-no' => 'use-default-update-window-no',
260 'labels' => array(&$this, 'update_window_currently'),
261 )
262 );
263 ?></td>
264 </tr>
265
266 <?php if ($this->for_default_settings()) : ?>
267
268 <tr>
269 <th scope="row"><?php print __('Time limit on updates'); ?>:</th>
270 <td><select id="time-limit" name="update_time_limit" size="1" onchange="contextual_appearance('time-limit', 'time-limit-box', null, 'yes');">
271 <option value="no"<?php echo ($update_time_limit>0)?'':' selected="selected"'; ?>>no time limit on updates</option>
272 <option value="yes"<?php echo ($update_time_limit>0)?' selected="selected"':''; ?>>limit updates to no more than...</option>
273 </select>
274 <span id="time-limit-box"><label><input type="text" name="time_limit_seconds" value="<?php print $update_time_limit; ?>" size="5" /> seconds</label></span>
275 </tr>
276
277 <?php endif; ?>
278
279 </table>
280
281 <?php
282 } /* FeedWordPressFeedsPage::global_feeds_box() */
283
284 function update_window_edit_box ($updateWindow, $defaulted, $params) {
285 if (!is_numeric($updateWindow)) :
286 $updateWindow = DEFAULT_UPDATE_PERIOD;
287 endif;
288 ?>
289 <p>Wait <input type="text" name="update_window" value="<?php print $updateWindow; ?>" size="4" /> minutes between polling.</p>
290 <div class="setting-description" id="update-scheduling-note">
291 <p<?php if ($updateWindow<50) : ?> style="color: white; background-color: #703030; padding: 1.0em;"<?php endif; ?>><strong>Recommendation.</strong> Unless you are positive that you have the webmaster's permission, you generally should not set FeedWordPress to poll feeds more frequently than once every 60 minutes. Many webmasters consider more frequent automated polling to be abusive, and may complain to your web host, or ban your IP address, as retaliation for hammering their servers too hard.</p>
292 <p><strong>Note.</strong> This is a default setting that FeedWordPress uses to schedule updates when the feed does not provide any scheduling requests. If this feed does provide update scheduling information (through elements such as <code>&lt;rss:ttl&gt;</code> or <code>&lt;sy:updateFrequency&gt;</code>), FeedWordPress will respect the feed's request.</p>
293 </div>
294 <?php
295 } /* FeedWordPressFeedsPage::update_window_edit_box () */
296
297 function update_window_currently ($updateWindow, $defaulted, $params) {
298 $updateWindow = (int) $updateWindow;
299 if (1==$updateWindow) :
300 $caption = 'wait %d minute between polling';
301 else :
302 $caption = 'wait %d minutes between polling';
303 endif;
304 return sprintf(__($caption), $updateWindow);
305 } /* FeedWordPressFeedsPage::update_window_currently () */
306
307 function fetch_timeout_setting ($setting, $defaulted, $params) {
308 $timeout = intval($this->setting('fetch timeout', FEEDWORDPRESS_FETCH_TIMEOUT_DEFAULT));
309
310 if ($this->for_feed_settings()) :
311 $article = 'this';
312 else :
313 $article = 'a';
314 endif;
315 ?>
316 <p>Wait no more than
317 than <input name="fetch_timeout" type="number" min="0" size="3" value="<?php print $timeout; ?>" />
318 second(s) when trying to fetch <?php print $article; ?> feed to check for updates.</p>
319 <p>If <?php print $article; ?> source's web server does not respond before time runs
320 out, FeedWordPress will skip over the source and try again during
321 the next update cycle.</p>
322 <?php
323 }
324 function fetch_timeout_setting_value ($setting, $defaulted, $params) {
325 print number_format(intval($setting)) . " " . (($setting==1) ? "second" : "seconds");
326 }
327
328 function fetch_settings_box ($page, $box = NULL) {
329 $this->setting_radio_control(
330 'fetch timeout', 'fetch_timeout',
331 array(&$this, 'fetch_timeout_setting'),
332 array(
333 'global-setting-default' => FEEDWORDPRESS_FETCH_TIMEOUT_DEFAULT,
334 'input-name' => 'fetch_timeout',
335 'default-input-name' => 'fetch_timeout_default',
336 'labels' => array(&$this, 'fetch_timeout_setting_value'),
337 )
338 );
339 } /* FeedWordPressFeedsPage::fetch_settings_box () */
340
341 function feed_information_box ($page, $box = NULL) {
342 global $wpdb;
343 $link_rss_params = maybe_unserialize($page->setting('query parameters', ''));
344 if (!is_array($link_rss_params)) :
345 $link_rss_params = array();
346 endif;
347
348 if ($page->for_feed_settings()) :
349 $info['name'] = esc_html($page->link->link->link_name);
350 $info['description'] = esc_html($page->link->link->link_description);
351 $info['url'] = esc_html($page->link->link->link_url);
352 $rss_url = $page->link->link->link_rss;
353
354 $hardcode['name'] = $page->link->hardcode('name');
355 $hardcode['description'] = $page->link->hardcode('description');
356 $hardcode['url'] = $page->link->hardcode('url');
357 else :
358 $cat_id = FeedWordPress::link_category_id();
359
360 $params = array();
361 if (FeedWordPressCompatibility::test_version(FWP_SCHEMA_USES_ARGS_TAXONOMY)) :
362 $params['taxonomy'] = 'link_category';
363 else :
364 $params['type'] = 'link';
365 endif;
366 $params['hide_empty'] = false;
367 $results = get_categories($params);
368
369 // Guarantee that the Contributors category will be in the drop-down chooser, even if it is empty.
370 $found_link_category_id = false;
371 foreach ($results as $row) :
372 // Normalize case
373 if (!isset($row->cat_id)) : $row->cat_id = $row->cat_ID; endif;
374
375 if ($row->cat_id == $cat_id) : $found_link_category_id = true; endif;
376 endforeach;
377
378 if (!$found_link_category_id) :
379 $results[] = get_category($cat_id);
380 endif;
381
382 $info = array();
383 $rss_url = null;
384
385 $hardcode['name'] = get_option('feedwordpress_hardcode_name');
386 $hardcode['description'] = get_option('feedwordpress_hardcode_description');
387 $hardcode['url'] = get_option('feedwordpress_hardcode_url');
388 endif;
389
390 // Hey ho, let's go
391 ?>
392 <table class="edit-form">
393
394 <?php if ($page->for_feed_settings()) : ?>
395
396 <tr>
397 <th scope="row"><?php _e('Feed URL:') ?></th>
398 <td><a href="<?php echo esc_html($rss_url); ?>"><?php echo esc_html($rss_url); ?></a>
399 (<a href="<?php echo FEEDVALIDATOR_URI; ?>?url=<?php echo urlencode($rss_url); ?>"
400 title="Check feed &lt;<?php echo esc_html($rss_url); ?>&gt; for validity">validate</a>)
401 <input type="submit" name="feedfinder" value="switch &rarr;" style="font-size:smaller" />
402
403 <table id="link-rss-params">
404 <tbody>
405 <?php
406 $link_rss_params['new'] = array('', '');
407 $i = 0;
408 foreach ($link_rss_params as $index => $pair) :
409 ?>
410 <tr class="link-rss-params-row" id="link-rss-params-<?php print $index; ?>">
411 <td><label>Parameter: <input type="text" class="link_params_key"
412 name="link_rss_params_key[<?php print $index; ?>]" value="<?php print esc_html($pair[0]); ?>"
413 size="5" style="width: 5em" placeholder="name" /></label></td>
414 <td class="link-rss-params-value-cell"><label class="link_params_value_label">= <input type="text" class="link_params_value"
415 name="link_rss_params_value[<?php print $index; ?>]" value="<?php print esc_html($pair[1]); ?>"
416 size="8" placeholder="value" /></label></td>
417 </tr>
418 <?php
419 $i++;
420 endforeach;
421 ?>
422 </tbody>
423 </table>
424
425 <div><input type="hidden" id="link-rss-params-num" name="link_rss_params_num" value="<?php print $i; ?>" /></div>
426
427 <script type="text/javascript">
428 function linkParamsRowRemove (element) {
429 jQuery(element).closest('tr').fadeOut('slow', function () {
430 jQuery(this).remove();
431 } );
432 }
433
434 jQuery('<td><a href="#" class="add-remove link-rss-params-remove"><span class="x">(X)</span> Remove</a></td>').insertAfter('.link-rss-params-value-cell');
435
436 jQuery('#link-rss-params-new').hide();
437 jQuery('<a class="add-remove" id="link-rss-params-add" href="#">+ Add a query parameter</a>').insertAfter('#link-rss-params');
438 jQuery('#link-rss-params-add').click( function () {
439 var next = jQuery('#link-rss-params-num').val();
440 var newRow = jQuery('#link-rss-params-new').clone().attr('id', 'link-rss-params-'+next);
441 newRow.find('.link_params_key').attr('name', 'link_rss_params_key['+next+']');
442 newRow.find('.link_params_value').attr('name', 'link_rss_params_value['+next+']');
443
444 newRow.find('.link-rss-params-remove').click( function () {
445 linkParamsRowRemove(this);
446 return false;
447 } );
448
449 newRow.appendTo('#link-rss-params');
450 newRow.show();
451
452 // Update counter for next row.
453 next++;
454 jQuery('#link-rss-params-num').val(next);
455
456 return false;
457 } );
458 jQuery('.link-rss-params-remove').click( function () {
459 linkParamsRowRemove(this);
460 return false;
461 } );
462 </script>
463 </td>
464 </tr>
465
466 <?php
467 $rows = array(
468 "name" => __('Link Name'),
469 "description" => __('Short Description'),
470 "url" => __('Homepage'),
471 );
472 foreach ($rows as $what => $label) :
473 ?>
474 <tr>
475 <th scope="row"><?php print $label ?></th>
476 <td>
477 <div id="basics-<?php print $what; ?>-edit"><input type="text" name="link<?php print $what; ?>"
478 value="<?php echo $info[$what]; ?>" style="width: 95%" /></div>
479 <div id="basics-<?php print $what; ?>-view">
480 <?php if ($what=='url') : ?><a href="<?php print $info[$what]; ?>"><?php else : ?><strong><?php endif; ?>
481 <?php print (strlen(trim($info[$what])) > 0) ? $info[$what] : '(none provided)'; ?>
482 <?php if ($what=='url') : ?></a><?php else : ?></strong><?php endif; ?></div>
483
484 <div>
485 <label><input id="basics-hardcode-<?php print $what; ?>"
486 type="radio" name="hardcode_<?php print $what; ?>" value="no"
487 <?php echo (($hardcode[$what]=='yes')?'':' checked="checked"');?>
488 onchange="contextual_appearance('basics-hardcode-<?php print $what; ?>', 'basics-<?php print $what; ?>-view', 'basics-<?php print $what; ?>-edit', 'no', 'block', /*checkbox=*/ true)"
489 /> Update automatically from feed</label>
490 <label><input type="radio" name="hardcode_<?php print $what; ?>" value="yes"
491 <?php echo (($hardcode[$what]!='yes')?'':' checked="checked"');?>
492 onchange="contextual_appearance('basics-hardcode-<?php print $what; ?>', 'basics-<?php print $what; ?>-view', 'basics-<?php print $what; ?>-edit', 'no', 'block', /*checkbox=*/ true)"
493 /> Edit manually</label>
494 </div>
495 </td>
496 </tr>
497 <?php
498 endforeach;
499 ?>
500
501 <?php else : ?>
502
503 <tr>
504 <th scope="row">Syndicated Link category:</th>
505 <td><p><select name="syndication_category" size="1">
506 <?php
507 foreach ($results as $row) :
508 // Normalize case
509 if (!isset($row->cat_id)) : $row->cat_id = $row->cat_ID; endif;
510
511 echo "\n\t<option value=\"$row->cat_id\"";
512 if ($row->cat_id == $cat_id) :
513 echo " selected='selected'";
514 endif;
515 echo ">$row->cat_id: ".esc_html($row->cat_name);
516 echo "</option>\n";
517 endforeach;
518 ?></select></p>
519 <p class="setting-description">FeedWordPress will syndicate the
520 links placed under this link category.</p>
521 </td>
522 </tr>
523
524 <tr>
525 <th scope="row">Link Names:</th>
526 <td><label><input type="checkbox" name="hardcode_name" value="no"<?php echo (($hardcode['name']=='yes')?'':' checked="checked"');?>/> Update contributor titles automatically when the feed title changes</label></td>
527 </tr>
528
529 <tr>
530 <th scope="row">Short descriptions:</th>
531 <td><label><input type="checkbox" name="hardcode_description" value="no"<?php echo (($hardcode['description']=='yes')?'':' checked="checked"');?>/> Update contributor descriptions automatically when the feed tagline changes</label></td>
532 </tr>
533
534 <tr>
535 <th scope="row">Homepages:</th>
536 <td><label><input type="checkbox" name="hardcode_url" value="no"<?php echo (($hardcode['url']=='yes')?'':' checked="checked"');?>/> Update contributor homepages automatically when the feed link changes</label></td>
537 </tr>
538
539 <?php endif; ?>
540
541 </table>
542 <?php
543 } /* FeedWordPressFeedsPage::feed_information_box() */
544
545 function custom_settings_box ($page, $box = NULL) {
546 ?>
547 <p class="setting-description">These custom settings are special fields for the <strong>feed</strong> you are
548 syndicating, to be retrieved in templates using the <code>get_feed_meta()</code> function. They do not create
549 custom fields on syndicated <strong>posts</strong>. If you want to create custom fields that are applied to each
550 individual post from this feed, set up the settings in <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/posts-page.php&amp;link_id=<?php print $page->link->id; ?>">Syndicated Posts</a>.</p>
551
552 <div id="postcustomstuff">
553 <table id="meta-list" cellpadding="3">
554 <tr>
555 <th>Key</th>
556 <th>Value</th>
557 <th>Action</th>
558 </tr>
559
560 <?php
561 $i = 0;
562 foreach ($page->link->settings as $key => $value) :
563 if (!preg_match("\007^((".implode(')|(', $page->special_settings)."))$\007i", $key)) :
564 ?>
565 <tr style="vertical-align:top">
566 <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo esc_html($key); ?>" />
567 <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo esc_html($key); ?>" /></th>
568 <td width="60%"><textarea rows="2" cols="40" id="notes-<?php echo $i; ?>-value" name="notes[<?php echo $i; ?>][value]"><?php echo esc_html($value); ?></textarea></td>
569 <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
570 <option value="update">save changes</option>
571 <option value="delete">delete this setting</option>
572 </select></td>
573 </tr>
574 <?php
575 $i++;
576 endif;
577 endforeach;
578 ?>
579 <tr>
580 <th scope="row"><input type="text" size="10" name="notes[<?php echo $i; ?>][key1]" value="" /></th>
581 <td><textarea name="notes[<?php echo $i; ?>][value]" rows="2" cols="40"></textarea></td>
582 <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo $i; ?>][action]" value="update" /></td>
583 </tr>
584 </table>
585 </div> <!-- id="postcustomstuff" -->
586 <?php
587 }
588
589 function display_feedfinder () {
590 global $wpdb;
591
592 $lookup = (isset($_REQUEST['lookup']) ? $_REQUEST['lookup'] : NULL);
593
594 $feeds = array(); $feedSwitch = false; $current = null;
595 if ($this->for_feed_settings()) : // Existing feed?
596 $feedSwitch = true;
597 if (is_null($lookup)) :
598 // Switch Feed without a specific feed yet suggested
599 // Go to the human-readable homepage to look for
600 // auto-detection links
601 $lookup = $this->link->link->link_url;
602
603 // Guarantee that you at least have the option to
604 // stick with what works.
605 $current = $this->link->link->link_rss;
606 $feeds[] = $current;
607 endif;
608 $name = esc_html($this->link->link->link_name);
609 else: // Or a new subscription to add?
610 $name = "Subscribe to <code>".esc_html(feedwordpress_display_url($lookup))."</code>";
611 endif;
612 ?>
613 <div class="wrap" id="feed-finder">
614 <h2>Feed Finder: <?php echo $name; ?></h2>
615
616 <?php
617 if ($feedSwitch) :
618 $this->display_alt_feed_box($lookup);
619 endif;
620
621 $finder = array();
622 if (!is_null($current)) :
623 $finder[$current] = new FeedFinder($current);
624 endif;
625 $finder[$lookup] = new FeedFinder($lookup);
626
627 foreach ($finder as $url => $ff) :
628 $feeds = array_merge($feeds, $ff->find());
629 endforeach;
630
631 $feeds = array_values( // Renumber from 0..(N-1)
632 array_unique( // Eliminate duplicates
633 $feeds
634 )
635 );
636
637 if (count($feeds) > 0):
638 if ($feedSwitch) :
639 ?>
640 <h3>Feeds Found</h3>
641 <?php
642 endif;
643
644 if (count($feeds) > 1) :
645 $option_template = 'Option %d: ';
646 $form_class = ' class="multi"';
647 ?>
648 <p><strong>This web page provides at least <?php print count($feeds); ?> different feeds.</strong> These feeds may provide the same information
649 in different formats, or may track different items. (You can check the Feed Information and the
650 Sample Item for each feed to get an idea of what the feed provides.) Please select the feed that you'd like to subscribe to.</p>
651 <?php
652 else :
653 $option_template = '';
654 $form_class = '';
655 endif;
656
657 foreach ($feeds as $key => $f):
658 $pie = FeedWordPress::fetch($f);
659 $rss = (is_wp_error($pie) ? $pie : new MagpieFromSimplePie($pie));
660
661 if ($rss and !is_wp_error($rss)):
662 $feed_link = (isset($rss->channel['link'])?$rss->channel['link']:'');
663 $feed_title = (isset($rss->channel['title'])?$rss->channel['title']:$feed_link);
664 $feed_type = ($rss->feed_type ? $rss->feed_type : 'Unknown');
665 $feed_version_template = '%.1f';
666 $feed_version = $rss->feed_version;
667 else :
668 // Give us some sucky defaults
669 $feed_title = feedwordpress_display_url($lookup);
670 $feed_link = $lookup;
671 $feed_type = 'Unknown';
672 $feed_version_template = '';
673 $feed_version = '';
674 endif;
675 ?>
676 <form<?php print $form_class; ?> action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication.php" method="post">
677 <div class="inside"><?php FeedWordPressCompatibility::stamp_nonce('feedwordpress_switchfeed'); ?>
678
679 <?php
680 $classes = array('feed-found'); $currentFeed = '';
681 if (!is_null($current) and $current==$f) :
682 $classes[] = 'current';
683 $currentFeed = ' (currently subscribed)';
684 endif;
685 if ($key%2) :
686 $classes[] = 'alt';
687 endif;
688 ?>
689 <fieldset class="<?php print implode(" ", $classes); ?>">
690 <legend><?php printf($option_template, ($key+1)); print $feed_type." "; printf($feed_version_template, $feed_version); ?> feed<?php print $currentFeed; ?></legend>
691
692 <?php
693 $this->stamp_link_id();
694
695 // No feed specified = add new feed; we
696 // need to pass along a starting title
697 // and homepage URL for the new Link.
698 if (!$this->for_feed_settings()):
699 ?>
700 <input type="hidden" name="feed_title" value="<?php echo esc_html($feed_title); ?>" />
701 <input type="hidden" name="feed_link" value="<?php echo esc_html($feed_link); ?>" />
702 <?php
703 endif;
704 ?>
705
706 <input type="hidden" name="feed" value="<?php echo esc_html($f); ?>" />
707 <input type="hidden" name="action" value="switchfeed" />
708
709 <div>
710 <div class="feed-sample">
711 <?php
712 $link = NULL;
713 $post = NULL;
714 if (!is_wp_error($rss) and count($rss->items) > 0):
715 // Prepare to display Sample Item
716 $link = new MagpieMockLink(array('simplepie' => $pie, 'magpie' => $rss), $f);
717 $post = new SyndicatedPost(array('simplepie' => $rss->originals[0], 'magpie' => $rss->items[0]), $link);
718 ?>
719 <h3>Sample Item</h3>
720 <ul>
721 <li><strong>Title:</strong> <a href="<?php echo $post->post['meta']['syndication_permalink']; ?>"><?php echo $post->post['post_title']; ?></a></li>
722 <li><strong>Date:</strong> <?php print date('d-M-y g:i:s a', $post->published()); ?></li>
723 </ul>
724 <div class="entry">
725 <?php print $post->post['post_content']; ?>
726 </div>
727 <?php
728 do_action('feedwordpress_feed_finder_sample_item', $f, $post, $link);
729 else:
730 if (is_wp_error($rss)) :
731 print '<div class="feed-problem">';
732 print "<h3>Problem:</h3>\n";
733 print "<p>FeedWordPress encountered the following error
734 when trying to retrieve this feed:</p>";
735 print '<p style="margin: 1.0em 3.0em"><code>'.$rss->get_error_message().'</code></p>';
736 print "<p>If you think this is a temporary problem, you can still force FeedWordPress to add the subscription. FeedWordPress will not be able to find any syndicated posts until this problem is resolved.</p>";
737 print "</div>";
738 endif;
739 ?>
740 <h3>No Items</h3>
741 <p>FeedWordPress found no posts on this feed.</p>
742 <?php
743 endif;
744 ?>
745 </div>
746
747 <div>
748 <h3>Feed Information</h3>
749 <ul>
750 <li><strong>Homepage:</strong> <a href="<?php echo $feed_link; ?>"><?php echo is_null($feed_title)?'<em>Unknown</em>':$feed_title; ?></a></li>
751 <li><strong>Feed URL:</strong> <a title="<?php echo esc_html($f); ?>" href="<?php echo esc_html($f); ?>"><?php echo esc_html(feedwordpress_display_url($f, 40, 10)); ?></a> (<a title="Check feed &lt;<?php echo esc_html($f); ?>&gt; for validity" href="http://feedvalidator.org/check.cgi?url=<?php echo urlencode($f); ?>">validate</a>)</li>
752 <li><strong>Encoding:</strong> <?php echo isset($rss->encoding)?esc_html($rss->encoding):"<em>Unknown</em>"; ?></li>
753 <li><strong>Description:</strong> <?php echo isset($rss->channel['description'])?esc_html($rss->channel['description']):"<em>Unknown</em>"; ?></li>
754 </ul>
755 <?php do_action('feedwordpress_feedfinder_form', $f, $post, $link, $this->for_feed_settings()); ?>
756 <div class="submit"><input type="submit" class="button-primary" name="Use" value="&laquo; Use this feed" />
757 <input type="submit" class="button" name="Cancel" value="× Cancel" /></div>
758 </div>
759 </div>
760 </fieldset>
761 </div> <!-- class="inside" -->
762 </form>
763 <?php
764 unset($link);
765 unset($post);
766 endforeach;
767 else:
768 foreach ($finder as $url => $ff) :
769 $url = esc_html($url);
770 print "<h3>Searched for feeds at ${url}</h3>\n";
771 print "<p><strong>".__('Error').":</strong> ".__("FeedWordPress couldn't find any feeds at").' <code><a href="'.htmlspecialchars($lookup).'">'.htmlspecialchars($lookup).'</a></code>';
772 print ". ".__('Try another URL').".</p>";
773
774 // Diagnostics
775 print "<div class=\"updated\" style=\"margin-left: 3.0em; margin-right: 3.0em;\">\n";
776 print "<h3>".__('Diagnostic information')."</h3>\n";
777 if (!is_null($ff->error()) and strlen($ff->error()) > 0) :
778 print "<h4>".__('HTTP request failure')."</h4>\n";
779 print "<p>".$ff->error()."</p>\n";
780 else :
781 print "<h4>".__('HTTP request completed')."</h4>\n";
782 print "<p><strong>Status ".$ff->status().":</strong> ".$this->HTTPStatusMessages[(int) $ff->status()]."</p>\n";
783 endif;
784
785 // Do some more diagnostics if the API for it is available.
786 if (function_exists('_wp_http_get_object')) :
787 $httpObject = _wp_http_get_object();
788 $transports = $httpObject->_getTransport();
789
790 print "<h4>".__('HTTP Transports available').":</h4>\n";
791 print "<ol>\n";
792 print "<li>".implode("</li>\n<li>", array_map('get_class', $transports))."</li>\n";
793 print "</ol>\n";
794 print "</div>\n";
795 endif;
796 endforeach;
797 endif;
798
799 if (!$feedSwitch) :
800 $this->display_alt_feed_box($lookup, /*alt=*/ true);
801 endif;
802 ?>
803 </div> <!-- class="wrap" -->
804 <?php
805 return false; // Don't continue
806 } /* FeedWordPressFeedsPage::display_feedfinder() */
807
808 function display_alt_feed_box ($lookup, $alt = false) {
809 global $fwp_post;
810 ?>
811 <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
812 <div class="inside"><?php
813 FeedWordPressCompatibility::stamp_nonce($this->dispatch);
814 ?>
815 <fieldset class="alt"
816 <?php if (!$alt): ?>style="margin: 1.0em 3.0em; font-size: smaller;"<?php endif; ?>>
817 <legend><?php if ($alt) : ?>Alternative feeds<?php else: ?>Find feeds<?php endif; ?></legend>
818 <?php if ($alt) : ?><h3>Use a different feed</h3><?php endif; ?>
819 <div><label>Address:
820 <input type="text" name="lookup" id="use-another-feed"
821 placeholder="URL"
822 <?php if (is_null($lookup)) : ?>
823 value="URL"
824 <?php else : ?>
825 value="<?php print esc_html($lookup); ?>"
826 <?php endif; ?>
827 size="64" style="max-width: 80%" /></label>
828 <?php if (is_null($lookup)) : ?>
829 <?php FeedWordPressSettingsUI::magic_input_tip_js('use-another-feed'); ?>
830 <?php endif; ?>
831 <?php $this->stamp_link_id('link_id'); ?>
832 <input type="hidden" name="action" value="feedfinder" />
833 <input type="submit" class="button<?php if ($alt): ?>-primary<?php endif; ?>" value="Check &raquo;" /></div>
834 <p>This can be the address of a feed, or of a website. FeedWordPress
835 will try to automatically detect any feeds associated with a
836 website.</p>
837 </div> <!-- class="inside" -->
838 </fieldset></form>
839
840 <?php
841 } /* FeedWordPressFeedsPage::display_alt_feed_box() */
842
843 function save_settings ($post) {
844 if ($this->for_feed_settings()) :
845 if (isset($post['link_rss_params_key'])) :
846 $qp = array();
847 foreach ($post['link_rss_params_key'] as $index => $key) :
848 if (strlen($key) > 0) :
849 if (isset($post['link_rss_params_value'][$index])
850 and strlen($post['link_rss_params_value'][$index])) :
851 $value = $post['link_rss_params_value'][$index];
852 $qp[] = array($key, $value);
853 endif;
854 endif;
855 endforeach;
856 $this->update_setting('query parameters', serialize($qp));
857 endif;
858
859 // custom feed settings first
860 foreach ($post['notes'] as $mn) :
861 $mn['key0'] = (isset($mn['key0']) ? trim($mn['key0']) : NULL);
862 $mn['key1'] = trim($mn['key1']);
863 if (preg_match("\007^(("
864 .implode(')|(',$this->special_settings)
865 ."))$\007i",
866 $mn['key1'])) :
867 $mn['key1'] = 'user/'.$mn['key1'];
868 endif;
869
870 if (strlen($mn['key0']) > 0) :
871 unset($this->link->settings[$mn['key0']]); // out with the old
872 endif;
873
874 if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
875 $this->link->settings[$mn['key1']] = $mn['value']; // in with the new
876 endif;
877 endforeach;
878
879 // now stuff through the web form
880 // hardcoded feed info
881
882 foreach (array('name', 'description', 'url') as $what) :
883 // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
884 $this->link->settings["hardcode {$what}"] = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
885 if (FeedWordPress::affirmative($this->link->settings, "hardcode {$what}")) :
886 $this->link->link->{'link_'.$what} = $post['link'.$what];
887 endif;
888 endforeach;
889
890 // Update scheduling
891 if (isset($post['update_schedule'])) :
892 $this->link->settings['update/hold'] = $post['update_schedule'];
893 endif;
894
895 if (isset($post['use_default_update_window']) and strtolower($post['use_default_update_window'])=='yes') :
896 unset($this->link->settings['update/window']);
897 elseif (isset($post['update_window'])):
898 if ((int) $post['update_window'] > 0) :
899 $this->link->settings['update/window'] = (int) $post['update_window'];
900 endif;
901 endif;
902
903 else :
904 // Global
905 update_option('feedwordpress_cat_id', $post['syndication_category']);
906
907 if (!isset($post['automatic_updates']) or !in_array($post['automatic_updates'], array('init', 'shutdown'))) :
908 $automatic_updates = false;
909 else :
910 $automatic_updates = $post['automatic_updates'];
911 endif;
912 update_option('feedwordpress_automatic_updates', $automatic_updates);
913
914 if (isset($post['update_window'])):
915 if ((int) $post['update_window'] > 0) :
916 update_option('feedwordpress_update_window', (int) $post['update_window']);
917 endif;
918 endif;
919
920 update_option('feedwordpress_update_time_limit', ($post['update_time_limit']=='yes')?(int) $post['time_limit_seconds']:0);
921
922 foreach (array('name', 'description', 'url') as $what) :
923 // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
924 $hardcode = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
925 update_option("feedwordpress_hardcode_{$what}", $hardcode);
926 endforeach;
927
928 endif;
929
930 if (isset($post['fetch_timeout'])) :
931 if (isset($post['fetch_timeout_default']) and $post['fetch_timeout_default']=='yes') :
932 $timeout = NULL;
933 else :
934 $timeout = $post['fetch_timeout'];
935 endif;
936
937 if (is_int($timeout)) :
938 $timeout = intval($timeout);
939 endif;
940 $this->update_setting('fetch timeout', $timeout);
941 endif;
942
943 $this->updatedPosts->accept_POST($post);
944 parent::save_settings($post);
945 } /* FeedWordPressFeedsPage::save_settings() */
946
947 } /* class FeedWordPressFeedsPage */
948
949 $feedsPage = new FeedWordPressFeedsPage;
950 $feedsPage->display();
951
952