Co-Authors Plus - Version 3.0.5

Version Description

(Feb. 18, 2013) = * New filter 'coauthors_search_authors_get_terms_args' allows you to increase the number of matches returned with AJAX co-author selection * Bug fix: If there isn't an author term yet for a co-author, avoid an erronous join that caused duplicate posts to appear.

Download this release

Release Info

Developer danielbachhuber
Plugin Icon wp plugin Co-Authors Plus
Version 3.0.5
Comparing to
See all releases

Code changes from version 3.0.4 to 3.0.5

co-authors-plus.php CHANGED
@@ -3,9 +3,9 @@
3
  Plugin Name: Co-Authors Plus
4
  Plugin URI: http://wordpress.org/extend/plugins/co-authors-plus/
5
  Description: Allows multiple authors to be assigned to a post. This plugin is an extended version of the Co-Authors plugin developed by Weston Ruter.
6
- Version: 3.0.4
7
  Author: Mohammad Jangda, Daniel Bachhuber, Automattic
8
- Copyright: 2008-2012 Shared and distributed between Mohammad Jangda, Daniel Bachhuber, Weston Ruter
9
 
10
  GNU General Public License, Free Software Foundation <http://creativecommons.org/licenses/GPL/2.0/>
11
  This program is free software; you can redistribute it and/or modify
@@ -24,7 +24,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24
 
25
  */
26
 
27
- define( 'COAUTHORS_PLUS_VERSION', '3.0.4' );
28
 
29
  define( 'COAUTHORS_PLUS_PATH', dirname( __FILE__ ) );
30
  define( 'COAUTHORS_PLUS_URL', plugin_dir_url( __FILE__ ) );
@@ -512,6 +512,9 @@ class coauthors_plus {
512
  if ( !empty( $query->query_vars['post_type'] ) && !is_object_in_taxonomy( $query->query_vars['post_type'], $this->coauthor_taxonomy ) )
513
  return $join;
514
 
 
 
 
515
  // Check to see that JOIN hasn't already been added. Props michaelingp and nbaxley
516
  $term_relationship_join = " INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)";
517
  $term_taxonomy_join = " INNER JOIN {$wpdb->term_taxonomy} ON ( {$wpdb->term_relationships}.term_taxonomy_id = {$wpdb->term_taxonomy}.term_taxonomy_id )";
@@ -889,6 +892,7 @@ class coauthors_plus {
889
  'get' => 'all',
890
  'number' => 10,
891
  );
 
892
  add_filter( 'terms_clauses', array( $this, 'filter_terms_clauses' ) );
893
  $found_terms = get_terms( $this->coauthor_taxonomy, $args );
894
  remove_filter( 'terms_clauses', array( $this, 'filter_terms_clauses' ) );
3
  Plugin Name: Co-Authors Plus
4
  Plugin URI: http://wordpress.org/extend/plugins/co-authors-plus/
5
  Description: Allows multiple authors to be assigned to a post. This plugin is an extended version of the Co-Authors plugin developed by Weston Ruter.
6
+ Version: 3.0.5
7
  Author: Mohammad Jangda, Daniel Bachhuber, Automattic
8
+ Copyright: 2008-2013 Shared and distributed between Mohammad Jangda, Daniel Bachhuber, Weston Ruter
9
 
10
  GNU General Public License, Free Software Foundation <http://creativecommons.org/licenses/GPL/2.0/>
11
  This program is free software; you can redistribute it and/or modify
24
 
25
  */
26
 
27
+ define( 'COAUTHORS_PLUS_VERSION', '3.0.5' );
28
 
29
  define( 'COAUTHORS_PLUS_PATH', dirname( __FILE__ ) );
30
  define( 'COAUTHORS_PLUS_URL', plugin_dir_url( __FILE__ ) );
512
  if ( !empty( $query->query_vars['post_type'] ) && !is_object_in_taxonomy( $query->query_vars['post_type'], $this->coauthor_taxonomy ) )
513
  return $join;
514
 
515
+ if ( empty( $this->having_terms ) )
516
+ return $join;
517
+
518
  // Check to see that JOIN hasn't already been added. Props michaelingp and nbaxley
519
  $term_relationship_join = " INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)";
520
  $term_taxonomy_join = " INNER JOIN {$wpdb->term_taxonomy} ON ( {$wpdb->term_relationships}.term_taxonomy_id = {$wpdb->term_taxonomy}.term_taxonomy_id )";
892
  'get' => 'all',
893
  'number' => 10,
894
  );
