PluginProbe
FeedWordPress / trunk
FeedWordPress vtrunk
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 trunk, at authors-page.php

479 lines 18.6 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 /**
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();
16 endif;
17
18 parent::__construct( 'feedwordpressauthors', $link );
19 $this->refresh_author_list();
20 $this->dispatch = 'feedwordpress_author_settings';
21 $this->filename = __FILE__;
22
23 $this->pagenames = array(
24 'default' => 'Authors',
25 'settings-update' => 'Syndicated Authors',
26 'open-sheet' => 'Syndicated Author',
27 );
28 } /* construct() */
29
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();
36
37 // Case-insensitive "natural" alphanumeric sort. Preserves key/value associations.
38 if ( function_exists( 'natcasesort' ) ) :
39 natcasesort( $this->authorlist );
40 endif;
41 } /* FeedWordPressAuthorsPage::refresh_author_list) */
42
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' => '' );
53
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');
59 endif;
60 $unfamiliar[$key] = true;
61
62 $match_author_by_email = ! ( 'yes' == get_option( "feedwordpress_do_not_match_author_by_email" ) );
63 $null_emails = FeedWordPress::null_email_set();
64
65 // Hey ho, let's go...
66 ?>
67 <table class="form-table">
68 <?php
69 if ( $page->for_default_settings() ) :
70 ?>
71 <tr><th>Unmatched authors</th>
72 <td><span>Authors who haven&rsquo;t been syndicated before</span>
73 <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>
79 <?php endforeach; ?>
80 <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>
82 </select>
83
84 <span id="unfamiliar-author-newuser">named <input type="text" name="unfamiliar_author_newuser" value="" /></span></p>
85 </td>
86 </tr>
87
88 <?php
89 endif;
90
91 if ($page->for_feed_settings()) :
92 $map = $this->link->setting('map authors', NULL, array());
93 ?>
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
123 <table style="width: 100%">
124 <?php
125 if (isset($this->link->settings['map authors'])) :
126 ?>
127 <?php
128 $page->rule_count=0;
129 foreach ($this->link->settings['map authors'] as $author_rules) :
130 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));
134 ?>
135 <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>
137 <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>
141 <?php endforeach; ?>
142 <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>
144 </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>
147 </td>
148 </tr>
149 <?php
150 endif;
151 endforeach;
152 endforeach;
153 endif;
154 ?>
155
156 <tr>
157 <th style="text-align: left; width: 15.0em">Posts by <input type="text" name="add_author_rule_name" size="11" /></th>
158 <td>
159 <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>
162 <?php endforeach; ?>
163 <option value="newuser">will be assigned to a new user...</option>
164 <option value="filter">get filtered out</option>
165 </select>
166
167 <span id="add-author-rule-newuser">named <input type="text" name="add_author_rule_newuser" value="" /></span>
168 </td>
169 </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>
188 </td>
189 </tr>
190 </table></li>
191 </ul>
192
193 </td>
194 </tr>
195 <?php endif; ?>
196
197 <?php if ( $page->for_default_settings() ) : ?>
198 <tr>
199 <th scope="row">Matching Authors</th>
200 <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>
202 <div id="unless-null-email">
203 <p>Unless the e-mail address is one of the following anonymous e-mail addresses:</p>
204 <textarea name="null_emails" rows="3" style="width: 100%">
205 <?php print esc_html(implode("\n", $null_emails)); ?>
206 </textarea>
207 </div></li>
208 </ul></td>
209 </tr>
210 <?php endif; ?>
211 </tbody>
212 </table>
213 <?php
214 } /* FeedWordPressAuthorsPage::syndicated_authors_box() */
215
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>
243
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 <script type="text/javascript">
265 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
274 contextual_appearance('add-author-rule', 'add-author-rule-newuser', 'add-author-rule-default', 'newuser', 'inline');
275 contextual_appearance('fix-mismatch-to', 'fix-mismatch-to-newuser', null, 'newuser', 'inline');
276 </script>
277 <?php else : ?>
278 <script type="text/javascript">
279 contextual_appearance('match-author-by-email', 'unless-null-email', null, 'yes', 'block', /*checkbox=*/ true);
280 </script>
281 <?php endif;
282 } /* FeedWordPressAuthorsPage::display () */
283
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() */
294
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();
479