PluginProbe
FeedWordPress / 0.991
FeedWordPress v0.991
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 | feedwordpress.php +1222 -481 2008.11010.991 View file →
@@ -2,13 +2,13 @@
2 2 /*
3 3 Plugin Name: FeedWordPress
4 4 Plugin URI: http://projects.radgeek.com/feedwordpress
5 5 Description: simple and flexible Atom/RSS syndication for WordPress
6 -Version: 2008.1101
6 +Version: 0.991
7 7 Author: Charles Johnson
8 8 Author URI: http://radgeek.com/
9 9 License: GPL
10 -Last modified: 2008-11-01 1:13pm PDT
10 +Last modified: 2007-09-25 12:48 PDT
11 11 */
12 12
13 13 # This uses code derived from:
14 14 # - wp-rss-aggregate.php by Kellan Elliot-McCrea <kellan@protest.net>
@@ -26,9 +26,9 @@
26 26 # <http://www.zyx.com/blog/xmlrpc.php>), or see `update-feeds.php`
27 27
28 28 # -- Don't change these unless you know what you're doing...
29 29
30 -define ('FEEDWORDPRESS_VERSION', '2008.1101');
30 +define ('FEEDWORDPRESS_VERSION', '0.991');
31 31 define ('FEEDWORDPRESS_AUTHOR_CONTACT', 'http://radgeek.com/contact');
32 32 define ('DEFAULT_SYNDICATION_CATEGORY', 'Contributors');
33 33
34 34 define ('FEEDWORDPRESS_DEBUG', false);
@@ -42,10 +42,8 @@
42 42
43 43 define ('FWP_SCHEMA_20', 3308); // Database schema # for WP 2.0
44 44 define ('FWP_SCHEMA_21', 4772); // Database schema # for WP 2.1
45 45 define ('FWP_SCHEMA_23', 5495); // Database schema # for WP 2.3
46 -define ('FWP_SCHEMA_25', 7558); // Database schema # for WP 2.5
47 -define ('FWP_SCHEMA_26', 8201); // Database schema # for WP 2.6
48 46
49 47 if (FEEDWORDPRESS_DEBUG) :
50 48 // Help us to pick out errors, if any.
51 49 ini_set('error_reporting', E_ALL & ~E_NOTICE);
@@ -83,9 +81,11 @@
83 81 require_once (ABSPATH . 'wp-admin/admin-db.php'); // for wp_insert_category
84 82 endif;
85 83 endif;
86 84
87 -require_once(dirname(__FILE__) . '/compatability.php'); // LEGACY API: Replicate or mock up functions for legacy support purposes
85 +if (function_exists('wp_enqueue_script')) :
86 + wp_enqueue_script( 'ajaxcat' ); // Provides the handy-dandy new category text box
87 +endif;
88 88
89 89 // Magic quotes are just about the stupidest thing ever.
90 90 if (is_array($_POST)) :
91 91 $fwp_post = stripslashes_deep($_POST);
@@ -90,45 +90,9 @@
90 90 if (is_array($_POST)) :
91 91 $fwp_post = stripslashes_deep($_POST);
92 92 endif;
93 93
94 -// Get the path relative to the plugins directory in which FWP is stored
95 -preg_match (
96 - '|/wp-content/plugins/(.+)$|',
97 - dirname(__FILE__),
98 - $ref
99 -);
100 94
101 -if (isset($ref[1])) :
102 - $fwp_path = $ref[1];
103 -else : // Something went wrong. Let's just guess.
104 - $fwp_path = 'feedwordpress';
105 -endif;
106 -
107 -// If this is a FeedWordPress admin page, queue up scripts for AJAX functions that FWP uses
108 -// If it is a display page or a non-FeedWordPress admin page, don't.
109 -if (is_admin() and isset($_REQUEST['page']) and preg_match("|^{$fwp_path}/|", $_REQUEST['page'])) :
110 - if (function_exists('wp_enqueue_script')) :
111 - if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
112 - wp_enqueue_script('post'); // for magic tag and category boxes
113 - wp_enqueue_script('thickbox'); // for fold-up boxes
114 - wp_enqueue_script('admin-forms'); // for checkbox selection
115 - else :
116 - wp_enqueue_script( 'ajaxcat' ); // Provides the handy-dandy new category text box
117 - endif;
118 - endif;
119 - if (function_exists('wp_enqueue_style')) :
120 - if (fwp_test_wp_version(FWP_SCHEMA_25)) :
121 - wp_enqueue_style('dashboard');
122 - endif;
123 - endif;
124 - if (function_exists('wp_admin_css')) :
125 - if (fwp_test_wp_version(FWP_SCHEMA_25)) :
126 - wp_admin_css('css/dashboard');
127 - endif;
128 - endif;
129 -endif;
130 -
131 95 if (!FeedWordPress::needs_upgrade()) : // only work if the conditions are safe!
132 96
133 97 # Syndicated items are generally received in output-ready (X)HTML and
134 98 # should not be folded, crumpled, mutilated, or spindled by WordPress
@@ -145,19 +109,10 @@
145 109
146 110 add_filter('the_content', 'feedwordpress_preserve_syndicated_content', -10000);
147 111 add_filter('the_content', 'feedwordpress_restore_syndicated_content', 10000);
148 112
149 - add_action('atom_entry', 'feedwordpress_item_feed_data');
150 -
151 113 # Filter in original permalinks if the user wants that
152 114 add_filter('post_link', 'syndication_permalink', 1);
153 -
154 - # WTF? By default, wp_insert_link runs incoming link_url and link_rss
155 - # URIs through default filters that include `wp_kses()`. But `wp_kses()`
156 - # just happens to escape any occurrence of & to &amp; -- which just
157 - # happens to fuck up any URI with a & to separate GET parameters.
158 - remove_filter('pre_link_rss', 'wp_filter_kses');
159 - remove_filter('pre_link_url', 'wp_filter_kses');
160 115
161 116 # Admin menu
162 117 add_action('admin_menu', 'fwp_add_pages');
163 118
@@ -185,12 +140,8 @@
185 140 endif;
186 141
187 142 # Cron-less auto-update. Hooray!
188 143 add_action('init', 'feedwordpress_auto_update');
189 -
190 - # Default sanitizers
191 - add_filter('syndicated_item_content', array('SyndicatedPost', 'sanitize_content'), 0, 2);
192 -
193 144 else :
194 145 # Hook in the menus, which will just point to the upgrade interface
195 146 add_action('admin_menu', 'fwp_add_pages');
196 147 endif; // if (!FeedWordPress::needs_upgrade())
@@ -243,8 +194,46 @@
243 194 : implode(' and ', $mesg)));
244 195 }
245 196
246 197 ################################################################################
198 +## LEGACY API: Replicate or mock up functions for legacy support purposes ######
199 +################################################################################
200 +
201 +if (!function_exists('get_option')) {
202 + function get_option ($option) {
203 + return get_settings($option);
204 + }
205 +}
206 +if (!function_exists('current_user_can')) {
207 + $legacy_capability_hack = true;
208 + function current_user_can ($task) {
209 + global $user_level;
210 +
211 + $can = false;
212 +
213 + // This is **not** a full replacement for current_user_can. It
214 + // is only for checking the capabilities we care about via the
215 + // WordPress 1.5 user levels.
216 + switch ($task) {
217 + case 'manage_options':
218 + $can = ($user_level >= 6);
219 + break;
220 + case 'manage_links':
221 + $can = ($user_level >= 5);
222 + break;
223 + } /* switch */
224 + return $can;
225 + }
226 +} else {
227 + $legacy_capability_hack = false;
228 +}
229 +if (!function_exists('sanitize_user')) {
230 + function sanitize_user ($text, $strict) {
231 + return $text; // Don't munge it if it wasn't munged going in...
232 + }
233 +}
234 +
235 +################################################################################
247 236 ## TEMPLATE API: functions to make your templates syndication-aware ############
248 237 ################################################################################
249 238
250 239 function is_syndicated () { return (strlen(get_syndication_feed_id()) > 0); }
@@ -296,9 +285,9 @@
296 285
297 286 function feedwordpress_preserve_syndicated_content ($text) {
298 287 global $feedwordpress_the_syndicated_content;
299 288
300 - if ( is_syndicated() and get_option('feedwordpress_formatting_filters') != 'yes' ) :
289 + if ( is_syndicated() ) :
301 290 $feedwordpress_the_syndicated_content = $text;
302 291 else :
303 292 $feedwordpress_the_syndicated_content = NULL;
304 293 endif;
@@ -314,56 +303,1060 @@
314 303
315 304 return $text;
316 305 }
317 306
318 -function feedwordpress_item_feed_data () {
319 - // In a post context....
320 - if (is_syndicated()) :
307 +function syndication_permalink ($permalink = '') {
308 + if (get_option('feedwordpress_munge_permalink') != 'no'):
309 + $uri = get_syndication_permalink();
310 + return ((strlen($uri) > 0) ? $uri : $permalink);
311 + else:
312 + return $permalink;
313 + endif;
314 +} // function syndication_permalink ()
315 +
316 +################################################################################
317 +## UPGRADE INTERFACE: Have users upgrade DB from older versions of FWP #########
318 +################################################################################
319 +
320 +function fwp_upgrade_page () {
321 + if (isset($GLOBALS['fwp_post']['action']) and $GLOBALS['fwp_post']['action']=='Upgrade') :
322 + $ver = get_option('feedwordpress_version');
323 + if (get_option('feedwordpress_version') != FEEDWORDPRESS_VERSION) :
324 + echo "<div class=\"wrap\">\n";
325 + echo "<h2>Upgrading FeedWordPress...</h2>";
326 +
327 + $feedwordpress =& new FeedWordPress;
328 + $feedwordpress->upgrade_database();
329 + echo "<p><strong>Done!</strong> Upgraded database to version ".FEEDWORDPRESS_VERSION.".</p>\n";
330 + echo "<form action=\"\" method=\"get\">\n";
331 + echo "<div class=\"submit\"><input type=\"hidden\" name=\"page\" value=\"".basename(__FILE__)."\" />";
332 + echo "<input type=\"submit\" value=\"Continue &raquo;\" /></form></div>\n";
333 + echo "</div>\n";
334 + return;
335 + else :
336 + echo "<div class=\"updated\"><p>Already at version ".FEEDWORDPRESS_VERSION."!</p></div>";
337 + endif;
338 + endif;
321 339 ?>
322 -<source>
323 - <title><?php the_syndication_source(); ?></title>
324 - <link rel="alternate" type="text/html" href="<?php the_syndication_source_link(); ?>" />
325 - <link rel="self" href="<?php the_syndication_feed(); ?>" />
340 +<div class="wrap">
341 +<h2>Upgrade FeedWordPress</h2>
342 +
343 +<p>It appears that you have installed FeedWordPress
344 +<?php echo FEEDWORDPRESS_VERSION; ?> as an upgrade to an existing installation of
345 +FeedWordPress. That's no problem, but you will need to take a minute out first
346 +to upgrade your database: some necessary changes in how the software keeps
347 +track of posts and feeds will cause problems such as duplicate posts and broken
348 +templates if we were to continue without the upgrade.</p>
349 +
350 +<p>Note that most of FeedWordPress's functionality is temporarily disabled
351 +until we have successfully completed the upgrade. Everything should begin
352 +working as normal again once the upgrade is complete. There's extraordinarily
353 +little chance of any damage as the result of the upgrade, but if you're paranoid
354 +like me you may want to back up your database before you proceed.</p>
355 +
356 +<p>This may take several minutes for a large installation.</p>
357 +
358 +<form action="" method="post">
359 +<div class="submit"><input type="submit" name="action" value="Upgrade" /></div>
360 +</form>
361 +</div>
326 362 <?php
327 - $id = get_feed_meta('feed/id');
328 - if (strlen($id) > 0) :
363 +} // function fwp_upgrade_page ()
364 +
365 +################################################################################
366 +## ADMIN MENU ADD-ONS: implement Dashboard management pages ####################
367 +################################################################################
368 +
369 +function fwp_add_pages () {
370 + global $legacy_capability_hack;
371 +
372 + if ($legacy_capability_hack) :
373 + // old & busted: numeric user levels
374 + $manage_links = 5;
375 + $manage_options = 6;
376 + else :
377 + // new hotness: named capabilities
378 + $manage_links = 'manage_links';
379 + $manage_options = 'manage_options';
380 + endif;
381 +
382 + //add_submenu_page('plugins.php', 'Akismet Configuration', 'Akismet Configuration', 'manage_options', 'syndication-manage-page', 'fwp_syndication_manage_page');
383 + add_menu_page('Syndicated Sites', 'Syndication', $manage_links, 'feedwordpress/'.basename(__FILE__), 'fwp_syndication_manage_page');
384 + add_submenu_page('feedwordpress/'.basename(__FILE__), 'Syndication Options', 'Options', $manage_options, 'feedwordpress/syndication-options.php');
385 + add_options_page('Syndication Options', 'Syndication', $manage_options, 'feedwordpress/syndication-options.php');
386 +} // function fwp_add_pages () */
387 +
388 +function fwp_category_box ($checked, $object) {
389 + global $wp_db_version;
390 +
391 + if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_20) : // WordPress 2.x
329 392 ?>
330 - <id><?php print $id; ?></id>
393 + <div id="poststuff">
394 +
395 + <div id="moremeta">
396 + <div id="grabit" class="dbx-group">
397 + <fieldset id="categorydiv" class="dbx-box">
398 + <h3 class="dbx-handle"><?php _e('Categories') ?></h3>
399 + <div class="dbx-content">
400 + <p style="font-size:smaller;font-style:bold;margin:0">Place <?php print $object; ?> under...</p>
401 + <p id="jaxcat"></p>
402 + <ul id="categorychecklist"><?php write_nested_categories($checked); ?></ul></div>
403 + </fieldset>
404 + </div>
405 + </div>
406 + </div>
331 407 <?php
408 + else : // WordPress 1.5
409 +?>
410 + <fieldset id="categorydiv" style="width: 20%; margin-right: 2em">
411 + <legend><?php _e('Categories') ?></legend>
412 + <p style="font-size:smaller;font-style:bold;margin:0">Place <?php print $object; ?> under...</p>
413 + <div style="height: 20em"><?php write_nested_categories($checked); ?></div>
414 + </fieldset>
415 +<?php
332 416 endif;
333 - $updated = get_feed_meta('feed/updated');
334 - if (strlen($updated) > 0) : ?>
335 - <updated><?php print $updated; ?></updated>
417 +}
418 +
419 +function update_feeds_mention ($feed) {
420 + echo "<li>Updating <cite>".$feed['link/name']."</cite> from &lt;<a href=\""
421 + .$feed['link/uri']."\">".$feed['link/uri']."</a>&gt; ...</li>\n";
422 + flush();
423 +}
424 +
425 +function fwp_syndication_manage_page () {
426 + global $wpdb;
427 +
428 + if (FeedWordPress::needs_upgrade()) :
429 + fwp_upgrade_page();
430 + return;
431 + endif;
432 +
433 +?>
434 +<?php $cont = true;
435 +if (isset($_REQUEST['action'])):
436 + if ($_REQUEST['action'] == 'feedfinder') : $cont = fwp_feedfinder_page();
437 + elseif ($_REQUEST['action'] == 'switchfeed') : $cont = fwp_switchfeed_page();
438 + elseif ($_REQUEST['action'] == 'linkedit') : $cont = fwp_linkedit_page();
439 + elseif ($_REQUEST['action'] == 'Unsubscribe from Checked Links' or $_REQUEST['action'] == 'Unsubscribe') : $cont = fwp_multidelete_page();
440 + endif;
441 +endif;
442 +
443 +if ($cont):
444 +?>
336 445 <?php
446 + $links = FeedWordPress::syndicated_links();
447 +
448 + if (isset($_POST['update']) or isset($_POST['action']) or isset($_POST['update_uri'])) :
449 + $fwp_update_invoke = 'post';
450 + else :
451 + $fwp_update_invoke = 'get';
337 452 endif;
453 +
454 + $update_set = array();
455 + if (isset($_POST['link_ids']) and is_array($_POST['link_ids']) and ($_POST['action']=='Update Checked Links')) :
456 + $targets = $wpdb->get_results("
457 + SELECT * FROM $wpdb->links
458 + WHERE link_id IN (".implode(",",$_POST['link_ids']).")
459 + ");
460 + if (is_array($targets)) :
461 + foreach ($targets as $target) :
462 + $update_set[] = $target->link_rss;
463 + endforeach;
464 + else : // This should never happen
465 + FeedWordPress::critical_bug('fwp_syndication_manage_page::targets', $targets, __LINE__);
466 + endif;
467 + elseif (isset($_POST['update_uri'])) :
468 + $update_set[] = $_POST['update_uri'];
469 + endif;
470 +
471 + if ($fwp_update_invoke != 'get' and count($update_set) > 0) : // Only do things with side-effects for HTTP POST or command line
472 + $feedwordpress =& new FeedWordPress;
473 + add_action('feedwordpress_check_feed', 'update_feeds_mention');
474 +
475 + echo "<div class=\"updated\">\n";
476 + echo "<ul>\n";
477 + $tdelta = NULL;
478 + foreach ($update_set as $uri) :
479 + if ($uri == '*') : $uri = NULL; endif;
480 + $delta = $feedwordpress->update($uri);
481 + if (!is_null($delta)) :
482 + if (is_null($tdelta)) :
483 + $tdelta = $delta;
484 + else :
485 + $tdelta['new'] += $delta['new'];
486 + $tdelta['updated'] += $delta['updated'];
487 + endif;
488 + else :
489 + echo "<li><p><strong>Error:</strong> There was a problem updating <a href=\"$uri\">$uri</a></p></li>\n";
490 + endif;
491 + endforeach;
492 + echo "</ul>\n";
493 +
494 + if (!is_null($tdelta)) :
495 + $mesg = array();
496 + if (isset($delta['new'])) : $mesg[] = ' '.$tdelta['new'].' new posts were syndicated'; endif;
497 + if (isset($delta['updated'])) : $mesg[] = ' '.$tdelta['updated'].' existing posts were updated'; endif;
498 + echo "<p>Update complete.".implode(' and', $mesg)."</p>";
499 + echo "\n"; flush();
500 + endif;
501 + echo "</div> <!-- class=\"updated\" -->\n";
502 + endif;
503 +
504 + ?>
505 + <div class="wrap">
506 + <form action="" method="POST">
507 + <h2>Update feeds now</h2>
508 + <p>Check currently scheduled feeds for new and updated posts.</p>
509 +
510 +<?php if (!get_option('feedwordpress_automatic_updates')) : ?>
511 + <p><strong>Note:</strong> Automatic updates are currently turned
512 + <strong>off</strong>. New posts from your feeds will not be syndicated
513 + until you manually check for them here. You can turn on automatic
514 + updates under <a href="admin.php?page=feedwordpress/syndication-options.php">Syndication
515 + Options</a>.</p>
516 +<?php endif; ?>
517 +
518 +
519 + <div class="submit"><input type="hidden" name="update_uri" value="*" /><input type="submit" name="update" value="Update" /></div>
520 + </form>
521 + </div> <!-- class="wrap" -->
522 +
523 + <form action="admin.php?page=feedwordpress/<?php echo basename(__FILE__); ?>" method="post">
524 + <div class="wrap">
525 + <h2>Syndicated Sites</h2>
526 +<?php $alt_row = true;
527 + if ($links): ?>
528 +
529 +<table width="100%" cellpadding="3" cellspacing="3">
530 +<tr>
531 +<th width="20%"><?php _e('Name'); ?></th>
532 +<th width="40%"><?php _e('Feed'); ?></th>
533 +<th colspan="4"><?php _e('Action'); ?></th>
534 +</tr>
535 +
536 +<?php foreach ($links as $link):
537 + $alt_row = !$alt_row; ?>
538 +<tr<?php echo ($alt_row?' class="alternate"':''); ?>>
539 +<td><a href="<?php echo wp_specialchars($link->link_url, 'both'); ?>"><?php echo wp_specialchars($link->link_name, 'both'); ?></a></td>
540 +<?php
541 + if (strlen($link->link_rss) > 0):
542 + $caption='Switch Feed';
543 + $uri_bits = parse_url($link->link_rss);
544 + $uri_bits['host'] = preg_replace('/^www\./i', '', $uri_bits['host']);
545 + $display_uri =
546 + (isset($uri_bits['user'])?$uri_bits['user'].'@':'')
547 + .(isset($uri_bits['host'])?$uri_bits['host']:'')
548 + .(isset($uri_bits['port'])?':'.$uri_bits['port']:'')
549 + .(isset($uri_bits['path'])?$uri_bits['path']:'')
550 + .(isset($uri_bits['query'])?'?'.$uri_bits['query']:'');
551 + if (strlen($display_uri) > 32) : $display_uri = substr($display_uri, 0, 32).'&#8230;'; endif;
338 552 ?>
339 -</source>
553 + <td>
554 + <strong><a href="<?php echo $link->link_rss; ?>"><?php echo wp_specialchars($display_uri, 'both'); ?></a></strong></td>
340 555 <?php
556 + else:
557 + $caption='Find Feed';
558 +?>
559 + <td style="background-color:#FFFFD0"><p><strong>no
560 + feed assigned</strong></p></td>
561 +<?php
562 + endif;
563 +?>
564 + <td><a href="admin.php?page=feedwordpress/<?php echo basename(__FILE__); ?>&amp;link_id=<?php echo $link->link_id; ?>&amp;action=linkedit" class="edit"><?php _e('Edit')?></a></td>
565 + <td><a href="admin.php?page=feedwordpress/<?php echo basename(__FILE__); ?>&amp;link_id=<?php echo $link->link_id; ?>&amp;action=feedfinder" class="edit"><?php echo $caption; ?></a></td>
566 + <td><a href="admin.php?page=feedwordpress/<?php echo basename(__FILE__); ?>&amp;link_id=<?php echo $link->link_id; ?>&amp;action=Unsubscribe" class="delete"><?php _e('Unsubscribe'); ?></a></td>
567 + <td><input type="checkbox" name="link_ids[]" value="<?php echo $link->link_id; ?>" /></td>
568 +<?php
569 + echo "\n\t</tr>";
570 + endforeach;
571 + else:
572 +?>
573 +
574 +<p>There are no websites currently listed for syndication.</p>
575 +
576 +<?php endif; ?>
577 + </table>
578 +
579 + <br/><hr/>
580 + <div class="submit"><input type="submit" class="delete" name="action" value="Unsubscribe from Checked Links" />
581 + <input type="submit" name="action" value="Update Checked Links" /></div>
582 + </div> <!-- class="wrap" -->
583 + </form>
584 +
585 + <div class="wrap">
586 + <form action="admin.php?page=feedwordpress/<?php echo basename(__FILE__); ?>" method="post">
587 + <h2>Add a new syndicated site:</h2>
588 + <div>
589 + <label for="add-uri">Website or newsfeed:</label>
590 + <input type="text" name="lookup" id="add-uri" value="URI" size="64" />
591 + <input type="hidden" name="action" value="feedfinder" />
592 + </div>
593 + <div class="submit"><input type="submit" value="Syndicate &raquo;" /></div>
594 + </form>
595 + </div> <!-- class="wrap" -->
596 +<?php
597 +endif;
598 +}
599 +
600 +function fwp_feedfinder_page () {
601 + global $wpdb;
602 +
603 + $lookup = (isset($_REQUEST['lookup'])?$_REQUEST['lookup']:NULL);
604 +
605 + if (isset($_REQUEST['link_id']) and ($_REQUEST['link_id']!=0)):
606 + $link_id = $_REQUEST['link_id'];
607 + if (!is_numeric($link_id)) : FeedWordPress::critical_bug('fwp_feedfinder_page::link_id', $link_id, __LINE__); endif;
608 +
609 + $link = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id='".$wpdb->escape($link_id)."'");
610 + if (is_object($link)):
611 + if (is_null($lookup)) $lookup = $link->link_url;
612 + $name = wp_specialchars($link->link_name, 'both');
613 + else:
614 + die (__("Cheatin' uh ?"));
615 + endif;
616 + else:
617 + $name = "New Syndicated Feed";
618 + $link_id = 0;
341 619 endif;
620 +?>
621 + <div class="wrap">
622 + <h2>Feed Finder: <?php echo $name; ?></h2>
623 +<?php
624 + $f =& new FeedFinder($lookup);
625 + $feeds = $f->find();
626 + if (count($feeds) > 0):
627 + foreach ($feeds as $key => $f):
628 + $rss = fetch_rss($f);
629 + if ($rss):
630 + $feed_title = isset($rss->channel['title'])?$rss->channel['title']:$rss->channel['link'];
631 + $feed_link = isset($rss->channel['link'])?$rss->channel['link']:'';
632 +?>
633 + <form action="admin.php?page=feedwordpress/<?php echo basename(__FILE__); ?>" method="post">
634 + <fieldset style="clear: both">
635 + <legend><?php echo $rss->feed_type; ?> <?php echo $rss->feed_version; ?> feed</legend>
636 +
637 + <?php if ($link_id===0): ?>
638 + <input type="hidden" name="feed_title" value="<?php echo wp_specialchars($feed_title, 'both'); ?>" />
639 + <input type="hidden" name="feed_link" value="<?php echo wp_specialchars($feed_link, 'both'); ?>" />
640 + <?php endif; ?>
641 +
642 + <input type="hidden" name="link_id" value="<?php echo $link_id; ?>" />
643 + <input type="hidden" name="feed" value="<?php echo wp_specialchars($f, 'both'); ?>" />
644 + <input type="hidden" name="action" value="switchfeed" />
645 +
646 + <div>
647 + <div style="float:right; background-color:#D0D0D0; color: black; width:45%; font-size:70%; border-left: 1px dotted #A0A0A0; padding-left: 0.5em; margin-left: 1.0em">
648 +<?php if (count($rss->items) > 0): ?>
649 + <?php $item = $rss->items[0]; ?>
650 + <h3>Sample Item</h3>
651 + <ul>
652 + <li><strong>Title:</strong> <a href="<?php echo $item['link']; ?>"><?php echo $item['title']; ?></a></li>
653 + <li><strong>Date:</strong> <?php echo isset($item['date_timestamp']) ? date('d-M-y g:i:s a', $item['date_timestamp']) : 'unknown'; ?></li>
654 + </ul>
655 + <div class="entry">
656 + <?php echo (isset($item['content']['encoded'])?$item['content']['encoded']:$item['description']); ?>
657 + </div>
658 +<?php else: ?>
659 + <h3>No Items</h3>
660 + <p>FeedWordPress found no posts on this feed.</p>
661 +<?php endif; ?>
662 + </div>
663 +
664 + <div>
665 + <h3>Feed Information</h3>
666 + <ul>
667 + <li><strong>Website:</strong> <a href="<?php echo $feed_link; ?>"><?php echo is_null($feed_title)?'<em>Unknown</em>':$feed_title; ?></a></li>
668 + <li><strong>Feed URI:</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); ?>"><img src="../wp-images/smilies/icon_arrow.gif" alt="(&rarr;)" /></a></li>
669 + <li><strong>Encoding:</strong> <?php echo isset($rss->encoding)?wp_specialchars($rss->encoding, 'both'):"<em>Unknown</em>"; ?></li>
670 + <li><strong>Description:</strong> <?php echo isset($rss->channel['description'])?wp_specialchars($rss->channel['description'], 'both'):"<em>Unknown</em>"; ?></li>
671 + </ul>
672 + <div class="submit"><input type="submit" name="Use" value="&laquo; Use this feed" /></div>
673 + <div class="submit"><input type="submit" name="Cancel" value="&laquo; Cancel" /></div>
674 + </div>
675 + </div>
676 + </fieldset>
677 + </form>
678 +<?php endif;
679 + endforeach;
680 + else:
681 + echo "<p><strong>no feed found</strong></p>";
682 + endif;
683 +?>
684 + </div>
685 +
686 + <form action="admin.php?page=feedwordpress/<?php echo basename(__FILE__); ?>" method="post">
687 + <div class="wrap">
688 + <h2>Use another feed</h2>
689 + <div><label>Feed:</label>
690 + <input type="text" name="lookup" value="URI" />
691 + <input type="hidden" name="link_id" value="<?php echo $link_id; ?>" />
692 + <input type="hidden" name="action" value="feedfinder" /></div>
693 + <div class="submit"><input type="submit" value="Use this feed &raquo;" /></div>
694 + </div>
695 + </form>
696 +<?php
697 + return false; // Don't continue
342 698 }
343 699
344 -function syndication_permalink ($permalink = '') {
345 - if (get_option('feedwordpress_munge_permalink') != 'no'):
346 - $uri = get_syndication_permalink();
347 - return ((strlen($uri) > 0) ? $uri : $permalink);
700 +function fwp_switchfeed_page () {
701 + global $wpdb, $wp_db_version;
702 +
703 + check_admin_referer();
704 + if (!isset($_REQUEST['Cancel'])):
705 + if (!current_user_can('manage_links')):
706 + die (__("Cheatin' uh ?"));
707 + elseif (isset($_REQUEST['link_id']) and ($_REQUEST['link_id']==0)):
708 + $link_id = FeedWordPress::syndicate_link($_REQUEST['feed_title'], $_REQUEST['feed_link'], $_REQUEST['feed']);
709 + if ($link_id): ?>
710 +<div class="updated"><p><a href="<?php echo $_REQUEST['feed_link']; ?>"><?php echo wp_specialchars($_REQUEST['feed_title'], 'both'); ?></a>
711 +has been added as a contributing site, using the newsfeed at &lt;<a href="<?php echo $_REQUEST['feed']; ?>"><?php echo wp_specialchars($_REQUEST['feed'], 'both'); ?></a>&gt;.</p></div>
712 +<?php else: ?>
713 +<div class="updated"><p>There was a problem adding the newsfeed. [SQL: <?php echo wp_specialchars(mysql_error(), 'both'); ?>]</p></div>
714 +<?php endif;
715 + elseif (isset($_REQUEST['link_id'])):
716 + // Update link_rss
717 + $result = $wpdb->query("
718 + UPDATE $wpdb->links
719 + SET
720 + link_rss = '".$wpdb->escape($_REQUEST['feed'])."'
721 + WHERE link_id = '".$wpdb->escape($_REQUEST['link_id'])."'
722 + ");
723 +
724 + if ($result):
725 + $result = $wpdb->get_row("
726 + SELECT link_name, link_url FROM $wpdb->links
727 + WHERE link_id = '".$wpdb->escape($_REQUEST['link_id'])."'
728 + ");
729 + ?>
730 +<div class="updated"><p>Feed for <a href="<?php echo $result->link_url; ?>"><?php echo wp_specialchars($result->link_name, 'both'); ?></a>
731 +updated to &lt;<a href="<?php echo $_REQUEST['feed']; ?>"><?php echo wp_specialchars($_REQUEST['feed'], 'both'); ?></a>&gt;.</p></div>
732 + <?php else: ?>
733 +<div class="updated"><p>Nothing was changed.</p></div>
734 + <?php endif;
735 + endif;
736 + endif;
737 + return true; // Continue
738 +}
739 +
740 +function fwp_linkedit_page () {
741 + global $wpdb;
742 +
743 + check_admin_referer(); // Make sure we arrived here from the Dashboard
744 +
745 + $special_settings = array ( /* Regular expression syntax is OK here */
746 + 'cats',
747 + 'cat_split',
748 + 'hardcode name',
749 + 'hardcode url',
750 + 'hardcode description',
751 + 'hardcode categories', /* Deprecated */
752 + 'post status',
753 + 'comment status',
754 + 'ping status',
755 + 'unfamiliar author',
756 + 'unfamliar categories',
757 + 'update/.*',
758 + 'feed/.*',
759 + 'link/.*',
760 + );
761 +
762 + if (!current_user_can('manage_links')) :
763 + die (__("Cheatin' uh ?"));
764 + elseif (isset($_REQUEST['feedfinder'])) :
765 + return fwp_feedfinder_page(); // re-route to Feed Finder page
766 + else :
767 + $link_id = (int) $_REQUEST['link_id'];
768 + $link =& new SyndicatedLink($link_id);
769 +
770 + if ($link->found()) :
771 + if (isset($GLOBALS['fwp_post']['save'])) :
772 + $alter = array ();
773 +
774 + $meta = $link->settings;
775 + if (isset($meta['cats'])):
776 + $meta['cats'] = preg_split(FEEDWORDPRESS_CAT_SEPARATOR_PATTERN, $meta['cats']);
777 + endif;
778 +
779 + // custom feed settings first
780 + foreach ($GLOBALS['fwp_post']['notes'] as $mn) :
781 + $mn['key0'] = trim($mn['key0']);
782 + $mn['key1'] = trim($mn['key1']);
783 + if (preg_match("\007^(("
784 + .implode(')|(',$special_settings)
785 + ."))$\007i",
786 + $mn['key1'])) :
787 + $mn['key1'] = 'user/'.$mn['key1'];
788 + endif;
789 +
790 + if (strlen($mn['key0']) > 0) :
791 + unset($meta[$mn['key0']]); // out with the old
792 + endif;
793 +
794 + if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
795 + $meta[$mn['key1']] = $mn['value']; // in with the new
796 + endif;
797 + endforeach;
798 +
799 + // now stuff through the web form
800 + // hardcoded feed info
801 + if (isset($GLOBALS['fwp_post']['hardcode_name'])) :
802 + $meta['hardcode name'] = $GLOBALS['fwp_post']['hardcode_name'];
803 + if (FeedWordPress::affirmative($meta, 'hardcode name')) :
804 + $alter[] = "link_name = '".$wpdb->escape($GLOBALS['fwp_post']['name'])."'";
805 + endif;
806 + endif;
807 + if (isset($GLOBALS['fwp_post']['hardcode_description'])) :
808 + $meta['hardcode description'] = $GLOBALS['fwp_post']['hardcode_description'];
809 + if (FeedWordPress::affirmative($meta, 'hardcode description')) :
810 + $alter[] = "link_description = '".$wpdb->escape($GLOBALS['fwp_post']['description'])."'";
811 + endif;
812 + endif;
813 + if (isset($GLOBALS['fwp_post']['hardcode_url'])) :
814 + $meta['hardcode url'] = $GLOBALS['fwp_post']['hardcode_url'];
815 + if (FeedWordPress::affirmative($meta, 'hardcode url')) :
816 + $alter[] = "link_url = '".$wpdb->escape($GLOBALS['fwp_post']['linkurl'])."'";
817 + endif;
818 + endif;
819 +
820 + // Update scheduling
821 + if (isset($GLOBALS['fwp_post']['update_schedule'])) :
822 + $meta['update/hold'] = $GLOBALS['fwp_post']['update_schedule'];
823 + endif;
824 +
825 + // Categories
826 + if (isset($GLOBALS['fwp_post']['post_category'])) :
827 + $meta['cats'] = array();
828 + foreach ($GLOBALS['fwp_post']['post_category'] as $cat_id) :
829 + $meta['cats'][] = '{#'.$cat_id.'}';
830 + endforeach;
831 + else :
832 + unset($meta['cats']);
833 + endif;
834 +
835 + // Post status, comment status, ping status
836 + foreach (array('post', 'comment', 'ping') as $what) :
837 + $sfield = "feed_{$what}_status";
838 + if (isset($GLOBALS['fwp_post'][$sfield])) :
839 + if ($GLOBALS['fwp_post'][$sfield]=='site-default') :
840 + unset($meta["{$what} status"]);
841 + else :
842 + $meta["{$what} status"] = $GLOBALS['fwp_post'][$sfield];
843 + endif;
844 + endif;
845 + endforeach;
846 +
847 + // Unfamiliar author, unfamiliar categories
848 + foreach (array("author", "category") as $what) :
849 + $sfield = "unfamiliar_{$what}";
850 + if (isset($GLOBALS['fwp_post'][$sfield])) :
851 + if ($GLOBALS['fwp_post'][$sfield]=='site-default') :
852 + unset($meta["unfamiliar {$what}"]);
853 + else :
854 + $meta["unfamiliar {$what}"] = $GLOBALS['fwp_post'][$sfield];
855 + endif;
856 + endif;
857 + endforeach;
858 +
859 + if (isset($GLOBALS['fwp_post']['cat_split'])) :
860 + if (strlen(trim($GLOBALS['fwp_post']['cat_split'])) > 0) :
861 + $meta['cat_split'] = trim($GLOBALS['fwp_post']['cat_split']);
862 + else :
863 + unset($meta['cat_split']);
864 + endif;
865 + endif;
866 +
867 + if (is_array($meta['cats'])) :
868 + $meta['cats'] = implode(FEEDWORDPRESS_CAT_SEPARATOR, $meta['cats']);
869 + endif;
870 +
871 + $notes = '';
872 + foreach ($meta as $key => $value) :
873 + $notes .= $key . ": ". addcslashes($value, "\0..\37".'\\') . "\n";
874 + endforeach;
875 + $alter[] = "link_notes = '".$wpdb->escape($notes)."'";
876 +
877 + $alter_set = implode(", ", $alter);
878 +
879 + // issue update query
880 + $result = $wpdb->query("
881 + UPDATE $wpdb->links
882 + SET $alter_set
883 + WHERE link_id='$link_id'
884 + ");
885 + $updated_link = true;
886 +
887 + // reload link information from DB
888 + $link =& new SyndicatedLink($link_id);
889 + else :
890 + $updated_link = false;
891 + endif;
892 +
893 + $db_link = $link->link;
894 + $link_url = wp_specialchars($db_link->link_url, 1);
895 + $link_name = wp_specialchars($db_link->link_name, 1);
896 + $link_description = wp_specialchars($db_link->link_description, 'both');
897 + $link_notes = wp_specialchars($db_link->link_notes, 'both');
898 + $link_rss_uri = wp_specialchars($db_link->link_rss, 'both');
899 +
900 + $meta = $link->settings;
901 + $post_status_global = get_option('feedwordpress_syndicated_post_status');
902 + $comment_status_global = get_option('feedwordpress_syndicated_comment_status');
903 + $ping_status_global = get_option('feedwordpress_syndicated_ping_status');
904 +
905 + $status['post'] = array('publish' => '', 'private' => '', 'draft' => '', 'site-default' => '');
906 + $status['comment'] = array('open' => '', 'closed' => '', 'site-default' => '');
907 + $status['ping'] = array('open' => '', 'closed' => '', 'site-default' => '');
908 +
909 + foreach (array('post', 'comment', 'ping') as $what) :
910 + if (isset($meta["{$what} status"])) :
911 + $status[$what][$meta["{$what} status"]] = ' checked="checked"';
912 + else :
913 + $status[$what]['site-default'] = ' checked="checked"';
914 + endif;
915 + endforeach;
916 +
917 + $unfamiliar['author'] = array ('create' => '','default' => '','filter' => '');
918 + $unfamiliar['category'] = array ('create'=>'','default'=>'','filter'=>'');
919 +
920 + foreach (array('author', 'category') as $what) :
921 + if (is_string($meta["unfamiliar {$what}"]) and
922 + array_key_exists($meta["unfamiliar {$what}"], $unfamiliar[$what])) :
923 + $key = $meta["unfamiliar {$what}"];
924 + else:
925 + $key = 'site-default';
926 + endif;
927 + $unfamiliar[$what][$key] = ' checked="checked"';
928 + endforeach;
929 +
930 + $dogs = get_nested_categories(-1, 0);
931 + if (is_array($meta['cats'])) :
932 + $cats = array_map('strtolower',
933 + array_map('trim',
934 + $meta['cats']
935 + ));
936 + else:
937 + $cats = array();
938 + endif;
939 +
940 + foreach ($dogs as $tag => $dog) :
941 + $found_by_name = in_array(strtolower(trim($dog['cat_name'])), $cats);
942 +
943 + if (isset($dog['cat_ID'])) : $dog['cat_id'] = $dog['cat_ID']; endif;
944 + $found_by_id = in_array('{#'.trim($dog['cat_id']).'}', $cats);
945 +
946 + if ($found_by_name or $found_by_id) :
947 + $dogs[$tag]['checked'] = true;
948 + endif;
949 + endforeach;
950 + else :
951 + die( __('Link not found.') );
952 + endif;
953 +
954 + ?>
955 +<script type="text/javascript">
956 + function flip_hardcode (item) {
957 + ed=document.getElementById('basics-'+item+'-edit');
958 + view=document.getElementById('basics-'+item+'-view');
959 +
960 + o = document.getElementById('basics-hardcode-'+item);
961 + if (o.value=='yes') { ed.style.display='inline'; view.style.display='none'; }
962 + else { ed.style.display='none'; view.style.display='inline'; }
963 + }
964 +</script>
965 +
966 +<?php if ($updated_link) : ?>
967 +<div class="updated"><p>Syndicated feed settings updated.</p></div>
968 +<?php endif; ?>
969 +
970 +<form action="admin.php?page=feedwordpress/<?php echo basename(__FILE__); ?>" method="post">
971 +<div class="wrap">
972 +<input type="hidden" name="link_id" value="<?php echo $link_id; ?>" />
973 +<input type="hidden" name="action" value="linkedit" />
974 +<input type="hidden" name="save" value="link" />
975 +
976 +<h2>Edit a syndicated feed:</h2>
977 +<fieldset><legend>Basics</legend>
978 +<table class="editform" width="100%" cellspacing="2" cellpadding="5">
979 +<tr>
980 +<th scope="row" width="20%"><?php _e('Feed URI:') ?></th>
981 +<td width="60%"><a href="<?php echo wp_specialchars($link_rss_uri, 'both'); ?>"><?php echo $link_rss_uri; ?></a>
982 +<a href="<?php echo FEEDVALIDATOR_URI; ?>?url=<?php echo urlencode($link_rss_uri); ?>"
983 +title="Check feed &lt;<?php echo wp_specialchars($link_rss_uri, 'both'); ?>&gt; for validity"><img src="../wp-images/smilies/icon_arrow.gif" alt="&rarr;" /></a>
984 +</td>
985 +<td width="20%"><input type="submit" name="feedfinder" value="switch &rarr;" style="font-size:smaller" /></td>
986 +</tr>
987 +<tr>
988 +<th scope="row" width="20%"><?php _e('Link Name:') ?></th>
989 +<td width="60%"><input type="text" id="basics-name-edit" name="name"
990 +value="<?php echo $link_name; ?>" style="width: 95%" />
991 +<span id="basics-name-view"><strong><?php echo $link_name; ?></strong></span>
992 +</td>
993 +<td>
994 +<select id="basics-hardcode-name" onchange="flip_hardcode('name')" name="hardcode_name">
995 +<option value="no" <?php echo $link->hardcode('name')?'':'selected="selected"'; ?>>update automatically</option>
996 +<option value="yes" <?php echo $link->hardcode('name')?'selected="selected"':''; ?>>edit manually</option>
997 +</select>
998 +</td>
999 +</tr>
1000 +<tr>
1001 +<th scope="row" width="20%"><?php _e('Short description:') ?></th>
1002 +<td width="60%">
1003 +<input id="basics-description-edit" type="text" name="description" value="<?php echo $link_description; ?>" style="width: 95%" />
1004 +<span id="basics-description-view"><strong><?php echo $link_description; ?></strong></span>
1005 +</td>
1006 +<td>
1007 +<select id="basics-hardcode-description" onchange="flip_hardcode('description')"
1008 +name="hardcode_description">
1009 +<option value="no" <?php echo $link->hardcode('description')?'':'selected="selected"'; ?>>update automatically</option>
1010 +<option value="yes" <?php echo $link->hardcode('description')?'selected="selected"':''; ?>>edit manually</option>
1011 +</select></td>
1012 +</tr>
1013 +<tr>
1014 +<th width="20%" scope="row"><?php _e('Homepage:') ?></th>
1015 +<td width="60%">
1016 +<input id="basics-url-edit" type="text" name="linkurl" value="<?php echo $link_url; ?>" style="width: 95%;" />
1017 +<a id="basics-url-view" href="<?php echo $link_url; ?>"><?php echo $link_url; ?></a></td>
1018 +<td>
1019 +<select id="basics-hardcode-url" onchange="flip_hardcode('url')" name="hardcode_url">
1020 +<option value="no"<?php echo $link->hardcode('url')?'':' selected="selected"'; ?>>update automatically</option>
1021 +<option value="yes"<?php echo $link->hardcode('url')?' selected="selected"':''; ?>>edit manually</option>
1022 +</select></td></tr>
1023 +
1024 +<tr>
1025 +<th width="20%"><?php _e('Last update') ?>:</th>
1026 +<td colspan="2"><?php
1027 + if (isset($meta['update/last'])) :
1028 + echo strftime('%x %X', $meta['update/last'])." ";
1029 + else :
1030 + echo " none yet";
1031 + endif;
1032 +?></td></tr>
1033 +<tr><th width="20%">Next update:</th>
1034 +<td colspan="2"><?php
1035 + $holdem = (isset($meta['update/hold']) ? $meta['update/hold'] : 'scheduled');
1036 +?>
1037 +<select name="update_schedule">
1038 +<option value="scheduled"<?php echo ($holdem=='scheduled')?' selected="selected"':''; ?>>update on schedule <?php
1039 + echo " (";
1040 + if (isset($meta['update/ttl']) and is_numeric($meta['update/ttl'])) :
1041 + if (isset($meta['update/timed']) and $meta['update/timed']=='automatically') :
1042 + echo 'next: ';
1043 + $next = $meta['update/last'] + ((int) $meta['update/ttl'] * 60);
1044 + if (strftime('%x', time()) != strftime('%x', $next)) :
1045 + echo strftime('%x', $next)." ";
1046 + endif;
1047 + echo strftime('%X', $meta['update/last']+((int) $meta['update/ttl']*60));
1048 + else :
1049 + echo "every ".$meta['update/ttl']." minute".(($meta['update/ttl']!=1)?"s":"");
1050 + endif;
348 1051 else:
349 - return $permalink;
1052 + echo "next scheduled update";
350 1053 endif;
351 -} // function syndication_permalink ()
1054 + echo ")";
1055 +?></option>
1056 +<option value="next"<?php echo ($holdem=='next')?' selected="selected"':''; ?>>update ASAP</option>
1057 +<option value="ping"<?php echo ($holdem=='ping')?' selected="selected"':''; ?>>update only when pinged</option>
1058 +</select></tr>
1059 +</table>
1060 +</fieldset>
352 1061
353 -################################################################################
354 -## ADMIN MENU ADD-ONS: register Dashboard management pages #####################
355 -################################################################################
1062 +<script type="text/javascript">
1063 +flip_hardcode('name');
1064 +flip_hardcode('description');
1065 +flip_hardcode('url');
1066 +</script>
356 1067
357 -function fwp_add_pages () {
358 - global $fwp_capability;
359 - global $fwp_path;
1068 +<p class="submit">
1069 +<input type="submit" name="submit" value="<?php _e('Save Changes &raquo;') ?>" />
1070 +</p>
360 1071
361 - add_menu_page('Syndicated Sites', 'Syndication', $fwp_capability['manage_links'], $fwp_path.'/syndication.php');
362 - add_submenu_page($fwp_path.'/syndication.php', 'Syndication Options', 'Options', $fwp_capability['manage_options'], $fwp_path.'/syndication-options.php');
363 - add_options_page('Syndication Options', 'Syndication', $fwp_capability['manage_options'], $fwp_path.'/syndication-options.php');
364 -} // function fwp_add_pages () */
1072 +<fieldset>
1073 +<legend>Syndicated Posts</legend>
365 1074
1075 +<?php fwp_category_box($dogs, 'all syndicated posts from this feed'); ?>
1076 +
1077 +<table class="editform" width="75%" cellspacing="2" cellpadding="5">
1078 +<tr><th width="27%" scope="row" style="vertical-align:top">Publication:</th>
1079 +<td width="73%" style="vertical-align:top"><ul style="margin:0; list-style:none">
1080 +<li><label><input type="radio" name="feed_post_status" value="site-default"
1081 +<?php echo $status['post']['site-default']; ?> /> Use site-wide setting from <a href="admin.php?page=feedwordpress/syndication-options.php">Syndication Options</a>
1082 +(currently: <strong><?php echo ($post_status_global ? $post_status_global : 'publish'); ?></strong>)</label></li>
1083 +<li><label><input type="radio" name="feed_post_status" value="publish"
1084 +<?php echo $status['post']['publish']; ?> /> Publish posts from this feed immediately</label></li>
1085 +<li><label><input type="radio" name="feed_post_status" value="private"
1086 +<?php echo $status['post']['private']; ?> /> Hold posts from this feed as private posts</label></li>
1087 +<li><label><input type="radio" name="feed_post_status" value="draft"
1088 +<?php echo $status['post']['draft']; ?> /> Hold posts from this feed as drafts</label></li>
1089 +</ul></td>
1090 +</tr>
1091 +
1092 +<tr><th width="27%" scope="row" style="vertical-align:top">Comments:</th>
1093 +<td width="73%"><ul style="margin:0; list-style:none">
1094 +<li><label><input type="radio" name="feed_comment_status" value="site-default"
1095 +<?php echo $status['comment']['site-default']; ?> /> Use site-wide setting from <a href="admin.php?page=feedwordpress/syndication-options.php">Syndication Options</a>
1096 +(currently: <strong><?php echo ($comment_status_global ? $comment_status_global : 'closed'); ?>)</strong></label></li>
1097 +<li><label><input type="radio" name="feed_comment_status" value="open"
1098 +<?php echo $status['comment']['open']; ?> /> Allow comments on syndicated posts from this feed</label></li>
1099 +<li><label><input type="radio" name="feed_comment_status" value="closed"
1100 +<?php echo $status['comment']['closed']; ?> /> Don't allow comments on syndicated posts from this feed</label></li>
1101 +</ul></td>
1102 +</tr>
1103 +
1104 +<tr><th width="27%" scope="row" style="vertical-align:top">Trackback and Pingback:</th>
1105 +<td width="73%"><ul style="margin:0; list-style:none">
1106 +<li><label><input type="radio" name="feed_ping_status" value="site-default"
1107 +<?php echo $status['ping']['site-default']; ?> /> Use site-wide setting from <a href="admin.php?page=feedwordpress/syndication-options.php">Syndication Options</a>
1108 +(currently: <strong><?php echo ($ping_status_global ? $ping_status_global : 'closed'); ?>)</strong></label></li>
1109 +<li><label><input type="radio" name="feed_ping_status" value="open"
1110 +<?php echo $status['ping']['open']; ?> /> Accept pings on syndicated posts from this feed</label></li>
1111 +<li><label><input type="radio" name="feed_ping_status" value="closed"
1112 +<?php echo $status['ping']['closed']; ?> /> Don't accept pings on syndicated posts from this feed</label></li>
1113 +</ul></td>
1114 +</tr>
1115 +</table>
1116 +</fieldset>
1117 +
1118 +<p class="submit">
1119 +<input type="submit" name="submit" value="<?php _e('Save Changes &raquo;') ?>" />
1120 +</p>
1121 +
1122 +<fieldset>
1123 +<legend>Advanced Feed Options</legend>
1124 +<table class="editform" width="100%" cellspacing="2" cellpadding="5">
1125 +<tr>
1126 +<th width="20%" scope="row" style="vertical-align:top">Unfamiliar authors:</th>
1127 +<td width="80%"><ul style="margin: 0; list-style:none">
1128 +<li><label><input type="radio" name="unfamiliar_author" value="site-default"<?php echo $unfamiliar['author']['site-default']; ?> /> use site-wide setting from <a href="admin.php?page=feedwordpress/syndication-options.php">Syndication Options</a>
1129 +(currently <strong><?php echo FeedWordPress::on_unfamiliar('author');; ?></strong>)</label></li>
1130 +<li><label><input type="radio" name="unfamiliar_author" value="create"<?php echo $unfamiliar['author']['create']; ?>/> create a new author account</label></li>
1131 +<li><label><input type="radio" name="unfamiliar_author" value="default"<?php echo $unfamiliar['author']['default']; ?> /> attribute the post to the default author</label></li>
1132 +<li><label><input type="radio" name="unfamiliar_author" value="filter"<?php echo $unfamiliar['author']['filter']; ?> /> don't syndicate the post</label></li>
1133 +</ul></td>
1134 +</tr>
1135 +
1136 +<tr>
1137 +<th width="20%" scope="row" style="vertical-align:top">Unfamiliar categories:</th>
1138 +<td width="80%"><ul style="margin: 0; list-style:none">
1139 +<li><label><input type="radio" name="unfamiliar_category" value="site-default"<?php echo $unfamiliar['category']['site-default']; ?> /> use site-wide setting from <a href="admin.php?page=feedwordpress/syndication-options.php">Syndication Options</a>
1140 +(currently <strong><?php echo FeedWordPress::on_unfamiliar('category');; ?></strong>)</label></li>
1141 +<li><label><input type="radio" name="unfamiliar_category" value="create"<?php echo $unfamiliar['category']['create']; ?> /> create any categories the post is in</label></li>
1142 +<li><label><input type="radio" name="unfamiliar_category" value="default"<?php echo $unfamiliar['category']['default']; ?> /> don't create new categories</label></li>
1143 +<li><label><input type="radio" name="unfamiliar_category" value="filter"<?php echo $unfamiliar['category']['filter']; ?> /> don't create new categories and don't syndicate posts unless they match at least one familiar category</label></li>
1144 +</ul></td>
1145 +</tr>
1146 +
1147 +<tr>
1148 +<th width="20%" scope="row" style="vertical-align:top">Multiple categories:</th>
1149 +<td width="80%">
1150 +<input type="text" size="20" id="cat_split" name="cat_split" value="<?php if (isset($meta['cat_split'])) : echo htmlspecialchars($meta['cat_split']); endif; ?>" /><br/>
1151 +Enter a <a href="http://us.php.net/manual/en/reference.pcre.pattern.syntax.php">Perl-compatible regular expression</a> here if the feed provides multiple
1152 +categories in a single category element. The regular expression should match
1153 +the characters used to separate one category from the next. If the feed uses
1154 +spaces (like <a href="http://del.icio.us/">del.icio.us</a>), use the pattern "\s".
1155 +If the feed does not provide multiple categories in a single element, leave this
1156 +blank.</td>
1157 +</tr>
1158 +</table>
1159 +</fieldset>
1160 +
1161 +<p class="submit">
1162 +<input type="submit" name="submit" value="<?php _e('Save Changes &raquo;') ?>" />
1163 +</p>
1164 +
1165 +<fieldset id="postcustom">
1166 +<legend>Custom Settings (for use in templates)</legend>
1167 +<div id="postcustomstuff">
1168 +<table id="meta-list" cellpadding="3">
1169 + <tr>
1170 + <th>Key</th>
1171 + <th>Value</th>
1172 + <th>Action</th>
1173 + </tr>
1174 +
1175 +<?php
1176 + $i = 0;
1177 + foreach ($meta as $key => $value) :
1178 + if (!preg_match("\007^((".implode(')|(', $special_settings)."))$\007i", $key)) :
1179 +?>
1180 + <tr style="vertical-align:top">
1181 + <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo wp_specialchars($key, 'both'); ?>" />
1182 + <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo wp_specialchars($key, 'both'); ?>" /></th>
1183 + <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>
1184 + <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
1185 + <option value="update">save changes</option>
1186 + <option value="delete">delete this setting</option>
1187 + </select></td>
1188 + </tr>
1189 +<?php
1190 + $i++;
1191 + endif;
1192 + endforeach;
1193 +?>
1194 + <tr>
1195 + <th scope="row"><input type="text" size="10" name="notes[<?php echo $i; ?>][key1]" value="" /></th>
1196 + <td><textarea name="notes[<?php echo $i; ?>][value]" rows="2" cols="40"></textarea></td>
1197 + <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo $i; ?>][action]" value="update" /></td>
1198 + </tr>
1199 +</table>
1200 +</fieldset>
1201 +
1202 +<p class="submit">
1203 +<input type="submit" name="submit" value="<?php _e('Save Changes &raquo;') ?>" />
1204 +</p>
1205 +
1206 +</div>
1207 + <?php
1208 + endif;
1209 + return false; // Don't continue
1210 +}
1211 +
1212 +function fwp_multidelete_page () {
1213 + global $wpdb;
1214 +
1215 + check_admin_referer(); // Make sure the referers are kosher
1216 +
1217 + $link_ids = (isset($_REQUEST['link_ids']) ? $_REQUEST['link_ids'] : array());
1218 + if (isset($_REQUEST['link_id'])) : array_push($link_ids, $_REQUEST['link_id']); endif;
1219 +
1220 + if (!current_user_can('manage_links')):
1221 + die (__("Cheatin' uh ?"));
1222 + elseif (isset($GLOBALS['fwp_post']['confirm']) and $GLOBALS['fwp_post']['confirm']=='Delete'):
1223 + foreach ($GLOBALS['fwp_post']['link_action'] as $link_id => $what) :
1224 + $do_it[$what][] = $link_id;
1225 + endforeach;
1226 +
1227 + $alter = array();
1228 + if (count($do_it['hide']) > 0) :
1229 + $hidem = "(".implode(', ', $do_it['hide']).")";
1230 + $alter[] = "
1231 + UPDATE $wpdb->links
1232 + SET link_visible = 'N'
1233 + WHERE link_id IN {$hidem}
1234 + ";
1235 + endif;
1236 +
1237 + if (count($do_it['nuke']) > 0) :
1238 + $nukem = "(".implode(', ', $do_it['nuke']).")";
1239 +
1240 + // Make a list of the items syndicated from this feed...
1241 + $post_ids = $wpdb->get_col("
1242 + SELECT post_id FROM $wpdb->postmeta
1243 + WHERE meta_key = 'syndication_feed_id'
1244 + AND meta_value IN {$nukem}
1245 + ");
1246 +
1247 + // ... and kill them all
1248 + if (count($post_ids) > 0) :
1249 + foreach ($post_ids as $post_id) :
1250 + wp_delete_post($post_id);
1251 + endforeach;
1252 + endif;
1253 +
1254 + $alter[] = "
1255 + DELETE FROM $wpdb->links
1256 + WHERE link_id IN {$nukem}
1257 + ";
1258 + endif;
1259 +
1260 + if (count($do_it['delete']) > 0) :
1261 + $deletem = "(".implode(', ', $do_it['delete']).")";
1262 +
1263 + // Make the items syndicated from this feed appear to be locally-authored
1264 + $alter[] = "
1265 + DELETE FROM $wpdb->postmeta
1266 + WHERE meta_key = 'syndication_feed_id'
1267 + AND meta_value IN {$deletem}
1268 + ";
1269 +
1270 + // ... and delete the links themselves.
1271 + $alter[] = "
1272 + DELETE FROM $wpdb->links
1273 + WHERE link_id IN {$deletem}
1274 + ";
1275 + endif;
1276 +
1277 + $errs = array(); $success = array ();
1278 + foreach ($alter as $sql) :
1279 + $result = $wpdb->query($sql);
1280 + if (!$result):
1281 + $errs[] = mysql_error();
1282 + endif;
1283 + endforeach;
1284 +
1285 + if (count($alter) > 0) :
1286 + echo "<div class=\"updated\">\n";
1287 + if (count($errs) > 0) :
1288 + echo "There were some problems processing your ";
1289 + echo "unsubscribe request. [SQL: ".implode('; ', $errs)."]";
1290 + else :
1291 + echo "Your unsubscribe request(s) have been processed.";
1292 + endif;
1293 + echo "</div>\n";
1294 + endif;
1295 +
1296 + return true; // Continue on to Syndicated Sites listing
1297 + else :
1298 + $targets = $wpdb->get_results("
1299 + SELECT * FROM $wpdb->links
1300 + WHERE link_id IN (".implode(",",$link_ids).")
1301 + ");
1302 +?>
1303 +<form action="admin.php?page=feedwordpress/<?php echo basename(__FILE__); ?>" method="post">
1304 +<div class="wrap">
1305 +<input type="hidden" name="action" value="Unsubscribe" />
1306 +<input type="hidden" name="confirm" value="Delete" />
1307 +
1308 +<h2>Unsubscribe from Syndicated Links:</h2>
1309 +<?php foreach ($targets as $link) :
1310 + $link_url = wp_specialchars($link->link_url, 1);
1311 + $link_name = wp_specialchars($link->link_name, 1);
1312 + $link_description = wp_specialchars($link->link_description, 'both');
1313 + $link_rss = wp_specialchars($link->link_rss, 'both');
1314 +?>
1315 +<fieldset>
1316 +<legend><?php echo $link_name; ?></legend>
1317 +<table class="editform" width="100%" cellspacing="2" cellpadding="5">
1318 +<tr><th scope="row" width="20%"><?php _e('Feed URI:') ?></th>
1319 +<td width="80%"><a href="<?php echo $link_rss; ?>"><?php echo $link_rss; ?></a></td></tr>
1320 +<tr><th scope="row" width="20%"><?php _e('Short description:') ?></th>
1321 +<td width="80%"><?php echo $link_description; ?></span></td></tr>
1322 +<tr><th width="20%" scope="row"><?php _e('Homepage:') ?></th>
1323 +<td width="80%"><a href="<?php echo $link_url; ?>"><?php echo $link_url; ?></a></td></tr>
1324 +<tr style="vertical-align:top"><th width="20%" scope="row">Subscription <?php _e('Options') ?>:</th>
1325 +<td width="80%"><ul style="margin:0; padding: 0; list-style: none">
1326 +<li><input type="radio" id="hide-<?php echo $link->link_id; ?>"
1327 +name="link_action[<?php echo $link->link_id; ?>]" value="hide" />
1328 +<label for="hide-<?php echo $link->link_id; ?>">Turn off the subscription for this
1329 +syndicated link<br/><span style="font-size:smaller">(Keep the feed information
1330 +and all the posts from this feed in the database, but don't syndicate any
1331 +new posts from the feed.)</span></label></li>
1332 +<li><input type="radio" id="nuke-<?php echo $link->link_id; ?>"
1333 +name="link_action[<?php echo $link->link_id; ?>]" value="nuke" />
1334 +<label for="nuke-<?php echo $link->link_id; ?>">Delete this syndicated link and all the
1335 +posts that were syndicated from it</label></li>
1336 +<li><input type="radio" id="delete-<?php echo $link->link_id; ?>"
1337 +name="link_action[<?php echo $link->link_id; ?>]" value="delete" />
1338 +<label for="delete-<?php echo $link->link_id; ?>">Delete this syndicated link, but
1339 +<em>keep</em> posts that were syndicated from it (as if they were authored
1340 +locally).</label></li>
1341 +<li><input type="radio" id="nothing-<?php echo $link->link_id; ?>"
1342 +name="link_action[<?php echo $link->link_id; ?>]" value="nothing" />
1343 +<label for="nothing-<?php echo $link->link_id; ?>">Keep this feed as it is. I changed
1344 +my mind.</label></li>
1345 +</ul>
1346 +</table>
1347 +</fieldset>
1348 +<?php endforeach; ?>
1349 +
1350 +<div class="submit">
1351 +<input class="delete" type="submit" name="submit" value="<?php _e('Unsubscribe from selected feeds &raquo;') ?>" />
1352 +</div>
1353 +</div>
1354 +<?php
1355 + return false; // Don't continue on to Syndicated Sites listing
1356 + endif;
1357 +}
1358 +
366 1359 ################################################################################
367 1360 ## fwp_hold_pings() and fwp_release_pings(): Outbound XML-RPC ping reform ####
368 1361 ## ... 'coz it's rude to send 500 pings the first time your aggregator runs ####
369 1362 ################################################################################
@@ -627,20 +1620,14 @@
627 1620 return $link_id;
628 1621 } // function FeedWordPress::syndicate_link()
629 1622
630 1623 function on_unfamiliar ($what = 'author', $override = NULL) {
631 - $set = array(
632 - 'author' => array('create', 'default', 'filter'),
633 - 'category' => array('create', 'tag', 'default', 'filter'),
634 - );
635 -
636 - if (is_string($override)) :
637 - $ret = strtolower($override);
638 - endif;
1624 + $set = array('create', 'default', 'filter');
639 1625
640 - if (!is_numeric($override) and !in_array($ret, $set[$what])) :
1626 + $ret = strtolower($override);
1627 + if (!in_array($ret, $set)) :
641 1628 $ret = get_option('feedwordpress_unfamiliar_'.$what);
642 - if (!is_numeric($ret) and !in_array($ret, $set[$what])) :
1629 + if (!in_array($ret, $set)) :
643 1630 $ret = 'create';
644 1631 endif;
645 1632 endif;
646 1633
@@ -846,8 +1833,13 @@
846 1833
847 1834 var $_freshness = null;
848 1835 var $_wp_id = null;
849 1836
1837 + var $strip_attrs = array (
1838 + array('[a-z]+', 'style'),
1839 + array('[a-z]+', 'target'),
1840 + );
1841 +
850 1842 function SyndicatedPost ($item, $link) {
851 1843 global $wpdb;
852 1844
853 1845 $this->link = $link;
@@ -878,14 +1870,14 @@
878 1870 # That's deliberate. The escaping is done at the point
879 1871 # of insertion, not here, to avoid double-escaping and
880 1872 # to avoid screwing with syndicated_post filters
881 1873
882 - $this->post['post_title'] = apply_filters('syndicated_item_title', $this->item['title'], $this);
1874 + $this->post['post_title'] = $this->item['title'];
883 1875
884 - // This just gives us an alphanumeric representation of
1876 + // This just gives usan alphanumeric representation of
885 1877 // the author. We will look up (or create) the numeric
886 1878 // ID for the author in SyndicatedPost::add()
887 - $this->post['named']['author'] = apply_filters('syndicated_item_author', $this->author(), $this);
1879 + $this->post['named']['author'] = $this->author();
888 1880
889 1881 # Identify content and sanitize it.
890 1882 # ---------------------------------
891 1883 if (isset($this->item['xhtml']['body'])) :
@@ -896,9 +1888,24 @@
896 1888 $content = $this->item['content']['encoded'];
897 1889 else:
898 1890 $content = $this->item['description'];
899 1891 endif;
900 - $this->post['post_content'] = apply_filters('syndicated_item_content', $content, $this);
1892 +
1893 + # FeedWordPress used to resolve URIs relative to the
1894 + # feed URI. It now relies on the xml:base support
1895 + # baked in to the MagpieRSS upgrade. So all we do here
1896 + # now is to sanitize problematic attributes.
1897 + #
1898 + # This kind of sucks. I intend to replace it with
1899 + # lib_filter sometime soon.
1900 + foreach ($this->strip_attrs as $pair):
1901 + list($tag,$attr) = $pair;
1902 + $content = preg_replace (
1903 + ":(<$tag [^>]*)($attr=(\"[^\">]*\"|[^>\\s]+))([^>]*>):i",
1904 + "\\1\\4",
1905 + $content
1906 + );
1907 + endforeach;
901 1908
902 1909 # Identify and sanitize excerpt
903 1910 $excerpt = NULL;
904 1911 if ( isset($this->item['description']) and $this->item['description'] ) :
@@ -908,10 +1915,11 @@
908 1915 if (strlen($excerpt) > 255) :
909 1916 $excerpt = substr($excerpt,0,252).'...';
910 1917 endif;
911 1918 endif;
912 - $excerpt = apply_filters('syndicated_item_excerpt', $excerpt, $this);
913 1919
1920 + $this->post['post_content'] = $content;
1921 +
914 1922 if (!is_null($excerpt)):
915 1923 $this->post['post_excerpt'] = $excerpt;
916 1924 endif;
917 1925
@@ -919,11 +1927,11 @@
919 1927 if (!$this->use_api('wp_insert_post')) :
920 1928 $this->post['post_name'] = sanitize_title($this->post['post_title']);
921 1929 endif;
922 1930
923 - $this->post['epoch']['issued'] = apply_filters('syndicated_item_published', $this->published(), $this);
924 - $this->post['epoch']['created'] = apply_filters('syndicated_item_created', $this->created(), $this);
925 - $this->post['epoch']['modified'] = apply_filters('syndicated_item_updated', $this->updated(), $this);
1931 + $this->post['epoch']['issued'] = $this->published();
1932 + $this->post['epoch']['created'] = $this->created();
1933 + $this->post['epoch']['modified'] = $this->updated();
926 1934
927 1935 // Dealing with timestamps in WordPress is so fucking fucked.
928 1936 $offset = (int) get_option('gmt_offset') * 60 * 60;
929 1937 $this->post['post_date'] = gmdate('Y-m-d H:i:s', $this->published() + $offset);
@@ -936,9 +1944,9 @@
936 1944 $this->post['comment_status'] = $this->link->syndicated_status('comment', 'closed');
937 1945 $this->post['ping_status'] = $this->link->syndicated_status('ping', 'closed');
938 1946
939 1947 // Unique ID (hopefully a unique tag: URI); failing that, the permalink
940 - $this->post['guid'] = apply_filters('syndicated_item_guid', $this->guid(), $this);
1948 + $this->post['guid'] = $this->guid();
941 1949
942 1950 // RSS 2.0 / Atom 1.0 enclosure support
943 1951 if ( isset($this->item['enclosure#']) ) :
944 1952 for ($i = 1; $i <= $this->item['enclosure#']; $i++) :
@@ -943,28 +1951,28 @@
943 1951 if ( isset($this->item['enclosure#']) ) :
944 1952 for ($i = 1; $i <= $this->item['enclosure#']; $i++) :
945 1953 $eid = (($i > 1) ? "#{$id}" : "");
946 1954 $this->post['meta']['enclosure'][] =
947 - apply_filters('syndicated_item_enclosure_url', $this->item["enclosure{$eid}@url"], $this)."\n".
948 - apply_filters('syndicated_item_enclosure_length', $this->item["enclosure{$eid}@length"], $this)."\n".
949 - apply_filters('syndicated_item_enclosure_type', $this->item["enclosure{$eid}@type"], $this);
1955 + $this->item["enclosure{$eid}@url"]."\n".
1956 + $this->item["enclosure{$eid}@length"]."\n".
1957 + $this->item["enclosure{$eid}@type"];
950 1958 endfor;
951 1959 endif;
952 1960
953 1961 // In case you want to point back to the blog this was syndicated from
954 1962 if (isset($this->feed->channel['title'])) :
955 - $this->post['meta']['syndication_source'] = apply_filters('syndicated_item_source_title', $this->feed->channel['title'], $this);
1963 + $this->post['meta']['syndication_source'] = $this->feed->channel['title'];
956 1964 endif;
957 1965 if (isset($this->feed->channel['link'])) :
958 - $this->post['meta']['syndication_source_uri'] = apply_filters('syndicated_item_source_link', $this->feed->channel['link'], $this);
1966 + $this->post['meta']['syndication_source_uri'] = $this->feed->channel['link'];
959 1967 endif;
960 1968
961 1969 // Store information on human-readable and machine-readable comment URIs
962 1970 if (isset($this->item['comments'])) :
963 - $this->post['meta']['rss:comments'] = apply_filters('syndicated_item_comments', $this->item['comments']);
1971 + $this->post['meta']['rss:comments'] = $this->item['comments'];
964 1972 endif;
965 1973 if (isset($this->item['wfw']['commentrss'])) :
966 - $this->post['meta']['wfw:commentRSS'] = apply_filters('syndicated_item_commentrss', $this->item['wfw']['commentrss']);
1974 + $this->post['meta']['wfw:commentRSS'] = $this->item['wfw']['commentrss'];
967 1975 endif;
968 1976
969 1977 // Store information to identify the feed that this came from
970 1978 $this->post['meta']['syndication_feed'] = $this->feedmeta['link/uri'];
@@ -970,16 +1978,13 @@
970 1978 $this->post['meta']['syndication_feed'] = $this->feedmeta['link/uri'];
971 1979 $this->post['meta']['syndication_feed_id'] = $this->feedmeta['link/id'];
972 1980
973 1981 // In case you want to know the external permalink...
974 - $this->post['meta']['syndication_permalink'] = apply_filters('syndicated_item_link', $this->item['link']);
1982 + $this->post['meta']['syndication_permalink'] = $this->item['link'];
975 1983
976 - // Store a hash of the post content for checking whether something needs to be updated
977 - $this->post['meta']['syndication_item_hash'] = $this->update_hash();
978 -
979 1984 // Feed-by-feed options for author and category creation
980 1985 $this->post['named']['unfamiliar']['author'] = $this->feedmeta['unfamiliar author'];
981 - $this->post['named']['unfamiliar']['category'] = $this->feedmeta['unfamiliar category'];
1986 + $this->post['named']['unfamiliar']['category'] = $this->feedmeta['unfamiliar categories'];
982 1987
983 1988 // Categories: start with default categories, if any
984 1989 $fc = get_option("feedwordpress_syndication_cats");
985 1990 if ($fc) :
@@ -1006,22 +2011,8 @@
1006 2011 $this->post['named']['category'][] = $cat;
1007 2012 endif;
1008 2013 endfor;
1009 2014 endif;
1010 - $this->post['named']['category'] = apply_filters('syndicated_item_categories', $this->post['named']['category'], $this);
1011 -
1012 - // Tags: start with default tags, if any
1013 - $ft = get_option("feedwordpress_syndication_tags");
1014 - if ($ft) :
1015 - $this->post['tags_input'] = explode('FEEDWORDPRESS_CAT_SEPARATOR', $ft);
1016 - else :
1017 - $this->post['tags_input'] = array();
1018 - endif;
1019 -
1020 - if (is_array($this->feedmeta['tags'])) :
1021 - $this->post['tags_input'] = array_merge($this->post['tags_input'], $this->feedmeta['tags']);
1022 - endif;
1023 -
1024 2015 endif;
1025 2016 } // SyndicatedPost::SyndicatedPost()
1026 2017
1027 2018 function filtered () {
@@ -1042,35 +2033,18 @@
1042 2033 SELECT id, guid, post_modified_gmt
1043 2034 FROM $wpdb->posts WHERE guid='$guid'
1044 2035 ");
1045 2036
2037 + preg_match('/([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/', $result->post_modified_gmt, $backref);
2038 + $updated = gmmktime($backref[4], $backref[5], $backref[6], $backref[2], $backref[3], $backref[1]);
1046 2039 if (!$result) :
1047 2040 $this->_freshness = 2; // New content
1048 - else:
1049 - $stored_update_hashes = get_post_custom_values('syndication_item_hash', $result->id);
1050 - if (count($stored_update_hashes) > 0) :
1051 - $stored_update_hash = $stored_update_hashes[0];
1052 - $update_hash_changed = ($stored_update_hash != $this->update_hash());
1053 - else :
1054 - $update_hash_changed = false;
1055 - endif;
1056 -
1057 - preg_match('/([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/', $result->post_modified_gmt, $backref);
1058 -
1059 - $last_rev_ts = gmmktime($backref[4], $backref[5], $backref[6], $backref[2], $backref[3], $backref[1]);
1060 - $updated_ts = $this->updated(/*fallback=*/ true, /*default=*/ NULL);
1061 - $updated = ((
1062 - !is_null($updated_ts)
1063 - and ($updated_ts > $last_rev_ts)
1064 - ) or $update_hash_changed);
1065 -
1066 - if ($updated) :
1067 - $this->_freshness = 1; // Updated content
1068 - $this->_wp_id = $result->id;
1069 - else :
1070 - $this->_freshness = 0; // Same old, same old
1071 - $this->_wp_id = $result->id;
1072 - endif;
2041 + elseif ($this->updated() > $updated) :
2042 + $this->_freshness = 1; // Updated content
2043 + $this->_wp_id = $result->id;
2044 + else :
2045 + $this->_freshness = 0; // Same old, same old
2046 + $this->_wp_id = $result->id;
1073 2047 endif;
1074 2048 endif;
1075 2049 return $this->_freshness;
1076 2050 }
@@ -1106,17 +2080,13 @@
1106 2080 endif;
1107 2081
1108 2082 if (!$this->filtered() and $freshness > 0) :
1109 2083 # -- Look up, or create, numeric ID for categories
1110 - list($pcats, $ptags) = $this->category_ids (
2084 + $this->post['post_category'] = $this->category_ids (
1111 2085 $this->post['named']['category'],
1112 - FeedWordPress::on_unfamiliar('category', $this->post['named']['unfamiliar']['category']),
1113 - /*tags_too=*/ true
2086 + FeedWordPress::on_unfamiliar('category', $this->post['named']['unfamiliar']['category'])
1114 2087 );
1115 -
1116 - $this->post['post_category'] = $pcats;
1117 - $this->post['tags_input'] = array_merge($this->post['tags_input'], $ptags);
1118 -
2088 +
1119 2089 if (is_null($this->post['post_category'])) :
1120 2090 // filter mode on, no matching categories; drop the post
1121 2091 $this->post = NULL;
1122 2092 else :
@@ -1172,37 +2142,15 @@
1172 2142 $dbpost[$key] = $value;
1173 2143 endif;
1174 2144 endforeach;
1175 2145
1176 - if (strlen($dbpost['post_title'].$dbpost['post_content'].$dbpost['post_excerpt']) == 0) :
1177 - // FIXME: Option for filtering out empty posts
1178 - endif;
1179 - if (strlen($dbpost['post_title'])==0) :
1180 - $dbpost['post_title'] = $this->post['meta']['syndication_source']
1181 - .' '.gmdate('Y-m-d H:i:s', $this->published() + $offset);
1182 - // FIXME: Option for what to fill a blank title with...
1183 - endif;
1184 -
1185 2146 if ($this->use_api('wp_insert_post')) :
1186 2147 $dbpost['post_pingback'] = false; // Tell WP 2.1 and 2.2 not to process for pingbacks
1187 -
1188 - // This is a ridiculous fucking kludge necessitated by WordPress 2.6 munging authorship meta-data
1189 - add_action('_wp_put_post_revision', array($this, 'fix_revision_meta'));
2148 + $this->_wp_id = wp_insert_post($dbpost);
1190 2149
1191 - // Kludge to prevent kses filters from stripping the
1192 - // content of posts when updating without a logged in
1193 - // user who has `unfiltered_html` capability.
1194 - add_filter('content_save_pre', array($this, 'avoid_kses_munge'), 11);
1195 -
1196 - $this->_wp_id = wp_insert_post($dbpost);
1197 -
1198 - // Turn off ridiculous fucking kludges #1 and #2
1199 - remove_action('_wp_put_post_revision', array($this, 'fix_revision_meta'));
1200 - remove_filter('content_save_pre', array($this, 'avoid_kses_munge'), 11);
1201 -
1202 2150 // This should never happen.
1203 2151 if (!is_numeric($this->_wp_id) or ($this->_wp_id == 0)) :
1204 - FeedWordPress::critical_bug('SyndicatedPost (_wp_id problem)', array("dbpost" => $dbpost, "this" => $this), __LINE__);
2152 + FeedWordPress::critical_bug('SyndicatedPost (_wp_id problem)', $this, __LINE__);
1205 2153 endif;
1206 2154
1207 2155 // Unfortunately, as of WordPress 2.3, wp_insert_post()
1208 2156 // *still* offers no way to use a guid of your choice,
@@ -1245,9 +2193,9 @@
1245 2193 $this->_wp_id = $wpdb->insert_id;
1246 2194
1247 2195 // This should never happen.
1248 2196 if (!is_numeric($this->_wp_id) or ($this->_wp_id == 0)) :
1249 - FeedWordPress::critical_bug('SyndicatedPost (_wp_id problem)', array("dbpost" => $dbpost, "this" => $this), __LINE__);
2197 + FeedWordPress::critical_bug('SyndicatedPost::_wp_id', $this->_wp_id, __LINE__);
1250 2198 endif;
1251 2199
1252 2200 // WordPress 1.5.x - 2.0.x
1253 2201 wp_set_post_cats('1', $this->wp_id(), $this->post['post_category']);
@@ -1276,26 +2224,13 @@
1276 2224 endforeach;
1277 2225
1278 2226 if ($this->use_api('wp_insert_post')) :
1279 2227 $dbpost['post_pingback'] = false; // Tell WP 2.1 and 2.2 not to process for pingbacks
1280 -
1281 - // This is a ridiculous fucking kludge necessitated by WordPress 2.6 munging authorship meta-data
1282 - add_action('_wp_put_post_revision', array($this, 'fix_revision_meta'));
1283 -
1284 - // Kludge to prevent kses filters from stripping the
1285 - // content of posts when updating without a logged in
1286 - // user who has `unfiltered_html` capability.
1287 - add_filter('content_save_pre', array($this, 'avoid_kses_munge'), 11);
1288 -
1289 2228 $this->_wp_id = wp_insert_post($dbpost);
1290 2229
1291 - // Turn off ridiculous fucking kludges #1 and #2
1292 - remove_action('_wp_put_post_revision', array($this, 'fix_revision_meta'));
1293 - remove_filter('content_save_pre', array($this, 'avoid_kses_munge'), 11);
1294 -
1295 2230 // This should never happen.
1296 2231 if (!is_numeric($this->_wp_id) or ($this->_wp_id == 0)) :
1297 - FeedWordPress::critical_bug('SyndicatedPost (_wp_id problem)', array("dbpost" => $dbpost, "this" => $this), __LINE__);
2232 + FeedWordPress::critical_bug('SyndicatedPost::_wp_id', $this->_wp_id, __LINE__);
1298 2233 endif;
1299 2234
1300 2235 // Unfortunately, as of WordPress 2.3, wp_insert_post()
1301 2236 // munges your post modified timestamp.
@@ -1328,9 +2263,9 @@
1328 2263 elseif (function_exists('wp_set_post_cats')) :
1329 2264 wp_set_post_cats('1', $this->wp_id(), $this->post['post_category']);
1330 2265 // This should never happen.
1331 2266 else :
1332 - FeedWordPress::critical_bug('SyndicatedPost (_wp_id problem)', array("dbpost" => $dbpost, "this" => $this), __LINE__);
2267 + FeedWordPress::critical_bug('SyndicatedPost::insert_new::wp_version', $GLOBALS['wp_version'], __LINE__);
1333 2268 endif;
1334 2269
1335 2270 // Since we are not going through official channels, we need to
1336 2271 // manually tell WordPress that we've published a new post.
@@ -1341,63 +2276,8 @@
1341 2276 do_action('edit_post', $this->post['ID']);
1342 2277 endif;
1343 2278 } /* SyndicatedPost::update_existing() */
1344 2279
1345 - /**
1346 - * SyndicatedPost::fix_revision_meta() - Fixes the way WP 2.6+ fucks up
1347 - * meta-data (authorship, etc.) when storing revisions of an updated
1348 - * syndicated post.
1349 - *
1350 - * In their infinite wisdom, the WordPress coders have made it completely
1351 - * impossible for a plugin that uses wp_insert_post() to set certain
1352 - * meta-data (such as the author) when you store an old revision of an
1353 - * updated post. Instead, it uses the WordPress defaults (= currently
1354 - * active user ID if the process is running with a user logged in, or
1355 - * = #0 if there is no user logged in). This results in bogus authorship
1356 - * data for revisions that are syndicated from off the feed, unless we
1357 - * use a ridiculous kludge like this to end-run the munging of meta-data
1358 - * by _wp_put_post_revision.
1359 - *
1360 - * @param int $revision_id The revision ID to fix up meta-data
1361 - */
1362 - function fix_revision_meta ($revision_id) {
1363 - global $wpdb;
1364 -
1365 - $post_author = (int) $this->post['post_author'];
1366 -
1367 - $revision_id = (int) $revision_id;
1368 - $wpdb->query("
1369 - UPDATE $wpdb->posts
1370 - SET post_author={$this->post['post_author']}
1371 - WHERE post_type = 'revision' AND ID='$revision_id'
1372 - ");
1373 - } /* SyndicatedPost::fix_revision_meta () */
1374 -
1375 - /**
1376 - * SyndicatedPost::avoid_kses_munge() -- If FeedWordPress is processing
1377 - * an automatic update, that generally means that wp_insert_post() is
1378 - * being called under the user credentials of whoever is viewing the
1379 - * blog at the time -- usually meaning no user at all. But if WordPress
1380 - * gets a wp_insert_post() when current_user_can('unfiltered_html') is
1381 - * false, it will run the content of the post through a kses function
1382 - * that strips out lots of HTML tags -- notably <object> and some others.
1383 - * This causes problems for syndicating (for example) feeds that contain
1384 - * YouTube videos. It also produces an unexpected asymmetry between
1385 - * automatically-initiated updates and updates initiated manually from
1386 - * the WordPress Dashboard (which are usually initiated under the
1387 - * credentials of a logged-in admin, and so don't get run through the
1388 - * kses function). So, to avoid the whole mess, what we do here is
1389 - * just forcibly disable the kses munging for a single syndicated post,
1390 - * by restoring the contents of the `post_content` field.
1391 - *
1392 - * @param string $content The content of the post, after other filters have gotten to it
1393 - * @return string The original content of the post, before other filters had a chance to munge it.
1394 - */
1395 - function avoid_kses_munge ($content) {
1396 - global $wpdb;
1397 - return $wpdb->escape($this->post['post_content']);
1398 - }
1399 -
1400 2280 // SyndicatedPost::add_rss_meta: adds interesting meta-data to each entry
1401 2281 // using the space for custom keys. The set of keys and values to add is
1402 2282 // specified by the keys and values of $post['meta']. This is used to
1403 2283 // store anything that the WordPress user might want to access from a
@@ -1468,89 +2348,86 @@
1468 2348 $author = $wpdb->escape($author);
1469 2349 $email = $wpdb->escape($email);
1470 2350 $url = $wpdb->escape($url);
1471 2351
1472 - // Check for an existing author rule....
1473 - if (isset($this->link->settings['map authors']['name'][strtolower(trim($author))])) :
1474 - $author_rule = $this->link->settings['map authors']['name'][strtolower(trim($author))];
1475 - else :
1476 - $author_rule = NULL;
1477 - endif;
1478 -
1479 - // User name is mapped to a particular author. If that author ID exists, use it.
1480 - if (is_numeric($author_rule) and get_userdata((int) $author_rule)) :
1481 - $id = (int) $author_rule;
1482 -
1483 - // User name is filtered out
1484 - elseif ('filter' == $author_rule) :
1485 - $id = NULL;
1486 -
1487 - else :
1488 - // Check the database for an existing author record that might fit
1489 -
2352 + // Look for an existing author record that fits...
2353 + if (!isset($wp_db_version)) :
1490 2354 #-- WordPress 1.5.x
1491 - if (!isset($wp_db_version)) :
1492 - $id = $wpdb->get_var(
1493 - "SELECT ID from $wpdb->users
1494 - WHERE
1495 - TRIM(LCASE(user_login)) = TRIM(LCASE('$login')) OR
1496 - (
1497 - LENGTH(TRIM(LCASE(user_email))) > 0
1498 - AND TRIM(LCASE(user_email)) = TRIM(LCASE('$email'))
1499 - ) OR
1500 - TRIM(LCASE(user_firstname)) = TRIM(LCASE('$author')) OR
1501 - TRIM(LCASE(user_nickname)) = TRIM(LCASE('$author')) OR
1502 - TRIM(LCASE(user_nicename)) = TRIM(LCASE('$nice_author')) OR
1503 - TRIM(LCASE(user_description)) = TRIM(LCASE('$author')) OR
1504 - (
1505 - LOWER(user_description)
1506 - RLIKE CONCAT(
1507 - '(^|\\n)a\\.?k\\.?a\\.?( |\\t)*:?( |\\t)*',
1508 - LCASE('$reg_author'),
1509 - '( |\\t|\\r)*(\\n|\$)'
1510 - )
2355 + $id = $wpdb->get_var(
2356 + "SELECT ID from $wpdb->users
2357 + WHERE
2358 + TRIM(LCASE(user_login)) = TRIM(LCASE('$login')) OR
2359 + (
2360 + LENGTH(TRIM(LCASE(user_email))) > 0
2361 + AND TRIM(LCASE(user_email)) = TRIM(LCASE('$email'))
2362 + ) OR
2363 + TRIM(LCASE(user_firstname)) = TRIM(LCASE('$author')) OR
2364 + TRIM(LCASE(user_nickname)) = TRIM(LCASE('$author')) OR
2365 + TRIM(LCASE(user_nicename)) = TRIM(LCASE('$nice_author')) OR
2366 + TRIM(LCASE(user_description)) = TRIM(LCASE('$author')) OR
2367 + (
2368 + LOWER(user_description)
2369 + RLIKE CONCAT(
2370 + '(^|\\n)a\\.?k\\.?a\\.?( |\\t)*:?( |\\t)*',
2371 + LCASE('$reg_author'),
2372 + '( |\\t|\\r)*(\\n|\$)'
1511 2373 )
1512 - ");
1513 -
2374 + )
2375 + ");
2376 + elseif ($wp_db_version >= 2966) :
1514 2377 #-- WordPress 2.0+
1515 - elseif ($wp_db_version >= 2966) :
2378 +
2379 + # First try the user core data table.
2380 + $id = $wpdb->get_var(
2381 + "SELECT ID FROM $wpdb->users
2382 + WHERE
2383 + TRIM(LCASE(user_login)) = TRIM(LCASE('$login'))
2384 + OR (
2385 + LENGTH(TRIM(LCASE(user_email))) > 0
2386 + AND TRIM(LCASE(user_email)) = TRIM(LCASE('$email'))
2387 + )
2388 + OR TRIM(LCASE(user_nicename)) = TRIM(LCASE('$nice_author'))
2389 + ");
1516 2390
1517 - // First try the user core data table.
2391 + if (is_null($id)) : # Then look for aliases in the user meta data table
1518 2392 $id = $wpdb->get_var(
1519 - "SELECT ID FROM $wpdb->users
2393 + "SELECT user_id FROM $wpdb->usermeta
1520 2394 WHERE
1521 - TRIM(LCASE(user_login)) = TRIM(LCASE('$login'))
2395 + (meta_key = 'description' AND TRIM(LCASE(meta_value)) = TRIM(LCASE('$author')))
1522 2396 OR (
1523 - LENGTH(TRIM(LCASE(user_email))) > 0
1524 - AND TRIM(LCASE(user_email)) = TRIM(LCASE('$email'))
2397 + meta_key = 'description'
2398 + AND TRIM(LCASE(meta_value))
2399 + RLIKE CONCAT(
2400 + '(^|\\n)a\\.?k\\.?a\\.?( |\\t)*:?( |\\t)*',
2401 + TRIM(LCASE('$reg_author')),
2402 + '( |\\t|\\r)*(\\n|\$)'
2403 + )
1525 2404 )
1526 - OR TRIM(LCASE(user_nicename)) = TRIM(LCASE('$nice_author'))
1527 2405 ");
1528 -
1529 - // If that fails, look for aliases in the user meta data table
1530 - if (is_null($id)) :
1531 - $id = $wpdb->get_var(
1532 - "SELECT user_id FROM $wpdb->usermeta
1533 - WHERE
1534 - (meta_key = 'description' AND TRIM(LCASE(meta_value)) = TRIM(LCASE('$author')))
1535 - OR (
1536 - meta_key = 'description'
1537 - AND TRIM(LCASE(meta_value))
1538 - RLIKE CONCAT(
1539 - '(^|\\n)a\\.?k\\.?a\\.?( |\\t)*:?( |\\t)*',
1540 - TRIM(LCASE('$reg_author')),
1541 - '( |\\t|\\r)*(\\n|\$)'
1542 - )
1543 - )
1544 - ");
1545 - endif;
1546 2406 endif;
2407 + endif;
1547 2408
1548 - // ... if you don't find one, then do what you need to do
1549 - if (is_null($id)) :
1550 - if ($unfamiliar_author === 'create') :
2409 + // ... if you don't find one, then do what you need to do
2410 + if (is_null($id)) :
2411 + if ($unfamiliar_author === 'create') :
2412 + if (!isset($wp_db_version)) :
2413 + #-- WordPress 1.5.x
2414 + $wpdb->query (
2415 + "INSERT INTO $wpdb->users
2416 + SET
2417 + ID='0',
2418 + user_login='$login',
2419 + user_firstname='$author',
2420 + user_nickname='$author',
2421 + user_nicename='$nice_author',
2422 + user_description='$author',
2423 + user_email='$email',
2424 + user_url='$url'");
2425 + $id = $wpdb->insert_id;
2426 + elseif ($wp_db_version >= 2966) :
2427 + #-- WordPress 2.0+
1551 2428 $userdata = array();
1552 -
2429 +
1553 2430 #-- user table data
1554 2431 $userdata['ID'] = NULL; // new user
1555 2432 $userdata['user_login'] = $login;
1556 2433 $userdata['user_nicename'] = $nice_author;
@@ -1557,26 +2434,20 @@
1557 2434 $userdata['user_pass'] = substr(md5(uniqid(microtime())), 0, 6); // just something random to lock it up
1558 2435 $userdata['user_email'] = $email;
1559 2436 $userdata['user_url'] = $url;
1560 2437 $userdata['display_name'] = $author;
1561 -
2438 +
1562 2439 $id = wp_insert_user($userdata);
1563 - elseif (is_numeric($unfamiliar_author) and get_userdata((int) $unfamiliar_author)) :
1564 - $id = (int) $unfamiliar_author;
1565 - elseif ($unfamiliar_author === 'default') :
1566 - $id = 1;
1567 2440 endif;
2441 + elseif ($unfamiliar_author === 'default') :
2442 + $id = 1;
1568 2443 endif;
1569 2444 endif;
1570 -
1571 - if ($id) :
1572 - $this->link->settings['map authors']['name'][strtolower(trim($author))] = $id;
1573 - endif;
1574 2445 return $id;
1575 2446 } // function SyndicatedPost::author_id ()
1576 2447
1577 2448 // look up (and create) category ids from a list of categories
1578 - function category_ids ($cats, $unfamiliar_category = 'create', $tags_too = false) {
2449 + function category_ids ($cats, $unfamiliar_category = 'create') {
1579 2450 global $wpdb;
1580 2451
1581 2452 // We need to normalize whitespace because (1) trailing
1582 2453 // whitespace can cause PHP and MySQL not to see eye to eye on
@@ -1585,10 +2456,8 @@
1585 2456 // because I doubt most people want to make a semantic
1586 2457 // distinction between 'Computers' and 'Computers '
1587 2458 $cats = array_map('trim', $cats);
1588 2459
1589 - $tags = array();
1590 -
1591 2460 $cat_ids = array ();
1592 2461 foreach ($cats as $cat_name) :
1593 2462 if (preg_match('/^{#([0-9]+)}$/', $cat_name, $backref)) :
1594 2463 $cat_id = (int) $backref[1];
@@ -1616,10 +2485,8 @@
1616 2485 )) :
1617 2486 foreach ($results AS $term) :
1618 2487 $cat_ids[] = (int) $term->term_id;
1619 2488 endforeach;
1620 - elseif ('tag'==$unfamiliar_category) :
1621 - $tags[] = $cat_name;
1622 2489 elseif ('create'===$unfamiliar_category) :
1623 2490 $term = wp_insert_term($cat_name, 'category');
1624 2491 $cat_ids[] = $term['term_id'];
1625 2492 endif;
@@ -1663,28 +2530,18 @@
1663 2530 $cat_ids = NULL; // Drop the post
1664 2531 else :
1665 2532 $cat_ids = array_unique($cat_ids);
1666 2533 endif;
1667 -
1668 - if ($tags_too) : $ret = array($cat_ids, $tags);
1669 - else : $ret = $cat_ids;
1670 - endif;
1671 -
1672 - return $ret;
2534 + return $cat_ids;
1673 2535 } // function SyndicatedPost::category_ids ()
1674 2536
1675 2537 function use_api ($tag) {
1676 2538 global $wp_db_version;
1677 - switch ($tag) :
1678 - case 'wp_insert_post':
2539 + if ('wp_insert_post'==$tag) :
1679 2540 // Before 2.2, wp_insert_post does too much of the wrong stuff to use it
1680 2541 // In 1.5 it was such a resource hog it would make PHP segfault on big updates
1681 2542 $ret = (isset($wp_db_version) and $wp_db_version > FWP_SCHEMA_21);
1682 - break;
1683 - case 'post_status_pending':
1684 - $ret = (isset($wp_db_version) and $wp_db_version > FWP_SCHEMA_23);
1685 - break;
1686 - endswitch;
2543 + endif;
1687 2544 return $ret;
1688 2545 } // function SyndicatedPost::use_api ()
1689 2546
1690 2547 #### EXTRACT DATA FROM FEED ITEM ####
@@ -1722,18 +2579,14 @@
1722 2579 endif;
1723 2580
1724 2581 # If everything failed, then default to the current time.
1725 2582 if (is_null($epoch)) :
1726 - if (-1 == $default) :
1727 - $epoch = time();
1728 - else :
1729 - $epoch = $default;
1730 - endif;
2583 + $epoch = time();
1731 2584 endif;
1732 2585
1733 2586 return $epoch;
1734 2587 }
1735 - function updated ($fallback = true, $default = -1) {
2588 + function updated ($fallback = true) {
1736 2589 $epoch = null;
1737 2590
1738 2591 # As far as I know, only dcterms and Atom have reliable ways to
1739 2592 # specify when something was *modified* last. If neither is
@@ -1746,27 +2599,19 @@
1746 2599 $epoch = @parse_w3cdtf($this->item['modified']);
1747 2600 elseif (isset($this->item['updated'])): // Atom 1.0
1748 2601 $epoch = @parse_w3cdtf($this->item['updated']);
1749 2602 elseif ($fallback) : // Fall back to issued / dc:date
1750 - $epoch = $this->published(/*fallback=*/ false, /*default=*/ $default);
2603 + $epoch = $this->published(/*fallback=*/ false);
1751 2604 endif;
1752 2605
1753 2606 # If everything failed, then default to the current time.
1754 2607 if (is_null($epoch)) :
1755 - if (-1 == $default) :
1756 - $epoch = time();
1757 - else :
1758 - $epoch = $default;
1759 - endif;
2608 + $epoch = time();
1760 2609 endif;
1761 2610
1762 2611 return $epoch;
1763 2612 }
1764 2613
1765 - function update_hash () {
1766 - return md5(serialize($this->item));
1767 - }
1768 -
1769 2614 function guid () {
1770 2615 $guid = null;
1771 2616 if (isset($this->item['id'])): // Atom 0.3 / 1.0
1772 2617 $guid = $this->item['id'];
@@ -1853,31 +2698,8 @@
1853 2698 endif;
1854 2699
1855 2700 return $author;
1856 2701 } // SyndicatedPost::author()
1857 -
1858 - var $strip_attrs = array (
1859 - array('[a-z]+', 'style'),
1860 - array('[a-z]+', 'target'),
1861 - );
1862 - function sanitize_content ($content, $obj) {
1863 - # FeedWordPress used to resolve URIs relative to the
1864 - # feed URI. It now relies on the xml:base support
1865 - # baked in to the MagpieRSS upgrade. So all we do here
1866 - # now is to sanitize problematic attributes.
1867 - #
1868 - # This kind of sucks. I intend to replace it with
1869 - # lib_filter sometime soon.
1870 - foreach ($obj->strip_attrs as $pair):
1871 - list($tag,$attr) = $pair;
1872 - $content = preg_replace (
1873 - ":(<$tag [^>]*)($attr=(\"[^\">]*\"|[^>\\s]+))([^>]*>):i",
1874 - "\\1\\4",
1875 - $content
1876 - );
1877 - endforeach;
1878 - return $content;
1879 - }
1880 2702 } // class SyndicatedPost
1881 2703
1882 2704 # class SyndicatedLink: represents a syndication feed stored within the
1883 2705 # WordPress database
@@ -1955,26 +2777,18 @@
1955 2777 $this->settings['link/uri'] = $this->link->link_rss;
1956 2778 $this->settings['link/name'] = $this->link->link_name;
1957 2779 $this->settings['link/id'] = $this->link->link_id;
1958 2780
1959 - // `hardcode categories` and `unfamiliar categories` are deprecated in favor of `unfamiliar category`
2781 + // `hardcode categories` is deprecated in favor of `unfamiliar categories`
1960 2782 if (
1961 - isset($this->settings['unfamiliar categories'])
1962 - and !isset($this->settings['unfamiliar category'])
1963 - ) :
1964 - $this->settings['unfamiliar category'] = $this->settings['unfamiliar categories'];
1965 - endif;
1966 - if (
1967 2783 FeedWordPress::affirmative($this->settings, 'hardcode categories')
1968 - and !isset($this->settings['unfamiliar category'])
2784 + and !isset($this->settings['unfamiliar categories'])
1969 2785 ) :
1970 - $this->settings['unfamiliar category'] = 'default';
2786 + $this->settings['unfamiliar categories'] = 'default';
1971 2787 endif;
1972 -
2788 +
1973 2789 // Set this up automagically for del.icio.us
1974 - $bits = parse_url($this->link->link_rss);
1975 - $tagspacers = array('del.icio.us', 'feeds.delicious.com');
1976 - if (!isset($this->settings['cat_split']) and in_array($bits['host'], $tagspacers)) :
2790 + if (!isset($this->settings['cat_split']) and false !== strpos($this->link->link_rss, 'del.icio.us')) :
1977 2791 $this->settings['cat_split'] = '\s'; // Whitespace separates multiple tags in del.icio.us RSS feeds
1978 2792 endif;
1979 2793
1980 2794 if (isset($this->settings['cats'])):
@@ -1979,27 +2793,8 @@
1979 2793
1980 2794 if (isset($this->settings['cats'])):
1981 2795 $this->settings['cats'] = preg_split(FEEDWORDPRESS_CAT_SEPARATOR_PATTERN, $this->settings['cats']);
1982 2796 endif;
1983 - if (isset($this->settings['tags'])):
1984 - $this->settings['tags'] = preg_split(FEEDWORDPRESS_CAT_SEPARATOR_PATTERN, $this->settings['tags']);
1985 - endif;
1986 -
1987 - if (isset($this->settings['map authors'])) :
1988 - $author_rules = explode("\n\n", $this->settings['map authors']);
1989 - $ma = array();
1990 - foreach ($author_rules as $rule) :
1991 - list($rule_type, $author_name, $author_action) = explode("\n", $rule);
1992 -
1993 - // Normalize for case and whitespace
1994 - $rule_type = strtolower(trim($rule_type));
1995 - $author_name = strtolower(trim($author_name));
1996 - $author_action = strtolower(trim($author_action));
1997 -
1998 - $ma[$rule_type][$author_name] = $author_action;
1999 - endforeach;
2000 - $this->settings['map authors'] = $ma;
2001 - endif;
2002 2797 endif;
2003 2798 } // SyndicatedLink::SyndicatedLink ()
2004 2799
2005 2800 function found () {
@@ -2075,26 +2870,11 @@
2075 2870
2076 2871 if (is_array($to_notes['cats'])) :
2077 2872 $to_notes['cats'] = implode(FEEDWORDPRESS_CAT_SEPARATOR, $to_notes['cats']);
2078 2873 endif;
2079 - if (is_array($to_notes['tags'])) :
2080 - $to_notes['tags'] = implode(FEEDWORDPRESS_CAT_SEPARATOR, $to_notes['tags']);
2081 - endif;
2082 -
2083 - if (isset($to_notes['map authors'])) :
2084 - $ma = array();
2085 - foreach ($to_notes['map authors'] as $rule_type => $author_rules) :
2086 - foreach ($author_rules as $author_name => $author_action) :
2087 - $ma[] = $rule_type."\n".$author_name."\n".$author_action;
2088 - endforeach;
2089 - endforeach;
2090 - $to_notes['map authors'] = implode("\n\n", $ma);
2091 - endif;
2092 -
2093 2874 unset($to_notes['link/id']); unset($to_notes['link/uri']);
2094 2875 unset($to_notes['link/name']);
2095 2876 unset($to_notes['hardcode categories']); // Deprecated
2096 - unset($to_notes['unfamiliar categories']); // Deprecated
2097 2877
2098 2878 $notes = '';
2099 2879 foreach ($to_notes as $key => $value) :
2100 2880 $notes .= $key . ": ". addcslashes($value, "\0..\37".'\\') . "\n";
@@ -2119,47 +2899,8 @@
2119 2899 if ( $new !== false ) $new_count[$new]++;
2120 2900 endif;
2121 2901 endforeach;
2122 2902 endif;
2123 -
2124 - // Copy back any changes to feed settings made in the course of updating (e.g. new author rules)
2125 - $to_notes = $this->settings;
2126 -
2127 - if (is_array($to_notes['cats'])) :
2128 - $to_notes['cats'] = implode(FEEDWORDPRESS_CAT_SEPARATOR, $to_notes['cats']);
2129 - endif;
2130 - if (is_array($to_notes['tags'])) :
2131 - $to_notes['tags'] = implode(FEEDWORDPRESS_CAT_SEPARATOR, $to_notes['tags']);
2132 - endif;
2133 -
2134 - if (isset($to_notes['map authors'])) :
2135 - $ma = array();
2136 - foreach ($to_notes['map authors'] as $rule_type => $author_rules) :
2137 - foreach ($author_rules as $author_name => $author_action) :
2138 - $ma[] = $rule_type."\n".$author_name."\n".$author_action;
2139 - endforeach;
2140 - endforeach;
2141 - $to_notes['map authors'] = implode("\n\n", $ma);
2142 - endif;
2143 -
2144 - unset($to_notes['link/id']); unset($to_notes['link/uri']);
2145 - unset($to_notes['link/name']);
2146 - unset($to_notes['hardcode categories']); // Deprecated
2147 - unset($to_notes['unfamiliar categories']); // Deprecated
2148 -
2149 - $notes = '';
2150 - foreach ($to_notes as $key => $value) :
2151 - $notes .= $key . ": ". addcslashes($value, "\0..\37".'\\') . "\n";
2152 - endforeach;
2153 -
2154 - $update_set = "link_notes = '".$wpdb->escape($notes)."'";
2155 -
2156 - // Update the properties of the link from the feed information
2157 - $result = $wpdb->query("
2158 - UPDATE $wpdb->links
2159 - SET $update_set
2160 - WHERE link_id='$this->id'
2161 - ");
2162 2903 endif;
2163 2904 return $new_count;
2164 2905 } /* SyndicatedLink::poll() */
2165 2906
@@ -2215,9 +2956,9 @@
2215 2956 endif;
2216 2957 return $ret;
2217 2958 } /* SyndicatedLink::ttl() */
2218 2959
2219 - // SyndicatedLink::flatten_array (): flatten an array. Useful for
2960 + // SyndicatedLink:flatten_array (): flatten an array. Useful for
2220 2961 // hierarchical and namespaced elements.
2221 2962 //
2222 2963 // Given an array which may contain array or object elements in it,
2223 2964 // return a "flattened" array: a one-dimensional array of scalars
@@ -2654,5 +3395,5 @@
2654 3395 $ret['name'] = NULL; $ret['email'] = NULL;
2655 3396 endif;
2656 3397 return $ret;
2657 3398 }
2658 -
3399 +?>