PluginProbe
FeedWordPress / 2011.0721
FeedWordPress v2011.0721
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 +569 -389 2009.11112011.0721 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,166 +44,148 @@
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 + 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 +
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 + '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 +
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 + FeedWordPressAdminPage::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 +
166 + <?php
167 + }
168 +
169 + /*static*/ function updated_posts_box ($page, $box = NULL) {
196 170 ?>
197 -
198 171 <table class="edit-form">
172 + <?php $page->updatedPosts->display(); ?>
173 + </table>
199 174 <?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');
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...
203 183 ?>
204 184
185 + <table class="edit-form">
186 + <?php if ($page->for_default_settings()) : ?>
187 +
205 188 <tr>
206 189 <th scope="row">Updates:</th>
207 190 <td><select id="automatic-updates-selector" name="automatic_updates" size="1" onchange="contextual_appearance('automatic-updates-selector', 'cron-job-explanation', null, 'no');">
208 191 <option value="shutdown"<?php echo ($automatic_updates=='shutdown')?' selected="selected"':''; ?>>automatically check for updates after pages load</option>
@@ -211,11 +194,11 @@
211 194 </select>
212 195 <div id="cron-job-explanation" class="setting-description">
213 196 <p>If you want to use a cron job,
214 197 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>
198 + requests to <a href="<?php bloginfo('home'); ?>?update_feedwordpress=1"><code><?php bloginfo('url') ?>?update_feedwordpress=1</code></a>
216 199 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>
200 + <pre style="font-size: 0.80em"><code>*/10 * * * * /usr/bin/curl --silent <?php bloginfo('url'); ?>?update_feedwordpress=1</code></pre>
218 201 <p class="setting-description">will check in every 10 minutes
219 202 and check for updates on any feeds that are ready to be polled for updates.</p>
220 203 </div>
221 204 </td>
@@ -220,39 +203,10 @@
220 203 </div>
221 204 </td>
222 205 </tr>
223 206
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>
207 + <?php else : /* Feed-specific settings */ ?>
242 208
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 209 <tr>
256 210 <th scope="row"><?php _e('Last update') ?>:</th>
257 211 <td><?php
258 212 if (isset($page->link->settings['update/last'])) :
@@ -287,39 +241,140 @@
287 241 ?></option>
288 242 <option value="next"<?php echo ($holdem=='next')?' selected="selected"':''; ?>>update ASAP</option>
289 243 <option value="ping"<?php echo ($holdem=='ping')?' selected="selected"':''; ?>>update only when pinged</option>
290 244 </select></td></tr>
291 -
245 +
246 + <?php endif; ?>
247 +
292 248 <tr>
293 249 <th scope="row"><?php print __('Update scheduling:') ?></th>
294 250 <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>
251 + <?php
252 +
253 + $this->setting_radio_control(
254 + 'update/window', 'update_window',
255 + array(&$this, 'update_window_edit_box'),
256 + array(
257 + 'global-setting-default' => DEFAULT_UPDATE_PERIOD,
258 + 'default-input-name' => 'use_default_update_window',
259 + 'default-input-id' => 'use-default-update-window-yes',
260 + 'default-input-id-no' => 'use-default-update-window-no',
261 + 'labels' => array(&$this, 'update_window_currently'),
262 + )
263 + );
264 + ?></td>
265 + </tr>
266 +
267 + <tr>
268 + <th scope="row"><?php print __('Minimum Interval:'); ?></th>
269 + <td><p style="margin-top:0px">Some feeds include standard elements that
270 + request a specific update schedule. If the interval requested by the
271 + feed provider is <em>longer</em> than FeedWordPress's normal scheduling,
272 + FeedWordPress will always respect their request to slow down. But what
273 + should it do if the update interval is <em>shorter</em> than the schedule set above?</p>
274 + <?php
275 + $this->setting_radio_control(
276 + 'update/minimum', 'update_minimum',
277 + /*options=*/ array(
278 + 'no' => 'Speed up and accept the interval from the feed provider',
279 + 'yes' => 'Keep pace and use the longer scheduling from FeedWordPress',
280 + ),
281 + /*params=*/ array(
282 + 'setting-default' => NULL,
283 + 'global-setting-default' => 'no',
284 + 'default-input-value' => 'default',
285 + )
286 + );
287 + ?>
288 + </td>
289 + </tr>
299 290
300 - <div class="setting-description">
301 - <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 - <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>
291 + <?php if ($this->for_default_settings()) : ?>
292 +
293 + <tr>
294 + <th scope="row"><?php print __('Time limit on updates'); ?>:</th>
295 + <td><select id="time-limit" name="update_time_limit" size="1" onchange="contextual_appearance('time-limit', 'time-limit-box', null, 'yes');">
296 + <option value="no"<?php echo ($update_time_limit>0)?'':' selected="selected"'; ?>>no time limit on updates</option>
297 + <option value="yes"<?php echo ($update_time_limit>0)?' selected="selected"':''; ?>>limit updates to no more than...</option>
298 + </select>
299 + <span id="time-limit-box"><label><input type="text" name="time_limit_seconds" value="<?php print $update_time_limit; ?>" size="5" /> seconds</label></span>
304 300 </tr>
301 +
305 302 <?php endif; ?>
303 +
304 + </table>
305 +
306 + <?php
307 + } /* FeedWordPressFeedsPage::global_feeds_box() */
306 308
309 + function update_window_edit_box ($updateWindow, $defaulted, $params) {
310 + if (!is_numeric($updateWindow)) :
311 + $updateWindow = DEFAULT_UPDATE_PERIOD;
312 + endif;
313 + ?>
314 + <p>Wait <input type="text" name="update_window" value="<?php print $updateWindow; ?>" size="4" /> minutes between polling.</p>
315 + <div class="setting-description" id="update-scheduling-note">
316 + <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>
317 + <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>
318 + </div>
319 + <?php
320 + } /* FeedWordPressFeedsPage::update_window_edit_box () */
321 +
322 + function update_window_currently ($updateWindow, $defaulted, $params) {
323 + $updateWindow = (int) $updateWindow;
324 + if (1==$updateWindow) :
325 + $caption = 'wait %d minute between polling';
326 + else :
327 + $caption = 'wait %d minutes between polling';
328 + endif;
329 + return sprintf(__($caption), $updateWindow);
330 + } /* FeedWordPressFeedsPage::update_window_currently () */
331 +
332 + function fetch_timeout_setting ($setting, $defaulted, $params) {
333 + $timeout = intval($this->setting('fetch timeout', FEEDWORDPRESS_FETCH_TIMEOUT_DEFAULT));
307 334
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 -
335 + if ($this->for_feed_settings()) :
336 + $article = 'this';
337 + else :
338 + $article = 'a';
339 + endif;
340 + ?>
341 + <p>Wait no more than
342 + than <input name="fetch_timeout" type="number" min="0" size="3" value="<?php print $timeout; ?>" />
343 + second(s) when trying to fetch <?php print $article; ?> feed to check for updates.</p>
344 + <p>If <?php print $article; ?> source's web server does not respond before time runs
345 + out, FeedWordPress will skip over the source and try again during
346 + the next update cycle.</p>
347 + <?php
348 + }
349 + function fetch_timeout_setting_value ($setting, $defaulted, $params) {
350 + print number_format(intval($setting)) . " " . (($setting==1) ? "second" : "seconds");
351 + }
352 +
353 + function fetch_settings_box ($page, $box = NULL) {
354 + $this->setting_radio_control(
355 + 'fetch timeout', 'fetch_timeout',
356 + array(&$this, 'fetch_timeout_setting'),
357 + array(
358 + 'global-setting-default' => FEEDWORDPRESS_FETCH_TIMEOUT_DEFAULT,
359 + 'input-name' => 'fetch_timeout',
360 + 'default-input-name' => 'fetch_timeout_default',
361 + 'labels' => array(&$this, 'fetch_timeout_setting_value'),
362 + )
363 + );
364 + } /* FeedWordPressFeedsPage::fetch_settings_box () */
365 +
316 366 function feed_information_box ($page, $box = NULL) {
317 367 global $wpdb;
368 + $link_rss_params = maybe_unserialize($page->setting('query parameters', ''));
369 + if (!is_array($link_rss_params)) :
370 + $link_rss_params = array();
371 + endif;
372 +
318 373 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);
374 + $info['name'] = esc_html($page->link->link->link_name);
375 + $info['description'] = esc_html($page->link->link->link_description);
376 + $info['url'] = esc_html($page->link->link->link_url);
322 377 $rss_url = $page->link->link->link_rss;
323 378
324 379 $hardcode['name'] = $page->link->hardcode('name');
325 380 $hardcode['description'] = $page->link->hardcode('description');
@@ -325,26 +380,29 @@
325 380 $hardcode['description'] = $page->link->hardcode('description');
326 381 $hardcode['url'] = $page->link->hardcode('url');
327 382 else :
328 383 $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 - ));
384 +
385 + $params = array();
386 + if (FeedWordPressCompatibility::test_version(FWP_SCHEMA_USES_ARGS_TAXONOMY)) :
387 + $params['taxonomy'] = 'link_category';
388 + else :
389 + $params['type'] = 'link';
390 + endif;
391 + $params['hide_empty'] = false;
392 + $results = get_categories($params);
334 393
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;
394 + // Guarantee that the Contributors category will be in the drop-down chooser, even if it is empty.
395 + $found_link_category_id = false;
396 + foreach ($results as $row) :
397 + // Normalize case
398 + if (!isset($row->cat_id)) : $row->cat_id = $row->cat_ID; endif;
340 399
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");
400 + if ($row->cat_id == $cat_id) : $found_link_category_id = true; endif;
401 + endforeach;
402 +
403 + if (!$found_link_category_id) :
404 + $results[] = get_category($cat_id);
347 405 endif;
348 406
349 407 $info = array();
350 408 $rss_url = null;
@@ -355,15 +413,8 @@
355 413 endif;
356 414
357 415 // Hey ho, let's go
358 416 ?>
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 417 <table class="edit-form">
367 418
368 419 <?php if ($page->for_feed_settings()) : ?>
369 420
@@ -368,14 +419,76 @@
368 419 <?php if ($page->for_feed_settings()) : ?>
369 420
370 421 <tr>
371 422 <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>
423 + <td><a href="<?php echo esc_html($rss_url); ?>"><?php echo esc_html($rss_url); ?></a>
373 424 (<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>
425 + title="Check feed &lt;<?php echo esc_html($rss_url); ?>&gt; for validity">validate</a>)
426 + <input type="submit" name="feedfinder" value="switch &rarr;" style="font-size:smaller" />
427 +
428 + <table id="link-rss-params">
429 + <tbody>
430 + <?php
431 + $link_rss_params['new'] = array('', '');
432 + $i = 0;
433 + foreach ($link_rss_params as $index => $pair) :
434 + ?>
435 + <tr class="link-rss-params-row" id="link-rss-params-<?php print $index; ?>">
436 + <td><label>Parameter: <input type="text" class="link_params_key"
437 + name="link_rss_params_key[<?php print $index; ?>]" value="<?php print esc_html($pair[0]); ?>"
438 + size="5" style="width: 5em" placeholder="name" /></label></td>
439 + <td class="link-rss-params-value-cell"><label class="link_params_value_label">= <input type="text" class="link_params_value"
440 + name="link_rss_params_value[<?php print $index; ?>]" value="<?php print esc_html($pair[1]); ?>"
441 + size="8" placeholder="value" /></label></td>
376 442 </tr>
443 + <?php
444 + $i++;
445 + endforeach;
446 + ?>
447 + </tbody>
448 + </table>
449 +
450 + <div><input type="hidden" id="link-rss-params-num" name="link_rss_params_num" value="<?php print $i; ?>" /></div>
451 +
452 + <script type="text/javascript">
453 + function linkParamsRowRemove (element) {
454 + jQuery(element).closest('tr').fadeOut('slow', function () {
455 + jQuery(this).remove();
456 + } );
457 + }
377 458
459 + 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');
460 +
461 + jQuery('#link-rss-params-new').hide();
462 + jQuery('<a class="add-remove" id="link-rss-params-add" href="#">+ Add a query parameter</a>').insertAfter('#link-rss-params');
463 + jQuery('#link-rss-params-add').click( function () {
464 + var next = jQuery('#link-rss-params-num').val();
465 + var newRow = jQuery('#link-rss-params-new').clone().attr('id', 'link-rss-params-'+next);
466 + newRow.find('.link_params_key').attr('name', 'link_rss_params_key['+next+']');
467 + newRow.find('.link_params_value').attr('name', 'link_rss_params_value['+next+']');
468 +
469 + newRow.find('.link-rss-params-remove').click( function () {
470 + linkParamsRowRemove(this);
471 + return false;
472 + } );
473 +
474 + newRow.appendTo('#link-rss-params');
475 + newRow.show();
476 +
477 + // Update counter for next row.
478 + next++;
479 + jQuery('#link-rss-params-num').val(next);
480 +
481 + return false;
482 + } );
483 + jQuery('.link-rss-params-remove').click( function () {
484 + linkParamsRowRemove(this);
485 + return false;
486 + } );
487 + </script>
488 + </td>
489 + </tr>
490 +
378 491 <?php
379 492 $rows = array(
380 493 "name" => __('Link Name'),
381 494 "description" => __('Short Description'),
@@ -423,9 +536,9 @@
423 536 echo "\n\t<option value=\"$row->cat_id\"";
424 537 if ($row->cat_id == $cat_id) :
425 538 echo " selected='selected'";
426 539 endif;
427 - echo ">$row->cat_id: ".wp_specialchars($row->cat_name);
540 + echo ">$row->cat_id: ".esc_html($row->cat_name);
428 541 echo "</option>\n";
429 542 endforeach;
430 543 ?></select></p>
431 544 <p class="setting-description">FeedWordPress will syndicate the
@@ -453,20 +566,8 @@
453 566 </table>
454 567 <?php
455 568 } /* FeedWordPressFeedsPage::feed_information_box() */
456 569
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 570 function custom_settings_box ($page, $box = NULL) {
470 571 ?>
471 572 <p class="setting-description">These custom settings are special fields for the <strong>feed</strong> you are
472 573 syndicating, to be retrieved in templates using the <code>get_feed_meta()</code> function. They do not create
@@ -486,11 +587,11 @@
486 587 foreach ($page->link->settings as $key => $value) :
487 588 if (!preg_match("\007^((".implode(')|(', $page->special_settings)."))$\007i", $key)) :
488 589 ?>
489 590 <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>
591 + <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo esc_html($key); ?>" />
592 + <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo esc_html($key); ?>" /></th>
593 + <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 594 <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
494 595 <option value="update">save changes</option>
495 596 <option value="delete">delete this setting</option>
496 597 </select></td>
@@ -514,66 +615,107 @@
514 615 global $wpdb;
515 616
516 617 $lookup = (isset($_REQUEST['lookup']) ? $_REQUEST['lookup'] : NULL);
517 618
619 + $feeds = array(); $feedSwitch = false; $current = null;
518 620 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');
621 + $feedSwitch = true;
622 + if (is_null($lookup)) :
623 + // Switch Feed without a specific feed yet suggested
624 + // Go to the human-readable homepage to look for
625 + // auto-detection links
626 + $lookup = $this->link->link->link_url;
627 +
628 + // Guarantee that you at least have the option to
629 + // stick with what works.
630 + $current = $this->link->link->link_rss;
631 + $feeds[] = $current;
632 + endif;
633 + $name = esc_html($this->link->link->link_name);
521 634 else: // Or a new subscription to add?
522 - $name = "Subscribe to <code>".wp_specialchars(feedwordpress_display_url($lookup))."</code>";
635 + $name = "Subscribe to <code>".esc_html(feedwordpress_display_url($lookup))."</code>";
523 636 endif;
524 637 ?>
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">
638 + <div class="wrap" id="feed-finder">
551 639 <h2>Feed Finder: <?php echo $name; ?></h2>
552 640
553 641 <?php
554 - $f =& new FeedFinder($lookup);
555 - $feeds = $f->find();
642 + if ($feedSwitch) :
643 + $this->display_alt_feed_box($lookup);
644 + endif;
645 +
646 + $finder = array();
647 + if (!is_null($current)) :
648 + $finder[$current] = new FeedFinder($current);
649 + endif;
650 + $finder[$lookup] = new FeedFinder($lookup);
651 +
652 + foreach ($finder as $url => $ff) :
653 + $feeds = array_merge($feeds, $ff->find());
654 + endforeach;
655 +
656 + $feeds = array_values( // Renumber from 0..(N-1)
657 + array_unique( // Eliminate duplicates
658 + $feeds
659 + )
660 + );
661 +
556 662 if (count($feeds) > 0):
663 + if ($feedSwitch) :
664 + ?>
665 + <h3>Feeds Found</h3>
666 + <?php
667 + endif;
668 +
669 + if (count($feeds) > 1) :
670 + $option_template = 'Option %d: ';
671 + $form_class = ' class="multi"';
672 + ?>
673 + <p><strong>This web page provides at least <?php print count($feeds); ?> different feeds.</strong> These feeds may provide the same information
674 + in different formats, or may track different items. (You can check the Feed Information and the
675 + 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>
676 + <?php
677 + else :
678 + $option_template = '';
679 + $form_class = '';
680 + endif;
681 +
557 682 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']:'';
683 + $pie = FeedWordPress::fetch($f);
684 + $rss = (is_wp_error($pie) ? $pie : new MagpieFromSimplePie($pie));
685 +
686 + if ($rss and !is_wp_error($rss)):
687 + $feed_link = (isset($rss->channel['link'])?$rss->channel['link']:'');
688 + $feed_title = (isset($rss->channel['title'])?$rss->channel['title']:$feed_link);
562 689 $feed_type = ($rss->feed_type ? $rss->feed_type : 'Unknown');
690 + $feed_version_template = '%.1f';
691 + $feed_version = $rss->feed_version;
563 692 else :
564 693 // Give us some sucky defaults
565 694 $feed_title = feedwordpress_display_url($lookup);
566 695 $feed_link = $lookup;
567 696 $feed_type = 'Unknown';
697 + $feed_version_template = '';
698 + $feed_version = '';
568 699 endif;
569 700 ?>
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>
701 + <form<?php print $form_class; ?> action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication.php" method="post">
702 + <div class="inside"><?php FeedWordPressCompatibility::stamp_nonce('feedwordpress_switchfeed'); ?>
574 703
575 704 <?php
705 + $classes = array('feed-found'); $currentFeed = '';
706 + if (!is_null($current) and $current==$f) :
707 + $classes[] = 'current';
708 + $currentFeed = ' (currently subscribed)';
709 + endif;
710 + if ($key%2) :
711 + $classes[] = 'alt';
712 + endif;
713 + ?>
714 + <fieldset class="<?php print implode(" ", $classes); ?>">
715 + <legend><?php printf($option_template, ($key+1)); print $feed_type." "; printf($feed_version_template, $feed_version); ?> feed<?php print $currentFeed; ?></legend>
716 +
717 + <?php
576 718 $this->stamp_link_id();
577 719
578 720 // No feed specified = add new feed; we
579 721 // need to pass along a starting title
@@ -579,25 +721,26 @@
579 721 // need to pass along a starting title
580 722 // and homepage URL for the new Link.
581 723 if (!$this->for_feed_settings()):
582 724 ?>
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'); ?>" />
725 + <input type="hidden" name="feed_title" value="<?php echo esc_html($feed_title); ?>" />
726 + <input type="hidden" name="feed_link" value="<?php echo esc_html($feed_link); ?>" />
585 727 <?php
586 728 endif;
587 729 ?>
588 730
589 - <input type="hidden" name="feed" value="<?php echo wp_specialchars($f, 'both'); ?>" />
731 + <input type="hidden" name="feed" value="<?php echo esc_html($f); ?>" />
590 732 <input type="hidden" name="action" value="switchfeed" />
591 733
592 734 <div>
593 735 <div class="feed-sample">
594 -
595 736 <?php
596 - if (count($rss->items) > 0):
737 + $link = NULL;
738 + $post = NULL;
739 + if (!is_wp_error($rss) and count($rss->items) > 0):
597 740 // Prepare to display Sample Item
598 - $link =& new MagpieMockLink($rss, $f);
599 - $post =& new SyndicatedPost($rss->items[0], $link);
741 + $link = new MagpieMockLink(array('simplepie' => $pie, 'magpie' => $rss), $f);
742 + $post = new SyndicatedPost(array('simplepie' => $rss->originals[0], 'magpie' => $rss->items[0]), $link);
600 743 ?>
601 744 <h3>Sample Item</h3>
602 745 <ul>
603 746 <li><strong>Title:</strong> <a href="<?php echo $post->post['meta']['syndication_permalink']; ?>"><?php echo $post->post['post_title']; ?></a></li>
@@ -606,15 +749,16 @@
606 749 <div class="entry">
607 750 <?php print $post->post['post_content']; ?>
608 751 </div>
609 752 <?php
753 + do_action('feedwordpress_feed_finder_sample_item', $f, $post, $link);
610 754 else:
611 - if (magpie_error()) :
755 + if (is_wp_error($rss)) :
612 756 print '<div class="feed-problem">';
613 757 print "<h3>Problem:</h3>\n";
614 758 print "<p>FeedWordPress encountered the following error
615 759 when trying to retrieve this feed:</p>";
616 - print '<p style="margin: 1.0em 3.0em"><code>'.magpie_error().'</code></p>';
760 + print '<p style="margin: 1.0em 3.0em"><code>'.$rss->get_error_message().'</code></p>';
617 761 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 762 print "</div>";
619 763 endif;
620 764 ?>
@@ -628,171 +772,207 @@
628 772 <div>
629 773 <h3>Feed Information</h3>
630 774 <ul>
631 775 <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>
776 + <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>
777 + <li><strong>Encoding:</strong> <?php echo isset($rss->encoding)?esc_html($rss->encoding):"<em>Unknown</em>"; ?></li>
778 + <li><strong>Description:</strong> <?php echo isset($rss->channel['description'])?esc_html($rss->channel['description']):"<em>Unknown</em>"; ?></li>
635 779 </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>
780 + <?php do_action('feedwordpress_feedfinder_form', $f, $post, $link, $this->for_feed_settings()); ?>
781 + <div class="submit"><input type="submit" class="button-primary" name="Use" value="&laquo; Use this feed" />
782 + <input type="submit" class="button" name="Cancel" value="× Cancel" /></div>
638 783 </div>
639 784 </div>
640 785 </fieldset>
786 + </div> <!-- class="inside" -->
641 787 </form>
642 788 <?php
789 + unset($link);
790 + unset($post);
643 791 endforeach;
644 792 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>";
793 + foreach ($finder as $url => $ff) :
794 + $url = esc_html($url);
795 + print "<h3>Searched for feeds at ${url}</h3>\n";
796 + print "<p><strong>".__('Error').":</strong> ".__("FeedWordPress couldn't find any feeds at").' <code><a href="'.htmlspecialchars($lookup).'">'.htmlspecialchars($lookup).'</a></code>';
797 + print ". ".__('Try another URL').".</p>";
647 798
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;
799 + // Diagnostics
800 + print "<div class=\"updated\" style=\"margin-left: 3.0em; margin-right: 3.0em;\">\n";
801 + print "<h3>".__('Diagnostic information')."</h3>\n";
802 + if (!is_null($ff->error()) and strlen($ff->error()) > 0) :
803 + print "<h4>".__('HTTP request failure')."</h4>\n";
804 + print "<p>".$ff->error()."</p>\n";
805 + else :
806 + print "<h4>".__('HTTP request completed')."</h4>\n";
807 + print "<p><strong>Status ".$ff->status().":</strong> ".$this->HTTPStatusMessages[(int) $ff->status()]."</p>\n";
808 + endif;
658 809
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();
810 + // Do some more diagnostics if the API for it is available.
811 + if (function_exists('_wp_http_get_object')) :
812 + $httpObject = _wp_http_get_object();
813 + $transports = $httpObject->_getTransport();
814 +
815 + print "<h4>".__('HTTP Transports available').":</h4>\n";
816 + print "<ol>\n";
817 + print "<li>".implode("</li>\n<li>", array_map('get_class', $transports))."</li>\n";
818 + print "</ol>\n";
819 + print "</div>\n";
820 + endif;
821 + endforeach;
822 + endif;
823 +
824 + if (!$feedSwitch) :
825 + $this->display_alt_feed_box($lookup, /*alt=*/ true);
826 + endif;
827 + ?>
828 + </div> <!-- class="wrap" -->
829 + <?php
830 + return false; // Don't continue
831 + } /* FeedWordPressFeedsPage::display_feedfinder() */
663 832
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";
669 - endif;
670 -
671 - endif;
672 - ?>
673 - </div>
674 -
833 + function display_alt_feed_box ($lookup, $alt = false) {
834 + global $fwp_post;
835 + ?>
675 836 <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" />
837 + <div class="inside"><?php
838 + FeedWordPressCompatibility::stamp_nonce($this->dispatch);
839 + ?>
840 + <fieldset class="alt"
841 + <?php if (!$alt): ?>style="margin: 1.0em 3.0em; font-size: smaller;"<?php endif; ?>>
842 + <legend><?php if ($alt) : ?>Alternative feeds<?php else: ?>Find feeds<?php endif; ?></legend>
843 + <?php if ($alt) : ?><h3>Use a different feed</h3><?php endif; ?>
844 + <div><label>Address:
845 + <input type="text" name="lookup" id="use-another-feed"
846 + placeholder="URL"
847 + <?php if (is_null($lookup)) : ?>
848 + value="URL"
849 + <?php else : ?>
850 + value="<?php print esc_html($lookup); ?>"
851 + <?php endif; ?>
852 + size="64" style="max-width: 80%" /></label>
853 + <?php if (is_null($lookup)) : ?>
683 854 <?php FeedWordPressSettingsUI::magic_input_tip_js('use-another-feed'); ?>
855 + <?php endif; ?>
684 856 <?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>
857 + <input type="hidden" name="action" value="feedfinder" />
858 + <input type="submit" class="button<?php if ($alt): ?>-primary<?php endif; ?>" value="Check &raquo;" /></div>
859 + <p>This can be the address of a feed, or of a website. FeedWordPress
860 + will try to automatically detect any feeds associated with a
861 + website.</p>
862 + </div> <!-- class="inside" -->
863 + </fieldset></form>
864 +
689 865 <?php
690 - return false; // Don't continue
691 - } /* WordPressFeedsPage::display_feedfinder() */
692 -
693 - function accept_POST ($post) {
694 - global $wpdb;
695 -
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'];
866 + } /* FeedWordPressFeedsPage::display_alt_feed_box() */
867 +
868 + function save_settings ($post) {
869 + if ($this->for_feed_settings()) :
870 + if (isset($post['link_rss_params_key'])) :
871 + $qp = array();
872 + foreach ($post['link_rss_params_key'] as $index => $key) :
873 + if (strlen($key) > 0) :
874 + if (isset($post['link_rss_params_value'][$index])
875 + and strlen($post['link_rss_params_value'][$index])) :
876 + $value = $post['link_rss_params_value'][$index];
877 + $qp[] = array($key, $value);
878 + endif;
710 879 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 880 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'];
881 + $this->update_setting('query parameters', serialize($qp));
882 + endif;
883 +
884 + // custom feed settings first
885 + foreach ($post['notes'] as $mn) :
886 + $mn['key0'] = (isset($mn['key0']) ? trim($mn['key0']) : NULL);
887 + $mn['key1'] = trim($mn['key1']);
888 + if (preg_match("\007^(("
889 + .implode(')|(',$this->special_settings)
890 + ."))$\007i",
891 + $mn['key1'])) :
892 + $mn['key1'] = 'user/'.$mn['key1'];
735 893 endif;
736 894
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;
895 + if (strlen($mn['key0']) > 0) :
896 + unset($this->link->settings[$mn['key0']]); // out with the old
743 897 endif;
744 898
745 - $alter[] = "link_notes = '".$wpdb->escape($this->link->settings_to_notes())."'";
899 + if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
900 + $this->link->settings[$mn['key1']] = $mn['value']; // in with the new
901 + endif;
902 + endforeach;
903 +
904 + // now stuff through the web form
905 + // hardcoded feed info
906 +
907 + foreach (array('name', 'description', 'url') as $what) :
908 + // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
909 + $this->link->settings["hardcode {$what}"] = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
910 + if (FeedWordPress::affirmative($this->link->settings, "hardcode {$what}")) :
911 + $this->link->link->{'link_'.$what} = $post['link'.$what];
912 + endif;
913 + endforeach;
914 +
915 + // Update scheduling
916 + if (isset($post['update_schedule'])) :
917 + $this->link->settings['update/hold'] = $post['update_schedule'];
918 + endif;
746 919
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);
920 + if (isset($post['use_default_update_window']) and strtolower($post['use_default_update_window'])=='yes') :
921 + unset($this->link->settings['update/window']);
922 + elseif (isset($post['update_window'])):
923 + if ((int) $post['update_window'] > 0) :
924 + $this->link->settings['update/window'] = (int) $post['update_window'];
760 925 endif;
761 - $this->link = new SyndicatedLink($this->link->id);
926 + endif;
927 +
928 + else :
929 + // Global
930 + update_option('feedwordpress_cat_id', $post['syndication_category']);
931 +
932 + if (!isset($post['automatic_updates']) or !in_array($post['automatic_updates'], array('init', 'shutdown'))) :
933 + $automatic_updates = NULL;
762 934 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'];
935 + $automatic_updates = $post['automatic_updates'];
936 + endif;
937 + update_option('feedwordpress_automatic_updates', $automatic_updates);
938 +
939 + if (isset($post['update_window'])):
940 + if ((int) $post['update_window'] > 0) :
941 + update_option('feedwordpress_update_window', (int) $post['update_window']);
770 942 endif;
771 - update_option('feedwordpress_automatic_updates', $automatic_updates);
943 + endif;
772 944
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;
945 + update_option('feedwordpress_update_time_limit', ($post['update_time_limit']=='yes')?(int) $post['time_limit_seconds']:0);
778 946
779 - update_option('feedwordpress_update_time_limit', ($post['update_time_limit']=='yes')?(int) $post['time_limit_seconds']:0);
947 + foreach (array('name', 'description', 'url') as $what) :
948 + // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
949 + $hardcode = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
950 + update_option("feedwordpress_hardcode_{$what}", $hardcode);
951 + endforeach;
952 +
953 + endif;
954 +
955 + if (isset($post['fetch_timeout'])) :
956 + if (isset($post['fetch_timeout_default']) and $post['fetch_timeout_default']=='yes') :
957 + $timeout = NULL;
958 + else :
959 + $timeout = $post['fetch_timeout'];
960 + endif;
780 961
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;
962 + if (is_int($timeout)) :
963 + $timeout = intval($timeout);
788 964 endif;
965 + $this->update_setting('fetch timeout', $timeout);
966 + endif;
789 967
790 - // Probably a "Go" button for the drop-down
791 - else :
792 - $this->updated = false;
968 + if (isset($post['update_minimum'])) :
969 + $this->update_setting('update/minimum', $post['update_minimum']);
793 970 endif;
794 - } /* WordPressFeedsPage::accept_POST() */
971 +
972 + $this->updatedPosts->accept_POST($post);
973 + parent::save_settings($post);
974 + } /* FeedWordPressFeedsPage::save_settings() */
795 975
796 976 } /* class FeedWordPressFeedsPage */
797 977
798 978 $feedsPage = new FeedWordPressFeedsPage;