895
+ $args = apply_filters( 'coauthors_search_authors_get_terms_args', $args );
896
  add_filter( 'terms_clauses', array( $this, 'filter_terms_clauses' ) );
897
  $found_terms = get_terms( $this->coauthor_taxonomy, $args );
898
  remove_filter( 'terms_clauses', array( $this, 'filter_terms_clauses' ) );
php/class-wp-cli.php CHANGED
@@ -44,6 +44,73 @@ class CoAuthorsPlus_Command extends WP_CLI_Command {
44
 
45
  }
46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  /**
48
  * Subcommand to assign coauthors to a post based on a given meta key
49
  *
44
 
45
  }
46
 
47
+ /**
48
+ * Create author terms for all posts that don't have them
49
+ *
50
+ * @subcommand create-terms-for-posts
51
+ */
52
+ public function create_terms_for_posts() {
53
+ global $coauthors_plus, $wp_post_types;
54
+
55
+ // Cache these to prevent repeated lookups
56
+ $authors = array();
57
+ $author_terms = array();
58
+
59
+ $args = array(
60
+ 'order' => 'ASC',
61
+ 'orderby' => 'ID',
62
+ 'post_type' => $coauthors_plus->supported_post_types,
63
+ 'posts_per_page' => 100,
64
+ 'paged' => 1,
65
+ 'update_meta_cache' => false,
66
+ );
67
+
68
+ $posts = new WP_Query( $args );
69
+ $affected = 0;
70
+ $count = 0;
71
+ WP_CLI::line( "Now inspecting or updating {$posts->found_posts} total posts." );
72
+ while( $posts->post_count ) {
73
+
74
+ foreach( $posts->posts as $single_post ) {
75
+
76
+ $count++;
77
+
78
+ $terms = wp_get_post_terms( $single_post->ID, $coauthors_plus->coauthor_taxonomy );
79
+ if ( is_wp_error( $terms ) )
80
+ WP_CLI::error( $terms->get_error_message() );
81
+
82
+ if ( ! empty( $terms ) ) {
83
+ WP_CLI::line( "{$count}/{$posts->found_posts}) Skipping - Post #{$single_post->ID} '{$single_post->post_title}' already has these terms: " . implode( ', ', wp_list_pluck( $terms, 'name' ) ) );
84
+ continue;
85
+ }
86
+
87
+ $author = ( ! empty( $authors[$single_post->post_author] ) ) ? $authors[$single_post->post_author] : get_user_by( 'id', $single_post->post_author );
88
+ $authors[$single_post->post_author] = $author;
89
+
90
+ $author_term = ( ! empty( $author_terms[$single_post->post_author] ) ) ? $author_terms[$single_post->post_author] : $coauthors_plus->update_author_term( $author );
91
+ $author_terms[$single_post->post_author] = $author_term;
92
+
93
+ wp_set_post_terms( $single_post->ID, array( $author_term->slug ), $coauthors_plus->coauthor_taxonomy );
94
+ WP_CLI::line( "{$count}/{$posts->found_posts}) Added - Post #{$single_post->ID} '{$single_post->post_title}' now has an author term for: " . $author->user_nicename );
95
+ $affected++;
96
+ if ( $affected && $affected % 10 == 0 )
97
+ sleep( 3 );
98
+ }
99
+
100
+ $this->stop_the_insanity();
101
+
102
+ $this->args['paged']++;
103
+ $posts = new WP_Query( $this->args );
104
+ }
105
+ WP_CLI::line( "Updating author terms with new counts" );
106
+ foreach( $authors as $author ) {
107
+ $this->update_author_term( $author );
108
+ }
109
+
110
+ WP_CLI::success( "Done! Of {$posts->found_posts} posts, {$affected} now have author terms." );
111
+
112
+ }
113
+
114
  /**
115
  * Subcommand to assign coauthors to a post based on a given meta key
116
  *
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: batmoo, danielbachhuber, automattic
3
  Tags: authors, users, multiple authors, coauthors, multi-author, publishing
4
  Tested up to: 3.5.1
5
  Requires at least: 3.3
6
- Stable tag: 3.0.4
7
 
8
  Assign multiple bylines to posts, pages, and custom post types via a search-as-you-type input box
9
 
@@ -31,6 +31,16 @@ When a user is deleted from WordPress, they will be removed from all posts for w
31
 
32
  Yep! Co-Authors Plus can be activated on a site-by-site basis, or network-activated. If you create guest authors, however, those guest authors will exist on a site-by-site basis.
33
 
 
 
 
 
 
 
 
 
 
 
34
  == Upgrade Notice ==
35
 
36
  = 3.0.4 =
@@ -41,6 +51,10 @@ Bug fixes and minor enhancements
41
 
42
  == Changelog ==
43
 
 
 
 
 
44
  = 3.0.4 (Jan. 6, 2013) =
45
  * Support for automatically adding co-authors to your feeds. Props [cfg](https://github.com/cfg).
46
  * Bug fix: No Co-Authors Plus on attachments. For now.
3
  Tags: authors, users, multiple authors, coauthors, multi-author, publishing
4
  Tested up to: 3.5.1
5
  Requires at least: 3.3
6
+ Stable tag: 3.0.5
7
 
8
  Assign multiple bylines to posts, pages, and custom post types via a search-as-you-type input box
9
 
31
 
32
  Yep! Co-Authors Plus can be activated on a site-by-site basis, or network-activated. If you create guest authors, however, those guest authors will exist on a site-by-site basis.
33
 
34
+ = Who needs permission to do what? =
35
+
36
+ To assign co-authors to posts, a WordPress user will need the 'edit_others_posts' capability. This is typically granted to the Editor role, but can be altered with the 'coauthors_plus_edit_authors' filter.
37
+
38
+ To create new guest author profiles, a WordPress will need the 'list_users' capability. This is typically granted to the Administrator role, but can be altered with the 'coauthors_guest_author_manage_cap' filter.
39
+
40
+ = Can I easily create a list of all co-authors? =
41
+
42
+ Yep! There's a template tag called `coauthors_wp_list_authors()` that accepts many of the same arguments as `wp_list_authors()`. Look in template-tags.php for more details.
43
+
44
  == Upgrade Notice ==
45
 
46
  = 3.0.4 =
51
 
52
  == Changelog ==
53
 
54
+ = 3.0.5 (Feb. 18, 2013) =
55
+ * New filter 'coauthors_search_authors_get_terms_args' allows you to increase the number of matches returned with AJAX co-author selection
56
+ * Bug fix: If there isn't an author term yet for a co-author, avoid an erronous join that caused duplicate posts to appear.
57
+
58
  = 3.0.4 (Jan. 6, 2013) =
59
  * Support for automatically adding co-authors to your feeds. Props [cfg](https://github.com/cfg).
60
  * Bug fix: No Co-Authors Plus on attachments. For now.
screenshot-1.png CHANGED
Binary file
screenshot-2.png CHANGED
Binary file
screenshot-3.png CHANGED
Binary file
template-tags.php CHANGED
@@ -184,7 +184,16 @@ function coauthors__echo( $tag, $type = 'tag', $separators = array(), $tag_args
184
  return $output;
185
  }
186
 
187
- //Provide co-author equivalents to the existing author template tags
 
 
 
 
 
 
 
 
 
188
  function coauthors( $between = null, $betweenLast = null, $before = null, $after = null, $echo = true ){
189
  return coauthors__echo('display_name', 'field', array(
190
  'between' => $between,
@@ -193,6 +202,17 @@ function coauthors( $between = null, $betweenLast = null, $before = null, $after
193
  'after' => $after
194
  ), null, $echo );
195
  }
 
 
 
 
 
 
 
 
 
 
 
196
  function coauthors_posts_links( $between = null, $betweenLast = null, $before = null, $after = null, $echo = true ){
197
  return coauthors__echo('coauthors_posts_links_single', 'callback', array(
198
  'between' => $between,
@@ -201,6 +221,13 @@ function coauthors_posts_links( $between = null, $betweenLast = null, $before =
201
  'after' => $after
202
  ), null, $echo );
203
  }
 
 
 
 
 
 
 
204
  function coauthors_posts_links_single( $author ) {
205
  $args = array(
206
  'href' => get_author_posts_url( $author->ID, $author->user_nicename ),
@@ -218,6 +245,15 @@ function coauthors_posts_links_single( $author ) {
218
  );
219
  }
220
 
 
 
 
 
 
 
 
 
 
221
  function coauthors_firstnames($between = null, $betweenLast = null, $before = null, $after = null, $echo = true ){
222
  return coauthors__echo('get_the_author_meta', 'tag', array(
223
  'between' => $between,
@@ -226,6 +262,16 @@ function coauthors_firstnames($between = null, $betweenLast = null, $before = nu
226
  'after' => $after
227
  ), 'first_name', $echo );
228
  }
 
 
 
 
 
 
 
 
 
 
229
  function coauthors_lastnames($between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
230
  return coauthors__echo('get_the_author_meta', 'tag', array(
231
  'between' => $between,
@@ -234,6 +280,16 @@ function coauthors_lastnames($between = null, $betweenLast = null, $before = nul
234
  'after' => $after
235
  ), 'last_name', $echo );
236
  }
 
 
 
 
 
 
 
 
 
 
237
  function coauthors_nicknames($between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
238
  return coauthors__echo('get_the_author_meta', 'tag', array(
239
  'between' => $between,
@@ -242,6 +298,16 @@ function coauthors_nicknames($between = null, $betweenLast = null, $before = nul
242
  'after' => $after
243
  ), 'nickname', $echo );
244
  }
 
 
 
 
 
 
 
 
 
 
245
  function coauthors_links($between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
246
  return coauthors__echo('coauthors_links_single', 'callback', array(
247
  'between' => $between,
@@ -250,6 +316,13 @@ function coauthors_links($between = null, $betweenLast = null, $before = null, $
250
  'after' => $after
251
  ), null, $echo );
252
  }
 
 
 
 
 
 
 
253
  function coauthors_links_single( $author ) {
254
  if ( get_the_author_meta('url') ) {
255
  return sprintf( '<a href="%s" title="%s" rel="external">%s</a>',
@@ -261,6 +334,16 @@ function coauthors_links_single( $author ) {
261
  return get_the_author();
262
  }
263
  }
 
 
 
 
 
 
 
 
 
 
264
  function coauthors_IDs($between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
265
  return coauthors__echo('ID', 'field', array(
266
  'between' => $between,
184
  return $output;
185
  }
186
 
187
+ /**
188
+ * Outputs the co-authors display names, without links to their posts.
189
+ * Co-Authors Plus equivalent of the_author() template tag.
190
+ *
191
+ * @param string $between Delimiter that should appear between the co-authors
192
+ * @param string $betweenLast Delimiter that should appear between the last two co-authors
193
+ * @param string $before What should appear before the presentation of co-authors
194
+ * @param string $after What should appear after the presentation of co-authors
195
+ * @param bool $echo Whether the co-authors should be echoed or returned. Defaults to true.
196
+ */
197
  function coauthors( $between = null, $betweenLast = null, $before = null, $after = null, $echo = true ){
198
  return coauthors__echo('display_name', 'field', array(
199
  'between' => $between,
202
  'after' => $after
203
  ), null, $echo );
204
  }
