PluginProbe
FeedWordPress / 2011.0211
FeedWordPress v2011.0211
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 +531 -399 2010.01272011.0211 View file →
@@ -46,151 +46,127 @@
46 46 505 => 'HTTP Version Not Supported',
47 47 );
48 48 var $updatedPosts = NULL;
49 49
50 - /**
51 - * Constructs the Feeds page object
52 - *
53 - * @param mixed $link An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings
54 - */
55 - function FeedWordPressFeedsPage ($link = -1) {
56 - if (is_numeric($link) and -1 == $link) :
57 - $link = FeedWordPressAdminPage::submitted_link();
58 - endif;
59 -
60 - FeedWordPressAdminPage::FeedWordPressAdminPage('feedwordpressfeeds', $link);
61 -
62 - $this->dispatch = get_class($this);
63 - $this->filename = __FILE__;
64 - $this->updatedPosts = new UpdatedPostsControl($this);
65 - } /* FeedWordPressFeedsPage constructor */
66 -
67 50 var $special_settings = array ( /* Regular expression syntax is OK here */
68 51 'cats',
69 52 'cat_split',
53 + 'fetch timeout',
54 + 'freeze updates',
70 55 'hardcode name',
71 56 'hardcode url',
72 57 'hardcode description',
73 58 'hardcode categories', /* Deprecated */
74 - 'post status',
75 59 'comment status',
60 + 'terms',
61 + 'map authors',
62 + 'munge permalink',
76 63 'ping status',
64 + 'post status',
65 + 'postmeta',
66 + 'query parameters',
67 + 'resolve relative',
68 + 'syndicated post type',
69 + 'tags',
77 70 'unfamiliar author',
78 71 'unfamliar categories', /* Deprecated */
79 72 'unfamiliar category',
80 - 'map authors',
81 - 'tags',
82 - 'postmeta',
83 - 'resolve relative',
84 - 'freeze updates',
73 + 'unfamiliar post_tag',
74 + 'add/.*',
85 75 'update/.*',
86 76 'feed/.*',
87 77 'link/.*',
78 + 'match/.*',
88 79 );
89 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 +
90 105 function display () {
91 - global $wpdb;
92 106 global $fwp_post;
93 107 global $post_source;
94 -
95 - if (FeedWordPress::needs_upgrade()) :
96 - fwp_upgrade_page();
97 - return;
98 - endif;
99 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 +
100 120 // Allow overriding of normal source for FeedFinder, which may
101 121 // be called from multiple points.
102 122 if (isset($post_source) and !is_null($post_source)) :
103 123 $source = $post_source;
104 124 else :
105 - $source = get_class($this);
125 + $source = $this->dispatch;
106 126 endif;
107 127
108 - // If this is a POST, validate source and user credentials
109 - FeedWordPressCompatibility::validate_http_request(/*action=*/ $source, /*capability=*/ 'manage_links');
110 -
111 128 if (isset($_REQUEST['feedfinder'])
112 129 or (isset($_REQUEST['action']) and $_REQUEST['action']=='feedfinder')
113 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 +
114 134 return $this->display_feedfinder(); // re-route to Feed Finder page
115 - else :
116 - if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') :
117 - $this->accept_POST($fwp_post);
118 - do_action('feedwordpress_admin_page_feeds_save', $GLOBALS['fwp_post'], $this);
119 - endif;
120 -
121 - ////////////////////////////////////////////////
122 - // Prepare settings page ///////////////////////
123 - ////////////////////////////////////////////////
124 -
125 - $this->ajax_interface_js();
126 - $this->display_update_notice_if_updated('Syndicated feed');
127 - $this->open_sheet('Feed and Update');
128 - ?>
129 - <div id="post-body">
130 - <?php
131 - ////////////////////////////////////////////////
132 - // Display settings boxes //////////////////////
133 - ////////////////////////////////////////////////
134 -
135 - $boxes_by_methods = array(
136 - 'feed_information_box' => __('Feed Information'),
137 - 'global_feeds_box' => __('Update Scheduling'),
138 - 'updated_posts_box' => __('Updated Posts'),
139 - 'posts_box' => __('Syndicated Posts, Links, Comments & Pings'),
140 - 'authors_box' => __('Syndicated Authors'),
141 - 'categories_box' => __('Categories'.FEEDWORDPRESS_AND_TAGS),
142 - 'custom_settings_box' => __('Custom Feed Settings (for use in templates)'),
143 - );
144 - if ($this->for_default_settings()) :
145 - unset($boxes_by_methods['custom_settings_box']);
146 - endif;
147 -
148 - foreach ($boxes_by_methods as $method => $row) :
149 - if (is_array($row)) :
150 - $id = $row['id'];
151 - $title = $row['title'];
152 - else :
153 - $id = 'feedwordpress_'.$method;
154 - $title = $row;
155 - endif;
156 -
157 - fwp_add_meta_box(
158 - /*id=*/ $id,
159 - /*title=*/ $title,
160 - /*callback=*/ array(get_class($this), $method),
161 - /*page=*/ $this->meta_box_context(),
162 - /*context=*/ $this->meta_box_context()
163 - );
164 - endforeach;
165 - do_action('feedwordpress_admin_page_feeds_meta_boxes', $this);
166 - ?>
167 - <div class="metabox-holder">
168 - <?php
169 - fwp_do_meta_boxes($this->meta_box_context(), $this->meta_box_context(), $this);
170 - ?>
171 - </div> <!-- class="metabox-holder" -->
172 - </div> <!-- id="post-body" -->
173 - <?php $this->close_sheet(); ?>
135 + endif;
174 136
175 - <script type="text/javascript">
176 - var els = ['name', 'description', 'url'];
177 - for (var i = 0; i < els.length; i++) {
178 - contextual_appearance(
179 - /*item=*/ 'basics-hardcode-'+els[i],
180 - /*appear=*/ 'basics-'+els[i]+'-view',
181 - /*disappear=*/ 'basics-'+els[i]+'-edit',
182 - /*value=*/ 'no',
183 - /*visibleStyle=*/ 'block',
184 - /*checkbox=*/ true
185 - );
186 - } /* for */
187 - </script>
188 - <?php
189 - endif;
137 + parent::display();
190 138 return false; // Don't continue
191 139 } /* FeedWordPressFeedsPage::display() */
192 140
141 + function ajax_interface_js () {
142 + FeedWordPressAdminPage::ajax_interface_js();
143 + ?>
144 +
145 + jQuery(document).ready( function () {
146 + contextual_appearance('automatic-updates-selector', 'cron-job-explanation', null, 'no');
147 + contextual_appearance('time-limit', 'time-limit-box', null, 'yes');
148 + contextual_appearance('use-default-update-window-no', 'update-scheduling-note', null, null, 'block', true);
149 + jQuery('#use-default-update-window-yes, #use-default-update-window-no').click( function () {
150 + contextual_appearance('use-default-update-window-no', 'update-scheduling-note', null, null, 'block', true);
151 + } );
152 +
153 + var els = ['name', 'description', 'url'];
154 + for (var i = 0; i < els.length; i++) {
155 + contextual_appearance(
156 + /*item=*/ 'basics-hardcode-'+els[i],
157 + /*appear=*/ 'basics-'+els[i]+'-view',
158 + /*disappear=*/ 'basics-'+els[i]+'-edit',
159 + /*value=*/ 'no',
160 + /*visibleStyle=*/ 'block',
161 + /*checkbox=*/ true
162 + );
163 + } /* for */
164 + } );
165 +
166 + <?php
167 + }
168 +
193 169 /*static*/ function updated_posts_box ($page, $box = NULL) {
194 170 ?>
195 171 <table class="edit-form">
196 172 <?php $page->updatedPosts->display(); ?>
@@ -198,24 +174,16 @@
198 174 <?php
199 175 } /* FeedWordPressFeedsPage::updated_posts_box() */
200 176
201 177 /*static*/ function global_feeds_box ($page, $box = NULL) {
202 - global $wpdb;
178 + $automatic_updates = get_option('feedwordpress_automatic_updates');
179 + $update_time_limit = (int) get_option('feedwordpress_update_time_limit');
203 180
204 - $defaultUpdateWindow = get_option('feedwordpress_update_window');
205 - if (!is_numeric($defaultUpdateWindow)) :
206 - $defaultUpdateWindow = DEFAULT_UPDATE_PERIOD;
207 - else :
208 - $defaultUpdateWindow = (int) $defaultUpdateWindow;
209 - endif;
181 + // Hey, ho, let's go...
210 182 ?>
211 -
183 +
212 184 <table class="edit-form">
213 - <?php
214 - if ($page->for_default_settings()) :
215 - $automatic_updates = get_option('feedwordpress_automatic_updates');
216 - $update_time_limit = (int) get_option('feedwordpress_update_time_limit');
217 - ?>
185 + <?php if ($page->for_default_settings()) : ?>
218 186
219 187 <tr>
220 188 <th scope="row">Updates:</th>
221 189 <td><select id="automatic-updates-selector" name="automatic_updates" size="1" onchange="contextual_appearance('automatic-updates-selector', 'cron-job-explanation', null, 'no');">
@@ -225,11 +193,11 @@
225 193 </select>
226 194 <div id="cron-job-explanation" class="setting-description">
227 195 <p>If you want to use a cron job,
228 196 you can perform scheduled updates by sending regularly-scheduled
229 - 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>
230 198 For example, inserting the following line in your crontab:</p>
231 - <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>
232 200 <p class="setting-description">will check in every 10 minutes
233 201 and check for updates on any feeds that are ready to be polled for updates.</p>
234 202 </div>
235 203 </td>
@@ -234,39 +202,10 @@
234 202 </div>
235 203 </td>
236 204 </tr>
237 205
238 - <tr>
239 - <th scope="row"><?php print __('Update scheduling:') ?></th>
240 - <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>
241 - <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>
242 - <div class="setting-description">
243 - <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>
244 - <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>
245 - </div></td>
246 - </tr>
247 -
248 - <tr>
249 - <th scope="row"><?php print __('Time limit on updates'); ?>:</th>
250 - <td><select id="time-limit" name="update_time_limit" size="1" onchange="contextual_appearance('time-limit', 'time-limit-box', null, 'yes');">
251 - <option value="no"<?php echo ($update_time_limit>0)?'':' selected="selected"'; ?>>no time limit on updates</option>
252 - <option value="yes"<?php echo ($update_time_limit>0)?' selected="selected"':''; ?>>limit updates to no more than...</option>
253 - </select>
254 - <span id="time-limit-box"><label><input type="text" name="time_limit_seconds" value="<?php print $update_time_limit; ?>" size="5" /> seconds</label></span>
255 - </tr>
206 + <?php else : /* Feed-specific settings */ ?>
256 207
257 - <?php else :
258 - $useDefaultUpdateWindow = !(isset($page->link->settings['update/window']));
259 -
260 - $updateWindow = (isset($page->link->settings['update/window']) ? $page->link->settings['update/window'] : null);
261 - if (!is_numeric($updateWindow)) :
262 - $updateWindow = 60;
263 - else :
264 - $updateWindow = (int) $updateWindow;
265 - endif;
266 -
267 - ?>
268 -
269 208 <tr>
270 209 <th scope="row"><?php _e('Last update') ?>:</th>
271 210 <td><?php
272 211 if (isset($page->link->settings['update/last'])) :
@@ -301,39 +240,116 @@
301 240 ?></option>
302 241 <option value="next"<?php echo ($holdem=='next')?' selected="selected"':''; ?>>update ASAP</option>
303 242 <option value="ping"<?php echo ($holdem=='ping')?' selected="selected"':''; ?>>update only when pinged</option>
304 243 </select></td></tr>
305 -
244 +
245 + <?php endif; ?>
246 +
306 247 <tr>
307 248 <th scope="row"><?php print __('Update scheduling:') ?></th>
308 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>
309 - <ul>
310 - <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>
311 - <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>
312 - </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()) : ?>
313 267
314 - <div class="setting-description">
315 - <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>
316 - <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>
317 - </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>
318 275 </tr>
276 +
319 277 <?php endif; ?>
278 +
279 + </table>
280 +
281 + <?php
282 + } /* FeedWordPressFeedsPage::global_feeds_box() */
320 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));
321 309
322 -</table>
323 -<script type="text/javascript">
324 -contextual_appearance('automatic-updates-selector', 'cron-job-explanation', null, 'no');
325 -contextual_appearance('time-limit', 'time-limit-box', null, 'yes');
326 -</script>
327 -<?php
328 - } /* FeedWordPressFeedsPage::global_feeds_box() */
329 -
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 +
330 341 function feed_information_box ($page, $box = NULL) {
331 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 +
332 348 if ($page->for_feed_settings()) :
333 - $info['name'] = wp_specialchars($page->link->link->link_name, 1);
334 - $info['description'] = wp_specialchars($page->link->link->link_description, 'both');
335 - $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);
336 352 $rss_url = $page->link->link->link_rss;
337 353
338 354 $hardcode['name'] = $page->link->hardcode('name');
339 355 $hardcode['description'] = $page->link->hardcode('description');
@@ -339,26 +355,29 @@
339 355 $hardcode['description'] = $page->link->hardcode('description');
340 356 $hardcode['url'] = $page->link->hardcode('url');
341 357 else :
342 358 $cat_id = FeedWordPress::link_category_id();
343 - if (FeedWordPressCompatibility::test_version(FWP_SCHEMA_21)) :
344 - $results = get_categories(array(
345 - "type" => 'link',
346 - "hide_empty" => false,
347 - ));
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);
348 368
349 - // Guarantee that the Contributors category will be in the drop-down chooser, even if it is empty.
350 - $found_link_category_id = false;
351 - foreach ($results as $row) :
352 - // Normalize case
353 - 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;
354 374
355 - if ($row->cat_id == $cat_id) : $found_link_category_id = true; endif;
356 - endforeach;
357 -
358 - if (!$found_link_category_id) : $results[] = get_category($cat_id); endif;
359 - else :
360 - $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);
361 380 endif;
362 381
363 382 $info = array();
364 383 $rss_url = null;
@@ -369,15 +388,8 @@
369 388 endif;
370 389
371 390 // Hey ho, let's go
372 391 ?>
373 - <style type="text/css">
374 - table.edit-form { width: 100%; }
375 - table.edit-form th { width: 25%; vertical-align: top; text-align: right; padding: 0.5em; }
376 - table.edit-form td { width: 75%; vertical-align: top; padding: 0.5em; }
377 - table.edit-form td ul.options { margin: 0; padding: 0; list-style: none; }
378 - </style>
379 -
380 392 <table class="edit-form">
381 393
382 394 <?php if ($page->for_feed_settings()) : ?>
383 395
@@ -382,14 +394,76 @@
382 394 <?php if ($page->for_feed_settings()) : ?>
383 395
384 396 <tr>
385 397 <th scope="row"><?php _e('Feed URL:') ?></th>
386 - <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>
387 399 (<a href="<?php echo FEEDVALIDATOR_URI; ?>?url=<?php echo urlencode($rss_url); ?>"
388 - title="Check feed &lt;<?php echo wp_specialchars($rss_url, 'both'); ?>&gt; for validity">validate</a>)
389 - <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>
390 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 + }
391 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 +
392 466 <?php
393 467 $rows = array(
394 468 "name" => __('Link Name'),
395 469 "description" => __('Short Description'),
@@ -437,9 +511,9 @@
437 511 echo "\n\t<option value=\"$row->cat_id\"";
438 512 if ($row->cat_id == $cat_id) :
439 513 echo " selected='selected'";
440 514 endif;
441 - echo ">$row->cat_id: ".wp_specialchars($row->cat_name);
515 + echo ">$row->cat_id: ".esc_html($row->cat_name);
442 516 echo "</option>\n";
443 517 endforeach;
444 518 ?></select></p>
445 519 <p class="setting-description">FeedWordPress will syndicate the
@@ -467,20 +541,8 @@
467 541 </table>
468 542 <?php
469 543 } /* FeedWordPressFeedsPage::feed_information_box() */
470 544
471 - function posts_box ($page, $box = NULL) {
472 - FeedWordPressSettingsUI::instead_of_posts_box($page->link->id);
473 - } /* FeedWordPressFeedsPage::posts_box() */
474 -
475 - function authors_box ($page, $box = NULL) {
476 - FeedWordPressSettingsUI::instead_of_authors_box($page->link->id);
477 - } /* FeedWordPressFeedsPage::authors_box() */
478 -
479 - function categories_box ($page, $box = NULL) {
480 - FeedWordPressSettingsUI::instead_of_categories_box($page->link->id);
481 - } /* FeedWordPressFeedsPage::categories_box() */
482 -
483 545 function custom_settings_box ($page, $box = NULL) {
484 546 ?>
485 547 <p class="setting-description">These custom settings are special fields for the <strong>feed</strong> you are
486 548 syndicating, to be retrieved in templates using the <code>get_feed_meta()</code> function. They do not create
@@ -500,11 +562,11 @@
500 562 foreach ($page->link->settings as $key => $value) :
501 563 if (!preg_match("\007^((".implode(')|(', $page->special_settings)."))$\007i", $key)) :
502 564 ?>
503 565 <tr style="vertical-align:top">
504 - <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo wp_specialchars($key, 'both'); ?>" />
505 - <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo wp_specialchars($key, 'both'); ?>" /></th>
506 - <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>
507 569 <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
508 570 <option value="update">save changes</option>
509 571 <option value="delete">delete this setting</option>
510 572 </select></td>
@@ -528,66 +590,107 @@
528 590 global $wpdb;
529 591
530 592 $lookup = (isset($_REQUEST['lookup']) ? $_REQUEST['lookup'] : NULL);
531 593
594 + $feeds = array(); $feedSwitch = false; $current = null;
532 595 if ($this->for_feed_settings()) : // Existing feed?
533 - if (is_null($lookup)) : $lookup = $this->link->link->link_url; endif;
534 - $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);
535 609 else: // Or a new subscription to add?
536 - $name = "Subscribe to <code>".wp_specialchars(feedwordpress_display_url($lookup))."</code>";
610 + $name = "Subscribe to <code>".esc_html(feedwordpress_display_url($lookup))."</code>";
537 611 endif;
538 612 ?>
539 - <style type="text/css">
540 - form.fieldset {
541 - clear: both;
542 - }
543 - .feed-sample {
544 - float: right;
545 - background-color: #D0D0D0;
546 - color: black;
547 - width: 45%;
548 - font-size: 70%;
549 - border-left: 1px dotted #A0A0A0;
550 - margin-left: 1.0em;
551 - }
552 - .feed-sample p, .feed-sample h3 {
553 - padding-left: 0.5em;
554 - padding-right: 0.5em;
555 - }
556 - .feed-sample .feed-problem {
557 - background-color: #ffd0d0;
558 - border-bottom: 1px dotted black;
559 - padding-bottom: 0.5em;
560 - margin-bottom: 0.5em;
561 - }
562 - </style>
563 -
564 - <div class="wrap">
613 + <div class="wrap" id="feed-finder">
565 614 <h2>Feed Finder: <?php echo $name; ?></h2>
566 615
567 616 <?php
568 - $f =& new FeedFinder($lookup);
569 - $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 +
570 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 +
571 657 foreach ($feeds as $key => $f):
572 - $rss = @fetch_rss($f);
573 - if ($rss):
574 - $feed_title = isset($rss->channel['title'])?$rss->channel['title']:$rss->channel['link'];
575 - $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);
576 664 $feed_type = ($rss->feed_type ? $rss->feed_type : 'Unknown');
665 + $feed_version_template = '%.1f';
666 + $feed_version = $rss->feed_version;
577 667 else :
578 668 // Give us some sucky defaults
579 669 $feed_title = feedwordpress_display_url($lookup);
580 670 $feed_link = $lookup;
581 671 $feed_type = 'Unknown';
672 + $feed_version_template = '';
673 + $feed_version = '';
582 674 endif;
583 675 ?>
584 - <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication.php" method="post">
585 - <div><?php FeedWordPressCompatibility::stamp_nonce('feedwordpress_switchfeed'); ?></div>
586 - <fieldset>
587 - <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'); ?>
588 678
589 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
590 693 $this->stamp_link_id();
591 694
592 695 // No feed specified = add new feed; we
593 696 // need to pass along a starting title
@@ -593,25 +696,26 @@
593 696 // need to pass along a starting title
594 697 // and homepage URL for the new Link.
595 698 if (!$this->for_feed_settings()):
596 699 ?>
597 - <input type="hidden" name="feed_title" value="<?php echo wp_specialchars($feed_title, 'both'); ?>" />
598 - <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); ?>" />
599 702 <?php
600 703 endif;
601 704 ?>
602 705
603 - <input type="hidden" name="feed" value="<?php echo wp_specialchars($f, 'both'); ?>" />
706 + <input type="hidden" name="feed" value="<?php echo esc_html($f); ?>" />
604 707 <input type="hidden" name="action" value="switchfeed" />
605 708
606 709 <div>
607 710 <div class="feed-sample">
608 -
609 711 <?php
610 - if (count($rss->items) > 0):
712 + $link = NULL;
713 + $post = NULL;
714 + if (!is_wp_error($rss) and count($rss->items) > 0):
611 715 // Prepare to display Sample Item
612 - $link =& new MagpieMockLink($rss, $f);
613 - $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);
614 718 ?>
615 719 <h3>Sample Item</h3>
616 720 <ul>
617 721 <li><strong>Title:</strong> <a href="<?php echo $post->post['meta']['syndication_permalink']; ?>"><?php echo $post->post['post_title']; ?></a></li>
@@ -620,15 +724,16 @@
620 724 <div class="entry">
621 725 <?php print $post->post['post_content']; ?>
622 726 </div>
623 727 <?php
728 + do_action('feedwordpress_feed_finder_sample_item', $f, $post, $link);
624 729 else:
625 - if (magpie_error()) :
730 + if (is_wp_error($rss)) :
626 731 print '<div class="feed-problem">';
627 732 print "<h3>Problem:</h3>\n";
628 733 print "<p>FeedWordPress encountered the following error
629 734 when trying to retrieve this feed:</p>";
630 - 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>';
631 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>";
632 737 print "</div>";
633 738 endif;
634 739 ?>
@@ -642,176 +747,203 @@
642 747 <div>
643 748 <h3>Feed Information</h3>
644 749 <ul>
645 750 <li><strong>Homepage:</strong> <a href="<?php echo $feed_link; ?>"><?php echo is_null($feed_title)?'<em>Unknown</em>':$feed_title; ?></a></li>
646 - <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>
647 - <li><strong>Encoding:</strong> <?php echo isset($rss->encoding)?wp_specialchars($rss->encoding, 'both'):"<em>Unknown</em>"; ?></li>
648 - <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>
649 754 </ul>
650 - <div class="submit"><input type="submit" name="Use" value="&laquo; Use this feed" /></div>
651 - <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>
652 758 </div>
653 759 </div>
654 760 </fieldset>
761 + </div> <!-- class="inside" -->
655 762 </form>
656 763 <?php
764 + unset($link);
765 + unset($post);
657 766 endforeach;
658 767 else:
659 - print "<p><strong>".__('Error').":</strong> ".__("FeedWordPress couldn't find any feeds at").' <code><a href="'.htmlspecialchars($lookup).'">'.htmlspecialchars($lookup).'</a></code>';
660 - 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>";
661 773
662 - // Diagnostics
663 - print "<div class=\"updated\" style=\"margin-left: 3.0em; margin-right: 3.0em;\">\n";
664 - print "<h3>".__('Diagnostic information')."</h3>\n";
665 - if (!is_null($f->error()) and strlen($f->error()) > 0) :
666 - print "<h4>".__('HTTP request failure')."</h4>\n";
667 - print "<p>".$f->error()."</p>\n";
668 - else :
669 - print "<h4>".__('HTTP request completed')."</h4>\n";
670 - print "<p><strong>Status ".$f->status().":</strong> ".$this->HTTPStatusMessages[(int) $f->status()]."</p>\n";
671 - 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;
672 784
673 - // Do some more diagnostics if the API for it is available.
674 - if (function_exists('_wp_http_get_object')) :
675 - $httpObject = _wp_http_get_object();
676 - $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() */
677 807
678 - print "<h4>".__('HTTP Transports available').":</h4>\n";
679 - print "<ol>\n";
680 - print "<li>".implode("</li>\n<li>", array_map('get_class', $transports))."</li>\n";
681 - print "</ol>\n";
682 - print "</div>\n";
683 - endif;
684 -
685 - endif;
686 - ?>
687 - </div>
688 -
808 + function display_alt_feed_box ($lookup, $alt = false) {
809 + global $fwp_post;
810 + ?>
689 811 <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
690 - <div><?php
691 - FeedWordPressCompatibility::stamp_nonce(get_class($this));
692 - ?></div>
693 - <div class="wrap">
694 - <h2>Use another feed</h2>
695 - <div><label>Feed:</label>
696 - <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)) : ?>
697 829 <?php FeedWordPressSettingsUI::magic_input_tip_js('use-another-feed'); ?>
830 + <?php endif; ?>
698 831 <?php $this->stamp_link_id('link_id'); ?>
699 - <input type="hidden" name="action" value="feedfinder" /></div>
700 - <div class="submit"><input type="submit" value="Use this feed &raquo;" /></div>
701 - </div>
702 - </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 +
703 840 <?php
704 - return false; // Don't continue
705 - } /* WordPressFeedsPage::display_feedfinder() */
706 -
707 - function accept_POST ($post) {
708 - global $wpdb;
709 -
710 - // User mashed a Save Changes button
711 - if (isset($post['save']) or isset($post['submit'])) :
712 -
713 - if ($this->for_feed_settings()) :
714 - $alter = array ();
715 -
716 - // custom feed settings first
717 - foreach ($post['notes'] as $mn) :
718 - $mn['key0'] = trim($mn['key0']);
719 - $mn['key1'] = trim($mn['key1']);
720 - if (preg_match("\007^(("
721 - .implode(')|(',$this->special_settings)
722 - ."))$\007i",
723 - $mn['key1'])) :
724 - $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;
725 854 endif;
726 -
727 - if (strlen($mn['key0']) > 0) :
728 - unset($this->link->settings[$mn['key0']]); // out with the old
729 - endif;
730 -
731 - if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
732 - $this->link->settings[$mn['key1']] = $mn['value']; // in with the new
733 - endif;
734 855 endforeach;
735 -
736 - // now stuff through the web form
737 - // hardcoded feed info
738 -
739 - foreach (array('name', 'description', 'url') as $what) :
740 - // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
741 - $this->link->settings["hardcode {$what}"] = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
742 - if (FeedWordPress::affirmative($this->link->settings, "hardcode {$what}")) :
743 - $alter[] = "link_{$what} = '".$wpdb->escape($post['link'.$what])."'";
744 - endif;
745 - endforeach;
746 -
747 - // Update scheduling
748 - if (isset($post['update_schedule'])) :
749 - $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'];
750 868 endif;
751 869
752 - if (isset($post['use_default_update_window']) and strtolower($post['use_default_update_window'])=='yes') :
753 - unset($this->link->settings['update/window']);
754 - elseif (isset($post['update_window'])):
755 - if ((int) $post['update_window'] > 0) :
756 - $this->link->settings['update/window'] = (int) $post['update_window'];
757 - endif;
870 + if (strlen($mn['key0']) > 0) :
871 + unset($this->link->settings[$mn['key0']]); // out with the old
758 872 endif;
759 873
760 - else :
761 - // Global
762 - update_option('feedwordpress_cat_id', $post['syndication_category']);
763 -
764 - if (!isset($post['automatic_updates']) or !in_array($post['automatic_updates'], array('init', 'shutdown'))) :
765 - $automatic_updates = false;
766 - else :
767 - $automatic_updates = $post['automatic_updates'];
874 + if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
875 + $this->link->settings[$mn['key1']] = $mn['value']; // in with the new
768 876 endif;
769 - update_option('feedwordpress_automatic_updates', $automatic_updates);
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;
770 894
771 - if (isset($post['update_window'])):
772 - if ((int) $post['update_window'] > 0) :
773 - update_option('feedwordpress_update_window', (int) $post['update_window']);
774 - endif;
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'];
775 900 endif;
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;
909 + else :
910 + $automatic_updates = $post['automatic_updates'];
911 + endif;
912 + update_option('feedwordpress_automatic_updates', $automatic_updates);
776 913
777 - update_option('feedwordpress_update_time_limit', ($post['update_time_limit']=='yes')?(int) $post['time_limit_seconds']:0);
778 -
779 - foreach (array('name', 'description', 'url') as $what) :
780 - // We have a checkbox for "No," so if it's unchecked, mark as "Yes."
781 - $hardcode = (isset($post["hardcode_{$what}"]) ? $post["hardcode_{$what}"] : 'yes');
782 - update_option("feedwordpress_hardcode_{$what}", $hardcode);
783 - endforeach;
784 -
785 - $this->updated = true;
914 + if (isset($post['update_window'])):
915 + if ((int) $post['update_window'] > 0) :
916 + update_option('feedwordpress_update_window', (int) $post['update_window']);
917 + endif;
786 918 endif;
787 - $this->updatedPosts->accept_POST($post);
788 919
789 - if ($this->for_feed_settings()) :
790 - $alter[] = "link_notes = '".$wpdb->escape($this->link->settings_to_notes())."'";
920 + update_option('feedwordpress_update_time_limit', ($post['update_time_limit']=='yes')?(int) $post['time_limit_seconds']:0);
791 921
792 - $alter_set = implode(", ", $alter);
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'];
935 + endif;
793 936
794 - // issue update query
795 - $result = $wpdb->query("
796 - UPDATE $wpdb->links
797 - SET $alter_set
798 - WHERE link_id='{$this->link->id}'
799 - ");
800 - $this->updated = true;
801 -
802 - // reload link information from DB
803 - if (function_exists('clean_bookmark_cache')) :
804 - clean_bookmark_cache($this->link->id);
805 - endif;
806 - $this->link = new SyndicatedLink($this->link->id);
937 + if (is_int($timeout)) :
938 + $timeout = intval($timeout);
807 939 endif;
808 -
809 - // Probably a "Go" button for the drop-down
810 - else :
811 - $this->updated = false;
940 + $this->update_setting('fetch timeout', $timeout);
812 941 endif;
813 - } /* WordPressFeedsPage::accept_POST() */
942 +
943 + $this->updatedPosts->accept_POST($post);
944 + parent::save_settings($post);
945 + } /* FeedWordPressFeedsPage::save_settings() */
814 946
815 947 } /* class FeedWordPressFeedsPage */
816 948
817 949 $feedsPage = new FeedWordPressFeedsPage;