FeedWordPress - Version 2008.1030

Version Description

Download this release

Release Info

Developer radgeek
Plugin Icon wp plugin FeedWordPress
Version 2008.1030
Comparing to
See all releases

Code changes from version 0.993 to 2008.1030

Files changed (7) hide show
  1. ChangeLog.text +75 -0
  2. admin-ui.php +161 -0
  3. compatability.php +147 -0
  4. feedwordpress.php +219 -1475
  5. readme.txt +15 -14
  6. syndication-options.php +23 -6
  7. syndication.php +1262 -0
ChangeLog.text CHANGED
@@ -1,6 +1,81 @@
1
  FeedWordPress Change Log
2
  ========================
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  Changes from 0.992 to 0.993
5
  ---------------------------
6
 
1
  FeedWordPress Change Log
2
  ========================
3
 
4
+ Changes from 0.993 to 2008.1030
5
+ -------------------------------
6
+
7
+ * WORDPRESS 2.6 COMPATABILITY: FeedWordPress should now be compatible with
8
+ WordPress 2.6, and should work more or less seamlessly with the new post
9
+ revision system. A bug which caused multiple new revisions to be created
10
+ for posts on certain feeds, regardless of whether or not the item had
11
+ been updated, has been fixed.
12
+
13
+ * INTERFACE IMPROVEMENTS: The user interface has been substantially
14
+ restyled to fit in better with the visual style of WordPress 2.5 and
15
+ 2.6.
16
+
17
+ * YOUTUBE BUG FIXED: POSTS SYNDICATED THROUGH AN AUTOMATIC UPDATE ARE NO
18
+ LONGER STRIPPED OF `<OBJECT>` TAGS AND CERTAIN OTHER HTML ELEMENTS: Due
19
+ to the way that some versions of WordPress process posts that are
20
+ inserted into the database when no user is logged in, many users
21
+ experienced an issue where YouTube videos and other content using the
22
+ HTML `<object>` tag would be stripped out of posts that were syndicated
23
+ during an automatic update. (Posts that were syndicated through manual
24
+ updates from within the WordPress Dashboard were not affected, because
25
+ the issue does not arise when an update is executed under a logged-in
26
+ administrator's credentials.) This bug has now been fixed; YouTube
27
+ videos and other content using `<object>` tags should now appear
28
+ properly in syndicated posts, regardless of the way in which the post
29
+ was syndicated.
30
+
31
+ * AJAX BUGS FIXED: Bugs which blocked the normal operation of WordPress
32
+ 2.5's AJAX interface elements when FeedWordPress was activated have been
33
+ fixed.
34
+
35
+ * TAG SUPPORT: A couple of features have been introduced to take advantage
36
+ of the tagging features in WordPress 2.3.x, 2.5.x, and 2.6.x. Now, when
37
+ unfamiliar categories are encountered for posts on a feed, you can
38
+ choose for FeedWordPress (1) to drop the category; (2) to drop the
39
+ category and to filter out any post that does not match at least one
40
+ familiar category; (3) to create a new category with that name, or,
41
+ now, you can also have FeedWordPress (4) create a new *tag* with that
42
+ name. This option can be set site-wide under Syndication --> Options,
43
+ or it can be set on a feed-by-feed basis in a feed's Edit screen.
44
+
45
+ In addition, you can now set particular tags to apply to all incoming
46
+ syndicated posts, under Syndication --> Options, or you can set tags
47
+ to apply to all incoming syndicated posts from a particular feed in that
48
+ feed's Edit screen.
49
+
50
+ * FORMATTING FILTERS: There is a new option available under Syndication ->
51
+ Options which allows users to choose whether or not to expose syndicated
52
+ posts to being altered by formatting filters. By default, FeedWordPress
53
+ has always protected syndicated posts (which are already in display-ready
54
+ HTML when they are syndicated) from being reformatted by formatting
55
+ filters. However, this approach means that certain plugins which depend
56
+ on formatting filters (for example, to add "Share This" bars or relevant
57
+ links to the end of a post) are blocked from working on any syndicated
58
+ posts. If you want to use one of these plugins together with
59
+ FeedWordPress, you can now do so by changing the "Formatting Filters"
60
+ setting from "Protect" to "Expose."
61
+
62
+ * **`<atom:source>` ELEMENTS NOW INCLUDED IN ATOM FEED:** Atom 1.0 provides
63
+ a standard method for aggregators to indicate information about the original source of
64
+ a syndicated post, using the `<atom:source>` element. FeedWordPress now
65
+ introduces standard `<atom:source>` elements including the title, homepage, and
66
+ feed URI of the source from which a syndicated post was syndicated. Cf.
67
+ <http://www.atomenabled.org/developers/syndication/atom-format-spec.php#element.source>
68
+
69
+ * MODULARIZATION OF CODE: The code for different elements of FeedWordPress
70
+ has been broken out into several modules for easier inspection,
71
+ documentation, and maintenance of the code.
72
+
73
+ * VERSIONING SCHEME CHANGED: FeedWordPress's feature set has proven stable
74
+ enough that it can now be removed from beta status; a good thing, since
75
+ I was very quickly running out of version numbers to use. New releases
76
+ of FeedWordPress will have version numbers based on the date of their
77
+ release.
78
+
79
  Changes from 0.992 to 0.993
80
  ---------------------------
81
 
admin-ui.php ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ function fwp_linkedit_single_submit ($status = NULL) {
3
+ global $wp_db_version;
4
+ if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
5
+ ?>
6
+ <div class="submitbox" id="submitlink">
7
+ <div id="previewview"></div>
8
+ <div class="inside">
9
+ <?php if (!is_null($status)) : ?>
10
+ <p><strong>Publication</strong></p>
11
+ <p>When a new post is syndicated from this feed...</p>
12
+ <select name="feed_post_status">
13
+ <option value="site-default" <?php echo $status['post']['site-default']; ?>> Use
14
+ Syndication Options setting</option>
15
+ <option value="publish" <?php echo $status['post']['publish']; ?>>Publish it immediately</option>
16
+
17
+ <?php if (SyndicatedPost::use_api('post_status_pending')) : ?>
18
+ <option value="pending" <?php echo $status['post']['pending']; ?>>Hold it Pending Review</option>
19
+ <?php endif; ?>
20
+
21
+ <option value="draft" <?php echo $status['post']['draft']; ?>>Save it as a draft</option>
22
+ <option value="private" <?php echo $status['post']['private']; ?>>Keep it private</option>
23
+ </select>
24
+ <?php endif; ?>
25
+ </div>
26
+
27
+ <p class="submit">
28
+ <input type="submit" name="submit" value="<?php _e('Save') ?>" />
29
+ </p>
30
+ </div>
31
+ <?php
32
+ endif;
33
+ }
34
+
35
+ function fwp_linkedit_periodic_submit ($caption = NULL) {
36
+ global $wp_db_version;
37
+ if (!(isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25)) :
38
+ if (is_null($caption)) : $caption = __('Save Changes &raquo;'); endif;
39
+ ?>
40
+ <p class="submit">
41
+ <input type="submit" name="submit" value="<?php print $caption; ?>" />
42
+ </p>
43
+ <?php
44
+ endif;
45
+ }
46
+
47
+ function fwp_option_box_opener ($legend, $id, $class = "stuffbox") {
48
+ global $wp_db_version;
49
+ if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
50
+ ?>
51
+ <div id="<?php print $id; ?>" class="<?php print $class; ?>">
52
+ <h3><?php print htmlspecialchars($legend); ?></h3>
53
+ <div class="inside">
54
+ <?php
55
+ else :
56
+ ?>
57
+ <fieldset class="options"><legend><?php print htmlspecialchars($legend); ?></legend>
58
+ <?php
59
+ endif;
60
+ }
61
+
62
+ function fwp_option_box_closer () {
63
+ global $wp_db_version;
64
+ if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
65
+ ?>
66
+ </div> <!-- class="inside" -->
67
+ </div> <!-- class="stuffbox" -->
68
+ <?php
69
+ else :
70
+ ?>
71
+ </fieldset>
72
+ <?php
73
+ endif;
74
+ }
75
+
76
+ function fwp_tags_box ($tags) {
77
+ if (!is_array($tags)) : $tags = array(); endif;
78
+ ?>
79
+ <div id="tagsdiv" class="postbox">
80
+ <h3><?php _e('Tags') ?></h3>
81
+ <p style="font-size:smaller;font-style:bold;margin:0">Place <?php print $object; ?> under...</p>
82
+ <div class="inside">
83
+ <p id="jaxtag"><input type="text" name="tags_input" class="tags-input" id="tags-input" size="40" tabindex="3" value="<?php echo implode(",", $tags); ?>" /></p>
84
+ <div id="tagchecklist"></div>
85
+ </div>
86
+ </div>
87
+ <?php
88
+ }
89
+
90
+ function fwp_category_box ($checked, $object, $tags = array()) {
91
+ global $wp_db_version;
92
+
93
+ if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) : // WordPress 2.5.x
94
+ ?>
95
+ <div id="category-adder" class="wp-hidden-children">
96
+ <h4><a id="category-add-toggle" href="#category-add" class="hide-if-no-js" tabindex="3"><?php _e( '+ Add New Category' ); ?></a></h4>
97
+ <p id="category-add" class="wp-hidden-child">
98
+ <input type="text" name="newcat" id="newcat" class="form-required form-input-tip" value="<?php _e( 'New category name' ); ?>" tabindex="3" />
99
+ <?php wp_dropdown_categories( array( 'hide_empty' => 0, 'name' => 'newcat_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => __('Parent category'), 'tab_index' => 3 ) ); ?>
100
+ <input type="button" id="category-add-sumbit" class="add:categorychecklist:category-add button" value="<?php _e( 'Add' ); ?>" tabindex="3" />
101
+ <?php wp_nonce_field( 'add-category', '_ajax_nonce', false ); ?>
102
+ <span id="category-ajax-response"></span>
103
+ </p>
104
+ </div>
105
+
106
+ <ul id="category-tabs">
107
+ <li class="ui-tabs-selected"><a href="#categories-all" tabindex="3"><?php _e( 'All posts' ); ?></a>
108
+ <p style="font-size:smaller;font-style:bold;margin:0">Give <?php print $object; ?> these categories</p>
109
+ </li>
110
+ </ul>
111
+
112
+ <div id="categories-all" class="ui-tabs-panel">
113
+ <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
114
+ <?php fwp_category_checklist(NULL, false, $checked) ?>
115
+ </ul>
116
+ </div>
117
+ <?php
118
+ elseif (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_20) : // WordPress 2.x
119
+ ?>
120
+ <div id="moremeta">
121
+ <div id="grabit" class="dbx-group">
122
+ <fieldset id="categorydiv" class="dbx-box">
123
+ <h3 class="dbx-handle"><?php _e('Categories') ?></h3>
124
+ <div class="dbx-content">
125
+ <p style="font-size:smaller;font-style:bold;margin:0">Place <?php print $object; ?> under...</p>
126
+ <p id="jaxcat"></p>
127
+ <ul id="categorychecklist"><?php fwp_category_checklist(NULL, false, $checked); ?></ul></div>
128
+ </fieldset>
129
+ </div>
130
+ </div>
131
+ <?php
132
+ else : // WordPress 1.5
133
+ ?>
134
+ <fieldset id="categorydiv" style="width: 20%; margin-right: 2em">
135
+ <legend><?php _e('Categories') ?></legend>
136
+ <p style="font-size:smaller;font-style:bold;margin:0">Place <?php print $object; ?> under...</p>
137
+ <div style="height: 20em"><?php fwp_category_checklist(NULL, false, $checked); ?></div>
138
+ </fieldset>
139
+ <?php
140
+ endif;
141
+ }
142
+
143
+ function update_feeds_mention ($feed) {
144
+ echo "<li>Updating <cite>".$feed['link/name']."</cite> from &lt;<a href=\""
145
+ .$feed['link/uri']."\">".$feed['link/uri']."</a>&gt; ...</li>\n";
146
+ flush();
147
+ }
148
+
149
+ function fwp_author_list () {
150
+ global $wpdb;
151
+ $ret = array();
152
+ $users = $wpdb->get_results("SELECT * FROM $wpdb->users ORDER BY display_name");
153
+ if (is_array($users)) :
154
+ foreach ($users as $user) :
155
+ $id = (int) $user->ID;
156
+ $ret[$id] = $user->display_name;
157
+ endforeach;
158
+ endif;
159
+ return $ret;
160
+ }
161
+
compatability.php ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ ################################################################################
3
+ ## LEGACY API: Replicate or mock up functions for legacy support purposes ######
4
+ ################################################################################
5
+
6
+ // version testing
7
+ function fwp_test_wp_version ($floor, $ceiling = NULL) {
8
+ global $wp_db_version;
9
+
10
+ $ver = (isset($wp_db_version) ? $wp_db_version : 0);
11
+ $good = ($ver >= $floor);
12
+ if (!is_null($ceiling)) :
13
+ $good = ($good and ($ver < $ceiling));
14
+ endif;
15
+ return $good;
16
+ } /* function fwp_test_wp_version () */
17
+
18
+ if (!function_exists('get_option')) {
19
+ function get_option ($option) {
20
+ return get_settings($option);
21
+ }
22
+ }
23
+ if (!function_exists('current_user_can')) {
24
+ $fwp_capability['manage_options'] = 6;
25
+ $fwp_capability['manage_links'] = 5;
26
+ function current_user_can ($task) {
27
+ global $user_level;
28
+
29
+ $can = false;
30
+
31
+ // This is **not** a full replacement for current_user_can. It
32
+ // is only for checking the capabilities we care about via the
33
+ // WordPress 1.5 user levels.
34
+ switch ($task) :
35
+ case 'manage_options':
36
+ $can = ($user_level >= 6);
37
+ break;
38
+ case 'manage_links':
39
+ $can = ($user_level >= 5);
40
+ break;
41
+ endswitch;
42
+ return $can;
43
+ }
44
+ } else {
45
+ $fwp_capability['manage_options'] = 'manage_options';
46
+ $fwp_capability['manage_links'] = 'manage_links';
47
+ }
48
+ if (!function_exists('sanitize_user')) {
49
+ function sanitize_user ($text, $strict) {
50
+ return $text; // Don't munge it if it wasn't munged going in...
51
+ }
52
+ }
53
+ if (!function_exists('wp_insert_user')) {
54
+ function wp_insert_user ($userdata) {
55
+ global $wpdb;
56
+
57
+ #-- Help WordPress 1.5.x quack like a duck
58
+ $login = $userdata['user_login'];
59
+ $author = $userdata['display_name'];
60
+ $nice_author = $userdata['user_nicename'];
61
+ $email = $userdata['user_email'];
62
+ $url = $userdata['user_url'];
63
+
64
+ $wpdb->query (
65
+ "INSERT INTO $wpdb->users
66
+ SET
67
+ ID='0',
68
+ user_login='$login',
69
+ user_firstname='$author',
70
+ user_nickname='$author',
71
+ user_nicename='$nice_author',
72
+ user_description='$author',
73
+ user_email='$email',
74
+ user_url='$url'");
75
+ $id = $wpdb->insert_id;
76
+
77
+ return $id;
78
+ }
79
+ }
80
+
81
+ function fwp_category_checklist ($post_id = 0, $descendents_and_self = 0, $selected_cats = false) {
82
+ if (function_exists('wp_category_checklist')) :
83
+ wp_category_checklist($post_id, $descendents_and_self, $selected_cats);
84
+ else :
85
+ global $checked_categories;
86
+
87
+ // selected_cats is an array of integer cat_IDs / term_ids for
88
+ // the categories that should be checked
89
+ $cats = array();
90
+ if ($post_id) : $cats = wp_get_post_categories($post_id);
91
+ else : $cats = $selected_cats;
92
+ endif;
93
+
94
+ $checked_categories = $cats;
95
+ dropdown_categories();
96
+ endif;
97
+ }
98
+
99
+ ################################################################################
100
+ ## UPGRADE INTERFACE: Have users upgrade DB from older versions of FWP #########
101
+ ################################################################################
102
+
103
+ function fwp_upgrade_page () {
104
+ if (isset($GLOBALS['fwp_post']['action']) and $GLOBALS['fwp_post']['action']=='Upgrade') :
105
+ $ver = get_option('feedwordpress_version');
106
+ if (get_option('feedwordpress_version') != FEEDWORDPRESS_VERSION) :
107
+ echo "<div class=\"wrap\">\n";
108
+ echo "<h2>Upgrading FeedWordPress...</h2>";
109
+
110
+ $feedwordpress =& new FeedWordPress;
111
+ $feedwordpress->upgrade_database($ver);
112
+ echo "<p><strong>Done!</strong> Upgraded database to version ".FEEDWORDPRESS_VERSION.".</p>\n";
113
+ echo "<form action=\"\" method=\"get\">\n";
114
+ echo "<div class=\"submit\"><input type=\"hidden\" name=\"page\" value=\"syndication.php\" />";
115
+ echo "<input type=\"submit\" value=\"Continue &raquo;\" /></form></div>\n";
116
+ echo "</div>\n";
117
+ return;
118
+ else :
119
+ echo "<div class=\"updated\"><p>Already at version ".FEEDWORDPRESS_VERSION."!</p></div>";
120
+ endif;
121
+ endif;
122
+ ?>
123
+ <div class="wrap">
124
+ <h2>Upgrade FeedWordPress</h2>
125
+
126
+ <p>It appears that you have installed FeedWordPress
127
+ <?php echo FEEDWORDPRESS_VERSION; ?> as an upgrade to an existing installation of
128
+ FeedWordPress. That's no problem, but you will need to take a minute out first
129
+ to upgrade your database: some necessary changes in how the software keeps
130
+ track of posts and feeds will cause problems such as duplicate posts and broken
131
+ templates if we were to continue without the upgrade.</p>
132
+
133
+ <p>Note that most of FeedWordPress's functionality is temporarily disabled
134
+ until we have successfully completed the upgrade. Everything should begin
135
+ working as normal again once the upgrade is complete. There's extraordinarily
136
+ little chance of any damage as the result of the upgrade, but if you're paranoid
137
+ like me you may want to back up your database before you proceed.</p>
138
+
139
+ <p>This may take several minutes for a large installation.</p>
140
+
141
+ <form action="" method="post">
142
+ <div class="submit"><input type="submit" name="action" value="Upgrade" /></div>
143
+ </form>
144
+ </div>
145
+ <?php
146
+ } // function fwp_upgrade_page ()
147
+
feedwordpress.php CHANGED
@@ -3,11 +3,11 @@
3
  Plugin Name: FeedWordPress
4
  Plugin URI: http://projects.radgeek.com/feedwordpress
5
  Description: simple and flexible Atom/RSS syndication for WordPress
6
- Version: 0.993
7
  Author: Charles Johnson
8
  Author URI: http://radgeek.com/
9
  License: GPL
10
- Last modified: 2008-05-08 4:48 PM PDT
11
  */
12
 
13
  # This uses code derived from:
@@ -27,7 +27,7 @@ Last modified: 2008-05-08 4:48 PM PDT
27
 
28
  # -- Don't change these unless you know what you're doing...
29
 
30
- define ('FEEDWORDPRESS_VERSION', '0.993');
31
  define ('FEEDWORDPRESS_AUTHOR_CONTACT', 'http://radgeek.com/contact');
32
  define ('DEFAULT_SYNDICATION_CATEGORY', 'Contributors');
33
 
@@ -44,6 +44,7 @@ define ('FWP_SCHEMA_20', 3308); // Database schema # for WP 2.0
44
  define ('FWP_SCHEMA_21', 4772); // Database schema # for WP 2.1
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
 
48
  if (FEEDWORDPRESS_DEBUG) :
49
  // Help us to pick out errors, if any.
@@ -83,14 +84,7 @@ if (isset($wp_db_version)) :
83
  endif;
84
  endif;
85
 
86
- if (function_exists('wp_enqueue_script')) :
87
- if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
88
- wp_enqueue_script('post');
89
- wp_enqueue_script('thickbox');
90
- else :
91
- wp_enqueue_script( 'ajaxcat' ); // Provides the handy-dandy new category text box
92
- endif;
93
- endif;
94
 
95
  // Magic quotes are just about the stupidest thing ever.
96
  if (is_array($_POST)) :
@@ -110,6 +104,30 @@ else : // Something went wrong. Let's just guess.
110
  $fwp_path = 'feedwordpress';
111
  endif;
112
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  if (!FeedWordPress::needs_upgrade()) : // only work if the conditions are safe!
114
 
115
  # Syndicated items are generally received in output-ready (X)HTML and
@@ -128,6 +146,8 @@ if (!FeedWordPress::needs_upgrade()) : // only work if the conditions are safe!
128
  add_filter('the_content', 'feedwordpress_preserve_syndicated_content', -10000);
129
  add_filter('the_content', 'feedwordpress_restore_syndicated_content', 10000);
130
 
 
 
131
  # Filter in original permalinks if the user wants that
132
  add_filter('post_link', 'syndication_permalink', 1);
133
 
@@ -223,86 +243,6 @@ function log_feedwordpress_update_complete ($delta) {
223
  : implode(' and ', $mesg)));
224
  }
225
 
226
- ################################################################################
227
- ## LEGACY API: Replicate or mock up functions for legacy support purposes ######
228
- ################################################################################
229
-
230
- if (!function_exists('get_option')) {
231
- function get_option ($option) {
232
- return get_settings($option);
233
- }
234
- }
235
- if (!function_exists('current_user_can')) {
236
- $legacy_capability_hack = true;
237
- function current_user_can ($task) {
238
- global $user_level;
239
-
240
- $can = false;
241
-
242
- // This is **not** a full replacement for current_user_can. It
243
- // is only for checking the capabilities we care about via the
244
- // WordPress 1.5 user levels.
245
- switch ($task) {
246
- case 'manage_options':
247
- $can = ($user_level >= 6);
248
- break;
249
- case 'manage_links':
250
- $can = ($user_level >= 5);
251
- break;
252
- } /* switch */
253
- return $can;
254
- }
255
- } else {
256
- $legacy_capability_hack = false;
257
- }
258
- if (!function_exists('sanitize_user')) {
259
- function sanitize_user ($text, $strict) {
260
- return $text; // Don't munge it if it wasn't munged going in...
261
- }
262
- }
263
- if (!function_exists('wp_insert_user')) {
264
- function wp_insert_user ($userdata) {
265
- #-- Help WordPress 1.5.x quack like a duck
266
- $login = $userdata['user_login'];
267
- $author = $userdata['display_name'];
268
- $nice_author = $userdata['user_nicename'];
269
- $email = $userdata['user_email'];
270
- $url = $userdata['user_url'];
271
-
272
- $wpdb->query (
273
- "INSERT INTO $wpdb->users
274
- SET
275
- ID='0',
276
- user_login='$login',
277
- user_firstname='$author',
278
- user_nickname='$author',
279
- user_nicename='$nice_author',
280
- user_description='$author',
281
- user_email='$email',
282
- user_url='$url'");
283
- $id = $wpdb->insert_id;
284
-
285
- return $id;
286
- }
287
- }
288
-
289
- function fwp_category_checklist ($post_id = 0, $descendents_and_self = 0, $selected_cats = false) {
290
- if (function_exists('wp_category_checklist')) :
291
- wp_category_checklist($post_id, $descendents_and_self, $selected_cats);
292
- else :
293
- global $checked_categories;
294
-
295
- // selected_cats is an array of integer cat_IDs / term_ids for
296
- // the categories that should be checked
297
- $cats = array();
298
- if ($post_id) : $cats = wp_get_post_categories($post_id);
299
- else : $cats = $selected_cats;
300
- endif;
301
-
302
- $checked_categories = $cats;
303
- dropdown_categories();
304
- endif;
305
- }
306
  ################################################################################
307
  ## TEMPLATE API: functions to make your templates syndication-aware ############
308
  ################################################################################
@@ -357,7 +297,7 @@ $feedwordpress_the_syndicated_content = NULL;
357
  function feedwordpress_preserve_syndicated_content ($text) {
358
  global $feedwordpress_the_syndicated_content;
359
 
360
- if ( is_syndicated() ) :
361
  $feedwordpress_the_syndicated_content = $text;
362
  else :
363
  $feedwordpress_the_syndicated_content = NULL;
@@ -375,1379 +315,53 @@ function feedwordpress_restore_syndicated_content ($text) {
375
  return $text;
376
  }
377
 
378
- function syndication_permalink ($permalink = '') {
379
- if (get_option('feedwordpress_munge_permalink') != 'no'):
380
- $uri = get_syndication_permalink();
381
- return ((strlen($uri) > 0) ? $uri : $permalink);
382
- else:
383
- return $permalink;
384
- endif;
385
- } // function syndication_permalink ()
386
-
387
- ################################################################################
388
- ## UPGRADE INTERFACE: Have users upgrade DB from older versions of FWP #########
389
- ################################################################################
390
-
391
- function fwp_upgrade_page () {
392
- if (isset($GLOBALS['fwp_post']['action']) and $GLOBALS['fwp_post']['action']=='Upgrade') :
393
- $ver = get_option('feedwordpress_version');
394
- if (get_option('feedwordpress_version') != FEEDWORDPRESS_VERSION) :
395
- echo "<div class=\"wrap\">\n";
396
- echo "<h2>Upgrading FeedWordPress...</h2>";
397
-
398
- $feedwordpress =& new FeedWordPress;
399
- $feedwordpress->upgrade_database();
400
- echo "<p><strong>Done!</strong> Upgraded database to version ".FEEDWORDPRESS_VERSION.".</p>\n";
401
- echo "<form action=\"\" method=\"get\">\n";
402
- echo "<div class=\"submit\"><input type=\"hidden\" name=\"page\" value=\"".basename(__FILE__)."\" />";
403
- echo "<input type=\"submit\" value=\"Continue &raquo;\" /></form></div>\n";
404
- echo "</div>\n";
405
- return;
406
- else :
407
- echo "<div class=\"updated\"><p>Already at version ".FEEDWORDPRESS_VERSION."!</p></div>";
408
- endif;
409
- endif;
410
  ?>
411
- <div class="wrap">
412
- <h2>Upgrade FeedWordPress</h2>
413
-
414
- <p>It appears that you have installed FeedWordPress
415
- <?php echo FEEDWORDPRESS_VERSION; ?> as an upgrade to an existing installation of
416
- FeedWordPress. That's no problem, but you will need to take a minute out first
417
- to upgrade your database: some necessary changes in how the software keeps
418
- track of posts and feeds will cause problems such as duplicate posts and broken
419
- templates if we were to continue without the upgrade.</p>
420
-
421
- <p>Note that most of FeedWordPress's functionality is temporarily disabled
422
- until we have successfully completed the upgrade. Everything should begin
423
- working as normal again once the upgrade is complete. There's extraordinarily
424
- little chance of any damage as the result of the upgrade, but if you're paranoid
425
- like me you may want to back up your database before you proceed.</p>
426
-
427
- <p>This may take several minutes for a large installation.</p>
428
-
429
- <form action="" method="post">
430
- <div class="submit"><input type="submit" name="action" value="Upgrade" /></div>
431
- </form>
432
- </div>
433
  <?php
434
- } // function fwp_upgrade_page ()
435
-
436
- ################################################################################
437
- ## ADMIN MENU ADD-ONS: implement Dashboard management pages ####################
438
- ################################################################################
439
-
440
- function fwp_add_pages () {
441
- global $legacy_capability_hack;
442
- global $fwp_path;
443
-
444
- if ($legacy_capability_hack) :
445
- // old & busted: numeric user levels
446
- $manage_links = 5;
447
- $manage_options = 6;
448
- else :
449
- // new hotness: named capabilities
450
- $manage_links = 'manage_links';
451
- $manage_options = 'manage_options';
452
- endif;
453
-
454
- //add_submenu_page('plugins.php', 'Akismet Configuration', 'Akismet Configuration', 'manage_options', 'syndication-manage-page', 'fwp_syndication_manage_page');
455
- add_menu_page('Syndicated Sites', 'Syndication', $manage_links, $fwp_path.'/'.basename(__FILE__), 'fwp_syndication_manage_page');
456
- add_submenu_page($fwp_path.'/'.basename(__FILE__), 'Syndication Options', 'Options', $manage_options, $fwp_path.'/syndication-options.php');
457
- add_options_page('Syndication Options', 'Syndication', $manage_options, $fwp_path.'/syndication-options.php');
458
- } // function fwp_add_pages () */
459
-
460
- function fwp_linkedit_single_submit ($status = NULL) {
461
- global $wp_db_version;
462
- if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
463
  ?>
464
- <div class="submitbox" id="submitlink">
465
- <div id="previewview"></div>
466
- <div class="inside">
467
- <?php if (!is_null($status)) : ?>
468
- <p><strong>Publication</strong></p>
469
- <p>When a new post is syndicated from this feed...</p>
470
- <select name="feed_post_status">
471
- <option value="site-default" <?php echo $status['post']['site-default']; ?>> Use
472
- Syndication Options setting</option>
473
- <option value="publish" <?php echo $status['post']['publish']; ?>>Publish it immediately</option>
474
-
475
- <?php if (SyndicatedPost::use_api('post_status_pending')) : ?>
476
- <option value="pending" <?php echo $status['post']['pending']; ?>>Hold it Pending Review</option>
477
- <?php endif; ?>
478
-
479
- <option value="draft" <?php echo $status['post']['draft']; ?>>Save it as a draft</option>
480
- <option value="private" <?php echo $status['post']['private']; ?>>Keep it private</option>
481
- </select>
482
- <?php endif; ?>
483
- </div>
484
-
485
- <p class="submit">
486
- <input type="submit" name="submit" value="<?php _e('Save') ?>" />
487
- </p>
488
- </div>
489
  <?php
490
  endif;
491
- }
492
-
493
- function fwp_linkedit_periodic_submit ($caption = NULL) {
494
- global $wp_db_version;
495
- if (!(isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25)) :
496
- if (is_null($caption)) : $caption = __('Save Changes &raquo;'); endif;
497
- ?>
498
- <p class="submit">
499
- <input type="submit" name="submit" value="<?php print $caption; ?>" />
500
- </p>
501
  <?php
502
  endif;
503
- }
504
-
505
- function fwp_option_box_opener ($legend, $id, $class = "stuffbox") {
506
- global $wp_db_version;
507
- if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
508
- ?>
509
- <div id="<?php print $id; ?>" class="<?php print $class; ?>">
510
- <h3><?php print htmlspecialchars($legend); ?></h3>
511
- <div class="inside">
512
- <?php
513
- else :
514
  ?>
515
- <fieldset class="options"><legend><?php print htmlspecialchars($legend); ?></legend>
516
  <?php
517
  endif;
518
  }
519
 
520
- function fwp_option_box_closer () {
521
- global $wp_db_version;
522
- if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
523
- ?>
524
- </div> <!-- class="inside" -->
525
- </div> <!-- class="stuffbox" -->
526
- <?php
527
- else :
528
- ?>
529
- </fieldset>
530
- <?php
531
- endif;
532
- }
533
-
534
- function fwp_tags_box ($tags) {
535
- if (!is_array($tags)) : $tags = array(); endif;
536
- ?>
537
- <div id="tagsdiv" class="postbox">
538
- <h3><?php _e('Tags') ?></h3>
539
- <p style="font-size:smaller;font-style:bold;margin:0">Place <?php print $object; ?> under...</p>
540
- <div class="inside">
541
- <p id="jaxtag"><input type="text" name="tags_input" class="tags-input" id="tags-input" size="40" tabindex="3" value="<?php echo implode(",", $tags); ?>" /></p>
542
- <div id="tagchecklist"></div>
543
- </div>
544
- </div>
545
- <?php
546
- }
547
-
548
- function fwp_category_box ($checked, $object, $tags = array()) {
549
- global $wp_db_version;
550
-
551
- if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) : // WordPress 2.5.x
552
- ?>
553
- <div id="category-adder" class="wp-hidden-children">
554
- <h4><a id="category-add-toggle" href="#category-add" class="hide-if-no-js" tabindex="3"><?php _e( '+ Add New Category' ); ?></a></h4>
555
- <p id="category-add" class="wp-hidden-child">
556
- <input type="text" name="newcat" id="newcat" class="form-required form-input-tip" value="<?php _e( 'New category name' ); ?>" tabindex="3" />
557
- <?php wp_dropdown_categories( array( 'hide_empty' => 0, 'name' => 'newcat_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => __('Parent category'), 'tab_index' => 3 ) ); ?>
558
- <input type="button" id="category-add-sumbit" class="add:categorychecklist:category-add button" value="<?php _e( 'Add' ); ?>" tabindex="3" />
559
- <?php wp_nonce_field( 'add-category', '_ajax_nonce', false ); ?>
560
- <span id="category-ajax-response"></span>
561
- </p>
562
- </div>
563
-
564
- <ul id="category-tabs">
565
- <li class="ui-tabs-selected"><a href="#categories-all" tabindex="3"><?php _e( 'All posts' ); ?></a>
566
- <p style="font-size:smaller;font-style:bold;margin:0">Give <?php print $object; ?> these categories</p>
567
- </li>
568
- </ul>
569
-
570
- <div id="categories-all" class="ui-tabs-panel">
571
- <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
572
- <?php fwp_category_checklist(NULL, false, $checked) ?>
573
- </ul>
574
- </div>
575
- <?php
576
- elseif (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_20) : // WordPress 2.x
577
- ?>
578
- <div id="moremeta">
579
- <div id="grabit" class="dbx-group">
580
- <fieldset id="categorydiv" class="dbx-box">
581
- <h3 class="dbx-handle"><?php _e('Categories') ?></h3>
582
- <div class="dbx-content">
583
- <p style="font-size:smaller;font-style:bold;margin:0">Place <?php print $object; ?> under...</p>
584
- <p id="jaxcat"></p>
585
- <ul id="categorychecklist"><?php fwp_category_checklist(NULL, false, $checked); ?></ul></div>
586
- </fieldset>
587
- </div>
588
- </div>
589
- <?php
590
- else : // WordPress 1.5
591
- ?>
592
- <fieldset id="categorydiv" style="width: 20%; margin-right: 2em">
593
- <legend><?php _e('Categories') ?></legend>
594
- <p style="font-size:smaller;font-style:bold;margin:0">Place <?php print $object; ?> under...</p>
595
- <div style="height: 20em"><?php fwp_category_checklist(NULL, false, $checked); ?></div>
596
- </fieldset>
597
- <?php
598
- endif;
599
- }
600
-
601
- function update_feeds_mention ($feed) {
602
- echo "<li>Updating <cite>".$feed['link/name']."</cite> from &lt;<a href=\""
603
- .$feed['link/uri']."\">".$feed['link/uri']."</a>&gt; ...</li>\n";
604
- flush();
605
- }
606
-
607
- function fwp_syndication_manage_page () {
608
- global $wpdb;
609
-
610
- if (FeedWordPress::needs_upgrade()) :
611
- fwp_upgrade_page();
612
- return;
613
- endif;
614
-
615
- ?>
616
- <?php $cont = true;
617
- if (isset($_REQUEST['action'])):
618
- if ($_REQUEST['action'] == 'feedfinder') : $cont = fwp_feedfinder_page();
619
- elseif ($_REQUEST['action'] == 'switchfeed') : $cont = fwp_switchfeed_page();
620
- elseif ($_REQUEST['action'] == 'linkedit') : $cont = fwp_linkedit_page();
621
- elseif ($_REQUEST['action'] == 'Unsubscribe from Checked Links' or $_REQUEST['action'] == 'Unsubscribe') : $cont = fwp_multidelete_page();
622
- endif;
623
- endif;
624
-
625
- if ($cont):
626
- ?>
627
- <?php
628
- $links = FeedWordPress::syndicated_links();
629
-
630
- if (isset($_POST['update']) or isset($_POST['action']) or isset($_POST['update_uri'])) :
631
- $fwp_update_invoke = 'post';
632
- else :
633
- $fwp_update_invoke = 'get';
634
- endif;
635
-
636
- $update_set = array();
637
- if (isset($_POST['link_ids']) and is_array($_POST['link_ids']) and ($_POST['action']=='Update Checked Links')) :
638
- $targets = $wpdb->get_results("
639
- SELECT * FROM $wpdb->links
640
- WHERE link_id IN (".implode(",",$_POST['link_ids']).")
641
- ");
642
- if (is_array($targets)) :
643
- foreach ($targets as $target) :
644
- $update_set[] = $target->link_rss;
645
- endforeach;
646
- else : // This should never happen
647
- FeedWordPress::critical_bug('fwp_syndication_manage_page::targets', $targets, __LINE__);
648
- endif;
649
- elseif (isset($_POST['update_uri'])) :
650
- $update_set[] = $_POST['update_uri'];
651
- endif;
652
-
653
- if ($fwp_update_invoke != 'get' and count($update_set) > 0) : // Only do things with side-effects for HTTP POST or command line
654
- $feedwordpress =& new FeedWordPress;
655
- add_action('feedwordpress_check_feed', 'update_feeds_mention');
656
-
657
- echo "<div class=\"updated\">\n";
658
- echo "<ul>\n";
659
- $tdelta = NULL;
660
- foreach ($update_set as $uri) :
661
- if ($uri == '*') : $uri = NULL; endif;
662
- $delta = $feedwordpress->update($uri);
663
- if (!is_null($delta)) :
664
- if (is_null($tdelta)) :
665
- $tdelta = $delta;
666
- else :
667
- $tdelta['new'] += $delta['new'];
668
- $tdelta['updated'] += $delta['updated'];
669
- endif;
670
- else :
671
- echo "<li><p><strong>Error:</strong> There was a problem updating <a href=\"$uri\">$uri</a></p></li>\n";
672
- endif;
673
- endforeach;
674
- echo "</ul>\n";
675
-
676
- if (!is_null($tdelta)) :
677
- $mesg = array();
678
- if (isset($delta['new'])) : $mesg[] = ' '.$tdelta['new'].' new posts were syndicated'; endif;
679
- if (isset($delta['updated'])) : $mesg[] = ' '.$tdelta['updated'].' existing posts were updated'; endif;
680
- echo "<p>Update complete.".implode(' and', $mesg)."</p>";
681
- echo "\n"; flush();
682
- endif;
683
- echo "</div> <!-- class=\"updated\" -->\n";
684
- endif;
685
-
686
- ?>
687
- <div class="wrap">
688
- <form action="" method="POST">
689
- <h2>Update feeds now</h2>
690
- <p>Check currently scheduled feeds for new and updated posts.</p>
691
-
692
- <?php if (!get_option('feedwordpress_automatic_updates')) : ?>
693
- <p><strong>Note:</strong> Automatic updates are currently turned
694
- <strong>off</strong>. New posts from your feeds will not be syndicated
695
- until you manually check for them here. You can turn on automatic
696
- updates under <a href="admin.php?page=<?php print $GLOBALS['fwp_path']; ?>/syndication-options.php">Syndication
697
- Options</a>.</p>
698
- <?php endif; ?>
699
-
700
-
701
- <div class="submit"><input type="hidden" name="update_uri" value="*" /><input type="submit" name="update" value="Update" /></div>
702
- </form>
703
- </div> <!-- class="wrap" -->
704
-
705
- <form action="admin.php?page=<?php print $GLOBALS['fwp_path']; ?>/<?php echo basename(__FILE__); ?>" method="post">
706
- <div class="wrap">
707
- <h2>Syndicated Sites</h2>
708
- <?php $alt_row = true;
709
- if ($links): ?>
710
-
711
- <table width="100%" cellpadding="3" cellspacing="3">
712
- <tr>
713
- <th width="20%"><?php _e('Name'); ?></th>
714
- <th width="40%"><?php _e('Feed'); ?></th>
715
- <th colspan="4"><?php _e('Action'); ?></th>
716
- </tr>
717
-
718
- <?php foreach ($links as $link):
719
- $alt_row = !$alt_row; ?>
720
- <tr<?php echo ($alt_row?' class="alternate"':''); ?>>
721
- <td><a href="<?php echo wp_specialchars($link->link_url, 'both'); ?>"><?php echo wp_specialchars($link->link_name, 'both'); ?></a></td>
722
- <?php
723
- if (strlen($link->link_rss) > 0):
724
- $caption='Switch Feed';
725
- $uri_bits = parse_url($link->link_rss);
726
- $uri_bits['host'] = preg_replace('/^www\./i', '', $uri_bits['host']);
727
- $display_uri =
728
- (isset($uri_bits['user'])?$uri_bits['user'].'@':'')
729
- .(isset($uri_bits['host'])?$uri_bits['host']:'')
730
- .(isset($uri_bits['port'])?':'.$uri_bits['port']:'')
731
- .(isset($uri_bits['path'])?$uri_bits['path']:'')
732
- .(isset($uri_bits['query'])?'?'.$uri_bits['query']:'');
733
- if (strlen($display_uri) > 32) : $display_uri = substr($display_uri, 0, 32).'&#8230;'; endif;
734
- ?>
735
- <td>
736
- <strong><a href="<?php echo wp_specialchars($link->link_rss, 'both'); ?>"><?php echo wp_specialchars($display_uri, 'both'); ?></a></strong></td>
737
- <?php
738
- else:
739
- $caption='Find Feed';
740
- ?>
741
- <td style="background-color:#FFFFD0"><p><strong>no
742
- feed assigned</strong></p></td>
743
- <?php
744
- endif;
745
- ?>
746
- <td><a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>&amp;link_id=<?php echo $link->link_id; ?>&amp;action=linkedit" class="edit"><?php _e('Edit')?></a></td>
747
- <td><a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>&amp;link_id=<?php echo $link->link_id; ?>&amp;action=feedfinder" class="edit"><?php echo $caption; ?></a></td>
748
- <td><a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>&amp;link_id=<?php echo $link->link_id; ?>&amp;action=Unsubscribe" class="delete"><?php _e('Unsubscribe'); ?></a></td>
749
- <td><input type="checkbox" name="link_ids[]" value="<?php echo $link->link_id; ?>" /></td>
750
- <?php
751
- echo "\n\t</tr>";
752
- endforeach;
753
- else:
754
- ?>
755
-
756
- <p>There are no websites currently listed for syndication.</p>
757
-
758
- <?php endif; ?>
759
- </table>
760
-
761
- <br/><hr/>
762
- <div class="submit"><input type="submit" class="delete" name="action" value="Unsubscribe from Checked Links" />
763
- <input type="submit" name="action" value="Update Checked Links" /></div>
764
- </div> <!-- class="wrap" -->
765
- </form>
766
-
767
- <div class="wrap">
768
- <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
769
- <h2>Add a new syndicated site:</h2>
770
- <div>
771
- <label for="add-uri">Website or newsfeed:</label>
772
- <input type="text" name="lookup" id="add-uri" value="URI" size="64" />
773
- <input type="hidden" name="action" value="feedfinder" />
774
- </div>
775
- <div class="submit"><input type="submit" value="Syndicate &raquo;" /></div>
776
- </form>
777
- </div> <!-- class="wrap" -->
778
- <?php
779
- endif;
780
- }
781
-
782
- function fwp_feedfinder_page () {
783
- global $wpdb;
784
-
785
- $lookup = (isset($_REQUEST['lookup'])?$_REQUEST['lookup']:NULL);
786
-
787
- if (isset($_REQUEST['link_id']) and ($_REQUEST['link_id']!=0)):
788
- $link_id = $_REQUEST['link_id'];
789
- if (!is_numeric($link_id)) : FeedWordPress::critical_bug('fwp_feedfinder_page::link_id', $link_id, __LINE__); endif;
790
-
791
- $link = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id='".$wpdb->escape($link_id)."'");
792
- if (is_object($link)):
793
- if (is_null($lookup)) $lookup = $link->link_url;
794
- $name = wp_specialchars($link->link_name, 'both');
795
- else:
796
- die (__("Cheatin' uh ?"));
797
- endif;
798
- else:
799
- $name = "New Syndicated Feed";
800
- $link_id = 0;
801
- endif;
802
- ?>
803
- <div class="wrap">
804
- <h2>Feed Finder: <?php echo $name; ?></h2>
805
- <?php
806
- $f =& new FeedFinder($lookup);
807
- $feeds = $f->find();
808
- if (count($feeds) > 0):
809
- foreach ($feeds as $key => $f):
810
- $rss = fetch_rss($f);
811
- if ($rss):
812
- $feed_title = isset($rss->channel['title'])?$rss->channel['title']:$rss->channel['link'];
813
- $feed_link = isset($rss->channel['link'])?$rss->channel['link']:'';
814
- ?>
815
- <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
816
- <fieldset style="clear: both">
817
- <legend><?php echo $rss->feed_type; ?> <?php echo $rss->feed_version; ?> feed</legend>
818
-
819
- <?php if ($link_id===0): ?>
820
- <input type="hidden" name="feed_title" value="<?php echo wp_specialchars($feed_title, 'both'); ?>" />
821
- <input type="hidden" name="feed_link" value="<?php echo wp_specialchars($feed_link, 'both'); ?>" />
822
- <?php endif; ?>
823
-
824
- <input type="hidden" name="link_id" value="<?php echo $link_id; ?>" />
825
- <input type="hidden" name="feed" value="<?php echo wp_specialchars($f, 'both'); ?>" />
826
- <input type="hidden" name="action" value="switchfeed" />
827
-
828
- <div>
829
- <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">
830
- <?php if (count($rss->items) > 0): ?>
831
- <?php $item = $rss->items[0]; ?>
832
- <h3>Sample Item</h3>
833
- <ul>
834
- <li><strong>Title:</strong> <a href="<?php echo $item['link']; ?>"><?php echo $item['title']; ?></a></li>
835
- <li><strong>Date:</strong> <?php echo isset($item['date_timestamp']) ? date('d-M-y g:i:s a', $item['date_timestamp']) : 'unknown'; ?></li>
836
- </ul>
837
- <div class="entry">
838
- <?php echo (isset($item['content']['encoded'])?$item['content']['encoded']:$item['description']); ?>
839
- </div>
840
- <?php else: ?>
841
- <h3>No Items</h3>
842
- <p>FeedWordPress found no posts on this feed.</p>
843
- <?php endif; ?>
844
- </div>
845
-
846
- <div>
847
- <h3>Feed Information</h3>
848
- <ul>
849
- <li><strong>Website:</strong> <a href="<?php echo $feed_link; ?>"><?php echo is_null($feed_title)?'<em>Unknown</em>':$feed_title; ?></a></li>
850
- <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); ?>">validate</a>)</li>
851
- <li><strong>Encoding:</strong> <?php echo isset($rss->encoding)?wp_specialchars($rss->encoding, 'both'):"<em>Unknown</em>"; ?></li>
852
- <li><strong>Description:</strong> <?php echo isset($rss->channel['description'])?wp_specialchars($rss->channel['description'], 'both'):"<em>Unknown</em>"; ?></li>
853
- </ul>
854
- <div class="submit"><input type="submit" name="Use" value="&laquo; Use this feed" /></div>
855
- <div class="submit"><input type="submit" name="Cancel" value="&laquo; Cancel" /></div>
856
- </div>
857
- </div>
858
- </fieldset>
859
- </form>
860
- <?php endif;
861
- endforeach;
862
  else:
863
- echo "<p><strong>no feed found</strong></p>";
864
- endif;
865
- ?>
866
- </div>
867
-
868
- <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
869
- <div class="wrap">
870
- <h2>Use another feed</h2>
871
- <div><label>Feed:</label>
872
- <input type="text" name="lookup" value="URI" />
873
- <input type="hidden" name="link_id" value="<?php echo $link_id; ?>" />
874
- <input type="hidden" name="action" value="feedfinder" /></div>
875
- <div class="submit"><input type="submit" value="Use this feed &raquo;" /></div>
876
- </div>
877
- </form>
878
- <?php
879
- return false; // Don't continue
880
- }
881
-
882
- function fwp_switchfeed_page () {
883
- global $wpdb, $wp_db_version;
884
-
885
- check_admin_referer();
886
- if (!isset($_REQUEST['Cancel'])):
887
- if (!current_user_can('manage_links')):
888
- die (__("Cheatin' uh ?"));
889
- elseif (isset($_REQUEST['link_id']) and ($_REQUEST['link_id']==0)):
890
- $link_id = FeedWordPress::syndicate_link($_REQUEST['feed_title'], $_REQUEST['feed_link'], $_REQUEST['feed']);
891
- if ($link_id): ?>
892
- <div class="updated"><p><a href="<?php echo $_REQUEST['feed_link']; ?>"><?php echo wp_specialchars($_REQUEST['feed_title'], 'both'); ?></a>
893
- 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>
894
- <?php else: ?>
895
- <div class="updated"><p>There was a problem adding the newsfeed. [SQL: <?php echo wp_specialchars(mysql_error(), 'both'); ?>]</p></div>
896
- <?php endif;
897
- elseif (isset($_REQUEST['link_id'])):
898
- // Update link_rss
899
- $result = $wpdb->query("
900
- UPDATE $wpdb->links
901
- SET
902
- link_rss = '".$wpdb->escape($_REQUEST['feed'])."'
903
- WHERE link_id = '".$wpdb->escape($_REQUEST['link_id'])."'
904
- ");
905
-
906
- if ($result):
907
- $result = $wpdb->get_row("
908
- SELECT link_name, link_url FROM $wpdb->links
909
- WHERE link_id = '".$wpdb->escape($_REQUEST['link_id'])."'
910
- ");
911
- ?>
912
- <div class="updated"><p>Feed for <a href="<?php echo $result->link_url; ?>"><?php echo wp_specialchars($result->link_name, 'both'); ?></a>
913
- updated to &lt;<a href="<?php echo $_REQUEST['feed']; ?>"><?php echo wp_specialchars($_REQUEST['feed'], 'both'); ?></a>&gt;.</p></div>
914
- <?php else: ?>
915
- <div class="updated"><p>Nothing was changed.</p></div>
916
- <?php endif;
917
- endif;
918
- endif;
919
- return true; // Continue
920
- }
921
-
922
- function fwp_linkedit_page () {
923
- global $wpdb, $wp_db_version;
924
-
925
- check_admin_referer(); // Make sure we arrived here from the Dashboard
926
-
927
- $special_settings = array ( /* Regular expression syntax is OK here */
928
- 'cats',
929
- 'cat_split',
930
- 'hardcode name',
931
- 'hardcode url',
932
- 'hardcode description',
933
- 'hardcode categories', /* Deprecated */
934
- 'post status',
935
- 'comment status',
936
- 'ping status',
937
- 'unfamiliar author',
938
- 'unfamliar categories', /* Deprecated */
939
- 'unfamiliar category',
940
- 'map authors',
941
- 'tags',
942
- 'update/.*',
943
- 'feed/.*',
944
- 'link/.*',
945
- );
946
-
947
- if (!current_user_can('manage_links')) :
948
- die (__("Cheatin' uh ?"));
949
- elseif (isset($_REQUEST['feedfinder'])) :
950
- return fwp_feedfinder_page(); // re-route to Feed Finder page
951
- else :
952
- $link_id = (int) $_REQUEST['link_id'];
953
- $link =& new SyndicatedLink($link_id);
954
-
955
- if ($link->found()) :
956
- if (isset($GLOBALS['fwp_post']['save'])) :
957
- $alter = array ();
958
-
959
- $meta = $link->settings;
960
- //if (isset($meta['cats'])):
961
- // $meta['cats'] = preg_split(FEEDWORDPRESS_CAT_SEPARATOR_PATTERN, $meta['cats']);
962
- //endif;
963
-
964
- // custom feed settings first
965
- foreach ($GLOBALS['fwp_post']['notes'] as $mn) :
966
- $mn['key0'] = trim($mn['key0']);
967
- $mn['key1'] = trim($mn['key1']);
968
- if (preg_match("\007^(("
969
- .implode(')|(',$special_settings)
970
- ."))$\007i",
971
- $mn['key1'])) :
972
- $mn['key1'] = 'user/'.$mn['key1'];
973
- endif;
974
-
975
- if (strlen($mn['key0']) > 0) :
976
- unset($meta[$mn['key0']]); // out with the old
977
- endif;
978
-
979
- if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
980
- $meta[$mn['key1']] = $mn['value']; // in with the new
981
- endif;
982
- endforeach;
983
-
984
- // now stuff through the web form
985
- // hardcoded feed info
986
- if (isset($GLOBALS['fwp_post']['hardcode_name'])) :
987
- $meta['hardcode name'] = $GLOBALS['fwp_post']['hardcode_name'];
988
- if (FeedWordPress::affirmative($meta, 'hardcode name')) :
989
- $alter[] = "link_name = '".$wpdb->escape($GLOBALS['fwp_post']['name'])."'";
990
- endif;
991
- endif;
992
- if (isset($GLOBALS['fwp_post']['hardcode_description'])) :
993
- $meta['hardcode description'] = $GLOBALS['fwp_post']['hardcode_description'];
994
- if (FeedWordPress::affirmative($meta, 'hardcode description')) :
995
- $alter[] = "link_description = '".$wpdb->escape($GLOBALS['fwp_post']['description'])."'";
996
- endif;
997
- endif;
998
- if (isset($GLOBALS['fwp_post']['hardcode_url'])) :
999
- $meta['hardcode url'] = $GLOBALS['fwp_post']['hardcode_url'];
1000
- if (FeedWordPress::affirmative($meta, 'hardcode url')) :
1001
- $alter[] = "link_url = '".$wpdb->escape($GLOBALS['fwp_post']['linkurl'])."'";
1002
- endif;
1003
- endif;
1004
-
1005
- // Update scheduling
1006
- if (isset($GLOBALS['fwp_post']['update_schedule'])) :
1007
- $meta['update/hold'] = $GLOBALS['fwp_post']['update_schedule'];
1008
- endif;
1009
-
1010
- // Categories
1011
- if (isset($GLOBALS['fwp_post']['post_category'])) :
1012
- $meta['cats'] = array();
1013
- foreach ($GLOBALS['fwp_post']['post_category'] as $cat_id) :
1014
- $meta['cats'][] = '{#'.$cat_id.'}';
1015
- endforeach;
1016
- else :
1017
- unset($meta['cats']);
1018
- endif;
1019
-
1020
- // Tags
1021
- if (isset($GLOBALS['fwp_post']['tags_input'])) :
1022
- $meta['tags'] = array();
1023
- foreach (explode(',', $GLOBALS['fwp_post']['tags_input']) as $tag) :
1024
- $meta['tags'][] = trim($tag);
1025
- endforeach;
1026
- endif;
1027
-
1028
- // Post status, comment status, ping status
1029
- foreach (array('post', 'comment', 'ping') as $what) :
1030
- $sfield = "feed_{$what}_status";
1031
- if (isset($GLOBALS['fwp_post'][$sfield])) :
1032
- if ($GLOBALS['fwp_post'][$sfield]=='site-default') :
1033
- unset($meta["{$what} status"]);
1034
- else :
1035
- $meta["{$what} status"] = $GLOBALS['fwp_post'][$sfield];
1036
- endif;
1037
- endif;
1038
- endforeach;
1039
-
1040
- // Unfamiliar author, unfamiliar categories
1041
- foreach (array("author", "category") as $what) :
1042
- $sfield = "unfamiliar_{$what}";
1043
- if (isset($GLOBALS['fwp_post'][$sfield])) :
1044
- if ('site-default'==$GLOBALS['fwp_post'][$sfield]) :
1045
- unset($meta["unfamiliar {$what}"]);
1046
- elseif ('newuser'==$GLOBALS['fwp_post'][$sfield]) :
1047
- $newuser_name = trim($GLOBALS['fwp_post']["{$sfield}_newuser"]);
1048
- if (strlen($newuser_name) > 0) :
1049
- $userdata = array();
1050
- $userdata['ID'] = NULL;
1051
-
1052
- $userdata['user_login'] = sanitize_user($newuser_name);
1053
- $userdata['user_login'] = apply_filters('pre_user_login', $userdata['user_login']);
1054
-
1055
- $userdata['user_nicename'] = sanitize_title($newuser_name);
1056
- $userdata['user_nicename'] = apply_filters('pre_user_nicename', $userdata['user_nicename']);
1057
-
1058
- $userdata['display_name'] = $wpdb->escape($newuser_name);
1059
-
1060
- $newuser_id = wp_insert_user($userdata);
1061
- if (is_numeric($newuser_id)) :
1062
- $meta["unfamiliar {$what}"] = $newuser_id;
1063
- else :
1064
- // TODO: Add some error detection and reporting
1065
- endif;
1066
- else :
1067
- // TODO: Add some error reporting
1068
- endif;
1069
- else :
1070
- $meta["unfamiliar {$what}"] = $GLOBALS['fwp_post'][$sfield];
1071
- endif;
1072
- endif;
1073
- endforeach;
1074
-
1075
- // Handle author mapping rules
1076
- if (isset($GLOBALS['fwp_post']['author_rules_name']) and isset($GLOBALS['fwp_post']['author_rules_action'])) :
1077
- unset($meta['map authors']);
1078
- foreach ($GLOBALS['fwp_post']['author_rules_name'] as $key => $name) :
1079
- // Normalize for case and whitespace
1080
- $name = strtolower(trim($name));
1081
- $author_action = strtolower(trim($GLOBALS['fwp_post']['author_rules_action'][$key]));
1082
-
1083
- if (strlen($name) > 0) :
1084
- if ('newuser' == $author_action) :
1085
- $newuser_name = trim($GLOBALS['fwp_post']['author_rules_newuser'][$key]);
1086
- if (strlen($newuser_name) > 0) :
1087
- $userdata = array();
1088
- $userdata['ID'] = NULL;
1089
-
1090
- $userdata['user_login'] = sanitize_user($newuser_name);
1091
- $userdata['user_login'] = apply_filters('pre_user_login', $userdata['user_login']);
1092
-
1093
- $userdata['user_nicename'] = sanitize_title($newuser_name);
1094
- $userdata['user_nicename'] = apply_filters('pre_user_nicename', $userdata['user_nicename']);
1095
-
1096
- $userdata['display_name'] = $wpdb->escape($newuser_name);
1097
-
1098
- $newuser_id = wp_insert_user($userdata);
1099
- if (is_numeric($newuser_id)) :
1100
- $meta['map authors']['name'][$name] = $newuser_id;
1101
- else :
1102
- // TODO: Add some error detection and reporting
1103
- endif;
1104
- else :
1105
- // TODO: Add some error reporting
1106
- endif;
1107
- else :
1108
- $meta['map authors']['name'][$name] = $author_action;
1109
- endif;
1110
- endif;
1111
- endforeach;
1112
- endif;
1113
-
1114
- if (isset($GLOBALS['fwp_post']['add_author_rule_name']) and isset($GLOBALS['fwp_post']['add_author_rule_action'])) :
1115
- $name = strtolower(trim($GLOBALS['fwp_post']['add_author_rule_name']));
1116
- $author_action = strtolower(trim($GLOBALS['fwp_post']['add_author_rule_action']));
1117
- if (strlen($name) > 0) :
1118
- if ('newuser' == $author_action) :
1119
- $newuser_name = trim($GLOBALS['fwp_post']['add_author_rule_newuser']);
1120
- if (strlen($newuser_name) > 0) :
1121
- $userdata = array();
1122
- $userdata['ID'] = NULL;
1123
-
1124
- $userdata['user_login'] = sanitize_user($newuser_name);
1125
- $userdata['user_login'] = apply_filters('pre_user_login', $userdata['user_login']);
1126
-
1127
- $userdata['user_nicename'] = sanitize_title($newuser_name);
1128
- $userdata['user_nicename'] = apply_filters('pre_user_nicename', $userdata['user_nicename']);
1129
-
1130
- $userdata['display_name'] = $wpdb->escape($newuser_name);
1131
-
1132
- $newuser_id = wp_insert_user($userdata);
1133
- if (is_numeric($newuser_id)) :
1134
- $meta['map authors']['name'][$name] = $newuser_id;
1135
- else :
1136
- // TODO: Add some error detection and reporting
1137
- endif;
1138
- else :
1139
- // TODO: Add some error reporting
1140
- endif;
1141
- else :
1142
- $meta['map authors']['name'][$name] = $author_action;
1143
- endif;
1144
- endif;
1145
- endif;
1146
-
1147
- if (isset($GLOBALS['fwp_post']['cat_split'])) :
1148
- if (strlen(trim($GLOBALS['fwp_post']['cat_split'])) > 0) :
1149
- $meta['cat_split'] = trim($GLOBALS['fwp_post']['cat_split']);
1150
- else :
1151
- unset($meta['cat_split']);
1152
- endif;
1153
- endif;
1154
-
1155
- if (is_array($meta['cats'])) :
1156
- $meta['cats'] = implode(FEEDWORDPRESS_CAT_SEPARATOR, $meta['cats']);
1157
- endif;
1158
- if (is_array($meta['tags'])) :
1159
- $meta['tags'] = implode(FEEDWORDPRESS_CAT_SEPARATOR, $meta['tags']);
1160
- endif;
1161
-
1162
- // Collapse the author mapping rule structure back into a flat string
1163
- if (isset($meta['map authors'])) :
1164
- $ma = array();
1165
- foreach ($meta['map authors'] as $rule_type => $author_rules) :
1166
- foreach ($author_rules as $author_name => $author_action) :
1167
- $ma[] = $rule_type."\n".$author_name."\n".$author_action;
1168
- endforeach;
1169
- endforeach;
1170
- $meta['map authors'] = implode("\n\n", $ma);
1171
- endif;
1172
-
1173
- $notes = '';
1174
- foreach ($meta as $key => $value) :
1175
- $notes .= $key . ": ". addcslashes($value, "\0..\37".'\\') . "\n";
1176
- endforeach;
1177
- $alter[] = "link_notes = '".$wpdb->escape($notes)."'";
1178
-
1179
- $alter_set = implode(", ", $alter);
1180
-
1181
- // issue update query
1182
- $result = $wpdb->query("
1183
- UPDATE $wpdb->links
1184
- SET $alter_set
1185
- WHERE link_id='$link_id'
1186
- ");
1187
- $updated_link = true;
1188
-
1189
- // reload link information from DB
1190
- $link =& new SyndicatedLink($link_id);
1191
- else :
1192
- $updated_link = false;
1193
- endif;
1194
-
1195
- $db_link = $link->link;
1196
- $link_url = wp_specialchars($db_link->link_url, 1);
1197
- $link_name = wp_specialchars($db_link->link_name, 1);
1198
- $link_description = wp_specialchars($db_link->link_description, 'both');
1199
- $link_notes = wp_specialchars($db_link->link_notes, 'both');
1200
- $link_rss_uri = wp_specialchars($db_link->link_rss, 'both');
1201
-
1202
- $meta = $link->settings;
1203
- $post_status_global = get_option('feedwordpress_syndicated_post_status');
1204
- $comment_status_global = get_option('feedwordpress_syndicated_comment_status');
1205
- $ping_status_global = get_option('feedwordpress_syndicated_ping_status');
1206
-
1207
- $status['post'] = array('publish' => '', 'private' => '', 'draft' => '', 'site-default' => '');
1208
- if (SyndicatedPost::use_api('post_status_pending')) :
1209
- $status['post']['pending'] = '';
1210
- endif;
1211
-
1212
- $status['comment'] = array('open' => '', 'closed' => '', 'site-default' => '');
1213
- $status['ping'] = array('open' => '', 'closed' => '', 'site-default' => '');
1214
-
1215
- foreach (array('post', 'comment', 'ping') as $what) :
1216
- if (isset($meta["{$what} status"])) :
1217
- $status[$what][$meta["{$what} status"]] = ' checked="checked"';
1218
- else :
1219
- $status[$what]['site-default'] = ' checked="checked"';
1220
- endif;
1221
- endforeach;
1222
-
1223
- $unfamiliar['author'] = array ('create' => '','default' => '','filter' => '');
1224
- $unfamiliar['category'] = array ('create'=>'','default'=>'','filter'=>'');
1225
-
1226
- foreach (array('author', 'category') as $what) :
1227
- if (is_string($meta["unfamiliar {$what}"]) and
1228
- array_key_exists($meta["unfamiliar {$what}"], $unfamiliar[$what])) :
1229
- $key = $meta["unfamiliar {$what}"];
1230
- else:
1231
- $key = 'site-default';
1232
- endif;
1233
- $unfamiliar[$what][$key] = ' checked="checked"';
1234
- endforeach;
1235
-
1236
- if (is_array($meta['cats'])) : $cats = $meta['cats'];
1237
- else : $cats = array();
1238
- endif;
1239
-
1240
- $dogs = SyndicatedPost::category_ids($cats, /*unfamiliar=*/ NULL);
1241
- else :
1242
- die( __('Link not found.') );
1243
- endif;
1244
-
1245
- ?>
1246
- <script type="text/javascript">
1247
- function flip_hardcode (item) {
1248
- ed=document.getElementById('basics-'+item+'-edit');
1249
- view=document.getElementById('basics-'+item+'-view');
1250
-
1251
- o = document.getElementById('basics-hardcode-'+item);
1252
- if (o.value=='yes') { ed.style.display='inline'; view.style.display='none'; }
1253
- else { ed.style.display='none'; view.style.display='inline'; }
1254
- }
1255
- function flip_newuser (item) {
1256
- rollup=document.getElementById(item);
1257
- newuser=document.getElementById(item+'-newuser');
1258
- sitewide=document.getElementById(item+'-default');
1259
- if (rollup) {
1260
- if ('newuser'==rollup.value) {
1261
- if (newuser) newuser.style.display='block';
1262
- if (sitewide) sitewide.style.display='none';
1263
- } else if ('site-default'==rollup.value) {
1264
- if (newuser) newuser.style.display='none';
1265
- if (sitewide) sitewide.style.display='block';
1266
- } else {
1267
- if (newuser) newuser.style.display='none';
1268
- if (sitewide) sitewide.style.display='none';
1269
- }
1270
- }
1271
- }
1272
- </script>
1273
-
1274
- <?php if ($updated_link) : ?>
1275
- <div class="updated"><p>Syndicated feed settings updated.</p></div>
1276
- <?php endif; ?>
1277
-
1278
- <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
1279
- <div class="wrap">
1280
- <input type="hidden" name="link_id" value="<?php echo $link_id; ?>" />
1281
- <input type="hidden" name="action" value="linkedit" />
1282
- <input type="hidden" name="save" value="link" />
1283
-
1284
- <h2>Edit a syndicated feed:</h2>
1285
- <div id="poststuff">
1286
- <?php fwp_linkedit_single_submit($status); ?>
1287
-
1288
- <div id="post-body">
1289
- <?php fwp_option_box_opener('Feed Information', 'feedinformationdiv'); ?>
1290
- <table class="editform" width="100%" cellspacing="2" cellpadding="5">
1291
- <tr>
1292
- <th scope="row" width="20%"><?php _e('Feed URI:') ?></th>
1293
- <td width="60%"><a href="<?php echo wp_specialchars($link_rss_uri, 'both'); ?>"><?php echo $link_rss_uri; ?></a>
1294
- (<a href="<?php echo FEEDVALIDATOR_URI; ?>?url=<?php echo urlencode($link_rss_uri); ?>"
1295
- title="Check feed &lt;<?php echo wp_specialchars($link_rss_uri, 'both'); ?>&gt; for validity">validate</a>)
1296
- </td>
1297
- <td width="20%"><input type="submit" name="feedfinder" value="switch &rarr;" style="font-size:smaller" /></td>
1298
- </tr>
1299
- <tr>
1300
- <th scope="row" width="20%"><?php _e('Link Name:') ?></th>
1301
- <td width="60%"><input type="text" id="basics-name-edit" name="name"
1302
- value="<?php echo $link_name; ?>" style="width: 95%" />
1303
- <span id="basics-name-view"><strong><?php echo $link_name; ?></strong></span>
1304
- </td>
1305
- <td>
1306
- <select id="basics-hardcode-name" onchange="flip_hardcode('name')" name="hardcode_name">
1307
- <option value="no" <?php echo $link->hardcode('name')?'':'selected="selected"'; ?>>update automatically</option>
1308
- <option value="yes" <?php echo $link->hardcode('name')?'selected="selected"':''; ?>>edit manually</option>
1309
- </select>
1310
- </td>
1311
- </tr>
1312
- <tr>
1313
- <th scope="row" width="20%"><?php _e('Short description:') ?></th>
1314
- <td width="60%">
1315
- <input id="basics-description-edit" type="text" name="description" value="<?php echo $link_description; ?>" style="width: 95%" />
1316
- <span id="basics-description-view"><strong><?php echo $link_description; ?></strong></span>
1317
- </td>
1318
- <td>
1319
- <select id="basics-hardcode-description" onchange="flip_hardcode('description')"
1320
- name="hardcode_description">
1321
- <option value="no" <?php echo $link->hardcode('description')?'':'selected="selected"'; ?>>update automatically</option>
1322
- <option value="yes" <?php echo $link->hardcode('description')?'selected="selected"':''; ?>>edit manually</option>
1323
- </select></td>
1324
- </tr>
1325
- <tr>
1326
- <th width="20%" scope="row"><?php _e('Homepage:') ?></th>
1327
- <td width="60%">
1328
- <input id="basics-url-edit" type="text" name="linkurl" value="<?php echo $link_url; ?>" style="width: 95%;" />
1329
- <a id="basics-url-view" href="<?php echo $link_url; ?>"><?php echo $link_url; ?></a></td>
1330
- <td>
1331
- <select id="basics-hardcode-url" onchange="flip_hardcode('url')" name="hardcode_url">
1332
- <option value="no"<?php echo $link->hardcode('url')?'':' selected="selected"'; ?>>update automatically</option>
1333
- <option value="yes"<?php echo $link->hardcode('url')?' selected="selected"':''; ?>>edit manually</option>
1334
- </select></td></tr>
1335
-
1336
- <tr>
1337
- <th width="20%"><?php _e('Last update') ?>:</th>
1338
- <td colspan="2"><?php
1339
- if (isset($meta['update/last'])) :
1340
- echo strftime('%x %X', $meta['update/last'])." ";
1341
- else :
1342
- echo " none yet";
1343
- endif;
1344
- ?></td></tr>
1345
- <tr><th width="20%">Next update:</th>
1346
- <td colspan="2"><?php
1347
- $holdem = (isset($meta['update/hold']) ? $meta['update/hold'] : 'scheduled');
1348
- ?>
1349
- <select name="update_schedule">
1350
- <option value="scheduled"<?php echo ($holdem=='scheduled')?' selected="selected"':''; ?>>update on schedule <?php
1351
- echo " (";
1352
- if (isset($meta['update/ttl']) and is_numeric($meta['update/ttl'])) :
1353
- if (isset($meta['update/timed']) and $meta['update/timed']=='automatically') :
1354
- echo 'next: ';
1355
- $next = $meta['update/last'] + ((int) $meta['update/ttl'] * 60);
1356
- if (strftime('%x', time()) != strftime('%x', $next)) :
1357
- echo strftime('%x', $next)." ";
1358
- endif;
1359
- echo strftime('%X', $meta['update/last']+((int) $meta['update/ttl']*60));
1360
- else :
1361
- echo "every ".$meta['update/ttl']." minute".(($meta['update/ttl']!=1)?"s":"");
1362
- endif;
1363
- else:
1364
- echo "next scheduled update";
1365
- endif;
1366
- echo ")";
1367
- ?></option>
1368
- <option value="next"<?php echo ($holdem=='next')?' selected="selected"':''; ?>>update ASAP</option>
1369
- <option value="ping"<?php echo ($holdem=='ping')?' selected="selected"':''; ?>>update only when pinged</option>
1370
- </select></tr>
1371
- </table>
1372
- <?php fwp_option_box_closer(); ?>
1373
-
1374
- <script type="text/javascript">
1375
- flip_hardcode('name');
1376
- flip_hardcode('description');
1377
- flip_hardcode('url');
1378
- </script>
1379
-
1380
- <?php fwp_linkedit_periodic_submit(); ?>
1381
-
1382
- <?php
1383
- if (!(isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25)) :
1384
- fwp_option_box_opener('Syndicated Posts', 'syndicatedpostsdiv', 'postbox');
1385
- ?>
1386
- <table class="editform" width="75%" cellspacing="2" cellpadding="5">
1387
- <tr><th width="27%" scope="row" style="vertical-align:top">Publication:</th>
1388
- <td width="73%" style="vertical-align:top"><ul style="margin:0; list-style:none">
1389
- <li><label><input type="radio" name="feed_post_status" value="site-default"
1390
- <?php echo $status['post']['site-default']; ?> /> Use site-wide setting from <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication-options.php">Syndication Options</a>
1391
- (currently: <strong><?php echo ($post_status_global ? $post_status_global : 'publish'); ?></strong>)</label></li>
1392
- <li><label><input type="radio" name="feed_post_status" value="publish"
1393
- <?php echo $status['post']['publish']; ?> /> Publish posts from this feed immediately</label></li>
1394
-
1395
- <?php if (SyndicatedPost::use_api('post_status_pending')) : ?>
1396
- <li><label><input type="radio" name="feed_post_status" value="pending"
1397
- <?php echo $status['post']['pending']; ?>/> Hold posts from this feed for review; mark as Pending</label></li>
1398
- <?php endif; ?>
1399
-
1400
- <li><label><input type="radio" name="feed_post_status" value="draft"
1401
- <?php echo $status['post']['draft']; ?> /> Save posts from this feed as drafts</label></li>
1402
- <li><label><input type="radio" name="feed_post_status" value="private"
1403
- <?php echo $status['post']['private']; ?> /> Save posts from this feed as private posts</label></li>
1404
- </ul></td>
1405
- </tr>
1406
- </table>
1407
- <?php
1408
- fwp_option_box_closer();
1409
- fwp_linkedit_periodic_submit();
1410
- endif;
1411
-
1412
- fwp_option_box_opener(__('Categories'), 'categorydiv', 'postbox');
1413
- fwp_category_box($dogs, 'all syndicated posts from this feed');
1414
- ?>
1415
- <table>
1416
- <tr>
1417
- <th width="20%" scope="row" style="vertical-align:top">Unfamiliar categories:</th>
1418
- <td width="80%"><ul style="margin: 0; list-style:none">
1419
- <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=<?php print $GLOBALS['fwp_path'] ?>/syndication-options.php">Syndication Options</a>
1420
- (currently <strong><?php echo FeedWordPress::on_unfamiliar('category'); ?></strong>)</label></li>
1421
- <li><label><input type="radio" name="unfamiliar_category" value="create"<?php echo $unfamiliar['category']['create']; ?> /> create any categories the post is in</label></li>
1422
- <li><label><input type="radio" name="unfamiliar_category" value="default"<?php echo $unfamiliar['category']['default']; ?> /> don't create new categories</label></li>
1423
- <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>
1424
- </ul></td>
1425
- </tr>
1426
-
1427
- <tr>
1428
- <th width="20%" scope="row" style="vertical-align:top">Multiple categories:</th>
1429
- <td width="80%">
1430
- <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/>
1431
- 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
1432
- categories in a single category element. The regular expression should match
1433
- the characters used to separate one category from the next. If the feed uses
1434
- spaces (like <a href="http://del.icio.us/">del.icio.us</a>), use the pattern "\s".
1435
- If the feed does not provide multiple categories in a single element, leave this
1436
- blank.</td>
1437
- </tr>
1438
- </table>
1439
- <?php
1440
- fwp_option_box_closer();
1441
- fwp_linkedit_periodic_submit();
1442
-
1443
- if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
1444
- fwp_tags_box($meta['tags']);
1445
- fwp_linkedit_periodic_submit();
1446
- endif; ?>
1447
-
1448
- <?php fwp_option_box_opener('Syndicated Authors', 'authordiv', 'postbox'); ?>
1449
- <?php $authorlist = fwp_author_list(); ?>
1450
- <table>
1451
- <tr><th colspan="3" style="text-align: left; padding-top: 1.0em; border-bottom: 1px dotted black;">For posts by authors that haven't been syndicated before:</th></tr>
1452
- <tr>
1453
- <th style="text-align: left">Posts by new authors</th>
1454
- <td>
1455
- <select id="unfamiliar-author" name="unfamiliar_author" onchange="flip_newuser('unfamiliar-author');">
1456
- <option value="site-default"<?php if (!isset($meta['unfamiliar author'])) : ?>selected="selected"<?php endif; ?>>are handled using site-wide settings</option>
1457
- <option value="create"<?php if ('create'==$meta['unfamiliar author']) : ?>selected="selected"<?php endif; ?>>create a new author account</option>
1458
- <?php foreach ($authorlist as $author_id => $author_name) : ?>
1459
- <option value="<?php echo $author_id; ?>"<?php if ($author_id==$meta['unfamiliar author']) : ?>selected="selected"<?php endif; ?>>are assigned to <?php echo $author_name; ?></option>
1460
- <?php endforeach; ?>
1461
- <option value="newuser">will be assigned to a new user...</option>
1462
- <option value="filter"<?php if ('filter'==$meta['unfamiliar author']) : ?>selected="selected"<?php endif; ?>>get filtered out</option>
1463
- </select>
1464
- </td>
1465
- <td>
1466
- <div id="unfamiliar-author-default">Site-wide settings can be set in <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication-options.php">Syndication Options</a></div>
1467
- <div id="unfamiliar-author-newuser">named <input type="text" name="unfamiliar_author_newuser" value="" /></div>
1468
- </td>
1469
- </tr>
1470
-
1471
- <tr><th colspan="3" style="text-align: left; padding-top: 1.0em; border-bottom: 1px dotted black;">For posts by specific authors. Blank out a name to delete the rule.</th></tr>
1472
-
1473
- <?php if (isset($meta['map authors'])) : $i=0; foreach ($meta['map authors'] as $author_rules) : foreach ($author_rules as $author_name => $author_action) : $i++; ?>
1474
- <tr>
1475
- <th style="text-align: left">Posts by <input type="text" name="author_rules_name[]" value="<?php echo htmlspecialchars($author_name); ?>" /></th>
1476
- <td>
1477
- <select id="author-rules-<?php echo $i; ?>" name="author_rules_action[]" onchange="flip_newuser('author-rules-<?php echo $i; ?>');">
1478
- <?php foreach ($authorlist as $local_author_id => $local_author_name) : ?>
1479
- <option value="<?php echo $local_author_id; ?>"<?php if ($local_author_id==$author_action) : echo ' selected="selected"'; endif; ?>>are assigned to <?php echo $local_author_name; ?></option>
1480
- <?php endforeach; ?>
1481
- <option value="newuser">will be assigned to a new user...</option>
1482
- <option value="filter"<?php if ('filter'==$author_action) : echo ' selected="selected"'; endif; ?>>get filtered out</option>
1483
- </select>
1484
- </td>
1485
- <td><div id="author-rules-<?php echo $i; ?>-newuser">named <input type="text" name="author_rules_newuser[]" value="" /></div></td>
1486
- </tr>
1487
- <?php endforeach; endforeach; endif; ?>
1488
-
1489
- <tr><th colspan="3" style="text-align: left; padding-top: 1.0em; border-bottom: 1px dotted black;">Fill in to set up a new rule:</th></tr>
1490
-
1491
- <tr>
1492
- <th style="text-align: left">Posts by <input type="text" name="add_author_rule_name" /></th>
1493
- <td>
1494
- <select id="add-author-rule" name="add_author_rule_action" onchange="flip_newuser('add-author-rule');">
1495
- <?php foreach ($authorlist as $author_id => $author_name) : ?>
1496
- <option value="<?php echo $author_id; ?>">are assigned to <?php echo $author_name; ?></option>
1497
- <?php endforeach; ?>
1498
- <option value="newuser">will be assigned to a new user...</option>
1499
- <option value="filter">get filtered out</option>
1500
- </select>
1501
- </td>
1502
- <td><div id="add-author-rule-newuser">named <input type="text" name="add_author_rule_newuser" value="" /></div></td>
1503
- </tr>
1504
-
1505
- </table>
1506
- <?php fwp_option_box_closer(); ?>
1507
-
1508
- <script>
1509
- flip_newuser('unfamiliar-author');
1510
- <?php for ($j=1; $j<=$i; $j++) : ?>
1511
- flip_newuser('author-rules-<?php echo $j; ?>');
1512
- <?php endfor; ?>
1513
- flip_newuser('add-author-rule');
1514
- </script>
1515
-
1516
- <?php
1517
- fwp_linkedit_periodic_submit();
1518
- fwp_option_box_opener('Comments & Pings', 'commentstatusdiv', 'postbox');
1519
- ?>
1520
- <table class="editform" width="75%" cellspacing="2" cellpadding="5">
1521
- <tr><th width="27%" scope="row" style="vertical-align:top"><?php print __('Comments'); ?>:</th>
1522
- <td width="73%"><ul style="margin:0; list-style:none">
1523
- <li><label><input type="radio" name="feed_comment_status" value="site-default"
1524
- <?php echo $status['comment']['site-default']; ?> /> Use site-wide setting from <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication-options.php">Syndication Options</a>
1525
- (currently: <strong><?php echo ($comment_status_global ? $comment_status_global : 'closed'); ?>)</strong></label></li>
1526
- <li><label><input type="radio" name="feed_comment_status" value="open"
1527
- <?php echo $status['comment']['open']; ?> /> Allow comments on syndicated posts from this feed</label></li>
1528
- <li><label><input type="radio" name="feed_comment_status" value="closed"
1529
- <?php echo $status['comment']['closed']; ?> /> Don't allow comments on syndicated posts from this feed</label></li>
1530
- </ul></td></tr>
1531
-
1532
- <tr><th width="27%" scope="row" style="vertical-align:top"><?php print __('Pings'); ?>:</th>
1533
- <td width="73%"><ul style="margin:0; list-style:none">
1534
- <li><label><input type="radio" name="feed_ping_status" value="site-default"
1535
- <?php echo $status['ping']['site-default']; ?> /> Use site-wide setting from <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication-options.php">Syndication Options</a>
1536
- (currently: <strong><?php echo ($ping_status_global ? $ping_status_global : 'closed'); ?>)</strong></label></li>
1537
- <li><label><input type="radio" name="feed_ping_status" value="open"
1538
- <?php echo $status['ping']['open']; ?> /> Accept pings on syndicated posts from this feed</label></li>
1539
- <li><label><input type="radio" name="feed_ping_status" value="closed"
1540
- <?php echo $status['ping']['closed']; ?> /> Don't accept pings on syndicated posts from this feed</label></li>
1541
- </ul></td></tr>
1542
-
1543
- </table>
1544
- <?php fwp_option_box_closer(); ?>
1545
- <?php fwp_linkedit_periodic_submit(); ?>
1546
-
1547
- <?php fwp_option_box_opener('Custom Settings (for use in templates)', 'postcustom', 'postbox'); ?>
1548
- <div id="postcustomstuff">
1549
- <table id="meta-list" cellpadding="3">
1550
- <tr>
1551
- <th>Key</th>
1552
- <th>Value</th>
1553
- <th>Action</th>
1554
- </tr>
1555
-
1556
- <?php
1557
- $i = 0;
1558
- foreach ($meta as $key => $value) :
1559
- if (!preg_match("\007^((".implode(')|(', $special_settings)."))$\007i", $key)) :
1560
- ?>
1561
- <tr style="vertical-align:top">
1562
- <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo wp_specialchars($key, 'both'); ?>" />
1563
- <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo wp_specialchars($key, 'both'); ?>" /></th>
1564
- <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>
1565
- <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
1566
- <option value="update">save changes</option>
1567
- <option value="delete">delete this setting</option>
1568
- </select></td>
1569
- </tr>
1570
- <?php
1571
- $i++;
1572
- endif;
1573
- endforeach;
1574
- ?>
1575
- <tr>
1576
- <th scope="row"><input type="text" size="10" name="notes[<?php echo $i; ?>][key1]" value="" /></th>
1577
- <td><textarea name="notes[<?php echo $i; ?>][value]" rows="2" cols="40"></textarea></td>
1578
- <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo $i; ?>][action]" value="update" /></td>
1579
- </tr>
1580
- </table>
1581
- <?php fwp_option_box_closer(); ?>
1582
-
1583
- <?php fwp_linkedit_periodic_submit(); ?>
1584
- </div> <!-- id="post-body" -->
1585
- </div> <!-- id="poststuff" -->
1586
- </div>
1587
- <?php
1588
- endif;
1589
- return false; // Don't continue
1590
- }
1591
-
1592
- function fwp_author_list () {
1593
- global $wpdb;
1594
- $ret = array();
1595
- $users = $wpdb->get_results("SELECT * FROM $wpdb->users ORDER BY display_name");
1596
- if (is_array($users)) :
1597
- foreach ($users as $user) :
1598
- $id = (int) $user->ID;
1599
- $ret[$id] = $user->display_name;
1600
- endforeach;
1601
  endif;
1602
- return $ret;
1603
- }
1604
-
1605
- function fwp_multidelete_page () {
1606
- global $wpdb;
1607
-
1608
- check_admin_referer(); // Make sure the referers are kosher
1609
-
1610
- $link_ids = (isset($_REQUEST['link_ids']) ? $_REQUEST['link_ids'] : array());
1611
- if (isset($_REQUEST['link_id'])) : array_push($link_ids, $_REQUEST['link_id']); endif;
1612
-
1613
- if (!current_user_can('manage_links')):
1614
- die (__("Cheatin' uh ?"));
1615
- elseif (isset($GLOBALS['fwp_post']['confirm']) and $GLOBALS['fwp_post']['confirm']=='Delete'):
1616
- foreach ($GLOBALS['fwp_post']['link_action'] as $link_id => $what) :
1617
- $do_it[$what][] = $link_id;
1618
- endforeach;
1619
-
1620
- $alter = array();
1621
- if (count($do_it['hide']) > 0) :
1622
- $hidem = "(".implode(', ', $do_it['hide']).")";
1623
- $alter[] = "
1624
- UPDATE $wpdb->links
1625
- SET link_visible = 'N'
1626
- WHERE link_id IN {$hidem}
1627
- ";
1628
- endif;
1629
-
1630
- if (count($do_it['nuke']) > 0) :
1631
- $nukem = "(".implode(', ', $do_it['nuke']).")";
1632
-
1633
- // Make a list of the items syndicated from this feed...
1634
- $post_ids = $wpdb->get_col("
1635
- SELECT post_id FROM $wpdb->postmeta
1636
- WHERE meta_key = 'syndication_feed_id'
1637
- AND meta_value IN {$nukem}
1638
- ");
1639
-
1640
- // ... and kill them all
1641
- if (count($post_ids) > 0) :
1642
- foreach ($post_ids as $post_id) :
1643
- wp_delete_post($post_id);
1644
- endforeach;
1645
- endif;
1646
-
1647
- $alter[] = "
1648
- DELETE FROM $wpdb->links
1649
- WHERE link_id IN {$nukem}
1650
- ";
1651
- endif;
1652
-
1653
- if (count($do_it['delete']) > 0) :
1654
- $deletem = "(".implode(', ', $do_it['delete']).")";
1655
 
1656
- // Make the items syndicated from this feed appear to be locally-authored
1657
- $alter[] = "
1658
- DELETE FROM $wpdb->postmeta
1659
- WHERE meta_key = 'syndication_feed_id'
1660
- AND meta_value IN {$deletem}
1661
- ";
1662
-
1663
- // ... and delete the links themselves.
1664
- $alter[] = "
1665
- DELETE FROM $wpdb->links
1666
- WHERE link_id IN {$deletem}
1667
- ";
1668
- endif;
1669
 
1670
- $errs = array(); $success = array ();
1671
- foreach ($alter as $sql) :
1672
- $result = $wpdb->query($sql);
1673
- if (!$result):
1674
- $errs[] = mysql_error();
1675
- endif;
1676
- endforeach;
1677
-
1678
- if (count($alter) > 0) :
1679
- echo "<div class=\"updated\">\n";
1680
- if (count($errs) > 0) :
1681
- echo "There were some problems processing your ";
1682
- echo "unsubscribe request. [SQL: ".implode('; ', $errs)."]";
1683
- else :
1684
- echo "Your unsubscribe request(s) have been processed.";
1685
- endif;
1686
- echo "</div>\n";
1687
- endif;
1688
 
1689
- return true; // Continue on to Syndicated Sites listing
1690
- else :
1691
- $targets = $wpdb->get_results("
1692
- SELECT * FROM $wpdb->links
1693
- WHERE link_id IN (".implode(",",$link_ids).")
1694
- ");
1695
- ?>
1696
- <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
1697
- <div class="wrap">
1698
- <input type="hidden" name="action" value="Unsubscribe" />
1699
- <input type="hidden" name="confirm" value="Delete" />
1700
-
1701
- <h2>Unsubscribe from Syndicated Links:</h2>
1702
- <?php foreach ($targets as $link) :
1703
- $link_url = wp_specialchars($link->link_url, 1);
1704
- $link_name = wp_specialchars($link->link_name, 1);
1705
- $link_description = wp_specialchars($link->link_description, 'both');
1706
- $link_rss = wp_specialchars($link->link_rss, 'both');
1707
- ?>
1708
- <fieldset>
1709
- <legend><?php echo $link_name; ?></legend>
1710
- <table class="editform" width="100%" cellspacing="2" cellpadding="5">
1711
- <tr><th scope="row" width="20%"><?php _e('Feed URI:') ?></th>
1712
- <td width="80%"><a href="<?php echo $link_rss; ?>"><?php echo $link_rss; ?></a></td></tr>
1713
- <tr><th scope="row" width="20%"><?php _e('Short description:') ?></th>
1714
- <td width="80%"><?php echo $link_description; ?></span></td></tr>
1715
- <tr><th width="20%" scope="row"><?php _e('Homepage:') ?></th>
1716
- <td width="80%"><a href="<?php echo $link_url; ?>"><?php echo $link_url; ?></a></td></tr>
1717
- <tr style="vertical-align:top"><th width="20%" scope="row">Subscription <?php _e('Options') ?>:</th>
1718
- <td width="80%"><ul style="margin:0; padding: 0; list-style: none">
1719
- <li><input type="radio" id="hide-<?php echo $link->link_id; ?>"
1720
- name="link_action[<?php echo $link->link_id; ?>]" value="hide" />
1721
- <label for="hide-<?php echo $link->link_id; ?>">Turn off the subscription for this
1722
- syndicated link<br/><span style="font-size:smaller">(Keep the feed information
1723
- and all the posts from this feed in the database, but don't syndicate any
1724
- new posts from the feed.)</span></label></li>
1725
- <li><input type="radio" id="nuke-<?php echo $link->link_id; ?>"
1726
- name="link_action[<?php echo $link->link_id; ?>]" value="nuke" />
1727
- <label for="nuke-<?php echo $link->link_id; ?>">Delete this syndicated link and all the
1728
- posts that were syndicated from it</label></li>
1729
- <li><input type="radio" id="delete-<?php echo $link->link_id; ?>"
1730
- name="link_action[<?php echo $link->link_id; ?>]" value="delete" />
1731
- <label for="delete-<?php echo $link->link_id; ?>">Delete this syndicated link, but
1732
- <em>keep</em> posts that were syndicated from it (as if they were authored
1733
- locally).</label></li>
1734
- <li><input type="radio" id="nothing-<?php echo $link->link_id; ?>"
1735
- name="link_action[<?php echo $link->link_id; ?>]" value="nothing" />
1736
- <label for="nothing-<?php echo $link->link_id; ?>">Keep this feed as it is. I changed
1737
- my mind.</label></li>
1738
- </ul>
1739
- </table>
1740
- </fieldset>
1741
- <?php endforeach; ?>
1742
-
1743
- <div class="submit">
1744
- <input class="delete" type="submit" name="submit" value="<?php _e('Unsubscribe from selected feeds &raquo;') ?>" />
1745
- </div>
1746
- </div>
1747
- <?php
1748
- return false; // Don't continue on to Syndicated Sites listing
1749
- endif;
1750
- }
1751
 
1752
  ################################################################################
1753
  ## fwp_hold_pings() and fwp_release_pings(): Outbound XML-RPC ping reform ####
@@ -2014,15 +628,18 @@ class FeedWordPress {
2014
  } // function FeedWordPress::syndicate_link()
2015
 
2016
  function on_unfamiliar ($what = 'author', $override = NULL) {
2017
- $set = array('create', 'default', 'filter');
2018
-
 
 
 
2019
  if (is_string($override)) :
2020
  $ret = strtolower($override);
2021
  endif;
2022
 
2023
- if (!is_numeric($override) and !in_array($ret, $set)) :
2024
  $ret = get_option('feedwordpress_unfamiliar_'.$what);
2025
- if (!is_numeric($ret) and !in_array($ret, $set)) :
2026
  $ret = 'create';
2027
  endif;
2028
  endif;
@@ -2356,6 +973,9 @@ class SyndicatedPost {
2356
  // In case you want to know the external permalink...
2357
  $this->post['meta']['syndication_permalink'] = apply_filters('syndicated_item_link', $this->item['link']);
2358
 
 
 
 
2359
  // Feed-by-feed options for author and category creation
2360
  $this->post['named']['unfamiliar']['author'] = $this->feedmeta['unfamiliar author'];
2361
  $this->post['named']['unfamiliar']['category'] = $this->feedmeta['unfamiliar category'];
@@ -2400,6 +1020,7 @@ class SyndicatedPost {
2400
  if (is_array($this->feedmeta['tags'])) :
2401
  $this->post['tags_input'] = array_merge($this->post['tags_input'], $this->feedmeta['tags']);
2402
  endif;
 
2403
  endif;
2404
  } // SyndicatedPost::SyndicatedPost()
2405
 
@@ -2422,16 +1043,33 @@ class SyndicatedPost {
2422
  FROM $wpdb->posts WHERE guid='$guid'
2423
  ");
2424
 
2425
- preg_match('/([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/', $result->post_modified_gmt, $backref);
2426
- $updated = gmmktime($backref[4], $backref[5], $backref[6], $backref[2], $backref[3], $backref[1]);
2427
  if (!$result) :
2428
  $this->_freshness = 2; // New content
2429
- elseif ($this->updated() > $updated) :
2430
- $this->_freshness = 1; // Updated content
2431
- $this->_wp_id = $result->id;
2432
- else :
2433
- $this->_freshness = 0; // Same old, same old
2434
- $this->_wp_id = $result->id;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2435
  endif;
2436
  endif;
2437
  return $this->_freshness;
@@ -2469,11 +1107,15 @@ class SyndicatedPost {
2469
 
2470
  if (!$this->filtered() and $freshness > 0) :
2471
  # -- Look up, or create, numeric ID for categories
2472
- $this->post['post_category'] = $this->category_ids (
2473
  $this->post['named']['category'],
2474
- FeedWordPress::on_unfamiliar('category', $this->post['named']['unfamiliar']['category'])
 
2475
  );
2476
-
 
 
 
2477
  if (is_null($this->post['post_category'])) :
2478
  // filter mode on, no matching categories; drop the post
2479
  $this->post = NULL;
@@ -2542,11 +1184,24 @@ class SyndicatedPost {
2542
 
2543
  if ($this->use_api('wp_insert_post')) :
2544
  $dbpost['post_pingback'] = false; // Tell WP 2.1 and 2.2 not to process for pingbacks
2545
- $this->_wp_id = wp_insert_post($dbpost);
 
 
 
 
 
 
 
2546
 
 
 
 
 
 
 
2547
  // This should never happen.
2548
  if (!is_numeric($this->_wp_id) or ($this->_wp_id == 0)) :
2549
- FeedWordPress::critical_bug('SyndicatedPost (_wp_id problem)', array($dbpost, $this), __LINE__);
2550
  endif;
2551
 
2552
  // Unfortunately, as of WordPress 2.3, wp_insert_post()
@@ -2591,7 +1246,7 @@ class SyndicatedPost {
2591
 
2592
  // This should never happen.
2593
  if (!is_numeric($this->_wp_id) or ($this->_wp_id == 0)) :
2594
- FeedWordPress::critical_bug('SyndicatedPost::_wp_id', $this->_wp_id, __LINE__);
2595
  endif;
2596
 
2597
  // WordPress 1.5.x - 2.0.x
@@ -2622,11 +1277,24 @@ class SyndicatedPost {
2622
 
2623
  if ($this->use_api('wp_insert_post')) :
2624
  $dbpost['post_pingback'] = false; // Tell WP 2.1 and 2.2 not to process for pingbacks
 
 
 
 
 
 
 
 
 
2625
  $this->_wp_id = wp_insert_post($dbpost);
2626
 
 
 
 
 
2627
  // This should never happen.
2628
  if (!is_numeric($this->_wp_id) or ($this->_wp_id == 0)) :
2629
- FeedWordPress::critical_bug('SyndicatedPost::_wp_id', $this->_wp_id, __LINE__);
2630
  endif;
2631
 
2632
  // Unfortunately, as of WordPress 2.3, wp_insert_post()
@@ -2661,7 +1329,7 @@ class SyndicatedPost {
2661
  wp_set_post_cats('1', $this->wp_id(), $this->post['post_category']);
2662
  // This should never happen.
2663
  else :
2664
- FeedWordPress::critical_bug('SyndicatedPost::insert_new::wp_version', $GLOBALS['wp_version'], __LINE__);
2665
  endif;
2666
 
2667
  // Since we are not going through official channels, we need to
@@ -2674,6 +1342,61 @@ class SyndicatedPost {
2674
  endif;
2675
  } /* SyndicatedPost::update_existing() */
2676
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2677
  // SyndicatedPost::add_rss_meta: adds interesting meta-data to each entry
2678
  // using the space for custom keys. The set of keys and values to add is
2679
  // specified by the keys and values of $post['meta']. This is used to
@@ -2852,7 +1575,7 @@ class SyndicatedPost {
2852
  } // function SyndicatedPost::author_id ()
2853
 
2854
  // look up (and create) category ids from a list of categories
2855
- function category_ids ($cats, $unfamiliar_category = 'create') {
2856
  global $wpdb;
2857
 
2858
  // We need to normalize whitespace because (1) trailing
@@ -2863,6 +1586,8 @@ class SyndicatedPost {
2863
  // distinction between 'Computers' and 'Computers '
2864
  $cats = array_map('trim', $cats);
2865
 
 
 
2866
  $cat_ids = array ();
2867
  foreach ($cats as $cat_name) :
2868
  if (preg_match('/^{#([0-9]+)}$/', $cat_name, $backref)) :
@@ -2892,6 +1617,8 @@ class SyndicatedPost {
2892
  foreach ($results AS $term) :
2893
  $cat_ids[] = (int) $term->term_id;
2894
  endforeach;
 
 
2895
  elseif ('create'===$unfamiliar_category) :
2896
  $term = wp_insert_term($cat_name, 'category');
2897
  $cat_ids[] = $term['term_id'];
@@ -2937,7 +1664,12 @@ class SyndicatedPost {
2937
  else :
2938
  $cat_ids = array_unique($cat_ids);
2939
  endif;
2940
- return $cat_ids;
 
 
 
 
 
2941
  } // function SyndicatedPost::category_ids ()
2942
 
2943
  function use_api ($tag) {
@@ -2991,12 +1723,16 @@ class SyndicatedPost {
2991
 
2992
  # If everything failed, then default to the current time.
2993
  if (is_null($epoch)) :
2994
- $epoch = time();
 
 
 
 
2995
  endif;
2996
 
2997
  return $epoch;
2998
  }
2999
- function updated ($fallback = true) {
3000
  $epoch = null;
3001
 
3002
  # As far as I know, only dcterms and Atom have reliable ways to
@@ -3011,17 +1747,25 @@ class SyndicatedPost {
3011
  elseif (isset($this->item['updated'])): // Atom 1.0
3012
  $epoch = @parse_w3cdtf($this->item['updated']);
3013
  elseif ($fallback) : // Fall back to issued / dc:date
3014
- $epoch = $this->published(/*fallback=*/ false);
3015
  endif;
3016
 
3017
  # If everything failed, then default to the current time.
3018
  if (is_null($epoch)) :
3019
- $epoch = time();
 
 
 
 
3020
  endif;
3021
 
3022
  return $epoch;
3023
  }
3024
 
 
 
 
 
3025
  function guid () {
3026
  $guid = null;
3027
  if (isset($this->item['id'])): // Atom 0.3 / 1.0
@@ -3911,4 +2655,4 @@ function parse_email_with_realname ($email) {
3911
  endif;
3912
  return $ret;
3913
  }
3914
- ?>
3
  Plugin Name: FeedWordPress
4
  Plugin URI: http://projects.radgeek.com/feedwordpress
5
  Description: simple and flexible Atom/RSS syndication for WordPress
6
+ Version: 2008.1030
7
  Author: Charles Johnson
8
  Author URI: http://radgeek.com/
9
  License: GPL
10
+ Last modified: 2008-10-30 4:14pm PDT
11
  */
12
 
13
  # This uses code derived from:
27
 
28
  # -- Don't change these unless you know what you're doing...
29
 
30
+ define ('FEEDWORDPRESS_VERSION', '2008.1030');
31
  define ('FEEDWORDPRESS_AUTHOR_CONTACT', 'http://radgeek.com/contact');
32
  define ('DEFAULT_SYNDICATION_CATEGORY', 'Contributors');
33
 
44
  define ('FWP_SCHEMA_21', 4772); // Database schema # for WP 2.1
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
 
49
  if (FEEDWORDPRESS_DEBUG) :
50
  // Help us to pick out errors, if any.
84
  endif;
85
  endif;
86
 
87
+ require_once(dirname(__FILE__) . '/compatability.php'); // LEGACY API: Replicate or mock up functions for legacy support purposes
 
 
 
 
 
 
 
88
 
89
  // Magic quotes are just about the stupidest thing ever.
90
  if (is_array($_POST)) :
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
  if (!FeedWordPress::needs_upgrade()) : // only work if the conditions are safe!
132
 
133
  # Syndicated items are generally received in output-ready (X)HTML and
146
  add_filter('the_content', 'feedwordpress_preserve_syndicated_content', -10000);
147
  add_filter('the_content', 'feedwordpress_restore_syndicated_content', 10000);
148
 
149
+ add_action('atom_entry', 'feedwordpress_item_feed_data');
150
+
151
  # Filter in original permalinks if the user wants that
152
  add_filter('post_link', 'syndication_permalink', 1);
153
 
243
  : implode(' and ', $mesg)));
244
  }
245
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
246
  ################################################################################
247
  ## TEMPLATE API: functions to make your templates syndication-aware ############
248
  ################################################################################
297
  function feedwordpress_preserve_syndicated_content ($text) {
298
  global $feedwordpress_the_syndicated_content;
299
 
300
+ if ( is_syndicated() and get_option('feedwordpress_formatting_filters') != 'yes' ) :
301
  $feedwordpress_the_syndicated_content = $text;
302
  else :
303
  $feedwordpress_the_syndicated_content = NULL;
315
  return $text;
316
  }
317
 
318
+ function feedwordpress_item_feed_data () {
319
+ // In a post context....
320
+ if (is_syndicated()) :
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
321
  ?>
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(); ?>" />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
326
  <?php
327
+ $id = get_feed_meta('feed/id');
328
+ if (strlen($id) > 0) :
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
329
  ?>
330
+ <id><?php print $id; ?></id>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
331
  <?php
332
  endif;
333
+ $updated = get_feed_meta('feed/updated');
334
+ if (strlen($updated) > 0) : ?>
335
+ <updated><?php print $updated; ?></updated>
 
 
 
 
 
 
 
336
  <?php
337
  endif;
 
 
 
 
 
 
 
 
 
 
 
338
  ?>
339
+ </source>
340
  <?php
341
  endif;
342
  }
343
 
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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
348
  else:
349
+ return $permalink;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
350
  endif;
351
+ } // function syndication_permalink ()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
352
 
353
+ ################################################################################
354
+ ## ADMIN MENU ADD-ONS: register Dashboard management pages #####################
355
+ ################################################################################
 
 
 
 
 
 
 
 
 
 
356
 
357
+ function fwp_add_pages () {
358
+ global $fwp_capability;
359
+ global $fwp_path;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
360
 
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 () */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
365
 
366
  ################################################################################
367
  ## fwp_hold_pings() and fwp_release_pings(): Outbound XML-RPC ping reform ####
628
  } // function FeedWordPress::syndicate_link()
629
 
630
  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;
639
 
640
+ if (!is_numeric($override) and !in_array($ret, $set[$what])) :
641
  $ret = get_option('feedwordpress_unfamiliar_'.$what);
642
+ if (!is_numeric($ret) and !in_array($ret, $set[$what])) :
643
  $ret = 'create';
644
  endif;
645
  endif;
973
  // In case you want to know the external permalink...
974
  $this->post['meta']['syndication_permalink'] = apply_filters('syndicated_item_link', $this->item['link']);
975
 
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
  // Feed-by-feed options for author and category creation
980
  $this->post['named']['unfamiliar']['author'] = $this->feedmeta['unfamiliar author'];
981
  $this->post['named']['unfamiliar']['category'] = $this->feedmeta['unfamiliar category'];
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
  endif;
1025
  } // SyndicatedPost::SyndicatedPost()
1026
 
1043
  FROM $wpdb->posts WHERE guid='$guid'
1044
  ");
1045
 
 
 
1046
  if (!$result) :
1047
  $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;
1073
  endif;
1074
  endif;
1075
  return $this->_freshness;
1107
 
1108
  if (!$this->filtered() and $freshness > 0) :
1109
  # -- Look up, or create, numeric ID for categories
1110
+ list($pcats, $ptags) = $this->category_ids (
1111
  $this->post['named']['category'],
1112
+ FeedWordPress::on_unfamiliar('category', $this->post['named']['unfamiliar']['category']),
1113
+ /*tags_too=*/ true
1114
  );
1115
+
1116
+ $this->post['post_category'] = $pcats;
1117
+ $this->post['tags_input'] = array_merge($this->post['tags_input'], $ptags);
1118
+
1119
  if (is_null($this->post['post_category'])) :
1120
  // filter mode on, no matching categories; drop the post
1121
  $this->post = NULL;
1184
 
1185
  if ($this->use_api('wp_insert_post')) :
1186
  $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'));
1190
+
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
  // This should never happen.
1203
  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__);
1205
  endif;
1206
 
1207
  // Unfortunately, as of WordPress 2.3, wp_insert_post()
1246
 
1247
  // This should never happen.
1248
  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__);
1250
  endif;
1251
 
1252
  // WordPress 1.5.x - 2.0.x
1277
 
1278
  if ($this->use_api('wp_insert_post')) :
1279
  $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
  $this->_wp_id = wp_insert_post($dbpost);
1290
 
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
  // This should never happen.
1296
  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__);
1298
  endif;
1299
 
1300
  // Unfortunately, as of WordPress 2.3, wp_insert_post()
1329
  wp_set_post_cats('1', $this->wp_id(), $this->post['post_category']);
1330
  // This should never happen.
1331
  else :
1332
+ FeedWordPress::critical_bug('SyndicatedPost (_wp_id problem)', array("dbpost" => $dbpost, "this" => $this), __LINE__);
1333
  endif;
1334
 
1335
  // Since we are not going through official channels, we need to
1342
  endif;
1343
  } /* SyndicatedPost::update_existing() */
1344
 
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
  // SyndicatedPost::add_rss_meta: adds interesting meta-data to each entry
1401
  // using the space for custom keys. The set of keys and values to add is
1402
  // specified by the keys and values of $post['meta']. This is used to
1575
  } // function SyndicatedPost::author_id ()
1576
 
1577
  // look up (and create) category ids from a list of categories
1578
+ function category_ids ($cats, $unfamiliar_category = 'create', $tags_too = false) {
1579
  global $wpdb;
1580
 
1581
  // We need to normalize whitespace because (1) trailing
1586
  // distinction between 'Computers' and 'Computers '
1587
  $cats = array_map('trim', $cats);
1588
 
1589
+ $tags = array();
1590
+
1591
  $cat_ids = array ();
1592
  foreach ($cats as $cat_name) :
1593
  if (preg_match('/^{#([0-9]+)}$/', $cat_name, $backref)) :
1617
  foreach ($results AS $term) :
1618
  $cat_ids[] = (int) $term->term_id;
1619
  endforeach;
1620
+ elseif ('tag'==$unfamiliar_category) :
1621
+ $tags[] = $cat_name;
1622
  elseif ('create'===$unfamiliar_category) :
1623
  $term = wp_insert_term($cat_name, 'category');
1624
  $cat_ids[] = $term['term_id'];
1664
  else :
1665
  $cat_ids = array_unique($cat_ids);
1666
  endif;
1667
+
1668
+ if ($tags_too) : $ret = array($cat_ids, $tags);
1669
+ else : $ret = $cat_ids;
1670
+ endif;
1671
+
1672
+ return $ret;
1673
  } // function SyndicatedPost::category_ids ()
1674
 
1675
  function use_api ($tag) {
1723
 
1724
  # If everything failed, then default to the current time.
1725
  if (is_null($epoch)) :
1726
+ if (-1 == $default) :
1727
+ $epoch = time();
1728
+ else :
1729
+ $epoch = $default;
1730
+ endif;
1731
  endif;
1732
 
1733
  return $epoch;
1734
  }
1735
+ function updated ($fallback = true, $default = -1) {
1736
  $epoch = null;
1737
 
1738
  # As far as I know, only dcterms and Atom have reliable ways to
1747
  elseif (isset($this->item['updated'])): // Atom 1.0
1748
  $epoch = @parse_w3cdtf($this->item['updated']);
1749
  elseif ($fallback) : // Fall back to issued / dc:date
1750
+ $epoch = $this->published(/*fallback=*/ false, /*default=*/ $default);
1751
  endif;
1752
 
1753
  # If everything failed, then default to the current time.
1754
  if (is_null($epoch)) :
1755
+ if (-1 == $default) :
1756
+ $epoch = time();
1757
+ else :
1758
+ $epoch = $default;
1759
+ endif;
1760
  endif;
1761
 
1762
  return $epoch;
1763
  }
1764
 
1765
+ function update_hash () {
1766
+ return md5(serialize($this->item));
1767
+ }
1768
+
1769
  function guid () {
1770
  $guid = null;
1771
  if (isset($this->item['id'])): // Atom 0.3 / 1.0
2655
  endif;
2656
  return $ret;
2657
  }
2658
+
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: Charles Johnson
3
  Donate link: http://projects.radgeek.com/feedwordpress/
4
  Tags: syndication, aggregation, feed, atom, rss
5
  Requires at least: 1.5
6
- Tested up to: 2.5.1
7
- Stable tag: 0.993
8
 
9
  FeedWordPress syndicates content from feeds you choose into your WordPress weblog.
10
 
@@ -23,13 +23,14 @@ to use at [Feminist Blogs](http://feministblogs.org/).
23
 
24
  FeedWordPress is designed with flexibility, ease of use, and ease of
25
  configuration in mind. You'll need a working installation of WordPress or
26
- WordPress MU (versions [2.5][], [2.3][], [2.2][], [2.1][], [2.0][] or [1.5][]),
27
- and also FTP or SFTP access to your web host. The ability to create cron jobs on
28
- your web host is helpful but not absolutely necessary. You *don't* need to tweak
29
- any plain-text configuration files and you *don't* need shell access to your web
30
- host to make it work. (Although, I should point out, web hosts that *don't*
31
- offer shell access are *bad web hosts*.)
32
-
 
33
  [2.5]: http://codex.wordpress.org/Version_2.5
34
  [2.3]: http://codex.wordpress.org/Version_2.3
35
  [2.2]: http://codex.wordpress.org/Version_2.2
@@ -39,11 +40,11 @@ offer shell access are *bad web hosts*.)
39
 
40
  == Installation ==
41
 
42
- To use version 0.993 of FeedWordPress, you will need:
43
 
44
- * an installed and configured copy of WordPress version 2.3.x, 2.2.x,
45
- 2.1.x, 2.0.x, or 1.5.x. (FeedWordPress will also work with the
46
- equivalent versions of WordPress MU.)
47
 
48
  * FTP or SFTP access to your web host
49
 
@@ -79,7 +80,7 @@ To use version 0.993 of FeedWordPress, you will need:
79
 
80
  = Upgrades =
81
 
82
- To *upgrade* an existing installation of FeedWordPress to version 0.993:
83
 
84
  1. Download the FeedWordPress archive in zip or gzipped tar format and
85
  extract the files on your computer.
3
  Donate link: http://projects.radgeek.com/feedwordpress/
4
  Tags: syndication, aggregation, feed, atom, rss
5
  Requires at least: 1.5
6
+ Tested up to: 2.6.3
7
+ Stable tag: 2008.1030
8
 
9
  FeedWordPress syndicates content from feeds you choose into your WordPress weblog.
10
 
23
 
24
  FeedWordPress is designed with flexibility, ease of use, and ease of
25
  configuration in mind. You'll need a working installation of WordPress or
26
+ WordPress MU (versions [2.6][], [2.5][], [2.3][], [2.2][], [2.1][], [2.0][] or
27
+ [1.5][]), and also FTP or SFTP access to your web host. The ability to create
28
+ cron jobs on your web host is helpful but not absolutely necessary. You *don't*
29
+ need to tweak any plain-text configuration files and you *don't* need shell
30
+ access to your web host to make it work. (Although, I should point out, web
31
+ hosts that *don't* offer shell access are *bad web hosts*.)
32
+
33
+ [2.6]: http://codex.wordpress.org/Version_2.6
34
  [2.5]: http://codex.wordpress.org/Version_2.5
35
  [2.3]: http://codex.wordpress.org/Version_2.3
36
  [2.2]: http://codex.wordpress.org/Version_2.2
40
 
41
  == Installation ==
42
 
43
+ To use version 2008.1030 of FeedWordPress, you will need:
44
 
45
+ * an installed and configured copy of WordPress version 2.6.x, 2.5.x,
46
+ 2.3.x, 2.2.x, 2.1.x, 2.0.x, or 1.5.x. (FeedWordPress will also work with
47
+ the equivalent versions of WordPress MU.)
48
 
49
  * FTP or SFTP access to your web host
50
 
80
 
81
  = Upgrades =
82
 
83
+ To *upgrade* an existing installation of FeedWordPress to version 2008.1030:
84
 
85
  1. Download the FeedWordPress archive in zip or gzipped tar format and
86
  extract the files on your computer.
syndication-options.php CHANGED
@@ -1,4 +1,6 @@
1
  <?php
 
 
2
  function fwp_syndication_options_page () {
3
  global $wpdb, $wp_db_version;
4
 
@@ -15,6 +17,7 @@ function fwp_syndication_options_page () {
15
  else:
16
  update_option('feedwordpress_cat_id', $_REQUEST['syndication_category']);
17
  update_option('feedwordpress_munge_permalink', $_REQUEST['munge_permalink']);
 
18
  update_option('feedwordpress_update_logging', $_REQUEST['update_logging']);
19
 
20
  if ('newuser'==$_REQUEST['unfamiliar_author']) :
@@ -116,6 +119,7 @@ function fwp_syndication_options_page () {
116
 
117
  $cat_id = FeedWordPress::link_category_id();
118
  $munge_permalink = get_option('feedwordpress_munge_permalink');
 
119
  $update_logging = get_option('feedwordpress_update_logging');
120
 
121
  $automatic_updates = get_option('feedwordpress_automatic_updates');
@@ -139,7 +143,7 @@ function fwp_syndication_options_page () {
139
  if (is_string($ua) and array_key_exists($ua, $unfamiliar_author)) :
140
  $unfamiliar_author[$ua] = ' checked="checked"';
141
  endif;
142
- $unfamiliar_category = array ('create'=>'','default'=>'','filter'=>'');
143
  $uc = FeedWordPress::on_unfamiliar('category');
144
  if (is_string($uc) and array_key_exists($uc, $unfamiliar_category)) :
145
  $unfamiliar_category[$uc] = ' checked="checked"';
@@ -250,6 +254,17 @@ function fwp_syndication_options_page () {
250
  <option value="yes"<?php echo ($munge_permalink=='yes')?' selected="selected"':''; ?>>original website</option>
251
  <option value="no"<?php echo ($munge_permalink=='no')?' selected="selected"':''; ?>>this website</option>
252
  </select></td></tr>
 
 
 
 
 
 
 
 
 
 
 
253
  </table>
254
  <?php
255
  fwp_option_box_closer();
@@ -260,10 +275,12 @@ function fwp_syndication_options_page () {
260
  ?>
261
  <table class="editform" width="75%" cellspacing="2" cellpadding="5">
262
  <tr style="vertical-align: top"><th width="27%" scope="row" style="vertical-align:top">Unfamiliar categories:</th>
263
- <td><ul style="margin: 0; padding:0; list-style:none">
264
- <li><label><input type="radio" name="unfamiliar_category" value="create"<?php echo $unfamiliar_category['create']; ?>/> create any categories the post is in</label></li>
265
- <li><label><input type="radio" name="unfamiliar_category" value="default"<?php echo $unfamiliar_category['default']; ?>/> don't create new categories</li>
266
- <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>
 
 
267
  </ul></td></tr>
268
  </table>
269
  <?php
@@ -349,4 +366,4 @@ endif;
349
  }
350
 
351
  fwp_syndication_options_page();
352
- ?>
1
  <?php
2
+ require_once(dirname(__FILE__) . '/admin-ui.php');
3
+
4
  function fwp_syndication_options_page () {
5
  global $wpdb, $wp_db_version;
6
 
17
  else:
18
  update_option('feedwordpress_cat_id', $_REQUEST['syndication_category']);
19
  update_option('feedwordpress_munge_permalink', $_REQUEST['munge_permalink']);
20
+ update_option('feedwordpress_formatting_filters', $_REQUEST['formatting_filters']);
21
  update_option('feedwordpress_update_logging', $_REQUEST['update_logging']);
22
 
23
  if ('newuser'==$_REQUEST['unfamiliar_author']) :
119
 
120
  $cat_id = FeedWordPress::link_category_id();
121
  $munge_permalink = get_option('feedwordpress_munge_permalink');
122
+ $formatting_filters = get_option('feedwordpress_formatting_filters');
123
  $update_logging = get_option('feedwordpress_update_logging');
124
 
125
  $automatic_updates = get_option('feedwordpress_automatic_updates');
143
  if (is_string($ua) and array_key_exists($ua, $unfamiliar_author)) :
144
  $unfamiliar_author[$ua] = ' checked="checked"';
145
  endif;
146
+ $unfamiliar_category = array ('create'=>'','default'=>'','filter'=>'', 'tag'=>'');
147
  $uc = FeedWordPress::on_unfamiliar('category');
148
  if (is_string($uc) and array_key_exists($uc, $unfamiliar_category)) :
149
  $unfamiliar_category[$uc] = ' checked="checked"';
254
  <option value="yes"<?php echo ($munge_permalink=='yes')?' selected="selected"':''; ?>>original website</option>
255
  <option value="no"<?php echo ($munge_permalink=='no')?' selected="selected"':''; ?>>this website</option>
256
  </select></td></tr>
257
+ <tr style="vertical-align:top"><th width="44%" scope="row">Formatting filters:</th>
258
+ <td width="56%">
259
+ <select name="formatting_filters" size="1">
260
+ <option value="no"<?php echo ($formatting_filters!='yes')?' selected="selected"':''; ?>>Protect syndicated posts from formatting filters</option>
261
+ <option value="yes"<?php echo ($formatting_filters=='yes')?' selected="selected"':''; ?>>Expose syndicated posts to formatting filters</option>
262
+ </select>
263
+ <p>If you have trouble getting plugins to work that are supposed to insert
264
+ elements after posts (like relevant links or a social networking
265
+ <q>Share This</q> button), try changing this option to see if it fixes your
266
+ problem.</p>
267
+ </td></tr>
268
  </table>
269
  <?php
270
  fwp_option_box_closer();
275
  ?>
276
  <table class="editform" width="75%" cellspacing="2" cellpadding="5">
277
  <tr style="vertical-align: top"><th width="27%" scope="row" style="vertical-align:top">Unfamiliar categories:</th>
278
+ <td><p>When one of the categories on a syndicated post is a category that FeedWordPress has not encountered before ...</p>
279
+ <ul style="margin: 0; padding:0; list-style:none">
280
+ <li><label><input type="radio" name="unfamiliar_category" value="create"<?php echo $unfamiliar_category['create']; ?>/> create a new category</label></li>
281
+ <li><label><input type="radio" name="unfamiliar_category" value="tag"<?php echo $unfamiliar_category['tag']; ?>/> create a new tag</label></li>
282
+ <li><label><input type="radio" name="unfamiliar_category" value="default"<?php echo $unfamiliar_category['default']; ?>/> don't create new categories or tags</li>
283
+ <li><label><input type="radio" name="unfamiliar_category" value="filter"<?php echo $unfamiliar_category['filter']; ?>/> don't create new categories or tags and don't syndicate posts unless they match at least one familiar category</label></li>
284
  </ul></td></tr>
285
  </table>
286
  <?php
366
  }
367
 
368
  fwp_syndication_options_page();
369
+
syndication.php ADDED
@@ -0,0 +1,1262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ require_once(dirname(__FILE__) . '/admin-ui.php');
3
+
4
+ ################################################################################
5
+ ## ADMIN MENU ADD-ONS: implement Dashboard management pages ####################
6
+ ################################################################################
7
+
8
+ if (fwp_test_wp_version(0, FWP_SCHEMA_25)) :
9
+ define('FWP_UPDATE_CHECKED', 'Update Checked Links');
10
+ define('FWP_UNSUB_CHECKED', 'Unsubscribe from Checked Links');
11
+ define('FWP_SYNDICATE_NEW', 'Syndicate »');
12
+ else :
13
+ define('FWP_UPDATE_CHECKED', 'Update Checked');
14
+ define('FWP_UNSUB_CHECKED', 'Unsubscribe');
15
+ define('FWP_SYNDICATE_NEW', 'Syndicate »');
16
+ endif;
17
+
18
+ function fwp_dashboard_update_if_requested () {
19
+ global $wpdb;
20
+
21
+ if (isset($_POST['update']) or isset($_POST['action']) or isset($_POST['update_uri'])) :
22
+ $fwp_update_invoke = 'post';
23
+ else :
24
+ $fwp_update_invoke = 'get';
25
+ endif;
26
+
27
+ $update_set = array();
28
+ if (isset($_POST['link_ids']) and is_array($_POST['link_ids']) and ($_POST['action']==FWP_UPDATE_CHECKED)) :
29
+ $targets = $wpdb->get_results("
30
+ SELECT * FROM $wpdb->links
31
+ WHERE link_id IN (".implode(",",$_POST['link_ids']).")
32
+ ");
33
+ if (is_array($targets)) :
34
+ foreach ($targets as $target) :
35
+ $update_set[] = $target->link_rss;
36
+ endforeach;
37
+ else : // This should never happen
38
+ FeedWordPress::critical_bug('fwp_syndication_manage_page::targets', $targets, __LINE__);
39
+ endif;
40
+ elseif (isset($_POST['update_uri'])) :
41
+ $update_set[] = $_POST['update_uri'];
42
+ endif;
43
+
44
+
45
+ if ($fwp_update_invoke != 'get' and count($update_set) > 0) : // Only do things with side-effects for HTTP POST or command line
46
+ $feedwordpress =& new FeedWordPress;
47
+ add_action('feedwordpress_check_feed', 'update_feeds_mention');
48
+
49
+ if (fwp_test_wp_version(FWP_SCHEMA_25)) :
50
+ echo "<div class=\"youare\">\n";
51
+ else :
52
+ echo "<div class=\"updated\">\n";
53
+ endif;
54
+ echo "<ul>\n";
55
+ $tdelta = NULL;
56
+ foreach ($update_set as $uri) :
57
+ if ($uri == '*') : $uri = NULL; endif;
58
+ $delta = $feedwordpress->update($uri);
59
+ if (!is_null($delta)) :
60
+ if (is_null($tdelta)) :
61
+ $tdelta = $delta;
62
+ else :
63
+ $tdelta['new'] += $delta['new'];
64
+ $tdelta['updated'] += $delta['updated'];
65
+ endif;
66
+ else :
67
+ echo "<li><p><strong>Error:</strong> There was a problem updating <a href=\"$uri\">$uri</a></p></li>\n";
68
+ endif;
69
+ endforeach;
70
+ echo "</ul>\n";
71
+
72
+ if (!is_null($tdelta)) :
73
+ $mesg = array();
74
+ if (isset($delta['new'])) : $mesg[] = ' '.$tdelta['new'].' new posts were syndicated'; endif;
75
+ if (isset($delta['updated'])) : $mesg[] = ' '.$tdelta['updated'].' existing posts were updated'; endif;
76
+ echo "<p>Update complete.".implode(' and', $mesg)."</p>";
77
+ echo "\n"; flush();
78
+ endif;
79
+ echo "</div> <!-- class=\"updated\" -->\n";
80
+ elseif (fwp_test_wp_version(FWP_SCHEMA_25)) :
81
+ ?>
82
+ <p class="youare">Check currently scheduled feeds for new and updated posts.</p>
83
+ <?php
84
+ endif;
85
+ }
86
+
87
+ function fwp_syndication_manage_page () {
88
+ global $wpdb;
89
+
90
+ if (FeedWordPress::needs_upgrade()) :
91
+ fwp_upgrade_page();
92
+ return;
93
+ endif;
94
+
95
+ ?>
96
+ <?php $cont = true;
97
+ if (isset($_REQUEST['action'])):
98
+ if ($_REQUEST['action'] == 'feedfinder' or $_REQUEST['action'] == FWP_SYNDICATE_NEW) : $cont = fwp_feedfinder_page();
99
+ elseif ($_REQUEST['action'] == 'switchfeed') : $cont = fwp_switchfeed_page();
100
+ elseif ($_REQUEST['action'] == 'linkedit') : $cont = fwp_linkedit_page();
101
+ elseif ($_REQUEST['action'] == FWP_UNSUB_CHECKED or $_REQUEST['action'] == 'Unsubscribe') : $cont = fwp_multidelete_page();
102
+ endif;
103
+ endif;
104
+
105
+ if ($cont):
106
+ ?>
107
+ <?php
108
+ $links = FeedWordPress::syndicated_links();
109
+
110
+ if (fwp_test_wp_version(0, FWP_SCHEMA_25)) :
111
+ fwp_dashboard_update_if_requested();
112
+ endif;
113
+
114
+ if ($links): // only display Update panel if there are some links to update....
115
+ ?>
116
+ <form action="" method="POST">
117
+ <?php if (fwp_test_wp_version(FWP_SCHEMA_25)) : ?>
118
+ <div class="wrap">
119
+ <div id="rightnow">
120
+ <h3 class="reallynow"><span>Update feeds now</span>
121
+ <input type="hidden" name="update_uri" value="*" /><input style="float: right; border: none;" class="rbutton" type="submit" name="update" value="Update" />
122
+ <br class="clear"/></h3>
123
+ <?php else : ?>
124
+ <div class="wrap">
125
+ <h2>Update feeds now</h2>
126
+ <?php endif; ?>
127
+
128
+ <?php
129
+ if (fwp_test_wp_version(FWP_SCHEMA_25)) :
130
+ fwp_dashboard_update_if_requested();
131
+ else :
132
+ ?>
133
+ <p>Check currently scheduled feeds for new and updated posts.</p>
134
+ <?php
135
+ endif;
136
+ ?>
137
+
138
+ <?php if (!get_option('feedwordpress_automatic_updates')) : ?>
139
+ <p class="youhave"><strong>Note:</strong> Automatic updates are currently turned
140
+ <strong>off</strong>. New posts from your feeds will not be syndicated
141
+ until you manually check for them here. You can turn on automatic
142
+ updates under <a href="admin.php?page=<?php print $GLOBALS['fwp_path']; ?>/syndication-options.php">Syndication
143
+ Options</a>.</p>
144
+ <?php endif; ?>
145
+
146
+ <?php if (fwp_test_wp_version(0, FWP_SCHEMA_25)) : ?>
147
+ <div class="submit"><input type="hidden" name="update_uri" value="*" /><input type="submit" name="update" value="Update" /></div>
148
+ <?php endif; ?>
149
+
150
+ <?php if (fwp_test_wp_version(FWP_SCHEMA_25)) : ?>
151
+ </div> <!-- id="rightnow" -->
152
+ <?php endif; ?>
153
+ </div> <!-- class="wrap" -->
154
+ </form>
155
+ <?php
156
+ endif;
157
+ ?>
158
+
159
+ <div class="wrap">
160
+ <form id="syndicated-links" action="admin.php?page=<?php print $GLOBALS['fwp_path']; ?>/<?php echo basename(__FILE__); ?>" method="post">
161
+ <h2>Syndicated Sites</h2>
162
+ <?php $alt_row = true;
163
+ if ($links): ?>
164
+
165
+ <?php if (fwp_test_wp_version(FWP_SCHEMA_25)) : ?>
166
+ <div class="tablenav">
167
+ <div class="alignright">
168
+ <label for="add-uri">Add new source:</label>
169
+ <input type="text" name="lookup" id="add-uri" value="Website or feed URI" />
170
+ <script type="text/javascript">
171
+ jQuery(document).ready( function () {
172
+ var addUri = jQuery("#add-uri");
173
+ var box = addUri.get(0);
174
+ if (box.value==box.defaultValue) { addUri.addClass('form-input-tip'); }
175
+ addUri.focus(function() {
176
+ if ( this.value == this.defaultValue )
177
+ jQuery(this).val( '' ).removeClass( 'form-input-tip' );
178
+ });
179
+ addUri.blur(function() {
180
+ if ( this.value == '' )
181
+ jQuery(this).val( this.defaultValue ).addClass( 'form-input-tip' );
182
+ });
183
+
184
+ } );
185
+ </script>
186
+
187
+ <input type="hidden" name="action" value="feedfinder" />
188
+ <input type="submit" class="button-secondary" name="action" value="<?php print FWP_SYNDICATE_NEW; ?>" /></div>
189
+
190
+ <div class="alignleft">
191
+ <input class="button-secondary" type="submit" name="action" value="<?php print FWP_UPDATE_CHECKED; ?>" />
192
+ <input class="button-secondary delete" type="submit" class="delete" name="action" value="<?php print FWP_UNSUB_CHECKED; ?>" />
193
+ </div>
194
+
195
+ <br class="clear" />
196
+ </div>
197
+ <br class="clear" />
198
+
199
+ <table class="widefat">
200
+ <?php else : ?>
201
+ <table width="100%" cellpadding="3" cellspacing="3">
202
+ <?php endif; ?>
203
+ <thead>
204
+ <tr>
205
+ <?php if (fwp_test_wp_version(FWP_SCHEMA_25)) : $span = 3; ?>
206
+ <th class="check-column" scope="col"><input type="checkbox" <?php if (fwp_test_wp_version(FWP_SCHEMA_25, FWP_SCHEMA_26)) : ?>onclick="checkAll(document.getElementById('syndicated-links'));"<?php endif; ?> /></th>
207
+ <?php else : $span = 4; ?>
208
+ <?php endif; ?>
209
+ <th width="20%" scope="col"><?php _e('Name'); ?></th>
210
+ <th width="40%" scope="col"><?php _e('Feed'); ?></th>
211
+ <th class="action-links" scope="col" colspan="<?php print $span; ?>"><?php _e('Action'); ?></th>
212
+ </tr>
213
+ </thead>
214
+
215
+ <tbody>
216
+ <?php foreach ($links as $link):
217
+ $alt_row = !$alt_row; ?>
218
+ <tr<?php echo ($alt_row?' class="alternate"':''); ?>>
219
+ <?php if (fwp_test_wp_version(FWP_SCHEMA_25)) : ?>
220
+ <th class="check-column" scope="row"><input type="checkbox" name="link_ids[]" value="<?php echo $link->link_id; ?>" /></th>
221
+ <?php endif; ?>
222
+
223
+ <td><a href="<?php echo wp_specialchars($link->link_url, 'both'); ?>"><?php echo wp_specialchars($link->link_name, 'both'); ?></a></td>
224
+ <?php
225
+ if (strlen($link->link_rss) > 0):
226
+ $caption='Switch Feed';
227
+ $uri_bits = parse_url($link->link_rss);
228
+ $uri_bits['host'] = preg_replace('/^www\./i', '', $uri_bits['host']);
229
+ $display_uri =
230
+ (isset($uri_bits['user'])?$uri_bits['user'].'@':'')
231
+ .(isset($uri_bits['host'])?$uri_bits['host']:'')
232
+ .(isset($uri_bits['port'])?':'.$uri_bits['port']:'')
233
+ .(isset($uri_bits['path'])?$uri_bits['path']:'')
234
+ .(isset($uri_bits['query'])?'?'.$uri_bits['query']:'');
235
+ if (strlen($display_uri) > 32) : $display_uri = substr($display_uri, 0, 32).'&#8230;'; endif;
236
+ ?>
237
+ <td>
238
+ <strong><a href="<?php echo wp_specialchars($link->link_rss, 'both'); ?>"><?php echo wp_specialchars($display_uri, 'both'); ?></a></strong></td>
239
+ <?php
240
+ else:
241
+ $caption='Find Feed';
242
+ ?>
243
+ <td style="background-color:#FFFFD0"><p><strong>no
244
+ feed assigned</strong></p></td>
245
+ <?php
246
+ endif;
247
+ ?>
248
+ <td><a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>&amp;link_id=<?php echo $link->link_id; ?>&amp;action=linkedit" class="edit"><?php _e('Edit')?></a></td>
249
+ <td><a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>&amp;link_id=<?php echo $link->link_id; ?>&amp;action=feedfinder" class="edit"><?php echo $caption; ?></a></td>
250
+ <td><a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>&amp;link_id=<?php echo $link->link_id; ?>&amp;action=Unsubscribe" class="delete"><?php _e('Unsubscribe'); ?></a></td>
251
+ <?php if (fwp_test_wp_version(0, FWP_SCHEMA_25)) : ?>
252
+ <td><input type="checkbox" name="link_ids[]" value="<?php echo $link->link_id; ?>" /></td>
253
+ <?php
254
+ endif;
255
+ echo "\n\t</tr>";
256
+ endforeach;
257
+ ?>
258
+ </tbody>
259
+ </table>
260
+
261
+ <?php if (fwp_test_wp_version(0, FWP_SCHEMA_25)) : ?>
262
+ <br/><hr/>
263
+ <div class="submit"><input type="submit" class="delete" name="action" value="<?php print FWP_UNSUB_CHECKED; ?>" />
264
+ <input type="submit" name="action" value="<?php print FWP_UPDATE_CHECKED; ?>" /></div>
265
+ <?php endif; ?>
266
+
267
+
268
+ <?php
269
+ else:
270
+ ?>
271
+
272
+ <p>There are no websites currently listed for syndication.</p>
273
+
274
+ <?php endif; ?>
275
+
276
+ </form>
277
+
278
+ </div> <!-- class="wrap" -->
279
+
280
+ <?php if (fwp_test_wp_version(0, FWP_SCHEMA_25)) : ?>
281
+ <div class="wrap">
282
+ <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
283
+ <h2>Add a new syndicated site:</h2>
284
+ <div>
285
+ <label for="add-uri">Website or newsfeed:</label>
286
+ <input type="text" name="lookup" id="add-uri" value="URI" size="64" />
287
+ <input type="hidden" name="action" value="feedfinder" />
288
+ </div>
289
+ <div class="submit"><input type="submit" value="Syndicate &raquo;" /></div>
290
+ </form>
291
+ </div> <!-- class="wrap" -->
292
+ <?php endif; ?>
293
+
294
+ <div style="display: none">
295
+ <div id="tags-input"></div> <!-- avoid JS error from WP 2.5 bug -->
296
+ </div>
297
+ <?php
298
+ endif;
299
+ }
300
+
301
+ function fwp_feedfinder_page () {
302
+ global $wpdb;
303
+
304
+ $lookup = (isset($_REQUEST['lookup'])?$_REQUEST['lookup']:NULL);
305
+
306
+ if (isset($_REQUEST['link_id']) and ($_REQUEST['link_id']!=0)):
307
+ $link_id = $_REQUEST['link_id'];
308
+ if (!is_numeric($link_id)) : FeedWordPress::critical_bug('fwp_feedfinder_page::link_id', $link_id, __LINE__); endif;
309
+
310
+ $link = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id='".$wpdb->escape($link_id)."'");
311
+ if (is_object($link)):
312
+ if (is_null($lookup)) $lookup = $link->link_url;
313
+ $name = wp_specialchars($link->link_name, 'both');
314
+ else:
315
+ die (__("Cheatin' uh ?"));
316
+ endif;
317
+ else:
318
+ $name = "New Syndicated Feed";
319
+ $link_id = 0;
320
+ endif;
321
+ ?>
322
+ <div class="wrap">
323
+ <h2>Feed Finder: <?php echo $name; ?></h2>
324
+ <?php
325
+ $f =& new FeedFinder($lookup);
326
+ $feeds = $f->find();
327
+ if (count($feeds) > 0):
328
+ foreach ($feeds as $key => $f):
329
+ $rss = fetch_rss($f);
330
+ if ($rss):
331
+ $feed_title = isset($rss->channel['title'])?$rss->channel['title']:$rss->channel['link'];
332
+ $feed_link = isset($rss->channel['link'])?$rss->channel['link']:'';
333
+ ?>
334
+ <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
335
+ <fieldset style="clear: both">
336
+ <legend><?php echo $rss->feed_type; ?> <?php echo $rss->feed_version; ?> feed</legend>
337
+
338
+ <?php if ($link_id===0): ?>
339
+ <input type="hidden" name="feed_title" value="<?php echo wp_specialchars($feed_title, 'both'); ?>" />
340
+ <input type="hidden" name="feed_link" value="<?php echo wp_specialchars($feed_link, 'both'); ?>" />
341
+ <?php endif; ?>
342
+
343
+ <input type="hidden" name="link_id" value="<?php echo $link_id; ?>" />
344
+ <input type="hidden" name="feed" value="<?php echo wp_specialchars($f, 'both'); ?>" />
345
+ <input type="hidden" name="action" value="switchfeed" />
346
+
347
+ <div>
348
+ <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">
349
+ <?php if (count($rss->items) > 0): ?>
350
+ <?php $item = $rss->items[0]; ?>
351
+ <h3>Sample Item</h3>
352
+ <ul>
353
+ <li><strong>Title:</strong> <a href="<?php echo $item['link']; ?>"><?php echo $item['title']; ?></a></li>
354
+ <li><strong>Date:</strong> <?php echo isset($item['date_timestamp']) ? date('d-M-y g:i:s a', $item['date_timestamp']) : 'unknown'; ?></li>
355
+ </ul>
356
+ <div class="entry">
357
+ <?php echo (isset($item['content']['encoded'])?$item['content']['encoded']:$item['description']); ?>
358
+ </div>
359
+ <?php else: ?>
360
+ <h3>No Items</h3>
361
+ <p>FeedWordPress found no posts on this feed.</p>
362
+ <?php endif; ?>
363
+ </div>
364
+
365
+ <div>
366
+ <h3>Feed Information</h3>
367
+ <ul>
368
+ <li><strong>Website:</strong> <a href="<?php echo $feed_link; ?>"><?php echo is_null($feed_title)?'<em>Unknown</em>':$feed_title; ?></a></li>
369
+ <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); ?>">validate</a>)</li>
370
+ <li><strong>Encoding:</strong> <?php echo isset($rss->encoding)?wp_specialchars($rss->encoding, 'both'):"<em>Unknown</em>"; ?></li>
371
+ <li><strong>Description:</strong> <?php echo isset($rss->channel['description'])?wp_specialchars($rss->channel['description'], 'both'):"<em>Unknown</em>"; ?></li>
372
+ </ul>
373
+ <div class="submit"><input type="submit" name="Use" value="&laquo; Use this feed" /></div>
374
+ <div class="submit"><input type="submit" name="Cancel" value="&laquo; Cancel" /></div>
375
+ </div>
376
+ </div>
377
+ </fieldset>
378
+ </form>
379
+ <?php endif;
380
+ endforeach;
381
+ else:
382
+ echo "<p><strong>no feed found</strong></p>";
383
+ endif;
384
+ ?>
385
+ </div>
386
+
387
+ <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
388
+ <div class="wrap">
389
+ <h2>Use another feed</h2>
390
+ <div><label>Feed:</label>
391
+ <input type="text" name="lookup" value="URI" />
392
+ <input type="hidden" name="link_id" value="<?php echo $link_id; ?>" />
393
+ <input type="hidden" name="action" value="feedfinder" /></div>
394
+ <div class="submit"><input type="submit" value="Use this feed &raquo;" /></div>
395
+ </div>
396
+ </form>
397
+ <?php
398
+ return false; // Don't continue
399
+ }
400
+
401
+ function fwp_switchfeed_page () {
402
+ global $wpdb, $wp_db_version;
403
+
404
+ check_admin_referer();
405
+ if (!isset($_REQUEST['Cancel'])):
406
+ if (!current_user_can('manage_links')):
407
+ die (__("Cheatin' uh ?"));
408
+ elseif (isset($_REQUEST['link_id']) and ($_REQUEST['link_id']==0)):
409
+ $link_id = FeedWordPress::syndicate_link($_REQUEST['feed_title'], $_REQUEST['feed_link'], $_REQUEST['feed']);
410
+ if ($link_id): ?>
411
+ <div class="updated"><p><a href="<?php echo $_REQUEST['feed_link']; ?>"><?php echo wp_specialchars($_REQUEST['feed_title'], 'both'); ?></a>
412
+ 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>
413
+ <?php else: ?>
414
+ <div class="updated"><p>There was a problem adding the newsfeed. [SQL: <?php echo wp_specialchars(mysql_error(), 'both'); ?>]</p></div>
415
+ <?php endif;
416
+ elseif (isset($_REQUEST['link_id'])):
417
+ // Update link_rss
418
+ $result = $wpdb->query("
419
+ UPDATE $wpdb->links
420
+ SET
421
+ link_rss = '".$wpdb->escape($_REQUEST['feed'])."'
422
+ WHERE link_id = '".$wpdb->escape($_REQUEST['link_id'])."'
423
+ ");
424
+
425
+ if ($result):
426
+ $result = $wpdb->get_row("
427
+ SELECT link_name, link_url FROM $wpdb->links
428
+ WHERE link_id = '".$wpdb->escape($_REQUEST['link_id'])."'
429
+ ");
430
+ ?>
431
+ <div class="updated"><p>Feed for <a href="<?php echo $result->link_url; ?>"><?php echo wp_specialchars($result->link_name, 'both'); ?></a>
432
+ updated to &lt;<a href="<?php echo $_REQUEST['feed']; ?>"><?php echo wp_specialchars($_REQUEST['feed'], 'both'); ?></a>&gt;.</p></div>
433
+ <?php else: ?>
434
+ <div class="updated"><p>Nothing was changed.</p></div>
435
+ <?php endif;
436
+ endif;
437
+ endif;
438
+ return true; // Continue
439
+ }
440
+
441
+ function fwp_linkedit_page () {
442
+ global $wpdb, $wp_db_version;
443
+
444
+ check_admin_referer(); // Make sure we arrived here from the Dashboard
445
+
446
+ $special_settings = array ( /* Regular expression syntax is OK here */
447
+ 'cats',
448
+ 'cat_split',
449
+ 'hardcode name',
450
+ 'hardcode url',
451
+ 'hardcode description',
452
+ 'hardcode categories', /* Deprecated */
453
+ 'post status',
454
+ 'comment status',
455
+ 'ping status',
456
+ 'unfamiliar author',
457
+ 'unfamliar categories', /* Deprecated */
458
+ 'unfamiliar category',
459
+ 'map authors',
460
+ 'tags',
461
+ 'update/.*',
462
+ 'feed/.*',
463
+ 'link/.*',
464
+ );
465
+
466
+ if (!current_user_can('manage_links')) :
467
+ die (__("Cheatin' uh ?"));
468
+ elseif (isset($_REQUEST['feedfinder'])) :
469
+ return fwp_feedfinder_page(); // re-route to Feed Finder page
470
+ else :
471
+ $link_id = (int) $_REQUEST['link_id'];
472
+ $link =& new SyndicatedLink($link_id);
473
+
474
+ if ($link->found()) :
475
+ if (isset($GLOBALS['fwp_post']['save'])) :
476
+ $alter = array ();
477
+
478
+ $meta = $link->settings;
479
+ //if (isset($meta['cats'])):
480
+ // $meta['cats'] = preg_split(FEEDWORDPRESS_CAT_SEPARATOR_PATTERN, $meta['cats']);
481
+ //endif;
482
+
483
+ // custom feed settings first
484
+ foreach ($GLOBALS['fwp_post']['notes'] as $mn) :
485
+ $mn['key0'] = trim($mn['key0']);
486
+ $mn['key1'] = trim($mn['key1']);
487
+ if (preg_match("\007^(("
488
+ .implode(')|(',$special_settings)
489
+ ."))$\007i",
490
+ $mn['key1'])) :
491
+ $mn['key1'] = 'user/'.$mn['key1'];
492
+ endif;
493
+
494
+ if (strlen($mn['key0']) > 0) :
495
+ unset($meta[$mn['key0']]); // out with the old
496
+ endif;
497
+
498
+ if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
499
+ $meta[$mn['key1']] = $mn['value']; // in with the new
500
+ endif;
501
+ endforeach;
502
+
503
+ // now stuff through the web form
504
+ // hardcoded feed info
505
+ if (isset($GLOBALS['fwp_post']['hardcode_name'])) :
506
+ $meta['hardcode name'] = $GLOBALS['fwp_post']['hardcode_name'];
507
+ if (FeedWordPress::affirmative($meta, 'hardcode name')) :
508
+ $alter[] = "link_name = '".$wpdb->escape($GLOBALS['fwp_post']['name'])."'";
509
+ endif;
510
+ endif;
511
+ if (isset($GLOBALS['fwp_post']['hardcode_description'])) :
512
+ $meta['hardcode description'] = $GLOBALS['fwp_post']['hardcode_description'];
513
+ if (FeedWordPress::affirmative($meta, 'hardcode description')) :
514
+ $alter[] = "link_description = '".$wpdb->escape($GLOBALS['fwp_post']['description'])."'";
515
+ endif;
516
+ endif;
517
+ if (isset($GLOBALS['fwp_post']['hardcode_url'])) :
518
+ $meta['hardcode url'] = $GLOBALS['fwp_post']['hardcode_url'];
519
+ if (FeedWordPress::affirmative($meta, 'hardcode url')) :
520
+ $alter[] = "link_url = '".$wpdb->escape($GLOBALS['fwp_post']['linkurl'])."'";
521
+ endif;
522
+ endif;
523
+
524
+ // Update scheduling
525
+ if (isset($GLOBALS['fwp_post']['update_schedule'])) :
526
+ $meta['update/hold'] = $GLOBALS['fwp_post']['update_schedule'];
527
+ endif;
528
+
529
+ // Categories
530
+ if (isset($GLOBALS['fwp_post']['post_category'])) :
531
+ $meta['cats'] = array();
532
+ foreach ($GLOBALS['fwp_post']['post_category'] as $cat_id) :
533
+ $meta['cats'][] = '{#'.$cat_id.'}';
534
+ endforeach;
535
+ else :
536
+ unset($meta['cats']);
537
+ endif;
538
+
539
+ // Tags
540
+ if (isset($GLOBALS['fwp_post']['tags_input'])) :
541
+ $meta['tags'] = array();
542
+ foreach (explode(',', $GLOBALS['fwp_post']['tags_input']) as $tag) :
543
+ $meta['tags'][] = trim($tag);
544
+ endforeach;
545
+ endif;
546
+
547
+ // Post status, comment status, ping status
548
+ foreach (array('post', 'comment', 'ping') as $what) :
549
+ $sfield = "feed_{$what}_status";
550
+ if (isset($GLOBALS['fwp_post'][$sfield])) :
551
+ if ($GLOBALS['fwp_post'][$sfield]=='site-default') :
552
+ unset($meta["{$what} status"]);
553
+ else :
554
+ $meta["{$what} status"] = $GLOBALS['fwp_post'][$sfield];
555
+ endif;
556
+ endif;
557
+ endforeach;
558
+
559
+ // Unfamiliar author, unfamiliar categories
560
+ foreach (array("author", "category") as $what) :
561
+ $sfield = "unfamiliar_{$what}";
562
+ if (isset($GLOBALS['fwp_post'][$sfield])) :
563
+ if ('site-default'==$GLOBALS['fwp_post'][$sfield]) :
564
+ unset($meta["unfamiliar {$what}"]);
565
+ elseif ('newuser'==$GLOBALS['fwp_post'][$sfield]) :
566
+ $newuser_name = trim($GLOBALS['fwp_post']["{$sfield}_newuser"]);
567
+ if (strlen($newuser_name) > 0) :
568
+ $userdata = array();
569
+ $userdata['ID'] = NULL;
570
+
571
+ $userdata['user_login'] = sanitize_user($newuser_name);
572
+ $userdata['user_login'] = apply_filters('pre_user_login', $userdata['user_login']);
573
+
574
+ $userdata['user_nicename'] = sanitize_title($newuser_name);
575
+ $userdata['user_nicename'] = apply_filters('pre_user_nicename', $userdata['user_nicename']);
576
+
577
+ $userdata['display_name'] = $wpdb->escape($newuser_name);
578
+
579
+ $newuser_id = wp_insert_user($userdata);
580
+ if (is_numeric($newuser_id)) :
581
+ $meta["unfamiliar {$what}"] = $newuser_id;
582
+ else :
583
+ // TODO: Add some error detection and reporting
584
+ endif;
585
+ else :
586
+ // TODO: Add some error reporting
587
+ endif;
588
+ else :
589
+ $meta["unfamiliar {$what}"] = $GLOBALS['fwp_post'][$sfield];
590
+ endif;
591
+ endif;
592
+ endforeach;
593
+
594
+ // Handle author mapping rules
595
+ if (isset($GLOBALS['fwp_post']['author_rules_name']) and isset($GLOBALS['fwp_post']['author_rules_action'])) :
596
+ unset($meta['map authors']);
597
+ foreach ($GLOBALS['fwp_post']['author_rules_name'] as $key => $name) :
598
+ // Normalize for case and whitespace
599
+ $name = strtolower(trim($name));
600
+ $author_action = strtolower(trim($GLOBALS['fwp_post']['author_rules_action'][$key]));
601
+
602
+ if (strlen($name) > 0) :
603
+ if ('newuser' == $author_action) :
604
+ $newuser_name = trim($GLOBALS['fwp_post']['author_rules_newuser'][$key]);
605
+ if (strlen($newuser_name) > 0) :
606
+ $userdata = array();
607
+ $userdata['ID'] = NULL;
608
+
609
+ $userdata['user_login'] = sanitize_user($newuser_name);
610
+ $userdata['user_login'] = apply_filters('pre_user_login', $userdata['user_login']);
611
+
612
+ $userdata['user_nicename'] = sanitize_title($newuser_name);
613
+ $userdata['user_nicename'] = apply_filters('pre_user_nicename', $userdata['user_nicename']);
614
+
615
+ $userdata['display_name'] = $wpdb->escape($newuser_name);
616
+
617
+ $newuser_id = wp_insert_user($userdata);
618
+ if (is_numeric($newuser_id)) :
619
+ $meta['map authors']['name'][$name] = $newuser_id;
620
+ else :
621
+ // TODO: Add some error detection and reporting
622
+ endif;
623
+ else :
624
+ // TODO: Add some error reporting
625
+ endif;
626
+ else :
627
+ $meta['map authors']['name'][$name] = $author_action;
628
+ endif;
629
+ endif;
630
+ endforeach;
631
+ endif;
632
+
633
+ if (isset($GLOBALS['fwp_post']['add_author_rule_name']) and isset($GLOBALS['fwp_post']['add_author_rule_action'])) :
634
+ $name = strtolower(trim($GLOBALS['fwp_post']['add_author_rule_name']));
635
+ $author_action = strtolower(trim($GLOBALS['fwp_post']['add_author_rule_action']));
636
+ if (strlen($name) > 0) :
637
+ if ('newuser' == $author_action) :
638
+ $newuser_name = trim($GLOBALS['fwp_post']['add_author_rule_newuser']);
639
+ if (strlen($newuser_name) > 0) :
640
+ $userdata = array();
641
+ $userdata['ID'] = NULL;
642
+
643
+ $userdata['user_login'] = sanitize_user($newuser_name);
644
+ $userdata['user_login'] = apply_filters('pre_user_login', $userdata['user_login']);
645
+
646
+ $userdata['user_nicename'] = sanitize_title($newuser_name);
647
+ $userdata['user_nicename'] = apply_filters('pre_user_nicename', $userdata['user_nicename']);
648
+
649
+ $userdata['display_name'] = $wpdb->escape($newuser_name);
650
+
651
+ $newuser_id = wp_insert_user($userdata);
652
+ if (is_numeric($newuser_id)) :
653
+ $meta['map authors']['name'][$name] = $newuser_id;
654
+ else :
655
+ // TODO: Add some error detection and reporting
656
+ endif;
657
+ else :
658
+ // TODO: Add some error reporting
659
+ endif;
660
+ else :
661
+ $meta['map authors']['name'][$name] = $author_action;
662
+ endif;
663
+ endif;
664
+ endif;
665
+
666
+ if (isset($GLOBALS['fwp_post']['cat_split'])) :
667
+ if (strlen(trim($GLOBALS['fwp_post']['cat_split'])) > 0) :
668
+ $meta['cat_split'] = trim($GLOBALS['fwp_post']['cat_split']);
669
+ else :
670
+ unset($meta['cat_split']);
671
+ endif;
672
+ endif;
673
+
674
+ if (is_array($meta['cats'])) :
675
+ $meta['cats'] = implode(FEEDWORDPRESS_CAT_SEPARATOR, $meta['cats']);
676
+ endif;
677
+ if (is_array($meta['tags'])) :
678
+ $meta['tags'] = implode(FEEDWORDPRESS_CAT_SEPARATOR, $meta['tags']);
679
+ endif;
680
+
681
+ // Collapse the author mapping rule structure back into a flat string
682
+ if (isset($meta['map authors'])) :
683
+ $ma = array();
684
+ foreach ($meta['map authors'] as $rule_type => $author_rules) :
685
+ foreach ($author_rules as $author_name => $author_action) :
686
+ $ma[] = $rule_type."\n".$author_name."\n".$author_action;
687
+ endforeach;
688
+ endforeach;
689
+ $meta['map authors'] = implode("\n\n", $ma);
690
+ endif;
691
+
692
+ $notes = '';
693
+ foreach ($meta as $key => $value) :
694
+ $notes .= $key . ": ". addcslashes($value, "\0..\37".'\\') . "\n";
695
+ endforeach;
696
+ $alter[] = "link_notes = '".$wpdb->escape($notes)."'";
697
+
698
+ $alter_set = implode(", ", $alter);
699
+
700
+ // issue update query
701
+ $result = $wpdb->query("
702
+ UPDATE $wpdb->links
703
+ SET $alter_set
704
+ WHERE link_id='$link_id'
705
+ ");
706
+ $updated_link = true;
707
+
708
+ // reload link information from DB
709
+ $link =& new SyndicatedLink($link_id);
710
+ else :
711
+ $updated_link = false;
712
+ endif;
713
+
714
+ $db_link = $link->link;
715
+ $link_url = wp_specialchars($db_link->link_url, 1);
716
+ $link_name = wp_specialchars($db_link->link_name, 1);
717
+ $link_description = wp_specialchars($db_link->link_description, 'both');
718
+ $link_notes = wp_specialchars($db_link->link_notes, 'both');
719
+ $link_rss_uri = wp_specialchars($db_link->link_rss, 'both');
720
+
721
+ $meta = $link->settings;
722
+ $post_status_global = get_option('feedwordpress_syndicated_post_status');
723
+ $comment_status_global = get_option('feedwordpress_syndicated_comment_status');
724
+ $ping_status_global = get_option('feedwordpress_syndicated_ping_status');
725
+
726
+ $status['post'] = array('publish' => '', 'private' => '', 'draft' => '', 'site-default' => '');
727
+ if (SyndicatedPost::use_api('post_status_pending')) :
728
+ $status['post']['pending'] = '';
729
+ endif;
730
+
731
+ $status['comment'] = array('open' => '', 'closed' => '', 'site-default' => '');
732
+ $status['ping'] = array('open' => '', 'closed' => '', 'site-default' => '');
733
+
734
+ foreach (array('post', 'comment', 'ping') as $what) :
735
+ if (isset($meta["{$what} status"])) :
736
+ $status[$what][$meta["{$what} status"]] = ' checked="checked"';
737
+ else :
738
+ $status[$what]['site-default'] = ' checked="checked"';
739
+ endif;
740
+ endforeach;
741
+
742
+ $unfamiliar['author'] = array ('create' => '','default' => '','filter' => '');
743
+ $unfamiliar['category'] = array ('create'=>'','tag' => '','default'=>'','filter'=>'');
744
+
745
+ foreach (array('author', 'category') as $what) :
746
+ if (is_string($meta["unfamiliar {$what}"]) and
747
+ array_key_exists($meta["unfamiliar {$what}"], $unfamiliar[$what])) :
748
+ $key = $meta["unfamiliar {$what}"];
749
+ else:
750
+ $key = 'site-default';
751
+ endif;
752
+ $unfamiliar[$what][$key] = ' checked="checked"';
753
+ endforeach;
754
+
755
+ if (is_array($meta['cats'])) : $cats = $meta['cats'];
756
+ else : $cats = array();
757
+ endif;
758
+
759
+ $dogs = SyndicatedPost::category_ids($cats, /*unfamiliar=*/ NULL);
760
+ else :
761
+ die( __('Link not found.') );
762
+ endif;
763
+
764
+ ?>
765
+ <script type="text/javascript">
766
+ function flip_hardcode (item) {
767
+ ed=document.getElementById('basics-'+item+'-edit');
768
+ view=document.getElementById('basics-'+item+'-view');
769
+
770
+ o = document.getElementById('basics-hardcode-'+item);
771
+ if (o.value=='yes') { ed.style.display='inline'; view.style.display='none'; }
772
+ else { ed.style.display='none'; view.style.display='inline'; }
773
+ }
774
+ function flip_newuser (item) {
775
+ rollup=document.getElementById(item);
776
+ newuser=document.getElementById(item+'-newuser');
777
+ sitewide=document.getElementById(item+'-default');
778
+ if (rollup) {
779
+ if ('newuser'==rollup.value) {
780
+ if (newuser) newuser.style.display='block';
781
+ if (sitewide) sitewide.style.display='none';
782
+ } else if ('site-default'==rollup.value) {
783
+ if (newuser) newuser.style.display='none';
784
+ if (sitewide) sitewide.style.display='block';
785
+ } else {
786
+ if (newuser) newuser.style.display='none';
787
+ if (sitewide) sitewide.style.display='none';
788
+ }
789
+ }
790
+ }
791
+ </script>
792
+
793
+ <?php if ($updated_link) : ?>
794
+ <div class="updated"><p>Syndicated feed settings updated.</p></div>
795
+ <?php endif; ?>
796
+
797
+ <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
798
+ <div class="wrap">
799
+ <input type="hidden" name="link_id" value="<?php echo $link_id; ?>" />
800
+ <input type="hidden" name="action" value="linkedit" />
801
+ <input type="hidden" name="save" value="link" />
802
+
803
+ <h2>Edit a syndicated feed:</h2>
804
+ <div id="poststuff">
805
+ <?php fwp_linkedit_single_submit($status); ?>
806
+
807
+ <div id="post-body">
808
+ <?php fwp_option_box_opener('Feed Information', 'feedinformationdiv'); ?>
809
+ <table class="editform" width="100%" cellspacing="2" cellpadding="5">
810
+ <tr>
811
+ <th scope="row" width="20%"><?php _e('Feed URI:') ?></th>
812
+ <td width="60%"><a href="<?php echo wp_specialchars($link_rss_uri, 'both'); ?>"><?php echo $link_rss_uri; ?></a>
813
+ (<a href="<?php echo FEEDVALIDATOR_URI; ?>?url=<?php echo urlencode($link_rss_uri); ?>"
814
+ title="Check feed &lt;<?php echo wp_specialchars($link_rss_uri, 'both'); ?>&gt; for validity">validate</a>)
815
+ </td>
816
+ <td width="20%"><input type="submit" name="feedfinder" value="switch &rarr;" style="font-size:smaller" /></td>
817
+ </tr>
818
+ <tr>
819
+ <th scope="row" width="20%"><?php _e('Link Name:') ?></th>
820
+ <td width="60%"><input type="text" id="basics-name-edit" name="name"
821
+ value="<?php echo $link_name; ?>" style="width: 95%" />
822
+ <span id="basics-name-view"><strong><?php echo $link_name; ?></strong></span>
823
+ </td>
824
+ <td>
825
+ <select id="basics-hardcode-name" onchange="flip_hardcode('name')" name="hardcode_name">
826
+ <option value="no" <?php echo $link->hardcode('name')?'':'selected="selected"'; ?>>update automatically</option>
827
+ <option value="yes" <?php echo $link->hardcode('name')?'selected="selected"':''; ?>>edit manually</option>
828
+ </select>
829
+ </td>
830
+ </tr>
831
+ <tr>
832
+ <th scope="row" width="20%"><?php _e('Short description:') ?></th>
833
+ <td width="60%">
834
+ <input id="basics-description-edit" type="text" name="description" value="<?php echo $link_description; ?>" style="width: 95%" />
835
+ <span id="basics-description-view"><strong><?php echo $link_description; ?></strong></span>
836
+ </td>
837
+ <td>
838
+ <select id="basics-hardcode-description" onchange="flip_hardcode('description')"
839
+ name="hardcode_description">
840
+ <option value="no" <?php echo $link->hardcode('description')?'':'selected="selected"'; ?>>update automatically</option>
841
+ <option value="yes" <?php echo $link->hardcode('description')?'selected="selected"':''; ?>>edit manually</option>
842
+ </select></td>
843
+ </tr>
844
+ <tr>
845
+ <th width="20%" scope="row"><?php _e('Homepage:') ?></th>
846
+ <td width="60%">
847
+ <input id="basics-url-edit" type="text" name="linkurl" value="<?php echo $link_url; ?>" style="width: 95%;" />
848
+ <a id="basics-url-view" href="<?php echo $link_url; ?>"><?php echo $link_url; ?></a></td>
849
+ <td>
850
+ <select id="basics-hardcode-url" onchange="flip_hardcode('url')" name="hardcode_url">
851
+ <option value="no"<?php echo $link->hardcode('url')?'':' selected="selected"'; ?>>update automatically</option>
852
+ <option value="yes"<?php echo $link->hardcode('url')?' selected="selected"':''; ?>>edit manually</option>
853
+ </select></td></tr>
854
+
855
+ <tr>
856
+ <th width="20%"><?php _e('Last update') ?>:</th>
857
+ <td colspan="2"><?php
858
+ if (isset($meta['update/last'])) :
859
+ echo strftime('%x %X', $meta['update/last'])." ";
860
+ else :
861
+ echo " none yet";
862
+ endif;
863
+ ?></td></tr>
864
+ <tr><th width="20%">Next update:</th>
865
+ <td colspan="2"><?php
866
+ $holdem = (isset($meta['update/hold']) ? $meta['update/hold'] : 'scheduled');
867
+ ?>
868
+ <select name="update_schedule">
869
+ <option value="scheduled"<?php echo ($holdem=='scheduled')?' selected="selected"':''; ?>>update on schedule <?php
870
+ echo " (";
871
+ if (isset($meta['update/ttl']) and is_numeric($meta['update/ttl'])) :
872
+ if (isset($meta['update/timed']) and $meta['update/timed']=='automatically') :
873
+ echo 'next: ';
874
+ $next = $meta['update/last'] + ((int) $meta['update/ttl'] * 60);
875
+ if (strftime('%x', time()) != strftime('%x', $next)) :
876
+ echo strftime('%x', $next)." ";
877
+ endif;
878
+ echo strftime('%X', $meta['update/last']+((int) $meta['update/ttl']*60));
879
+ else :
880
+ echo "every ".$meta['update/ttl']." minute".(($meta['update/ttl']!=1)?"s":"");
881
+ endif;
882
+ else:
883
+ echo "next scheduled update";
884
+ endif;
885
+ echo ")";
886
+ ?></option>
887
+ <option value="next"<?php echo ($holdem=='next')?' selected="selected"':''; ?>>update ASAP</option>
888
+ <option value="ping"<?php echo ($holdem=='ping')?' selected="selected"':''; ?>>update only when pinged</option>
889
+ </select></tr>
890
+ </table>
891
+ <?php fwp_option_box_closer(); ?>
892
+
893
+ <script type="text/javascript">
894
+ flip_hardcode('name');
895
+ flip_hardcode('description');
896
+ flip_hardcode('url');
897
+ </script>
898
+
899
+ <?php fwp_linkedit_periodic_submit(); ?>
900
+
901
+ <?php
902
+ if (!(isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25)) :
903
+ fwp_option_box_opener('Syndicated Posts', 'syndicatedpostsdiv', 'postbox');
904
+ ?>
905
+ <table class="editform" width="75%" cellspacing="2" cellpadding="5">
906
+ <tr><th width="27%" scope="row" style="vertical-align:top">Publication:</th>
907
+ <td width="73%" style="vertical-align:top"><ul style="margin:0; list-style:none">
908
+ <li><label><input type="radio" name="feed_post_status" value="site-default"
909
+ <?php echo $status['post']['site-default']; ?> /> Use site-wide setting from <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication-options.php">Syndication Options</a>
910
+ (currently: <strong><?php echo ($post_status_global ? $post_status_global : 'publish'); ?></strong>)</label></li>
911
+ <li><label><input type="radio" name="feed_post_status" value="publish"
912
+ <?php echo $status['post']['publish']; ?> /> Publish posts from this feed immediately</label></li>
913
+
914
+ <?php if (SyndicatedPost::use_api('post_status_pending')) : ?>
915
+ <li><label><input type="radio" name="feed_post_status" value="pending"
916
+ <?php echo $status['post']['pending']; ?>/> Hold posts from this feed for review; mark as Pending</label></li>
917
+ <?php endif; ?>
918
+
919
+ <li><label><input type="radio" name="feed_post_status" value="draft"
920
+ <?php echo $status['post']['draft']; ?> /> Save posts from this feed as drafts</label></li>
921
+ <li><label><input type="radio" name="feed_post_status" value="private"
922
+ <?php echo $status['post']['private']; ?> /> Save posts from this feed as private posts</label></li>
923
+ </ul></td>
924
+ </tr>
925
+ </table>
926
+ <?php
927
+ fwp_option_box_closer();
928
+ fwp_linkedit_periodic_submit();
929
+ endif;
930
+
931
+ fwp_option_box_opener(__('Categories'), 'categorydiv', 'postbox');
932
+ fwp_category_box($dogs, 'all syndicated posts from this feed');
933
+ ?>
934
+ <table>
935
+ <tr>
936
+ <th width="20%" scope="row" style="vertical-align:top">Unfamiliar categories:</th>
937
+ <td width="80%"><p>When one of the categories on a syndicated post is a category that FeedWordPress has not encountered before ...</p>
938
+
939
+ <ul style="margin: 0; list-style:none">
940
+ <li><label><input type="radio" name="unfamiliar_category" value="site-default"<?php echo $unfamiliar['category']['site-default']; ?> /> use the site-wide setting from <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication-options.php">Syndication Options</a>
941
+ (currently <strong><?php echo FeedWordPress::on_unfamiliar('category'); ?></strong>)</label></li>
942
+ <li><label><input type="radio" name="unfamiliar_category" value="create"<?php echo $unfamiliar['category']['create']; ?> /> create a new category</label></li>
943
+ <li><label><input type="radio" name="unfamiliar_category" value="tag"<?php echo $unfamiliar['category']['tag']; ?>/> create a new tag</label></li>
944
+ <li><label><input type="radio" name="unfamiliar_category" value="default"<?php echo $unfamiliar['category']['default']; ?> /> don't create new categories or tags</label></li>
945
+ <li><label><input type="radio" name="unfamiliar_category" value="filter"<?php echo $unfamiliar['category']['filter']; ?> /> don't create new categories or tags and don't syndicate posts unless they match at least one familiar category</label></li>
946
+ </ul></td>
947
+ </tr>
948
+
949
+ <tr>
950
+ <th width="20%" scope="row" style="vertical-align:top">Multiple categories:</th>
951
+ <td width="80%">
952
+ <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/>
953
+ 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
954
+ categories in a single category element. The regular expression should match
955
+ the characters used to separate one category from the next. If the feed uses
956
+ spaces (like <a href="http://del.icio.us/">del.icio.us</a>), use the pattern "\s".
957
+ If the feed does not provide multiple categories in a single element, leave this
958
+ blank.</td>
959
+ </tr>
960
+ </table>
961
+ <?php
962
+ fwp_option_box_closer();
963
+ fwp_linkedit_periodic_submit();
964
+
965
+ if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
966
+ fwp_tags_box($meta['tags']);
967
+ fwp_linkedit_periodic_submit();
968
+ endif; ?>
969
+
970
+ <?php fwp_option_box_opener('Syndicated Authors', 'authordiv', 'postbox'); ?>
971
+ <?php $authorlist = fwp_author_list(); ?>
972
+ <table>
973
+ <tr><th colspan="3" style="text-align: left; padding-top: 1.0em; border-bottom: 1px dotted black;">For posts by authors that haven't been syndicated before:</th></tr>
974
+ <tr>
975
+ <th style="text-align: left">Posts by new authors</th>
976
+ <td>
977
+ <select id="unfamiliar-author" name="unfamiliar_author" onchange="flip_newuser('unfamiliar-author');">
978
+ <option value="site-default"<?php if (!isset($meta['unfamiliar author'])) : ?>selected="selected"<?php endif; ?>>are handled using site-wide settings</option>
979
+ <option value="create"<?php if ('create'==$meta['unfamiliar author']) : ?>selected="selected"<?php endif; ?>>create a new author account</option>
980
+ <?php foreach ($authorlist as $author_id => $author_name) : ?>
981
+ <option value="<?php echo $author_id; ?>"<?php if ($author_id==$meta['unfamiliar author']) : ?>selected="selected"<?php endif; ?>>are assigned to <?php echo $author_name; ?></option>
982
+ <?php endforeach; ?>
983
+ <option value="newuser">will be assigned to a new user...</option>
984
+ <option value="filter"<?php if ('filter'==$meta['unfamiliar author']) : ?>selected="selected"<?php endif; ?>>get filtered out</option>
985
+ </select>
986
+ </td>
987
+ <td>
988
+ <div id="unfamiliar-author-default">Site-wide settings can be set in <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication-options.php">Syndication Options</a></div>
989
+ <div id="unfamiliar-author-newuser">named <input type="text" name="unfamiliar_author_newuser" value="" /></div>
990
+ </td>
991
+ </tr>
992
+
993
+ <tr><th colspan="3" style="text-align: left; padding-top: 1.0em; border-bottom: 1px dotted black;">For posts by specific authors. Blank out a name to delete the rule.</th></tr>
994
+
995
+ <?php if (isset($meta['map authors'])) : $i=0; foreach ($meta['map authors'] as $author_rules) : foreach ($author_rules as $author_name => $author_action) : $i++; ?>
996
+ <tr>
997
+ <th style="text-align: left">Posts by <input type="text" name="author_rules_name[]" value="<?php echo htmlspecialchars($author_name); ?>" /></th>
998
+ <td>
999
+ <select id="author-rules-<?php echo $i; ?>" name="author_rules_action[]" onchange="flip_newuser('author-rules-<?php echo $i; ?>');">
1000
+ <?php foreach ($authorlist as $local_author_id => $local_author_name) : ?>
1001
+ <option value="<?php echo $local_author_id; ?>"<?php if ($local_author_id==$author_action) : echo ' selected="selected"'; endif; ?>>are assigned to <?php echo $local_author_name; ?></option>
1002
+ <?php endforeach; ?>
1003
+ <option value="newuser">will be assigned to a new user...</option>
1004
+ <option value="filter"<?php if ('filter'==$author_action) : echo ' selected="selected"'; endif; ?>>get filtered out</option>
1005
+ </select>
1006
+ </td>
1007
+ <td><div id="author-rules-<?php echo $i; ?>-newuser">named <input type="text" name="author_rules_newuser[]" value="" /></div></td>
1008
+ </tr>
1009
+ <?php endforeach; endforeach; endif; ?>
1010
+
1011
+ <tr><th colspan="3" style="text-align: left; padding-top: 1.0em; border-bottom: 1px dotted black;">Fill in to set up a new rule:</th></tr>
1012
+
1013
+ <tr>
1014
+ <th style="text-align: left">Posts by <input type="text" name="add_author_rule_name" /></th>
1015
+ <td>
1016
+ <select id="add-author-rule" name="add_author_rule_action" onchange="flip_newuser('add-author-rule');">
1017
+ <?php foreach ($authorlist as $author_id => $author_name) : ?>
1018
+ <option value="<?php echo $author_id; ?>">are assigned to <?php echo $author_name; ?></option>
1019
+ <?php endforeach; ?>
1020
+ <option value="newuser">will be assigned to a new user...</option>
1021
+ <option value="filter">get filtered out</option>
1022
+ </select>
1023
+ </td>
1024
+ <td><div id="add-author-rule-newuser">named <input type="text" name="add_author_rule_newuser" value="" /></div></td>
1025
+ </tr>
1026
+
1027
+ </table>
1028
+ <?php fwp_option_box_closer(); ?>
1029
+
1030
+ <script>
1031
+ flip_newuser('unfamiliar-author');
1032
+ <?php for ($j=1; $j<=$i; $j++) : ?>
1033
+ flip_newuser('author-rules-<?php echo $j; ?>');
1034
+ <?php endfor; ?>
1035
+ flip_newuser('add-author-rule');
1036
+ </script>
1037
+
1038
+ <?php
1039
+ fwp_linkedit_periodic_submit();
1040
+ fwp_option_box_opener('Comments & Pings', 'commentstatusdiv', 'postbox');
1041
+ ?>
1042
+ <table class="editform" width="75%" cellspacing="2" cellpadding="5">
1043
+ <tr><th width="27%" scope="row" style="vertical-align:top"><?php print __('Comments'); ?>:</th>
1044
+ <td width="73%"><ul style="margin:0; list-style:none">
1045
+ <li><label><input type="radio" name="feed_comment_status" value="site-default"
1046
+ <?php echo $status['comment']['site-default']; ?> /> Use site-wide setting from <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication-options.php">Syndication Options</a>
1047
+ (currently: <strong><?php echo ($comment_status_global ? $comment_status_global : 'closed'); ?>)</strong></label></li>
1048
+ <li><label><input type="radio" name="feed_comment_status" value="open"
1049
+ <?php echo $status['comment']['open']; ?> /> Allow comments on syndicated posts from this feed</label></li>
1050
+ <li><label><input type="radio" name="feed_comment_status" value="closed"
1051
+ <?php echo $status['comment']['closed']; ?> /> Don't allow comments on syndicated posts from this feed</label></li>
1052
+ </ul></td></tr>
1053
+
1054
+ <tr><th width="27%" scope="row" style="vertical-align:top"><?php print __('Pings'); ?>:</th>
1055
+ <td width="73%"><ul style="margin:0; list-style:none">
1056
+ <li><label><input type="radio" name="feed_ping_status" value="site-default"
1057
+ <?php echo $status['ping']['site-default']; ?> /> Use site-wide setting from <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/syndication-options.php">Syndication Options</a>
1058
+ (currently: <strong><?php echo ($ping_status_global ? $ping_status_global : 'closed'); ?>)</strong></label></li>
1059
+ <li><label><input type="radio" name="feed_ping_status" value="open"
1060
+ <?php echo $status['ping']['open']; ?> /> Accept pings on syndicated posts from this feed</label></li>
1061
+ <li><label><input type="radio" name="feed_ping_status" value="closed"
1062
+ <?php echo $status['ping']['closed']; ?> /> Don't accept pings on syndicated posts from this feed</label></li>
1063
+ </ul></td></tr>
1064
+
1065
+ </table>
1066
+ <?php fwp_option_box_closer(); ?>
1067
+ <?php fwp_linkedit_periodic_submit(); ?>
1068
+
1069
+ <?php fwp_option_box_opener('Custom Settings (for use in templates)', 'postcustom', 'postbox'); ?>
1070
+ <div id="postcustomstuff">
1071
+ <table id="meta-list" cellpadding="3">
1072
+ <tr>
1073
+ <th>Key</th>
1074
+ <th>Value</th>
1075
+ <th>Action</th>
1076
+ </tr>
1077
+
1078
+ <?php
1079
+ $i = 0;
1080
+ foreach ($meta as $key => $value) :
1081
+ if (!preg_match("\007^((".implode(')|(', $special_settings)."))$\007i", $key)) :
1082
+ ?>
1083
+ <tr style="vertical-align:top">
1084
+ <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo wp_specialchars($key, 'both'); ?>" />
1085
+ <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo wp_specialchars($key, 'both'); ?>" /></th>
1086
+ <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>
1087
+ <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
1088
+ <option value="update">save changes</option>
1089
+ <option value="delete">delete this setting</option>
1090
+ </select></td>
1091
+ </tr>
1092
+ <?php
1093
+ $i++;
1094
+ endif;
1095
+ endforeach;
1096
+ ?>
1097
+ <tr>
1098
+ <th scope="row"><input type="text" size="10" name="notes[<?php echo $i; ?>][key1]" value="" /></th>
1099
+ <td><textarea name="notes[<?php echo $i; ?>][value]" rows="2" cols="40"></textarea></td>
1100
+ <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo $i; ?>][action]" value="update" /></td>
1101
+ </tr>
1102
+ </table>
1103
+ <?php fwp_option_box_closer(); ?>
1104
+
1105
+ <?php fwp_linkedit_periodic_submit(); ?>
1106
+ </div> <!-- id="post-body" -->
1107
+ </div> <!-- id="poststuff" -->
1108
+ </div>
1109
+ <?php
1110
+ endif;
1111
+ return false; // Don't continue
1112
+ }
1113
+
1114
+ function fwp_multidelete_page () {
1115
+ global $wpdb;
1116
+
1117
+ check_admin_referer(); // Make sure the referers are kosher
1118
+
1119
+ $link_ids = (isset($_REQUEST['link_ids']) ? $_REQUEST['link_ids'] : array());
1120
+ if (isset($_REQUEST['link_id'])) : array_push($link_ids, $_REQUEST['link_id']); endif;
1121
+
1122
+ if (!current_user_can('manage_links')):
1123
+ die (__("Cheatin' uh ?"));
1124
+ elseif (isset($GLOBALS['fwp_post']['confirm']) and $GLOBALS['fwp_post']['confirm']=='Delete'):
1125
+ foreach ($GLOBALS['fwp_post']['link_action'] as $link_id => $what) :
1126
+ $do_it[$what][] = $link_id;
1127
+ endforeach;
1128
+
1129
+ $alter = array();
1130
+ if (count($do_it['hide']) > 0) :
1131
+ $hidem = "(".implode(', ', $do_it['hide']).")";
1132
+ $alter[] = "
1133
+ UPDATE $wpdb->links
1134
+ SET link_visible = 'N'
1135
+ WHERE link_id IN {$hidem}
1136
+ ";
1137
+ endif;
1138
+
1139
+ if (count($do_it['nuke']) > 0) :
1140
+ $nukem = "(".implode(', ', $do_it['nuke']).")";
1141
+
1142
+ // Make a list of the items syndicated from this feed...
1143
+ $post_ids = $wpdb->get_col("
1144
+ SELECT post_id FROM $wpdb->postmeta
1145
+ WHERE meta_key = 'syndication_feed_id'
1146
+ AND meta_value IN {$nukem}
1147
+ ");
1148
+
1149
+ // ... and kill them all
1150
+ if (count($post_ids) > 0) :
1151
+ foreach ($post_ids as $post_id) :
1152
+ wp_delete_post($post_id);
1153
+ endforeach;
1154
+ endif;
1155
+
1156
+ $alter[] = "
1157
+ DELETE FROM $wpdb->links
1158
+ WHERE link_id IN {$nukem}
1159
+ ";
1160
+ endif;
1161
+
1162
+ if (count($do_it['delete']) > 0) :
1163
+ $deletem = "(".implode(', ', $do_it['delete']).")";
1164
+
1165
+ // Make the items syndicated from this feed appear to be locally-authored
1166
+ $alter[] = "
1167
+ DELETE FROM $wpdb->postmeta
1168
+ WHERE meta_key = 'syndication_feed_id'
1169
+ AND meta_value IN {$deletem}
1170
+ ";
1171
+
1172
+ // ... and delete the links themselves.
1173
+ $alter[] = "
1174
+ DELETE FROM $wpdb->links
1175
+ WHERE link_id IN {$deletem}
1176
+ ";
1177
+ endif;
1178
+
1179
+ $errs = array(); $success = array ();
1180
+ foreach ($alter as $sql) :
1181
+ $result = $wpdb->query($sql);
1182
+ if (!$result):
1183
+ $errs[] = mysql_error();
1184
+ endif;
1185
+ endforeach;
1186
+
1187
+ if (count($alter) > 0) :
1188
+ echo "<div class=\"updated\">\n";
1189
+ if (count($errs) > 0) :
1190
+ echo "There were some problems processing your ";
1191
+ echo "unsubscribe request. [SQL: ".implode('; ', $errs)."]";
1192
+ else :
1193
+ echo "Your unsubscribe request(s) have been processed.";
1194
+ endif;
1195
+ echo "</div>\n";
1196
+ endif;
1197
+
1198
+ return true; // Continue on to Syndicated Sites listing
1199
+ else :
1200
+ $targets = $wpdb->get_results("
1201
+ SELECT * FROM $wpdb->links
1202
+ WHERE link_id IN (".implode(",",$link_ids).")
1203
+ ");
1204
+ ?>
1205
+ <form action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
1206
+ <div class="wrap">
1207
+ <input type="hidden" name="action" value="Unsubscribe" />
1208
+ <input type="hidden" name="confirm" value="Delete" />
1209
+
1210
+ <h2>Unsubscribe from Syndicated Links:</h2>
1211
+ <?php foreach ($targets as $link) :
1212
+ $link_url = wp_specialchars($link->link_url, 1);
1213
+ $link_name = wp_specialchars($link->link_name, 1);
1214
+ $link_description = wp_specialchars($link->link_description, 'both');
1215
+ $link_rss = wp_specialchars($link->link_rss, 'both');
1216
+ ?>
1217
+ <fieldset>
1218
+ <legend><?php echo $link_name; ?></legend>
1219
+ <table class="editform" width="100%" cellspacing="2" cellpadding="5">
1220
+ <tr><th scope="row" width="20%"><?php _e('Feed URI:') ?></th>
1221
+ <td width="80%"><a href="<?php echo $link_rss; ?>"><?php echo $link_rss; ?></a></td></tr>
1222
+ <tr><th scope="row" width="20%"><?php _e('Short description:') ?></th>
1223
+ <td width="80%"><?php echo $link_description; ?></span></td></tr>
1224
+ <tr><th width="20%" scope="row"><?php _e('Homepage:') ?></th>
1225
+ <td width="80%"><a href="<?php echo $link_url; ?>"><?php echo $link_url; ?></a></td></tr>
1226
+ <tr style="vertical-align:top"><th width="20%" scope="row">Subscription <?php _e('Options') ?>:</th>
1227
+ <td width="80%"><ul style="margin:0; padding: 0; list-style: none">
1228
+ <li><input type="radio" id="hide-<?php echo $link->link_id; ?>"
1229
+ name="link_action[<?php echo $link->link_id; ?>]" value="hide" />
1230
+ <label for="hide-<?php echo $link->link_id; ?>">Turn off the subscription for this
1231
+ syndicated link<br/><span style="font-size:smaller">(Keep the feed information
1232
+ and all the posts from this feed in the database, but don't syndicate any
1233
+ new posts from the feed.)</span></label></li>
1234
+ <li><input type="radio" id="nuke-<?php echo $link->link_id; ?>"
1235
+ name="link_action[<?php echo $link->link_id; ?>]" value="nuke" />
1236
+ <label for="nuke-<?php echo $link->link_id; ?>">Delete this syndicated link and all the
1237
+ posts that were syndicated from it</label></li>
1238
+ <li><input type="radio" id="delete-<?php echo $link->link_id; ?>"
1239
+ name="link_action[<?php echo $link->link_id; ?>]" value="delete" />
1240
+ <label for="delete-<?php echo $link->link_id; ?>">Delete this syndicated link, but
1241
+ <em>keep</em> posts that were syndicated from it (as if they were authored
1242
+ locally).</label></li>
1243
+ <li><input type="radio" id="nothing-<?php echo $link->link_id; ?>"
1244
+ name="link_action[<?php echo $link->link_id; ?>]" value="nothing" />
1245
+ <label for="nothing-<?php echo $link->link_id; ?>">Keep this feed as it is. I changed
1246
+ my mind.</label></li>
1247
+ </ul>
1248
+ </table>
1249
+ </fieldset>
1250
+ <?php endforeach; ?>
1251
+
1252
+ <div class="submit">
1253
+ <input class="delete" type="submit" name="submit" value="<?php _e('Unsubscribe from selected feeds &raquo;') ?>" />
1254
+ </div>
1255
+ </div>
1256
+ <?php
1257
+ return false; // Don't continue on to Syndicated Sites listing
1258
+ endif;
1259
+ }
1260
+
1261
+ fwp_syndication_manage_page();
1262
+