PluginProbe
FeedWordPress / 2011.0512
FeedWordPress v2011.0512
trunk 0.8 0.9 0.91 0.95 0.96 0.97 0.98 0.981 0.99 0.991 0.992 0.993 2008.1030 2008.1101 2008.1105 2008.1214 2009.0612 2009.0613 2009.0618 2009.0707 2009.1111 2009.1112 2010.0127 2010.0528 All 65 releases
← All changes | authors-page.php +328 -383 2009.06122011.0512 View file →
@@ -1,353 +1,62 @@
1 1 <?php
2 2 require_once(dirname(__FILE__) . '/admin-ui.php');
3 3
4 -function fwp_authors_page () {
5 - global $wpdb, $wp_db_version;
6 -
7 - FeedWordPressCompatibility::validate_http_request(/*action=*/ 'feedwordpress_author_settings', /*capability=*/ 'manage_links');
8 -
9 - if (isset($GLOBALS['fwp_post']['save']) or isset($GLOBALS['fwp_post']['fix_mismatch'])) :
10 - $link_id = $_REQUEST['save_link_id'];
11 - elseif (isset($_REQUEST['link_id'])) :
12 - $link_id = $_REQUEST['link_id'];
13 - else :
14 - $link_id = NULL;
15 - endif;
16 -
17 - if (is_numeric($link_id) and $link_id) :
18 - $link =& new SyndicatedLink($link_id);
19 - else :
20 - $link = NULL;
21 - endif;
22 -
23 - $mesg = null;
24 -
25 - if (isset($GLOBALS['fwp_post']['fix_mismatch'])) :
26 - if ('newuser'==$GLOBALS['fwp_post']['fix_mismatch_to']) :
27 - $newuser_name = trim($GLOBALS['fwp_post']['fix_mismatch_to_newuser']);
28 - if (strlen($newuser_name) > 0) :
29 - $userdata = array();
30 - $userdata['ID'] = NULL;
31 -
32 - $userdata['user_login'] = sanitize_user($newuser_name);
33 - $userdata['user_login'] = apply_filters('pre_user_login', $userdata['user_login']);
34 -
35 - $userdata['user_nicename'] = sanitize_title($newuser_name);
36 - $userdata['user_nicename'] = apply_filters('pre_user_nicename', $userdata['user_nicename']);
37 -
38 - $userdata['display_name'] = $wpdb->escape($newuser_name);
39 -
40 - $newuser_id = wp_insert_user($userdata);
41 - if (is_numeric($newuser_id)) :
42 - $fix_mismatch_to_id = $newuser_id;
43 - else :
44 - // TODO: Add some error detection and reporting
45 - endif;
46 - else :
47 - // TODO: Add some error reporting
48 - endif;
49 - else :
50 - $fix_mismatch_to_id = $GLOBALS['fwp_post']['fix_mismatch_to'];
4 +class FeedWordPressAuthorsPage extends FeedWordPressAdminPage {
5 + var $authorlist = NULL;
6 + var $rule_count = 0;
7 +
8 + function FeedWordPressAuthorsPage ($link = -1) {
9 + if (is_numeric($link) and -1 == $link) :
10 + $link = FeedWordPressAdminPage::submitted_link();
51 11 endif;
52 - $fix_mismatch_from_id = (int) $GLOBALS['fwp_post']['fix_mismatch_from'];
53 - if (is_numeric($fix_mismatch_from_id)) :
54 - // Make a list of all the items by this author syndicated from this feed...
55 - $post_ids = $wpdb->get_col("
56 - SELECT {$wpdb->posts}.id
57 - FROM {$wpdb->posts}, {$wpdb->postmeta}
58 - WHERE ({$wpdb->posts}.id = {$wpdb->postmeta}.post_id)
59 - AND {$wpdb->postmeta}.meta_key = 'syndication_feed_id'
60 - AND {$wpdb->postmeta}.meta_value = '{$link_id}'
61 - AND {$wpdb->posts}.post_author = '{$fix_mismatch_from_id}'
62 - ");
63 -
64 - if (count($post_ids) > 0) :
65 - // Re-assign them all to the correct author
66 - if (is_numeric($fix_mismatch_to_id)) : // re-assign to a particular user
67 - $post_set = "(".implode(",", $post_ids).")";
68 -
69 - // Getting the revisions too, if there are any
70 - if (fwp_test_wp_version(FWP_SCHEMA_26)) :
71 - $parent_in_clause = "OR {$wpdb->posts}.post_parent IN $post_set";
72 - else :
73 - $parent_in_clause = '';
74 - endif;
75 -
76 - $wpdb->query("
77 - UPDATE {$wpdb->posts}
78 - SET post_author='{$fix_mismatch_to_id}'
79 - WHERE ({$wpdb->posts}.id IN $post_set
80 - $parent_in_clause)
81 - ");
82 - $mesg = "Re-assigned ".count($post_ids)." post".((count($post_ids)==1)?'':'s').".";
83 12
84 - // ... and kill them all
85 - elseif ($fix_mismatch_to_id=='filter') :
86 - foreach ($post_ids as $post_id) :
87 - wp_delete_post($post_id);
88 - endforeach;
89 - $mesg = "Deleted ".count($post_ids)." post".((count($post_ids)==1)?'':'s').".";
90 - endif;
91 - else :
92 - $mesg = "Couldn't find any posts that matched your criteria.";
93 - endif;
94 - endif;
95 - elseif (isset($GLOBALS['fwp_post']['save'])) :
96 - if (is_object($link) and $link->found()) :
97 - $alter = array ();
13 + FeedWordPressAdminPage::FeedWordPressAdminPage('feedwordpressauthors', $link);
14 + $this->refresh_author_list();
15 + $this->dispatch = 'feedwordpress_author_settings';
16 + $this->filename = __FILE__;
98 17
99 - // Unfamiliar author rule
100 - if (isset($GLOBALS['fwp_post']["unfamiliar_author"])) :
101 - if ('site-default'==$GLOBALS['fwp_post']["unfamiliar_author"]) :
102 - unset($link->settings["unfamiliar author"]);
103 - elseif ('newuser'==$GLOBALS['fwp_post']["unfamiliar_author"]) :
104 - $newuser_name = trim($GLOBALS['fwp_post']["unfamiliar_author_newuser"]);
105 - $link->map_name_to_new_user(/*name=*/ NULL, $newuser_name);
106 - else :
107 - $link->settings["unfamiliar author"] = $GLOBALS['fwp_post']["unfamiliar_author"];
108 - endif;
109 - endif;
110 -
111 - // Handle author mapping rules
112 - if (isset($GLOBALS['fwp_post']['author_rules_name']) and isset($GLOBALS['fwp_post']['author_rules_action'])) :
113 - unset($link->settings['map authors']);
114 - foreach ($GLOBALS['fwp_post']['author_rules_name'] as $key => $name) :
115 - // Normalize for case and whitespace
116 - $name = strtolower(trim($name));
117 - $author_action = strtolower(trim($GLOBALS['fwp_post']['author_rules_action'][$key]));
118 -
119 - if (strlen($name) > 0) :
120 - if ('newuser' == $author_action) :
121 - $newuser_name = trim($GLOBALS['fwp_post']['author_rules_newuser'][$key]);
122 - $link->map_name_to_new_user($name, $newuser_name);
123 - else :
124 - $link->settings['map authors']['name'][$name] = $author_action;
125 - endif;
126 - endif;
127 - endforeach;
128 - endif;
18 + $this->pagenames = array(
19 + 'default' => 'Authors',
20 + 'settings-update' => 'Syndicated Authors',
21 + 'open-sheet' => 'Syndicated Author',
22 + );
23 + }
24 +
25 + function refresh_author_list () {
26 + $this->authorlist = fwp_author_list();
129 27
130 - if (isset($GLOBALS['fwp_post']['add_author_rule_name']) and isset($GLOBALS['fwp_post']['add_author_rule_action'])) :
131 - $name = strtolower(trim($GLOBALS['fwp_post']['add_author_rule_name']));
132 - $author_action = strtolower(trim($GLOBALS['fwp_post']['add_author_rule_action']));
133 - if (strlen($name) > 0) :
134 - if ('newuser' == $author_action) :
135 - $newuser_name = trim($GLOBALS['fwp_post']['add_author_rule_newuser']);
136 - $link->map_name_to_new_user($name, $newuser_name);
137 - else :
138 - $link->settings['map authors']['name'][$name] = $author_action;
139 - endif;
140 - endif;
141 - endif;
28 + // Case-insensitive "natural" alphanumeric sort. Preserves key/value associations.
29 + if (function_exists('natcasesort')) : natcasesort($this->authorlist); endif;
30 + }
31 +
32 + /*static*/ function syndicated_authors_box ($page, $box = NULL) {
33 + $link = $page->link;
34 + $unfamiliar = array ('create' => '','default' => '','filter' => '');
142 35
143 - $alter[] = "link_notes = '".$wpdb->escape($link->settings_to_notes())."'";
144 -
145 - $alter_set = implode(", ", $alter);
146 -
147 - // issue update query
148 - $result = $wpdb->query("
149 - UPDATE $wpdb->links
150 - SET $alter_set
151 - WHERE link_id='$link_id'
152 - ");
153 - $updated_link = true;
154 -
155 - // reload link information from DB
156 - if (function_exists('clean_bookmark_cache')) :
157 - clean_bookmark_cache($link_id);
158 - endif;
159 - $link =& new SyndicatedLink($link_id);
36 + if ($page->for_feed_settings()) :
37 + $key = $this->link->setting('unfamiliar author', NULL, 'site-default');
38 + $unfamiliar['site-default'] = '';
160 39 else :
161 - if ('newuser'==$GLOBALS['fwp_post']['unfamiliar_author']) :
162 - $newuser_name = trim($GLOBALS['fwp_post']['unfamiliar_author_newuser']);
163 - if (strlen($newuser_name) > 0) :
164 - $userdata = array();
165 - $userdata['ID'] = NULL;
166 -
167 - $userdata['user_login'] = sanitize_user($newuser_name);
168 - $userdata['user_login'] = apply_filters('pre_user_login', $userdata['user_login']);
169 -
170 - $userdata['user_nicename'] = sanitize_title($newuser_name);
171 - $userdata['user_nicename'] = apply_filters('pre_user_nicename', $userdata['user_nicename']);
172 -
173 - $userdata['display_name'] = $wpdb->escape($newuser_name);
174 -
175 - $newuser_id = wp_insert_user($userdata);
176 - if (is_numeric($newuser_id)) :
177 - update_option('feedwordpress_unfamiliar_author', $newuser_id);
178 - else :
179 - // TODO: Add some error detection and reporting
180 - endif;
181 - else :
182 - // TODO: Add some error reporting
183 - endif;
184 - else :
185 - update_option('feedwordpress_unfamiliar_author', $GLOBALS['fwp_post']['unfamiliar_author']);
186 - endif;
187 -
188 - if (isset($GLOBALS['fwp_post']['match_author_by_email']) and $GLOBALS['fwp_post']['match_author_by_email']=='yes') :
189 - update_option('feedwordpress_do_not_match_author_by_email', 'no');
190 - else :
191 - update_option('feedwordpress_do_not_match_author_by_email', 'yes');
192 - endif;
193 -
194 - if (isset($GLOBALS['fwp_post']['null_emails'])) :
195 - update_option('feedwordpress_null_email_set', $GLOBALS['fwp_post']['null_emails']);
196 - endif;
197 -
198 - $updated_link = true;
40 + $key = FeedWordPress::on_unfamiliar('author');
199 41 endif;
200 - else :
201 - $updated_link = false;
202 - endif;
42 + $unfamiliar[$key] = ' selected="selected"';
203 43
204 - $unfamiliar = array ('create' => '','default' => '','filter' => '');
44 + $match_author_by_email = !('yes' == get_option("feedwordpress_do_not_match_author_by_email"));
45 + $null_emails = FeedWordPress::null_email_set();
205 46
206 - if (is_object($link) and $link->found()) :
207 - if (is_string($link->settings["unfamiliar author"])) :
208 - $key = $link->settings["unfamiliar author"];
209 - else:
210 - $key = 'site-default';
211 - endif;
212 - else :
213 - $key = FeedWordPress::on_unfamiliar('author');
214 - endif;
215 -
216 - $unfamiliar[$key] = ' selected="selected"';
217 -
218 - $match_author_by_email = !('yes' == get_option("feedwordpress_do_not_match_author_by_email"));
219 - $null_emails = FeedWordPress::null_email_set();
220 -?>
221 -<script type="text/javascript">
222 - function contextual_appearance (item, appear, disappear, value, visibleStyle, checkbox) {
223 - if (typeof(visibleStyle)=='undefined') visibleStyle = 'block';
224 -
225 - var rollup=document.getElementById(item);
226 - var newuser=document.getElementById(appear);
227 - var sitewide=document.getElementById(disappear);
228 - if (rollup) {
229 - if ((checkbox && rollup.checked) || (!checkbox && value==rollup.value)) {
230 - if (newuser) newuser.style.display=visibleStyle;
231 - if (sitewide) sitewide.style.display='none';
232 - } else {
233 - if (newuser) newuser.style.display='none';
234 - if (sitewide) sitewide.style.display=visibleStyle;
235 - }
236 - }
237 - }
238 -</script>
239 -
240 -<?php if ($updated_link) : ?>
241 -<div class="updated"><p>Syndicated author settings updated.</p></div>
242 -<?php elseif (!is_null($mesg)) : ?>
243 -<div class="updated"><p><?php print wp_specialchars($mesg, 1); ?></p></div>
244 -<?php endif; ?>
245 -
246 -<div class="wrap">
247 -<form style="position: relative" action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
248 -<div><?php
249 - FeedWordPressCompatibility::stamp_nonce('feedwordpress_author_settings');
250 -
251 - if (is_numeric($link_id) and $link_id) :
252 -?>
253 -<input type="hidden" name="save_link_id" value="<?php echo $link_id; ?>" />
47 + // Hey ho, let's go...
48 + ?>
49 +<table class="form-table">
254 50 <?php
255 - else :
51 +if ($page->for_default_settings()) :
256 52 ?>
257 -<input type="hidden" name="save_link_id" value="*" />
258 -<?php
259 - endif;
260 -?>
261 -</div>
262 -
263 -<?php $links = FeedWordPress::syndicated_links(); ?>
264 -<?php if (fwp_test_wp_version(FWP_SCHEMA_27)) : ?>
265 - <div class="icon32"><img src="<?php print htmlspecialchars(WP_PLUGIN_URL.'/'.$GLOBALS['fwp_path'].'/feedwordpress.png'); ?>" alt="" /></div>
266 -<?php endif; ?>
267 -<h2>Syndicated Author Settings<?php if (!is_null($link) and $link->found()) : ?>: <?php echo wp_specialchars($link->link->link_name, 1); ?><?php endif; ?></h2>
268 -<?php if (fwp_test_wp_version(FWP_SCHEMA_27)) : ?>
269 - <style type="text/css">
270 - #post-search {
271 - float: right;
272 - margin:11px 12px 0;
273 - min-width: 130px;
274 - position:relative;
275 - }
276 - .fwpfs {
277 - color: #dddddd;
278 - background:#797979 url(<?php bloginfo('home') ?>/wp-admin/images/fav.png) repeat-x scroll left center;
279 - border-color:#777777 #777777 #666666 !important; -moz-border-radius-bottomleft:12px;
280 - -moz-border-radius-bottomright:12px;
281 - -moz-border-radius-topleft:12px;
282 - -moz-border-radius-topright:12px;
283 - border-style:solid;
284 - border-width:1px;
285 - line-height:15px;
286 - padding:3px 30px 4px 12px;
287 - }
288 - .fwpfs.slide-down {
289 - border-bottom-color: #626262;
290 - -moz-border-radius-bottomleft:0;
291 - -moz-border-radius-bottomright:0;
292 - -moz-border-radius-topleft:12px;
293 - -moz-border-radius-topright:12px;
294 - background-image:url(<?php bloginfo('home') ?>/wp-admin/images/fav-top.png);
295 - background-position:0 top;
296 - background-repeat:repeat-x;
297 - border-bottom-style:solid;
298 - border-bottom-width:1px;
299 - }
300 - </style>
301 -
302 - <script type="text/javascript">
303 - jQuery(document).ready(function($){
304 - $('.fwpfs').toggle(
305 - function(){$('.fwpfs').removeClass('slideUp').addClass('slideDown'); setTimeout(function(){if ( $('.fwpfs').hasClass('slideDown') ) { $('.fwpfs').addClass('slide-down'); }}, 10) },
306 - function(){$('.fwpfs').removeClass('slideDown').addClass('slideUp'); setTimeout(function(){if ( $('.fwpfs').hasClass('slideUp') ) { $('.fwpfs').removeClass('slide-down'); }}, 10) }
307 - );
308 - $('.fwpfs').bind(
309 - 'change',
310 - function () { this.form.submit(); }
311 - );
312 - $('#post-search .button').css( 'display', 'none' );
313 - });
314 - </script>
315 -<?php endif; /* else : */?>
316 -<p id="post-search">
317 -<select name="link_id" class="fwpfs" style="max-width: 20.0em;">
318 - <option value="*"<?php if (is_null($link) or !$link->found()) : ?> selected="selected"<?php endif; ?>>- defaults for all feeds -</option>
319 -<?php if ($links) : foreach ($links as $ddlink) : ?>
320 - <option value="<?php print (int) $ddlink->link_id; ?>"<?php if (!is_null($link) and ($link->link->link_id==$ddlink->link_id)) : ?> selected="selected"<?php endif; ?>><?php print wp_specialchars($ddlink->link_name, 1); ?></option>
321 -<?php endforeach; endif; ?>
322 -</select>
323 -<input class="button" type="submit" name="go" value="<?php _e('Go') ?> &raquo;" />
324 -</p>
325 -<?php /* endif; */ ?>
326 -
327 -<?php if (!is_null($link) and $link->found()) : ?>
328 - <p>These settings only affect posts syndicated from
329 - <strong><?php echo wp_specialchars($link->link->link_name, 1); ?></strong>.</p>
330 -<?php else : ?>
331 - <p>These settings affect posts syndicated from any feed unless they are overridden
332 - by settings for that specific feed.</p>
333 -<?php endif; ?>
334 -
335 -<?php
336 - $authorlist = fwp_author_list();
337 -?>
338 -<table class="form-table">
339 -<tbody>
340 -<tr>
341 - <th>New authors</th>
342 - <td><span>Authors who haven't been syndicated before</span>
53 +<tr><th>Unmatched authors</th>
54 +<td><span>Authors who haven&#8217;t been syndicated before</span>
343 55 <select style="max-width: 27.0em" id="unfamiliar-author" name="unfamiliar_author" onchange="contextual_appearance('unfamiliar-author', 'unfamiliar-author-newuser', 'unfamiliar-author-default', 'newuser', 'inline');">
344 -<?php if (is_object($link) and $link->found()) : ?>
345 - <option value="site-default"<?php print $unfamiliar['site-default']; ?>>are handled according to the default for all feeds</option>
346 -<?php endif; ?>
347 - <option value="create"<?php $unfamiliar['create']; ?>>will have a new author account created for them</option>
348 - <?php foreach ($authorlist as $author_id => $author_name) : ?>
349 - <option value="<?php echo $author_id; ?>"<?php print $unfamiliar[$author_id]; ?>>will have their posts attributed to <?php echo $author_name; ?></option>
56 + <option value="create"<?php print $unfamiliar['create']; ?>>will have a new author account created for them</option>
57 + <?php foreach ($page->authorlist as $author_id => $author_name) : ?>
58 + <option value="<?php echo $author_id; ?>"<?php print (isset($unfamiliar[$author_id]) ? $unfamiliar[$author_id] : ''); ?>>will have their posts attributed to <?php echo $author_name; ?></option>
350 59 <?php endforeach; ?>
351 60 <option value="newuser">will have their posts attributed to a new user...</option>
352 61 <option value="filter"<?php print $unfamiliar['filter'] ?>>get filtered out</option>
353 62 </select>
@@ -356,27 +65,58 @@
356 65 </td>
357 66 </tr>
358 67
359 68 <?php
360 -if (is_object($link) and $link->found()) :
69 +endif;
70 +
71 +if ($page->for_feed_settings()) :
72 + $map = $this->link->setting('map authors', NULL, array());
361 73 ?>
362 -<tr><th>Syndicated authors</th>
363 -<td>For attributing posts by specific authors. Blank out a name to delete the rule. Fill in a new name at the bottom to create a new rule.</p>
74 +<tr><th>Matching authors</th>
75 +<td><p>How should FeedWordPress attribute posts from this feed to WordPress
76 +authors?</p>
77 +<ul class="settings">
78 +<li><p><input type="radio" name="author_rules_name[all]" value="*"
79 +<?php if (isset($map['name']['*'])) : $author_action = $map['name']['*']; ?>
80 + checked="checked"
81 +<?php
82 + else :
83 + $author_action = NULL;
84 + endif; ?>
85 + /> All posts syndicated
86 +from this feed <select class="author-rules" id="author-rules-all"
87 +name="author_rules_action[all]" onchange="contextual_appearance('author-rules-all', 'author-rules-all-newuser', 'author-rules-all-default', 'newuser', 'inline');">
88 + <?php foreach ($page->authorlist as $local_author_id => $local_author_name) : ?>
89 + <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>
90 + <?php endforeach; ?>
91 + <option value="newuser">will be assigned to a new user...</option>
92 + <option value="filter"<?php if ('filter'==$author_action) : echo ' selected="selected"'; endif; ?>>get filtered out</option>
93 + </select>
94 + <span class="author-rules-newuser" id="author-rules-all-newuser">named
95 + <input type="text" name="author_rules_newuser[all]" value="" /></span></p></li>
96 +<li><p><input type="radio" name="author_rules_name[all]" value=""
97 +<?php if (!isset($map['name']['*'])) : ?>
98 + checked="checked"
99 +<?php endif; ?>
100 +/> Attribute posts to authors based on automatic mapping rules. (Blank out a
101 +name to delete the rule. Fill in a new name at the bottom to create a new rule.)</p>
102 +
364 103 <table style="width: 100%">
365 104 <?php
366 - if (isset($link->settings['map authors'])) :
105 + if (isset($this->link->settings['map authors'])) :
367 106 ?>
368 107 <?php
369 - $i=0;
370 - foreach ($link->settings['map authors'] as $author_rules) :
108 + $page->rule_count=0;
109 + foreach ($this->link->settings['map authors'] as $author_rules) :
371 110 foreach ($author_rules as $author_name => $author_action) :
372 - $i++;
111 + if ($author_name != '*') :
112 + $page->rule_count++;
373 113 ?>
374 114 <tr>
375 115 <th style="text-align: left; width: 15.0em">Posts by <input type="text" name="author_rules_name[]" value="<?php echo htmlspecialchars($author_name); ?>" size="11" /></th>
376 116 <td>
377 - <select id="author-rules-<?php echo $i; ?>" name="author_rules_action[]" onchange="contextual_appearance('author-rules-<?php echo $i; ?>', 'author-rules-<?php echo $i; ?>-newuser', 'author-rules-<?php echo $i; ?>-default', 'newuser', 'inline');">
378 - <?php foreach ($authorlist as $local_author_id => $local_author_name) : ?>
117 + <select class="author-rules" id="author-rules-<?php echo $page->rule_count; ?>" name="author_rules_action[]" onchange="contextual_appearance('author-rules-<?php echo $page->rule_count; ?>', 'author-rules-<?php echo $page->rule_count; ?>-newuser', 'author-rules-<?php echo $page->rule_count; ?>-default', 'newuser', 'inline');">
118 + <?php foreach ($page->authorlist as $local_author_id => $local_author_name) : ?>
379 119 <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>
380 120 <?php endforeach; ?>
381 121 <option value="newuser">will be assigned to a new user...</option>
382 122 <option value="filter"<?php if ('filter'==$author_action) : echo ' selected="selected"'; endif; ?>>get filtered out</option>
@@ -381,12 +121,14 @@
381 121 <option value="newuser">will be assigned to a new user...</option>
382 122 <option value="filter"<?php if ('filter'==$author_action) : echo ' selected="selected"'; endif; ?>>get filtered out</option>
383 123 </select>
384 124
385 - <span id="author-rules-<?php echo $i; ?>-newuser">named <input type="text" name="author_rules_newuser[]" value="" /></span>
125 + <span class="author-rules-newuser" id="author-rules-<?php echo $page->rule_count; ?>-newuser">named <input type="text" name="author_rules_newuser[]" value="" /></span>
386 126 </td>
387 127 </tr>
388 -<?php endforeach;
128 +<?php
129 + endif;
130 + endforeach;
389 131 endforeach;
390 132 endif;
391 133 ?>
392 134
@@ -393,9 +135,9 @@
393 135 <tr>
394 136 <th style="text-align: left; width: 15.0em">Posts by <input type="text" name="add_author_rule_name" size="11" /></th>
395 137 <td>
396 138 <select id="add-author-rule" name="add_author_rule_action" onchange="contextual_appearance('add-author-rule', 'add-author-rule-newuser', 'add-author-rule-default', 'newuser', 'inline');">
397 - <?php foreach ($authorlist as $author_id => $author_name) : ?>
139 + <?php foreach ($page->authorlist as $author_id => $author_name) : ?>
398 140 <option value="<?php echo $author_id; ?>">are assigned to <?php echo $author_name; ?></option>
399 141 <?php endforeach; ?>
400 142 <option value="newuser">will be assigned to a new user...</option>
401 143 <option value="filter">get filtered out</option>
@@ -403,14 +145,36 @@
403 145
404 146 <span id="add-author-rule-newuser">named <input type="text" name="add_author_rule_newuser" value="" /></span>
405 147 </td>
406 148 </tr>
407 -</table>
149 +
150 +<tr>
151 +<th style="text-align: left; width: 15.0em">Unmatched authors</th>
152 +<td>
153 +<span>Authors who haven't been syndicated before</span>
154 + <select style="max-width: 27.0em" id="unfamiliar-author" name="unfamiliar_author" onchange="contextual_appearance('unfamiliar-author', 'unfamiliar-author-newuser', 'unfamiliar-author-default', 'newuser', 'inline');">
155 +<?php if ($page->for_feed_settings()) : ?>
156 + <option value="site-default"<?php print $unfamiliar['site-default']; ?>>are handled according to the default for all feeds</option>
157 +<?php endif; ?>
158 + <option value="create"<?php print $unfamiliar['create']; ?>>will have a new author account created for them</option>
159 + <?php foreach ($page->authorlist as $author_id => $author_name) : ?>
160 + <option value="<?php echo $author_id; ?>"<?php print (isset($unfamiliar[$author_id]) ? $unfamiliar[$author_id] : ''); ?>>will have their posts attributed to <?php echo $author_name; ?></option>
161 + <?php endforeach; ?>
162 + <option value="newuser">will have their posts attributed to a user named ...</option>
163 + <option value="filter"<?php print $unfamiliar['filter'] ?>>get filtered out</option>
164 + </select>
165 +
166 + <span id="unfamiliar-author-newuser"><input type="text" name="unfamiliar_author_newuser" value="" /></span></p>
408 167 </td>
409 168 </tr>
169 +</table></li>
170 +</ul>
171 +
172 +</td>
173 +</tr>
410 174 <?php endif; ?>
411 175
412 -<?php if (!(is_object($link) and $link->found())) : ?>
176 +<?php if ($page->for_default_settings()) : ?>
413 177 <tr>
414 178 <th scope="row">Matching Authors</th>
415 179 <td><ul style="list-style: none; margin: 0; padding: 0;">
416 180 <li><div><label><input id="match-author-by-email" type="checkbox" name="match_author_by_email" value="yes" <?php if ($match_author_by_email) : ?>checked="checked" <?php endif; ?>onchange="contextual_appearance('match-author-by-email', 'unless-null-email', null, 'yes', 'block', /*checkbox=*/ true);" /> Treat syndicated authors with the same e-mail address as the same author.</label></div>
@@ -421,52 +185,233 @@
421 185 </textarea>
422 186 </div></li>
423 187 </ul></td>
424 188 </tr>
425 -<?php else : ?>
426 -<th scope="row">Fixing mis-matched authors:</th>
427 -<td><p style="margin: 0.5em 0px">Take all the posts from this feed attributed to
428 -<select name="fix_mismatch_from">
429 -<?php foreach ($authorlist as $author_id => $author_name) : ?>
430 - <option value="<?php echo $author_id; ?>"><?php echo $author_name; ?></option>
431 -<?php endforeach; ?>
432 -</select>
433 -and instead
434 -<select id="fix-mismatch-to" name="fix_mismatch_to" onchange="contextual_appearance('fix-mismatch-to', 'fix-mismatch-to-newuser', null, 'newuser', 'inline');">
435 -<?php foreach ($authorlist as $author_id => $author_name) : ?>
436 - <option value="<?php echo $author_id; ?>">re-assign them to <?php echo $author_name; ?></option>
437 -<?php endforeach; ?>
438 - <option value="newuser">re-assign them to a new user...</option>
439 - <option value="filter">delete them</option>
440 -</select>
441 -
442 - <span id="fix-mismatch-to-newuser">named <input type="text" name="fix_mismatch_to_newuser" value="" /></span>
443 - <input type="submit" class="button" name="fix_mismatch" value="Fix it!" />
444 - </td>
445 -</td>
446 189 <?php endif; ?>
447 190 </tbody>
448 191 </table>
192 + <?php
193 + } /* FeedWordPressAuthorsPage::syndicated_authors_box () */
194 +
195 + /*static*/ function fix_authors_box ($page, $box = NULL) {
196 + ?>
197 + <table class="form-table">
198 + <tbody>
199 + <tr>
200 + <th scope="row">Fixing mis-matched authors:</th>
201 + <td><p style="margin: 0.5em 0px">Take all the posts from this feed attributed to
202 + <select name="fix_mismatch_from">
203 + <?php foreach ($page->authorlist as $author_id => $author_name) : ?>
204 + <option value="<?php echo $author_id; ?>"><?php echo $author_name; ?></option>
205 + <?php endforeach; ?>
206 + </select>
207 + and instead
208 + <select id="fix-mismatch-to" name="fix_mismatch_to" onchange="contextual_appearance('fix-mismatch-to', 'fix-mismatch-to-newuser', null, 'newuser', 'inline');">
209 + <?php foreach ($page->authorlist as $author_id => $author_name) : ?>
210 + <option value="<?php echo $author_id; ?>">re-assign them to <?php echo $author_name; ?></option>
211 + <?php endforeach; ?>
212 + <option value="newuser">re-assign them to a new user...</option>
213 + <option value="filter">delete them</option>
214 + </select>
449 215
450 -<p class="submit">
451 -<input class="button-primary" type="submit" name="save" value="Save Changes" />
452 -</p>
216 + <span id="fix-mismatch-to-newuser">named <input type="text" name="fix_mismatch_to_newuser" value="" /></span>
217 + <input type="submit" class="button" name="fix_mismatch" value="Fix it!" />
218 + </td>
219 + </tr>
220 + </tbody>
221 + </table>
222 + <?php
223 + } /* FeedWordPressAuthorsPage::fix_authors_box () */
453 224
225 + function display () {
226 + $this->boxes_by_methods = array(
227 + 'syndicated_authors_box' => __('Syndicated Authors'),
228 + 'fix_authors_box' => __('Reassign Authors'),
229 + );
230 + if ($this->for_default_settings()) :
231 + unset($this->boxes_by_methods['fix_authors_box']);
232 + endif;
233 +
234 + parent::display();
235 + ?>
454 236 <script type="text/javascript">
455 237 contextual_appearance('unfamiliar-author', 'unfamiliar-author-newuser', 'unfamiliar-author-default', 'newuser', 'inline');
456 -<?php if (is_object($link) and $link->found()) : ?>
457 -<?php for ($j=1; $j<=$i; $j++) : ?>
458 - contextual_appearance('author-rules-<?php echo $j; ?>', 'author-rules-<?php echo $j; ?>-newuser', 'author-rules-<?php echo $j; ?>-default', 'newuser', 'inline');
459 -<?php endfor; ?>
238 +</script>
239 +
240 +<?php if ($this->for_feed_settings()) : ?>
241 +<script type="text/javascript">
242 + jQuery('.author-rules').each ( function () {
243 + contextual_appearance(this.id, this.id+'-newuser', this.id+'-default', 'newuser', 'inline');
244 + } );
245 +
460 246 contextual_appearance('add-author-rule', 'add-author-rule-newuser', 'add-author-rule-default', 'newuser', 'inline');
461 247 contextual_appearance('fix-mismatch-to', 'fix-mismatch-to-newuser', null, 'newuser', 'inline');
462 -<?php else : ?>
248 +</script>
249 +<?php else : ?>
250 +<script type="text/javascript">
463 251 contextual_appearance('match-author-by-email', 'unless-null-email', null, 'yes', 'block', /*checkbox=*/ true);
464 -<?php endif; ?>
465 252 </script>
466 -</form>
467 -</div> <!-- class="wrap" -->
468 -<?php
469 -} /* function fwp_authors_page () */
253 +<?php endif;
254 + } /* FeedWordPressAuthorsPage::display () */
470 255
471 - fwp_authors_page();
256 + function accept_POST ($post) {
257 + if (isset($post['fix_mismatch']) and (strlen($post['fix_mismatch']) > 0)) :
258 + $this->fix_mismatch($post);
259 + else :
260 + parent::accept_POST($post);
261 + endif;
262 + }
263 +
264 + function fix_mismatch ($post) {
265 + global $wpdb;
266 +
267 + if ('newuser'==$post['fix_mismatch_to']) :
268 + $newuser_name = trim($post['fix_mismatch_to_newuser']);
269 + $to = fwp_insert_new_user($newuser_name);
270 + else :
271 + $to = $post['fix_mismatch_to'];
272 + endif;
273 +
274 + $from = (int) $post['fix_mismatch_from'];
275 + if (is_numeric($from)) :
276 + // Make a list of all the items by this author
277 + // syndicated from this feed...
278 + $post_ids = $wpdb->get_col("
279 + SELECT {$wpdb->posts}.id
280 + FROM {$wpdb->posts}, {$wpdb->postmeta}
281 + WHERE ({$wpdb->posts}.id = {$wpdb->postmeta}.post_id)
282 + AND {$wpdb->postmeta}.meta_key = 'syndication_feed_id'
283 + AND {$wpdb->postmeta}.meta_value = '{$this->link->id}'
284 + AND {$wpdb->posts}.post_author = '{$from}'
285 + ");
286 +
287 + if (count($post_ids) > 0) :
288 + $N = count($post_ids);
289 + $posts = 'post'.(($N==1) ? '' : 's');
290 +
291 + // Re-assign them all to the correct author
292 + if (is_numeric($to)) : // re-assign to a particular user
293 + $post_set = "(".implode(",", $post_ids).")";
294 +
295 + // Getting the revisions too, if there are any
296 + $parent_in_clause = "OR {$wpdb->posts}.post_parent IN $post_set";
297 +
298 + $wpdb->query("
299 + UPDATE {$wpdb->posts}
300 + SET post_author='{$to}'
301 + WHERE ({$wpdb->posts}.id IN $post_set
302 + $parent_in_clause)
303 + ");
304 + $this->mesg = sprintf(__("Re-assigned %d ${posts}."), $N);
305 +
306 + // ... and kill them all
307 + elseif ('filter'==$to) :
308 + foreach ($post_ids as $post_id) :
309 + wp_delete_post($post_id);
310 + endforeach;
311 +
312 + $this->mesg = sprintf(__("Deleted %d ${posts}."), $N);
313 + endif;
314 + else :
315 + $this->mesg = __("Couldn't find any posts that matched your criteria.");
316 + endif;
317 + endif;
318 + $this->updated = false;
319 + }
320 +
321 + function save_settings ($post) {
322 +
323 + if ($this->for_feed_settings()) :
324 + $alter = array ();
325 +
326 + // Unfamiliar author rule
327 + if (isset($post["unfamiliar_author"])) :
328 + if ('newuser'==$post['unfamiliar_author']) :
329 + $new_name = trim($post["unfamiliar_author_newuser"]);
330 + $this->link->map_name_to_new_user(/*name=*/ NULL, $new_name);
331 + else :
332 + $this->link->update_setting(
333 + "unfamiliar author",
334 + $post['unfamiliar_author'],
335 + 'site-default'
336 + );
337 + endif;
338 + endif;
339 +
340 + // Handle author mapping rules
341 + if (isset($post['author_rules_name'])
342 + and isset($post['author_rules_action'])) :
343 + if (isset($post['author_rules_name']['all'])) :
344 + if (strlen($post['author_rules_name']['all']) > 0) :
345 + $post['author_rules_name'] = array(
346 + 'all' => $post['author_rules_name']['all'],
347 + );
348 +
349 + // Erase all the rest.
350 + endif;
351 + endif;
352 +
353 + unset($this->link->settings['map authors']);
354 + foreach ($post['author_rules_name'] as $key => $name) :
355 + // Normalize for case and whitespace
356 + $name = strtolower(trim($name));
357 + $author_action = strtolower(trim($post['author_rules_action'][$key]));
358 +
359 + if (strlen($name) > 0) :
360 + if ('newuser' == $author_action) :
361 + $new_name = trim($post['author_rules_newuser'][$key]);
362 + $this->link->map_name_to_new_user($name, $new_name);
363 + else :
364 + $this->link->settings['map authors']['name'][$name] = $author_action;
365 + endif;
366 + endif;
367 + endforeach;
368 + endif;
369 +
370 + if (isset($post['add_author_rule_name'])
371 + and isset($post['add_author_rule_action'])) :
372 + $name = strtolower(trim($post['add_author_rule_name']));
373 + $author_action = strtolower(trim($post['add_author_rule_action']));
374 +
375 + if (strlen($name) > 0) :
376 + if ('newuser' == $author_action) :
377 + $new_name = trim($post['add_author_rule_newuser']);
378 + $this->link->map_name_to_new_user($name, $new_name);
379 + else :
380 + $this->link->settings['map authors']['name'][$name] = $author_action;
381 + endif;
382 + endif;
383 + endif;
384 + else :
385 + if ('newuser'==$post['unfamiliar_author']) :
386 + $new_name = trim($post['unfamiliar_author_newuser']);
387 + $new_id = fwp_insert_new_user($new_name);
388 + if (is_numeric($new_id)) :
389 + update_option('feedwordpress_unfamiliar_author', $new_id);
390 + else :
391 + // TODO: Add some error detection and reporting
392 + // Put WP_Error stuff into $this->mesg ?
393 + endif;
394 + else :
395 + update_option('feedwordpress_unfamiliar_author', $post['unfamiliar_author']);
396 + endif;
397 +
398 + update_option('feedwordpress_do_not_match_author_by_email',
399 + (isset($post['match_author_by_email'])
400 + and 'yes'==$post['match_author_by_email'])
401 + ? 'no'
402 + : 'yes'
403 + );
404 +
405 + if (isset($post['null_emails'])) :
406 + update_option('feedwordpress_null_email_set', $post['null_emails']);
407 + endif;
408 + endif;
409 +
410 + parent::save_settings($post);
411 + $this->refresh_author_list();
412 + }
413 +} /* class FeedWordPressAuthorsPage */
414 +
415 + $authorsPage = new FeedWordPressAuthorsPage;
416 + $authorsPage->display();
472 417