PluginProbe
FeedWordPress / 2022.0203
FeedWordPress v2022.0203
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
← All changes | feeds-page.php +901 -388 2009.11122022.0203 View file →
@@ -1,8 +1,9 @@
1 1 <?php
2 2 require_once(dirname(__FILE__) . '/admin-ui.php');
3 3 require_once(dirname(__FILE__) . '/magpiemocklink.class.php');
4 4 require_once(dirname(__FILE__) . '/feedfinder.class.php');
5 +require_once(dirname(__FILE__) . '/updatedpostscontrol.class.php');
5 6
6 7 class FeedWordPressFeedsPage extends FeedWordPressAdminPage {
7 8 var $HTTPStatusMessages = array (
8 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.',
@@ -43,168 +44,161 @@
43 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.',
44 45 504 => 'Gateway Timeout',
45 46 505 => 'HTTP Version Not Supported',
46 47 );
48 + var $updatedPosts = NULL;
47 49
48 - /**
49 - * Constructs the Feeds page object
50 - *
51 - * @param mixed $link An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings
52 - */
53 - function FeedWordPressFeedsPage ($link = -1) {
54 - if (is_numeric($link) and -1 == $link) :
55 - $link = FeedWordPressAdminPage::submitted_link();
56 - endif;
57 -
58 - FeedWordPressAdminPage::FeedWordPressAdminPage('feedwordpressfeeds', $link);
59 -
60 - $this->dispatch = get_class($this);
61 - $this->filename = __FILE__;
62 - } /* FeedWordPressFeedsPage constructor */
63 -
64 50 var $special_settings = array ( /* Regular expression syntax is OK here */
65 51 'cats',
66 52 'cat_split',
53 + 'fetch timeout',
54 + 'freeze updates',
67 55 'hardcode name',
68 56 'hardcode url',
69 57 'hardcode description',
70 58 'hardcode categories', /* Deprecated */
71 - 'post status',
72 59 'comment status',
60 + 'terms',
61 + 'map authors',
62 + 'munge permalink',
73 63 'ping status',
64 + 'post status',
65 + 'postmeta',
66 + 'query parameters',
67 + 'resolve relative',
68 + 'syndicated post type',
69 + 'tags',
74 70 'unfamiliar author',
75 71 'unfamliar categories', /* Deprecated */
76 72 'unfamiliar category',
77 - 'map authors',
78 - 'tags',
79 - 'postmeta',
73 + 'unfamiliar post_tag',
74 + 'add/.*',
80 75 'update/.*',
81 76 'feed/.*',
82 77 'link/.*',
78 + 'match/.*',
83 79 );
84 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 + public function __construct( $link = -1 ) {
87 + if (is_numeric($link) and -1 == $link) :
88 + $link = $this->submitted_link();
89 + endif;
90 +
91 + parent::__construct('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 +
85 105 function display () {
86 - global $wpdb;
87 106 global $fwp_post;
88 107 global $post_source;
89 -
90 - if (FeedWordPress::needs_upgrade()) :
91 - fwp_upgrade_page();
92 - return;
93 - endif;
94 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 + 'advanced_settings_box' => __('Advanced Settings'),
115 + );
116 + if ($this->for_default_settings()) :
117 + unset($this->boxes_by_methods['custom_settings_box']);
118 + endif;
119 +
95 120 // Allow overriding of normal source for FeedFinder, which may
96 121 // be called from multiple points.
97 122 if (isset($post_source) and !is_null($post_source)) :
98 123 $source = $post_source;
99 124 else :
100 - $source = get_class($this);
125 + $source = $this->dispatch;
101 126 endif;
102 127
103 - // If this is a POST, validate source and user credentials
104 - FeedWordPressCompatibility::validate_http_request(/*action=*/ $source, /*capability=*/ 'manage_links');
105 -
106 128 if (isset($_REQUEST['feedfinder'])
107 129 or (isset($_REQUEST['action']) and $_REQUEST['action']=='feedfinder')
108 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 +
109 134 return $this->display_feedfinder(); // re-route to Feed Finder page
110 - else :
111 - if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') :
112 - $this->accept_POST($fwp_post);
113 - do_action('feedwordpress_admin_page_feeds_save', $GLOBALS['fwp_post'], $this);
114 - endif;
115 -
116 - ////////////////////////////////////////////////
117 - // Prepare settings page ///////////////////////
118 - ////////////////////////////////////////////////
119 -
120 - $this->ajax_interface_js();
121 - $this->display_update_notice_if_updated('Syndicated feed');
122 - $this->open_sheet('Feed and Update');
123 - ?>
124 - <div id="post-body">
125 - <?php
126 - ////////////////////////////////////////////////
127 - // Display settings boxes //////////////////////
128 - ////////////////////////////////////////////////
129 -
130 - $boxes_by_methods = array(
131 - 'feed_information_box' => __('Feed Information'),
132 - 'global_feeds_box' => __('Update Scheduling'),
133 - 'posts_box' => __('Syndicated Posts, Links, Comments & Pings'),
134 - 'authors_box' => __('Syndicated Authors'),
135 - 'categories_box' => __('Categories'.FEEDWORDPRESS_AND_TAGS),
136 - 'custom_settings_box' => __('Custom Feed Settings (for use in templates)'),
137 - );
138 - if ($this->for_default_settings()) :
139 - unset($boxes_by_methods['custom_settings_box']);
140 - endif;
141 -
142 - foreach ($boxes_by_methods as $method => $row) :
143 - if (is_array($row)) :
144 - $id = $row['id'];
145 - $title = $row['title'];
146 - else :
147 - $id = 'feedwordpress_'.$method;
148 - $title = $row;
149 - endif;
150 -
151 - fwp_add_meta_box(
152 - /*id=*/ $id,
153 - /*title=*/ $title,
154 - /*callback=*/ array(get_class($this), $method),
155 - /*page=*/ $this->meta_box_context(),
156 - /*context=*/ $this->meta_box_context()
157 - );
158 - endforeach;
159 - do_action('feedwordpress_admin_page_feeds_meta_boxes', $this);
160 - ?>
161 - <div class="metabox-holder">
162 - <?php
163 - fwp_do_meta_boxes($this->meta_box_context(), $this->meta_box_context(), $this);
164 - ?>
165 - </div> <!-- class="metabox-holder" -->
166 - </div> <!-- id="post-body" -->
167 - <?php $this->close_sheet(); ?>
135 + endif;
168 136
169 - <script type="text/javascript">
170 - var els = ['name', 'description', 'url'];
171 - for (var i = 0; i < els.length; i++) {
172 - contextual_appearance(
173 - /*item=*/ 'basics-hardcode-'+els[i],
174 - /*appear=*/ 'basics-'+els[i]+'-view',
175 - /*disappear=*/ 'basics-'+els[i]+'-edit',
176 - /*value=*/ 'no',
177 - /*visibleStyle=*/ 'block',
178 - /*checkbox=*/ true
179 - );
180 - } /* for */
181 - </script>
182 - <?php
183 - endif;
137 + parent::display();
184 138 return false; // Don't continue
185 139 } /* FeedWordPressFeedsPage::display() */
186 140
187 - /*static*/ function global_feeds_box ($page, $box = NULL) {
188 - global $wpdb;
141 + function ajax_interface_js () {
142 + parent::ajax_interface_js();
143 + ?>
189 144
190 - $defaultUpdateWindow = get_option('feedwordpress_update_window');
191 - if (!is_numeric($defaultUpdateWindow)) :
192 - $defaultUpdateWindow = DEFAULT_UPDATE_PERIOD;
193 - else :
194 - $defaultUpdateWindow = (int) $defaultUpdateWindow;
195 - endif;
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 + // Let's make the interface for the PAUSE/RESUME a bit better
166 + jQuery('<tr id="reveal-pause-resume"><th></th><td><button id="pause-resume-reveal-button">&#8212; PAUSE or RESUME UPDATES &#8212;</button></td></tr>').insertBefore('#pause-resume');
167 + jQuery('#pause-resume').hide();
168 + jQuery('#pause-resume-reveal-button').click(function(ev) {
169 + ev.preventDefault();
170 +
171 + jQuery('#pause-resume').toggle();
172 + return false;
173 + });
174 +
175 + } );
176 +
177 + <?php
178 + }
179 +
180 + /*static*/ function updated_posts_box ($page, $box = NULL) {
196 181 ?>
197 -
198 182 <table class="edit-form">
183 + <?php $page->updatedPosts->display(); ?>
184 + </table>
199 185 <?php
200 - if ($page->for_default_settings()) :
201 - $automatic_updates = get_option('feedwordpress_automatic_updates');
202 - $update_time_limit = (int) get_option('feedwordpress_update_time_limit');
186 + } /* FeedWordPressFeedsPage::updated_posts_box() */
187 +
188 + /*static*/ function global_feeds_box ($page, $box = NULL) {
189 + global $feedwordpress;
190 + $automatic_updates = $feedwordpress->automatic_update_hook(array('setting only' => true));
191 + $update_time_limit = (int) get_option('feedwordpress_update_time_limit');
192 +
193 + // Hey, ho, let's go...
203 194 ?>
204 195
196 + <table class="edit-form">
197 + <?php if ($page->for_default_settings()) : ?>
198 +
205 199 <tr>
206 - <th scope="row">Updates:</th>
200 + <th scope="row">Update Method:</th>
207 201 <td><select id="automatic-updates-selector" name="automatic_updates" size="1" onchange="contextual_appearance('automatic-updates-selector', 'cron-job-explanation', null, 'no');">
208 202 <option value="shutdown"<?php echo ($automatic_updates=='shutdown')?' selected="selected"':''; ?>>automatically check for updates after pages load</option>
209 203 <option value="init"<?php echo ($automatic_updates=='init')?' selected="selected"':''; ?>>automatically check for updates before pages load</option>
210 204 <option value="no"<?php echo (!$automatic_updates)?' selected="selected"':''; ?>>cron job or manual updates</option>
@@ -209,13 +203,38 @@
209 203 <option value="init"<?php echo ($automatic_updates=='init')?' selected="selected"':''; ?>>automatically check for updates before pages load</option>
210 204 <option value="no"<?php echo (!$automatic_updates)?' selected="selected"':''; ?>>cron job or manual updates</option>
211 205 </select>
212 206 <div id="cron-job-explanation" class="setting-description">
213 - <p>If you want to use a cron job,
207 + <p><?php
208 + // Do we have shell_exec() available from here, or is it disabled for security reasons?
209 + // If it's available, use it to execute `which` to try to get a realistic path to curl,
210 + // or to wget. If everything fails or shell_exec() isn't available, then just make
211 + // up something for the sake of example.
212 + $curlOrWgetPath = NULL;
213 +
214 + $shellExecAvailable = (is_callable('shell_exec') && false === stripos(ini_get('disable_functions'), 'shell_exec'));
215 +
216 + if ($shellExecAvailable) :
217 + $curlOrWgetPath = `which curl`; $opts = '--silent %s';
218 + endif;
219 +
220 + if ($shellExecAvailable and (is_null($curlOrWgetPath) or strlen(trim($curlOrWgetPath))==0)) :
221 + $curlOrWgetPath = `which wget`; $opts = '-q -O - %s';
222 + endif;
223 +
224 + if (is_null($curlOrWgetPath) or strlen(trim($curlOrWgetPath))==0) :
225 + $curlOrWgetPath = '/usr/bin/curl'; $opts = '--silent %s';
226 + endif;
227 +
228 + $curlOrWgetPath = preg_replace('/\n+$/', '', $curlOrWgetPath);
229 +
230 + $cmdline = $curlOrWgetPath . ' ' . sprintf($opts, get_bloginfo('url').'?update_feedwordpress=1');
231 +
232 + ?>If you want to use a cron job,
214 233 you can perform scheduled updates by sending regularly-scheduled
215 - requests to <a href="<?php bloginfo('home'); ?>?update_feedwordpress=1"><code><?php bloginfo('home') ?>?update_feedwordpress=1</code></a>
234 + requests to <a href="<?php bloginfo('url'); ?>?update_feedwordpress=1"><code><?php bloginfo('url') ?>?update_feedwordpress=1</code></a>
216 235 For example, inserting the following line in your crontab:</p>
217 - <pre style="font-size: 0.80em"><code>*/10 * * * * /usr/bin/curl --silent <?php bloginfo('home'); ?>?update_feedwordpress=1</code></pre>
236 + <pre style="font-size: 0.80em"><code>*/10 * * * * <?php print esc_html($cmdline); ?></code></pre>
218 237 <p class="setting-description">will check in every 10 minutes
219 238 and check for updates on any feeds that are ready to be polled for updates.</p>
220 239 </div>
221 240 </td>
@@ -220,39 +239,10 @@
220 239 </div>
221 240 </td>
222 241 </tr>
223 242
224 - <tr>
225 - <th scope="row"><?php print __('Update scheduling:') ?></th>
226 - <td><p style="margin-top:0px">How long should FeedWordPress wait between updates before it considers a feed ready to be polled for updates again?</p>
227 - <p style="font-style: italic; margin-left: 2.0em"><label>Wait <input type="text" name="update_window" value="<?php print $defaultUpdateWindow; ?>" size="4" /> minutes between polling.</label></p>
228 - <div class="setting-description">
229 - <p<?php if ($defaultUpdateWindow<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>
230 - <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 a 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>
231 - </div></td>
232 - </tr>
233 -
234 - <tr>
235 - <th scope="row"><?php print __('Time limit on updates'); ?>:</th>
236 - <td><select id="time-limit" name="update_time_limit" size="1" onchange="contextual_appearance('time-limit', 'time-limit-box', null, 'yes');">
237 - <option value="no"<?php echo ($update_time_limit>0)?'':' selected="selected"'; ?>>no time limit on updates</option>
238 - <option value="yes"<?php echo ($update_time_limit>0)?' selected="selected"':''; ?>>limit updates to no more than...</option>
239 - </select>
240 - <span id="time-limit-box"><label><input type="text" name="time_limit_seconds" value="<?php print $update_time_limit; ?>" size="5" /> seconds</label></span>
241 - </tr>
243 + <?php else : /* Feed-specific settings */ ?>
242 244
243 - <?php else :
244 - $useDefaultUpdateWindow = !(isset($page->link->settings['update/window']));
245 -
246 - $updateWindow = (isset($page->link->settings['update/window']) ? $page->link->settings['update/window'] : null);
247 - if (!is_numeric($updateWindow)) :
248 - $updateWindow = 60;
249 - else :
250 - $updateWindow = (int) $updateWindow;
251 - endif;
252 -
253 - ?>
254 -
255 245 <tr>
256 246 <th scope="row"><?php _e('Last update') ?>:</th>
257 247 <td><?php
258 248 if (isset($page->link->settings['update/last'])) :
@@ -287,39 +277,258 @@
287 277 ?></option>
288 278 <option value="next"<?php echo ($holdem=='next')?' selected="selected"':''; ?>>update ASAP</option>
289 279 <option value="ping"<?php echo ($holdem=='ping')?' selected="selected"':''; ?>>update only when pinged</option>
290 280 </select></td></tr>
281 +
282 + <?php endif; ?>
291 283
284 + <tr id="pause-resume">
285 + <th scope="row"><?php print __('Pause/Resume:'); ?></th>
286 + <td><?php
287 + $this->setting_radio_control(
288 + 'update/pause', 'update_pause',
289 + /*options=*/ array(
290 + 'no' => '<strong>UPDATE:</strong> import new posts as normal',
291 + 'yes' => '<strong>PAUSE:</strong> do not import new posts until I unpause updates',
292 + ),
293 + /*params=*/ array(
294 + 'setting-default' => NULL,
295 + 'global-setting-default' => 'no',
296 + 'default-input-value' => 'default',
297 + )
298 + );
299 + ?></td>
300 + </tr>
301 +
292 302 <tr>
293 303 <th scope="row"><?php print __('Update scheduling:') ?></th>
294 304 <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>
295 - <ul>
296 - <li><label><input type="radio" name="use_default_update_window" value="Yes" <?php if ($useDefaultUpdateWindow) : ?>checked="checked"<?php endif; ?> /> Use site-wide setting (currently <?php print $defaultUpdateWindow; ?> minutes)</li>
297 - <li><label><input type="radio" name="use_default_update_window" value="No" <?php if (!$useDefaultUpdateWindow) : ?>checked="checked"<?php endif; ?> /> Wait <input type="text" name="update_window" value="<?php print $updateWindow; ?>" size="4" /> minutes between polling.</label></li>
298 - </ul>
305 + <?php
306 +
307 + $this->setting_radio_control(
308 + 'update/window', 'update_window',
309 + array($this, 'update_window_edit_box'),
310 + array(
311 + 'global-setting-default' => DEFAULT_UPDATE_PERIOD,
312 + 'default-input-name' => 'use_default_update_window',
313 + 'default-input-id' => 'use-default-update-window-yes',
314 + 'default-input-id-no' => 'use-default-update-window-no',
315 + 'labels' => array($this, 'update_window_currently'),
316 + )
317 + );
318 + ?></td>
319 + </tr>
320 +
321 + <tr>
322 + <th scope="row"><?php print __('Minimum Interval:'); ?></th>
323 + <td><p style="margin-top:0px">Some feeds include standard elements that
324 + request a specific update schedule. If the interval requested by the
325 + feed provider is <em>longer</em> than FeedWordPress's normal scheduling,
326 + FeedWordPress will always respect their request to slow down. But what
327 + should it do if the update interval is <em>shorter</em> than the schedule set above?</p>
328 + <?php
329 + $this->setting_radio_control(
330 + 'update/minimum', 'update_minimum',
331 + /*options=*/ array(
332 + 'no' => 'Speed up and accept the interval from the feed provider',
333 + 'yes' => 'Keep pace and use the longer scheduling from FeedWordPress',
334 + ),
335 + /*params=*/ array(
336 + 'setting-default' => NULL,
337 + 'global-setting-default' => 'no',
338 + 'default-input-value' => 'default',
339 + )
340 + );
341 + ?>
342 + </td>
343 + </tr>
299 344
300 - <div class="setting-description">
345 + <?php if ($this->for_default_settings()) : ?>
346 +
347 + <tr>
348 + <th scope="row"><?php print __('Time limit on updates'); ?>:</th>
349 + <td><select id="time-limit" name="update_time_limit" size="1" onchange="contextual_appearance('time-limit', 'time-limit-box', null, 'yes');">
350 + <option value="no"<?php echo ($update_time_limit>0)?'':' selected="selected"'; ?>>no time limit on updates</option>
351 + <option value="yes"<?php echo ($update_time_limit>0)?' selected="selected"':''; ?>>limit updates to no more than...</option>
352 + </select>
353 + <span id="time-limit-box"><label><input type="text" name="time_limit_seconds" value="<?php print $update_time_limit; ?>" size="5" /> seconds</label></span>
354 + </tr>
355 +
356 + <?php endif; ?>
357 +
358 + </table>
359 +
360 + <?php
361 + } /* FeedWordPressFeedsPage::global_feeds_box() */
362 +
363 + function update_window_edit_box ($updateWindow, $defaulted, $params) {
364 + if (!is_numeric($updateWindow)) :
365 + $updateWindow = DEFAULT_UPDATE_PERIOD;
366 + endif;
367 + ?>
368 + <p>Wait <input type="text" name="update_window" value="<?php print $updateWindow; ?>" size="4" /> minutes between polling.</p>
369 + <div class="setting-description" id="update-scheduling-note">
301 370 <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>
302 371 <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>
303 - </div></td>
372 + </div>
373 + <?php
374 + } /* FeedWordPressFeedsPage::update_window_edit_box () */
375 +
376 + function update_window_currently ($updateWindow, $defaulted, $params) {
377 + $updateWindow = (int) $updateWindow;
378 + if (1==$updateWindow) :
379 + $caption = 'wait %d minute between polling';
380 + else :
381 + $caption = 'wait %d minutes between polling';
382 + endif;
383 + return sprintf(__($caption), $updateWindow);
384 + } /* FeedWordPressFeedsPage::update_window_currently () */
385 +
386 + function fetch_timeout_setting ($setting, $defaulted, $params) {
387 + $timeout = intval($this->setting('fetch timeout', FEEDWORDPRESS_FETCH_TIMEOUT_DEFAULT));
388 +
389 + if ($this->for_feed_settings()) :
390 + $article = 'this';
391 + else :
392 + $article = 'a';
393 + endif;
394 + ?>
395 + <p>Wait no more than
396 + than <input name="fetch_timeout" type="number" min="0" size="3" value="<?php print $timeout; ?>" />
397 + second(s) when trying to fetch <?php print $article; ?> feed to check for updates.</p>
398 + <p>If <?php print $article; ?> source's web server does not respond before time runs
399 + out, FeedWordPress will skip over the source and try again during
400 + the next update cycle.</p>
401 + <?php
402 + }
403 + function fetch_timeout_setting_value ($setting, $defaulted, $params) {
404 + print number_format(intval($setting)) . " " . (($setting==1) ? "second" : "seconds");
405 + }
406 +
407 + function advanced_settings_box ($page, $box = NULL) {
408 + ?>
409 + <table class="edit-form">
410 + <tr>
411 + <th>Fetch Timeout:</th>
412 + <td>
413 + <?php
414 + $this->setting_radio_control(
415 + 'fetch timeout', 'fetch_timeout',
416 + array($this, 'fetch_timeout_setting'),
417 + array(
418 + 'global-setting-default' => FEEDWORDPRESS_FETCH_TIMEOUT_DEFAULT,
419 + 'input-name' => 'fetch_timeout',
420 + 'default-input-name' => 'fetch_timeout_default',
421 + 'labels' => array($this, 'fetch_timeout_setting_value'),
422 + )
423 + );
424 + ?>
425 + </td>
304 426 </tr>
305 - <?php endif; ?>
427 + <tr>
428 + <th>Feed Update Type:</th>
429 + <td><?php
430 + $this->setting_radio_control('update_incremental', 'update_incremental',
431 + /*options=*/ array(
432 + 'incremental' => '<strong>Incremental.</strong> When items no longer appear on the feed, keep them in the WordPress posts table.',
433 + 'complete' => '<strong>Complete.</strong> When items no longer appear on the feed, they are obsolete; retire them from the WordPress posts table.',
434 + ),
435 + /*params=*/ array(
436 + 'setting-default' => NULL,
437 + 'global-setting-default' => 'incremental',
438 + 'default-input-value' => 'default',
439 + )
440 + ); ?></td>
441 + </tr>
442 + <tr>
443 + <th>Allow Feeds to Delete Posts:</th>
444 + <td><?php
445 + $this->setting_radio_control('tombstones', 'tombstones',
446 + /*options=*/ array(
447 + 'yes' => 'Yes. If a feed indicates that one of its posts has been deleted, delete the local copy syndicated to this website.',
448 + 'no' => 'No. Even if a feed indicates that one of its posts has been deleted, retain the local copy on this website.',
449 + ),
450 + /*params=*/ array(
451 + 'setting-default' => NULL,
452 + 'global-setting-default' => 'yes',
453 + 'default-input-value' => 'default',
454 + )
455 + ); ?></td>
456 + </tr>
457 + </table>
458 + <?php
459 + } /* FeedWordPressFeedsPage::advanced_settings_box () */
460 +
461 + function display_authentication_credentials_box ($params = array()) {
462 + static $count = 0;
306 463
464 + $params = wp_parse_args($params, array(
465 + 'username' => NULL,
466 + 'password' => NULL,
467 + 'method' => '-',
468 + ));
469 +
470 + // Equivalents
471 + if (is_null($params['method'])) : $params['method'] = '-'; endif;
472 +
473 + $count++;
474 + $slug = ($count > 1 ? '-'.$count : '');
475 +
476 + global $feedwordpress;
477 + $authMethods = apply_filters(
478 + 'feedwordpress_http_auth_methods',
479 + $feedwordpress->httpauth->methods_available()
480 + );
307 481
308 -</table>
309 -<script type="text/javascript">
310 -contextual_appearance('automatic-updates-selector', 'cron-job-explanation', null, 'no');
311 -contextual_appearance('time-limit', 'time-limit-box', null, 'yes');
312 -</script>
313 -<?php
314 - } /* FeedWordPressFeedsPage::global_feeds_box() */
315 -
482 + if (count($authMethods) > 1) : /* More than '-' */
483 + ?>
484 + <div class="link-rss-authentication" id="link-rss-authentication<?php print $slug; ?>">
485 + <table>
486 + <tbody>
487 + <tr class="link-rss-authentication-credentials" id="link-rss-authentication-credentials<?php print $slug; ?>">
488 + <td><label>user: <input type="text" name="link_rss_username"
489 + value="<?php print esc_attr($params['username']); ?>" size="16"
490 + placeholder="username to access this feed" /></label></td>
491 + <td><label>pass: <input type="text" name="link_rss_password"
492 + value="<?php print esc_attr($params['password']); ?>" size="16"
493 + placeholder="password to access this feed" /></label></td>
494 + <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">
495 +<?php foreach ($authMethods as $value => $label) : ?>
496 + <option value="<?php print esc_attr($value); ?>"<?php
497 + if ($value == $params['method']) : ?> selected="selected"<?php
498 + endif; ?>><?php print esc_html($label); ?></option>
499 +<?php endforeach; ?>
500 + </select></label></td>
501 + </tr>
502 + </tbody>
503 + </table>
504 + </div>
505 +
506 + <script type="text/javascript">
507 + 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>')
508 + .appendTo('#link-rss-authentication-credentials<?php print $slug; ?>')
509 + .click( feedAuthenticationMethodUnPress );
510 + jQuery('#link-rss-auth-method<?php print $slug; ?>').change( feedAuthenticationMethod );
511 + feedAuthenticationMethod({
512 + init: true,
513 + node: jQuery('#link-rss-authentication<?php print $slug; ?>') });
514 + </script>
515 +
516 + <?php
517 + endif;
518 + }
519 +
316 520 function feed_information_box ($page, $box = NULL) {
317 521 global $wpdb;
522 + $link_rss_params = maybe_unserialize($page->setting('query parameters', ''));
523 + if (!is_array($link_rss_params)) :
524 + $link_rss_params = array();
525 + endif;
526 +
318 527 if ($page->for_feed_settings()) :
319 - $info['name'] = wp_specialchars($page->link->link->link_name, 1);
320 - $info['description'] = wp_specialchars($page->link->link->link_description, 'both');
321 - $info['url'] = wp_specialchars($page->link->link->link_url, 1);
528 + $info['name'] = esc_html($page->link->link->link_name);
529 + $info['description'] = esc_html($page->link->link->link_description);
530 + $info['url'] = esc_html($page->link->link->link_url);
322 531 $rss_url = $page->link->link->link_rss;
323 532
324 533 $hardcode['name'] = $page->link->hardcode('name');
325 534 $hardcode['description'] = $page->link->hardcode('description');
@@ -325,26 +534,25 @@
325 534 $hardcode['description'] = $page->link->hardcode('description');
326 535 $hardcode['url'] = $page->link->hardcode('url');
327 536 else :
328 537 $cat_id = FeedWordPress::link_category_id();
329 - if (FeedWordPressCompatibility::test_version(FWP_SCHEMA_21)) :
330 - $results = get_categories(array(
331 - "type" => 'link',
332 - "hide_empty" => false,
333 - ));
538 +
539 + $params = array();
540 + $params['taxonomy'] = 'link_category';
541 + $params['hide_empty'] = false;
542 + $results = get_categories($params);
334 543
335 - // Guarantee that the Contributors category will be in the drop-down chooser, even if it is empty.
336 - $found_link_category_id = false;
337 - foreach ($results as $row) :
338 - // Normalize case
339 - if (!isset($row->cat_id)) : $row->cat_id = $row->cat_ID; endif;
544 + // Guarantee that the Contributors category will be in the drop-down chooser, even if it is empty.
545 + $found_link_category_id = false;
546 + foreach ($results as $row) :
547 + // Normalize case
548 + if (!isset($row->cat_id)) : $row->cat_id = $row->cat_ID; endif;
340 549
341 - if ($row->cat_id == $cat_id) : $found_link_category_id = true; endif;
342 - endforeach;
343 -
344 - if (!$found_link_category_id) : $results[] = get_category($cat_id); endif;
345 - else :
346 - $results = $wpdb->get_results("SELECT cat_id, cat_name, auto_toggle FROM $wpdb->linkcategories ORDER BY cat_id");
550 + if ($row->cat_id == $cat_id) : $found_link_category_id = true; endif;
551 + endforeach;
552 +
553 + if (!$found_link_category_id) :
554 + $results[] = get_category($cat_id);
347 555 endif;
348 556
349 557 $info = array();
350 558 $rss_url = null;
@@ -353,17 +561,34 @@
353 561 $hardcode['description'] = get_option('feedwordpress_hardcode_description');
354 562 $hardcode['url'] = get_option('feedwordpress_hardcode_url');
355 563 endif;
356 564
565 + $hideAuth = false;
566 +
567 + $username = $this->setting('http username', NULL);
568 +
569 + if (is_null($username)) :
570 + $username = '';
571 + $hideAuth = true;
572 + endif;
573 +
574 + $password = $this->setting('http password', NULL);
575 + if (is_null($password)) :
576 + $password = '';
577 + endif;
578 +
579 + $auth = $this->setting('http auth method', NULL);
580 +
581 + global $feedwordpress;
582 +
583 + if (is_null($auth) or (strlen($auth)==0)) :
584 + $auth = '-';
585 + $hideAuth = true;
586 + endif;
587 +
357 588 // Hey ho, let's go
589 +
358 590 ?>
359 - <style type="text/css">
360 - table.edit-form { width: 100%; }
361 - table.edit-form th { width: 25%; vertical-align: top; text-align: right; padding: 0.5em; }
362 - table.edit-form td { width: 75%; vertical-align: top; padding: 0.5em; }
363 - table.edit-form td ul.options { margin: 0; padding: 0; list-style: none; }
364 - </style>
365 -
366 591 <table class="edit-form">
367 592
368 593 <?php if ($page->for_feed_settings()) : ?>
369 594
@@ -368,14 +593,82 @@
368 593 <?php if ($page->for_feed_settings()) : ?>
369 594
370 595 <tr>
371 596 <th scope="row"><?php _e('Feed URL:') ?></th>
372 - <td><a href="<?php echo wp_specialchars($rss_url, 'both'); ?>"><?php echo wp_specialchars($rss_url, 'both'); ?></a>
597 + <td><a href="<?php echo esc_html($rss_url); ?>"><?php echo esc_html($rss_url); ?></a>
373 598 (<a href="<?php echo FEEDVALIDATOR_URI; ?>?url=<?php echo urlencode($rss_url); ?>"
374 - title="Check feed &lt;<?php echo wp_specialchars($rss_url, 'both'); ?>&gt; for validity">validate</a>)
375 - <input type="submit" name="feedfinder" value="switch &rarr;" style="font-size:smaller" /></td>
599 + title="Check feed &lt;<?php echo esc_html($rss_url); ?>&gt; for validity">validate</a>)
600 + <input type="submit" name="feedfinder" value="switch &rarr;" style="font-size:smaller" />
601 +
602 + <?php $this->display_authentication_credentials_box(array(
603 + 'username' => $username,
604 + 'password' => $password,
605 + 'method' => $auth,
606 + )); ?>
607 +
608 + <table id="link-rss-params">
609 + <tbody>
610 + <?php
611 + $link_rss_params['new'] = array('', '');
612 + $i = 0;
613 + foreach ($link_rss_params as $index => $pair) :
614 + ?>
615 + <tr class="link-rss-params-row" id="link-rss-params-<?php print $index; ?>">
616 + <td><label>Parameter: <input type="text" class="link_params_key"
617 + name="link_rss_params_key[<?php print $index; ?>]" value="<?php print esc_html($pair[0]); ?>"
618 + size="5" style="width: 5em" placeholder="name" /></label></td>
619 + <td class="link-rss-params-value-cell"><label class="link_params_value_label">= <input type="text" class="link_params_value"
620 + name="link_rss_params_value[<?php print $index; ?>]" value="<?php print esc_html($pair[1]); ?>"
621 + size="8" placeholder="value" /></label></td>
376 622 </tr>
623 + <?php
624 + $i++;
625 + endforeach;
626 + ?>
627 + </tbody>
628 + </table>
629 +
630 + <div><input type="hidden" id="link-rss-params-num" name="link_rss_params_num" value="<?php print $i; ?>" /></div>
631 +
632 + <script type="text/javascript">
633 + function linkParamsRowRemove (element) {
634 + jQuery(element).closest('tr').fadeOut('slow', function () {
635 + jQuery(this).remove();
636 + } );
637 + }
377 638
639 + 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');
640 +
641 + jQuery('#link-rss-params-new').hide();
642 + jQuery('<a class="add-remove" id="link-rss-params-add" href="#">+ Add a query parameter</a>').insertAfter('#link-rss-params');
643 + jQuery('#link-rss-params-add').click( function () {
644 + var next = jQuery('#link-rss-params-num').val();
645 + var newRow = jQuery('#link-rss-params-new').clone().attr('id', 'link-rss-params-'+next);
646 + newRow.find('.link_params_key').attr('name', 'link_rss_params_key['+next+']');
647 + newRow.find('.link_params_value').attr('name', 'link_rss_params_value['+next+']');
648 +
649 + newRow.find('.link-rss-params-remove').click( function () {
650 + linkParamsRowRemove(this);
651 + return false;
652 + } );
653 +
654 + newRow.appendTo('#link-rss-params');
655 + newRow.show();
656 +
657 + // Update counter for next row.
658 + next++;
659 + jQuery('#link-rss-params-num').val(next);
660 +
661 + return false;
662 + } );
663 + jQuery('.link-rss-params-remove').click( function () {
664 + linkParamsRowRemove(this);
665 + return false;
666 + } );
667 + </script>
668 + </td>
669 + </tr>
670 +
378 671 <?php
379 672 $rows = array(
380 673 "name" => __('Link Name'),
381 674 "description" => __('Short Description'),
@@ -423,9 +716,9 @@
423 716 echo "\n\t<option value=\"$row->cat_id\"";
424 717 if ($row->cat_id == $cat_id) :
425 718 echo " selected='selected'";
426 719 endif;
427 - echo ">$row->cat_id: ".wp_specialchars($row->cat_name);
720 + echo ">$row->cat_id: ".esc_html($row->cat_name);
428 721 echo "</option>\n";
429 722 endforeach;
430 723 ?></select></p>
431 724 <p class="setting-description">FeedWordPress will syndicate the
@@ -453,26 +746,15 @@
453 746 </table>
454 747 <?php
455 748 } /* FeedWordPressFeedsPage::feed_information_box() */
456 749
457 - function posts_box ($page, $box = NULL) {
458 - FeedWordPressSettingsUI::instead_of_posts_box($page->link->id);
459 - } /* FeedWordPressFeedsPage::posts_box() */
460 -
461 - function authors_box ($page, $box = NULL) {
462 - FeedWordPressSettingsUI::instead_of_authors_box($page->link->id);
463 - } /* FeedWordPressFeedsPage::authors_box() */
464 -
465 - function categories_box ($page, $box = NULL) {
466 - FeedWordPressSettingsUI::instead_of_categories_box($page->link->id);
467 - } /* FeedWordPressFeedsPage::categories_box() */
468 -
469 750 function custom_settings_box ($page, $box = NULL) {
751 + $postsSettings = $this->admin_page_href('posts-page.php', array(), $page->link);
470 752 ?>
471 753 <p class="setting-description">These custom settings are special fields for the <strong>feed</strong> you are
472 754 syndicating, to be retrieved in templates using the <code>get_feed_meta()</code> function. They do not create
473 755 custom fields on syndicated <strong>posts</strong>. If you want to create custom fields that are applied to each
474 - 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>
756 + individual post from this feed, set up the settings in <a href="<?php print $postsSettings; ?>">Syndicated Posts</a>.</p>
475 757
476 758 <div id="postcustomstuff">
477 759 <table id="meta-list" cellpadding="3">
478 760 <tr>
@@ -486,11 +768,11 @@
486 768 foreach ($page->link->settings as $key => $value) :
487 769 if (!preg_match("\007^((".implode(')|(', $page->special_settings)."))$\007i", $key)) :
488 770 ?>
489 771 <tr style="vertical-align:top">
490 - <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo wp_specialchars($key, 'both'); ?>" />
491 - <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo wp_specialchars($key, 'both'); ?>" /></th>
492 - <td width="60%"><textarea rows="2" cols="40" id="notes-<?php echo $i; ?>-value" name="notes[<?php echo $i; ?>][value]"><?php echo wp_specialchars($value, 'both'); ?></textarea></td>
772 + <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo esc_html($key); ?>" />
773 + <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo esc_html($key); ?>" /></th>
774 + <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>
493 775 <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
494 776 <option value="update">save changes</option>
495 777 <option value="delete">delete this setting</option>
496 778 </select></td>
@@ -509,71 +791,171 @@
509 791 </div> <!-- id="postcustomstuff" -->
510 792 <?php
511 793 }
512 794
795 + function url_for_401 ($err) {
796 + $ret = NULL;
797 + if (is_wp_error($err)) :
798 + if ($err->get_error_code()=='http_request_failed') :
799 + $data = $err->get_error_data('http_request_failed');
800 +
801 + if (is_array($data) and isset($data['status'])) :
802 + if (401==$data['status']) :
803 + $ret = $data['uri'];
804 + endif;
805 + endif;
806 + endif;
807 + endif;
808 + return $ret;
809 + }
810 +
513 811 function display_feedfinder () {
514 812 global $wpdb;
515 813
516 814 $lookup = (isset($_REQUEST['lookup']) ? $_REQUEST['lookup'] : NULL);
815 +
816 + $auth = MyPHP::request('link_rss_auth_method');
817 + $username = MyPHP::request('link_rss_username');
818 + $password = MyPHP::request('link_rss_password');
819 + $credentials = array(
820 + "authentication" => $auth,
821 + "username" => $username,
822 + "password" => $password,
823 + );
517 824
825 + $feeds = array(); $feedSwitch = false; $current = null;
518 826 if ($this->for_feed_settings()) : // Existing feed?
519 - if (is_null($lookup)) : $lookup = $this->link->link->link_url; endif;
520 - $name = wp_specialchars($this->link->link->link_name, 'both');
827 + $feedSwitch = true;
828 + if (is_null($lookup)) :
829 + // Switch Feed without a specific feed yet suggested
830 + // Go to the human-readable homepage to look for
831 + // auto-detection links
832 +
833 + $lookup = $this->link->link->link_url;
834 + $auth = $this->link->setting('http auth method');
835 + $username = $this->link->setting('http username');
836 + $password = $this->link->setting('http password');
837 +
838 + // Guarantee that you at least have the option to
839 + // stick with what works.
840 + $current = $this->link->link->link_rss;
841 + $feeds[] = $current;
842 + endif;
843 + $name = esc_html($this->link->link->link_name);
521 844 else: // Or a new subscription to add?
522 - $name = "Subscribe to <code>".wp_specialchars(feedwordpress_display_url($lookup))."</code>";
845 + $name = "Subscribe to <code>".esc_html(feedwordpress_display_url($lookup))."</code>";
523 846 endif;
524 847 ?>
525 - <style type="text/css">
526 - form.fieldset {
527 - clear: both;
528 - }
529 - .feed-sample {
530 - float: right;
531 - background-color: #D0D0D0;
532 - color: black;
533 - width: 45%;
534 - font-size: 70%;
535 - border-left: 1px dotted #A0A0A0;
536 - margin-left: 1.0em;
537 - }
538 - .feed-sample p, .feed-sample h3 {
539 - padding-left: 0.5em;
540 - padding-right: 0.5em;
541 - }
542 - .feed-sample .feed-problem {
543 - background-color: #ffd0d0;
544 - border-bottom: 1px dotted black;
545 - padding-bottom: 0.5em;
546 - margin-bottom: 0.5em;
547 - }
548 - </style>
549 -
550 - <div class="wrap">
848 + <div class="wrap" id="feed-finder">
551 849 <h2>Feed Finder: <?php echo $name; ?></h2>
552 850
553 851 <?php
554 - $f =& new FeedFinder($lookup);
555 - $feeds = $f->find();
852 + if ($feedSwitch) :
853 + $this->display_alt_feed_box($lookup);
854 + endif;
855 +
856 + $finder = array();
857 + if (!is_null($current)) :
858 + $finder[$current] = new FeedFinder($current);
859 + endif;
860 + $finder[$lookup] = new FeedFinder($lookup);
861 +
862 + foreach ($finder as $url => $ff) :
863 + $feeds = array_merge($feeds, $ff->find(
864 + /*url=*/ NULL,
865 + /*params=*/ $credentials));
866 + endforeach;
867 +
868 + $feeds = array_values( // Renumber from 0..(N-1)
869 + $feeds
870 + );
871 +
872 + // Allow for some simple FeedFinder results filtering
873 + $feeds = apply_filters(
874 + 'feedwordpress_feedfinder_results',
875 + $feeds,
876 + array(
877 + "url" => $lookup,
878 + "auth" => $auth,
879 + "username" => $username,
880 + "password" => $password,
881 + "finder" => $finder,
882 + ),
883 + $this
884 + );
885 +
556 886 if (count($feeds) > 0):
887 + if ($feedSwitch) :
888 + ?>
889 + <h3>Feeds Found</h3>
890 + <?php
891 + endif;
892 +
893 + if (count($feeds) > 1) :
894 + $option_template = 'Option %d: ';
895 + $form_class = ' class="multi"';
896 + ?>
897 + <p><strong>This web page provides at least <?php print count($feeds); ?> different feeds.</strong> These feeds may provide the same information
898 + in different formats, or may track different items. (You can check the Feed Information and the
899 + 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>
900 + <?php
901 + else :
902 + $option_template = '';
903 + $form_class = '';
904 + endif;
905 +
906 + global $fwp_credentials;
907 +
557 908 foreach ($feeds as $key => $f):
558 - $rss = @fetch_rss($f);
559 - if ($rss):
560 - $feed_title = isset($rss->channel['title'])?$rss->channel['title']:$rss->channel['link'];
561 - $feed_link = isset($rss->channel['link'])?$rss->channel['link']:'';
909 + $ofc = $fwp_credentials;
910 + $fwp_credentials = $credentials; // Set
911 + $pie = FeedWordPress::fetch($f, array("cache" => false));
912 + $fwp_credentials = $ofc; // Re-Set
913 +
914 + $rss = (is_wp_error($pie) ? $pie : new MagpieFromSimplePie($pie));
915 +
916 + if ($this->url_for_401($pie)) :
917 + $this->display_alt_feed_box($lookup, array(
918 + "err" => $pie,
919 + "auth" => $auth,
920 + "username" => $username,
921 + "password" => $password
922 + ));
923 + continue;
924 + endif;
925 +
926 + if ($rss and !is_wp_error($rss)):
927 + $feed_link = (isset($rss->channel['link'])?$rss->channel['link']:'');
928 + $feed_title = (isset($rss->channel['title'])?$rss->channel['title']:$feed_link);
562 929 $feed_type = ($rss->feed_type ? $rss->feed_type : 'Unknown');
930 + $feed_version_template = '%.1f';
931 + $feed_version = $rss->feed_version;
563 932 else :
564 933 // Give us some sucky defaults
565 934 $feed_title = feedwordpress_display_url($lookup);
566 935 $feed_link = $lookup;
567 936 $feed_type = 'Unknown';
937 + $feed_version_template = '';
938 + $feed_version = '';
568 939 endif;
569 940 ?>
570 - <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication.php" method="post">
571 - <div><?php FeedWordPressCompatibility::stamp_nonce('feedwordpress_switchfeed'); ?></div>
572 - <fieldset>
573 - <legend><?php echo $feed_type; ?> <?php echo $rss->feed_version; ?> feed</legend>
941 + <form<?php print $form_class; ?> action="<?php print $this->form_action('syndication.php'); ?>" method="post">
942 + <div class="inside"><?php FeedWordPressCompatibility::stamp_nonce('feedwordpress_switchfeed'); ?>
574 943
575 944 <?php
945 + $classes = array('feed-found'); $currentFeed = '';
946 + if (!is_null($current) and $current==$f) :
947 + $classes[] = 'current';
948 + $currentFeed = ' (currently subscribed)';
949 + endif;
950 + if ($key%2) :
951 + $classes[] = 'alt';
952 + endif;
953 + ?>
954 + <fieldset class="<?php print implode(" ", $classes); ?>">
955 + <legend><?php printf($option_template, ($key+1)); print $feed_type." "; printf($feed_version_template, $feed_version); ?> feed<?php print $currentFeed; ?></legend>
956 +
957 + <?php
576 958 $this->stamp_link_id();
577 959
578 960 // No feed specified = add new feed; we
579 961 // need to pass along a starting title
@@ -579,25 +961,26 @@
579 961 // need to pass along a starting title
580 962 // and homepage URL for the new Link.
581 963 if (!$this->for_feed_settings()):
582 964 ?>
583 - <input type="hidden" name="feed_title" value="<?php echo wp_specialchars($feed_title, 'both'); ?>" />
584 - <input type="hidden" name="feed_link" value="<?php echo wp_specialchars($feed_link, 'both'); ?>" />
965 + <input type="hidden" name="feed_title" value="<?php echo esc_html($feed_title); ?>" />
966 + <input type="hidden" name="feed_link" value="<?php echo esc_html($feed_link); ?>" />
585 967 <?php
586 968 endif;
587 969 ?>
588 970
589 - <input type="hidden" name="feed" value="<?php echo wp_specialchars($f, 'both'); ?>" />
971 + <input type="hidden" name="feed" value="<?php echo esc_html($f); ?>" />
590 972 <input type="hidden" name="action" value="switchfeed" />
591 973
592 974 <div>
593 975 <div class="feed-sample">
594 -
595 976 <?php
596 - if (count($rss->items) > 0):
977 + $link = NULL;
978 + $post = NULL;
979 + if (!is_wp_error($rss) and count($rss->items) > 0):
597 980 // Prepare to display Sample Item
598 - $link =& new MagpieMockLink($rss, $f);
599 - $post =& new SyndicatedPost($rss->items[0], $link);
981 + $link = new MagpieMockLink(array('simplepie' => $pie, 'magpie' => $rss), $f);
982 + $post = new SyndicatedPost(array('simplepie' => $rss->originals[0], 'magpie' => $rss->items[0]), $link);
600 983 ?>
601 984 <h3>Sample Item</h3>
602 985 <ul>
603 986 <li><strong>Title:</strong> <a href="<?php echo $post->post['meta']['syndication_permalink']; ?>"><?php echo $post->post['post_title']; ?></a></li>
@@ -606,15 +989,16 @@
606 989 <div class="entry">
607 990 <?php print $post->post['post_content']; ?>
608 991 </div>
609 992 <?php
993 + do_action('feedwordpress_feed_finder_sample_item', $f, $post, $link);
610 994 else:
611 - if (magpie_error()) :
995 + if (is_wp_error($rss)) :
612 996 print '<div class="feed-problem">';
613 997 print "<h3>Problem:</h3>\n";
614 998 print "<p>FeedWordPress encountered the following error
615 999 when trying to retrieve this feed:</p>";
616 - print '<p style="margin: 1.0em 3.0em"><code>'.magpie_error().'</code></p>';
1000 + print '<p style="margin: 1.0em 3.0em"><code>'.$rss->get_error_message().'</code></p>';
617 1001 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>";
618 1002 print "</div>";
619 1003 endif;
620 1004 ?>
@@ -628,171 +1012,300 @@
628 1012 <div>
629 1013 <h3>Feed Information</h3>
630 1014 <ul>
631 1015 <li><strong>Homepage:</strong> <a href="<?php echo $feed_link; ?>"><?php echo is_null($feed_title)?'<em>Unknown</em>':$feed_title; ?></a></li>
632 - <li><strong>Feed URL:</strong> <a href="<?php echo wp_specialchars($f, 'both'); ?>"><?php echo wp_specialchars($f, 'both'); ?></a> (<a title="Check feed &lt;<?php echo wp_specialchars($f, 'both'); ?>&gt; for validity" href="http://feedvalidator.org/check.cgi?url=<?php echo urlencode($f); ?>">validate</a>)</li>
633 - <li><strong>Encoding:</strong> <?php echo isset($rss->encoding)?wp_specialchars($rss->encoding, 'both'):"<em>Unknown</em>"; ?></li>
634 - <li><strong>Description:</strong> <?php echo isset($rss->channel['description'])?wp_specialchars($rss->channel['description'], 'both'):"<em>Unknown</em>"; ?></li>
1016 + <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>
1017 + <li><strong>Encoding:</strong> <?php echo isset($rss->encoding)?esc_html($rss->encoding):"<em>Unknown</em>"; ?></li>
1018 + <li><strong>Description:</strong> <?php echo isset($rss->channel['description'])?esc_html($rss->channel['description']):"<em>Unknown</em>"; ?></li>
635 1019 </ul>
636 - <div class="submit"><input type="submit" name="Use" value="&laquo; Use this feed" /></div>
637 - <div class="submit"><input type="submit" name="Cancel" value="&laquo; Cancel" /></div>
1020 + <?php $this->display_authentication_credentials_box(array(
1021 + 'username' => $username,
1022 + 'password' => $password,
1023 + 'method' => $auth,
1024 + )); ?>
1025 + <?php do_action('feedwordpress_feedfinder_form', $f, $post, $link, $this->for_feed_settings()); ?>
1026 + <div class="submit"><input type="submit" class="button-primary" name="Use" value="&laquo; Use this feed" />
1027 + <input type="submit" class="button" name="Cancel" value="× Cancel" /></div>
638 1028 </div>
639 1029 </div>
640 1030 </fieldset>
1031 + </div> <!-- class="inside" -->
641 1032 </form>
642 1033 <?php
1034 + unset($link);
1035 + unset($post);
643 1036 endforeach;
644 1037 else:
645 - print "<p><strong>".__('Error').":</strong> ".__("FeedWordPress couldn't find any feeds at").' <code><a href="'.htmlspecialchars($lookup).'">'.htmlspecialchars($lookup).'</a></code>';
646 - print ". ".__('Try another URL').".</p>";
1038 + foreach ($finder as $url => $ff) :
1039 + $url = esc_html($url);
1040 + print "<h3>Searched for feeds at ${url}</h3>\n";
1041 + print "<p><strong>".__('Error').":</strong> ".__("FeedWordPress couldn't find any feeds at").' <code><a href="'.htmlspecialchars($lookup).'">'.htmlspecialchars($lookup).'</a></code>';
1042 + print ". ".__('Try another URL').".</p>";
647 1043
648 - // Diagnostics
649 - print "<div class=\"updated\" style=\"margin-left: 3.0em; margin-right: 3.0em;\">\n";
650 - print "<h3>".__('Diagnostic information')."</h3>\n";
651 - if (!is_null($f->error()) and strlen($f->error()) > 0) :
652 - print "<h4>".__('HTTP request failure')."</h4>\n";
653 - print "<p>".$f->error()."</p>\n";
654 - else :
655 - print "<h4>".__('HTTP request completed')."</h4>\n";
656 - print "<p><strong>Status ".$f->status().":</strong> ".$this->HTTPStatusMessages[(int) $f->status()]."</p>\n";
657 - endif;
1044 + // Diagnostics
1045 + print "<div class=\"updated\" style=\"margin-left: 3.0em; margin-right: 3.0em;\">\n";
1046 + print "<h3>".__('Diagnostic information')."</h3>\n";
1047 + if (!is_null($ff->error()) and strlen($ff->error()) > 0) :
1048 + print "<h4>".__('HTTP request failure')."</h4>\n";
1049 + print "<p>".$ff->error()."</p>\n";
1050 + else :
1051 + print "<h4>".__('HTTP request completed')."</h4>\n";
1052 + print "<p><strong>Status ".$ff->status().":</strong> ".$this->HTTPStatusMessages[(int) $ff->status()]."</p>\n";
1053 + endif;
658 1054
659 - // Do some more diagnostics if the API for it is available.
660 - if (function_exists('_wp_http_get_object')) :
661 - $httpObject = _wp_http_get_object();
662 - $transports = $httpObject->_getTransport();
1055 + // Do some more diagnostics if the API for it is available.
1056 + if (function_exists('_wp_http_get_object')) :
1057 + $httpObject = _wp_http_get_object();
1058 +
1059 + if (is_callable(array($httpObject, '_getTransport'))) :
1060 + $transports = $httpObject->_getTransport();
1061 +
1062 + print "<h4>".__('HTTP Transports available').":</h4>\n";
1063 + print "<ol>\n";
1064 + print "<li>".implode("</li>\n<li>", array_map('get_class', $transports))."</li>\n";
1065 + print "</ol>\n";
1066 + elseif (is_callable(array($httpObject, '_get_first_available_transport'))) :
1067 + $transport = $httpObject->_get_first_available_transport(
1068 + array(),
1069 + $url
1070 + );
1071 +
1072 + print "<h4>".__("HTTP Transport").":</h4>\n";
1073 + print "<ol>\n";
1074 + print "<li>".MyPHP::val($transport)."</li>\n";
1075 + print "</ol>\n";
1076 + endif;
1077 +
1078 + print "</div>\n";
1079 + endif;
1080 + endforeach;
1081 + endif;
1082 +
1083 + if (!$feedSwitch) :
1084 + $this->display_alt_feed_box($lookup, /*alt=*/ true);
1085 + endif;
1086 + ?>
1087 + </div> <!-- class="wrap" -->
1088 + <?php
1089 + return false; // Don't continue
1090 + } /* FeedWordPressFeedsPage::display_feedfinder() */
663 1091
664 - print "<h4>".__('HTTP Transports available').":</h4>\n";
665 - print "<ol>\n";
666 - print "<li>".implode("</li>\n<li>", array_map('get_class', $transports))."</li>\n";
667 - print "</ol>\n";
668 - print "</div>\n";
1092 + function display_alt_feed_box ($lookup, $params = false) {
1093 + global $fwp_post;
1094 +
1095 + if (is_bool($params)) :
1096 + $params = array("alt" => $params);
1097 + endif;
1098 +
1099 + $params = wp_parse_args($params, array( // Defaults
1100 + "alt" => false,
1101 + "err" => NULL,
1102 + "auth" => NULL,
1103 + "password" => NULL,
1104 + "username" => NULL,
1105 + ));
1106 + $alt = $params['alt'];
1107 +
1108 + ?>
1109 + <form action="<?php print $this->form_action('syndication.php'); ?>" method="post">
1110 + <div class="inside"><?php
1111 + FeedWordPressCompatibility::stamp_nonce('feedwordpress_feeds');
1112 + ?>
1113 + <fieldset class="alt"
1114 + <?php if (!$alt): ?>style="margin: 1.0em 3.0em; font-size: smaller;"<?php endif; ?>>
1115 + <legend><?php if ($alt) : ?>Alternative feeds<?php else: ?>Find feeds<?php endif; ?></legend>
1116 + <?php if ($alt) : ?><h3>Use a different feed</h3><?php endif; ?>
1117 + <?php if (is_wp_error($params['err'])) :
1118 + ?>
1119 + <p><em><strong>401 Not Authorized.</strong> This URL may require
1120 + a username and password to access it.</em> You may want to add login
1121 + credentials below and check it again.</p>
1122 + <?php
669 1123 endif;
1124 + ?>
1125 + <div><label>Address:
1126 + <input type="text" name="lookup" id="use-another-feed"
1127 + placeholder="URL"
1128 + <?php if (is_null($lookup)) : ?>
1129 + value="URL"
1130 + <?php else : ?>
1131 + value="<?php print esc_html($lookup); ?>"
1132 + <?php endif; ?>
1133 + size="64" style="max-width: 80%" /></label>
1134 + <?php if (is_null($lookup)) : ?>
1135 + <?php FeedWordPressSettingsUI::magic_input_tip_js('use-another-feed'); ?>
1136 + <?php endif; ?>
670 1137
671 - endif;
672 - ?>
673 - </div>
674 -
675 - <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
676 - <div><?php
677 - FeedWordPressCompatibility::stamp_nonce(get_class($this));
678 - ?></div>
679 - <div class="wrap">
680 - <h2>Use another feed</h2>
681 - <div><label>Feed:</label>
682 - <input type="text" name="lookup" id="use-another-feed" value="URI" />
683 - <?php FeedWordPressSettingsUI::magic_input_tip_js('use-another-feed'); ?>
684 1138 <?php $this->stamp_link_id('link_id'); ?>
685 - <input type="hidden" name="action" value="feedfinder" /></div>
686 - <div class="submit"><input type="submit" value="Use this feed &raquo;" /></div>
687 - </div>
688 - </form>
1139 + <input type="hidden" name="action" value="feedfinder" />
1140 + <input type="submit" class="button<?php if ($alt): ?>-primary<?php endif; ?>" value="Check &raquo;" /></div>
1141 +
1142 + <?php $this->display_authentication_credentials_box(array(
1143 + 'username' => $params['username'],
1144 + 'password' => $params['password'],
1145 + 'method' => $params['auth'],
1146 + )); ?>
1147 +
1148 + <p>This can be the address of a feed, or of a website. FeedWordPress
1149 + will try to automatically detect any feeds associated with a
1150 + website.</p>
1151 + </div> <!-- class="inside" -->
1152 + </fieldset></form>
1153 +
689 1154 <?php
690 - return false; // Don't continue
691 - } /* WordPressFeedsPage::display_feedfinder() */
692 -
693 - function accept_POST ($post) {
694 - global $wpdb;
1155 + } /* FeedWordPressFeedsPage::display_alt_feed_box() */
1156 +
1157 + function save_settings ($post) {
1158 + if ($this->for_feed_settings()) :
695 1159
696 - // User mashed a Save Changes button
697 - if (isset($post['save']) or isset($post['submit'])) :
698 - if ($this->for_feed_settings()) :
699 - $alter = array ();
700 -
701 - // custom feed settings first
702 - foreach ($post['notes'] as $mn) :
703 - $mn['key0'] = trim($mn['key0']);
704 - $mn['key1'] = trim($mn['key1']);
705 - if (preg_match("\007^(("
706 - .implode(')|(',$this->special_settings)
707 - ."))$\007i",
708 - $mn['key1'])) :
709 - $mn['key1'] = 'user/'.$mn['key1'];
1160 + if (isset($post['link_rss_params_key'])) :
1161 + $qp = array();
1162 + foreach ($post['link_rss_params_key'] as $index => $key) :
1163 + if (strlen($key) > 0) :
1164 + if (isset($post['link_rss_params_value'][$index])
1165 + and strlen($post['link_rss_params_value'][$index])) :
1166 + $value = $post['link_rss_params_value'][$index];
1167 + $qp[] = array($key, $value);
1168 + endif;
710 1169 endif;
711 -
712 - if (strlen($mn['key0']) > 0) :
713 - unset($this->link->settings[$mn['key0']]); // out with the old
714 - endif;
715 -
716 - if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
717 - $this->link->settings[$mn['key1']] = $mn['value']; // in with the new
718 - endif;
719 1170 endforeach;
720 -
721 - // now stuff through the web form
722 - // hardcoded feed info
723 -
724 - foreach (array('name', 'description', 'url') as $what) :
725 - // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
726 - $this->link->settings["hardcode {$what}"] = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
727 - if (FeedWordPress::affirmative($this->link->settings, "hardcode {$what}")) :
728 - $alter[] = "link_{$what} = '".$wpdb->escape($post['link'.$what])."'";
729 - endif;
730 - endforeach;
731 -
732 - // Update scheduling
733 - if (isset($post['update_schedule'])) :
734 - $this->link->settings['update/hold'] = $post['update_schedule'];
1171 + $this->update_setting('query parameters', serialize($qp));
1172 + endif;
1173 +
1174 + // custom feed settings first
1175 + foreach ($post['notes'] as $mn) :
1176 + $mn['key0'] = (isset($mn['key0']) ? trim($mn['key0']) : NULL);
1177 + $mn['key1'] = trim($mn['key1']);
1178 + if (preg_match("\007^(("
1179 + .implode(')|(',$this->special_settings)
1180 + ."))$\007i",
1181 + $mn['key1'])) :
1182 + $mn['key1'] = 'user/'.$mn['key1'];
735 1183 endif;
736 1184
737 - if (isset($post['use_default_update_window']) and strtolower($post['use_default_update_window'])=='yes') :
738 - unset($this->link->settings['update/window']);
739 - elseif (isset($post['update_window'])):
740 - if ((int) $post['update_window'] > 0) :
741 - $this->link->settings['update/window'] = (int) $post['update_window'];
742 - endif;
1185 + if (strlen($mn['key0']) > 0) :
1186 + unset($this->link->settings[$mn['key0']]); // out with the old
743 1187 endif;
744 1188
745 - $alter[] = "link_notes = '".$wpdb->escape($this->link->settings_to_notes())."'";
1189 + if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
1190 + $this->link->settings[$mn['key1']] = $mn['value']; // in with the new
1191 + endif;
1192 + endforeach;
1193 +
1194 + // now stuff through the web form
1195 + // hardcoded feed info
1196 +
1197 + foreach (array('name', 'description', 'url') as $what) :
1198 + // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
1199 + $this->link->settings["hardcode {$what}"] = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
1200 + if (FeedWordPress::affirmative($this->link->settings, "hardcode {$what}")) :
1201 + $this->link->link->{'link_'.$what} = $post['link'.$what];
1202 + endif;
1203 + endforeach;
1204 +
1205 + // Update scheduling
1206 + if (isset($post['update_schedule'])) :
1207 + $this->link->settings['update/hold'] = $post['update_schedule'];
1208 + endif;
746 1209
747 - $alter_set = implode(", ", $alter);
748 -
749 - // issue update query
750 - $result = $wpdb->query("
751 - UPDATE $wpdb->links
752 - SET $alter_set
753 - WHERE link_id='{$this->link->id}'
754 - ");
755 - $this->updated = true;
756 -
757 - // reload link information from DB
758 - if (function_exists('clean_bookmark_cache')) :
759 - clean_bookmark_cache($this->link->id);
1210 + if (isset($post['use_default_update_window']) and strtolower($post['use_default_update_window'])=='yes') :
1211 + unset($this->link->settings['update/window']);
1212 + elseif (isset($post['update_window'])):
1213 + if ((int) $post['update_window'] > 0) :
1214 + $this->link->settings['update/window'] = (int) $post['update_window'];
760 1215 endif;
761 - $this->link = new SyndicatedLink($this->link->id);
1216 + endif;
1217 +
1218 + else :
1219 + // Global
1220 + update_option('feedwordpress_cat_id', $post['syndication_category']);
1221 +
1222 + if (!isset($post['automatic_updates']) or !in_array($post['automatic_updates'], array('init', 'shutdown'))) :
1223 + $automatic_updates = NULL;
762 1224 else :
763 - // Global
764 - update_option('feedwordpress_cat_id', $post['syndication_category']);
765 -
766 - if (!isset($post['automatic_updates']) or !in_array($post['automatic_updates'], array('init', 'shutdown'))) :
767 - $automatic_updates = false;
768 - else :
769 - $automatic_updates = $post['automatic_updates'];
1225 + $automatic_updates = $post['automatic_updates'];
1226 + endif;
1227 + update_option('feedwordpress_automatic_updates', $automatic_updates);
1228 +
1229 + if (isset($post['update_window'])):
1230 + if ((int) $post['update_window'] > 0) :
1231 + update_option('feedwordpress_update_window', (int) $post['update_window']);
770 1232 endif;
771 - update_option('feedwordpress_automatic_updates', $automatic_updates);
1233 + endif;
772 1234
773 - if (isset($post['update_window'])):
774 - if ((int) $post['update_window'] > 0) :
775 - update_option('feedwordpress_update_window', (int) $post['update_window']);
776 - endif;
777 - endif;
1235 + update_option('feedwordpress_update_time_limit', ($post['update_time_limit']=='yes')?(int) $post['time_limit_seconds']:0);
778 1236
779 - update_option('feedwordpress_update_time_limit', ($post['update_time_limit']=='yes')?(int) $post['time_limit_seconds']:0);
1237 + foreach (array('name', 'description', 'url') as $what) :
1238 + // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
1239 + $hardcode = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
1240 + update_option("feedwordpress_hardcode_{$what}", $hardcode);
1241 + endforeach;
1242 +
1243 + endif;
1244 +
1245 + if (isset($post['update_pause'])) :
1246 + $this->update_setting('update/pause', $post['update_pause']);
1247 + endif;
780 1248
781 - foreach (array('name', 'description', 'url') as $what) :
782 - // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
783 - $hardcode = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
784 - update_option("feedwordpress_hardcode_{$what}", $hardcode);
785 - endforeach;
786 -
787 - $this->updated = true;
1249 + if (isset($post['fetch_timeout'])) :
1250 + if (isset($post['fetch_timeout_default']) and $post['fetch_timeout_default']=='yes') :
1251 + $timeout = NULL;
1252 + else :
1253 + $timeout = $post['fetch_timeout'];
788 1254 endif;
789 1255
790 - // Probably a "Go" button for the drop-down
1256 + if (is_int($timeout)) :
1257 + $timeout = intval($timeout);
1258 + endif;
1259 + $this->update_setting('fetch timeout', $timeout);
1260 + endif;
1261 +
1262 + if (isset($post['update_incremental'])) :
1263 + $this->update_setting('update_incremental', $post['update_incremental']);
1264 + endif;
1265 +
1266 + if (isset($post['tombstones'])) :
1267 + $this->update_setting('tombstones', $post['tombstones']);
1268 + endif;
1269 +
1270 + if (isset($post['update_minimum'])) :
1271 + $this->update_setting('update/minimum', $post['update_minimum']);
1272 + endif;
1273 +
1274 + if (
1275 + isset($post['link_rss_auth_method'])
1276 + and $post['link_rss_auth_method']
1277 + and ('-' != $post['link_rss_auth_method'])
1278 + ) :
1279 + $this->update_setting('http auth method', $post['link_rss_auth_method']);
791 1280 else :
792 - $this->updated = false;
1281 + $this->update_setting('http auth method', NULL);
793 1282 endif;
794 - } /* WordPressFeedsPage::accept_POST() */
1283 +
1284 + if (
1285 + isset($post['link_rss_username'])
1286 + and (strlen($post['link_rss_username']) > 0)
1287 + and ('-' != $post['link_rss_auth_method'])
1288 + ) :
1289 + $this->update_setting('http username', $post['link_rss_username']);
1290 + else :
1291 + $this->update_setting('http username', NULL);
1292 + endif;
1293 +
1294 + if (
1295 + isset($post['link_rss_password'])
1296 + and (strlen($post['link_rss_password']) > 0)
1297 + and ('-' != $post['link_rss_auth_method'])
1298 + ) :
1299 + $this->update_setting('http password', $post['link_rss_password']);
1300 + else :
1301 + $this->update_setting('http password', NULL);
1302 + endif;
1303 +
1304 + $this->updatedPosts->accept_POST($post);
1305 +
1306 + parent::save_settings($post);
1307 + } /* FeedWordPressFeedsPage::save_settings() */
795 1308
796 1309 } /* class FeedWordPressFeedsPage */
797 1310
798 1311 $feedsPage = new FeedWordPressFeedsPage;