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

1,099 lines 41.2 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 feed_information_box ($page, $box = NULL) {
380 global $wpdb;
381 $link_rss_params = maybe_unserialize($page->setting('query parameters', ''));
382 if (!is_array($link_rss_params)) :
383 $link_rss_params = array();
384 endif;
385
386 if ($page->for_feed_settings()) :
387 $info['name'] = esc_html($page->link->link->link_name);
388 $info['description'] = esc_html($page->link->link->link_description);
389 $info['url'] = esc_html($page->link->link->link_url);
390 $rss_url = $page->link->link->link_rss;
391
392 $hardcode['name'] = $page->link->hardcode('name');
393 $hardcode['description'] = $page->link->hardcode('description');
394 $hardcode['url'] = $page->link->hardcode('url');
395 else :
396 $cat_id = FeedWordPress::link_category_id();
397
398 $params = array();
399 if (FeedWordPressCompatibility::test_version(FWP_SCHEMA_USES_ARGS_TAXONOMY)) :
400 $params['taxonomy'] = 'link_category';
401 else :
402 $params['type'] = 'link';
403 endif;
404 $params['hide_empty'] = false;
405 $results = get_categories($params);
406
407 // Guarantee that the Contributors category will be in the drop-down chooser, even if it is empty.
408 $found_link_category_id = false;
409 foreach ($results as $row) :
410 // Normalize case
411 if (!isset($row->cat_id)) : $row->cat_id = $row->cat_ID; endif;
412
413 if ($row->cat_id == $cat_id) : $found_link_category_id = true; endif;
414 endforeach;
415
416 if (!$found_link_category_id) :
417 $results[] = get_category($cat_id);
418 endif;
419
420 $info = array();
421 $rss_url = null;
422
423 $hardcode['name'] = get_option('feedwordpress_hardcode_name');
424 $hardcode['description'] = get_option('feedwordpress_hardcode_description');
425 $hardcode['url'] = get_option('feedwordpress_hardcode_url');
426 endif;
427
428 $hideAuth = false;
429
430 $username = $this->setting('http username', NULL);
431
432 if (is_null($username)) :
433 $username = '';
434 $hideAuth = true;
435 endif;
436
437 $password = $this->setting('http password', NULL);
438 if (is_null($password)) :
439 $password = '';
440 endif;
441
442 $auth = $this->setting('http auth method', NULL);
443
444 $authMethods = apply_filters('feedwordpress_http_auth_methods', array(
445 'basic' => 'Basic',
446 'digest' => 'Digest',
447 '-' => 'None',
448 ));
449 if (is_null($auth)) :
450 $auth = '-';
451 $hideAuth = true;
452 endif;
453
454 // Hey ho, let's go
455 ?>
456 <table class="edit-form">
457
458 <?php if ($page->for_feed_settings()) : ?>
459
460 <tr>
461 <th scope="row"><?php _e('Feed URL:') ?></th>
462 <td><a href="<?php echo esc_html($rss_url); ?>"><?php echo esc_html($rss_url); ?></a>
463 (<a href="<?php echo FEEDVALIDATOR_URI; ?>?url=<?php echo urlencode($rss_url); ?>"
464 title="Check feed &lt;<?php echo esc_html($rss_url); ?>&gt; for validity">validate</a>)
465 <input type="submit" name="feedfinder" value="switch &rarr;" style="font-size:smaller" />
466
467 <table id="link-rss-authentication">
468 <tbody>
469 <tr id="link-rss-authentication-credentials">
470 <td><label>user: <input type="text" name="link_rss_username"
471 value="<?php print esc_attr($username); ?>" size="16"
472 placeholder="username to access this feed" /></label></td>
473 <td><label>pass: <input type="text" name="link_rss_password"
474 value="<?php print esc_attr($password); ?>" size="16"
475 placeholder="password to access this feed" /></label></td>
476 <td id="link-rss-authentication-method"><label>method: <select id="link-rss-auth-method" name="link_rss_auth_method" size="1">
477 <?php foreach ($authMethods as $value => $label) : ?>
478 <option value="<?php print esc_attr($value); ?>"<?php
479 if ($value == $auth) : ?> selected="selected"<?php
480 endif; ?>><?php print esc_html($label); ?></option>
481 <?php endforeach; ?>
482 </select></label></td>
483 </tr>
484 </tbody>
485 </table>
486
487 <table id="link-rss-params">
488 <tbody>
489 <?php
490 $link_rss_params['new'] = array('', '');
491 $i = 0;
492 foreach ($link_rss_params as $index => $pair) :
493 ?>
494 <tr class="link-rss-params-row" id="link-rss-params-<?php print $index; ?>">
495 <td><label>Parameter: <input type="text" class="link_params_key"
496 name="link_rss_params_key[<?php print $index; ?>]" value="<?php print esc_html($pair[0]); ?>"
497 size="5" style="width: 5em" placeholder="name" /></label></td>
498 <td class="link-rss-params-value-cell"><label class="link_params_value_label">= <input type="text" class="link_params_value"
499 name="link_rss_params_value[<?php print $index; ?>]" value="<?php print esc_html($pair[1]); ?>"
500 size="8" placeholder="value" /></label></td>
501 </tr>
502 <?php
503 $i++;
504 endforeach;
505 ?>
506 </tbody>
507 </table>
508
509 <div><input type="hidden" id="link-rss-params-num" name="link_rss_params_num" value="<?php print $i; ?>" /></div>
510
511 <script type="text/javascript">
512 function linkUserPassFlip (init) {
513 var speed = 'slow';
514 if (typeof(init)=='boolean' && init) {
515 speed = 0;
516 }
517
518 if (jQuery('#link-rss-auth-method').val()=='-') {
519 jQuery('<a style="display: none" class="add-remove" id="link-rss-userpass-use" href="#">+ Uses username/password</a>')
520 .insertAfter('#link-rss-authentication')
521 .click( function () {
522 jQuery('#link-rss-auth-method').val('basic');
523 linkUserPassFlip();
524 return false;
525 } )
526 .show(speed);
527 jQuery('#link-rss-authentication').hide(speed);
528 } else {
529 jQuery('#link-rss-userpass-use').hide(speed, function () { jQuery(this).remove(); } );
530 jQuery('#link-rss-authentication').show(speed);
531 }
532 }
533 jQuery('<td><a class="add-remove remove-it" id="link-rss-userpass-remove" href="#"><span class="x">(X)</span> Remove</a></td>')
534 .appendTo('#link-rss-authentication-credentials').click(function () {
535 jQuery('#link-rss-auth-method').val('-');
536 linkUserPassFlip();
537 } );
538 jQuery('#link-rss-auth-method').change( linkUserPassFlip );
539 linkUserPassFlip(/*init=*/ true);
540
541 function linkParamsRowRemove (element) {
542 jQuery(element).closest('tr').fadeOut('slow', function () {
543 jQuery(this).remove();
544 } );
545 }
546
547 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');
548
549 jQuery('#link-rss-params-new').hide();
550 jQuery('<a class="add-remove" id="link-rss-params-add" href="#">+ Add a query parameter</a>').insertAfter('#link-rss-params');
551 jQuery('#link-rss-params-add').click( function () {
552 var next = jQuery('#link-rss-params-num').val();
553 var newRow = jQuery('#link-rss-params-new').clone().attr('id', 'link-rss-params-'+next);
554 newRow.find('.link_params_key').attr('name', 'link_rss_params_key['+next+']');
555 newRow.find('.link_params_value').attr('name', 'link_rss_params_value['+next+']');
556
557 newRow.find('.link-rss-params-remove').click( function () {
558 linkParamsRowRemove(this);
559 return false;
560 } );
561
562 newRow.appendTo('#link-rss-params');
563 newRow.show();
564
565 // Update counter for next row.
566 next++;
567 jQuery('#link-rss-params-num').val(next);
568
569 return false;
570 } );
571 jQuery('.link-rss-params-remove').click( function () {
572 linkParamsRowRemove(this);
573 return false;
574 } );
575 </script>
576 </td>
577 </tr>
578
579 <?php
580 $rows = array(
581 "name" => __('Link Name'),
582 "description" => __('Short Description'),
583 "url" => __('Homepage'),
584 );
585 foreach ($rows as $what => $label) :
586 ?>
587 <tr>
588 <th scope="row"><?php print $label ?></th>
589 <td>
590 <div id="basics-<?php print $what; ?>-edit"><input type="text" name="link<?php print $what; ?>"
591 value="<?php echo $info[$what]; ?>" style="width: 95%" /></div>
592 <div id="basics-<?php print $what; ?>-view">
593 <?php if ($what=='url') : ?><a href="<?php print $info[$what]; ?>"><?php else : ?><strong><?php endif; ?>
594 <?php print (strlen(trim($info[$what])) > 0) ? $info[$what] : '(none provided)'; ?>
595 <?php if ($what=='url') : ?></a><?php else : ?></strong><?php endif; ?></div>
596
597 <div>
598 <label><input id="basics-hardcode-<?php print $what; ?>"
599 type="radio" name="hardcode_<?php print $what; ?>" value="no"
600 <?php echo (($hardcode[$what]=='yes')?'':' checked="checked"');?>
601 onchange="contextual_appearance('basics-hardcode-<?php print $what; ?>', 'basics-<?php print $what; ?>-view', 'basics-<?php print $what; ?>-edit', 'no', 'block', /*checkbox=*/ true)"
602 /> Update automatically from feed</label>
603 <label><input type="radio" name="hardcode_<?php print $what; ?>" value="yes"
604 <?php echo (($hardcode[$what]!='yes')?'':' checked="checked"');?>
605 onchange="contextual_appearance('basics-hardcode-<?php print $what; ?>', 'basics-<?php print $what; ?>-view', 'basics-<?php print $what; ?>-edit', 'no', 'block', /*checkbox=*/ true)"
606 /> Edit manually</label>
607 </div>
608 </td>
609 </tr>
610 <?php
611 endforeach;
612 ?>
613
614 <?php else : ?>
615
616 <tr>
617 <th scope="row">Syndicated Link category:</th>
618 <td><p><select name="syndication_category" size="1">
619 <?php
620 foreach ($results as $row) :
621 // Normalize case
622 if (!isset($row->cat_id)) : $row->cat_id = $row->cat_ID; endif;
623
624 echo "\n\t<option value=\"$row->cat_id\"";
625 if ($row->cat_id == $cat_id) :
626 echo " selected='selected'";
627 endif;
628 echo ">$row->cat_id: ".esc_html($row->cat_name);
629 echo "</option>\n";
630 endforeach;
631 ?></select></p>
632 <p class="setting-description">FeedWordPress will syndicate the
633 links placed under this link category.</p>
634 </td>
635 </tr>
636
637 <tr>
638 <th scope="row">Link Names:</th>
639 <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>
640 </tr>
641
642 <tr>
643 <th scope="row">Short descriptions:</th>
644 <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>
645 </tr>
646
647 <tr>
648 <th scope="row">Homepages:</th>
649 <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>
650 </tr>
651
652 <?php endif; ?>
653
654 </table>
655 <?php
656 } /* FeedWordPressFeedsPage::feed_information_box() */
657
658 function custom_settings_box ($page, $box = NULL) {
659 ?>
660 <p class="setting-description">These custom settings are special fields for the <strong>feed</strong> you are
661 syndicating, to be retrieved in templates using the <code>get_feed_meta()</code> function. They do not create
662 custom fields on syndicated <strong>posts</strong>. If you want to create custom fields that are applied to each
663 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>
664
665 <div id="postcustomstuff">
666 <table id="meta-list" cellpadding="3">
667 <tr>
668 <th>Key</th>
669 <th>Value</th>
670 <th>Action</th>
671 </tr>
672
673 <?php
674 $i = 0;
675 foreach ($page->link->settings as $key => $value) :
676 if (!preg_match("\007^((".implode(')|(', $page->special_settings)."))$\007i", $key)) :
677 ?>
678 <tr style="vertical-align:top">
679 <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo esc_html($key); ?>" />
680 <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo esc_html($key); ?>" /></th>
681 <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>
682 <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
683 <option value="update">save changes</option>
684 <option value="delete">delete this setting</option>
685 </select></td>
686 </tr>
687 <?php
688 $i++;
689 endif;
690 endforeach;
691 ?>
692 <tr>
693 <th scope="row"><input type="text" size="10" name="notes[<?php echo $i; ?>][key1]" value="" /></th>
694 <td><textarea name="notes[<?php echo $i; ?>][value]" rows="2" cols="40"></textarea></td>
695 <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo $i; ?>][action]" value="update" /></td>
696 </tr>
697 </table>
698 </div> <!-- id="postcustomstuff" -->
699 <?php
700 }
701
702 function display_feedfinder () {
703 global $wpdb;
704
705 $lookup = (isset($_REQUEST['lookup']) ? $_REQUEST['lookup'] : NULL);
706
707 $feeds = array(); $feedSwitch = false; $current = null;
708 if ($this->for_feed_settings()) : // Existing feed?
709 $feedSwitch = true;
710 if (is_null($lookup)) :
711 // Switch Feed without a specific feed yet suggested
712 // Go to the human-readable homepage to look for
713 // auto-detection links
714 $lookup = $this->link->link->link_url;
715
716 // Guarantee that you at least have the option to
717 // stick with what works.
718 $current = $this->link->link->link_rss;
719 $feeds[] = $current;
720 endif;
721 $name = esc_html($this->link->link->link_name);
722 else: // Or a new subscription to add?
723 $name = "Subscribe to <code>".esc_html(feedwordpress_display_url($lookup))."</code>";
724 endif;
725 ?>
726 <div class="wrap" id="feed-finder">
727 <h2>Feed Finder: <?php echo $name; ?></h2>
728
729 <?php
730 if ($feedSwitch) :
731 $this->display_alt_feed_box($lookup);
732 endif;
733
734 $finder = array();
735 if (!is_null($current)) :
736 $finder[$current] = new FeedFinder($current);
737 endif;
738 $finder[$lookup] = new FeedFinder($lookup);
739
740 foreach ($finder as $url => $ff) :
741 $feeds = array_merge($feeds, $ff->find());
742 endforeach;
743
744 $feeds = array_values( // Renumber from 0..(N-1)
745 array_unique( // Eliminate duplicates
746 $feeds
747 )
748 );
749
750 if (count($feeds) > 0):
751 if ($feedSwitch) :
752 ?>
753 <h3>Feeds Found</h3>
754 <?php
755 endif;
756
757 if (count($feeds) > 1) :
758 $option_template = 'Option %d: ';
759 $form_class = ' class="multi"';
760 ?>
761 <p><strong>This web page provides at least <?php print count($feeds); ?> different feeds.</strong> These feeds may provide the same information
762 in different formats, or may track different items. (You can check the Feed Information and the
763 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>
764 <?php
765 else :
766 $option_template = '';
767 $form_class = '';
768 endif;
769
770 foreach ($feeds as $key => $f):
771 $pie = FeedWordPress::fetch($f);
772 $rss = (is_wp_error($pie) ? $pie : new MagpieFromSimplePie($pie));
773
774 if ($rss and !is_wp_error($rss)):
775 $feed_link = (isset($rss->channel['link'])?$rss->channel['link']:'');
776 $feed_title = (isset($rss->channel['title'])?$rss->channel['title']:$feed_link);
777 $feed_type = ($rss->feed_type ? $rss->feed_type : 'Unknown');
778 $feed_version_template = '%.1f';
779 $feed_version = $rss->feed_version;
780 else :
781 // Give us some sucky defaults
782 $feed_title = feedwordpress_display_url($lookup);
783 $feed_link = $lookup;
784 $feed_type = 'Unknown';
785 $feed_version_template = '';
786 $feed_version = '';
787 endif;
788 ?>
789 <form<?php print $form_class; ?> action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication.php" method="post">
790 <div class="inside"><?php FeedWordPressCompatibility::stamp_nonce('feedwordpress_switchfeed'); ?>
791
792 <?php
793 $classes = array('feed-found'); $currentFeed = '';
794 if (!is_null($current) and $current==$f) :
795 $classes[] = 'current';
796 $currentFeed = ' (currently subscribed)';
797 endif;
798 if ($key%2) :
799 $classes[] = 'alt';
800 endif;
801 ?>
802 <fieldset class="<?php print implode(" ", $classes); ?>">
803 <legend><?php printf($option_template, ($key+1)); print $feed_type." "; printf($feed_version_template, $feed_version); ?> feed<?php print $currentFeed; ?></legend>
804
805 <?php
806 $this->stamp_link_id();
807
808 // No feed specified = add new feed; we
809 // need to pass along a starting title
810 // and homepage URL for the new Link.
811 if (!$this->for_feed_settings()):
812 ?>
813 <input type="hidden" name="feed_title" value="<?php echo esc_html($feed_title); ?>" />
814 <input type="hidden" name="feed_link" value="<?php echo esc_html($feed_link); ?>" />
815 <?php
816 endif;
817 ?>
818
819 <input type="hidden" name="feed" value="<?php echo esc_html($f); ?>" />
820 <input type="hidden" name="action" value="switchfeed" />
821
822 <div>
823 <div class="feed-sample">
824 <?php
825 $link = NULL;
826 $post = NULL;
827 if (!is_wp_error($rss) and count($rss->items) > 0):
828 // Prepare to display Sample Item
829 $link = new MagpieMockLink(array('simplepie' => $pie, 'magpie' => $rss), $f);
830 $post = new SyndicatedPost(array('simplepie' => $rss->originals[0], 'magpie' => $rss->items[0]), $link);
831 ?>
832 <h3>Sample Item</h3>
833 <ul>
834 <li><strong>Title:</strong> <a href="<?php echo $post->post['meta']['syndication_permalink']; ?>"><?php echo $post->post['post_title']; ?></a></li>
835 <li><strong>Date:</strong> <?php print date('d-M-y g:i:s a', $post->published()); ?></li>
836 </ul>
837 <div class="entry">
838 <?php print $post->post['post_content']; ?>
839 </div>
840 <?php
841 do_action('feedwordpress_feed_finder_sample_item', $f, $post, $link);
842 else:
843 if (is_wp_error($rss)) :
844 print '<div class="feed-problem">';
845 print "<h3>Problem:</h3>\n";
846 print "<p>FeedWordPress encountered the following error
847 when trying to retrieve this feed:</p>";
848 print '<p style="margin: 1.0em 3.0em"><code>'.$rss->get_error_message().'</code></p>';
849 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>";
850 print "</div>";
851 endif;
852 ?>
853 <h3>No Items</h3>
854 <p>FeedWordPress found no posts on this feed.</p>
855 <?php
856 endif;
857 ?>
858 </div>
859
860 <div>
861 <h3>Feed Information</h3>
862 <ul>
863 <li><strong>Homepage:</strong> <a href="<?php echo $feed_link; ?>"><?php echo is_null($feed_title)?'<em>Unknown</em>':$feed_title; ?></a></li>
864 <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>
865 <li><strong>Encoding:</strong> <?php echo isset($rss->encoding)?esc_html($rss->encoding):"<em>Unknown</em>"; ?></li>
866 <li><strong>Description:</strong> <?php echo isset($rss->channel['description'])?esc_html($rss->channel['description']):"<em>Unknown</em>"; ?></li>
867 </ul>
868 <?php do_action('feedwordpress_feedfinder_form', $f, $post, $link, $this->for_feed_settings()); ?>
869 <div class="submit"><input type="submit" class="button-primary" name="Use" value="&laquo; Use this feed" />
870 <input type="submit" class="button" name="Cancel" value="× Cancel" /></div>
871 </div>
872 </div>
873 </fieldset>
874 </div> <!-- class="inside" -->
875 </form>
876 <?php
877 unset($link);
878 unset($post);
879 endforeach;
880 else:
881 foreach ($finder as $url => $ff) :
882 $url = esc_html($url);
883 print "<h3>Searched for feeds at ${url}</h3>\n";
884 print "<p><strong>".__('Error').":</strong> ".__("FeedWordPress couldn't find any feeds at").' <code><a href="'.htmlspecialchars($lookup).'">'.htmlspecialchars($lookup).'</a></code>';
885 print ". ".__('Try another URL').".</p>";
886
887 // Diagnostics
888 print "<div class=\"updated\" style=\"margin-left: 3.0em; margin-right: 3.0em;\">\n";
889 print "<h3>".__('Diagnostic information')."</h3>\n";
890 if (!is_null($ff->error()) and strlen($ff->error()) > 0) :
891 print "<h4>".__('HTTP request failure')."</h4>\n";
892 print "<p>".$ff->error()."</p>\n";
893 else :
894 print "<h4>".__('HTTP request completed')."</h4>\n";
895 print "<p><strong>Status ".$ff->status().":</strong> ".$this->HTTPStatusMessages[(int) $ff->status()]."</p>\n";
896 endif;
897
898 // Do some more diagnostics if the API for it is available.
899 if (function_exists('_wp_http_get_object')) :
900 $httpObject = _wp_http_get_object();
901 $transports = $httpObject->_getTransport();
902
903 print "<h4>".__('HTTP Transports available').":</h4>\n";
904 print "<ol>\n";
905 print "<li>".implode("</li>\n<li>", array_map('get_class', $transports))."</li>\n";
906 print "</ol>\n";
907 print "</div>\n";
908 endif;
909 endforeach;
910 endif;
911
912 if (!$feedSwitch) :
913 $this->display_alt_feed_box($lookup, /*alt=*/ true);
914 endif;
915 ?>
916 </div> <!-- class="wrap" -->
917 <?php
918 return false; // Don't continue
919 } /* FeedWordPressFeedsPage::display_feedfinder() */
920
921 function display_alt_feed_box ($lookup, $alt = false) {
922 global $fwp_post;
923 ?>
924 <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
925 <div class="inside"><?php
926 FeedWordPressCompatibility::stamp_nonce($this->dispatch);
927 ?>
928 <fieldset class="alt"
929 <?php if (!$alt): ?>style="margin: 1.0em 3.0em; font-size: smaller;"<?php endif; ?>>
930 <legend><?php if ($alt) : ?>Alternative feeds<?php else: ?>Find feeds<?php endif; ?></legend>
931 <?php if ($alt) : ?><h3>Use a different feed</h3><?php endif; ?>
932 <div><label>Address:
933 <input type="text" name="lookup" id="use-another-feed"
934 placeholder="URL"
935 <?php if (is_null($lookup)) : ?>
936 value="URL"
937 <?php else : ?>
938 value="<?php print esc_html($lookup); ?>"
939 <?php endif; ?>
940 size="64" style="max-width: 80%" /></label>
941 <?php if (is_null($lookup)) : ?>
942 <?php FeedWordPressSettingsUI::magic_input_tip_js('use-another-feed'); ?>
943 <?php endif; ?>
944 <?php $this->stamp_link_id('link_id'); ?>
945 <input type="hidden" name="action" value="feedfinder" />
946 <input type="submit" class="button<?php if ($alt): ?>-primary<?php endif; ?>" value="Check &raquo;" /></div>
947 <p>This can be the address of a feed, or of a website. FeedWordPress
948 will try to automatically detect any feeds associated with a
949 website.</p>
950 </div> <!-- class="inside" -->
951 </fieldset></form>
952
953 <?php
954 } /* FeedWordPressFeedsPage::display_alt_feed_box() */
955
956 function save_settings ($post) {
957 if ($this->for_feed_settings()) :
958
959 if (isset($post['link_rss_params_key'])) :
960 $qp = array();
961 foreach ($post['link_rss_params_key'] as $index => $key) :
962 if (strlen($key) > 0) :
963 if (isset($post['link_rss_params_value'][$index])
964 and strlen($post['link_rss_params_value'][$index])) :
965 $value = $post['link_rss_params_value'][$index];
966 $qp[] = array($key, $value);
967 endif;
968 endif;
969 endforeach;
970 $this->update_setting('query parameters', serialize($qp));
971 endif;
972
973 // custom feed settings first
974 foreach ($post['notes'] as $mn) :
975 $mn['key0'] = (isset($mn['key0']) ? trim($mn['key0']) : NULL);
976 $mn['key1'] = trim($mn['key1']);
977 if (preg_match("\007^(("
978 .implode(')|(',$this->special_settings)
979 ."))$\007i",
980 $mn['key1'])) :
981 $mn['key1'] = 'user/'.$mn['key1'];
982 endif;
983
984 if (strlen($mn['key0']) > 0) :
985 unset($this->link->settings[$mn['key0']]); // out with the old
986 endif;
987
988 if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
989 $this->link->settings[$mn['key1']] = $mn['value']; // in with the new
990 endif;
991 endforeach;
992
993 // now stuff through the web form
994 // hardcoded feed info
995
996 foreach (array('name', 'description', 'url') as $what) :
997 // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
998 $this->link->settings["hardcode {$what}"] = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
999 if (FeedWordPress::affirmative($this->link->settings, "hardcode {$what}")) :
1000 $this->link->link->{'link_'.$what} = $post['link'.$what];
1001 endif;
1002 endforeach;
1003
1004 // Update scheduling
1005 if (isset($post['update_schedule'])) :
1006 $this->link->settings['update/hold'] = $post['update_schedule'];
1007 endif;
1008
1009 if (isset($post['use_default_update_window']) and strtolower($post['use_default_update_window'])=='yes') :
1010 unset($this->link->settings['update/window']);
1011 elseif (isset($post['update_window'])):
1012 if ((int) $post['update_window'] > 0) :
1013 $this->link->settings['update/window'] = (int) $post['update_window'];
1014 endif;
1015 endif;
1016
1017 else :
1018 // Global
1019 update_option('feedwordpress_cat_id', $post['syndication_category']);
1020
1021 if (!isset($post['automatic_updates']) or !in_array($post['automatic_updates'], array('init', 'shutdown'))) :
1022 $automatic_updates = NULL;
1023 else :
1024 $automatic_updates = $post['automatic_updates'];
1025 endif;
1026 update_option('feedwordpress_automatic_updates', $automatic_updates);
1027
1028 if (isset($post['update_window'])):
1029 if ((int) $post['update_window'] > 0) :
1030 update_option('feedwordpress_update_window', (int) $post['update_window']);
1031 endif;
1032 endif;
1033
1034 update_option('feedwordpress_update_time_limit', ($post['update_time_limit']=='yes')?(int) $post['time_limit_seconds']:0);
1035
1036 foreach (array('name', 'description', 'url') as $what) :
1037 // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
1038 $hardcode = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
1039 update_option("feedwordpress_hardcode_{$what}", $hardcode);
1040 endforeach;
1041
1042 endif;
1043
1044 if (isset($post['fetch_timeout'])) :
1045 if (isset($post['fetch_timeout_default']) and $post['fetch_timeout_default']=='yes') :
1046 $timeout = NULL;
1047 else :
1048 $timeout = $post['fetch_timeout'];
1049 endif;
1050
1051 if (is_int($timeout)) :
1052 $timeout = intval($timeout);
1053 endif;
1054 $this->update_setting('fetch timeout', $timeout);
1055 endif;
1056
1057 if (isset($post['update_minimum'])) :
1058 $this->update_setting('update/minimum', $post['update_minimum']);
1059 endif;
1060
1061 if (
1062 isset($post['link_rss_auth_method'])
1063 and $post['link_rss_auth_method']
1064 and ('-' != $post['link_rss_auth_method'])
1065 ) :
1066 $this->update_setting('http auth method', $post['link_rss_auth_method']);
1067 else :
1068 $this->update_setting('http auth method', NULL);
1069 endif;
1070
1071 if (
1072 isset($post['link_rss_username'])
1073 and (strlen($post['link_rss_username']) > 0)
1074 ) :
1075 $this->update_setting('http username', $post['link_rss_username']);
1076 else :
1077 $this->update_setting('http username', NULL);
1078 endif;
1079
1080 if (
1081 isset($post['link_rss_password'])
1082 and (strlen($post['link_rss_password']) > 0)
1083 ) :
1084 $this->update_setting('http password', $post['link_rss_password']);
1085 else :
1086 $this->update_setting('http password', NULL);
1087 endif;
1088
1089 $this->updatedPosts->accept_POST($post);
1090
1091 parent::save_settings($post);
1092 } /* FeedWordPressFeedsPage::save_settings() */
1093
1094 } /* class FeedWordPressFeedsPage */
1095
1096 $feedsPage = new FeedWordPressFeedsPage;
1097 $feedsPage->display();
1098
1099