205
+
206
+ /**
207
+ * Outputs the co-authors display names, with links to their posts.
208
+ * Co-Authors Plus equivalent of the_author_posts_link() template tag.
209
+ *
210
+ * @param string $between Delimiter that should appear between the co-authors
211
+ * @param string $betweenLast Delimiter that should appear between the last two co-authors
212
+ * @param string $before What should appear before the presentation of co-authors
213
+ * @param string $after What should appear after the presentation of co-authors
214
+ * @param bool $echo Whether the co-authors should be echoed or returned. Defaults to true.
215
+ */
216
  function coauthors_posts_links( $between = null, $betweenLast = null, $before = null, $after = null, $echo = true ){
217
  return coauthors__echo('coauthors_posts_links_single', 'callback', array(
218
  'between' => $between,
221
  'after' => $after
222
  ), null, $echo );
223
  }
224
+
225
+ /**
226
+ * Outputs a single co-author linked to their post archive.
227
+ *
228
+ * @param object $author
229
+ * @return string
230
+ */
231
  function coauthors_posts_links_single( $author ) {
232
  $args = array(
233
  'href' => get_author_posts_url( $author->ID, $author->user_nicename ),
245
  );
246
  }
247
 
248
+ /**
249
+ * Outputs the co-authors first names, without links to their posts.
250
+ *
251
+ * @param string $between Delimiter that should appear between the co-authors
252
+ * @param string $betweenLast Delimiter that should appear between the last two co-authors
253
+ * @param string $before What should appear before the presentation of co-authors
254
+ * @param string $after What should appear after the presentation of co-authors
255
+ * @param bool $echo Whether the co-authors should be echoed or returned. Defaults to true.
256
+ */
257
  function coauthors_firstnames($between = null, $betweenLast = null, $before = null, $after = null, $echo = true ){
258
  return coauthors__echo('get_the_author_meta', 'tag', array(
259
  'between' => $between,
262
  'after' => $after
263
  ), 'first_name', $echo );
264
  }
