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