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
feedwordpress / authors-page.php

authors-page.php in FeedWordPress 2011.0512, at authors-page.php

418 lines 15.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 require_once(dirname(__FILE__) . '/admin-ui.php');
3
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();
11 endif;
12
13 FeedWordPressAdminPage::FeedWordPressAdminPage('feedwordpressauthors', $link);
14 $this->refresh_author_list();
15 $this->dispatch = 'feedwordpress_author_settings';
16 $this->filename = __FILE__;
17
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();
27
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' => '');
35
36 if ($page->for_feed_settings()) :
37 $key = $this->link->setting('unfamiliar author', NULL, 'site-default');
38 $unfamiliar['site-default'] = '';
39 else :
40 $key = FeedWordPress::on_unfamiliar('author');
41 endif;
42 $unfamiliar[$key] = ' selected="selected"';
43
44 $match_author_by_email = !('yes' == get_option("feedwordpress_do_not_match_author_by_email"));
45 $null_emails = FeedWordPress::null_email_set();
46
47 // Hey ho, let's go...
48 ?>
49 <table class="form-table">
50 <?php
51 if ($page->for_default_settings()) :
52 ?>
53 <tr><th>Unmatched authors</th>
54 <td><span>Authors who haven&#8217;t been syndicated before</span>
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');">
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>
59 <?php endforeach; ?>
60 <option value="newuser">will have their posts attributed to a new user...</option>
61 <option value="filter"<?php print $unfamiliar['filter'] ?>>get filtered out</option>
62 </select>
63
64 <span id="unfamiliar-author-newuser">named <input type="text" name="unfamiliar_author_newuser" value="" /></span></p>
65 </td>
66 </tr>
67
68 <?php
69 endif;
70
71 if ($page->for_feed_settings()) :
72 $map = $this->link->setting('map authors', NULL, array());
73 ?>
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
103 <table style="width: 100%">
104 <?php
105 if (isset($this->link->settings['map authors'])) :
106 ?>
107 <?php
108 $page->rule_count=0;
109 foreach ($this->link->settings['map authors'] as $author_rules) :
110 foreach ($author_rules as $author_name => $author_action) :
111 if ($author_name != '*') :
112 $page->rule_count++;
113 ?>
114 <tr>
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>
116 <td>
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) : ?>
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>
120 <?php endforeach; ?>
121 <option value="newuser">will be assigned to a new user...</option>
122 <option value="filter"<?php if ('filter'==$author_action) : echo ' selected="selected"'; endif; ?>>get filtered out</option>
123 </select>
124
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>
126 </td>
127 </tr>
128 <?php
129 endif;
130 endforeach;
131 endforeach;
132 endif;
133 ?>
134
135 <tr>
136 <th style="text-align: left; width: 15.0em">Posts by <input type="text" name="add_author_rule_name" size="11" /></th>
137 <td>
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');">
139 <?php foreach ($page->authorlist as $author_id => $author_name) : ?>
140 <option value="<?php echo $author_id; ?>">are assigned to <?php echo $author_name; ?></option>
141 <?php endforeach; ?>
142 <option value="newuser">will be assigned to a new user...</option>
143 <option value="filter">get filtered out</option>
144 </select>
145
146 <span id="add-author-rule-newuser">named <input type="text" name="add_author_rule_newuser" value="" /></span>
147 </td>
148 </tr>
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>
167 </td>
168 </tr>
169 </table></li>
170 </ul>
171
172 </td>
173 </tr>
174 <?php endif; ?>
175
176 <?php if ($page->for_default_settings()) : ?>
177 <tr>
178 <th scope="row">Matching Authors</th>
179 <td><ul style="list-style: none; margin: 0; padding: 0;">
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>
181 <div id="unless-null-email">
182 <p>Unless the e-mail address is one of the following anonymous e-mail addresses:</p>
183 <textarea name="null_emails" rows="3" style="width: 100%">
184 <?php print implode("\n", $null_emails); ?>
185 </textarea>
186 </div></li>
187 </ul></td>
188 </tr>
189 <?php endif; ?>
190 </tbody>
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>
215
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 () */
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 ?>
236 <script type="text/javascript">
237 contextual_appearance('unfamiliar-author', 'unfamiliar-author-newuser', 'unfamiliar-author-default', 'newuser', 'inline');
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
246 contextual_appearance('add-author-rule', 'add-author-rule-newuser', 'add-author-rule-default', 'newuser', 'inline');
247 contextual_appearance('fix-mismatch-to', 'fix-mismatch-to-newuser', null, 'newuser', 'inline');
248 </script>
249 <?php else : ?>
250 <script type="text/javascript">
251 contextual_appearance('match-author-by-email', 'unless-null-email', null, 'yes', 'block', /*checkbox=*/ true);
252 </script>
253 <?php endif;
254 } /* FeedWordPressAuthorsPage::display () */
255
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();
417
418