PluginProbe
FeedWordPress / 2011.1019
FeedWordPress v2011.1019
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.1019, at feeds-page.php

1,209 lines 44.0 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 global $feedwordpress;
179 $automatic_updates = $feedwordpress->automatic_update_hook(array('setting only' => true));
180 $update_time_limit = (int) get_option('feedwordpress_update_time_limit');
181
182 // Hey, ho, let's go...
183 ?>
184
185 <table class="edit-form">
186 <?php if ($page->for_default_settings()) : ?>
187
188 <tr>
189 <th scope="row">Updates:</th>
190 <td><select id="automatic-updates-selector" name="automatic_updates" size="1" onchange="contextual_appearance('automatic-updates-selector', 'cron-job-explanation', null, 'no');">
191 <option value="shutdown"<?php echo ($automatic_updates=='shutdown')?' selected="selected"':''; ?>>automatically check for updates after pages load</option>
192 <option value="init"<?php echo ($automatic_updates=='init')?' selected="selected"':''; ?>>automatically check for updates before pages load</option>
193 <option value="no"<?php echo (!$automatic_updates)?' selected="selected"':''; ?>>cron job or manual updates</option>
194 </select>
195 <div id="cron-job-explanation" class="setting-description">
196 <p><?php
197 $path = `which curl`; $opts = '--silent %s';
198 if (is_null($path) or strlen(trim($path))==0) :
199 $path = `which wget`; $opts = '-q -O - %s';
200 if (is_null($path) or strlen(trim($path))==0) :
201 $path = '/usr/bin/curl'; $opts = '--silent %s';
202 endif;
203 endif;
204 $path = preg_replace('/\n+$/', '', $path);
205 $crontab = `crontab -l`;
206
207 $cmdline = $path . ' ' . sprintf($opts, get_bloginfo('url').'?update_feedwordpress=1');
208
209 ?>If you want to use a cron job,
210 you can perform scheduled updates by sending regularly-scheduled
211 requests to <a href="<?php bloginfo('url'); ?>?update_feedwordpress=1"><code><?php bloginfo('url') ?>?update_feedwordpress=1</code></a>
212 For example, inserting the following line in your crontab:</p>
213 <pre style="font-size: 0.80em"><code>*/10 * * * * <?php print esc_html($cmdline); ?></code></pre>
214 <p class="setting-description">will check in every 10 minutes
215 and check for updates on any feeds that are ready to be polled for updates.</p>
216 </div>
217 </td>
218 </tr>
219
220 <?php else : /* Feed-specific settings */ ?>
221
222 <tr>
223 <th scope="row"><?php _e('Last update') ?>:</th>
224 <td><?php
225 if (isset($page->link->settings['update/last'])) :
226 echo fwp_time_elapsed($page->link->settings['update/last'])." ";
227 else :
228 echo " none yet";
229 endif;
230 ?></td></tr>
231
232 <tr><th><?php _e('Next update') ?>:</th>
233 <td><?php
234 $holdem = (isset($page->link->settings['update/hold']) ? $page->link->settings['update/hold'] : 'scheduled');
235 ?>
236 <select name="update_schedule">
237 <option value="scheduled"<?php echo ($holdem=='scheduled')?' selected="selected"':''; ?>>update on schedule <?php
238 echo " (";
239 if (isset($page->link->settings['update/ttl']) and is_numeric($page->link->settings['update/ttl'])) :
240 if (isset($page->link->settings['update/timed']) and $page->link->settings['update/timed']=='automatically') :
241 echo 'next: ';
242 $next = $page->link->settings['update/last'] + ((int) $page->link->settings['update/ttl'] * 60);
243 if (strftime('%x', time()) != strftime('%x', $next)) :
244 echo strftime('%x', $next)." ";
245 endif;
246 echo strftime('%X', $page->link->settings['update/last']+((int) $page->link->settings['update/ttl']*60));
247 else :
248 echo "every ".$page->link->settings['update/ttl']." minute".(($page->link->settings['update/ttl']!=1)?"s":"");
249 endif;
250 else:
251 echo "next scheduled update";
252 endif;
253 echo ")";
254 ?></option>
255 <option value="next"<?php echo ($holdem=='next')?' selected="selected"':''; ?>>update ASAP</option>
256 <option value="ping"<?php echo ($holdem=='ping')?' selected="selected"':''; ?>>update only when pinged</option>
257 </select></td></tr>
258
259 <?php endif; ?>
260
261 <tr>
262 <th scope="row"><?php print __('Update scheduling:') ?></th>
263 <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>
264 <?php
265
266 $this->setting_radio_control(
267 'update/window', 'update_window',
268 array(&$this, 'update_window_edit_box'),
269 array(
270 'global-setting-default' => DEFAULT_UPDATE_PERIOD,
271 'default-input-name' => 'use_default_update_window',
272 'default-input-id' => 'use-default-update-window-yes',
273 'default-input-id-no' => 'use-default-update-window-no',
274 'labels' => array(&$this, 'update_window_currently'),
275 )
276 );
277 ?></td>
278 </tr>
279
280 <tr>
281 <th scope="row"><?php print __('Minimum Interval:'); ?></th>
282 <td><p style="margin-top:0px">Some feeds include standard elements that
283 request a specific update schedule. If the interval requested by the
284 feed provider is <em>longer</em> than FeedWordPress's normal scheduling,
285 FeedWordPress will always respect their request to slow down. But what
286 should it do if the update interval is <em>shorter</em> than the schedule set above?</p>
287 <?php
288 $this->setting_radio_control(
289 'update/minimum', 'update_minimum',
290 /*options=*/ array(
291 'no' => 'Speed up and accept the interval from the feed provider',
292 'yes' => 'Keep pace and use the longer scheduling from FeedWordPress',
293 ),
294 /*params=*/ array(
295 'setting-default' => NULL,
296 'global-setting-default' => 'no',
297 'default-input-value' => 'default',
298 )
299 );
300 ?>
301 </td>
302 </tr>
303
304 <?php if ($this->for_default_settings()) : ?>
305
306 <tr>
307 <th scope="row"><?php print __('Time limit on updates'); ?>:</th>
308 <td><select id="time-limit" name="update_time_limit" size="1" onchange="contextual_appearance('time-limit', 'time-limit-box', null, 'yes');">
309 <option value="no"<?php echo ($update_time_limit>0)?'':' selected="selected"'; ?>>no time limit on updates</option>
310 <option value="yes"<?php echo ($update_time_limit>0)?' selected="selected"':''; ?>>limit updates to no more than...</option>
311 </select>
312 <span id="time-limit-box"><label><input type="text" name="time_limit_seconds" value="<?php print $update_time_limit; ?>" size="5" /> seconds</label></span>
313 </tr>
314
315 <?php endif; ?>
316
317 </table>
318
319 <?php
320 } /* FeedWordPressFeedsPage::global_feeds_box() */
321
322 function update_window_edit_box ($updateWindow, $defaulted, $params) {
323 if (!is_numeric($updateWindow)) :
324 $updateWindow = DEFAULT_UPDATE_PERIOD;
325 endif;
326 ?>
327 <p>Wait <input type="text" name="update_window" value="<?php print $updateWindow; ?>" size="4" /> minutes between polling.</p>
328 <div class="setting-description" id="update-scheduling-note">
329 <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>
330 <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>
331 </div>
332 <?php
333 } /* FeedWordPressFeedsPage::update_window_edit_box () */
334
335 function update_window_currently ($updateWindow, $defaulted, $params) {
336 $updateWindow = (int) $updateWindow;
337 if (1==$updateWindow) :
338 $caption = 'wait %d minute between polling';
339 else :
340 $caption = 'wait %d minutes between polling';
341 endif;
342 return sprintf(__($caption), $updateWindow);
343 } /* FeedWordPressFeedsPage::update_window_currently () */
344
345 function fetch_timeout_setting ($setting, $defaulted, $params) {
346 $timeout = intval($this->setting('fetch timeout', FEEDWORDPRESS_FETCH_TIMEOUT_DEFAULT));
347
348 if ($this->for_feed_settings()) :
349 $article = 'this';
350 else :
351 $article = 'a';
352 endif;
353 ?>
354 <p>Wait no more than
355 than <input name="fetch_timeout" type="number" min="0" size="3" value="<?php print $timeout; ?>" />
356 second(s) when trying to fetch <?php print $article; ?> feed to check for updates.</p>
357 <p>If <?php print $article; ?> source's web server does not respond before time runs
358 out, FeedWordPress will skip over the source and try again during
359 the next update cycle.</p>
360 <?php
361 }
362 function fetch_timeout_setting_value ($setting, $defaulted, $params) {
363 print number_format(intval($setting)) . " " . (($setting==1) ? "second" : "seconds");
364 }
365
366 function fetch_settings_box ($page, $box = NULL) {
367 $this->setting_radio_control(
368 'fetch timeout', 'fetch_timeout',
369 array(&$this, 'fetch_timeout_setting'),
370 array(
371 'global-setting-default' => FEEDWORDPRESS_FETCH_TIMEOUT_DEFAULT,
372 'input-name' => 'fetch_timeout',
373 'default-input-name' => 'fetch_timeout_default',
374 'labels' => array(&$this, 'fetch_timeout_setting_value'),
375 )
376 );
377 } /* FeedWordPressFeedsPage::fetch_settings_box () */
378
379 function display_authentication_credentials_box ($params = array()) {
380 static $count = 0;
381
382 $params = wp_parse_args($params, array(
383 'username' => NULL,
384 'password' => NULL,
385 'method' => '-',
386 ));
387
388 // Equivalents
389 if (is_null($params['method'])) : $params['method'] = '-'; endif;
390
391 $count++;
392 $slug = ($count > 1 ? '-'.$count : '');
393
394 global $feedwordpress;
395 $authMethods = apply_filters(
396 'feedwordpress_http_auth_methods',
397 $feedwordpress->httpauth->methods_available()
398 );
399
400 if (count($authMethods) > 1) : /* More than '-' */
401 ?>
402 <div class="link-rss-authentication" id="link-rss-authentication<?php print $slug; ?>">
403 <table>
404 <tbody>
405 <tr class="link-rss-authentication-credentials" id="link-rss-authentication-credentials<?php print $slug; ?>">
406 <td><label>user: <input type="text" name="link_rss_username"
407 value="<?php print esc_attr($params['username']); ?>" size="16"
408 placeholder="username to access this feed" /></label></td>
409 <td><label>pass: <input type="text" name="link_rss_password"
410 value="<?php print esc_attr($params['password']); ?>" size="16"
411 placeholder="password to access this feed" /></label></td>
412 <td class="link-rss-authentication-method" id="link-rss-authentication-method<?php print $slug; ?>"><label>method: <select class="link-rss-auth-method" id="link-rss-auth-method" name="link_rss_auth_method" size="1">
413 <?php foreach ($authMethods as $value => $label) : ?>
414 <option value="<?php print esc_attr($value); ?>"<?php
415 if ($value == $params['method']) : ?> selected="selected"<?php
416 endif; ?>><?php print esc_html($label); ?></option>
417 <?php endforeach; ?>
418 </select></label></td>
419 </tr>
420 </tbody>
421 </table>
422 </div>
423
424 <script type="text/javascript">
425 jQuery('<td><a class="add-remove remove-it" id="link-rss-userpass-remove<?php print $slug; ?>" href="#"><span class="x">(X)</span> Remove</a></td>')
426 .appendTo('#link-rss-authentication-credentials<?php print $slug; ?>')
427 .click( feedAuthenticationMethodUnPress );
428 jQuery('#link-rss-auth-method<?php print $slug; ?>').change( feedAuthenticationMethod );
429 feedAuthenticationMethod({
430 init: true,
431 node: jQuery('#link-rss-authentication<?php print $slug; ?>') });
432 </script>
433
434 <?php
435 endif;
436 }
437
438 function feed_information_box ($page, $box = NULL) {
439 global $wpdb;
440 $link_rss_params = maybe_unserialize($page->setting('query parameters', ''));
441 if (!is_array($link_rss_params)) :
442 $link_rss_params = array();
443 endif;
444
445 if ($page->for_feed_settings()) :
446 $info['name'] = esc_html($page->link->link->link_name);
447 $info['description'] = esc_html($page->link->link->link_description);
448 $info['url'] = esc_html($page->link->link->link_url);
449 $rss_url = $page->link->link->link_rss;
450
451 $hardcode['name'] = $page->link->hardcode('name');
452 $hardcode['description'] = $page->link->hardcode('description');
453 $hardcode['url'] = $page->link->hardcode('url');
454 else :
455 $cat_id = FeedWordPress::link_category_id();
456
457 $params = array();
458 if (FeedWordPressCompatibility::test_version(FWP_SCHEMA_USES_ARGS_TAXONOMY)) :
459 $params['taxonomy'] = 'link_category';
460 else :
461 $params['type'] = 'link';
462 endif;
463 $params['hide_empty'] = false;
464 $results = get_categories($params);
465
466 // Guarantee that the Contributors category will be in the drop-down chooser, even if it is empty.
467 $found_link_category_id = false;
468 foreach ($results as $row) :
469 // Normalize case
470 if (!isset($row->cat_id)) : $row->cat_id = $row->cat_ID; endif;
471
472 if ($row->cat_id == $cat_id) : $found_link_category_id = true; endif;
473 endforeach;
474
475 if (!$found_link_category_id) :
476 $results[] = get_category($cat_id);
477 endif;
478
479 $info = array();
480 $rss_url = null;
481
482 $hardcode['name'] = get_option('feedwordpress_hardcode_name');
483 $hardcode['description'] = get_option('feedwordpress_hardcode_description');
484 $hardcode['url'] = get_option('feedwordpress_hardcode_url');
485 endif;
486
487 $hideAuth = false;
488
489 $username = $this->setting('http username', NULL);
490
491 if (is_null($username)) :
492 $username = '';
493 $hideAuth = true;
494 endif;
495
496 $password = $this->setting('http password', NULL);
497 if (is_null($password)) :
498 $password = '';
499 endif;
500
501 $auth = $this->setting('http auth method', NULL);
502
503 global $feedwordpress;
504
505 if (is_null($auth)) :
506 $auth = '-';
507 $hideAuth = true;
508 endif;
509
510 // Hey ho, let's go
511
512 ?>
513 <table class="edit-form">
514
515 <?php if ($page->for_feed_settings()) : ?>
516
517 <tr>
518 <th scope="row"><?php _e('Feed URL:') ?></th>
519 <td><a href="<?php echo esc_html($rss_url); ?>"><?php echo esc_html($rss_url); ?></a>
520 (<a href="<?php echo FEEDVALIDATOR_URI; ?>?url=<?php echo urlencode($rss_url); ?>"
521 title="Check feed &lt;<?php echo esc_html($rss_url); ?>&gt; for validity">validate</a>)
522 <input type="submit" name="feedfinder" value="switch &rarr;" style="font-size:smaller" />
523
524 <?php $this->display_authentication_credentials_box(array(
525 'username' => $username,
526 'password' => $password,
527 'method' => $auth,
528 )); ?>
529
530 <table id="link-rss-params">
531 <tbody>
532 <?php
533 $link_rss_params['new'] = array('', '');
534 $i = 0;
535 foreach ($link_rss_params as $index => $pair) :
536 ?>
537 <tr class="link-rss-params-row" id="link-rss-params-<?php print $index; ?>">
538 <td><label>Parameter: <input type="text" class="link_params_key"
539 name="link_rss_params_key[<?php print $index; ?>]" value="<?php print esc_html($pair[0]); ?>"
540 size="5" style="width: 5em" placeholder="name" /></label></td>
541 <td class="link-rss-params-value-cell"><label class="link_params_value_label">= <input type="text" class="link_params_value"
542 name="link_rss_params_value[<?php print $index; ?>]" value="<?php print esc_html($pair[1]); ?>"
543 size="8" placeholder="value" /></label></td>
544 </tr>
545 <?php
546 $i++;
547 endforeach;
548 ?>
549 </tbody>
550 </table>
551
552 <div><input type="hidden" id="link-rss-params-num" name="link_rss_params_num" value="<?php print $i; ?>" /></div>
553
554 <script type="text/javascript">
555 function linkParamsRowRemove (element) {
556 jQuery(element).closest('tr').fadeOut('slow', function () {
557 jQuery(this).remove();
558 } );
559 }
560
561 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');
562
563 jQuery('#link-rss-params-new').hide();
564 jQuery('<a class="add-remove" id="link-rss-params-add" href="#">+ Add a query parameter</a>').insertAfter('#link-rss-params');
565 jQuery('#link-rss-params-add').click( function () {
566 var next = jQuery('#link-rss-params-num').val();
567 var newRow = jQuery('#link-rss-params-new').clone().attr('id', 'link-rss-params-'+next);
568 newRow.find('.link_params_key').attr('name', 'link_rss_params_key['+next+']');
569 newRow.find('.link_params_value').attr('name', 'link_rss_params_value['+next+']');
570
571 newRow.find('.link-rss-params-remove').click( function () {
572 linkParamsRowRemove(this);
573 return false;
574 } );
575
576 newRow.appendTo('#link-rss-params');
577 newRow.show();
578
579 // Update counter for next row.
580 next++;
581 jQuery('#link-rss-params-num').val(next);
582
583 return false;
584 } );
585 jQuery('.link-rss-params-remove').click( function () {
586 linkParamsRowRemove(this);
587 return false;
588 } );
589 </script>
590 </td>
591 </tr>
592
593 <?php
594 $rows = array(
595 "name" => __('Link Name'),
596 "description" => __('Short Description'),
597 "url" => __('Homepage'),
598 );
599 foreach ($rows as $what => $label) :
600 ?>
601 <tr>
602 <th scope="row"><?php print $label ?></th>
603 <td>
604 <div id="basics-<?php print $what; ?>-edit"><input type="text" name="link<?php print $what; ?>"
605 value="<?php echo $info[$what]; ?>" style="width: 95%" /></div>
606 <div id="basics-<?php print $what; ?>-view">
607 <?php if ($what=='url') : ?><a href="<?php print $info[$what]; ?>"><?php else : ?><strong><?php endif; ?>
608 <?php print (strlen(trim($info[$what])) > 0) ? $info[$what] : '(none provided)'; ?>
609 <?php if ($what=='url') : ?></a><?php else : ?></strong><?php endif; ?></div>
610
611 <div>
612 <label><input id="basics-hardcode-<?php print $what; ?>"
613 type="radio" name="hardcode_<?php print $what; ?>" value="no"
614 <?php echo (($hardcode[$what]=='yes')?'':' checked="checked"');?>
615 onchange="contextual_appearance('basics-hardcode-<?php print $what; ?>', 'basics-<?php print $what; ?>-view', 'basics-<?php print $what; ?>-edit', 'no', 'block', /*checkbox=*/ true)"
616 /> Update automatically from feed</label>
617 <label><input type="radio" name="hardcode_<?php print $what; ?>" value="yes"
618 <?php echo (($hardcode[$what]!='yes')?'':' checked="checked"');?>
619 onchange="contextual_appearance('basics-hardcode-<?php print $what; ?>', 'basics-<?php print $what; ?>-view', 'basics-<?php print $what; ?>-edit', 'no', 'block', /*checkbox=*/ true)"
620 /> Edit manually</label>
621 </div>
622 </td>
623 </tr>
624 <?php
625 endforeach;
626 ?>
627
628 <?php else : ?>
629
630 <tr>
631 <th scope="row">Syndicated Link category:</th>
632 <td><p><select name="syndication_category" size="1">
633 <?php
634 foreach ($results as $row) :
635 // Normalize case
636 if (!isset($row->cat_id)) : $row->cat_id = $row->cat_ID; endif;
637
638 echo "\n\t<option value=\"$row->cat_id\"";
639 if ($row->cat_id == $cat_id) :
640 echo " selected='selected'";
641 endif;
642 echo ">$row->cat_id: ".esc_html($row->cat_name);
643 echo "</option>\n";
644 endforeach;
645 ?></select></p>
646 <p class="setting-description">FeedWordPress will syndicate the
647 links placed under this link category.</p>
648 </td>
649 </tr>
650
651 <tr>
652 <th scope="row">Link Names:</th>
653 <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>
654 </tr>
655
656 <tr>
657 <th scope="row">Short descriptions:</th>
658 <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>
659 </tr>
660
661 <tr>
662 <th scope="row">Homepages:</th>
663 <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>
664 </tr>
665
666 <?php endif; ?>
667
668 </table>
669 <?php
670 } /* FeedWordPressFeedsPage::feed_information_box() */
671
672 function custom_settings_box ($page, $box = NULL) {
673 ?>
674 <p class="setting-description">These custom settings are special fields for the <strong>feed</strong> you are
675 syndicating, to be retrieved in templates using the <code>get_feed_meta()</code> function. They do not create
676 custom fields on syndicated <strong>posts</strong>. If you want to create custom fields that are applied to each
677 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>
678
679 <div id="postcustomstuff">
680 <table id="meta-list" cellpadding="3">
681 <tr>
682 <th>Key</th>
683 <th>Value</th>
684 <th>Action</th>
685 </tr>
686
687 <?php
688 $i = 0;
689 foreach ($page->link->settings as $key => $value) :
690 if (!preg_match("\007^((".implode(')|(', $page->special_settings)."))$\007i", $key)) :
691 ?>
692 <tr style="vertical-align:top">
693 <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo esc_html($key); ?>" />
694 <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo esc_html($key); ?>" /></th>
695 <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>
696 <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
697 <option value="update">save changes</option>
698 <option value="delete">delete this setting</option>
699 </select></td>
700 </tr>
701 <?php
702 $i++;
703 endif;
704 endforeach;
705 ?>
706 <tr>
707 <th scope="row"><input type="text" size="10" name="notes[<?php echo $i; ?>][key1]" value="" /></th>
708 <td><textarea name="notes[<?php echo $i; ?>][value]" rows="2" cols="40"></textarea></td>
709 <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo $i; ?>][action]" value="update" /></td>
710 </tr>
711 </table>
712 </div> <!-- id="postcustomstuff" -->
713 <?php
714 }
715
716 function url_for_401 ($err) {
717 $ret = NULL;
718 if (is_wp_error($err)) :
719 if ($err->get_error_code()=='http_request_failed') :
720 $data = $err->get_error_data('http_request_failed');
721
722 if (is_array($data) and isset($data['status'])) :
723 if (401==$data['status']) :
724 $ret = $data['uri'];
725 endif;
726 endif;
727 endif;
728 endif;
729 return $ret;
730 }
731
732 function display_feedfinder () {
733 global $wpdb;
734
735 $lookup = (isset($_REQUEST['lookup']) ? $_REQUEST['lookup'] : NULL);
736
737 $auth = FeedWordPress::param('link_rss_auth_method');
738 $username = FeedWordPress::param('link_rss_username');
739 $password = FeedWordPress::param('link_rss_password');
740 $credentials = array(
741 "authentication" => $auth,
742 "username" => $username,
743 "password" => $password,
744 );
745
746 $feeds = array(); $feedSwitch = false; $current = null;
747 if ($this->for_feed_settings()) : // Existing feed?
748 $feedSwitch = true;
749 if (is_null($lookup)) :
750 // Switch Feed without a specific feed yet suggested
751 // Go to the human-readable homepage to look for
752 // auto-detection links
753
754 $lookup = $this->link->link->link_url;
755 $auth = $this->link->setting('http auth method');
756 $username = $this->link->setting('http username');
757 $password = $this->link->setting('http password');
758
759 // Guarantee that you at least have the option to
760 // stick with what works.
761 $current = $this->link->link->link_rss;
762 $feeds[] = $current;
763 endif;
764 $name = esc_html($this->link->link->link_name);
765 else: // Or a new subscription to add?
766 $name = "Subscribe to <code>".esc_html(feedwordpress_display_url($lookup))."</code>";
767 endif;
768 ?>
769 <div class="wrap" id="feed-finder">
770 <h2>Feed Finder: <?php echo $name; ?></h2>
771
772 <?php
773 if ($feedSwitch) :
774 $this->display_alt_feed_box($lookup);
775 endif;
776
777 $finder = array();
778 if (!is_null($current)) :
779 $finder[$current] = new FeedFinder($current);
780 endif;
781 $finder[$lookup] = new FeedFinder($lookup);
782
783 foreach ($finder as $url => $ff) :
784 $feeds = array_merge($feeds, $ff->find(
785 /*url=*/ NULL,
786 /*params=*/ $credentials));
787 endforeach;
788
789 $feeds = array_values( // Renumber from 0..(N-1)
790 $feeds
791 );
792
793 if (count($feeds) > 0):
794 if ($feedSwitch) :
795 ?>
796 <h3>Feeds Found</h3>
797 <?php
798 endif;
799
800 if (count($feeds) > 1) :
801 $option_template = 'Option %d: ';
802 $form_class = ' class="multi"';
803 ?>
804 <p><strong>This web page provides at least <?php print count($feeds); ?> different feeds.</strong> These feeds may provide the same information
805 in different formats, or may track different items. (You can check the Feed Information and the
806 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>
807 <?php
808 else :
809 $option_template = '';
810 $form_class = '';
811 endif;
812
813 global $fwp_credentials;
814
815 foreach ($feeds as $key => $f):
816 $ofc = $fwp_credentials;
817 $fwp_credentials = $credentials; // Set
818 $pie = FeedWordPress::fetch($f);
819 $fwp_credentials = $ofc; // Re-Set
820
821 $rss = (is_wp_error($pie) ? $pie : new MagpieFromSimplePie($pie));
822
823 if ($this->url_for_401($pie)) :
824 $this->display_alt_feed_box($lookup, array(
825 "err" => $pie,
826 "auth" => $auth,
827 "username" => $username,
828 "password" => $password
829 ));
830 continue;
831 endif;
832
833 if ($rss and !is_wp_error($rss)):
834 $feed_link = (isset($rss->channel['link'])?$rss->channel['link']:'');
835 $feed_title = (isset($rss->channel['title'])?$rss->channel['title']:$feed_link);
836 $feed_type = ($rss->feed_type ? $rss->feed_type : 'Unknown');
837 $feed_version_template = '%.1f';
838 $feed_version = $rss->feed_version;
839 else :
840 // Give us some sucky defaults
841 $feed_title = feedwordpress_display_url($lookup);
842 $feed_link = $lookup;
843 $feed_type = 'Unknown';
844 $feed_version_template = '';
845 $feed_version = '';
846 endif;
847 ?>
848 <form<?php print $form_class; ?> action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication.php" method="post">
849 <div class="inside"><?php FeedWordPressCompatibility::stamp_nonce('feedwordpress_switchfeed'); ?>
850
851 <?php
852 $classes = array('feed-found'); $currentFeed = '';
853 if (!is_null($current) and $current==$f) :
854 $classes[] = 'current';
855 $currentFeed = ' (currently subscribed)';
856 endif;
857 if ($key%2) :
858 $classes[] = 'alt';
859 endif;
860 ?>
861 <fieldset class="<?php print implode(" ", $classes); ?>">
862 <legend><?php printf($option_template, ($key+1)); print $feed_type." "; printf($feed_version_template, $feed_version); ?> feed<?php print $currentFeed; ?></legend>
863
864 <?php
865 $this->stamp_link_id();
866
867 // No feed specified = add new feed; we
868 // need to pass along a starting title
869 // and homepage URL for the new Link.
870 if (!$this->for_feed_settings()):
871 ?>
872 <input type="hidden" name="feed_title" value="<?php echo esc_html($feed_title); ?>" />
873 <input type="hidden" name="feed_link" value="<?php echo esc_html($feed_link); ?>" />
874 <?php
875 endif;
876 ?>
877
878 <input type="hidden" name="feed" value="<?php echo esc_html($f); ?>" />
879 <input type="hidden" name="action" value="switchfeed" />
880
881 <div>
882 <div class="feed-sample">
883 <?php
884 $link = NULL;
885 $post = NULL;
886 if (!is_wp_error($rss) and count($rss->items) > 0):
887 // Prepare to display Sample Item
888 $link = new MagpieMockLink(array('simplepie' => $pie, 'magpie' => $rss), $f);
889 $post = new SyndicatedPost(array('simplepie' => $rss->originals[0], 'magpie' => $rss->items[0]), $link);
890 ?>
891 <h3>Sample Item</h3>
892 <ul>
893 <li><strong>Title:</strong> <a href="<?php echo $post->post['meta']['syndication_permalink']; ?>"><?php echo $post->post['post_title']; ?></a></li>
894 <li><strong>Date:</strong> <?php print date('d-M-y g:i:s a', $post->published()); ?></li>
895 </ul>
896 <div class="entry">
897 <?php print $post->post['post_content']; ?>
898 </div>
899 <?php
900 do_action('feedwordpress_feed_finder_sample_item', $f, $post, $link);
901 else:
902 if (is_wp_error($rss)) :
903 print '<div class="feed-problem">';
904 print "<h3>Problem:</h3>\n";
905 print "<p>FeedWordPress encountered the following error
906 when trying to retrieve this feed:</p>";
907 print '<p style="margin: 1.0em 3.0em"><code>'.$rss->get_error_message().'</code></p>';
908 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>";
909 print "</div>";
910 endif;
911 ?>
912 <h3>No Items</h3>
913 <p>FeedWordPress found no posts on this feed.</p>
914 <?php
915 endif;
916 ?>
917 </div>
918
919 <div>
920 <h3>Feed Information</h3>
921 <ul>
922 <li><strong>Homepage:</strong> <a href="<?php echo $feed_link; ?>"><?php echo is_null($feed_title)?'<em>Unknown</em>':$feed_title; ?></a></li>
923 <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>
924 <li><strong>Encoding:</strong> <?php echo isset($rss->encoding)?esc_html($rss->encoding):"<em>Unknown</em>"; ?></li>
925 <li><strong>Description:</strong> <?php echo isset($rss->channel['description'])?esc_html($rss->channel['description']):"<em>Unknown</em>"; ?></li>
926 </ul>
927 <?php $this->display_authentication_credentials_box(array(
928 'username' => $username,
929 'password' => $password,
930 'method' => $auth,
931 )); ?>
932 <?php do_action('feedwordpress_feedfinder_form', $f, $post, $link, $this->for_feed_settings()); ?>
933 <div class="submit"><input type="submit" class="button-primary" name="Use" value="&laquo; Use this feed" />
934 <input type="submit" class="button" name="Cancel" value="× Cancel" /></div>
935 </div>
936 </div>
937 </fieldset>
938 </div> <!-- class="inside" -->
939 </form>
940 <?php
941 unset($link);
942 unset($post);
943 endforeach;
944 else:
945 foreach ($finder as $url => $ff) :
946 $url = esc_html($url);
947 print "<h3>Searched for feeds at ${url}</h3>\n";
948 print "<p><strong>".__('Error').":</strong> ".__("FeedWordPress couldn't find any feeds at").' <code><a href="'.htmlspecialchars($lookup).'">'.htmlspecialchars($lookup).'</a></code>';
949 print ". ".__('Try another URL').".</p>";
950
951 // Diagnostics
952 print "<div class=\"updated\" style=\"margin-left: 3.0em; margin-right: 3.0em;\">\n";
953 print "<h3>".__('Diagnostic information')."</h3>\n";
954 if (!is_null($ff->error()) and strlen($ff->error()) > 0) :
955 print "<h4>".__('HTTP request failure')."</h4>\n";
956 print "<p>".$ff->error()."</p>\n";
957 else :
958 print "<h4>".__('HTTP request completed')."</h4>\n";
959 print "<p><strong>Status ".$ff->status().":</strong> ".$this->HTTPStatusMessages[(int) $ff->status()]."</p>\n";
960 endif;
961
962 // Do some more diagnostics if the API for it is available.
963 if (function_exists('_wp_http_get_object')) :
964 $httpObject = _wp_http_get_object();
965
966 if (is_callable(array($httpObject, '_getTransport'))) :
967 $transports = $httpObject->_getTransport();
968
969 print "<h4>".__('HTTP Transports available').":</h4>\n";
970 print "<ol>\n";
971 print "<li>".implode("</li>\n<li>", array_map('get_class', $transports))."</li>\n";
972 print "</ol>\n";
973 elseif (is_callable(array($httpObject, '_get_first_available_transport'))) :
974 $transport = $httpObject->_get_first_available_transport(
975 array(),
976 $url
977 );
978
979 print "<h4>".__("HTTP Transport").":</h4>\n";
980 print "<ol>\n";
981 print "<li>".FeedWordPress::val($transport)."</li>\n";
982 print "</ol>\n";
983 endif;
984
985 print "</div>\n";
986 endif;
987 endforeach;
988 endif;
989
990 if (!$feedSwitch) :
991 $this->display_alt_feed_box($lookup, /*alt=*/ true);
992 endif;
993 ?>
994 </div> <!-- class="wrap" -->
995 <?php
996 return false; // Don't continue
997 } /* FeedWordPressFeedsPage::display_feedfinder() */
998
999 function display_alt_feed_box ($lookup, $params = false) {
1000 global $fwp_post;
1001
1002 if (is_bool($params)) :
1003 $params = array("alt" => $params);
1004 endif;
1005
1006 $params = wp_parse_args($params, array( // Defaults
1007 "alt" => false,
1008 "err" => NULL,
1009 "auth" => NULL,
1010 "password" => NULL,
1011 "username" => NULL,
1012 ));
1013 $alt = $params['alt'];
1014
1015 ?>
1016 <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
1017 <div class="inside"><?php
1018 FeedWordPressCompatibility::stamp_nonce($this->dispatch);
1019 ?>
1020 <fieldset class="alt"
1021 <?php if (!$alt): ?>style="margin: 1.0em 3.0em; font-size: smaller;"<?php endif; ?>>
1022 <legend><?php if ($alt) : ?>Alternative feeds<?php else: ?>Find feeds<?php endif; ?></legend>
1023 <?php if ($alt) : ?><h3>Use a different feed</h3><?php endif; ?>
1024 <?php if (is_wp_error($params['err'])) :
1025 ?>
1026 <p><em><strong>401 Not Authorized.</strong> This URL may require
1027 a username and password to access it.</em> You may want to add login
1028 credentials below and check it again.</p>
1029 <?php
1030 endif;
1031 ?>
1032 <div><label>Address:
1033 <input type="text" name="lookup" id="use-another-feed"
1034 placeholder="URL"
1035 <?php if (is_null($lookup)) : ?>
1036 value="URL"
1037 <?php else : ?>
1038 value="<?php print esc_html($lookup); ?>"
1039 <?php endif; ?>
1040 size="64" style="max-width: 80%" /></label>
1041 <?php if (is_null($lookup)) : ?>
1042 <?php FeedWordPressSettingsUI::magic_input_tip_js('use-another-feed'); ?>
1043 <?php endif; ?>
1044
1045 <?php $this->stamp_link_id('link_id'); ?>
1046 <input type="hidden" name="action" value="feedfinder" />
1047 <input type="submit" class="button<?php if ($alt): ?>-primary<?php endif; ?>" value="Check &raquo;" /></div>
1048
1049 <?php $this->display_authentication_credentials_box(array(
1050 'username' => $params['username'],
1051 'password' => $params['password'],
1052 'method' => $params['auth'],
1053 )); ?>
1054
1055 <p>This can be the address of a feed, or of a website. FeedWordPress
1056 will try to automatically detect any feeds associated with a
1057 website.</p>
1058 </div> <!-- class="inside" -->
1059 </fieldset></form>
1060
1061 <?php
1062 } /* FeedWordPressFeedsPage::display_alt_feed_box() */
1063
1064 function save_settings ($post) {
1065 if ($this->for_feed_settings()) :
1066
1067 if (isset($post['link_rss_params_key'])) :
1068 $qp = array();
1069 foreach ($post['link_rss_params_key'] as $index => $key) :
1070 if (strlen($key) > 0) :
1071 if (isset($post['link_rss_params_value'][$index])
1072 and strlen($post['link_rss_params_value'][$index])) :
1073 $value = $post['link_rss_params_value'][$index];
1074 $qp[] = array($key, $value);
1075 endif;
1076 endif;
1077 endforeach;
1078 $this->update_setting('query parameters', serialize($qp));
1079 endif;
1080
1081 // custom feed settings first
1082 foreach ($post['notes'] as $mn) :
1083 $mn['key0'] = (isset($mn['key0']) ? trim($mn['key0']) : NULL);
1084 $mn['key1'] = trim($mn['key1']);
1085 if (preg_match("\007^(("
1086 .implode(')|(',$this->special_settings)
1087 ."))$\007i",
1088 $mn['key1'])) :
1089 $mn['key1'] = 'user/'.$mn['key1'];
1090 endif;
1091
1092 if (strlen($mn['key0']) > 0) :
1093 unset($this->link->settings[$mn['key0']]); // out with the old
1094 endif;
1095
1096 if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
1097 $this->link->settings[$mn['key1']] = $mn['value']; // in with the new
1098 endif;
1099 endforeach;
1100
1101 // now stuff through the web form
1102 // hardcoded feed info
1103
1104 foreach (array('name', 'description', 'url') as $what) :
1105 // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
1106 $this->link->settings["hardcode {$what}"] = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
1107 if (FeedWordPress::affirmative($this->link->settings, "hardcode {$what}")) :
1108 $this->link->link->{'link_'.$what} = $post['link'.$what];
1109 endif;
1110 endforeach;
1111
1112 // Update scheduling
1113 if (isset($post['update_schedule'])) :
1114 $this->link->settings['update/hold'] = $post['update_schedule'];
1115 endif;
1116
1117 if (isset($post['use_default_update_window']) and strtolower($post['use_default_update_window'])=='yes') :
1118 unset($this->link->settings['update/window']);
1119 elseif (isset($post['update_window'])):
1120 if ((int) $post['update_window'] > 0) :
1121 $this->link->settings['update/window'] = (int) $post['update_window'];
1122 endif;
1123 endif;
1124
1125 else :
1126 // Global
1127 update_option('feedwordpress_cat_id', $post['syndication_category']);
1128
1129 if (!isset($post['automatic_updates']) or !in_array($post['automatic_updates'], array('init', 'shutdown'))) :
1130 $automatic_updates = NULL;
1131 else :
1132 $automatic_updates = $post['automatic_updates'];
1133 endif;
1134 update_option('feedwordpress_automatic_updates', $automatic_updates);
1135
1136 if (isset($post['update_window'])):
1137 if ((int) $post['update_window'] > 0) :
1138 update_option('feedwordpress_update_window', (int) $post['update_window']);
1139 endif;
1140 endif;
1141
1142 update_option('feedwordpress_update_time_limit', ($post['update_time_limit']=='yes')?(int) $post['time_limit_seconds']:0);
1143
1144 foreach (array('name', 'description', 'url') as $what) :
1145 // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
1146 $hardcode = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
1147 update_option("feedwordpress_hardcode_{$what}", $hardcode);
1148 endforeach;
1149
1150 endif;
1151
1152 if (isset($post['fetch_timeout'])) :
1153 if (isset($post['fetch_timeout_default']) and $post['fetch_timeout_default']=='yes') :
1154 $timeout = NULL;
1155 else :
1156 $timeout = $post['fetch_timeout'];
1157 endif;
1158
1159 if (is_int($timeout)) :
1160 $timeout = intval($timeout);
1161 endif;
1162 $this->update_setting('fetch timeout', $timeout);
1163 endif;
1164
1165 if (isset($post['update_minimum'])) :
1166 $this->update_setting('update/minimum', $post['update_minimum']);
1167 endif;
1168
1169 if (
1170 isset($post['link_rss_auth_method'])
1171 and $post['link_rss_auth_method']
1172 and ('-' != $post['link_rss_auth_method'])
1173 ) :
1174 $this->update_setting('http auth method', $post['link_rss_auth_method']);
1175 else :
1176 $this->update_setting('http auth method', NULL);
1177 endif;
1178
1179 if (
1180 isset($post['link_rss_username'])
1181 and (strlen($post['link_rss_username']) > 0)
1182 and ('-' != $post['link_rss_auth_method'])
1183 ) :
1184 $this->update_setting('http username', $post['link_rss_username']);
1185 else :
1186 $this->update_setting('http username', NULL);
1187 endif;
1188
1189 if (
1190 isset($post['link_rss_password'])
1191 and (strlen($post['link_rss_password']) > 0)
1192 and ('-' != $post['link_rss_auth_method'])
1193 ) :
1194 $this->update_setting('http password', $post['link_rss_password']);
1195 else :
1196 $this->update_setting('http password', NULL);
1197 endif;
1198
1199 $this->updatedPosts->accept_POST($post);
1200
1201 parent::save_settings($post);
1202 } /* FeedWordPressFeedsPage::save_settings() */
1203
1204 } /* class FeedWordPressFeedsPage */
1205
1206 $feedsPage = new FeedWordPressFeedsPage;
1207 $feedsPage->display();
1208
1209