265
+
266
+ /**
267
+ * Outputs the co-authors last names, without links to their posts.
268
+ *
269
+ * @param string $between Delimiter that should appear between the co-authors
270
+ * @param string $betweenLast Delimiter that should appear between the last two co-authors
271
+ * @param string $before What should appear before the presentation of co-authors
272
+ * @param string $after What should appear after the presentation of co-authors
273
+ * @param bool $echo Whether the co-authors should be echoed or returned. Defaults to true.
274
+ */
275
  function coauthors_lastnames($between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
276
  return coauthors__echo('get_the_author_meta', 'tag', array(
277
  'between' => $between,
280
  'after' => $after
281
  ), 'last_name', $echo );
282
  }
283
+
284
+ /**
285
+ * Outputs the co-authors nicknames, without links to their posts.
286
+ *
287
+ * @param string $between Delimiter that should appear between the co-authors
288
+ * @param string $betweenLast Delimiter that should appear between the last two co-authors
289
+ * @param string $before What should appear before the presentation of co-authors
290
+ * @param string $after What should appear after the presentation of co-authors
291
+ * @param bool $echo Whether the co-authors should be echoed or returned. Defaults to true.
292
+ */
293
  function coauthors_nicknames($between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
294
  return coauthors__echo('get_the_author_meta', 'tag', array(
295
  'between' => $between,
298
  'after' => $after
299
  ), 'nickname', $echo );
300
  }
