PluginProbe
FeedWordPress / 2009.0613
FeedWordPress v2009.0613
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 +390 -396 trunk2009.0613 View file →
@@ -1,85 +1,356 @@
1 1 <?php
2 -require_once dirname(__FILE__) . '/admin-ui.php';
2 +require_once(dirname(__FILE__) . '/admin-ui.php');
3 3
4 -class FeedWordPressAuthorsPage extends FeedWordPressAdminPage {
5 - var $authorlist = NULL;
6 - var $rule_count = 0;
4 +function fwp_authors_page () {
5 + global $wpdb, $wp_db_version;
7 6
8 - /**
9 - * Class constructor
10 - *
11 - * @param int $link ID of the feed in the Links.
12 - */
13 - public function __construct( $link = -1 ) {
14 - if ( is_numeric( $link ) and -1 == $link ) :
15 - $link = $this->submitted_link();
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'];
16 51 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').".";
17 83
18 - parent::__construct( 'feedwordpressauthors', $link );
19 - $this->refresh_author_list();
20 - $this->dispatch = 'feedwordpress_author_settings';
21 - $this->filename = __FILE__;
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 ();
22 98
23 - $this->pagenames = array(
24 - 'default' => 'Authors',
25 - 'settings-update' => 'Syndicated Authors',
26 - 'open-sheet' => 'Syndicated Author',
27 - );
28 - } /* construct() */
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;
29 129
30 - /**
31 - * Refreshes the author list and optionally sort it with the natural
32 - * alphanumeric sort algorithm.
33 - */
34 - function refresh_author_list() {
35 - $this->authorlist = fwp_author_list();
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;
36 142
37 - // Case-insensitive "natural" alphanumeric sort. Preserves key/value associations.
38 - if ( function_exists( 'natcasesort' ) ) :
39 - natcasesort( $this->authorlist );
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);
160 + 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 199 endif;
41 - } /* FeedWordPressAuthorsPage::refresh_author_list) */
200 + else :
201 + $updated_link = false;
202 + endif;
42 203
43 - /**
44 - * Displays the page box for the syndicated authors.
45 - *
46 - * @param FeedWordPressAuthorsPage $page FWP dashboard page.
47 - * @param string|null $box Page box (unused).
48 - */
49 - /*static*/ function syndicated_authors_box( $page, $box = NULL ) {
50 - /** @var SyndicatedLink|null An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings. */
51 - $link = $page->link; // unused? (gwyneth 20230920)
52 - $unfamiliar = array( 'create' => '','default' => '','filter' => '' );
204 + $unfamiliar = array ('create' => '','default' => '','filter' => '');
53 205
54 - if ( $page->for_feed_settings() ) :
55 - $key = $this->link->setting( 'unfamiliar author', NULL, 'site-default' );
56 - $unfamiliar['site-default'] = '';
57 - else :
58 - $key = FeedWordPress::on_unfamiliar('author');
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';
59 211 endif;
60 - $unfamiliar[$key] = true;
212 + else :
213 + $key = FeedWordPress::on_unfamiliar('author');
214 + endif;
61 215
62 - $match_author_by_email = ! ( 'yes' == get_option( "feedwordpress_do_not_match_author_by_email" ) );
63 - $null_emails = FeedWordPress::null_email_set();
216 + $unfamiliar[$key] = ' selected="selected"';
64 217
65 - // Hey ho, let's go...
66 - ?>
67 -<table class="form-table">
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; ?>" />
68 254 <?php
69 -if ( $page->for_default_settings() ) :
255 + else :
70 256 ?>
71 -<tr><th>Unmatched authors</th>
72 -<td><span>Authors who haven&rsquo;t been syndicated before</span>
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>
73 343 <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');">
74 - <option value="create"<?php fwp_selected_flag($unfamiliar, 'create'); ?>>will have a new author account created for them</option>
75 - <?php foreach ($page->authorlist as $author_id => $author_name) :
76 - if ( !isset($unfamiliar[$author_id])) : $unfamiliar[$author_id] = false; endif;
77 - ?>
78 - <option value="<?php echo esc_attr($author_id); ?>"<?php fwp_selected_flag($unfamiliar, $author_id); ?>>will have their posts attributed to <?php echo esc_html($author_name); ?></option>
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>
79 350 <?php endforeach; ?>
80 351 <option value="newuser">will have their posts attributed to a new user...</option>
81 - <option value="filter"<?php fwp_selected_flag($unfamiliar, 'filter'); ?>>get filtered out</option>
352 + <option value="filter"<?php print $unfamiliar['filter'] ?>>get filtered out</option>
82 353 </select>
83 354
84 355 <span id="unfamiliar-author-newuser">named <input type="text" name="unfamiliar_author_newuser" value="" /></span></p>
85 356 </td>
@@ -85,71 +356,37 @@
85 356 </td>
86 357 </tr>
87 358
88 359 <?php
89 -endif;
90 -
91 -if ($page->for_feed_settings()) :
92 - $map = $this->link->setting('map authors', NULL, array());
360 +if (is_object($link) and $link->found()) :
93 361 ?>
94 -<tr><th>Matching authors</th>
95 -<td><p>How should FeedWordPress attribute posts from this feed to WordPress
96 -authors?</p>
97 -<ul class="settings">
98 -<li><p><input type="radio" name="author_rules_name[all]" value="*"
99 -<?php if (isset($map['name']['*'])) : $author_action = $map['name']['*']; ?>
100 - checked="checked"
101 -<?php
102 - else :
103 - $author_action = NULL;
104 - endif; ?>
105 - /> All posts syndicated
106 -from this feed <select class="author-rules" id="author-rules-all"
107 -name="author_rules_action[all]" onchange="contextual_appearance('author-rules-all', 'author-rules-all-newuser', 'author-rules-all-default', 'newuser', 'inline');">
108 - <?php foreach ($page->authorlist as $local_author_id => $local_author_name) : ?>
109 - <option value="<?php echo esc_attr($local_author_id); ?>"<?php fwp_selected_flag($local_author_id==$author_action); ?>>are assigned to <?php echo esc_html($local_author_name); ?></option>
110 - <?php endforeach; ?>
111 - <option value="newuser">will be assigned to a new user...</option>
112 - <option value="filter"<?php fwp_selected_flag('filter'==$author_action); ?>>get filtered out</option>
113 - </select>
114 - <span class="author-rules-newuser" id="author-rules-all-newuser">named
115 - <input type="text" name="author_rules_newuser[all]" value="" /></span></p></li>
116 -<li><p><input type="radio" name="author_rules_name[all]" value=""
117 -<?php if ( !isset($map['name']['*'])) : ?>
118 - checked="checked"
119 -<?php endif; ?>
120 -/> Attribute posts to authors based on automatic mapping rules. (Blank out a
121 -name to delete the rule. Fill in a new name at the bottom to create a new rule.)</p>
122 -
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>
123 364 <table style="width: 100%">
124 365 <?php
125 - if (isset($this->link->settings['map authors'])) :
366 + if (isset($link->settings['map authors'])) :
126 367 ?>
127 368 <?php
128 - $page->rule_count=0;
129 - foreach ($this->link->settings['map authors'] as $author_rules) :
369 + $i=0;
370 + foreach ($link->settings['map authors'] as $author_rules) :
130 371 foreach ($author_rules as $author_name => $author_action) :
131 - if ($author_name != '*') :
132 - $page->rule_count++;
133 - $authorRulesId = sanitize_html_class(sprintf("author-rules-%d", $page->rule_count));
372 + $i++;
134 373 ?>
135 374 <tr>
136 -<th style="text-align: left; width: 15.0em">Posts by <input type="text" name="author_rules_name[]" value="<?php echo esc_attr($author_name); ?>" size="11" /></th>
375 +<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>
137 376 <td>
138 - <select class="author-rules" id="<?php echo esc_attr($authorRulesId); ?>" name="author_rules_action[]" onchange="contextual_appearance('<?php echo esc_attr($authorRulesId); ?>', '<?php echo esc_attr($authorRulesId); ?>-newuser', '<?php echo esc_attr($authorRulesId); ?>-default', 'newuser', 'inline');">
139 - <?php foreach ($page->authorlist as $local_author_id => $local_author_name) : ?>
140 - <option value="<?php echo esc_attr($local_author_id); ?>"<?php fwp_selected_flag($local_author_id==$author_action); ?>>are assigned to <?php echo esc_attr($local_author_name); ?></option>
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) : ?>
379 + <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>
141 380 <?php endforeach; ?>
142 381 <option value="newuser">will be assigned to a new user...</option>
143 - <option value="filter"<?php fwp_selected_flag('filter'==$author_action); ?>>get filtered out</option>
382 + <option value="filter"<?php if ('filter'==$author_action) : echo ' selected="selected"'; endif; ?>>get filtered out</option>
144 383 </select>
145 -
146 - <span class="author-rules-newuser" id="<?php echo esc_attr($authorRulesId); ?>-newuser">named <input type="text" name="author_rules_newuser[]" value="" /></span>
384 +
385 + <span id="author-rules-<?php echo $i; ?>-newuser">named <input type="text" name="author_rules_newuser[]" value="" /></span>
147 386 </td>
148 387 </tr>
149 -<?php
150 - endif;
151 - endforeach;
388 +<?php endforeach;
152 389 endforeach;
153 390 endif;
154 391 ?>
155 392
@@ -156,323 +393,80 @@
156 393 <tr>
157 394 <th style="text-align: left; width: 15.0em">Posts by <input type="text" name="add_author_rule_name" size="11" /></th>
158 395 <td>
159 396 <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');">
160 - <?php foreach ($page->authorlist as $author_id => $author_name) : ?>
161 - <option value="<?php echo esc_attr($author_id); ?>">are assigned to <?php echo esc_html($author_name); ?></option>
397 + <?php foreach ($authorlist as $author_id => $author_name) : ?>
398 + <option value="<?php echo $author_id; ?>">are assigned to <?php echo $author_name; ?></option>
162 399 <?php endforeach; ?>
163 400 <option value="newuser">will be assigned to a new user...</option>
164 401 <option value="filter">get filtered out</option>
165 402 </select>
166 -
403 +
167 404 <span id="add-author-rule-newuser">named <input type="text" name="add_author_rule_newuser" value="" /></span>
168 405 </td>
169 406 </tr>
170 -
171 -<tr>
172 -<th style="text-align: left; width: 15.0em">Unmatched authors</th>
173 -<td>
174 -<span>Authors who haven't been syndicated before</span>
175 - <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');">
176 -<?php if ($page->for_feed_settings()) : ?>
177 - <option value="site-default"<?php fwp_selected_flag($unfamiliar, 'site-default'); ?>>are handled according to the default for all feeds</option>
178 -<?php endif; ?>
179 - <option value="create"<?php fwp_selected_flag($unfamiliar, 'create'); ?>>will have a new author account created for them</option>
180 - <?php foreach ( $page->authorlist as $author_id => $author_name ) : ?>
181 - <option value="<?php echo esc_attr($author_id); ?>"<?php fwp_selected_flag($unfamiliar, $author_id); ?>>will have their posts attributed to <?php echo esc_html($author_name); ?></option>
182 - <?php endforeach; ?>
183 - <option value="newuser">will have their posts attributed to a user named ...</option>
184 - <option value="filter"<?php fwp_selected_flag($unfamiliar, 'filter'); ?>>get filtered out</option>
185 - </select>
186 -
187 - <span id="unfamiliar-author-newuser"><input type="text" name="unfamiliar_author_newuser" value="" /></span></p>
407 +</table>
188 408 </td>
189 409 </tr>
190 -</table></li>
191 -</ul>
192 -
193 -</td>
194 -</tr>
195 410 <?php endif; ?>
196 411
197 -<?php if ( $page->for_default_settings() ) : ?>
412 +<?php if (!(is_object($link) and $link->found())) : ?>
198 413 <tr>
199 414 <th scope="row">Matching Authors</th>
200 415 <td><ul style="list-style: none; margin: 0; padding: 0;">
201 -<li><div><label><input id="match-author-by-email" type="checkbox" name="match_author_by_email" value="yes" <?php fwp_selected_flag($match_author_by_email, null, "checked"); ?> 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>
416 +<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>
202 417 <div id="unless-null-email">
203 418 <p>Unless the e-mail address is one of the following anonymous e-mail addresses:</p>
204 419 <textarea name="null_emails" rows="3" style="width: 100%">
205 -<?php print esc_html(implode("\n", $null_emails)); ?>
420 +<?php print implode("\n", $null_emails); ?>
206 421 </textarea>
207 422 </div></li>
208 423 </ul></td>
209 424 </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>
210 446 <?php endif; ?>
211 447 </tbody>
212 448 </table>
213 - <?php
214 - } /* FeedWordPressAuthorsPage::syndicated_authors_box() */
215 449
216 - /**
217 - * Displays a box for fixing mismatched authors.
218 - *
219 - * @param FeedWordPressAuthorsPage $page FWP dashboard page.
220 - * @param string|null $box Page box (unused).
221 - */
222 - /*static*/ function fix_authors_box( $page, $box = NULL )
223 - {
224 - ?>
225 - <table class="form-table">
226 - <tbody>
227 - <tr>
228 - <th scope="row">Fixing mis-matched authors:</th>
229 - <td><p style="margin: 0.5em 0px">Take all the posts from this feed attributed to
230 - <select name="fix_mismatch_from">
231 - <?php foreach ( $page->authorlist as $author_id => $author_name ) : ?>
232 - <option value="<?php echo esc_attr( $author_id ); ?>"><?php echo esc_html( $author_name ); ?></option>
233 - <?php endforeach; ?>
234 - </select>
235 - and instead
236 - <select id="fix-mismatch-to" name="fix_mismatch_to" onchange="contextual_appearance('fix-mismatch-to', 'fix-mismatch-to-newuser', null, 'newuser', 'inline');">
237 - <?php foreach ($page->authorlist as $author_id => $author_name) : ?>
238 - <option value="<?php echo esc_attr($author_id); ?>">re-assign them to <?php echo esc_html($author_name); ?></option>
239 - <?php endforeach; ?>
240 - <option value="newuser">re-assign them to a new user...</option>
241 - <option value="filter">delete them</option>
242 - </select>
450 +<p class="submit">
451 +<input class="button-primary" type="submit" name="save" value="Save Changes" />
452 +</p>
243 453
244 - <span id="fix-mismatch-to-newuser">named <input type="text" name="fix_mismatch_to_newuser" value="" /></span>
245 - <input type="submit" class="button" name="fix_mismatch" value="Fix it!" />
246 - </td>
247 - </tr>
248 - </tbody>
249 - </table>
250 - <?php
251 - } /* FeedWordPressAuthorsPage::fix_authors_box() */
252 -
253 - function display() {
254 - $this->boxes_by_methods = array(
255 - 'syndicated_authors_box' => __('Syndicated Authors'),
256 - 'fix_authors_box' => __('Reassign Authors'),
257 - );
258 - if ($this->for_default_settings()) :
259 - unset($this->boxes_by_methods['fix_authors_box']);
260 - endif;
261 -
262 - parent::display();
263 - ?>
264 454 <script type="text/javascript">
265 455 contextual_appearance('unfamiliar-author', 'unfamiliar-author-newuser', 'unfamiliar-author-default', 'newuser', 'inline');
266 -</script>
267 -
268 -<?php if ($this->for_feed_settings()) : ?>
269 -<script type="text/javascript">
270 - jQuery('.author-rules').each ( function () {
271 - contextual_appearance(this.id, this.id+'-newuser', this.id+'-default', 'newuser', 'inline');
272 - } );
273 -
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; ?>
274 460 contextual_appearance('add-author-rule', 'add-author-rule-newuser', 'add-author-rule-default', 'newuser', 'inline');
275 461 contextual_appearance('fix-mismatch-to', 'fix-mismatch-to-newuser', null, 'newuser', 'inline');
276 -</script>
277 -<?php else : ?>
278 -<script type="text/javascript">
462 +<?php else : ?>
279 463 contextual_appearance('match-author-by-email', 'unless-null-email', null, 'yes', 'block', /*checkbox=*/ true);
464 +<?php endif; ?>
280 465 </script>
281 -<?php endif;
282 - } /* FeedWordPressAuthorsPage::display () */
466 +</form>
467 +</div> <!-- class="wrap" -->
468 +<?php
469 +} /* function fwp_authors_page () */
283 470
284 - /**
285 - * Checks if a mismatch fix was requested.
286 - *
287 - * @return bool True if a fix was requested and not empty.
288 - */
289 - public function fix_mismatch_requested() {
290 - /** @var string|null */
291 - $fix = FeedWordPress::post( 'fix_mismatch' );
292 - return ( ! is_null( $fix ) && strlen( $fix ) > 0 ); // possibly the same as `( ! empty( $fix ) )`.
293 - } /* FeedWordPressAuthorsPage::fix_mismatch_requested() */
471 + fwp_authors_page();
294 472
295 - /**
296 - * If a mismatch fix was requested, handles it here;
297 - * else sends it to the parent class for processing.
298 - */
299 - public function accept_POST() {
300 - if ( self::fix_mismatch_requested() ) :
301 - $this->fix_mismatch();
302 - else :
303 - parent::accept_POST();
304 - endif;
305 - } /* FeedWordPressAuthorsPage::accept_POST() */
306 -
307 - /**
308 - * Fixes an author mismatch.
309 - */
310 - function fix_mismatch() {
311 - global $wpdb;
312 -
313 - $to = FeedWordPress::post( 'fix_mismatch_to' );
314 -// if ( 'newuser' === $fix_to ) : // will _always_ be false, since $fix_to is not called from anywhere (gwyneth 20230915)
315 - if ( 'newuser' === $to ) : // probably this is what was intended! (gwyneth 20230920)
316 - $newuser_name = trim( FeedWordPress::post( 'fix_mismatch_to_newuser', '' ) );
317 - $to = fwp_insert_new_user( $newuser_name );
318 - endif;
319 -
320 - $from = (int) FeedWordPress::post( 'fix_mismatch_from' );
321 - if ( is_numeric( $from ) ) :
322 -
323 - // Make a list of all the items by this author
324 - // syndicated from this feed...
325 - $post_ids = $wpdb->get_col("
326 - SELECT {$wpdb->posts}.id
327 - FROM {$wpdb->posts}, {$wpdb->postmeta}
328 - WHERE ({$wpdb->posts}.id = {$wpdb->postmeta}.post_id)
329 - AND {$wpdb->postmeta}.meta_key = 'syndication_feed_id'
330 - AND {$wpdb->postmeta}.meta_value = '{$this->link->id}'
331 - AND {$wpdb->posts}.post_author = '{$from}'
332 - ");
333 -
334 - if ( count( $post_ids ) > 0 ) :
335 - $N = count( $post_ids );
336 -
337 - // $posts = 'post'.(($N==1) ? '' : 's'); // Wordpress has _n() for plurals... (gwyneth 20230920)
338 - $posts = sprintf( _n( '%s post', '%s posts', $N, 'text-domain' ), number_format_i18n( $N ) );
339 -
340 - // Re-assign them all to the correct author
341 - if ( is_numeric( $to ) ) : // re-assign to a particular user
342 - $post_set = "(" . implode( ",", $post_ids ) . ")";
343 -
344 - // Getting the revisions too, if there are any
345 - $parent_in_clause = "OR {$wpdb->posts}.post_parent IN $post_set";
346 -
347 - $wpdb->query("
348 - UPDATE {$wpdb->posts}
349 - SET post_author='{$to}'
350 - WHERE ({$wpdb->posts}.id IN $post_set
351 - $parent_in_clause)
352 - ");
353 - // $this->mesg = sprintf(__("Re-assigned %d {$posts}."), $N); // see comment abpve
354 - $this->mesg = __( "Re-assigned " ) . $posts;
355 -
356 - // ... and kill them all
357 - elseif ( 'filter' == $to ) :
358 - foreach ( $post_ids as $post_id ) :
359 - wp_delete_post( $post_id );
360 - endforeach;
361 -
362 - $this->mesg = __( "Deleted " ) . $posts;
363 - endif;
364 - else :
365 - $this->mesg = __("Couldn't find any posts that matched your criteria.");
366 - endif;
367 - endif;
368 - $this->updated = false;
369 - } /* FeedWordPressAuthorsPage::fix_mismatch() */
370 -
371 - /**
372 - * Presumably saves settings...
373 - *
374 - * @return void description
375 - */
376 - function save_settings () {
377 - if ($this->for_feed_settings()) :
378 - // $alter = array(); // what is this array? It's never used. (gwyneth 20230920)
379 -
380 - // Unfamiliar author rule
381 - $unfamiliar_author = FeedWordPress::post( 'unfamiliar_author' );
382 - if ( ! is_null( $unfamiliar_author ) ) :
383 - if ( 'newuser' == $unfamiliar_author ) :
384 - $new_name = trim( FeedWordPress::post( "unfamiliar_author_newuser" ) );
385 - $this->link->map_name_to_new_user(/*name=*/ null, $new_name);
386 - else :
387 - $this->link->update_setting(
388 - "unfamiliar author",
389 - $unfamiliar_author,
390 - 'site-default'
391 - );
392 - endif;
393 - endif;
394 -
395 - // Handle author mapping rules
396 - $author_rules_name = FeedWordPress::post( 'author_rules_name' );
397 - $author_rules_action = FeedWordPress::post('author_rules_action' );
398 - if ( ! ( is_null( $author_rules_name ) || is_null( $author_rules_action ) ) ) :
399 - if ( isset( $author_rules_name['all'] ) ) :
400 - if ( strlen( $author_rules_name['all']) > 0 ) :
401 - $author_rules_name = array(
402 - 'all' => $author_rules_name['all'],
403 - );
404 -
405 - // Erase all the rest.
406 - endif;
407 - endif;
408 -
409 - unset($this->link->settings['map authors']);
410 - foreach ($author_rules_name as $key => $name) :
411 - // Normalize for case and whitespace
412 - $name = strtolower( trim( $name ) );
413 - $author_action = strtolower( trim( $author_rules_action[$key] ) );
414 -
415 - $author_rules_newuser = FeedWordPress::post('author_rules_newuser' );
416 - if ( strlen($name) > 0 ) :
417 - if ( 'newuser' == $author_action ) :
418 - $new_name = trim( $author_rules_newuser[ $key ] );
419 - $this->link->map_name_to_new_user($name, $new_name);
420 - else :
421 - $this->link->settings['map authors']['name'][$name] = $author_action;
422 - endif;
423 - endif;
424 - endforeach;
425 - endif;
426 -
427 - $name = FeedWordPress::post( 'add_author_rule_name');
428 - $author_action = FeedWordPress::post( 'add_author_rule_action' );
429 - if ( ! ( is_null( $name ) || is_null( $author_action ) ) ) :
430 - $name = strtolower( trim( $name ) );
431 - $author_action = strtolower( trim( $author_action ) );
432 -
433 - if (strlen($name) > 0) :
434 - if ('newuser' == $author_action) :
435 - $new_name = trim( FeedWordPress::post( 'add_author_rule_newuser' ));
436 - $this->link->map_name_to_new_user($name, $new_name);
437 - else :
438 - $this->link->settings['map authors']['name'][$name] = $author_action;
439 - endif;
440 - endif;
441 - endif;
442 -
443 - else :
444 -
445 - $unfamiliar_author = FeedWordPress::post( 'unfamiliar_author' );
446 - if ( 'newuser' === $unfamiliar_author ) :
447 - $new_name = FeedWordPress::post( 'unfamiliar_author_newuser' );
448 - $new_id = fwp_insert_new_user( trim( $new_name ) );
449 - if ( is_numeric( $new_id ) ) :
450 - update_option( 'feedwordpress_unfamiliar_author', $new_id );
451 - else :
452 - // TODO: Add some error detection and reporting
453 - // Put WP_Error stuff into $this->mesg ?
454 - endif;
455 - else :
456 - update_option( 'feedwordpress_unfamiliar_author', $unfamiliar_author );
457 - endif;
458 -
459 - $by_email = FeedWordPress::post( 'match_author_by_email' );
460 - update_option(
461 - 'feedwordpress_do_not_match_author_by_email',
462 - ( isset( $by_email ) && 'yes' == $by_email ) ? 'no' : 'yes'
463 - );
464 -
465 - $null_emails = FeedWordPress::post( 'null_emails', null, 'textarea' );
466 - if ( ! is_null( $null_emails ) ) :
467 - update_option( 'feedwordpress_null_email_set', $null_emails );
468 - endif;
469 - endif;
470 -
471 - parent::save_settings();
472 - $this->refresh_author_list();
473 - } /* FeedWordPressAuthorsPage::save_settings() */
474 -
475 -} /* class FeedWordPressAuthorsPage */
476 -
477 -$authorsPage = new FeedWordPressAuthorsPage;
478 -$authorsPage->display();