301
+
302
+ /**
303
+ * Outputs the co-authors display names, with links to their websites if they've provided them.
304
+ *
305
+ * @param string $between Delimiter that should appear between the co-authors
306
+ * @param string $betweenLast Delimiter that should appear between the last two co-authors
307
+ * @param string $before What should appear before the presentation of co-authors
308
+ * @param string $after What should appear after the presentation of co-authors
309
+ * @param bool $echo Whether the co-authors should be echoed or returned. Defaults to true.
310
+ */
311
  function coauthors_links($between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
312
  return coauthors__echo('coauthors_links_single', 'callback', array(
313
  'between' => $between,
316
  'after' => $after
317
  ), null, $echo );
318
  }
319
+
320
+ /**
321
+ * Outputs a single co-author, linked to their website if they've provided one.
322
+ *
323
+ * @param object $author
324
+ * @return string
325
+ */
326
  function coauthors_links_single( $author ) {
327
  if ( get_the_author_meta('url') ) {
328
  return sprintf( '<a href="%s" title="%s" rel="external">%s</a>',
334
  return get_the_author();
335
  }
336
  }
337
+
338
+ /**
339
+ * Outputs the co-authors IDs
340
+ *
341
+ * @param string $between Delimiter that should appear between the co-authors
342
+ * @param string $betweenLast Delimiter that should appear between the last two co-authors
343
+ * @param string $before What should appear before the presentation of co-authors
344
+ * @param string $after What should appear after the presentation of co-authors
345
+ * @param bool $echo Whether the co-authors should be echoed or returned. Defaults to true.
346
+ */
347
  function coauthors_IDs($between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
348
  return coauthors__echo('ID', 'field', array(
349
  'between' => $between,