Version Description
("Rebecca") =
* Fix private post viewing on front-end
* Reduce amount of sleep
* Author search UX issues
* Remove associated guest user when mapped user id deleted.
* Removed double left join on posts_join_filter
* Fixed WP CLI create-terms-for-posts if no co-authors found
* Pages archive now displays coauthors and quick edit works
* Terminology updated throughout
* Replace hardcoded 'author' with $this->$coauthor_taxonomy
* Move parenthesis to fix esc_html and sprintf
* Added progress to create-guest-authors so users have an idea of how long it will take
* Deleting guest authors is less confusing
* Guest author's featured image is avatar now
* Removed extra image sizing
* Remove duplicated byline
* coauthors_wp_list_authors() has option to list only guest authors now
* remove duplicates from linked accounts on coauthors_wp_list_authors()
* Accurate Guest Author post count on linked accounts
* New README.md
* Filter author archive
* Fix coauthors_links_single()
* Added guest author hooks for create/delete
* Fixes logic for DOING_AUTOSAVE check
* user_login spaces problem when using add_coauthors
* Adding details of filter for slow performance
* Remove redundant test for 404 on Author Archive
* Guest Author Counts are more accurate
* Set $coauthors_loading
* Fix the issue where guest authors with non-ASCII characters can't be used as co-authors
* Fix the issue where incompatibility when coauthors_auto_apply_template_tags set to true
* Unit tests/Fix warnings for template tags
* Review and improve test coverage
* Update class-wp-cli.php
* Update .travis.yml file for PHPUnit tests
* Changes to resolve issue #332 about missing coauthor meta
Release Info
| Developer | philipjohn |
| Plugin | |
| Version | 3.3.0 |
| Comparing to | |
| See all releases | |
Code changes from version 3.2.2 to 3.3.0
- co-authors-plus.php +168 -79
- css/co-authors-plus.css +3 -2
- js/co-authors-plus.js +31 -28
- php/class-coauthors-guest-authors.php +75 -36
- php/class-coauthors-wp-list-table.php +6 -3
- php/class-wp-cli.php +11 -10
- readme.txt +39 -2
- template-tags.php +156 -42
- tests/test-author-queried-object.php +0 -7
- tests/test-coauthors-guest-authors.php +890 -0
- tests/test-coauthors-plus.php +679 -0
- tests/test-manage-coauthors.php +280 -0
- tests/test-template-tags.php +1068 -0
|
@@ -3,7 +3,7 @@
|
|
| 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.
|
| 7 |
Author: Mohammad Jangda, Daniel Bachhuber, Automattic
|
| 8 |
Copyright: 2008-2015 Shared and distributed between Mohammad Jangda, Daniel Bachhuber, Weston Ruter
|
| 9 |
|
|
@@ -22,9 +22,17 @@ You should have received a copy of the GNU General Public License
|
|
| 22 |
along with this program; if not, write to the Free Software
|
| 23 |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
| 24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
*/
|
| 26 |
|
| 27 |
-
define( 'COAUTHORS_PLUS_VERSION', '3.
|
| 28 |
|
| 29 |
require_once( dirname( __FILE__ ) . '/template-tags.php' );
|
| 30 |
require_once( dirname( __FILE__ ) . '/deprecated.php' );
|
|
@@ -39,7 +47,7 @@ if ( defined( 'WP_CLI' ) && WP_CLI ) {
|
|
| 39 |
class CoAuthors_Plus {
|
| 40 |
|
| 41 |
// Name for the taxonomy we're using to store relationships
|
| 42 |
-
// and the post type we're using to store
|
| 43 |
var $coauthor_taxonomy = 'author';
|
| 44 |
|
| 45 |
var $coreauthors_meta_box_name = 'authordiv';
|
|
@@ -68,38 +76,38 @@ class CoAuthors_Plus {
|
|
| 68 |
// Load admin_init function
|
| 69 |
add_action( 'admin_init', array( $this, 'admin_init' ) );
|
| 70 |
|
| 71 |
-
// Modify SQL queries to include
|
| 72 |
add_filter( 'posts_where', array( $this, 'posts_where_filter' ), 10, 2 );
|
| 73 |
add_filter( 'posts_join', array( $this, 'posts_join_filter' ), 10, 2 );
|
| 74 |
add_filter( 'posts_groupby', array( $this, 'posts_groupby_filter' ), 10, 2 );
|
| 75 |
|
| 76 |
-
// Action to set
|
| 77 |
add_action( 'save_post', array( $this, 'coauthors_update_post' ), 10, 2 );
|
| 78 |
// Filter to set the post_author field when wp_insert_post is called
|
| 79 |
add_filter( 'wp_insert_post_data', array( $this, 'coauthors_set_post_author_field' ), 10, 2 );
|
| 80 |
|
| 81 |
-
// Action to reassign posts when a
|
| 82 |
add_action( 'delete_user', array( $this, 'delete_user_action' ) );
|
| 83 |
|
| 84 |
add_filter( 'get_usernumposts', array( $this, 'filter_count_user_posts' ), 10, 2 );
|
| 85 |
|
| 86 |
-
// Action to set up author auto-suggest
|
| 87 |
add_action( 'wp_ajax_coauthors_ajax_suggest', array( $this, 'ajax_suggest' ) );
|
| 88 |
|
| 89 |
-
// Filter to allow
|
| 90 |
add_filter( 'user_has_cap', array( $this, 'filter_user_has_cap' ), 10, 3 );
|
| 91 |
|
| 92 |
-
// Handle the custom author meta box
|
| 93 |
add_action( 'add_meta_boxes', array( $this, 'add_coauthors_box' ) );
|
| 94 |
add_action( 'add_meta_boxes', array( $this, 'remove_authors_box' ) );
|
| 95 |
|
| 96 |
-
// Removes the author dropdown from the post quick edit
|
| 97 |
add_action( 'admin_head', array( $this, 'remove_quick_edit_authors_box' ) );
|
| 98 |
|
| 99 |
// Restricts WordPress from blowing away term order on bulk edit
|
| 100 |
add_filter( 'wp_get_object_terms', array( $this, 'filter_wp_get_object_terms' ), 10, 4 );
|
| 101 |
|
| 102 |
-
// Make sure we've correctly set
|
| 103 |
add_filter( 'posts_selection', array( $this, 'fix_author_page' ) ); // use posts_selection since it's after WP_Query has built the request and before it's queried any posts
|
| 104 |
add_action( 'the_post', array( $this, 'fix_author_page' ) );
|
| 105 |
|
|
@@ -110,16 +118,19 @@ class CoAuthors_Plus {
|
|
| 110 |
// Support Jetpack Open Graph Tags
|
| 111 |
add_filter( 'jetpack_open_graph_tags', array( $this, 'filter_jetpack_open_graph_tags' ), 10, 2 );
|
| 112 |
|
| 113 |
-
// Filter to send comment moderation notification e-mail to multiple authors
|
| 114 |
add_filter( 'comment_moderation_recipients', 'cap_filter_comment_moderation_email_recipients', 10, 2 );
|
| 115 |
|
| 116 |
// Support infinite scroll for Guest Authors on author pages
|
| 117 |
add_filter( 'infinite_scroll_js_settings', array( $this, 'filter_infinite_scroll_js_settings' ), 10, 2 );
|
| 118 |
|
| 119 |
-
// Delete
|
| 120 |
add_action( 'save_post', array( $this, 'clear_cache') );
|
| 121 |
add_action( 'delete_post', array( $this, 'clear_cache') );
|
| 122 |
add_action( 'set_object_terms', array( $this, 'clear_cache_on_terms_set' ), 10, 6 );
|
|
|
|
|
|
|
|
|
|
| 123 |
}
|
| 124 |
|
| 125 |
/**
|
|
@@ -174,7 +185,7 @@ class CoAuthors_Plus {
|
|
| 174 |
|
| 175 |
$post_types_with_authors = array_values( get_post_types() );
|
| 176 |
foreach ( $post_types_with_authors as $key => $name ) {
|
| 177 |
-
if ( ! post_type_supports( $name,
|
| 178 |
unset( $post_types_with_authors[ $key ] );
|
| 179 |
}
|
| 180 |
}
|
|
@@ -193,13 +204,13 @@ class CoAuthors_Plus {
|
|
| 193 |
// Add necessary JS variables
|
| 194 |
add_action( 'admin_head', array( $this, 'js_vars' ) );
|
| 195 |
|
| 196 |
-
// Hooks to add additional
|
| 197 |
add_filter( 'manage_posts_columns', array( $this, '_filter_manage_posts_columns' ) );
|
| 198 |
add_filter( 'manage_pages_columns', array( $this, '_filter_manage_posts_columns' ) );
|
| 199 |
add_action( 'manage_posts_custom_column', array( $this, '_filter_manage_posts_custom_column' ) );
|
| 200 |
add_action( 'manage_pages_custom_column', array( $this, '_filter_manage_posts_custom_column' ) );
|
| 201 |
|
| 202 |
-
// Add quick-edit author select field
|
| 203 |
add_action( 'quick_edit_custom_box', array( $this, '_action_quick_edit_custom_box' ), 10, 2 );
|
| 204 |
|
| 205 |
// Hooks to modify the published post number count on the Users WP List Table
|
|
@@ -225,7 +236,7 @@ class CoAuthors_Plus {
|
|
| 225 |
}
|
| 226 |
|
| 227 |
/**
|
| 228 |
-
* Get a
|
| 229 |
*
|
| 230 |
* @param string $key Key to search by (slug,email)
|
| 231 |
* @param string $value Value to search for
|
|
@@ -294,14 +305,17 @@ class CoAuthors_Plus {
|
|
| 294 |
|
| 295 |
if ( ! $post_type ) {
|
| 296 |
$post_type = get_post_type();
|
|
|
|
|
|
|
|
|
|
| 297 |
}
|
| 298 |
|
| 299 |
return (bool) in_array( $post_type, $this->supported_post_types );
|
| 300 |
}
|
| 301 |
|
| 302 |
/**
|
| 303 |
-
* Removes the standard WordPress Author box.
|
| 304 |
-
* We don't need it because the Co-Authors one is way cooler.
|
| 305 |
*/
|
| 306 |
public function remove_authors_box() {
|
| 307 |
|
|
@@ -311,7 +325,7 @@ class CoAuthors_Plus {
|
|
| 311 |
}
|
| 312 |
|
| 313 |
/**
|
| 314 |
-
* Adds a custom Authors box
|
| 315 |
*/
|
| 316 |
public function add_coauthors_box() {
|
| 317 |
|
|
@@ -321,7 +335,7 @@ class CoAuthors_Plus {
|
|
| 321 |
}
|
| 322 |
|
| 323 |
/**
|
| 324 |
-
* Callback for adding the custom
|
| 325 |
*/
|
| 326 |
public function coauthors_meta_box( $post ) {
|
| 327 |
global $post, $coauthors_plus, $current_screen;
|
|
@@ -395,18 +409,18 @@ class CoAuthors_Plus {
|
|
| 395 |
}
|
| 396 |
|
| 397 |
/**
|
| 398 |
-
* Removes the author dropdown from
|
| 399 |
*/
|
| 400 |
function remove_quick_edit_authors_box() {
|
| 401 |
global $pagenow;
|
| 402 |
|
| 403 |
if ( 'edit.php' == $pagenow && $this->is_post_type_enabled() ) {
|
| 404 |
-
remove_post_type_support( get_post_type(),
|
| 405 |
}
|
| 406 |
}
|
| 407 |
|
| 408 |
/**
|
| 409 |
-
* Add
|
| 410 |
*
|
| 411 |
* @param array $post_columns
|
| 412 |
*/
|
|
@@ -423,7 +437,7 @@ class CoAuthors_Plus {
|
|
| 423 |
$new_columns['coauthors'] = __( 'Authors', 'co-authors-plus' );
|
| 424 |
}
|
| 425 |
|
| 426 |
-
if (
|
| 427 |
unset( $new_columns[ $key ] );
|
| 428 |
}
|
| 429 |
}
|
|
@@ -431,7 +445,7 @@ class CoAuthors_Plus {
|
|
| 431 |
}
|
| 432 |
|
| 433 |
/**
|
| 434 |
-
* Insert
|
| 435 |
*
|
| 436 |
* @param string $column_name
|
| 437 |
*/
|
|
@@ -518,7 +532,7 @@ class CoAuthors_Plus {
|
|
| 518 |
}
|
| 519 |
|
| 520 |
/**
|
| 521 |
-
* When we update the terms at all, we should update the published post count for each
|
| 522 |
*/
|
| 523 |
function _update_users_posts_count( $tt_ids, $taxonomy ) {
|
| 524 |
global $wpdb;
|
|
@@ -616,10 +630,9 @@ class CoAuthors_Plus {
|
|
| 616 |
|
| 617 |
// Check to see that JOIN hasn't already been added. Props michaelingp and nbaxley
|
| 618 |
$term_relationship_inner_join = " INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)";
|
| 619 |
-
$term_relationship_left_join = " LEFT JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID =
|
| 620 |
|
| 621 |
-
$term_taxonomy_join
|
| 622 |
-
$term_taxonomy_join .= " INNER JOIN {$wpdb->term_taxonomy} ON ( tr1.term_taxonomy_id = {$wpdb->term_taxonomy}.term_taxonomy_id )";
|
| 623 |
|
| 624 |
// 4.6+ uses a LEFT JOIN for tax queries so we need to check for both
|
| 625 |
if ( false === strpos( $join, trim( $term_relationship_inner_join ) )
|
|
@@ -650,7 +663,7 @@ class CoAuthors_Plus {
|
|
| 650 |
if ( $query->get( 'author_name' ) ) {
|
| 651 |
$author_name = sanitize_title( $query->get( 'author_name' ) );
|
| 652 |
} else {
|
| 653 |
-
$author_data = get_userdata( $query->get(
|
| 654 |
if ( is_object( $author_data ) ) {
|
| 655 |
$author_name = $author_data->user_nicename;
|
| 656 |
} else {
|
|
@@ -663,7 +676,7 @@ class CoAuthors_Plus {
|
|
| 663 |
if ( $author_term = $this->get_author_term( $coauthor ) ) {
|
| 664 |
$terms[] = $author_term;
|
| 665 |
}
|
| 666 |
-
// If this
|
| 667 |
if ( ! empty( $coauthor->linked_account ) ) {
|
| 668 |
$linked_account = get_user_by( 'login', $coauthor->linked_account );
|
| 669 |
if ( $guest_author_term = $this->get_author_term( $linked_account ) ) {
|
|
@@ -689,8 +702,37 @@ class CoAuthors_Plus {
|
|
| 689 |
$this->having_terms .= ' ' . $wpdb->term_taxonomy .'.term_id = \''. $term->term_id .'\' OR ';
|
| 690 |
}
|
| 691 |
$terms_implode = rtrim( $terms_implode, ' OR' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 692 |
$this->having_terms = rtrim( $this->having_terms, ' OR' );
|
| 693 |
-
|
| 694 |
}
|
| 695 |
}
|
| 696 |
return $where;
|
|
@@ -722,7 +764,7 @@ class CoAuthors_Plus {
|
|
| 722 |
function coauthors_set_post_author_field( $data, $postarr ) {
|
| 723 |
|
| 724 |
// Bail on autosave
|
| 725 |
-
if ( defined( 'DOING_AUTOSAVE' ) &&
|
| 726 |
return $data;
|
| 727 |
}
|
| 728 |
|
|
@@ -733,7 +775,10 @@ class CoAuthors_Plus {
|
|
| 733 |
|
| 734 |
// This action happens when a post is saved while editing a post
|
| 735 |
if ( isset( $_REQUEST['coauthors-nonce'] ) && isset( $_POST['coauthors'] ) && is_array( $_POST['coauthors'] ) ) {
|
| 736 |
-
|
|
|
|
|
|
|
|
|
|
| 737 |
if ( $author ) {
|
| 738 |
$author_data = $this->get_coauthor_by( 'user_nicename', $author );
|
| 739 |
// If it's a guest author and has a linked account, store that information in post_author
|
|
@@ -746,7 +791,7 @@ class CoAuthors_Plus {
|
|
| 746 |
}
|
| 747 |
}
|
| 748 |
|
| 749 |
-
// If for some reason we don't have the
|
| 750 |
if ( ! isset( $data['post_author'] ) ) {
|
| 751 |
$user = wp_get_current_user();
|
| 752 |
$data['post_author'] = $user->ID;
|
|
@@ -765,7 +810,7 @@ class CoAuthors_Plus {
|
|
| 765 |
*/
|
| 766 |
function coauthors_update_post( $post_id, $post ) {
|
| 767 |
|
| 768 |
-
if ( defined( 'DOING_AUTOSAVE' ) &&
|
| 769 |
return;
|
| 770 |
}
|
| 771 |
|
|
@@ -779,7 +824,7 @@ class CoAuthors_Plus {
|
|
| 779 |
check_admin_referer( 'coauthors-edit', 'coauthors-nonce' );
|
| 780 |
|
| 781 |
$coauthors = (array) $_POST['coauthors'];
|
| 782 |
-
$coauthors = array_map( '
|
| 783 |
$this->add_coauthors( $post_id, $coauthors );
|
| 784 |
}
|
| 785 |
} else {
|
|
@@ -787,7 +832,7 @@ class CoAuthors_Plus {
|
|
| 787 |
if ( ! $this->has_author_terms( $post_id ) ) {
|
| 788 |
$user = get_userdata( $post->post_author );
|
| 789 |
if ( $user ) {
|
| 790 |
-
$this->add_coauthors( $post_id, array( $user->
|
| 791 |
}
|
| 792 |
}
|
| 793 |
}
|
|
@@ -823,7 +868,7 @@ class CoAuthors_Plus {
|
|
| 823 |
$coauthors = array( $current_user->user_login );
|
| 824 |
}
|
| 825 |
|
| 826 |
-
// Set the
|
| 827 |
$coauthors = array_unique( array_merge( $existing_coauthors, $coauthors ) );
|
| 828 |
$coauthor_objects = array();
|
| 829 |
foreach ( $coauthors as &$author_name ) {
|
|
@@ -859,9 +904,9 @@ class CoAuthors_Plus {
|
|
| 859 |
}
|
| 860 |
|
| 861 |
/**
|
| 862 |
-
* Action taken when
|
| 863 |
-
* -
|
| 864 |
-
* - Option to specify alternate
|
| 865 |
* @param delete_id
|
| 866 |
*/
|
| 867 |
function delete_user_action( $delete_id ) {
|
|
@@ -873,13 +918,13 @@ class CoAuthors_Plus {
|
|
| 873 |
if ( $reassign_id ) {
|
| 874 |
// Get posts belonging to deleted author
|
| 875 |
$reassign_user = get_user_by( 'id', $reassign_id );
|
| 876 |
-
// Set to new author
|
| 877 |
if ( is_object( $reassign_user ) ) {
|
| 878 |
$post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $delete_id ) );
|
| 879 |
|
| 880 |
if ( $post_ids ) {
|
| 881 |
foreach ( $post_ids as $post_id ) {
|
| 882 |
-
$this->add_coauthors( $post_id, array( $reassign_user->
|
| 883 |
}
|
| 884 |
}
|
| 885 |
}
|
|
@@ -890,17 +935,27 @@ class CoAuthors_Plus {
|
|
| 890 |
// Delete term
|
| 891 |
wp_delete_term( $delete_user->user_login, $this->coauthor_taxonomy );
|
| 892 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 893 |
}
|
| 894 |
|
| 895 |
/**
|
| 896 |
-
* Restrict WordPress from blowing away author order when bulk editing terms
|
| 897 |
*
|
| 898 |
* @since 2.6
|
| 899 |
* @props kingkool68, http://wordpress.org/support/topic/plugin-co-authors-plus-making-authors-sortable
|
| 900 |
*/
|
| 901 |
function filter_wp_get_object_terms( $terms, $object_ids, $taxonomies, $args ) {
|
| 902 |
-
|
| 903 |
-
if ( ! isset( $_REQUEST['bulk_edit'] ) || "'author'" !== $taxonomies ) {
|
| 904 |
return $terms;
|
| 905 |
}
|
| 906 |
|
|
@@ -943,8 +998,15 @@ class CoAuthors_Plus {
|
|
| 943 |
$user = $this->get_coauthor_by( 'user_nicename', $user->user_nicename );
|
| 944 |
|
| 945 |
$term = $this->get_author_term( $user );
|
| 946 |
-
|
| 947 |
-
if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 948 |
$count = $term->count;
|
| 949 |
}
|
| 950 |
|
|
@@ -952,7 +1014,7 @@ class CoAuthors_Plus {
|
|
| 952 |
}
|
| 953 |
|
| 954 |
/**
|
| 955 |
-
* Checks to see if the current user can set authors or not
|
| 956 |
*/
|
| 957 |
function current_user_can_set_authors( $post = null ) {
|
| 958 |
global $typenow;
|
|
@@ -960,11 +1022,17 @@ class CoAuthors_Plus {
|
|
| 960 |
if ( ! $post ) {
|
| 961 |
$post = get_post();
|
| 962 |
if ( ! $post ) {
|
| 963 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 964 |
}
|
| 965 |
}
|
| 966 |
-
|
| 967 |
-
|
|
|
|
| 968 |
|
| 969 |
// TODO: need to fix this; shouldn't just say no if don't have post_type
|
| 970 |
if ( ! $post_type ) {
|
|
@@ -989,12 +1057,12 @@ class CoAuthors_Plus {
|
|
| 989 |
/**
|
| 990 |
* Fix for author pages 404ing or not properly displaying on author pages
|
| 991 |
*
|
| 992 |
-
* If
|
| 993 |
-
* the author if they're a
|
| 994 |
*
|
| 995 |
-
* If the author does have posts, it doesn't matter that they're not an author.
|
| 996 |
*
|
| 997 |
-
* Alternatively, on an author archive, if the first story has
|
| 998 |
* the first author is NOT the same as the author for the archive,
|
| 999 |
* the query_var is changed.
|
| 1000 |
*
|
|
@@ -1020,10 +1088,10 @@ class CoAuthors_Plus {
|
|
| 1020 |
$term = $this->get_author_term( $authordata );
|
| 1021 |
}
|
| 1022 |
|
| 1023 |
-
if (
|
| 1024 |
-
|| ( ! empty( $term ) && $term->count ) ) {
|
| 1025 |
$wp_query->queried_object = $authordata;
|
| 1026 |
$wp_query->queried_object_id = $authordata->ID;
|
|
|
|
| 1027 |
} else {
|
| 1028 |
$wp_query->queried_object = $wp_query->queried_object_id = null;
|
| 1029 |
$wp_query->is_author = $wp_query->is_archive = false;
|
|
@@ -1049,7 +1117,7 @@ class CoAuthors_Plus {
|
|
| 1049 |
$author = get_queried_object();
|
| 1050 |
|
| 1051 |
if ( $author && 'guest-author' == $author->type ) {
|
| 1052 |
-
unset( $settings['query_args'][
|
| 1053 |
|
| 1054 |
$settings['query_args']['author_name'] = $author->user_nicename;
|
| 1055 |
}
|
|
@@ -1058,7 +1126,7 @@ class CoAuthors_Plus {
|
|
| 1058 |
}
|
| 1059 |
|
| 1060 |
/**
|
| 1061 |
-
* Main function that handles search-as-you-type for adding authors
|
| 1062 |
*/
|
| 1063 |
public function ajax_suggest() {
|
| 1064 |
|
|
@@ -1075,8 +1143,11 @@ class CoAuthors_Plus {
|
|
| 1075 |
|
| 1076 |
$authors = $this->search_authors( $search, $ignore );
|
| 1077 |
|
|
|
|
|
|
|
|
|
|
| 1078 |
foreach ( $authors as $author ) {
|
| 1079 |
-
echo esc_html( $author->ID . ' | ' . $author->user_login . ' | ' . $author->display_name . ' | ' . $author->user_email . ' | ' . $author->user_nicename ) . "\n";
|
| 1080 |
}
|
| 1081 |
|
| 1082 |
die();
|
|
@@ -1084,7 +1155,7 @@ class CoAuthors_Plus {
|
|
| 1084 |
}
|
| 1085 |
|
| 1086 |
/**
|
| 1087 |
-
* Get matching authors based on a search value
|
| 1088 |
*/
|
| 1089 |
public function search_authors( $search = '', $ignored_authors = array() ) {
|
| 1090 |
|
|
@@ -1128,7 +1199,7 @@ class CoAuthors_Plus {
|
|
| 1128 |
return array();
|
| 1129 |
}
|
| 1130 |
|
| 1131 |
-
// Get the
|
| 1132 |
$found_users = array();
|
| 1133 |
foreach ( $found_terms as $found_term ) {
|
| 1134 |
$found_user = $this->get_coauthor_by( 'user_nicename', $found_term->slug );
|
|
@@ -1153,7 +1224,7 @@ class CoAuthors_Plus {
|
|
| 1153 |
/**
|
| 1154 |
* Modify get_users() to search display_name instead of user_nicename
|
| 1155 |
*/
|
| 1156 |
-
function action_pre_user_query(
|
| 1157 |
|
| 1158 |
if ( is_object( $user_query ) ) {
|
| 1159 |
$user_query->query_where = str_replace( 'user_nicename LIKE', 'display_name LIKE', $user_query->query_where );
|
|
@@ -1279,7 +1350,7 @@ class CoAuthors_Plus {
|
|
| 1279 |
}
|
| 1280 |
|
| 1281 |
/**
|
| 1282 |
-
* Allows
|
| 1283 |
*/
|
| 1284 |
function filter_user_has_cap( $allcaps, $caps, $args ) {
|
| 1285 |
|
|
@@ -1339,10 +1410,19 @@ class CoAuthors_Plus {
|
|
| 1339 |
return $term;
|
| 1340 |
}
|
| 1341 |
|
| 1342 |
-
//
|
| 1343 |
-
|
| 1344 |
-
|
| 1345 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1346 |
}
|
| 1347 |
wp_cache_set( $cache_key, $term, 'co-authors-plus' );
|
| 1348 |
return $term;
|
|
@@ -1398,19 +1478,19 @@ class CoAuthors_Plus {
|
|
| 1398 |
function filter_ef_calendar_item_information_fields( $information_fields, $post_id ) {
|
| 1399 |
|
| 1400 |
// Don't add the author row again if another plugin has removed
|
| 1401 |
-
if ( ! array_key_exists(
|
| 1402 |
return $information_fields;
|
| 1403 |
}
|
| 1404 |
|
| 1405 |
$co_authors = get_coauthors( $post_id );
|
| 1406 |
if ( count( $co_authors ) > 1 ) {
|
| 1407 |
-
$information_fields[
|
| 1408 |
}
|
| 1409 |
$co_authors_names = '';
|
| 1410 |
foreach ( $co_authors as $co_author ) {
|
| 1411 |
$co_authors_names .= $co_author->display_name . ', ';
|
| 1412 |
}
|
| 1413 |
-
$information_fields[
|
| 1414 |
return $information_fields;
|
| 1415 |
}
|
| 1416 |
|
|
@@ -1427,7 +1507,7 @@ class CoAuthors_Plus {
|
|
| 1427 |
function filter_ef_story_budget_term_column_value( $column_name, $post, $parent_term ) {
|
| 1428 |
|
| 1429 |
// We only want to modify the 'author' column
|
| 1430 |
-
if (
|
| 1431 |
return $column_name;
|
| 1432 |
}
|
| 1433 |
|
|
@@ -1475,12 +1555,12 @@ class CoAuthors_Plus {
|
|
| 1475 |
}
|
| 1476 |
|
| 1477 |
/**
|
| 1478 |
-
* Retrieve a list of
|
| 1479 |
*
|
| 1480 |
-
* Grabs a correctly ordered list of authors for a single post, appropriately
|
| 1481 |
* cached because it requires `wp_get_object_terms()` to succeed.
|
| 1482 |
*
|
| 1483 |
-
* @param int $post_id ID of the post for which to retrieve authors.
|
| 1484 |
* @return array Array of coauthor WP_Term objects
|
| 1485 |
*/
|
| 1486 |
public function get_coauthor_terms_for_post( $post_id ) {
|
|
@@ -1535,6 +1615,15 @@ class CoAuthors_Plus {
|
|
| 1535 |
|
| 1536 |
}
|
| 1537 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1538 |
}
|
| 1539 |
|
| 1540 |
global $coauthors_plus;
|
|
@@ -1680,7 +1769,7 @@ function cap_filter_comment_moderation_email_recipients( $recipients, $comment_i
|
|
| 1680 |
}
|
| 1681 |
|
| 1682 |
/**
|
| 1683 |
-
* Retrieve a list of
|
| 1684 |
*
|
| 1685 |
* Grabs a correctly ordered list of authors for a single post, appropriately
|
| 1686 |
* cached because it requires `wp_get_object_terms()` to succeed.
|
| 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.3.0
|
| 7 |
Author: Mohammad Jangda, Daniel Bachhuber, Automattic
|
| 8 |
Copyright: 2008-2015 Shared and distributed between Mohammad Jangda, Daniel Bachhuber, Weston Ruter
|
| 9 |
|
| 22 |
along with this program; if not, write to the Free Software
|
| 23 |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
| 24 |
|
| 25 |
+
-----------------
|
| 26 |
+
|
| 27 |
+
Glossary:
|
| 28 |
+
|
| 29 |
+
User - a WordPress user account
|
| 30 |
+
Guest author - a CAP-created co-author
|
| 31 |
+
Co-author - in the context of a single post, a guest author or user assigned to the post alongside others
|
| 32 |
+
Author - user with the role of author
|
| 33 |
*/
|
| 34 |
|
| 35 |
+
define( 'COAUTHORS_PLUS_VERSION', '3.3.0' );
|
| 36 |
|
| 37 |
require_once( dirname( __FILE__ ) . '/template-tags.php' );
|
| 38 |
require_once( dirname( __FILE__ ) . '/deprecated.php' );
|
| 47 |
class CoAuthors_Plus {
|
| 48 |
|
| 49 |
// Name for the taxonomy we're using to store relationships
|
| 50 |
+
// and the post type we're using to store guest authors
|
| 51 |
var $coauthor_taxonomy = 'author';
|
| 52 |
|
| 53 |
var $coreauthors_meta_box_name = 'authordiv';
|
| 76 |
// Load admin_init function
|
| 77 |
add_action( 'admin_init', array( $this, 'admin_init' ) );
|
| 78 |
|
| 79 |
+
// Modify SQL queries to include guest authors
|
| 80 |
add_filter( 'posts_where', array( $this, 'posts_where_filter' ), 10, 2 );
|
| 81 |
add_filter( 'posts_join', array( $this, 'posts_join_filter' ), 10, 2 );
|
| 82 |
add_filter( 'posts_groupby', array( $this, 'posts_groupby_filter' ), 10, 2 );
|
| 83 |
|
| 84 |
+
// Action to set co-authors when a post is saved
|
| 85 |
add_action( 'save_post', array( $this, 'coauthors_update_post' ), 10, 2 );
|
| 86 |
// Filter to set the post_author field when wp_insert_post is called
|
| 87 |
add_filter( 'wp_insert_post_data', array( $this, 'coauthors_set_post_author_field' ), 10, 2 );
|
| 88 |
|
| 89 |
+
// Action to reassign posts when a guest author is deleted
|
| 90 |
add_action( 'delete_user', array( $this, 'delete_user_action' ) );
|
| 91 |
|
| 92 |
add_filter( 'get_usernumposts', array( $this, 'filter_count_user_posts' ), 10, 2 );
|
| 93 |
|
| 94 |
+
// Action to set up co-author auto-suggest
|
| 95 |
add_action( 'wp_ajax_coauthors_ajax_suggest', array( $this, 'ajax_suggest' ) );
|
| 96 |
|
| 97 |
+
// Filter to allow co-authors to edit posts
|
| 98 |
add_filter( 'user_has_cap', array( $this, 'filter_user_has_cap' ), 10, 3 );
|
| 99 |
|
| 100 |
+
// Handle the custom co-author meta box
|
| 101 |
add_action( 'add_meta_boxes', array( $this, 'add_coauthors_box' ) );
|
| 102 |
add_action( 'add_meta_boxes', array( $this, 'remove_authors_box' ) );
|
| 103 |
|
| 104 |
+
// Removes the co-author dropdown from the post quick edit
|
| 105 |
add_action( 'admin_head', array( $this, 'remove_quick_edit_authors_box' ) );
|
| 106 |
|
| 107 |
// Restricts WordPress from blowing away term order on bulk edit
|
| 108 |
add_filter( 'wp_get_object_terms', array( $this, 'filter_wp_get_object_terms' ), 10, 4 );
|
| 109 |
|
| 110 |
+
// Make sure we've correctly set data on guest author pages
|
| 111 |
add_filter( 'posts_selection', array( $this, 'fix_author_page' ) ); // use posts_selection since it's after WP_Query has built the request and before it's queried any posts
|
| 112 |
add_action( 'the_post', array( $this, 'fix_author_page' ) );
|
| 113 |
|
| 118 |
// Support Jetpack Open Graph Tags
|
| 119 |
add_filter( 'jetpack_open_graph_tags', array( $this, 'filter_jetpack_open_graph_tags' ), 10, 2 );
|
| 120 |
|
| 121 |
+
// Filter to send comment moderation notification e-mail to multiple co-authors
|
| 122 |
add_filter( 'comment_moderation_recipients', 'cap_filter_comment_moderation_email_recipients', 10, 2 );
|
| 123 |
|
| 124 |
// Support infinite scroll for Guest Authors on author pages
|
| 125 |
add_filter( 'infinite_scroll_js_settings', array( $this, 'filter_infinite_scroll_js_settings' ), 10, 2 );
|
| 126 |
|
| 127 |
+
// Delete Co-Author Cache on Post Save & Post Delete
|
| 128 |
add_action( 'save_post', array( $this, 'clear_cache') );
|
| 129 |
add_action( 'delete_post', array( $this, 'clear_cache') );
|
| 130 |
add_action( 'set_object_terms', array( $this, 'clear_cache_on_terms_set' ), 10, 6 );
|
| 131 |
+
|
| 132 |
+
// Filter to correct author on author archive page
|
| 133 |
+
add_filter( 'get_the_archive_title', array( $this, 'filter_author_archive_title'), 10, 2 );
|
| 134 |
}
|
| 135 |
|
| 136 |
/**
|
| 185 |
|
| 186 |
$post_types_with_authors = array_values( get_post_types() );
|
| 187 |
foreach ( $post_types_with_authors as $key => $name ) {
|
| 188 |
+
if ( ! post_type_supports( $name, $this->coauthor_taxonomy ) || in_array( $name, array( 'revision', 'attachment' ) ) ) {
|
| 189 |
unset( $post_types_with_authors[ $key ] );
|
| 190 |
}
|
| 191 |
}
|
| 204 |
// Add necessary JS variables
|
| 205 |
add_action( 'admin_head', array( $this, 'js_vars' ) );
|
| 206 |
|
| 207 |
+
// Hooks to add additional co-authors to 'authors' column to edit page
|
| 208 |
add_filter( 'manage_posts_columns', array( $this, '_filter_manage_posts_columns' ) );
|
| 209 |
add_filter( 'manage_pages_columns', array( $this, '_filter_manage_posts_columns' ) );
|
| 210 |
add_action( 'manage_posts_custom_column', array( $this, '_filter_manage_posts_custom_column' ) );
|
| 211 |
add_action( 'manage_pages_custom_column', array( $this, '_filter_manage_posts_custom_column' ) );
|
| 212 |
|
| 213 |
+
// Add quick-edit co-author select field
|
| 214 |
add_action( 'quick_edit_custom_box', array( $this, '_action_quick_edit_custom_box' ), 10, 2 );
|
| 215 |
|
| 216 |
// Hooks to modify the published post number count on the Users WP List Table
|
| 236 |
}
|
| 237 |
|
| 238 |
/**
|
| 239 |
+
* Get a guest author object by a specific type of key
|
| 240 |
*
|
| 241 |
* @param string $key Key to search by (slug,email)
|
| 242 |
* @param string $value Value to search for
|
| 305 |
|
| 306 |
if ( ! $post_type ) {
|
| 307 |
$post_type = get_post_type();
|
| 308 |
+
if ( is_admin() && ! $post_type) {
|
| 309 |
+
$post_type = get_current_screen()->post_type;
|
| 310 |
+
}
|
| 311 |
}
|
| 312 |
|
| 313 |
return (bool) in_array( $post_type, $this->supported_post_types );
|
| 314 |
}
|
| 315 |
|
| 316 |
/**
|
| 317 |
+
* Removes the standard WordPress 'Author' box.
|
| 318 |
+
* We don't need it because the Co-Authors Plus one is way cooler.
|
| 319 |
*/
|
| 320 |
public function remove_authors_box() {
|
| 321 |
|
| 325 |
}
|
| 326 |
|
| 327 |
/**
|
| 328 |
+
* Adds a custom 'Authors' box
|
| 329 |
*/
|
| 330 |
public function add_coauthors_box() {
|
| 331 |
|
| 335 |
}
|
| 336 |
|
| 337 |
/**
|
| 338 |
+
* Callback for adding the custom 'Authors' box
|
| 339 |
*/
|
| 340 |
public function coauthors_meta_box( $post ) {
|
| 341 |
global $post, $coauthors_plus, $current_screen;
|
| 409 |
}
|
| 410 |
|
| 411 |
/**
|
| 412 |
+
* Removes the default 'author' dropdown from quick edit
|
| 413 |
*/
|
| 414 |
function remove_quick_edit_authors_box() {
|
| 415 |
global $pagenow;
|
| 416 |
|
| 417 |
if ( 'edit.php' == $pagenow && $this->is_post_type_enabled() ) {
|
| 418 |
+
remove_post_type_support( get_post_type(), $this->coauthor_taxonomy );
|
| 419 |
}
|
| 420 |
}
|
| 421 |
|
| 422 |
/**
|
| 423 |
+
* Add co-authors to 'authors' column on edit pages
|
| 424 |
*
|
| 425 |
* @param array $post_columns
|
| 426 |
*/
|
| 437 |
$new_columns['coauthors'] = __( 'Authors', 'co-authors-plus' );
|
| 438 |
}
|
| 439 |
|
| 440 |
+
if ( $this->coauthor_taxonomy === $key ) {
|
| 441 |
unset( $new_columns[ $key ] );
|
| 442 |
}
|
| 443 |
}
|
| 445 |
}
|
| 446 |
|
| 447 |
/**
|
| 448 |
+
* Insert co-authors into post rows on Edit Page
|
| 449 |
*
|
| 450 |
* @param string $column_name
|
| 451 |
*/
|
| 532 |
}
|
| 533 |
|
| 534 |
/**
|
| 535 |
+
* When we update the terms at all, we should update the published post count for each user
|
| 536 |
*/
|
| 537 |
function _update_users_posts_count( $tt_ids, $taxonomy ) {
|
| 538 |
global $wpdb;
|
| 630 |
|
| 631 |
// Check to see that JOIN hasn't already been added. Props michaelingp and nbaxley
|
| 632 |
$term_relationship_inner_join = " INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)";
|
| 633 |
+
$term_relationship_left_join = " LEFT JOIN {$wpdb->term_relationships} AS tr1 ON ({$wpdb->posts}.ID = tr1.object_id)";
|
| 634 |
|
| 635 |
+
$term_taxonomy_join = " INNER JOIN {$wpdb->term_taxonomy} ON ( tr1.term_taxonomy_id = {$wpdb->term_taxonomy}.term_taxonomy_id )";
|
|
|
|
| 636 |
|
| 637 |
// 4.6+ uses a LEFT JOIN for tax queries so we need to check for both
|
| 638 |
if ( false === strpos( $join, trim( $term_relationship_inner_join ) )
|
| 663 |
if ( $query->get( 'author_name' ) ) {
|
| 664 |
$author_name = sanitize_title( $query->get( 'author_name' ) );
|
| 665 |
} else {
|
| 666 |
+
$author_data = get_userdata( $query->get( $this->coauthor_taxonomy ) );
|
| 667 |
if ( is_object( $author_data ) ) {
|
| 668 |
$author_name = $author_data->user_nicename;
|
| 669 |
} else {
|
| 676 |
if ( $author_term = $this->get_author_term( $coauthor ) ) {
|
| 677 |
$terms[] = $author_term;
|
| 678 |
}
|
| 679 |
+
// If this co-author has a linked account, we also need to get posts with those terms
|
| 680 |
if ( ! empty( $coauthor->linked_account ) ) {
|
| 681 |
$linked_account = get_user_by( 'login', $coauthor->linked_account );
|
| 682 |
if ( $guest_author_term = $this->get_author_term( $linked_account ) ) {
|
| 702 |
$this->having_terms .= ' ' . $wpdb->term_taxonomy .'.term_id = \''. $term->term_id .'\' OR ';
|
| 703 |
}
|
| 704 |
$terms_implode = rtrim( $terms_implode, ' OR' );
|
| 705 |
+
|
| 706 |
+
$id = is_author() ? get_queried_object_id() : '\d+';
|
| 707 |
+
|
| 708 |
+
// When WordPress generates query as 'post_author IN (id)'.
|
| 709 |
+
if ( false !== strpos( $where, "{$wpdb->posts}.post_author IN " ) ) {
|
| 710 |
+
|
| 711 |
+
$maybe_both_query = $maybe_both ? '$0 OR' : '';
|
| 712 |
+
|
| 713 |
+
$where = preg_replace( '/\s\b(?:' . $wpdb->posts . '\.)?post_author\s*IN\s*(.*' . $id . '.)/', ' (' . $maybe_both_query . ' ' . $terms_implode . ')', $where, -1 ); #' . $wpdb->postmeta . '.meta_id IS NOT NULL AND
|
| 714 |
+
|
| 715 |
+
} else {
|
| 716 |
+
$where = preg_replace( '/(\b(?:' . $wpdb->posts . '\.)?post_author\s*=\s*(' . $id . '))/', '(' . $maybe_both_query . ' ' . $terms_implode . ')', $where, -1 ); #' . $wpdb->postmeta . '.meta_id IS NOT NULL AND
|
| 717 |
+
}
|
| 718 |
+
|
| 719 |
+
// the block targets the private posts clause (if it exists)
|
| 720 |
+
if (
|
| 721 |
+
is_user_logged_in() &&
|
| 722 |
+
is_author() &&
|
| 723 |
+
get_queried_object_id() != get_current_user_id()
|
| 724 |
+
) {
|
| 725 |
+
$current_coauthor = $this->get_coauthor_by( 'user_nicename', wp_get_current_user()->user_nicename );
|
| 726 |
+
$current_coauthor_term = $this->get_author_term( $current_coauthor );
|
| 727 |
+
|
| 728 |
+
$current_user_query = $wpdb->term_taxonomy . '.taxonomy = \''. $this->coauthor_taxonomy.'\' AND '. $wpdb->term_taxonomy .'.term_id = \''. $current_coauthor_term->term_id .'\'';
|
| 729 |
+
$this->having_terms .= ' ' . $wpdb->term_taxonomy .'.term_id = \''. $current_coauthor_term->term_id .'\' OR ';
|
| 730 |
+
|
| 731 |
+
$where = preg_replace( '/(\b(?:' . $wpdb->posts . '\.)?post_author\s*=\s*(' . get_current_user_id() . '))/', $current_user_query, $where, -1 ); #' . $wpdb->postmeta . '.meta_id IS NOT NULL AND
|
| 732 |
+
}
|
| 733 |
+
|
| 734 |
$this->having_terms = rtrim( $this->having_terms, ' OR' );
|
| 735 |
+
|
| 736 |
}
|
| 737 |
}
|
| 738 |
return $where;
|
| 764 |
function coauthors_set_post_author_field( $data, $postarr ) {
|
| 765 |
|
| 766 |
// Bail on autosave
|
| 767 |
+
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
|
| 768 |
return $data;
|
| 769 |
}
|
| 770 |
|
| 775 |
|
| 776 |
// This action happens when a post is saved while editing a post
|
| 777 |
if ( isset( $_REQUEST['coauthors-nonce'] ) && isset( $_POST['coauthors'] ) && is_array( $_POST['coauthors'] ) ) {
|
| 778 |
+
|
| 779 |
+
// rawurlencode() is for encoding coauthor name with special characters to compare names when getting coauthor.
|
| 780 |
+
$author = rawurlencode( sanitize_text_field( $_POST['coauthors'][0] ) );
|
| 781 |
+
|
| 782 |
if ( $author ) {
|
| 783 |
$author_data = $this->get_coauthor_by( 'user_nicename', $author );
|
| 784 |
// If it's a guest author and has a linked account, store that information in post_author
|
| 791 |
}
|
| 792 |
}
|
| 793 |
|
| 794 |
+
// If for some reason we don't have the co-authors fields set
|
| 795 |
if ( ! isset( $data['post_author'] ) ) {
|
| 796 |
$user = wp_get_current_user();
|
| 797 |
$data['post_author'] = $user->ID;
|
| 810 |
*/
|
| 811 |
function coauthors_update_post( $post_id, $post ) {
|
| 812 |
|
| 813 |
+
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
|
| 814 |
return;
|
| 815 |
}
|
| 816 |
|
| 824 |
check_admin_referer( 'coauthors-edit', 'coauthors-nonce' );
|
| 825 |
|
| 826 |
$coauthors = (array) $_POST['coauthors'];
|
| 827 |
+
$coauthors = array_map( 'sanitize_title', $coauthors );
|
| 828 |
$this->add_coauthors( $post_id, $coauthors );
|
| 829 |
}
|
| 830 |
} else {
|
| 832 |
if ( ! $this->has_author_terms( $post_id ) ) {
|
| 833 |
$user = get_userdata( $post->post_author );
|
| 834 |
if ( $user ) {
|
| 835 |
+
$this->add_coauthors( $post_id, array( $user->user_nicename ) );
|
| 836 |
}
|
| 837 |
}
|
| 838 |
}
|
| 868 |
$coauthors = array( $current_user->user_login );
|
| 869 |
}
|
| 870 |
|
| 871 |
+
// Set the co-authors
|
| 872 |
$coauthors = array_unique( array_merge( $existing_coauthors, $coauthors ) );
|
| 873 |
$coauthor_objects = array();
|
| 874 |
foreach ( $coauthors as &$author_name ) {
|
| 904 |
}
|
| 905 |
|
| 906 |
/**
|
| 907 |
+
* Action taken when co-author is deleted.
|
| 908 |
+
* - Co-Author term is removed from all associated posts
|
| 909 |
+
* - Option to specify alternate co-author in place for each post
|
| 910 |
* @param delete_id
|
| 911 |
*/
|
| 912 |
function delete_user_action( $delete_id ) {
|
| 918 |
if ( $reassign_id ) {
|
| 919 |
// Get posts belonging to deleted author
|
| 920 |
$reassign_user = get_user_by( 'id', $reassign_id );
|
| 921 |
+
// Set to new guest author
|
| 922 |
if ( is_object( $reassign_user ) ) {
|
| 923 |
$post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_author = %d", $delete_id ) );
|
| 924 |
|
| 925 |
if ( $post_ids ) {
|
| 926 |
foreach ( $post_ids as $post_id ) {
|
| 927 |
+
$this->add_coauthors( $post_id, array( $reassign_user->user_nicename ), true );
|
| 928 |
}
|
| 929 |
}
|
| 930 |
}
|
| 935 |
// Delete term
|
| 936 |
wp_delete_term( $delete_user->user_login, $this->coauthor_taxonomy );
|
| 937 |
}
|
| 938 |
+
|
| 939 |
+
// Get the deleted user data by user id.
|
| 940 |
+
$user_data = get_user_by( 'id', $delete_id );
|
| 941 |
+
|
| 942 |
+
// Get the associated user.
|
| 943 |
+
$associated_user = $this->guest_authors->get_guest_author_by( 'linked_account', $user_data->data->user_login );
|
| 944 |
+
|
| 945 |
+
if ( isset( $associated_user->ID ) ) {
|
| 946 |
+
// Delete associated guest user.
|
| 947 |
+
$this->guest_authors->delete( $associated_user->ID );
|
| 948 |
+
}
|
| 949 |
}
|
| 950 |
|
| 951 |
/**
|
| 952 |
+
* Restrict WordPress from blowing away co-author order when bulk editing terms
|
| 953 |
*
|
| 954 |
* @since 2.6
|
| 955 |
* @props kingkool68, http://wordpress.org/support/topic/plugin-co-authors-plus-making-authors-sortable
|
| 956 |
*/
|
| 957 |
function filter_wp_get_object_terms( $terms, $object_ids, $taxonomies, $args ) {
|
| 958 |
+
if ( ! isset( $_REQUEST['bulk_edit'] ) || $this->coauthor_taxonomy !== $taxonomies ) {
|
|
|
|
| 959 |
return $terms;
|
| 960 |
}
|
| 961 |
|
| 998 |
$user = $this->get_coauthor_by( 'user_nicename', $user->user_nicename );
|
| 999 |
|
| 1000 |
$term = $this->get_author_term( $user );
|
| 1001 |
+
$guest_term = get_term_by( 'slug', 'cap-' . $user->user_nicename, $this->coauthor_taxonomy );
|
| 1002 |
+
// Only modify the count if it has a linked account with posts or the author exists as a term
|
| 1003 |
+
if ( $user->linked_account && $guest_term->count ) {
|
| 1004 |
+
if ( $term && ! is_wp_error( $term )) {
|
| 1005 |
+
$count = $guest_term->count + $term->count;
|
| 1006 |
+
} else {
|
| 1007 |
+
$count = $guest_term->count;
|
| 1008 |
+
}
|
| 1009 |
+
} elseif ( $term && ! is_wp_error( $term ) ) {
|
| 1010 |
$count = $term->count;
|
| 1011 |
}
|
| 1012 |
|
| 1014 |
}
|
| 1015 |
|
| 1016 |
/**
|
| 1017 |
+
* Checks to see if the current user can set co-authors or not
|
| 1018 |
*/
|
| 1019 |
function current_user_can_set_authors( $post = null ) {
|
| 1020 |
global $typenow;
|
| 1022 |
if ( ! $post ) {
|
| 1023 |
$post = get_post();
|
| 1024 |
if ( ! $post ) {
|
| 1025 |
+
// if user is on pages, you need to grab post type another way
|
| 1026 |
+
$current_screen = get_current_screen();
|
| 1027 |
+
$post_type = ( ! empty( $current_screen->post_type ) ) ? $current_screen->post_type : '';
|
| 1028 |
+
}
|
| 1029 |
+
else {
|
| 1030 |
+
$post_type = $post->post_type;
|
| 1031 |
}
|
| 1032 |
}
|
| 1033 |
+
else {
|
| 1034 |
+
$post_type = $post->post_type;
|
| 1035 |
+
}
|
| 1036 |
|
| 1037 |
// TODO: need to fix this; shouldn't just say no if don't have post_type
|
| 1038 |
if ( ! $post_type ) {
|
| 1057 |
/**
|
| 1058 |
* Fix for author pages 404ing or not properly displaying on author pages
|
| 1059 |
*
|
| 1060 |
+
* If a guest author has no posts, we only want to force the queried object to be
|
| 1061 |
+
* the author if they're a user.
|
| 1062 |
*
|
| 1063 |
+
* If the guest author does have posts, it doesn't matter that they're not an author.
|
| 1064 |
*
|
| 1065 |
+
* Alternatively, on an author archive, if the first story has co-authors and
|
| 1066 |
* the first author is NOT the same as the author for the archive,
|
| 1067 |
* the query_var is changed.
|
| 1068 |
*
|
| 1088 |
$term = $this->get_author_term( $authordata );
|
| 1089 |
}
|
| 1090 |
|
| 1091 |
+
if ( is_object( $authordata ) || ! empty( $term ) ) {
|
|
|
|
| 1092 |
$wp_query->queried_object = $authordata;
|
| 1093 |
$wp_query->queried_object_id = $authordata->ID;
|
| 1094 |
+
add_filter( 'pre_handle_404', '__return_true' );
|
| 1095 |
} else {
|
| 1096 |
$wp_query->queried_object = $wp_query->queried_object_id = null;
|
| 1097 |
$wp_query->is_author = $wp_query->is_archive = false;
|
| 1117 |
$author = get_queried_object();
|
| 1118 |
|
| 1119 |
if ( $author && 'guest-author' == $author->type ) {
|
| 1120 |
+
unset( $settings['query_args'][$this->coauthor_taxonomy] );
|
| 1121 |
|
| 1122 |
$settings['query_args']['author_name'] = $author->user_nicename;
|
| 1123 |
}
|
| 1126 |
}
|
| 1127 |
|
| 1128 |
/**
|
| 1129 |
+
* Main function that handles search-as-you-type for adding co-authors
|
| 1130 |
*/
|
| 1131 |
public function ajax_suggest() {
|
| 1132 |
|
| 1143 |
|
| 1144 |
$authors = $this->search_authors( $search, $ignore );
|
| 1145 |
|
| 1146 |
+
// Return message if no authors found
|
| 1147 |
+
if( empty( $authors ) ) echo apply_filters( 'coauthors_no_matching_authors_message', 'Sorry, no matching authors found.');
|
| 1148 |
+
|
| 1149 |
foreach ( $authors as $author ) {
|
| 1150 |
+
echo esc_html( $author->ID . ' | ' . $author->user_login . ' | ' . $author->display_name . ' | ' . $author->user_email . ' | ' . rawurldecode( $author->user_nicename ) ) . "\n";
|
| 1151 |
}
|
| 1152 |
|
| 1153 |
die();
|
| 1155 |
}
|
| 1156 |
|
| 1157 |
/**
|
| 1158 |
+
* Get matching co-authors based on a search value
|
| 1159 |
*/
|
| 1160 |
public function search_authors( $search = '', $ignored_authors = array() ) {
|
| 1161 |
|
| 1199 |
return array();
|
| 1200 |
}
|
| 1201 |
|
| 1202 |
+
// Get the guest author objects
|
| 1203 |
$found_users = array();
|
| 1204 |
foreach ( $found_terms as $found_term ) {
|
| 1205 |
$found_user = $this->get_coauthor_by( 'user_nicename', $found_term->slug );
|
| 1224 |
/**
|
| 1225 |
* Modify get_users() to search display_name instead of user_nicename
|
| 1226 |
*/
|
| 1227 |
+
function action_pre_user_query( $user_query ) {
|
| 1228 |
|
| 1229 |
if ( is_object( $user_query ) ) {
|
| 1230 |
$user_query->query_where = str_replace( 'user_nicename LIKE', 'display_name LIKE', $user_query->query_where );
|
| 1350 |
}
|
| 1351 |
|
| 1352 |
/**
|
| 1353 |
+
* Allows guest authors to edit the post they're co-authors of
|
| 1354 |
*/
|
| 1355 |
function filter_user_has_cap( $allcaps, $caps, $args ) {
|
| 1356 |
|
| 1410 |
return $term;
|
| 1411 |
}
|
| 1412 |
|
| 1413 |
+
// use linked user for accurate post count
|
| 1414 |
+
if ( ! empty ( $coauthor->linked_account ) ) {
|
| 1415 |
+
$term = get_term_by( 'slug', 'cap-' . $coauthor->linked_account, $this->coauthor_taxonomy );
|
| 1416 |
+
if ( ! $term ) {
|
| 1417 |
+
$term = get_term_by( 'slug', $coauthor->linked_account, $this->coauthor_taxonomy );
|
| 1418 |
+
}
|
| 1419 |
+
}
|
| 1420 |
+
else {
|
| 1421 |
+
// See if the prefixed term is available, otherwise default to just the nicename
|
| 1422 |
+
$term = get_term_by( 'slug', 'cap-' . $coauthor->user_nicename, $this->coauthor_taxonomy );
|
| 1423 |
+
if ( ! $term ) {
|
| 1424 |
+
$term = get_term_by( 'slug', $coauthor->user_nicename, $this->coauthor_taxonomy );
|
| 1425 |
+
}
|
| 1426 |
}
|
| 1427 |
wp_cache_set( $cache_key, $term, 'co-authors-plus' );
|
| 1428 |
return $term;
|
| 1478 |
function filter_ef_calendar_item_information_fields( $information_fields, $post_id ) {
|
| 1479 |
|
| 1480 |
// Don't add the author row again if another plugin has removed
|
| 1481 |
+
if ( ! array_key_exists( $this->coauthor_taxonomy, $information_fields ) ) {
|
| 1482 |
return $information_fields;
|
| 1483 |
}
|
| 1484 |
|
| 1485 |
$co_authors = get_coauthors( $post_id );
|
| 1486 |
if ( count( $co_authors ) > 1 ) {
|
| 1487 |
+
$information_fields[$this->coauthor_taxonomy]['label'] = __( 'Authors', 'co-authors-plus' );
|
| 1488 |
}
|
| 1489 |
$co_authors_names = '';
|
| 1490 |
foreach ( $co_authors as $co_author ) {
|
| 1491 |
$co_authors_names .= $co_author->display_name . ', ';
|
| 1492 |
}
|
| 1493 |
+
$information_fields[$this->coauthor_taxonomy]['value'] = rtrim( $co_authors_names, ', ' );
|
| 1494 |
return $information_fields;
|
| 1495 |
}
|
| 1496 |
|
| 1507 |
function filter_ef_story_budget_term_column_value( $column_name, $post, $parent_term ) {
|
| 1508 |
|
| 1509 |
// We only want to modify the 'author' column
|
| 1510 |
+
if ( $this->coauthor_taxonomy != $column_name ) {
|
| 1511 |
return $column_name;
|
| 1512 |
}
|
| 1513 |
|
| 1555 |
}
|
| 1556 |
|
| 1557 |
/**
|
| 1558 |
+
* Retrieve a list of author terms for a single post.
|
| 1559 |
*
|
| 1560 |
+
* Grabs a correctly ordered list of co-authors for a single post, appropriately
|
| 1561 |
* cached because it requires `wp_get_object_terms()` to succeed.
|
| 1562 |
*
|
| 1563 |
+
* @param int $post_id ID of the post for which to retrieve co-authors.
|
| 1564 |
* @return array Array of coauthor WP_Term objects
|
| 1565 |
*/
|
| 1566 |
public function get_coauthor_terms_for_post( $post_id ) {
|
| 1615 |
|
| 1616 |
}
|
| 1617 |
|
| 1618 |
+
/**
|
| 1619 |
+
* Filter of the header of author archive pages to correctly display author.
|
| 1620 |
+
*/
|
| 1621 |
+
public function filter_author_archive_title() {
|
| 1622 |
+
if ( is_author() ) {
|
| 1623 |
+
$author = sanitize_user( get_query_var( 'author_name' ) );
|
| 1624 |
+
return "Author: ". $author;
|
| 1625 |
+
}
|
| 1626 |
+
}
|
| 1627 |
}
|
| 1628 |
|
| 1629 |
global $coauthors_plus;
|
| 1769 |
}
|
| 1770 |
|
| 1771 |
/**
|
| 1772 |
+
* Retrieve a list of co-author terms for a single post.
|
| 1773 |
*
|
| 1774 |
* Grabs a correctly ordered list of authors for a single post, appropriately
|
| 1775 |
* cached because it requires `wp_get_object_terms()` to succeed.
|
|
@@ -42,7 +42,7 @@
|
|
| 42 |
width:200px;
|
| 43 |
}
|
| 44 |
#coauthors-list .ui-sortable-helper .coauthor-tag {
|
| 45 |
-
cursor:
|
| 46 |
cursor:-moz-grabbing;
|
| 47 |
cursor:-webkit-grabbing;
|
| 48 |
}
|
|
@@ -88,6 +88,7 @@
|
|
| 88 |
}
|
| 89 |
#coauthors-loading {
|
| 90 |
margin: 10px 0px 5px 10px;
|
|
|
|
| 91 |
}
|
| 92 |
|
| 93 |
#coauthors-readonly {
|
|
@@ -107,4 +108,4 @@
|
|
| 107 |
padding: 5px 3px;
|
| 108 |
margin-left: 30px;
|
| 109 |
font-size: 13px;
|
| 110 |
-
}
|
| 42 |
width:200px;
|
| 43 |
}
|
| 44 |
#coauthors-list .ui-sortable-helper .coauthor-tag {
|
| 45 |
+
cursor: grabbing;
|
| 46 |
cursor:-moz-grabbing;
|
| 47 |
cursor:-webkit-grabbing;
|
| 48 |
}
|
| 88 |
}
|
| 89 |
#coauthors-loading {
|
| 90 |
margin: 10px 0px 5px 10px;
|
| 91 |
+
float: left;
|
| 92 |
}
|
| 93 |
|
| 94 |
#coauthors-readonly {
|
| 108 |
padding: 5px 3px;
|
| 109 |
margin-left: 30px;
|
| 110 |
font-size: 13px;
|
| 111 |
+
}
|
|
@@ -11,7 +11,7 @@ jQuery( document ).ready(function () {
|
|
| 11 |
return false;
|
| 12 |
};
|
| 13 |
|
| 14 |
-
var $coauthors_loading;
|
| 15 |
|
| 16 |
function coauthors_delete( elem ) {
|
| 17 |
|
|
@@ -39,9 +39,9 @@ jQuery( document ).ready(function () {
|
|
| 39 |
}
|
| 40 |
|
| 41 |
/*
|
| 42 |
-
* Save
|
| 43 |
-
* @param int Author ID
|
| 44 |
-
* @param string Author Name
|
| 45 |
* @param object The autosuggest input box
|
| 46 |
*/
|
| 47 |
function coauthors_save_coauthor( author, co ) {
|
|
@@ -59,8 +59,8 @@ jQuery( document ).ready(function () {
|
|
| 59 |
|
| 60 |
|
| 61 |
/*
|
| 62 |
-
* Add
|
| 63 |
-
* @param string Author Name
|
| 64 |
* @param object The autosuggest input box
|
| 65 |
* @param boolean Initial set up or not?
|
| 66 |
*/
|
|
@@ -70,11 +70,11 @@ jQuery( document ).ready(function () {
|
|
| 70 |
if ( co && co.siblings( '.coauthor-tag' ).length ) {
|
| 71 |
coauthors_save_coauthor( author, co );
|
| 72 |
} else {
|
| 73 |
-
// Not editing, so we create a new author entry
|
| 74 |
if ( count == 0 ) {
|
| 75 |
var coName = ( count == 0 ) ? 'coauthors-main' : '';
|
| 76 |
-
// Add new author to <select>
|
| 77 |
-
//coauthors_select_author( author );
|
| 78 |
}
|
| 79 |
var options = { addDelete: true, addEdit: false };
|
| 80 |
|
|
@@ -98,8 +98,9 @@ jQuery( document ).ready(function () {
|
|
| 98 |
|
| 99 |
co.bind( 'blur', coauthors_stop_editing );
|
| 100 |
|
| 101 |
-
// Set the value for the auto-suggest box to the
|
| 102 |
-
|
|
|
|
| 103 |
.hide()
|
| 104 |
.unbind( 'focus' )
|
| 105 |
;
|
|
@@ -132,8 +133,8 @@ jQuery( document ).ready(function () {
|
|
| 132 |
}
|
| 133 |
|
| 134 |
/*
|
| 135 |
-
* Adds a delete and edit button next to
|
| 136 |
-
* @param object The row to which the new author should be added
|
| 137 |
*/
|
| 138 |
function coauthors_insert_author_edit_cells( $div, options ){
|
| 139 |
|
|
@@ -156,7 +157,7 @@ jQuery( document ).ready(function () {
|
|
| 156 |
|
| 157 |
/*
|
| 158 |
* Creates autosuggest input box
|
| 159 |
-
* @param string [optional] Name of the author
|
| 160 |
* @param string [optional] Name to be applied to the input box
|
| 161 |
*/
|
| 162 |
function coauthors_create_autosuggest( authorName, inputName ) {
|
|
@@ -178,7 +179,7 @@ jQuery( document ).ready(function () {
|
|
| 178 |
;
|
| 179 |
|
| 180 |
if ( authorName )
|
| 181 |
-
$co.attr( 'value',
|
| 182 |
else
|
| 183 |
$co.attr( 'value', coAuthorsPlusStrings.search_box_text )
|
| 184 |
.focus( function(){ $co.val( '' ) } )
|
|
@@ -189,7 +190,7 @@ jQuery( document ).ready(function () {
|
|
| 189 |
|
| 190 |
}
|
| 191 |
|
| 192 |
-
// Callback for when a user selects
|
| 193 |
function coauthors_autosuggest_select() {
|
| 194 |
$this = jQuery( this );
|
| 195 |
var vals = this.value.split( '|' );
|
|
@@ -199,7 +200,9 @@ jQuery( document ).ready(function () {
|
|
| 199 |
author.login = jQuery.trim( vals[1] );
|
| 200 |
author.name = jQuery.trim( vals[2] );
|
| 201 |
author.email = jQuery.trim( vals[3] );
|
| 202 |
-
|
|
|
|
|
|
|
| 203 |
|
| 204 |
if ( author.id=='New' ) {
|
| 205 |
coauthors_new_author_display( name );
|
|
@@ -234,13 +237,13 @@ jQuery( document ).ready(function () {
|
|
| 234 |
}
|
| 235 |
|
| 236 |
/*
|
| 237 |
-
* Creates the text tag for
|
| 238 |
-
* @param string Name of the author
|
| 239 |
*/
|
| 240 |
function coauthors_create_author_tag( author ) {
|
| 241 |
|
| 242 |
var $tag = jQuery( '<span></span>' )
|
| 243 |
-
.
|
| 244 |
.attr( 'title', coAuthorsPlusStrings.input_box_title )
|
| 245 |
.addClass( 'coauthor-tag' )
|
| 246 |
// Add Click event to edit
|
|
@@ -278,8 +281,8 @@ jQuery( document ).ready(function () {
|
|
| 278 |
}
|
| 279 |
|
| 280 |
/*
|
| 281 |
-
* Creates the text tag for
|
| 282 |
-
* @param string Name of the author
|
| 283 |
*/
|
| 284 |
function coauthors_create_author_hidden_input ( author ) {
|
| 285 |
var input = jQuery( '<input />' )
|
|
@@ -287,7 +290,7 @@ jQuery( document ).ready(function () {
|
|
| 287 |
'type': 'hidden',
|
| 288 |
'id': 'coauthors_hidden_input',
|
| 289 |
'name': 'coauthors[]',
|
| 290 |
-
'value':
|
| 291 |
})
|
| 292 |
;
|
| 293 |
|
|
@@ -319,7 +322,7 @@ jQuery( document ).ready(function () {
|
|
| 319 |
$coauthors_div.append( table );
|
| 320 |
}
|
| 321 |
|
| 322 |
-
// Select authors already added to the post
|
| 323 |
var addedAlready = [];
|
| 324 |
//jQuery('#the-list tr').each(function(){
|
| 325 |
var count = 0;
|
|
@@ -337,11 +340,11 @@ jQuery( document ).ready(function () {
|
|
| 337 |
var newCO = coauthors_create_autosuggest( '', false );
|
| 338 |
coauthors_add_to_table( newCO );
|
| 339 |
|
| 340 |
-
$coauthors_loading = jQuery( '#
|
| 341 |
move_loading( newCO );
|
| 342 |
|
| 343 |
|
| 344 |
-
// Make co-authors sortable so an editor can control the order of the authors
|
| 345 |
jQuery( '#coauthors-edit' ).ready(function( $ ) {
|
| 346 |
$( '#coauthors-list' ).sortable({
|
| 347 |
axis: 'y',
|
|
@@ -398,7 +401,7 @@ jQuery( document ).ready(function () {
|
|
| 398 |
});
|
| 399 |
}
|
| 400 |
|
| 401 |
-
// Remove the read-only
|
| 402 |
jQuery( '#coauthors-readonly' ).remove();
|
| 403 |
coauthors_initialize( post_coauthors );
|
| 404 |
}
|
|
@@ -425,7 +428,7 @@ jQuery( document ).ready(function () {
|
|
| 425 |
var el = jQuery( '.inline-edit-group.inline-edit-coauthors', '#edit-' + postId );
|
| 426 |
el.detach().appendTo( '.quick-edit-row .inline-edit-col-left .inline-edit-col' ).show();
|
| 427 |
|
| 428 |
-
// initialize
|
| 429 |
var post_coauthors = jQuery.map( jQuery( '.column-coauthors a', $postRow ), function( el ) {
|
| 430 |
return {
|
| 431 |
login: jQuery( el ).data( 'user_login' ),
|
| 11 |
return false;
|
| 12 |
};
|
| 13 |
|
| 14 |
+
var $coauthors_loading = jQuery("<span id='ajax-loading'></span>");
|
| 15 |
|
| 16 |
function coauthors_delete( elem ) {
|
| 17 |
|
| 39 |
}
|
| 40 |
|
| 41 |
/*
|
| 42 |
+
* Save co-author
|
| 43 |
+
* @param int Co-Author ID
|
| 44 |
+
* @param string Co-Author Name
|
| 45 |
* @param object The autosuggest input box
|
| 46 |
*/
|
| 47 |
function coauthors_save_coauthor( author, co ) {
|
| 59 |
|
| 60 |
|
| 61 |
/*
|
| 62 |
+
* Add co-author
|
| 63 |
+
* @param string Co-Author Name
|
| 64 |
* @param object The autosuggest input box
|
| 65 |
* @param boolean Initial set up or not?
|
| 66 |
*/
|
| 70 |
if ( co && co.siblings( '.coauthor-tag' ).length ) {
|
| 71 |
coauthors_save_coauthor( author, co );
|
| 72 |
} else {
|
| 73 |
+
// Not editing, so we create a new co-author entry
|
| 74 |
if ( count == 0 ) {
|
| 75 |
var coName = ( count == 0 ) ? 'coauthors-main' : '';
|
| 76 |
+
// Add new co-author to <select>
|
| 77 |
+
//coauthors_select_author( co-author );
|
| 78 |
}
|
| 79 |
var options = { addDelete: true, addEdit: false };
|
| 80 |
|
| 98 |
|
| 99 |
co.bind( 'blur', coauthors_stop_editing );
|
| 100 |
|
| 101 |
+
// Set the value for the auto-suggest box to the co-author's name and hide it
|
| 102 |
+
// unescape() is deprecated, so replacing it with decodeURIComponent() here and every places.
|
| 103 |
+
co.val( decodeURIComponent( author.name ) )
|
| 104 |
.hide()
|
| 105 |
.unbind( 'focus' )
|
| 106 |
;
|
| 133 |
}
|
| 134 |
|
| 135 |
/*
|
| 136 |
+
* Adds a delete and edit button next to a co-author
|
| 137 |
+
* @param object The row to which the new co-author should be added
|
| 138 |
*/
|
| 139 |
function coauthors_insert_author_edit_cells( $div, options ){
|
| 140 |
|
| 157 |
|
| 158 |
/*
|
| 159 |
* Creates autosuggest input box
|
| 160 |
+
* @param string [optional] Name of the co-author
|
| 161 |
* @param string [optional] Name to be applied to the input box
|
| 162 |
*/
|
| 163 |
function coauthors_create_autosuggest( authorName, inputName ) {
|
| 179 |
;
|
| 180 |
|
| 181 |
if ( authorName )
|
| 182 |
+
$co.attr( 'value', decodeURIComponent( authorName ) );
|
| 183 |
else
|
| 184 |
$co.attr( 'value', coAuthorsPlusStrings.search_box_text )
|
| 185 |
.focus( function(){ $co.val( '' ) } )
|
| 190 |
|
| 191 |
}
|
| 192 |
|
| 193 |
+
// Callback for when a user selects a co-author
|
| 194 |
function coauthors_autosuggest_select() {
|
| 195 |
$this = jQuery( this );
|
| 196 |
var vals = this.value.split( '|' );
|
| 200 |
author.login = jQuery.trim( vals[1] );
|
| 201 |
author.name = jQuery.trim( vals[2] );
|
| 202 |
author.email = jQuery.trim( vals[3] );
|
| 203 |
+
|
| 204 |
+
// Decode user-nicename if it has special characters in it.
|
| 205 |
+
author.nicename = decodeURIComponent( jQuery.trim( vals[4] ) );
|
| 206 |
|
| 207 |
if ( author.id=='New' ) {
|
| 208 |
coauthors_new_author_display( name );
|
| 237 |
}
|
| 238 |
|
| 239 |
/*
|
| 240 |
+
* Creates the text tag for a co-author
|
| 241 |
+
* @param string Name of the co-author
|
| 242 |
*/
|
| 243 |
function coauthors_create_author_tag( author ) {
|
| 244 |
|
| 245 |
var $tag = jQuery( '<span></span>' )
|
| 246 |
+
.text( decodeURIComponent( author.name ) )
|
| 247 |
.attr( 'title', coAuthorsPlusStrings.input_box_title )
|
| 248 |
.addClass( 'coauthor-tag' )
|
| 249 |
// Add Click event to edit
|
| 281 |
}
|
| 282 |
|
| 283 |
/*
|
| 284 |
+
* Creates the text tag for a co-author
|
| 285 |
+
* @param string Name of the co-author
|
| 286 |
*/
|
| 287 |
function coauthors_create_author_hidden_input ( author ) {
|
| 288 |
var input = jQuery( '<input />' )
|
| 290 |
'type': 'hidden',
|
| 291 |
'id': 'coauthors_hidden_input',
|
| 292 |
'name': 'coauthors[]',
|
| 293 |
+
'value': decodeURIComponent( author.nicename )
|
| 294 |
})
|
| 295 |
;
|
| 296 |
|
| 322 |
$coauthors_div.append( table );
|
| 323 |
}
|
| 324 |
|
| 325 |
+
// Select co-authors already added to the post
|
| 326 |
var addedAlready = [];
|
| 327 |
//jQuery('#the-list tr').each(function(){
|
| 328 |
var count = 0;
|
| 340 |
var newCO = coauthors_create_autosuggest( '', false );
|
| 341 |
coauthors_add_to_table( newCO );
|
| 342 |
|
| 343 |
+
$coauthors_loading = jQuery( '#publishing-action .spinner' ).clone().attr( 'id', 'coauthors-loading' );
|
| 344 |
move_loading( newCO );
|
| 345 |
|
| 346 |
|
| 347 |
+
// Make co-authors sortable so an editor can control the order of the co-authors
|
| 348 |
jQuery( '#coauthors-edit' ).ready(function( $ ) {
|
| 349 |
$( '#coauthors-list' ).sortable({
|
| 350 |
axis: 'y',
|
| 401 |
});
|
| 402 |
}
|
| 403 |
|
| 404 |
+
// Remove the read-only co-authors so we don't get craziness
|
| 405 |
jQuery( '#coauthors-readonly' ).remove();
|
| 406 |
coauthors_initialize( post_coauthors );
|
| 407 |
}
|
| 428 |
var el = jQuery( '.inline-edit-group.inline-edit-coauthors', '#edit-' + postId );
|
| 429 |
el.detach().appendTo( '.quick-edit-row .inline-edit-col-left .inline-edit-col' ).show();
|
| 430 |
|
| 431 |
+
// initialize co-authors
|
| 432 |
var post_coauthors = jQuery.map( jQuery( '.column-coauthors a', $postRow ), function( el ) {
|
| 433 |
return {
|
| 434 |
login: jQuery( el ).data( 'user_login' ),
|
|
@@ -89,9 +89,13 @@ class CoAuthors_Guest_Authors
|
|
| 89 |
'not_found_in_trash' => __( 'No guest authors found in Trash', 'co-authors-plus' ),
|
| 90 |
'update_item' => __( 'Update Guest Author', 'co-authors-plus' ),
|
| 91 |
'metabox_about' => __( 'About the guest author', 'co-authors-plus' ),
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
) );
|
| 93 |
|
| 94 |
-
// Register a post type to store our authors
|
| 95 |
$args = array(
|
| 96 |
'label' => $this->labels['singular'],
|
| 97 |
'labels' => array(
|
|
@@ -106,6 +110,10 @@ class CoAuthors_Guest_Authors
|
|
| 106 |
'search_items' => $this->labels['search_items'],
|
| 107 |
'not_found' => $this->labels['not_found'],
|
| 108 |
'not_found_in_trash' => $this->labels['not_found_in_trash'],
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
),
|
| 110 |
'public' => true,
|
| 111 |
'publicly_queryable' => false,
|
|
@@ -123,17 +131,7 @@ class CoAuthors_Guest_Authors
|
|
| 123 |
register_post_type( $this->post_type, $args );
|
| 124 |
|
| 125 |
// Some of the common sizes used by get_avatar
|
| 126 |
-
$this->avatar_sizes = array(
|
| 127 |
-
32,
|
| 128 |
-
50,
|
| 129 |
-
64,
|
| 130 |
-
96,
|
| 131 |
-
128,
|
| 132 |
-
);
|
| 133 |
-
$this->avatar_sizes = apply_filters( 'coauthors_guest_author_avatar_sizes', $this->avatar_sizes );
|
| 134 |
-
foreach ( $this->avatar_sizes as $size ) {
|
| 135 |
-
add_image_size( 'guest-author-' . $size, $size, $size, true );
|
| 136 |
-
}
|
| 137 |
|
| 138 |
// Hacky way to remove the title and the editor
|
| 139 |
remove_post_type_support( $this->post_type, 'title' );
|
|
@@ -177,7 +175,7 @@ class CoAuthors_Guest_Authors
|
|
| 177 |
|
| 178 |
/**
|
| 179 |
* Handle the admin action to create a guest author based
|
| 180 |
-
* on an existing
|
| 181 |
*
|
| 182 |
* @since 3.0
|
| 183 |
*/
|
|
@@ -203,6 +201,8 @@ class CoAuthors_Guest_Authors
|
|
| 203 |
wp_die( esc_html( $post_id->get_error_message() ) );
|
| 204 |
}
|
| 205 |
|
|
|
|
|
|
|
| 206 |
// Redirect to the edit Guest Author screen
|
| 207 |
$edit_link = get_edit_post_link( $post_id, 'redirect' );
|
| 208 |
$redirect_to = add_query_arg( 'message', 'guest-author-created', $edit_link );
|
|
@@ -273,6 +273,8 @@ class CoAuthors_Guest_Authors
|
|
| 273 |
$args['message'] = 'delete-error';
|
| 274 |
} else {
|
| 275 |
$args['message'] = 'guest-author-deleted';
|
|
|
|
|
|
|
| 276 |
}
|
| 277 |
|
| 278 |
// Redirect to safety
|
|
@@ -463,36 +465,75 @@ class CoAuthors_Guest_Authors
|
|
| 463 |
wp_die( esc_html( sprintf( __( "%s can't be deleted because it doesn't exist.", 'co-authors-plus' ), $this->labels['singular'] ) ) );
|
| 464 |
}
|
| 465 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 466 |
echo '<div class="wrap">';
|
| 467 |
echo '<div class="icon32" id="icon-users"><br/></div>';
|
| 468 |
echo '<h2>' . esc_html( sprintf( __( 'Delete %s', 'co-authors-plus ' ), $this->labels['plural'] ) ) . '</h2>';
|
| 469 |
echo '<p>' . esc_html( sprintf( __( 'You have specified this %s for deletion:', 'co-authors-plus' ), strtolower( $this->labels['singular'] ) ) ) . '</p>';
|
| 470 |
echo '<p>#' . esc_html( $guest_author->ID . ': ' . $guest_author->display_name ) . '</p>';
|
| 471 |
-
|
| 472 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 473 |
echo '<form method="POST" action="' . esc_url( add_query_arg( 'page', 'view-guest-authors', admin_url( $this->parent_page ) ) ) . '">';
|
| 474 |
// Hidden stuffs
|
| 475 |
echo '<input type="hidden" name="action" value="delete-guest-author" />';
|
| 476 |
wp_nonce_field( 'delete-guest-author' );
|
| 477 |
echo '<input type="hidden" id="id" name="id" value="' . esc_attr( (int) $_GET['id'] ) . '" />';
|
| 478 |
echo '<fieldset><ul style="list-style-type:none;">';
|
| 479 |
-
//
|
| 480 |
-
|
| 481 |
-
|
| 482 |
-
|
| 483 |
-
|
| 484 |
-
|
| 485 |
-
|
| 486 |
-
|
| 487 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 488 |
echo '</label></li>';
|
| 489 |
}
|
| 490 |
-
|
| 491 |
-
|
| 492 |
-
|
| 493 |
-
echo '</label></li>';
|
| 494 |
echo '</ul></fieldset>';
|
| 495 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 496 |
echo '</form>';
|
| 497 |
echo '</div>';
|
| 498 |
} else {
|
|
@@ -592,7 +633,7 @@ class CoAuthors_Guest_Authors
|
|
| 592 |
}
|
| 593 |
|
| 594 |
/**
|
| 595 |
-
* Metabox to display all of the pertient names for a Guest Author
|
| 596 |
*
|
| 597 |
* @since 3.0
|
| 598 |
*/
|
|
@@ -627,7 +668,8 @@ class CoAuthors_Guest_Authors
|
|
| 627 |
}
|
| 628 |
|
| 629 |
/**
|
| 630 |
-
* Metabox to display all of the pertient contact details for a Guest Author
|
|
|
|
| 631 |
*
|
| 632 |
* @since 3.0
|
| 633 |
*/
|
|
@@ -931,11 +973,8 @@ class CoAuthors_Guest_Authors
|
|
| 931 |
$args = array(
|
| 932 |
'class' => "avatar avatar-{$size} photo",
|
| 933 |
);
|
| 934 |
-
|
| 935 |
-
|
| 936 |
-
} else {
|
| 937 |
-
$size = array( $size, $size );
|
| 938 |
-
}
|
| 939 |
|
| 940 |
$thumbnail = get_the_post_thumbnail( $guest_author->ID, $size, $args );
|
| 941 |
|
| 89 |
'not_found_in_trash' => __( 'No guest authors found in Trash', 'co-authors-plus' ),
|
| 90 |
'update_item' => __( 'Update Guest Author', 'co-authors-plus' ),
|
| 91 |
'metabox_about' => __( 'About the guest author', 'co-authors-plus' ),
|
| 92 |
+
'featured_image' => __( 'Avatar', 'co-authors-plus' ),
|
| 93 |
+
'set_featured_image' => __( 'Set Avatar', 'co-authors-plus' ),
|
| 94 |
+
'use_featured_image' => __( 'Use Avatar', 'co-authors-plus' ),
|
| 95 |
+
'remove_featured_image' => __( 'Remove Avatar', 'co-authors-plus' ),
|
| 96 |
) );
|
| 97 |
|
| 98 |
+
// Register a post type to store our guest authors
|
| 99 |
$args = array(
|
| 100 |
'label' => $this->labels['singular'],
|
| 101 |
'labels' => array(
|
| 110 |
'search_items' => $this->labels['search_items'],
|
| 111 |
'not_found' => $this->labels['not_found'],
|
| 112 |
'not_found_in_trash' => $this->labels['not_found_in_trash'],
|
| 113 |
+
'featured_image' => $this->labels['featured_image'],
|
| 114 |
+
'set_featured_image' => $this->labels['set_featured_image'],
|
| 115 |
+
'use_featured_image' => $this->labels['use_featured_image'],
|
| 116 |
+
'remove_featured_image' => $this->labels['remove_featured_image']
|
| 117 |
),
|
| 118 |
'public' => true,
|
| 119 |
'publicly_queryable' => false,
|
| 131 |
register_post_type( $this->post_type, $args );
|
| 132 |
|
| 133 |
// Some of the common sizes used by get_avatar
|
| 134 |
+
$this->avatar_sizes = array();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
|
| 136 |
// Hacky way to remove the title and the editor
|
| 137 |
remove_post_type_support( $this->post_type, 'title' );
|
| 175 |
|
| 176 |
/**
|
| 177 |
* Handle the admin action to create a guest author based
|
| 178 |
+
* on an existing user
|
| 179 |
*
|
| 180 |
* @since 3.0
|
| 181 |
*/
|
| 201 |
wp_die( esc_html( $post_id->get_error_message() ) );
|
| 202 |
}
|
| 203 |
|
| 204 |
+
do_action( 'cap_guest_author_create' );
|
| 205 |
+
|
| 206 |
// Redirect to the edit Guest Author screen
|
| 207 |
$edit_link = get_edit_post_link( $post_id, 'redirect' );
|
| 208 |
$redirect_to = add_query_arg( 'message', 'guest-author-created', $edit_link );
|
| 273 |
$args['message'] = 'delete-error';
|
| 274 |
} else {
|
| 275 |
$args['message'] = 'guest-author-deleted';
|
| 276 |
+
|
| 277 |
+
do_action( 'cap_guest_author_del' );
|
| 278 |
}
|
| 279 |
|
| 280 |
// Redirect to safety
|
| 465 |
wp_die( esc_html( sprintf( __( "%s can't be deleted because it doesn't exist.", 'co-authors-plus' ), $this->labels['singular'] ) ) );
|
| 466 |
}
|
| 467 |
|
| 468 |
+
// get post count
|
| 469 |
+
global $coauthors_plus;
|
| 470 |
+
$term = $coauthors_plus->get_author_term( $guest_author );
|
| 471 |
+
if ( $term ) {
|
| 472 |
+
$count = $term->count;
|
| 473 |
+
} else {
|
| 474 |
+
$count = 0;
|
| 475 |
+
}
|
| 476 |
+
|
| 477 |
echo '<div class="wrap">';
|
| 478 |
echo '<div class="icon32" id="icon-users"><br/></div>';
|
| 479 |
echo '<h2>' . esc_html( sprintf( __( 'Delete %s', 'co-authors-plus ' ), $this->labels['plural'] ) ) . '</h2>';
|
| 480 |
echo '<p>' . esc_html( sprintf( __( 'You have specified this %s for deletion:', 'co-authors-plus' ), strtolower( $this->labels['singular'] ) ) ) . '</p>';
|
| 481 |
echo '<p>#' . esc_html( $guest_author->ID . ': ' . $guest_author->display_name ) . '</p>';
|
| 482 |
+
// display wording differently per post count
|
| 483 |
+
if ( 0 === $count ) {
|
| 484 |
+
$post_count_message = '<p>' . sprintf( __( 'There are no posts associated with this guest author.', 'co-authors-plus' ), strtolower( $this->labels['singular'] ) ) . '</p>';
|
| 485 |
+
}
|
| 486 |
+
else {
|
| 487 |
+
$note = '<p class="description">' . sprintf( __( "Note: If you'd like to delete the %s and all of their posts, you should delete their posts first and then come back to delete the %s.", 'co-authors-plus' ), strtolower( $this->labels['singular'] ), strtolower( $this->labels['singular'] ) ) . '</p>';
|
| 488 |
+
if ( 1 === $count ) {
|
| 489 |
+
$post_count_message = '<p>' . sprintf( __( 'There is %d post associated with this guest author. What should be done with the post assigned to this %s?', 'co-authors-plus' ), $count, strtolower( $this->labels['singular'] ) ) . '</p>';
|
| 490 |
+
}
|
| 491 |
+
else {
|
| 492 |
+
$post_count_message = '<p>' . sprintf( __( 'There are %d posts associated with this guest author. What should be done with the posts assigned to this %s?', 'co-authors-plus' ), $count, strtolower( $this->labels['singular'] ) ) . '</p>';
|
| 493 |
+
}
|
| 494 |
+
$post_count_message .= $note;
|
| 495 |
+
}
|
| 496 |
+
$allowed_html = array(
|
| 497 |
+
'p' => array(
|
| 498 |
+
'class' => array(),
|
| 499 |
+
),
|
| 500 |
+
);
|
| 501 |
+
echo wp_kses( $post_count_message, $allowed_html );
|
| 502 |
echo '<form method="POST" action="' . esc_url( add_query_arg( 'page', 'view-guest-authors', admin_url( $this->parent_page ) ) ) . '">';
|
| 503 |
// Hidden stuffs
|
| 504 |
echo '<input type="hidden" name="action" value="delete-guest-author" />';
|
| 505 |
wp_nonce_field( 'delete-guest-author' );
|
| 506 |
echo '<input type="hidden" id="id" name="id" value="' . esc_attr( (int) $_GET['id'] ) . '" />';
|
| 507 |
echo '<fieldset><ul style="list-style-type:none;">';
|
| 508 |
+
// only show delete options if post count > 0
|
| 509 |
+
if ( $count > 0 ) {
|
| 510 |
+
// Reassign to another user
|
| 511 |
+
echo '<li class="hide-if-no-js"><label for="reassign-another">';
|
| 512 |
+
echo '<input type="radio" id="reassign-another" name="reassign" class="reassign-option" value="reassign-another" /> ' . esc_html__( 'Reassign to another co-author:', 'co-authors-plus' ) . ' </label>';
|
| 513 |
+
echo '<input type="hidden" id="leave-assigned-to" name="leave-assigned-to" style="width:200px;" />';
|
| 514 |
+
echo '</li>';
|
| 515 |
+
// Leave mapped to a linked account
|
| 516 |
+
if ( get_user_by( 'login', $guest_author->linked_account ) ) {
|
| 517 |
+
echo '<li><label for="leave-assigned">';
|
| 518 |
+
echo '<input type="radio" id="leave-assigned" class="reassign-option" name="reassign" value="leave-assigned" /> ' . esc_html( sprintf( __( 'Leave posts assigned to the mapped user, %s.', 'co-authors-plus' ), $guest_author->linked_account ) );
|
| 519 |
+
echo '</label></li>';
|
| 520 |
+
}
|
| 521 |
+
// Remove bylines from the posts
|
| 522 |
+
echo '<li><label for="remove-byline">';
|
| 523 |
+
echo '<input type="radio" id="remove-byline" class="reassign-option" name="reassign" value="remove-byline" /> ' . esc_html__( 'Remove byline from posts (but leave each post in its current status).', 'co-authors-plus' );
|
| 524 |
echo '</label></li>';
|
| 525 |
}
|
| 526 |
+
else {
|
| 527 |
+
echo '<input type="hidden" id="remove-byline" class="reassign-option" name="reassign" value="remove-byline" checked="checked" />';
|
| 528 |
+
}
|
|
|
|
| 529 |
echo '</ul></fieldset>';
|
| 530 |
+
// disable disabled submit button for 0 post count
|
| 531 |
+
if ( 0 === $count ) {
|
| 532 |
+
submit_button( __( 'Confirm Deletion', 'co-authors-plus' ), 'secondary', 'submit', true );
|
| 533 |
+
}
|
| 534 |
+
else {
|
| 535 |
+
submit_button( __( 'Confirm Deletion', 'co-authors-plus' ), 'secondary', 'submit', true, array( 'disabled' => 'disabled' ) );
|
| 536 |
+
}
|
| 537 |
echo '</form>';
|
| 538 |
echo '</div>';
|
| 539 |
} else {
|
| 633 |
}
|
| 634 |
|
| 635 |
/**
|
| 636 |
+
* Metabox to display all of the pertient names for a Guest Author not linked to user account
|
| 637 |
*
|
| 638 |
* @since 3.0
|
| 639 |
*/
|
| 668 |
}
|
| 669 |
|
| 670 |
/**
|
| 671 |
+
* Metabox to display all of the pertient contact details for a Guest Author not linked to
|
| 672 |
+
* user account
|
| 673 |
*
|
| 674 |
* @since 3.0
|
| 675 |
*/
|
| 973 |
$args = array(
|
| 974 |
'class' => "avatar avatar-{$size} photo",
|
| 975 |
);
|
| 976 |
+
|
| 977 |
+
$size = array( $size, $size );
|
|
|
|
|
|
|
|
|
|
| 978 |
|
| 979 |
$thumbnail = get_the_post_thumbnail( $guest_author->ID, $size, $args );
|
| 980 |
|
|
@@ -137,10 +137,10 @@ class CoAuthors_WP_List_Table extends WP_List_Table {
|
|
| 137 |
}
|
| 138 |
|
| 139 |
/**
|
| 140 |
-
* Either there are no
|
| 141 |
*/
|
| 142 |
function no_items() {
|
| 143 |
-
esc_html_e( 'No matching
|
| 144 |
}
|
| 145 |
|
| 146 |
/**
|
|
@@ -251,7 +251,10 @@ class CoAuthors_WP_List_Table extends WP_List_Table {
|
|
| 251 |
function column_posts( $item ) {
|
| 252 |
global $coauthors_plus;
|
| 253 |
$term = $coauthors_plus->get_author_term( $item );
|
| 254 |
-
|
|
|
|
|
|
|
|
|
|
| 255 |
$count = $term->count;
|
| 256 |
} else {
|
| 257 |
$count = 0;
|
| 137 |
}
|
| 138 |
|
| 139 |
/**
|
| 140 |
+
* Either there are no co-authors, or the search doesn't match any
|
| 141 |
*/
|
| 142 |
function no_items() {
|
| 143 |
+
esc_html_e( 'No matching co-authors were found.', 'co-authors-plus' );
|
| 144 |
}
|
| 145 |
|
| 146 |
/**
|
| 251 |
function column_posts( $item ) {
|
| 252 |
global $coauthors_plus;
|
| 253 |
$term = $coauthors_plus->get_author_term( $item );
|
| 254 |
+
$guest_term = get_term_by( 'slug', 'cap-' . $item->user_nicename, $coauthors_plus->coauthor_taxonomy );
|
| 255 |
+
if ( ! empty( $item->linked_account ) && $guest_term->count ) {
|
| 256 |
+
$count = count_user_posts( get_user_by( 'slug', $item->linked_account )->ID );
|
| 257 |
+
} elseif ( $term ) {
|
| 258 |
$count = $term->count;
|
| 259 |
} else {
|
| 260 |
$count = 0;
|
|
@@ -28,6 +28,7 @@ class CoAuthorsPlus_Command extends WP_CLI_Command {
|
|
| 28 |
$users = get_users();
|
| 29 |
$created = 0;
|
| 30 |
$skipped = 0;
|
|
|
|
| 31 |
foreach ( $users as $user ) {
|
| 32 |
|
| 33 |
$result = $coauthors_plus->guest_authors->create_guest_author_from_user_id( $user->ID );
|
|
@@ -36,12 +37,12 @@ class CoAuthorsPlus_Command extends WP_CLI_Command {
|
|
| 36 |
} else {
|
| 37 |
$created++;
|
| 38 |
}
|
|
|
|
| 39 |
}
|
| 40 |
-
|
| 41 |
WP_CLI::line( 'All done! Here are your results:' );
|
| 42 |
WP_CLI::line( "- {$created} guest author profiles were created" );
|
| 43 |
WP_CLI::line( "- {$skipped} users already had guest author profiles" );
|
| 44 |
-
|
| 45 |
}
|
| 46 |
|
| 47 |
/**
|
|
@@ -78,7 +79,7 @@ class CoAuthorsPlus_Command extends WP_CLI_Command {
|
|
| 78 |
|
| 79 |
$terms = cap_get_coauthor_terms_for_post( $single_post->ID );
|
| 80 |
if ( empty( $terms ) ) {
|
| 81 |
-
WP_CLI::
|
| 82 |
}
|
| 83 |
|
| 84 |
if ( ! empty( $terms ) ) {
|
|
@@ -115,7 +116,7 @@ class CoAuthorsPlus_Command extends WP_CLI_Command {
|
|
| 115 |
}
|
| 116 |
|
| 117 |
/**
|
| 118 |
-
* Subcommand to assign
|
| 119 |
*
|
| 120 |
* @since 3.0
|
| 121 |
*
|
|
@@ -248,8 +249,8 @@ class CoAuthorsPlus_Command extends WP_CLI_Command {
|
|
| 248 |
$coauthors_plus->add_coauthors( $post_id, array( $coauthor->user_login ) );
|
| 249 |
WP_CLI::line( sprintf( __( "Updating - Adding %s's byline to post #%d", 'co-authors-plus' ), $coauthor->user_login, $post_id ) );
|
| 250 |
$affected++;
|
| 251 |
-
if ( $affected && 0 === $affected %
|
| 252 |
-
sleep(
|
| 253 |
}
|
| 254 |
}
|
| 255 |
WP_CLI::success( sprintf( __( 'All done! %d posts were affected.', 'co-authors-plus' ), $affected ) );
|
|
@@ -408,8 +409,8 @@ class CoAuthorsPlus_Command extends WP_CLI_Command {
|
|
| 408 |
}
|
| 409 |
|
| 410 |
/**
|
| 411 |
-
* Swap one
|
| 412 |
-
* this leaves the original
|
| 413 |
*
|
| 414 |
* @subcommand swap-coauthors
|
| 415 |
* @synopsis --from=<user-login> --to=<user-login> [--post_type=<ptype>] [--dry=<dry>]
|
|
@@ -611,7 +612,7 @@ class CoAuthorsPlus_Command extends WP_CLI_Command {
|
|
| 611 |
}
|
| 612 |
|
| 613 |
/**
|
| 614 |
-
* Update the post count and description for each author
|
| 615 |
*
|
| 616 |
* @since 3.0
|
| 617 |
*
|
|
@@ -734,7 +735,7 @@ class CoAuthorsPlus_Command extends WP_CLI_Command {
|
|
| 734 |
}
|
| 735 |
|
| 736 |
if ( ! class_exists( 'WXR_Parser' ) ) {
|
| 737 |
-
require_once( WP_CONTENT_DIR . '/
|
| 738 |
}
|
| 739 |
|
| 740 |
$parser = new WXR_Parser();
|
| 28 |
$users = get_users();
|
| 29 |
$created = 0;
|
| 30 |
$skipped = 0;
|
| 31 |
+
$progress = \WP_CLI\Utils\make_progress_bar( 'Processing guest authors...', count ( $users ) );
|
| 32 |
foreach ( $users as $user ) {
|
| 33 |
|
| 34 |
$result = $coauthors_plus->guest_authors->create_guest_author_from_user_id( $user->ID );
|
| 37 |
} else {
|
| 38 |
$created++;
|
| 39 |
}
|
| 40 |
+
$progress->tick();
|
| 41 |
}
|
| 42 |
+
$progress->finish();
|
| 43 |
WP_CLI::line( 'All done! Here are your results:' );
|
| 44 |
WP_CLI::line( "- {$created} guest author profiles were created" );
|
| 45 |
WP_CLI::line( "- {$skipped} users already had guest author profiles" );
|
|
|
|
| 46 |
}
|
| 47 |
|
| 48 |
/**
|
| 79 |
|
| 80 |
$terms = cap_get_coauthor_terms_for_post( $single_post->ID );
|
| 81 |
if ( empty( $terms ) ) {
|
| 82 |
+
WP_CLI::line( sprintf( 'No co-authors found for post #%d.', $single_post->ID ) );
|
| 83 |
}
|
| 84 |
|
| 85 |
if ( ! empty( $terms ) ) {
|
| 116 |
}
|
| 117 |
|
| 118 |
/**
|
| 119 |
+
* Subcommand to assign co-authors to a post based on a given meta key
|
| 120 |
*
|
| 121 |
* @since 3.0
|
| 122 |
*
|
| 249 |
$coauthors_plus->add_coauthors( $post_id, array( $coauthor->user_login ) );
|
| 250 |
WP_CLI::line( sprintf( __( "Updating - Adding %s's byline to post #%d", 'co-authors-plus' ), $coauthor->user_login, $post_id ) );
|
| 251 |
$affected++;
|
| 252 |
+
if ( $affected && 0 === $affected % 100 ) {
|
| 253 |
+
sleep( 2 );
|
| 254 |
}
|
| 255 |
}
|
| 256 |
WP_CLI::success( sprintf( __( 'All done! %d posts were affected.', 'co-authors-plus' ), $affected ) );
|
| 409 |
}
|
| 410 |
|
| 411 |
/**
|
| 412 |
+
* Swap one co-author with another on all posts for which they are a co-author. Unlike rename-coauthor,
|
| 413 |
+
* this leaves the original co-author term intact and works when the 'to' user already has a co-author term.
|
| 414 |
*
|
| 415 |
* @subcommand swap-coauthors
|
| 416 |
* @synopsis --from=<user-login> --to=<user-login> [--post_type=<ptype>] [--dry=<dry>]
|
| 612 |
}
|
| 613 |
|
| 614 |
/**
|
| 615 |
+
* Update the post count and description for each author and guest author
|
| 616 |
*
|
| 617 |
* @since 3.0
|
| 618 |
*
|
| 735 |
}
|
| 736 |
|
| 737 |
if ( ! class_exists( 'WXR_Parser' ) ) {
|
| 738 |
+
require_once( WP_CONTENT_DIR . '/plugins/wordpress-importer/parsers.php' );
|
| 739 |
}
|
| 740 |
|
| 741 |
$parser = new WXR_Parser();
|
|
@@ -1,9 +1,9 @@
|
|
| 1 |
=== Co-Authors Plus ===
|
| 2 |
Contributors: batmoo, danielbachhuber, automattic
|
| 3 |
Tags: authors, users, multiple authors, coauthors, multi-author, publishing
|
| 4 |
-
Tested up to: 4.
|
| 5 |
Requires at least: 4.1
|
| 6 |
-
Stable tag: 3.
|
| 7 |
|
| 8 |
Assign multiple bylines to posts, pages, and custom post types via a search-as-you-type input box
|
| 9 |
|
|
@@ -57,6 +57,43 @@ Bug fixes and minor enhancements
|
|
| 57 |
|
| 58 |
== Changelog ==
|
| 59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
= 3.2.2 =
|
| 61 |
* Fix broken author ordering in 4.7+ (props mslinnea)
|
| 62 |
* Fix no moderation e-mail bug (props RobjS)
|
| 1 |
=== Co-Authors Plus ===
|
| 2 |
Contributors: batmoo, danielbachhuber, automattic
|
| 3 |
Tags: authors, users, multiple authors, coauthors, multi-author, publishing
|
| 4 |
+
Tested up to: 4.9.5
|
| 5 |
Requires at least: 4.1
|
| 6 |
+
Stable tag: 3.3.0
|
| 7 |
|
| 8 |
Assign multiple bylines to posts, pages, and custom post types via a search-as-you-type input box
|
| 9 |
|
| 57 |
|
| 58 |
== Changelog ==
|
| 59 |
|
| 60 |
+
= 3.3.0 ("Rebecca") =
|
| 61 |
+
* Fix private post viewing on front-end
|
| 62 |
+
* Reduce amount of sleep
|
| 63 |
+
* Author search UX issues
|
| 64 |
+
* Remove associated guest user when mapped user id deleted.
|
| 65 |
+
* Removed double left join on posts_join_filter
|
| 66 |
+
* Fixed WP CLI create-terms-for-posts if no co-authors found
|
| 67 |
+
* Pages archive now displays coauthors and quick edit works
|
| 68 |
+
* Terminology updated throughout
|
| 69 |
+
* Replace hardcoded 'author' with $this->$coauthor_taxonomy
|
| 70 |
+
* Move parenthesis to fix esc_html and sprintf
|
| 71 |
+
* Added progress to create-guest-authors so users have an idea of how long it will take
|
| 72 |
+
* Deleting guest authors is less confusing
|
| 73 |
+
* Guest author's featured image is avatar now
|
| 74 |
+
* Removed extra image sizing
|
| 75 |
+
* Remove duplicated byline
|
| 76 |
+
* coauthors_wp_list_authors() has option to list only guest authors now
|
| 77 |
+
* remove duplicates from linked accounts on coauthors_wp_list_authors()
|
| 78 |
+
* Accurate Guest Author post count on linked accounts
|
| 79 |
+
* New README.md
|
| 80 |
+
* Filter author archive
|
| 81 |
+
* Fix coauthors_links_single()
|
| 82 |
+
* Added guest author hooks for create/delete
|
| 83 |
+
* Fixes logic for DOING_AUTOSAVE check
|
| 84 |
+
* user_login spaces problem when using add_coauthors
|
| 85 |
+
* Adding details of filter for slow performance
|
| 86 |
+
* Remove redundant test for 404 on Author Archive
|
| 87 |
+
* Guest Author Counts are more accurate
|
| 88 |
+
* Set $coauthors_loading
|
| 89 |
+
* Fix the issue where guest authors with non-ASCII characters can't be used as co-authors
|
| 90 |
+
* Fix the issue where incompatibility when `coauthors_auto_apply_template_tags` set to true
|
| 91 |
+
* Unit tests/Fix warnings for template tags
|
| 92 |
+
* Review and improve test coverage
|
| 93 |
+
* Update class-wp-cli.php
|
| 94 |
+
* Update .travis.yml file for PHPUnit tests
|
| 95 |
+
* Changes to resolve issue #332 about missing coauthor meta
|
| 96 |
+
|
| 97 |
= 3.2.2 =
|
| 98 |
* Fix broken author ordering in 4.7+ (props mslinnea)
|
| 99 |
* Fix no moderation e-mail bug (props RobjS)
|
|
@@ -35,6 +35,8 @@ function get_coauthors( $post_id = 0 ) {
|
|
| 35 |
}
|
| 36 |
} // the empty else case is because if we force guest authors, we don't ever care what value wp_posts.post_author has.
|
| 37 |
}
|
|
|
|
|
|
|
| 38 |
return $coauthors;
|
| 39 |
}
|
| 40 |
|
|
@@ -234,12 +236,33 @@ function coauthors( $between = null, $betweenLast = null, $before = null, $after
|
|
| 234 |
* @param bool $echo Whether the co-authors should be echoed or returned. Defaults to true.
|
| 235 |
*/
|
| 236 |
function coauthors_posts_links( $between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
|
| 237 |
-
|
| 238 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 239 |
'betweenLast' => $betweenLast,
|
| 240 |
-
'before'
|
| 241 |
-
'after'
|
| 242 |
), null, $echo );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 243 |
}
|
| 244 |
|
| 245 |
/**
|
|
@@ -343,12 +366,33 @@ function coauthors_nicknames( $between = null, $betweenLast = null, $before = nu
|
|
| 343 |
* @param bool $echo Whether the co-authors should be echoed or returned. Defaults to true.
|
| 344 |
*/
|
| 345 |
function coauthors_links( $between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
|
| 346 |
-
|
| 347 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 348 |
'betweenLast' => $betweenLast,
|
| 349 |
-
'before'
|
| 350 |
-
'after'
|
| 351 |
), null, $echo );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 352 |
}
|
| 353 |
|
| 354 |
/**
|
|
@@ -376,14 +420,24 @@ function coauthors_emails( $between = null, $betweenLast = null, $before = null,
|
|
| 376 |
* @return string
|
| 377 |
*/
|
| 378 |
function coauthors_links_single( $author ) {
|
| 379 |
-
if (
|
| 380 |
-
|
| 381 |
-
|
| 382 |
-
|
| 383 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 384 |
);
|
| 385 |
-
}
|
| 386 |
-
|
|
|
|
| 387 |
}
|
| 388 |
}
|
| 389 |
|
|
@@ -405,22 +459,64 @@ function coauthors_ids( $between = null, $betweenLast = null, $before = null, $a
|
|
| 405 |
), null, $echo );
|
| 406 |
}
|
| 407 |
|
| 408 |
-
|
| 409 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
|
| 418 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 419 |
}
|
| 420 |
|
|
|
|
| 421 |
function the_coauthor_meta( $field, $user_id = 0 ) {
|
| 422 |
-
|
| 423 |
-
|
|
|
|
|
|
|
|
|
|
| 424 |
}
|
| 425 |
|
| 426 |
/**
|
|
@@ -438,16 +534,17 @@ function coauthors_wp_list_authors( $args = array() ) {
|
|
| 438 |
global $coauthors_plus;
|
| 439 |
|
| 440 |
$defaults = array(
|
| 441 |
-
'optioncount'
|
| 442 |
-
'show_fullname'
|
| 443 |
-
'hide_empty'
|
| 444 |
-
'feed'
|
| 445 |
-
'feed_image'
|
| 446 |
-
'feed_type'
|
| 447 |
-
'echo'
|
| 448 |
-
'style'
|
| 449 |
-
'html'
|
| 450 |
-
'number'
|
|
|
|
| 451 |
);
|
| 452 |
|
| 453 |
$args = wp_parse_args( $args, $defaults );
|
|
@@ -459,6 +556,7 @@ function coauthors_wp_list_authors( $args = array() ) {
|
|
| 459 |
'number' => (int) $args['number'],
|
| 460 |
);
|
| 461 |
$author_terms = get_terms( $coauthors_plus->coauthor_taxonomy, $term_args );
|
|
|
|
| 462 |
$authors = array();
|
| 463 |
foreach ( $author_terms as $author_term ) {
|
| 464 |
// Something's wrong in the state of Denmark
|
|
@@ -468,11 +566,23 @@ function coauthors_wp_list_authors( $args = array() ) {
|
|
| 468 |
|
| 469 |
$authors[ $author_term->name ] = $coauthor;
|
| 470 |
|
| 471 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 472 |
}
|
| 473 |
|
| 474 |
$authors = apply_filters( 'coauthors_wp_list_authors_array', $authors );
|
| 475 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 476 |
foreach ( (array) $authors as $author ) {
|
| 477 |
|
| 478 |
$link = '';
|
|
@@ -511,12 +621,16 @@ function coauthors_wp_list_authors( $args = array() ) {
|
|
| 511 |
if ( empty( $args['feed_image'] ) ) {
|
| 512 |
$link .= '(';
|
| 513 |
}
|
| 514 |
-
$link .= '<a href="' . get_author_feed_link( $author->ID ) . '"';
|
|
|
|
|
|
|
|
|
|
| 515 |
|
| 516 |
if ( ! empty( $args['feed'] ) ) {
|
|
|
|
| 517 |
$title = ' title="' . esc_attr( $args['feed'] ) . '"';
|
| 518 |
-
$alt
|
| 519 |
-
$name
|
| 520 |
$link .= $title;
|
| 521 |
}
|
| 522 |
|
| 35 |
}
|
| 36 |
} // the empty else case is because if we force guest authors, we don't ever care what value wp_posts.post_author has.
|
| 37 |
}
|
| 38 |
+
// remove duplicate $coauthors objects from mapping user accounts to guest authors accounts
|
| 39 |
+
$coauthors = array_unique( $coauthors, SORT_REGULAR );
|
| 40 |
return $coauthors;
|
| 41 |
}
|
| 42 |
|
| 236 |
* @param bool $echo Whether the co-authors should be echoed or returned. Defaults to true.
|
| 237 |
*/
|
| 238 |
function coauthors_posts_links( $between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
|
| 239 |
+
|
| 240 |
+
global $coauthors_plus_template_filters;
|
| 241 |
+
|
| 242 |
+
$modify_filter = ! empty( $coauthors_plus_template_filters ) && $coauthors_plus_template_filters instanceof CoAuthors_Template_Filters;
|
| 243 |
+
|
| 244 |
+
if ( $modify_filter ) {
|
| 245 |
+
|
| 246 |
+
/**
|
| 247 |
+
* Removing "the_author" filter so that it won't get called in loop and append names for each author.
|
| 248 |
+
*
|
| 249 |
+
* Ref : https://github.com/Automattic/Co-Authors-Plus/issues/279
|
| 250 |
+
*/
|
| 251 |
+
remove_filter( 'the_author', array( $coauthors_plus_template_filters, 'filter_the_author' ) );
|
| 252 |
+
}
|
| 253 |
+
|
| 254 |
+
$coauthors_posts_links = coauthors__echo( 'coauthors_posts_links_single', 'callback', array(
|
| 255 |
+
'between' => $between,
|
| 256 |
'betweenLast' => $betweenLast,
|
| 257 |
+
'before' => $before,
|
| 258 |
+
'after' => $after,
|
| 259 |
), null, $echo );
|
| 260 |
+
|
| 261 |
+
if ( $modify_filter ) {
|
| 262 |
+
add_filter( 'the_author', array( $coauthors_plus_template_filters, 'filter_the_author' ) );
|
| 263 |
+
}
|
| 264 |
+
|
| 265 |
+
return $coauthors_posts_links;
|
| 266 |
}
|
| 267 |
|
| 268 |
/**
|
| 366 |
* @param bool $echo Whether the co-authors should be echoed or returned. Defaults to true.
|
| 367 |
*/
|
| 368 |
function coauthors_links( $between = null, $betweenLast = null, $before = null, $after = null, $echo = true ) {
|
| 369 |
+
|
| 370 |
+
global $coauthors_plus_template_filters;
|
| 371 |
+
|
| 372 |
+
$modify_filter = ! empty( $coauthors_plus_template_filters ) && $coauthors_plus_template_filters instanceof CoAuthors_Template_Filters;
|
| 373 |
+
|
| 374 |
+
if ( $modify_filter ) {
|
| 375 |
+
|
| 376 |
+
/**
|
| 377 |
+
* Removing "the_author" filter so that it won't get called in loop and append names for each author.
|
| 378 |
+
*
|
| 379 |
+
* Ref : https://github.com/Automattic/Co-Authors-Plus/issues/279
|
| 380 |
+
*/
|
| 381 |
+
remove_filter( 'the_author', array( $coauthors_plus_template_filters, 'filter_the_author' ) );
|
| 382 |
+
}
|
| 383 |
+
|
| 384 |
+
$coauthors_links = coauthors__echo( 'coauthors_links_single', 'callback', array(
|
| 385 |
+
'between' => $between,
|
| 386 |
'betweenLast' => $betweenLast,
|
| 387 |
+
'before' => $before,
|
| 388 |
+
'after' => $after,
|
| 389 |
), null, $echo );
|
| 390 |
+
|
| 391 |
+
if ( $modify_filter ) {
|
| 392 |
+
add_filter( 'the_author', array( $coauthors_plus_template_filters, 'filter_the_author' ) );
|
| 393 |
+
}
|
| 394 |
+
|
| 395 |
+
return $coauthors_links;
|
| 396 |
}
|
| 397 |
|
| 398 |
/**
|
| 420 |
* @return string
|
| 421 |
*/
|
| 422 |
function coauthors_links_single( $author ) {
|
| 423 |
+
if ( 'guest-author' === $author->type ) {
|
| 424 |
+
if ( get_the_author_meta( 'website' ) ) {
|
| 425 |
+
return sprintf( '<a href="%s" title="%s" rel="external" target="_blank">%s</a>',
|
| 426 |
+
esc_url( get_the_author_meta( 'website' ) ),
|
| 427 |
+
esc_attr( sprintf( __( 'Visit %s’s website' ), esc_html( get_the_author() ) ) ),
|
| 428 |
+
esc_html( get_the_author() )
|
| 429 |
+
);
|
| 430 |
+
}
|
| 431 |
+
}
|
| 432 |
+
elseif ( get_the_author_meta( 'url' ) ) {
|
| 433 |
+
return sprintf( '<a href="%s" title="%s" rel="external" target="_blank">%s</a>',
|
| 434 |
+
esc_url( get_the_author_meta( 'url' ) ),
|
| 435 |
+
esc_attr( sprintf( __( 'Visit %s’s website' ), esc_html( get_the_author() ) ) ),
|
| 436 |
+
esc_html( get_the_author() )
|
| 437 |
);
|
| 438 |
+
}
|
| 439 |
+
else {
|
| 440 |
+
return esc_html( get_the_author() );
|
| 441 |
}
|
| 442 |
}
|
| 443 |
|
| 459 |
), null, $echo );
|
| 460 |
}
|
| 461 |
|
| 462 |
+
/**
|
| 463 |
+
* Outputs the co-authors Meta Data
|
| 464 |
+
*
|
| 465 |
+
* @param string $field Required The user field to retrieve.[login, email, nicename, display_name, url, type]
|
| 466 |
+
* @param string $user_id Optional The user ID for meta
|
| 467 |
+
*
|
| 468 |
+
* @return array $meta Value of the user field
|
| 469 |
+
*/
|
| 470 |
+
function get_the_coauthor_meta( $field, $user_id = false ) {
|
| 471 |
+
global $coauthors_plus;
|
| 472 |
+
|
| 473 |
+
if ( ! $user_id ) {
|
| 474 |
+
$coauthors = get_coauthors();
|
| 475 |
+
}
|
| 476 |
+
else {
|
| 477 |
+
$coauthor_data = $coauthors_plus->get_coauthor_by( 'id', $user_id );
|
| 478 |
+
$coauthors = array();
|
| 479 |
+
if ( ! empty( $coauthor_data ) ) {
|
| 480 |
+
$coauthors[] = $coauthor_data;
|
| 481 |
+
}
|
| 482 |
+
}
|
| 483 |
+
|
| 484 |
+
$meta = array();
|
| 485 |
+
|
| 486 |
+
if ( in_array( $field, array( 'login', 'pass', 'nicename', 'email', 'url', 'registered', 'activation_key', 'status' ) ) ) {
|
| 487 |
+
$field = 'user_' . $field;
|
| 488 |
+
}
|
| 489 |
+
|
| 490 |
+
foreach ( $coauthors as $coauthor ) {
|
| 491 |
+
$user_id = $coauthor->ID;
|
| 492 |
+
|
| 493 |
+
if ( isset( $coauthor->type ) && 'user_url' === $field ) {
|
| 494 |
+
if ( 'guest-author' === $coauthor->type ) {
|
| 495 |
+
$field = 'website';
|
| 496 |
+
}
|
| 497 |
+
}
|
| 498 |
+
else if ( 'website' === $field ) {
|
| 499 |
+
$field = 'user_url';
|
| 500 |
+
}
|
| 501 |
+
|
| 502 |
+
if ( isset( $coauthor->$field ) ) {
|
| 503 |
+
$meta[ $user_id ] = $coauthor->$field;
|
| 504 |
+
}
|
| 505 |
+
else {
|
| 506 |
+
$meta[ $user_id ] = '';
|
| 507 |
+
}
|
| 508 |
+
}
|
| 509 |
+
|
| 510 |
+
return $meta;
|
| 511 |
}
|
| 512 |
|
| 513 |
+
|
| 514 |
function the_coauthor_meta( $field, $user_id = 0 ) {
|
| 515 |
+
// TODO: need before after options
|
| 516 |
+
$coauthor_meta = get_the_coauthor_meta( $field, $user_id );
|
| 517 |
+
foreach ( $coauthor_meta as $meta ) {
|
| 518 |
+
echo esc_html( $meta );
|
| 519 |
+
}
|
| 520 |
}
|
| 521 |
|
| 522 |
/**
|
| 534 |
global $coauthors_plus;
|
| 535 |
|
| 536 |
$defaults = array(
|
| 537 |
+
'optioncount' => false,
|
| 538 |
+
'show_fullname' => false,
|
| 539 |
+
'hide_empty' => true,
|
| 540 |
+
'feed' => '',
|
| 541 |
+
'feed_image' => '',
|
| 542 |
+
'feed_type' => '',
|
| 543 |
+
'echo' => true,
|
| 544 |
+
'style' => 'list',
|
| 545 |
+
'html' => true,
|
| 546 |
+
'number' => 20, // A sane limit to start to avoid breaking all the things
|
| 547 |
+
'guest_authors_only' => false
|
| 548 |
);
|
| 549 |
|
| 550 |
$args = wp_parse_args( $args, $defaults );
|
| 556 |
'number' => (int) $args['number'],
|
| 557 |
);
|
| 558 |
$author_terms = get_terms( $coauthors_plus->coauthor_taxonomy, $term_args );
|
| 559 |
+
|
| 560 |
$authors = array();
|
| 561 |
foreach ( $author_terms as $author_term ) {
|
| 562 |
// Something's wrong in the state of Denmark
|
| 566 |
|
| 567 |
$authors[ $author_term->name ] = $coauthor;
|
| 568 |
|
| 569 |
+
// only show guest authors if the $args is set to true
|
| 570 |
+
if ( ! $args['guest_authors_only'] || $authors[ $author_term->name ]->type === 'guest-author' ) {
|
| 571 |
+
$authors[ $author_term->name ]->post_count = $author_term->count;
|
| 572 |
+
}
|
| 573 |
+
else {
|
| 574 |
+
unset( $authors[ $author_term->name ] );
|
| 575 |
+
}
|
| 576 |
}
|
| 577 |
|
| 578 |
$authors = apply_filters( 'coauthors_wp_list_authors_array', $authors );
|
| 579 |
|
| 580 |
+
// remove duplicates from linked accounts
|
| 581 |
+
$linked_accounts = array_unique( array_column( $authors, 'linked_account' ) );
|
| 582 |
+
foreach ( $linked_accounts as $linked_account ) {
|
| 583 |
+
unset( $authors[$linked_account] );
|
| 584 |
+
}
|
| 585 |
+
|
| 586 |
foreach ( (array) $authors as $author ) {
|
| 587 |
|
| 588 |
$link = '';
|
| 621 |
if ( empty( $args['feed_image'] ) ) {
|
| 622 |
$link .= '(';
|
| 623 |
}
|
| 624 |
+
$link .= '<a href="' . esc_url( get_author_feed_link( $author->ID, $args['feed_type'] ) ) . '"';
|
| 625 |
+
|
| 626 |
+
$alt = '';
|
| 627 |
+
$title = '';
|
| 628 |
|
| 629 |
if ( ! empty( $args['feed'] ) ) {
|
| 630 |
+
|
| 631 |
$title = ' title="' . esc_attr( $args['feed'] ) . '"';
|
| 632 |
+
$alt = ' alt="' . esc_attr( $args['feed'] ) . '"';
|
| 633 |
+
$name = $args['feed'];
|
| 634 |
$link .= $title;
|
| 635 |
}
|
| 636 |
|
|
@@ -52,12 +52,6 @@ class Test_Author_Queried_Object extends CoAuthorsPlus_TestCase {
|
|
| 52 |
$this->go_to( get_author_posts_url( $author1 ) );
|
| 53 |
$this->assertQueryTrue( 'is_author', 'is_archive' );
|
| 54 |
|
| 55 |
-
/**
|
| 56 |
-
* Author 2 is not yet an author on the blog
|
| 57 |
-
*/
|
| 58 |
-
$this->go_to( get_author_posts_url( $author2 ) );
|
| 59 |
-
$this->assertQueryTrue( 'is_404' );
|
| 60 |
-
|
| 61 |
// Add the user to the blog
|
| 62 |
add_user_to_blog( $blog2, $author2, 'author' );
|
| 63 |
|
|
@@ -93,7 +87,6 @@ class Test_Author_Queried_Object extends CoAuthorsPlus_TestCase {
|
|
| 93 |
* Author 2 is no more
|
| 94 |
*/
|
| 95 |
$this->go_to( get_author_posts_url( $author2 ) );
|
| 96 |
-
$this->assertQueryTrue( 'is_404' );
|
| 97 |
$this->assertEquals( false, get_user_by( 'id', $author2 ) );
|
| 98 |
|
| 99 |
restore_current_blog();
|
| 52 |
$this->go_to( get_author_posts_url( $author1 ) );
|
| 53 |
$this->assertQueryTrue( 'is_author', 'is_archive' );
|
| 54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
// Add the user to the blog
|
| 56 |
add_user_to_blog( $blog2, $author2, 'author' );
|
| 57 |
|
| 87 |
* Author 2 is no more
|
| 88 |
*/
|
| 89 |
$this->go_to( get_author_posts_url( $author2 ) );
|
|
|
|
| 90 |
$this->assertEquals( false, get_user_by( 'id', $author2 ) );
|
| 91 |
|
| 92 |
restore_current_blog();
|
|
@@ -0,0 +1,890 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
class Test_CoAuthors_Guest_Authors extends CoAuthorsPlus_TestCase {
|
| 4 |
+
|
| 5 |
+
public function setUp() {
|
| 6 |
+
|
| 7 |
+
parent::setUp();
|
| 8 |
+
|
| 9 |
+
$this->admin1 = $this->factory->user->create_and_get( array( 'role' => 'administrator', 'user_login' => 'admin1' ) );
|
| 10 |
+
$this->author1 = $this->factory->user->create_and_get( array( 'role' => 'author', 'user_login' => 'author1' ) );
|
| 11 |
+
$this->editor1 = $this->factory->user->create_and_get( array( 'role' => 'editor', 'user_login' => 'editor1' ) );
|
| 12 |
+
|
| 13 |
+
$this->post = $this->factory->post->create_and_get( array(
|
| 14 |
+
'post_author' => $this->author1->ID,
|
| 15 |
+
'post_status' => 'publish',
|
| 16 |
+
'post_content' => rand_str(),
|
| 17 |
+
'post_title' => rand_str(),
|
| 18 |
+
'post_type' => 'post',
|
| 19 |
+
) );
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
/**
|
| 23 |
+
* Checks a simulated WP_User object based on the post ID when key or value is empty.
|
| 24 |
+
*
|
| 25 |
+
* @covers CoAuthors_Guest_Authors::get_guest_author_by()
|
| 26 |
+
*/
|
| 27 |
+
public function test_get_guest_author_by_with_empty_key_or_value() {
|
| 28 |
+
|
| 29 |
+
global $coauthors_plus;
|
| 30 |
+
|
| 31 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 32 |
+
|
| 33 |
+
// Fetch guest author without forcefully.
|
| 34 |
+
$this->assertFalse( $guest_author_obj->get_guest_author_by( '', '' ) );
|
| 35 |
+
$this->assertFalse( $guest_author_obj->get_guest_author_by( 'ID', '' ) );
|
| 36 |
+
$this->assertFalse( $guest_author_obj->get_guest_author_by( '', $this->author1->ID ) );
|
| 37 |
+
|
| 38 |
+
// Fetch guest author forcefully.
|
| 39 |
+
$this->assertFalse( $guest_author_obj->get_guest_author_by( '', '', true ) );
|
| 40 |
+
$this->assertFalse( $guest_author_obj->get_guest_author_by( 'ID', '', true ) );
|
| 41 |
+
$this->assertFalse( $guest_author_obj->get_guest_author_by( '', $this->author1->ID, true ) );
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
/**
|
| 45 |
+
* Checks a simulated WP_User object based on the post ID using cache.
|
| 46 |
+
*
|
| 47 |
+
* @covers CoAuthors_Guest_Authors::get_guest_author_by()
|
| 48 |
+
*/
|
| 49 |
+
public function test_get_guest_author_by_using_cache() {
|
| 50 |
+
|
| 51 |
+
global $coauthors_plus;
|
| 52 |
+
|
| 53 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 54 |
+
|
| 55 |
+
$guest_author_id = $guest_author_obj->create_guest_author_from_user_id( $this->editor1->ID );
|
| 56 |
+
|
| 57 |
+
$cache_key = $guest_author_obj->get_cache_key( 'ID', $guest_author_id );
|
| 58 |
+
|
| 59 |
+
// Checks when guest author does not exist in cache.
|
| 60 |
+
$this->assertFalse( wp_cache_get( $cache_key, $guest_author_obj::$cache_group ) );
|
| 61 |
+
|
| 62 |
+
// Checks when guest author exists in cache.
|
| 63 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'ID', $guest_author_id );
|
| 64 |
+
$guest_author_cached = wp_cache_get( $cache_key, $guest_author_obj::$cache_group );
|
| 65 |
+
|
| 66 |
+
$this->assertInstanceOf( stdClass::class, $guest_author );
|
| 67 |
+
$this->assertEquals( $guest_author, $guest_author_cached );
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
/**
|
| 71 |
+
* Checks a simulated WP_User object based on the post ID using different key/value.
|
| 72 |
+
*
|
| 73 |
+
* @covers CoAuthors_Guest_Authors::get_guest_author_by()
|
| 74 |
+
*/
|
| 75 |
+
public function test_get_guest_author_by_with_different_keys() {
|
| 76 |
+
|
| 77 |
+
global $coauthors_plus;
|
| 78 |
+
|
| 79 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 80 |
+
|
| 81 |
+
// Checks when user is not a guest author.
|
| 82 |
+
$this->assertFalse( $guest_author_obj->get_guest_author_by( 'ID', $this->author1->ID ) );
|
| 83 |
+
$this->assertFalse( $guest_author_obj->get_guest_author_by( 'ID', $this->author1->ID, true ) );
|
| 84 |
+
|
| 85 |
+
$guest_author_id = $guest_author_obj->create_guest_author_from_user_id( $this->editor1->ID );
|
| 86 |
+
|
| 87 |
+
// Checks guest author using ID.
|
| 88 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'ID', $guest_author_id );
|
| 89 |
+
|
| 90 |
+
$this->assertInstanceOf( stdClass::class, $guest_author );
|
| 91 |
+
$this->assertEquals( $guest_author_id, $guest_author->ID );
|
| 92 |
+
$this->assertEquals( $guest_author_obj->post_type, $guest_author->type );
|
| 93 |
+
|
| 94 |
+
// Checks guest author using user_nicename.
|
| 95 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'user_nicename', $this->editor1->user_nicename );
|
| 96 |
+
|
| 97 |
+
$this->assertInstanceOf( stdClass::class, $guest_author );
|
| 98 |
+
$this->assertEquals( $guest_author_obj->post_type, $guest_author->type );
|
| 99 |
+
|
| 100 |
+
// Checks guest author using linked_account.
|
| 101 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'linked_account', $this->editor1->user_login );
|
| 102 |
+
|
| 103 |
+
$this->assertInstanceOf( stdClass::class, $guest_author );
|
| 104 |
+
$this->assertEquals( $guest_author_obj->post_type, $guest_author->type );
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
/**
|
| 108 |
+
* Checks thumbnail for a guest author object.
|
| 109 |
+
*
|
| 110 |
+
* @covers CoAuthors_Guest_Authors::get_guest_author_thumbnail()
|
| 111 |
+
*/
|
| 112 |
+
public function test_get_guest_author_thumbnail() {
|
| 113 |
+
|
| 114 |
+
global $coauthors_plus;
|
| 115 |
+
|
| 116 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 117 |
+
|
| 118 |
+
// Checks when guest author does not have any thumbnail.
|
| 119 |
+
$guest_author_id = $guest_author_obj->create( array(
|
| 120 |
+
'user_login' => 'author2',
|
| 121 |
+
'display_name' => 'author2',
|
| 122 |
+
) );
|
| 123 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'ID', $guest_author_id );
|
| 124 |
+
|
| 125 |
+
$this->assertNull( $guest_author_obj->get_guest_author_thumbnail( $guest_author, 0 ) );
|
| 126 |
+
|
| 127 |
+
// Checks when guest author has thumbnail.
|
| 128 |
+
$filename = rand_str() . '.jpg';
|
| 129 |
+
$contents = rand_str();
|
| 130 |
+
$upload = wp_upload_bits( $filename, null, $contents );
|
| 131 |
+
|
| 132 |
+
$this->assertTrue( empty( $upload['error'] ) );
|
| 133 |
+
|
| 134 |
+
$attachment_id = $this->_make_attachment( $upload );
|
| 135 |
+
|
| 136 |
+
set_post_thumbnail( $guest_author->ID, $attachment_id );
|
| 137 |
+
|
| 138 |
+
$thumbnail = $guest_author_obj->get_guest_author_thumbnail( $guest_author, 0 );
|
| 139 |
+
|
| 140 |
+
$this->assertContains( 'avatar-0', $thumbnail );
|
| 141 |
+
$this->assertContains( $filename, $thumbnail );
|
| 142 |
+
$this->assertContains( 'src="' . wp_get_attachment_url( $attachment_id ) . '"', $thumbnail );
|
| 143 |
+
}
|
| 144 |
+
|
| 145 |
+
/**
|
| 146 |
+
* Checks all of the meta fields that can be associated with a guest author.
|
| 147 |
+
*
|
| 148 |
+
* @covers CoAuthors_Guest_Authors::get_guest_author_fields()
|
| 149 |
+
*/
|
| 150 |
+
public function test_get_guest_author_fields() {
|
| 151 |
+
|
| 152 |
+
global $coauthors_plus;
|
| 153 |
+
|
| 154 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 155 |
+
|
| 156 |
+
// Checks all the meta fields.
|
| 157 |
+
$fields = $guest_author_obj->get_guest_author_fields();
|
| 158 |
+
|
| 159 |
+
$this->assertNotEmpty( $fields );
|
| 160 |
+
$this->assertInternalType( 'array', $fields );
|
| 161 |
+
|
| 162 |
+
$keys = wp_list_pluck( $fields, 'key' );
|
| 163 |
+
|
| 164 |
+
$global_fields = array(
|
| 165 |
+
'display_name',
|
| 166 |
+
'first_name',
|
| 167 |
+
'last_name',
|
| 168 |
+
'user_login',
|
| 169 |
+
'user_email',
|
| 170 |
+
'linked_account',
|
| 171 |
+
'website',
|
| 172 |
+
'aim',
|
| 173 |
+
'yahooim',
|
| 174 |
+
'jabber',
|
| 175 |
+
'description',
|
| 176 |
+
);
|
| 177 |
+
|
| 178 |
+
$this->assertEquals( $global_fields, $keys );
|
| 179 |
+
|
| 180 |
+
// Checks all the meta fields with group that does not exist.
|
| 181 |
+
$fields = $guest_author_obj->get_guest_author_fields( 'test' );
|
| 182 |
+
|
| 183 |
+
$this->assertEmpty( $fields );
|
| 184 |
+
|
| 185 |
+
// Checks all the meta fields with group "name".
|
| 186 |
+
$fields = $guest_author_obj->get_guest_author_fields( 'name' );
|
| 187 |
+
$keys = wp_list_pluck( $fields, 'key' );
|
| 188 |
+
|
| 189 |
+
$this->assertEquals( array( 'display_name', 'first_name', 'last_name' ), $keys );
|
| 190 |
+
|
| 191 |
+
// Checks all the meta fields with group "slug".
|
| 192 |
+
$fields = $guest_author_obj->get_guest_author_fields( 'slug' );
|
| 193 |
+
$keys = wp_list_pluck( $fields, 'key' );
|
| 194 |
+
|
| 195 |
+
$this->assertEquals( array( 'user_login', 'linked_account' ), $keys );
|
| 196 |
+
|
| 197 |
+
// Checks all the meta fields with group "contact-info".
|
| 198 |
+
$fields = $guest_author_obj->get_guest_author_fields( 'contact-info' );
|
| 199 |
+
$keys = wp_list_pluck( $fields, 'key' );
|
| 200 |
+
|
| 201 |
+
$this->assertEquals( array( 'user_email', 'website', 'aim', 'yahooim', 'jabber' ), $keys );
|
| 202 |
+
|
| 203 |
+
// Checks all the meta fields with group "about".
|
| 204 |
+
$fields = $guest_author_obj->get_guest_author_fields( 'about' );
|
| 205 |
+
$keys = wp_list_pluck( $fields, 'key' );
|
| 206 |
+
|
| 207 |
+
$this->assertEquals( array( 'description' ), $keys );
|
| 208 |
+
}
|
| 209 |
+
|
| 210 |
+
/**
|
| 211 |
+
* Checks all of the user accounts that have been linked.
|
| 212 |
+
*
|
| 213 |
+
* @covers CoAuthors_Guest_Authors::get_all_linked_accounts()
|
| 214 |
+
*/
|
| 215 |
+
public function test_get_all_linked_accounts() {
|
| 216 |
+
|
| 217 |
+
global $coauthors_plus;
|
| 218 |
+
|
| 219 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 220 |
+
|
| 221 |
+
$this->assertEmpty( $guest_author_obj->get_all_linked_accounts() );
|
| 222 |
+
|
| 223 |
+
// Checks when guest author ( not linked account ) exists.
|
| 224 |
+
$guest_author_obj->create( array(
|
| 225 |
+
'user_login' => 'author2',
|
| 226 |
+
'display_name' => 'author2',
|
| 227 |
+
) );
|
| 228 |
+
|
| 229 |
+
$this->assertEmpty( $guest_author_obj->get_all_linked_accounts() );
|
| 230 |
+
|
| 231 |
+
// Create guest author from existing user and check.
|
| 232 |
+
$guest_author_obj->create_guest_author_from_user_id( $this->editor1->ID );
|
| 233 |
+
|
| 234 |
+
$linked_accounts = $guest_author_obj->get_all_linked_accounts();
|
| 235 |
+
$linked_account_ids = wp_list_pluck( $linked_accounts, 'ID' );
|
| 236 |
+
|
| 237 |
+
$this->assertNotEmpty( $linked_accounts );
|
| 238 |
+
$this->assertInternalType( 'array', $linked_accounts );
|
| 239 |
+
$this->assertTrue( in_array( $this->editor1->ID, $linked_account_ids, true ) );
|
| 240 |
+
}
|
| 241 |
+
|
| 242 |
+
/**
|
| 243 |
+
* Checks all of the user accounts that have been linked using cache.
|
| 244 |
+
*
|
| 245 |
+
* @covers CoAuthors_Guest_Authors::get_all_linked_accounts()
|
| 246 |
+
*/
|
| 247 |
+
public function test_get_all_linked_accounts_with_cache() {
|
| 248 |
+
|
| 249 |
+
global $coauthors_plus;
|
| 250 |
+
|
| 251 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 252 |
+
|
| 253 |
+
$cache_key = 'all-linked-accounts';
|
| 254 |
+
|
| 255 |
+
// Checks when guest author does not exist in cache.
|
| 256 |
+
$this->assertFalse( wp_cache_get( $cache_key, $guest_author_obj::$cache_group ) );
|
| 257 |
+
|
| 258 |
+
// Checks when guest author exists in cache.
|
| 259 |
+
$guest_author_obj->create_guest_author_from_user_id( $this->editor1->ID );
|
| 260 |
+
|
| 261 |
+
$linked_accounts = $guest_author_obj->get_all_linked_accounts();
|
| 262 |
+
$linked_accounts_cache = wp_cache_get( $cache_key, $guest_author_obj::$cache_group );
|
| 263 |
+
|
| 264 |
+
$this->assertEquals( $linked_accounts, $linked_accounts_cache );
|
| 265 |
+
}
|
| 266 |
+
|
| 267 |
+
/**
|
| 268 |
+
* Checks guest author from an existing WordPress user.
|
| 269 |
+
*
|
| 270 |
+
* @covers CoAuthors_Guest_Authors::create_guest_author_from_user_id()
|
| 271 |
+
*/
|
| 272 |
+
public function test_create_guest_author_from_user_id() {
|
| 273 |
+
|
| 274 |
+
global $coauthors_plus;
|
| 275 |
+
|
| 276 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 277 |
+
|
| 278 |
+
// Checks create guest author when user don't exist.
|
| 279 |
+
$response = $guest_author_obj->create_guest_author_from_user_id( 0 );
|
| 280 |
+
|
| 281 |
+
$this->assertInstanceOf( 'WP_Error', $response );
|
| 282 |
+
$this->assertEquals( 'invalid-user', $response->get_error_code() );
|
| 283 |
+
|
| 284 |
+
// Checks create guest author when user exist.
|
| 285 |
+
$guest_author_id = $guest_author_obj->create_guest_author_from_user_id( $this->editor1->ID );
|
| 286 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'ID', $guest_author_id );
|
| 287 |
+
|
| 288 |
+
$this->assertInstanceOf( stdClass::class, $guest_author );
|
| 289 |
+
}
|
| 290 |
+
|
| 291 |
+
/**
|
| 292 |
+
* Checks delete guest author action when $_POST args are not set.
|
| 293 |
+
*
|
| 294 |
+
* @covers CoAuthors_Guest_Authors::handle_delete_guest_author_action()
|
| 295 |
+
*/
|
| 296 |
+
public function test_handle_delete_guest_author_action_when_post_args_not_as_expected() {
|
| 297 |
+
|
| 298 |
+
global $coauthors_plus;
|
| 299 |
+
|
| 300 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 301 |
+
|
| 302 |
+
// Checks when nothing is set.
|
| 303 |
+
$this->assertNull( $guest_author_obj->handle_delete_guest_author_action() );
|
| 304 |
+
|
| 305 |
+
// Back up $_POST.
|
| 306 |
+
$_post_backup = $_POST;
|
| 307 |
+
|
| 308 |
+
// Checks when action is set but not expected.
|
| 309 |
+
$_POST['action'] = 'test';
|
| 310 |
+
$_POST['id'] = $guest_author_obj->create_guest_author_from_user_id( $this->editor1->ID );
|
| 311 |
+
|
| 312 |
+
$this->assertNull( $guest_author_obj->handle_delete_guest_author_action() );
|
| 313 |
+
|
| 314 |
+
// Get guest author and check that is should not be removed.
|
| 315 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'ID', $_POST['id'] );
|
| 316 |
+
|
| 317 |
+
$this->assertNotEmpty( $guest_author );
|
| 318 |
+
|
| 319 |
+
// Checks when _wpnonce and id not set.
|
| 320 |
+
$_POST['action'] = 'delete-guest-author';
|
| 321 |
+
$_POST['reassign'] = 'test';
|
| 322 |
+
|
| 323 |
+
$this->assertNull( $guest_author_obj->handle_delete_guest_author_action() );
|
| 324 |
+
|
| 325 |
+
// Get guest author and check that is should not be removed.
|
| 326 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'ID', $_POST['id'] );
|
| 327 |
+
|
| 328 |
+
$this->assertNotEmpty( $guest_author );
|
| 329 |
+
|
| 330 |
+
// Checks when all args set for $_POST but action is not as expected.
|
| 331 |
+
$_POST['action'] = 'test';
|
| 332 |
+
$_POST['reassign'] = 'test';
|
| 333 |
+
$_POST['_wpnonce'] = wp_create_nonce( 'delete-guest-author-1' );
|
| 334 |
+
|
| 335 |
+
$this->assertNull( $guest_author_obj->handle_delete_guest_author_action() );
|
| 336 |
+
|
| 337 |
+
// Get guest author and check that is should not be removed.
|
| 338 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'ID', $_POST['id'] );
|
| 339 |
+
|
| 340 |
+
$this->assertNotEmpty( $guest_author );
|
| 341 |
+
|
| 342 |
+
// Restore $_POST from back up.
|
| 343 |
+
$_POST = $_post_backup;
|
| 344 |
+
}
|
| 345 |
+
|
| 346 |
+
/**
|
| 347 |
+
* Checks delete guest author action with nonce.
|
| 348 |
+
*
|
| 349 |
+
* @covers CoAuthors_Guest_Authors::handle_delete_guest_author_action()
|
| 350 |
+
*/
|
| 351 |
+
public function test_handle_delete_guest_author_action_with_nonce() {
|
| 352 |
+
|
| 353 |
+
global $coauthors_plus;
|
| 354 |
+
|
| 355 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 356 |
+
|
| 357 |
+
// Back up $_POST.
|
| 358 |
+
$_post_backup = $_POST;
|
| 359 |
+
|
| 360 |
+
$expected = __( "Doin' something fishy, huh?", 'co-authors-plus' );
|
| 361 |
+
|
| 362 |
+
$_POST['action'] = 'delete-guest-author';
|
| 363 |
+
$_POST['reassign'] = 'test';
|
| 364 |
+
$_POST['id'] = '0';
|
| 365 |
+
|
| 366 |
+
// Checks when nonce is not as expected.
|
| 367 |
+
$_POST['_wpnonce'] = wp_create_nonce( 'delete-guest-author-1' );
|
| 368 |
+
|
| 369 |
+
try {
|
| 370 |
+
$guest_author_obj->handle_delete_guest_author_action();
|
| 371 |
+
} catch ( Exception $e ) {
|
| 372 |
+
$exception = $e;
|
| 373 |
+
}
|
| 374 |
+
|
| 375 |
+
$this->assertInstanceOf( 'WPDieException', $exception );
|
| 376 |
+
$this->assertContains( esc_html( $expected ), $exception->getMessage() );
|
| 377 |
+
|
| 378 |
+
// Checks when nonce is as expected.
|
| 379 |
+
$_POST['_wpnonce'] = wp_create_nonce( 'delete-guest-author' );
|
| 380 |
+
|
| 381 |
+
try {
|
| 382 |
+
$guest_author_obj->handle_delete_guest_author_action();
|
| 383 |
+
} catch ( Exception $e ) {
|
| 384 |
+
$exception = $e;
|
| 385 |
+
}
|
| 386 |
+
|
| 387 |
+
$this->assertNotContains( esc_html( $expected ), $exception->getMessage() );
|
| 388 |
+
|
| 389 |
+
// Restore $_POST from back up.
|
| 390 |
+
$_POST = $_post_backup;
|
| 391 |
+
}
|
| 392 |
+
|
| 393 |
+
/**
|
| 394 |
+
* Checks delete guest author action with list_author capability.
|
| 395 |
+
*
|
| 396 |
+
* @covers CoAuthors_Guest_Authors::handle_delete_guest_author_action()
|
| 397 |
+
*/
|
| 398 |
+
public function test_handle_delete_guest_author_action_with_list_users_capability() {
|
| 399 |
+
|
| 400 |
+
global $coauthors_plus;
|
| 401 |
+
|
| 402 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 403 |
+
|
| 404 |
+
// Back up $_POST.
|
| 405 |
+
$_post_backup = $_POST;
|
| 406 |
+
|
| 407 |
+
$expected = __( "You don't have permission to perform this action.", 'co-authors-plus' );
|
| 408 |
+
|
| 409 |
+
// Back up current user.
|
| 410 |
+
$current_user = get_current_user_id();
|
| 411 |
+
|
| 412 |
+
wp_set_current_user( $this->editor1->ID );
|
| 413 |
+
|
| 414 |
+
$_POST['action'] = 'delete-guest-author';
|
| 415 |
+
$_POST['reassign'] = 'test';
|
| 416 |
+
|
| 417 |
+
// Checks when current user can not have list_users capability.
|
| 418 |
+
$_POST['_wpnonce'] = wp_create_nonce( 'delete-guest-author' );
|
| 419 |
+
$_POST['id'] = $guest_author_obj->create_guest_author_from_user_id( $this->editor1->ID );
|
| 420 |
+
|
| 421 |
+
try {
|
| 422 |
+
$guest_author_obj->handle_delete_guest_author_action();
|
| 423 |
+
} catch ( Exception $e ) {
|
| 424 |
+
$exception = $e;
|
| 425 |
+
}
|
| 426 |
+
|
| 427 |
+
$this->assertInstanceOf( 'WPDieException', $exception );
|
| 428 |
+
$this->assertContains( esc_html( $expected ), $exception->getMessage() );
|
| 429 |
+
|
| 430 |
+
// Checks when current user has list_users capability.
|
| 431 |
+
wp_set_current_user( $this->admin1->ID );
|
| 432 |
+
|
| 433 |
+
$_POST['_wpnonce'] = wp_create_nonce( 'delete-guest-author' );
|
| 434 |
+
$_POST['id'] = $guest_author_obj->create_guest_author_from_user_id( $this->admin1->ID );
|
| 435 |
+
|
| 436 |
+
try {
|
| 437 |
+
$guest_author_obj->handle_delete_guest_author_action();
|
| 438 |
+
} catch ( Exception $e ) {
|
| 439 |
+
$exception = $e;
|
| 440 |
+
}
|
| 441 |
+
|
| 442 |
+
$this->assertNotContains( esc_html( $expected ), $exception->getMessage() );
|
| 443 |
+
|
| 444 |
+
// Restore current user from backup.
|
| 445 |
+
wp_set_current_user( $current_user );
|
| 446 |
+
|
| 447 |
+
// Restore $_POST from back up.
|
| 448 |
+
$_POST = $_post_backup;
|
| 449 |
+
}
|
| 450 |
+
|
| 451 |
+
/**
|
| 452 |
+
* Checks delete guest author action with guest author.
|
| 453 |
+
*
|
| 454 |
+
* @covers CoAuthors_Guest_Authors::handle_delete_guest_author_action()
|
| 455 |
+
*/
|
| 456 |
+
public function test_handle_delete_guest_author_action_with_guest_author_existence() {
|
| 457 |
+
|
| 458 |
+
global $coauthors_plus;
|
| 459 |
+
|
| 460 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 461 |
+
|
| 462 |
+
// Back up $_POST.
|
| 463 |
+
$_post_backup = $_POST;
|
| 464 |
+
|
| 465 |
+
$expected = sprintf( __( "%s can't be deleted because it doesn't exist.", 'co-authors-plus' ), $guest_author_obj->labels['singular'] );
|
| 466 |
+
|
| 467 |
+
// Back up current user.
|
| 468 |
+
$current_user = get_current_user_id();
|
| 469 |
+
|
| 470 |
+
wp_set_current_user( $this->admin1->ID );
|
| 471 |
+
|
| 472 |
+
$_POST['action'] = 'delete-guest-author';
|
| 473 |
+
$_POST['reassign'] = 'test';
|
| 474 |
+
$_POST['_wpnonce'] = wp_create_nonce( 'delete-guest-author' );
|
| 475 |
+
$_POST['id'] = $this->admin1->ID;
|
| 476 |
+
|
| 477 |
+
// Checks when guest author does not exist.
|
| 478 |
+
try {
|
| 479 |
+
$guest_author_obj->handle_delete_guest_author_action();
|
| 480 |
+
} catch ( Exception $e ) {
|
| 481 |
+
$exception = $e;
|
| 482 |
+
}
|
| 483 |
+
|
| 484 |
+
$this->assertInstanceOf( 'WPDieException', $exception );
|
| 485 |
+
$this->assertContains( esc_html( $expected ), $exception->getMessage() );
|
| 486 |
+
|
| 487 |
+
// Checks when guest author exists.
|
| 488 |
+
$_POST['id'] = $guest_author_obj->create_guest_author_from_user_id( $this->admin1->ID );
|
| 489 |
+
|
| 490 |
+
try {
|
| 491 |
+
$guest_author_obj->handle_delete_guest_author_action();
|
| 492 |
+
} catch ( Exception $e ) {
|
| 493 |
+
$exception = $e;
|
| 494 |
+
}
|
| 495 |
+
|
| 496 |
+
$this->assertNotContains( esc_html( $expected ), $exception->getMessage() );
|
| 497 |
+
|
| 498 |
+
// Restore current user from backup.
|
| 499 |
+
wp_set_current_user( $current_user );
|
| 500 |
+
|
| 501 |
+
// Restore $_POST from back up.
|
| 502 |
+
$_POST = $_post_backup;
|
| 503 |
+
}
|
| 504 |
+
|
| 505 |
+
/**
|
| 506 |
+
* Checks delete guest author action with reassign not as expected.
|
| 507 |
+
*
|
| 508 |
+
* @covers CoAuthors_Guest_Authors::handle_delete_guest_author_action()
|
| 509 |
+
*/
|
| 510 |
+
public function test_handle_delete_guest_author_action_with_reassign_not_as_expected() {
|
| 511 |
+
|
| 512 |
+
global $coauthors_plus;
|
| 513 |
+
|
| 514 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 515 |
+
|
| 516 |
+
// Back up $_POST.
|
| 517 |
+
$_post_backup = $_POST;
|
| 518 |
+
|
| 519 |
+
$expected = __( 'Please make sure to pick an option.', 'co-authors-plus' );
|
| 520 |
+
|
| 521 |
+
// Back up current user.
|
| 522 |
+
$current_user = get_current_user_id();
|
| 523 |
+
|
| 524 |
+
wp_set_current_user( $this->admin1->ID );
|
| 525 |
+
|
| 526 |
+
$_POST['action'] = 'delete-guest-author';
|
| 527 |
+
$_POST['_wpnonce'] = wp_create_nonce( 'delete-guest-author' );
|
| 528 |
+
$_POST['id'] = $guest_author_obj->create_guest_author_from_user_id( $this->admin1->ID );
|
| 529 |
+
|
| 530 |
+
// Checks when reassign is not as expected.
|
| 531 |
+
$_POST['reassign'] = 'test';
|
| 532 |
+
|
| 533 |
+
try {
|
| 534 |
+
$guest_author_obj->handle_delete_guest_author_action();
|
| 535 |
+
} catch ( Exception $e ) {
|
| 536 |
+
$exception = $e;
|
| 537 |
+
}
|
| 538 |
+
|
| 539 |
+
$this->assertInstanceOf( 'WPDieException', $exception );
|
| 540 |
+
$this->assertContains( esc_html( $expected ), $exception->getMessage() );
|
| 541 |
+
|
| 542 |
+
// Restore current user from backup.
|
| 543 |
+
wp_set_current_user( $current_user );
|
| 544 |
+
|
| 545 |
+
// Restore $_POST from back up.
|
| 546 |
+
$_POST = $_post_backup;
|
| 547 |
+
}
|
| 548 |
+
|
| 549 |
+
/**
|
| 550 |
+
* Checks delete guest author action when reassign is leave-assigned.
|
| 551 |
+
*
|
| 552 |
+
* @covers CoAuthors_Guest_Authors::handle_delete_guest_author_action()
|
| 553 |
+
*/
|
| 554 |
+
public function test_handle_delete_guest_author_action_with_reassign_is_leave_assigned() {
|
| 555 |
+
|
| 556 |
+
global $coauthors_plus;
|
| 557 |
+
|
| 558 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 559 |
+
|
| 560 |
+
// Back up $_POST.
|
| 561 |
+
$_post_backup = $_POST;
|
| 562 |
+
|
| 563 |
+
// Back up current user.
|
| 564 |
+
$current_user = get_current_user_id();
|
| 565 |
+
|
| 566 |
+
wp_set_current_user( $this->admin1->ID );
|
| 567 |
+
|
| 568 |
+
$_POST['action'] = 'delete-guest-author';
|
| 569 |
+
$_POST['_wpnonce'] = wp_create_nonce( 'delete-guest-author' );
|
| 570 |
+
$_POST['id'] = $guest_author_obj->create_guest_author_from_user_id( $this->admin1->ID );
|
| 571 |
+
$_POST['reassign'] = 'leave-assigned';
|
| 572 |
+
|
| 573 |
+
add_filter( 'wp_redirect', array( $this, 'catch_redirect_destination' ), 99, 2 );
|
| 574 |
+
|
| 575 |
+
try {
|
| 576 |
+
|
| 577 |
+
$guest_author_obj->handle_delete_guest_author_action();
|
| 578 |
+
|
| 579 |
+
} catch( Exception $e ) {
|
| 580 |
+
|
| 581 |
+
$this->assertContains( $guest_author_obj->parent_page, $e->getMessage() );
|
| 582 |
+
$this->assertContains( 'page=view-guest-authors', $e->getMessage() );
|
| 583 |
+
$this->assertContains( 'message=guest-author-deleted', $e->getMessage() );
|
| 584 |
+
}
|
| 585 |
+
|
| 586 |
+
remove_filter( 'wp_redirect', array( $this, 'catch_redirect_destination' ), 99 );
|
| 587 |
+
|
| 588 |
+
// Restore current user from backup.
|
| 589 |
+
wp_set_current_user( $current_user );
|
| 590 |
+
|
| 591 |
+
// Restore $_POST from back up.
|
| 592 |
+
$_POST = $_post_backup;
|
| 593 |
+
}
|
| 594 |
+
|
| 595 |
+
/**
|
| 596 |
+
* Checks delete guest author action when reassign is reassign-another.
|
| 597 |
+
*
|
| 598 |
+
* @covers CoAuthors_Guest_Authors::handle_delete_guest_author_action()
|
| 599 |
+
*/
|
| 600 |
+
public function test_handle_delete_guest_author_action_with_reassign_is_reassign_another() {
|
| 601 |
+
|
| 602 |
+
global $coauthors_plus;
|
| 603 |
+
|
| 604 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 605 |
+
|
| 606 |
+
// Back up $_POST.
|
| 607 |
+
$_post_backup = $_POST;
|
| 608 |
+
|
| 609 |
+
// Back up current user.
|
| 610 |
+
$current_user = get_current_user_id();
|
| 611 |
+
|
| 612 |
+
$expected = __( 'Co-author does not exists. Try again?', 'co-authors-plus' );
|
| 613 |
+
|
| 614 |
+
wp_set_current_user( $this->admin1->ID );
|
| 615 |
+
|
| 616 |
+
$_POST['action'] = 'delete-guest-author';
|
| 617 |
+
$_POST['_wpnonce'] = wp_create_nonce( 'delete-guest-author' );
|
| 618 |
+
$_POST['id'] = $guest_author_obj->create_guest_author_from_user_id( $this->admin1->ID );
|
| 619 |
+
$_POST['reassign'] = 'reassign-another';
|
| 620 |
+
|
| 621 |
+
// When coauthor does not exist.
|
| 622 |
+
$_POST['leave-assigned-to'] = 'test';
|
| 623 |
+
|
| 624 |
+
try {
|
| 625 |
+
$guest_author_obj->handle_delete_guest_author_action();
|
| 626 |
+
} catch ( Exception $e ) {
|
| 627 |
+
$exception = $e;
|
| 628 |
+
}
|
| 629 |
+
|
| 630 |
+
$this->assertInstanceOf( 'WPDieException', $exception );
|
| 631 |
+
$this->assertContains( esc_html( $expected ), $exception->getMessage() );
|
| 632 |
+
|
| 633 |
+
// When coauthor exists.
|
| 634 |
+
$_POST['leave-assigned-to'] = $this->author1->user_nicename;
|
| 635 |
+
|
| 636 |
+
add_filter( 'wp_redirect', array( $this, 'catch_redirect_destination' ), 99, 2 );
|
| 637 |
+
|
| 638 |
+
try {
|
| 639 |
+
|
| 640 |
+
$guest_author_obj->handle_delete_guest_author_action();
|
| 641 |
+
|
| 642 |
+
} catch ( Exception $e ) {
|
| 643 |
+
|
| 644 |
+
//$this->assertContains( $guest_author_obj->parent_page, $e->getMessage() );
|
| 645 |
+
$this->assertContains( 'page=view-guest-authors', $e->getMessage() );
|
| 646 |
+
$this->assertContains( 'message=guest-author-deleted', $e->getMessage() );
|
| 647 |
+
}
|
| 648 |
+
|
| 649 |
+
remove_filter( 'wp_redirect', array( $this, 'catch_redirect_destination' ), 99 );
|
| 650 |
+
|
| 651 |
+
// Restore current user from backup.
|
| 652 |
+
wp_set_current_user( $current_user );
|
| 653 |
+
|
| 654 |
+
// Restore $_POST from back up.
|
| 655 |
+
$_POST = $_post_backup;
|
| 656 |
+
}
|
| 657 |
+
|
| 658 |
+
/**
|
| 659 |
+
* Checks delete guest author action when reassign is remove-byline.
|
| 660 |
+
*
|
| 661 |
+
* @covers CoAuthors_Guest_Authors::handle_delete_guest_author_action()
|
| 662 |
+
*/
|
| 663 |
+
public function test_handle_delete_guest_author_action_with_reassign_is_remove_byline() {
|
| 664 |
+
|
| 665 |
+
global $coauthors_plus;
|
| 666 |
+
|
| 667 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 668 |
+
|
| 669 |
+
// Back up $_POST.
|
| 670 |
+
$_post_backup = $_POST;
|
| 671 |
+
|
| 672 |
+
// Back up current user.
|
| 673 |
+
$current_user = get_current_user_id();
|
| 674 |
+
|
| 675 |
+
wp_set_current_user( $this->admin1->ID );
|
| 676 |
+
|
| 677 |
+
$_POST['action'] = 'delete-guest-author';
|
| 678 |
+
$_POST['_wpnonce'] = wp_create_nonce( 'delete-guest-author' );
|
| 679 |
+
$_POST['id'] = $guest_author_obj->create_guest_author_from_user_id( $this->admin1->ID );
|
| 680 |
+
$_POST['reassign'] = 'remove-byline';
|
| 681 |
+
|
| 682 |
+
add_filter( 'wp_redirect', array( $this, 'catch_redirect_destination' ), 99, 2 );
|
| 683 |
+
|
| 684 |
+
try {
|
| 685 |
+
|
| 686 |
+
$guest_author_obj->handle_delete_guest_author_action();
|
| 687 |
+
|
| 688 |
+
} catch ( Exception $e ) {
|
| 689 |
+
|
| 690 |
+
$this->assertContains( $guest_author_obj->parent_page, $e->getMessage() );
|
| 691 |
+
$this->assertContains( 'page=view-guest-authors', $e->getMessage() );
|
| 692 |
+
$this->assertContains( 'message=guest-author-deleted', $e->getMessage() );
|
| 693 |
+
}
|
| 694 |
+
|
| 695 |
+
remove_filter( 'wp_redirect', array( $this, 'catch_redirect_destination' ), 99 );
|
| 696 |
+
|
| 697 |
+
// Restore current user from backup.
|
| 698 |
+
wp_set_current_user( $current_user );
|
| 699 |
+
|
| 700 |
+
// Restore $_POST from back up.
|
| 701 |
+
$_POST = $_post_backup;
|
| 702 |
+
}
|
| 703 |
+
|
| 704 |
+
/**
|
| 705 |
+
* To catch any redirection and throw location and status in Exception.
|
| 706 |
+
*
|
| 707 |
+
* Note : Destination location can be get from Exception Message and
|
| 708 |
+
* status can be get from Exception code.
|
| 709 |
+
*
|
| 710 |
+
* @param string $location Redirected location.
|
| 711 |
+
* @param int $status Status.
|
| 712 |
+
*
|
| 713 |
+
* @throws \Exception Redirection data.
|
| 714 |
+
*
|
| 715 |
+
* @return void
|
| 716 |
+
**/
|
| 717 |
+
public function catch_redirect_destination( $location, $status ) {
|
| 718 |
+
|
| 719 |
+
throw new Exception( $location, $status );
|
| 720 |
+
}
|
| 721 |
+
|
| 722 |
+
/**
|
| 723 |
+
* Checks delete guest author when he/she does not exist.
|
| 724 |
+
*
|
| 725 |
+
* @covers CoAuthors_Guest_Authors::delete()
|
| 726 |
+
*/
|
| 727 |
+
public function test_delete_when_guest_author_not_exist() {
|
| 728 |
+
|
| 729 |
+
global $coauthors_plus;
|
| 730 |
+
|
| 731 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 732 |
+
|
| 733 |
+
$response = $guest_author_obj->delete( $this->admin1->ID );
|
| 734 |
+
|
| 735 |
+
$this->assertInstanceOf( 'WP_Error', $response );
|
| 736 |
+
$this->assertEquals( 'guest-author-missing', $response->get_error_code() );
|
| 737 |
+
}
|
| 738 |
+
|
| 739 |
+
/**
|
| 740 |
+
* Checks delete guest author without reassign author.
|
| 741 |
+
*
|
| 742 |
+
* @covers CoAuthors_Guest_Authors::delete()
|
| 743 |
+
*/
|
| 744 |
+
public function test_delete_without_reassign() {
|
| 745 |
+
|
| 746 |
+
global $coauthors_plus;
|
| 747 |
+
|
| 748 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 749 |
+
|
| 750 |
+
$author2 = $this->factory->user->create_and_get();
|
| 751 |
+
$guest_author_id = $guest_author_obj->create_guest_author_from_user_id( $author2->ID );
|
| 752 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'ID', $guest_author_id );
|
| 753 |
+
$guest_author_term = $coauthors_plus->get_author_term( $guest_author );
|
| 754 |
+
|
| 755 |
+
$response = $guest_author_obj->delete( $guest_author_id );
|
| 756 |
+
|
| 757 |
+
$this->assertTrue( $response );
|
| 758 |
+
$this->assertFalse( get_term_by( 'id', $guest_author_term->term_id, $coauthors_plus->coauthor_taxonomy ) );
|
| 759 |
+
$this->assertNull( get_post( $guest_author_id ) );
|
| 760 |
+
}
|
| 761 |
+
|
| 762 |
+
/**
|
| 763 |
+
* Checks delete guest author with reassign author but he/she does not exist.
|
| 764 |
+
*
|
| 765 |
+
* @covers CoAuthors_Guest_Authors::delete()
|
| 766 |
+
*/
|
| 767 |
+
public function test_delete_with_reassign_author_not_exist() {
|
| 768 |
+
|
| 769 |
+
global $coauthors_plus;
|
| 770 |
+
|
| 771 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 772 |
+
|
| 773 |
+
// Checks when reassign author is not exist.
|
| 774 |
+
$author2 = $this->factory->user->create_and_get();
|
| 775 |
+
$guest_author_id = $guest_author_obj->create_guest_author_from_user_id( $author2->ID );
|
| 776 |
+
|
| 777 |
+
$response = $guest_author_obj->delete( $guest_author_id, 'test' );
|
| 778 |
+
|
| 779 |
+
$this->assertInstanceOf( 'WP_Error', $response );
|
| 780 |
+
$this->assertEquals( 'reassign-to-missing', $response->get_error_code() );
|
| 781 |
+
}
|
| 782 |
+
|
| 783 |
+
/**
|
| 784 |
+
* Checks delete guest author with reassign author when linked account and author are same user.
|
| 785 |
+
*
|
| 786 |
+
* @covers CoAuthors_Guest_Authors::delete()
|
| 787 |
+
*/
|
| 788 |
+
public function test_delete_with_reassign_when_linked_account_and_author_are_same_user() {
|
| 789 |
+
|
| 790 |
+
global $coauthors_plus;
|
| 791 |
+
|
| 792 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 793 |
+
|
| 794 |
+
$author2 = $this->factory->user->create_and_get();
|
| 795 |
+
$guest_author2_id = $guest_author_obj->create_guest_author_from_user_id( $author2->ID );
|
| 796 |
+
$guest_author2 = $guest_author_obj->get_guest_author_by( 'ID', $guest_author2_id );
|
| 797 |
+
$guest_author2_term = $coauthors_plus->get_author_term( $guest_author2 );
|
| 798 |
+
|
| 799 |
+
$response = $guest_author_obj->delete( $guest_author2_id, $guest_author2->linked_account );
|
| 800 |
+
|
| 801 |
+
$this->assertTrue( $response );
|
| 802 |
+
$this->assertNotEmpty( get_term_by( 'id', $guest_author2_term->term_id, $coauthors_plus->coauthor_taxonomy ) );
|
| 803 |
+
$this->assertNull( get_post( $guest_author2_id ) );
|
| 804 |
+
}
|
| 805 |
+
|
| 806 |
+
/**
|
| 807 |
+
* Checks delete guest author with reassign author when linked account and author are different user.
|
| 808 |
+
*
|
| 809 |
+
* @covers CoAuthors_Guest_Authors::delete()
|
| 810 |
+
*/
|
| 811 |
+
public function test_delete_with_reassign_when_linked_account_and_author_are_different_user() {
|
| 812 |
+
|
| 813 |
+
global $coauthors_plus;
|
| 814 |
+
|
| 815 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 816 |
+
|
| 817 |
+
$guest_admin_id = $guest_author_obj->create_guest_author_from_user_id( $this->admin1->ID );
|
| 818 |
+
$guest_admin = $guest_author_obj->get_guest_author_by( 'ID', $guest_admin_id );
|
| 819 |
+
|
| 820 |
+
$author2 = $this->factory->user->create_and_get();
|
| 821 |
+
$guest_author_id2 = $guest_author_obj->create_guest_author_from_user_id( $author2->ID );
|
| 822 |
+
$guest_author2 = $guest_author_obj->get_guest_author_by( 'ID', $guest_author_id2 );
|
| 823 |
+
$guest_author_term2 = $coauthors_plus->get_author_term( $guest_author2 );
|
| 824 |
+
|
| 825 |
+
$post = $this->factory->post->create_and_get( array(
|
| 826 |
+
'post_author' => $author2->ID,
|
| 827 |
+
) );
|
| 828 |
+
|
| 829 |
+
$response = $guest_author_obj->delete( $guest_author_id2, $guest_admin->linked_account );
|
| 830 |
+
|
| 831 |
+
// Checks post author, it should be reassigned to new author.
|
| 832 |
+
$this->assertEquals( array( $guest_admin->linked_account ), wp_list_pluck( get_coauthors( $post->ID ), 'linked_account' ) );
|
| 833 |
+
$this->assertTrue( $response );
|
| 834 |
+
$this->assertFalse( get_term_by( 'id', $guest_author_term2->term_id, $coauthors_plus->coauthor_taxonomy ) );
|
| 835 |
+
$this->assertNull( get_post( $guest_author_id2 ) );
|
| 836 |
+
}
|
| 837 |
+
|
| 838 |
+
/**
|
| 839 |
+
* Checks delete guest author with reassign author and without linked account and author is the same user.
|
| 840 |
+
*
|
| 841 |
+
* @covers CoAuthors_Guest_Authors::delete()
|
| 842 |
+
*/
|
| 843 |
+
public function test_delete_with_reassign_without_linked_account_and_author_is_same_user() {
|
| 844 |
+
|
| 845 |
+
global $coauthors_plus;
|
| 846 |
+
|
| 847 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 848 |
+
|
| 849 |
+
$guest_author_id = $guest_author_obj->create( array(
|
| 850 |
+
'user_login' => 'guest_author',
|
| 851 |
+
'display_name' => 'guest_author',
|
| 852 |
+
) );
|
| 853 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'ID', $guest_author_id );
|
| 854 |
+
$guest_author_term = $coauthors_plus->get_author_term( $guest_author );
|
| 855 |
+
|
| 856 |
+
$response = $guest_author_obj->delete( $guest_author_id, $guest_author->user_login );
|
| 857 |
+
|
| 858 |
+
$this->assertTrue( $response );
|
| 859 |
+
$this->assertNotEmpty( get_term_by( 'id', $guest_author_term->term_id, $coauthors_plus->coauthor_taxonomy ) );
|
| 860 |
+
$this->assertNull( get_post( $guest_author_id ) );
|
| 861 |
+
}
|
| 862 |
+
|
| 863 |
+
/**
|
| 864 |
+
* Checks delete guest author with reassign author and without linked account and author is other user.
|
| 865 |
+
*
|
| 866 |
+
* @covers CoAuthors_Guest_Authors::delete()
|
| 867 |
+
*/
|
| 868 |
+
public function test_delete_with_reassign_without_linked_account_and_author_is_other_user() {
|
| 869 |
+
|
| 870 |
+
global $coauthors_plus;
|
| 871 |
+
|
| 872 |
+
$guest_author_obj = $coauthors_plus->guest_authors;
|
| 873 |
+
|
| 874 |
+
$guest_admin_id = $guest_author_obj->create_guest_author_from_user_id( $this->admin1->ID );
|
| 875 |
+
$guest_admin = $guest_author_obj->get_guest_author_by( 'ID', $guest_admin_id );
|
| 876 |
+
|
| 877 |
+
$guest_author_id = $guest_author_obj->create( array(
|
| 878 |
+
'user_login' => 'guest_author',
|
| 879 |
+
'display_name' => 'guest_author',
|
| 880 |
+
) );
|
| 881 |
+
$guest_author = $guest_author_obj->get_guest_author_by( 'ID', $guest_author_id );
|
| 882 |
+
$guest_author_term = $coauthors_plus->get_author_term( $guest_author );
|
| 883 |
+
|
| 884 |
+
$response = $guest_author_obj->delete( $guest_author_id, $guest_admin->user_login );
|
| 885 |
+
|
| 886 |
+
$this->assertTrue( $response );
|
| 887 |
+
$this->assertFalse( get_term_by( 'id', $guest_author_term->term_id, $coauthors_plus->coauthor_taxonomy ) );
|
| 888 |
+
$this->assertNull( get_post( $guest_author_id ) );
|
| 889 |
+
}
|
| 890 |
+
}
|
|
@@ -0,0 +1,679 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
class Test_CoAuthors_Plus extends CoAuthorsPlus_TestCase {
|
| 4 |
+
|
| 5 |
+
public function setUp() {
|
| 6 |
+
|
| 7 |
+
parent::setUp();
|
| 8 |
+
|
| 9 |
+
$this->author1 = $this->factory->user->create_and_get( array( 'role' => 'author', 'user_login' => 'author1' ) );
|
| 10 |
+
$this->editor1 = $this->factory->user->create_and_get( array( 'role' => 'editor', 'user_login' => 'editor1' ) );
|
| 11 |
+
|
| 12 |
+
$this->post = $this->factory->post->create_and_get( array(
|
| 13 |
+
'post_author' => $this->author1->ID,
|
| 14 |
+
'post_status' => 'publish',
|
| 15 |
+
'post_content' => rand_str(),
|
| 16 |
+
'post_title' => rand_str(),
|
| 17 |
+
'post_type' => 'post',
|
| 18 |
+
) );
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
/**
|
| 22 |
+
* Checks whether the guest authors functionality is enabled or not.
|
| 23 |
+
*
|
| 24 |
+
* @covers CoAuthors_Plus::is_guest_authors_enabled()
|
| 25 |
+
*/
|
| 26 |
+
public function test_is_guest_authors_enabled() {
|
| 27 |
+
|
| 28 |
+
global $coauthors_plus;
|
| 29 |
+
|
| 30 |
+
$this->assertTrue( $coauthors_plus->is_guest_authors_enabled() );
|
| 31 |
+
|
| 32 |
+
add_filter( 'coauthors_guest_authors_enabled', '__return_false' );
|
| 33 |
+
|
| 34 |
+
$this->assertFalse( $coauthors_plus->is_guest_authors_enabled() );
|
| 35 |
+
|
| 36 |
+
remove_filter( 'coauthors_guest_authors_enabled', '__return_false' );
|
| 37 |
+
|
| 38 |
+
$this->assertTrue( $coauthors_plus->is_guest_authors_enabled() );
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
/**
|
| 42 |
+
* Checks coauthor object when he/she is a guest author.
|
| 43 |
+
*
|
| 44 |
+
* @covers CoAuthors_Plus::get_coauthor_by()
|
| 45 |
+
*/
|
| 46 |
+
public function test_get_coauthor_by_when_guest_author() {
|
| 47 |
+
|
| 48 |
+
global $coauthors_plus;
|
| 49 |
+
|
| 50 |
+
$guest_author_id = $coauthors_plus->guest_authors->create( array(
|
| 51 |
+
'user_login' => 'author2',
|
| 52 |
+
'display_name' => 'author2',
|
| 53 |
+
) );
|
| 54 |
+
|
| 55 |
+
$coauthor = $coauthors_plus->get_coauthor_by( 'id', $guest_author_id );
|
| 56 |
+
|
| 57 |
+
$this->assertInstanceOf( stdClass::class, $coauthor );
|
| 58 |
+
$this->assertObjectHasAttribute( 'ID', $coauthor );
|
| 59 |
+
$this->assertEquals( $guest_author_id, $coauthor->ID );
|
| 60 |
+
$this->assertEquals( 'guest-author', $coauthor->type );
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
/**
|
| 64 |
+
* Checks coauthor object when he/she is a wp author.
|
| 65 |
+
*
|
| 66 |
+
* @covers CoAuthors_Plus::get_coauthor_by()
|
| 67 |
+
*/
|
| 68 |
+
public function test_get_coauthor_by_when_guest_authors_not_enabled() {
|
| 69 |
+
|
| 70 |
+
global $coauthors_plus;
|
| 71 |
+
|
| 72 |
+
add_filter( 'coauthors_guest_authors_enabled', '__return_false' );
|
| 73 |
+
|
| 74 |
+
$this->assertFalse( $coauthors_plus->get_coauthor_by( '', '' ) );
|
| 75 |
+
|
| 76 |
+
$coauthor = $coauthors_plus->get_coauthor_by( 'id', $this->author1->ID );
|
| 77 |
+
|
| 78 |
+
$this->assertInstanceOf( WP_User::class, $coauthor );
|
| 79 |
+
$this->assertObjectHasAttribute( 'ID', $coauthor );
|
| 80 |
+
$this->assertEquals( $this->author1->ID, $coauthor->ID );
|
| 81 |
+
$this->assertEquals( 'wpuser', $coauthor->type );
|
| 82 |
+
|
| 83 |
+
$coauthor = $coauthors_plus->get_coauthor_by( 'user_login', $this->author1->user_login );
|
| 84 |
+
|
| 85 |
+
$this->assertInstanceOf( WP_User::class, $coauthor );
|
| 86 |
+
$this->assertObjectHasAttribute( 'user_login', $coauthor->data );
|
| 87 |
+
$this->assertEquals( $this->author1->user_login, $coauthor->user_login );
|
| 88 |
+
|
| 89 |
+
$coauthor = $coauthors_plus->get_coauthor_by( 'user_nicename', $this->author1->user_nicename );
|
| 90 |
+
|
| 91 |
+
$this->assertInstanceOf( WP_User::class, $coauthor );
|
| 92 |
+
$this->assertObjectHasAttribute( 'user_nicename', $coauthor->data );
|
| 93 |
+
$this->assertEquals( $this->author1->user_nicename, $coauthor->user_nicename );
|
| 94 |
+
|
| 95 |
+
$coauthor = $coauthors_plus->get_coauthor_by( 'user_email', $this->author1->user_email );
|
| 96 |
+
|
| 97 |
+
$this->assertInstanceOf( WP_User::class, $coauthor );
|
| 98 |
+
$this->assertObjectHasAttribute( 'user_email', $coauthor->data );
|
| 99 |
+
$this->assertEquals( $this->author1->user_email, $coauthor->user_email );
|
| 100 |
+
|
| 101 |
+
remove_filter( 'coauthors_guest_authors_enabled', '__return_false' );
|
| 102 |
+
|
| 103 |
+
$coauthors_plus->guest_authors->create_guest_author_from_user_id( $this->editor1->ID );
|
| 104 |
+
|
| 105 |
+
$coauthor = $coauthors_plus->get_coauthor_by( 'id', $this->editor1->ID );
|
| 106 |
+
|
| 107 |
+
$this->assertInstanceOf( stdClass::class, $coauthor );
|
| 108 |
+
$this->assertObjectHasAttribute( 'linked_account', $coauthor );
|
| 109 |
+
$this->assertEquals( $this->editor1->user_login, $coauthor->linked_account );
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
/**
|
| 113 |
+
* Checks coauthors plus is enabled for this post type.
|
| 114 |
+
*
|
| 115 |
+
* @covers CoAuthors_Plus::is_post_type_enabled()
|
| 116 |
+
*/
|
| 117 |
+
public function test_is_post_type_enabled() {
|
| 118 |
+
|
| 119 |
+
global $coauthors_plus, $post;
|
| 120 |
+
|
| 121 |
+
// Backing up global post.
|
| 122 |
+
$post_backup = $post;
|
| 123 |
+
|
| 124 |
+
// Checks when post type is null.
|
| 125 |
+
$this->assertFalse( $coauthors_plus->is_post_type_enabled() );
|
| 126 |
+
|
| 127 |
+
// Checks when post type is post.
|
| 128 |
+
$this->assertTrue( $coauthors_plus->is_post_type_enabled( 'post' ) );
|
| 129 |
+
|
| 130 |
+
// Checks when post type is page.
|
| 131 |
+
$this->assertTrue( $coauthors_plus->is_post_type_enabled( 'page' ) );
|
| 132 |
+
|
| 133 |
+
// Checks when post type is attachment.
|
| 134 |
+
$this->assertFalse( $coauthors_plus->is_post_type_enabled( 'attachment' ) );
|
| 135 |
+
|
| 136 |
+
// Checks when post type is revision.
|
| 137 |
+
$this->assertFalse( $coauthors_plus->is_post_type_enabled( 'revision' ) );
|
| 138 |
+
|
| 139 |
+
$post = $this->post;
|
| 140 |
+
|
| 141 |
+
// Checks when post type set using global post.
|
| 142 |
+
$this->assertTrue( $coauthors_plus->is_post_type_enabled() );
|
| 143 |
+
|
| 144 |
+
$post = '';
|
| 145 |
+
$screen = get_current_screen();
|
| 146 |
+
|
| 147 |
+
// Set the edit post current screen.
|
| 148 |
+
set_current_screen( 'edit-post' );
|
| 149 |
+
$this->assertTrue( $coauthors_plus->is_post_type_enabled() );
|
| 150 |
+
|
| 151 |
+
$GLOBALS['current_screen'] = $screen;
|
| 152 |
+
|
| 153 |
+
// Restore global post from backup.
|
| 154 |
+
$post = $post_backup;
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
/**
|
| 158 |
+
* Checks if the current user can set co-authors or not using current screen.
|
| 159 |
+
*
|
| 160 |
+
* @covers CoAuthors_Plus::current_user_can_set_authors()
|
| 161 |
+
*/
|
| 162 |
+
public function test_current_user_can_set_authors_using_current_screen() {
|
| 163 |
+
|
| 164 |
+
global $coauthors_plus;
|
| 165 |
+
|
| 166 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors() );
|
| 167 |
+
|
| 168 |
+
$screen = get_current_screen();
|
| 169 |
+
|
| 170 |
+
// Set the edit post current screen.
|
| 171 |
+
set_current_screen( 'edit-post' );
|
| 172 |
+
|
| 173 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors() );
|
| 174 |
+
|
| 175 |
+
$GLOBALS['current_screen'] = $screen;
|
| 176 |
+
|
| 177 |
+
// Backing up current user.
|
| 178 |
+
$current_user = get_current_user_id();
|
| 179 |
+
|
| 180 |
+
// Checks when current user is author.
|
| 181 |
+
wp_set_current_user( $this->author1->ID );
|
| 182 |
+
|
| 183 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors() );
|
| 184 |
+
|
| 185 |
+
set_current_screen( 'edit-post' );
|
| 186 |
+
|
| 187 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors() );
|
| 188 |
+
|
| 189 |
+
$GLOBALS['current_screen'] = $screen;
|
| 190 |
+
|
| 191 |
+
// Checks when current user is editor.
|
| 192 |
+
wp_set_current_user( $this->editor1->ID );
|
| 193 |
+
|
| 194 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors() );
|
| 195 |
+
|
| 196 |
+
set_current_screen( 'edit-post' );
|
| 197 |
+
|
| 198 |
+
$this->assertTrue( $coauthors_plus->current_user_can_set_authors() );
|
| 199 |
+
|
| 200 |
+
$GLOBALS['current_screen'] = $screen;
|
| 201 |
+
|
| 202 |
+
// Checks when current user is admin.
|
| 203 |
+
$admin1 = $this->factory->user->create_and_get( array(
|
| 204 |
+
'role' => 'administrator',
|
| 205 |
+
) );
|
| 206 |
+
|
| 207 |
+
wp_set_current_user( $admin1->ID );
|
| 208 |
+
|
| 209 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors() );
|
| 210 |
+
|
| 211 |
+
set_current_screen( 'edit-post' );
|
| 212 |
+
|
| 213 |
+
$this->assertTrue( $coauthors_plus->current_user_can_set_authors() );
|
| 214 |
+
|
| 215 |
+
$GLOBALS['current_screen'] = $screen;
|
| 216 |
+
|
| 217 |
+
// Restore current user from backup.
|
| 218 |
+
wp_set_current_user( $current_user );
|
| 219 |
+
}
|
| 220 |
+
|
| 221 |
+
/**
|
| 222 |
+
* Checks if the current user can set co-authors or not using global post.
|
| 223 |
+
*
|
| 224 |
+
* @covers CoAuthors_Plus::current_user_can_set_authors()
|
| 225 |
+
*/
|
| 226 |
+
public function test_current_user_can_set_authors_using_global_post() {
|
| 227 |
+
|
| 228 |
+
global $coauthors_plus, $post;
|
| 229 |
+
|
| 230 |
+
// Backing up global post.
|
| 231 |
+
$post_backup = $post;
|
| 232 |
+
|
| 233 |
+
$post = $this->post;
|
| 234 |
+
|
| 235 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors() );
|
| 236 |
+
|
| 237 |
+
// Backing up current user.
|
| 238 |
+
$current_user = get_current_user_id();
|
| 239 |
+
|
| 240 |
+
// Checks when current user is author.
|
| 241 |
+
wp_set_current_user( $this->author1->ID );
|
| 242 |
+
|
| 243 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors() );
|
| 244 |
+
|
| 245 |
+
// Checks when current user is editor.
|
| 246 |
+
wp_set_current_user( $this->editor1->ID );
|
| 247 |
+
|
| 248 |
+
$this->assertTrue( $coauthors_plus->current_user_can_set_authors() );
|
| 249 |
+
|
| 250 |
+
// Checks when current user is super admin.
|
| 251 |
+
$admin1 = $this->factory->user->create_and_get( array(
|
| 252 |
+
'role' => 'administrator',
|
| 253 |
+
) );
|
| 254 |
+
|
| 255 |
+
grant_super_admin( $admin1->ID );
|
| 256 |
+
wp_set_current_user( $admin1->ID );
|
| 257 |
+
|
| 258 |
+
$this->assertTrue( $coauthors_plus->current_user_can_set_authors() );
|
| 259 |
+
|
| 260 |
+
// Restore current user from backup.
|
| 261 |
+
wp_set_current_user( $current_user );
|
| 262 |
+
|
| 263 |
+
// Restore global post from backup.
|
| 264 |
+
$post = $post_backup;
|
| 265 |
+
}
|
| 266 |
+
|
| 267 |
+
/**
|
| 268 |
+
* Checks if the current user can set co-authors or not using normal post.
|
| 269 |
+
*
|
| 270 |
+
* @covers CoAuthors_Plus::current_user_can_set_authors()
|
| 271 |
+
*/
|
| 272 |
+
public function test_current_user_can_set_authors_using_normal_post() {
|
| 273 |
+
|
| 274 |
+
global $coauthors_plus;
|
| 275 |
+
|
| 276 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors( $this->post ) );
|
| 277 |
+
|
| 278 |
+
// Backing up current user.
|
| 279 |
+
$current_user = get_current_user_id();
|
| 280 |
+
|
| 281 |
+
// Checks when current user is author.
|
| 282 |
+
wp_set_current_user( $this->author1->ID );
|
| 283 |
+
|
| 284 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors( $this->post ) );
|
| 285 |
+
|
| 286 |
+
// Checks when current user is editor.
|
| 287 |
+
wp_set_current_user( $this->editor1->ID );
|
| 288 |
+
|
| 289 |
+
$this->assertTrue( $coauthors_plus->current_user_can_set_authors( $this->post ) );
|
| 290 |
+
|
| 291 |
+
// Checks when current user is super admin.
|
| 292 |
+
$admin1 = $this->factory->user->create_and_get( array(
|
| 293 |
+
'role' => 'administrator',
|
| 294 |
+
) );
|
| 295 |
+
|
| 296 |
+
grant_super_admin( $admin1->ID );
|
| 297 |
+
wp_set_current_user( $admin1->ID );
|
| 298 |
+
|
| 299 |
+
$this->assertTrue( $coauthors_plus->current_user_can_set_authors( $this->post ) );
|
| 300 |
+
|
| 301 |
+
// Restore current user from backup.
|
| 302 |
+
wp_set_current_user( $current_user );
|
| 303 |
+
}
|
| 304 |
+
|
| 305 |
+
/**
|
| 306 |
+
* Checks if the current user can set co-authors or not using coauthors_plus_edit_authors filter.
|
| 307 |
+
*
|
| 308 |
+
* @covers CoAuthors_Plus::current_user_can_set_authors()
|
| 309 |
+
*/
|
| 310 |
+
public function test_current_user_can_set_authors_using_coauthors_plus_edit_authors_filter() {
|
| 311 |
+
|
| 312 |
+
global $coauthors_plus;
|
| 313 |
+
|
| 314 |
+
// Backing up current user.
|
| 315 |
+
$current_user = get_current_user_id();
|
| 316 |
+
|
| 317 |
+
// Checking when current user is subscriber and filter is true/false.
|
| 318 |
+
$subscriber1 = $this->factory->user->create_and_get( array(
|
| 319 |
+
'role' => 'subscriber',
|
| 320 |
+
) );
|
| 321 |
+
|
| 322 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors( $this->post ) );
|
| 323 |
+
|
| 324 |
+
add_filter( 'coauthors_plus_edit_authors', '__return_true' );
|
| 325 |
+
|
| 326 |
+
$this->assertTrue( $coauthors_plus->current_user_can_set_authors( $this->post ) );
|
| 327 |
+
|
| 328 |
+
remove_filter( 'coauthors_plus_edit_authors', '__return_true' );
|
| 329 |
+
|
| 330 |
+
// Checks when current user is editor.
|
| 331 |
+
wp_set_current_user( $this->editor1->ID );
|
| 332 |
+
|
| 333 |
+
$this->assertTrue( $coauthors_plus->current_user_can_set_authors( $this->post ) );
|
| 334 |
+
|
| 335 |
+
add_filter( 'coauthors_plus_edit_authors', '__return_false' );
|
| 336 |
+
|
| 337 |
+
$this->assertFalse( $coauthors_plus->current_user_can_set_authors( $this->post ) );
|
| 338 |
+
|
| 339 |
+
remove_filter( 'coauthors_plus_edit_authors', '__return_false' );
|
| 340 |
+
|
| 341 |
+
// Restore current user from backup.
|
| 342 |
+
wp_set_current_user( $current_user );
|
| 343 |
+
}
|
| 344 |
+
|
| 345 |
+
/**
|
| 346 |
+
* Checks matching co-authors based on a search value when no arguments provided.
|
| 347 |
+
*
|
| 348 |
+
* @covers CoAuthors_Plus::search_authors()
|
| 349 |
+
*/
|
| 350 |
+
public function test_search_authors_no_args() {
|
| 351 |
+
|
| 352 |
+
global $coauthors_plus;
|
| 353 |
+
|
| 354 |
+
// Checks when search term is empty.
|
| 355 |
+
$authors = $coauthors_plus->search_authors();
|
| 356 |
+
|
| 357 |
+
$this->assertNotEmpty( $authors );
|
| 358 |
+
$this->assertArrayHasKey( 'admin', $authors );
|
| 359 |
+
$this->assertArrayHasKey( $this->author1->user_login, $authors );
|
| 360 |
+
$this->assertArrayHasKey( $this->editor1->user_login, $authors );
|
| 361 |
+
|
| 362 |
+
// Checks when search term is empty and any subscriber exists.
|
| 363 |
+
$subscriber1 = $this->factory->user->create_and_get( array(
|
| 364 |
+
'role' => 'subscriber',
|
| 365 |
+
) );
|
| 366 |
+
|
| 367 |
+
$authors = $coauthors_plus->search_authors();
|
| 368 |
+
|
| 369 |
+
$this->assertNotEmpty( $authors );
|
| 370 |
+
$this->assertNotContains( $subscriber1->user_login, $authors );
|
| 371 |
+
|
| 372 |
+
// Checks when search term is empty and any contributor exists.
|
| 373 |
+
$contributor1 = $this->factory->user->create_and_get( array(
|
| 374 |
+
'role' => 'contributor',
|
| 375 |
+
) );
|
| 376 |
+
|
| 377 |
+
$authors = $coauthors_plus->search_authors();
|
| 378 |
+
|
| 379 |
+
$this->assertNotEmpty( $authors );
|
| 380 |
+
$this->assertArrayHasKey( $contributor1->user_login, $authors );
|
| 381 |
+
}
|
| 382 |
+
|
| 383 |
+
/**
|
| 384 |
+
* Checks matching co-authors based on a search value when only search keyword is provided.
|
| 385 |
+
*
|
| 386 |
+
* @covers CoAuthors_Plus::search_authors()
|
| 387 |
+
*/
|
| 388 |
+
public function test_search_authors_when_search_keyword_provided() {
|
| 389 |
+
|
| 390 |
+
global $coauthors_plus;
|
| 391 |
+
|
| 392 |
+
// Checks when author does not exist with searched term.
|
| 393 |
+
$this->assertEmpty( $coauthors_plus->search_authors( 'test' ) );
|
| 394 |
+
|
| 395 |
+
// Checks when author searched using ID.
|
| 396 |
+
$authors = $coauthors_plus->search_authors( $this->author1->ID );
|
| 397 |
+
|
| 398 |
+
$this->assertNotEmpty( $authors );
|
| 399 |
+
$this->assertArrayHasKey( $this->author1->user_login, $authors );
|
| 400 |
+
$this->assertNotContains( $this->editor1->user_login, $authors );
|
| 401 |
+
$this->assertNotContains( 'admin', $authors );
|
| 402 |
+
|
| 403 |
+
// Checks when author searched using display_name.
|
| 404 |
+
$authors = $coauthors_plus->search_authors( $this->author1->display_name );
|
| 405 |
+
|
| 406 |
+
$this->assertNotEmpty( $authors );
|
| 407 |
+
$this->assertArrayHasKey( $this->author1->user_login, $authors );
|
| 408 |
+
$this->assertNotContains( $this->editor1->user_login, $authors );
|
| 409 |
+
$this->assertNotContains( 'admin', $authors );
|
| 410 |
+
|
| 411 |
+
// Checks when author searched using user_email.
|
| 412 |
+
$authors = $coauthors_plus->search_authors( $this->author1->user_email );
|
| 413 |
+
|
| 414 |
+
$this->assertNotEmpty( $authors );
|
| 415 |
+
$this->assertArrayHasKey( $this->author1->user_login, $authors );
|
| 416 |
+
$this->assertNotContains( $this->editor1->user_login, $authors );
|
| 417 |
+
$this->assertNotContains( 'admin', $authors );
|
| 418 |
+
|
| 419 |
+
// Checks when author searched using user_login.
|
| 420 |
+
$authors = $coauthors_plus->search_authors( $this->author1->user_login );
|
| 421 |
+
|
| 422 |
+
$this->assertNotEmpty( $authors );
|
| 423 |
+
$this->assertArrayHasKey( $this->author1->user_login, $authors );
|
| 424 |
+
$this->assertNotContains( $this->editor1->user_login, $authors );
|
| 425 |
+
$this->assertNotContains( 'admin', $authors );
|
| 426 |
+
|
| 427 |
+
// Checks when any subscriber exists using ID but not author.
|
| 428 |
+
$subscriber1 = $this->factory->user->create_and_get( array(
|
| 429 |
+
'role' => 'subscriber',
|
| 430 |
+
) );
|
| 431 |
+
|
| 432 |
+
$this->assertEmpty( $coauthors_plus->search_authors( $subscriber1->ID ) );
|
| 433 |
+
}
|
| 434 |
+
|
| 435 |
+
/**
|
| 436 |
+
* Checks matching co-authors based on a search value when only ignore authors are provided.
|
| 437 |
+
*
|
| 438 |
+
* @covers CoAuthors_Plus::search_authors()
|
| 439 |
+
*/
|
| 440 |
+
public function test_search_authors_when_ignored_authors_provided() {
|
| 441 |
+
|
| 442 |
+
global $coauthors_plus;
|
| 443 |
+
|
| 444 |
+
// Ignoring single author.
|
| 445 |
+
$ignored_authors = array( $this->author1->user_login );
|
| 446 |
+
|
| 447 |
+
$authors = $coauthors_plus->search_authors( '', $ignored_authors );
|
| 448 |
+
|
| 449 |
+
$this->assertNotEmpty( $authors );
|
| 450 |
+
$this->assertNotContains( $this->author1->user_login, $authors );
|
| 451 |
+
|
| 452 |
+
// Checks when ignoring author1 but also exists one more author with similar kind of data.
|
| 453 |
+
$author2 = $this->factory->user->create_and_get( array(
|
| 454 |
+
'role' => 'author',
|
| 455 |
+
) );
|
| 456 |
+
|
| 457 |
+
$authors = $coauthors_plus->search_authors( '', $ignored_authors );
|
| 458 |
+
|
| 459 |
+
$this->assertNotEmpty( $authors );
|
| 460 |
+
$this->assertNotContains( $this->author1->user_login, $authors );
|
| 461 |
+
$this->assertArrayHasKey( $author2->user_login, $authors );
|
| 462 |
+
|
| 463 |
+
// Ignoring multiple authors.
|
| 464 |
+
$authors = $coauthors_plus->search_authors( '', array( $this->author1->user_login, $author2->user_login ) );
|
| 465 |
+
|
| 466 |
+
$this->assertNotEmpty( $authors );
|
| 467 |
+
$this->assertNotContains( $this->author1->user_login, $authors );
|
| 468 |
+
$this->assertNotContains( $author2->user_login, $authors );
|
| 469 |
+
}
|
| 470 |
+
|
| 471 |
+
/**
|
| 472 |
+
* Checks matching co-authors based on a search value when search keyword as well as ignore authors are provided.
|
| 473 |
+
*
|
| 474 |
+
* @covers CoAuthors_Plus::search_authors()
|
| 475 |
+
*/
|
| 476 |
+
public function test_search_authors_when_search_keyword_and_ignored_authors_provided() {
|
| 477 |
+
|
| 478 |
+
global $coauthors_plus;
|
| 479 |
+
|
| 480 |
+
// Checks when ignoring author1.
|
| 481 |
+
$ignored_authors = array( $this->author1->user_login );
|
| 482 |
+
|
| 483 |
+
$this->assertEmpty( $coauthors_plus->search_authors( $this->author1->ID, $ignored_authors ) );
|
| 484 |
+
|
| 485 |
+
// Checks when ignoring author1 but also exists one more author with similar kind of data.
|
| 486 |
+
$author2 = $this->factory->user->create_and_get( array(
|
| 487 |
+
'role' => 'author',
|
| 488 |
+
'user_login' => 'author2',
|
| 489 |
+
) );
|
| 490 |
+
|
| 491 |
+
$authors = $coauthors_plus->search_authors( 'author', $ignored_authors );
|
| 492 |
+
|
| 493 |
+
$this->assertNotEmpty( $authors );
|
| 494 |
+
$this->assertNotContains( $this->author1->user_login, $authors );
|
| 495 |
+
$this->assertArrayHasKey( $author2->user_login, $authors );
|
| 496 |
+
}
|
| 497 |
+
|
| 498 |
+
/**
|
| 499 |
+
* Checks the author term for a given co-author when passed coauthor is not an object.
|
| 500 |
+
*
|
| 501 |
+
* @covers CoAuthors_Plus::get_author_term()
|
| 502 |
+
*/
|
| 503 |
+
public function test_get_author_term_when_coauthor_is_not_object() {
|
| 504 |
+
|
| 505 |
+
global $coauthors_plus;
|
| 506 |
+
|
| 507 |
+
$this->assertEmpty( $coauthors_plus->get_author_term( '' ) );
|
| 508 |
+
$this->assertEmpty( $coauthors_plus->get_author_term( $this->author1->ID ) );
|
| 509 |
+
$this->assertEmpty( $coauthors_plus->get_author_term( (array) $this->author1 ) );
|
| 510 |
+
}
|
| 511 |
+
|
| 512 |
+
/**
|
| 513 |
+
* Checks the author term for a given co-author using cache.
|
| 514 |
+
*
|
| 515 |
+
* @covers CoAuthors_Plus::get_author_term()
|
| 516 |
+
*/
|
| 517 |
+
public function test_get_author_term_using_caching() {
|
| 518 |
+
|
| 519 |
+
global $coauthors_plus;
|
| 520 |
+
|
| 521 |
+
$cache_key = 'author-term-' . $this->author1->user_nicename;
|
| 522 |
+
|
| 523 |
+
// Checks when term does not exist in cache.
|
| 524 |
+
$this->assertFalse( wp_cache_get( $cache_key, 'co-authors-plus' ) );
|
| 525 |
+
|
| 526 |
+
// Checks when term exists in cache.
|
| 527 |
+
$author_term = $coauthors_plus->get_author_term( $this->author1 );
|
| 528 |
+
$author_term_cached = wp_cache_get( $cache_key, 'co-authors-plus' );
|
| 529 |
+
|
| 530 |
+
$this->assertInstanceOf( WP_Term::class, $author_term );
|
| 531 |
+
$this->assertEquals( $author_term, $author_term_cached );
|
| 532 |
+
}
|
| 533 |
+
|
| 534 |
+
/**
|
| 535 |
+
* Checks the author term for a given co-author with having linked account.
|
| 536 |
+
*
|
| 537 |
+
* @covers CoAuthors_Plus::get_author_term()
|
| 538 |
+
*/
|
| 539 |
+
public function test_get_author_term_when_author_has_linked_account() {
|
| 540 |
+
|
| 541 |
+
global $coauthors_plus;
|
| 542 |
+
|
| 543 |
+
// Checks when term exists using linked account.
|
| 544 |
+
$coauthor_id = $coauthors_plus->guest_authors->create_guest_author_from_user_id( $this->editor1->ID );
|
| 545 |
+
$coauthor = $coauthors_plus->get_coauthor_by( 'id', $coauthor_id );
|
| 546 |
+
|
| 547 |
+
$author_term = $coauthors_plus->get_author_term( $coauthor );
|
| 548 |
+
|
| 549 |
+
$this->assertInstanceOf( WP_Term::class, $author_term );
|
| 550 |
+
|
| 551 |
+
// Checks when term does not exist or deleted somehow.
|
| 552 |
+
wp_delete_term( $author_term->term_id, $author_term->taxonomy );
|
| 553 |
+
|
| 554 |
+
$this->assertFalse( $coauthors_plus->get_author_term( $coauthor ) );
|
| 555 |
+
}
|
| 556 |
+
|
| 557 |
+
/**
|
| 558 |
+
* Checks the author term for a given co-author without having linked account.
|
| 559 |
+
*
|
| 560 |
+
* @covers CoAuthors_Plus::get_author_term()
|
| 561 |
+
*/
|
| 562 |
+
public function test_get_author_term_when_author_has_not_linked_account() {
|
| 563 |
+
|
| 564 |
+
global $coauthors_plus;
|
| 565 |
+
|
| 566 |
+
// Checks when term exists without linked account.
|
| 567 |
+
$coauthor_id = $coauthors_plus->guest_authors->create( array(
|
| 568 |
+
'display_name' => 'guest',
|
| 569 |
+
'user_login' => 'guest',
|
| 570 |
+
) );
|
| 571 |
+
$coauthor = $coauthors_plus->get_coauthor_by( 'id', $coauthor_id );
|
| 572 |
+
|
| 573 |
+
$author_term = $coauthors_plus->get_author_term( $coauthor );
|
| 574 |
+
|
| 575 |
+
$this->assertInstanceOf( WP_Term::class, $author_term );
|
| 576 |
+
|
| 577 |
+
// Checks when term does not exist or deleted somehow.
|
| 578 |
+
wp_delete_term( $author_term->term_id, $author_term->taxonomy );
|
| 579 |
+
|
| 580 |
+
$this->assertFalse( $coauthors_plus->get_author_term( $coauthor ) );
|
| 581 |
+
}
|
| 582 |
+
|
| 583 |
+
/**
|
| 584 |
+
* Checks update author term when passed coauthor is not an object.
|
| 585 |
+
*
|
| 586 |
+
* @covers CoAuthors_Plus::update_author_term()
|
| 587 |
+
*/
|
| 588 |
+
public function test_update_author_term_when_coauthor_is_not_object() {
|
| 589 |
+
|
| 590 |
+
global $coauthors_plus;
|
| 591 |
+
|
| 592 |
+
$this->assertEmpty( $coauthors_plus->update_author_term( '' ) );
|
| 593 |
+
$this->assertEmpty( $coauthors_plus->update_author_term( $this->author1->ID ) );
|
| 594 |
+
$this->assertEmpty( $coauthors_plus->update_author_term( (array) $this->author1 ) );
|
| 595 |
+
}
|
| 596 |
+
|
| 597 |
+
/**
|
| 598 |
+
* Checks update author term when author term exists for passed coauthor.
|
| 599 |
+
*
|
| 600 |
+
* @covers CoAuthors_Plus::update_author_term()
|
| 601 |
+
*/
|
| 602 |
+
public function test_update_author_term_when_author_term_exists() {
|
| 603 |
+
|
| 604 |
+
global $coauthors_plus;
|
| 605 |
+
|
| 606 |
+
// Checks term description.
|
| 607 |
+
$author_term = $coauthors_plus->update_author_term( $this->author1 );
|
| 608 |
+
|
| 609 |
+
// In "update_author_term()", only description is being updated, so asserting that only ( here and everywhere ).
|
| 610 |
+
$this->assertEquals( $this->author1->display_name . ' ' . $this->author1->first_name . ' ' . $this->author1->last_name . ' ' . $this->author1->user_login . ' ' . $this->author1->ID . ' ' . $this->author1->user_email, $author_term->description );
|
| 611 |
+
|
| 612 |
+
// Checks term description after updating user.
|
| 613 |
+
wp_update_user( array(
|
| 614 |
+
'ID' => $this->author1->ID,
|
| 615 |
+
'first_name' => 'author1',
|
| 616 |
+
) );
|
| 617 |
+
|
| 618 |
+
$author_term = $coauthors_plus->update_author_term( $this->author1 );
|
| 619 |
+
|
| 620 |
+
$this->assertEquals( $this->author1->display_name . ' ' . $this->author1->first_name . ' ' . $this->author1->last_name . ' ' . $this->author1->user_login . ' ' . $this->author1->ID . ' ' . $this->author1->user_email, $author_term->description );
|
| 621 |
+
|
| 622 |
+
// Backup coauthor taxonomy.
|
| 623 |
+
$taxonomy_backup = $coauthors_plus->coauthor_taxonomy;
|
| 624 |
+
|
| 625 |
+
wp_update_user( array(
|
| 626 |
+
'ID' => $this->author1->ID,
|
| 627 |
+
'last_name' => 'author1',
|
| 628 |
+
) );
|
| 629 |
+
|
| 630 |
+
// Checks with different taxonomy.
|
| 631 |
+
$coauthors_plus->coauthor_taxonomy = 'abcd';
|
| 632 |
+
|
| 633 |
+
$this->assertFalse( $coauthors_plus->update_author_term( $this->author1 ) );
|
| 634 |
+
|
| 635 |
+
// Restore coauthor taxonomy from backup.
|
| 636 |
+
$coauthors_plus->coauthor_taxonomy = $taxonomy_backup;
|
| 637 |
+
}
|
| 638 |
+
|
| 639 |
+
/**
|
| 640 |
+
* Checks update author term when author term does not exist for passed coauthor.
|
| 641 |
+
*
|
| 642 |
+
* @covers CoAuthors_Plus::update_author_term()
|
| 643 |
+
*/
|
| 644 |
+
public function test_update_author_term_when_author_term_not_exist() {
|
| 645 |
+
|
| 646 |
+
global $coauthors_plus;
|
| 647 |
+
|
| 648 |
+
// Checks term description.
|
| 649 |
+
$author_term = $coauthors_plus->update_author_term( $this->editor1 );
|
| 650 |
+
|
| 651 |
+
$this->assertEquals( $this->editor1->display_name . ' ' . $this->editor1->first_name . ' ' . $this->editor1->last_name . ' ' . $this->editor1->user_login . ' ' . $this->editor1->ID . ' ' . $this->editor1->user_email, $author_term->description );
|
| 652 |
+
|
| 653 |
+
// Checks term description after updating user.
|
| 654 |
+
wp_update_user( array(
|
| 655 |
+
'ID' => $this->editor1->ID,
|
| 656 |
+
'first_name' => 'editor1',
|
| 657 |
+
) );
|
| 658 |
+
|
| 659 |
+
$author_term = $coauthors_plus->update_author_term( $this->editor1 );
|
| 660 |
+
|
| 661 |
+
$this->assertEquals( $this->editor1->display_name . ' ' . $this->editor1->first_name . ' ' . $this->editor1->last_name . ' ' . $this->editor1->user_login . ' ' . $this->editor1->ID . ' ' . $this->editor1->user_email, $author_term->description );
|
| 662 |
+
|
| 663 |
+
// Backup coauthor taxonomy.
|
| 664 |
+
$taxonomy_backup = $coauthors_plus->coauthor_taxonomy;
|
| 665 |
+
|
| 666 |
+
wp_update_user( array(
|
| 667 |
+
'ID' => $this->editor1->ID,
|
| 668 |
+
'last_name' => 'editor1',
|
| 669 |
+
) );
|
| 670 |
+
|
| 671 |
+
// Checks with different taxonomy.
|
| 672 |
+
$coauthors_plus->coauthor_taxonomy = 'abcd';
|
| 673 |
+
|
| 674 |
+
$this->assertFalse( $coauthors_plus->update_author_term( $this->editor1 ) );
|
| 675 |
+
|
| 676 |
+
// Restore coauthor taxonomy from backup.
|
| 677 |
+
$coauthors_plus->coauthor_taxonomy = $taxonomy_backup;
|
| 678 |
+
}
|
| 679 |
+
}
|
|
@@ -5,6 +5,7 @@ class Test_Manage_CoAuthors extends CoAuthorsPlus_TestCase {
|
|
| 5 |
public function setUp() {
|
| 6 |
parent::setUp();
|
| 7 |
|
|
|
|
| 8 |
$this->author1 = $this->factory->user->create( array( 'role' => 'author', 'user_login' => 'author1' ) );
|
| 9 |
$this->editor1 = $this->factory->user->create( array( 'role' => 'editor', 'user_login' => 'editor2' ) );
|
| 10 |
|
|
@@ -145,4 +146,283 @@ class Test_Manage_CoAuthors extends CoAuthorsPlus_TestCase {
|
|
| 145 |
$this->assertEquals( 1, count_user_posts( $editor1->ID ) );
|
| 146 |
|
| 147 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
}
|
| 5 |
public function setUp() {
|
| 6 |
parent::setUp();
|
| 7 |
|
| 8 |
+
$this->admin1 = $this->factory->user->create( array( 'role' => 'administrator', 'user_login' => 'admin1' ) );
|
| 9 |
$this->author1 = $this->factory->user->create( array( 'role' => 'author', 'user_login' => 'author1' ) );
|
| 10 |
$this->editor1 = $this->factory->user->create( array( 'role' => 'editor', 'user_login' => 'editor2' ) );
|
| 11 |
|
| 146 |
$this->assertEquals( 1, count_user_posts( $editor1->ID ) );
|
| 147 |
|
| 148 |
}
|
| 149 |
+
|
| 150 |
+
/**
|
| 151 |
+
* Returns data as it is when post type is not allowed.
|
| 152 |
+
*
|
| 153 |
+
* @see https://github.com/Automattic/Co-Authors-Plus/issues/198
|
| 154 |
+
*
|
| 155 |
+
* @covers ::coauthors_set_post_author_field()
|
| 156 |
+
*/
|
| 157 |
+
public function test_coauthors_set_post_author_field_when_post_type_is_attachment() {
|
| 158 |
+
|
| 159 |
+
global $coauthors_plus;
|
| 160 |
+
|
| 161 |
+
$this->assertEquals( 10, has_filter( 'wp_insert_post_data', array(
|
| 162 |
+
$coauthors_plus,
|
| 163 |
+
'coauthors_set_post_author_field',
|
| 164 |
+
) ) );
|
| 165 |
+
|
| 166 |
+
$post_id = $this->factory->post->create( array(
|
| 167 |
+
'post_author' => $this->author1,
|
| 168 |
+
'post_type' => 'attachment',
|
| 169 |
+
) );
|
| 170 |
+
|
| 171 |
+
$post = get_post( $post_id );
|
| 172 |
+
|
| 173 |
+
$data = $post_array = array(
|
| 174 |
+
'ID' => $post->ID,
|
| 175 |
+
'post_type' => $post->post_type,
|
| 176 |
+
'post_author' => $post->post_author,
|
| 177 |
+
);
|
| 178 |
+
|
| 179 |
+
$new_data = $coauthors_plus->coauthors_set_post_author_field( $data, $post_array );
|
| 180 |
+
|
| 181 |
+
$this->assertEquals( $data, $new_data );
|
| 182 |
+
}
|
| 183 |
+
|
| 184 |
+
/**
|
| 185 |
+
* Compares data when coauthor is not set in the post array.
|
| 186 |
+
*
|
| 187 |
+
* @see https://github.com/Automattic/Co-Authors-Plus/issues/198
|
| 188 |
+
*
|
| 189 |
+
* @covers ::coauthors_set_post_author_field()
|
| 190 |
+
*/
|
| 191 |
+
public function test_coauthors_set_post_author_field_when_coauthor_is_not_set() {
|
| 192 |
+
|
| 193 |
+
global $coauthors_plus;
|
| 194 |
+
|
| 195 |
+
$author1_post1 = get_post( $this->author1_post1 );
|
| 196 |
+
|
| 197 |
+
$data = $post_array = array(
|
| 198 |
+
'ID' => $author1_post1->ID,
|
| 199 |
+
'post_type' => $author1_post1->post_type,
|
| 200 |
+
'post_author' => $author1_post1->post_author,
|
| 201 |
+
);
|
| 202 |
+
|
| 203 |
+
$new_data = $coauthors_plus->coauthors_set_post_author_field( $data, $post_array );
|
| 204 |
+
|
| 205 |
+
$this->assertEquals( $data, $new_data );
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
/**
|
| 209 |
+
* Compares data when coauthor is set in the post array.
|
| 210 |
+
*
|
| 211 |
+
* @see https://github.com/Automattic/Co-Authors-Plus/issues/198
|
| 212 |
+
*
|
| 213 |
+
* @covers ::coauthors_set_post_author_field()
|
| 214 |
+
*/
|
| 215 |
+
public function test_coauthors_set_post_author_field_when_coauthor_is_set() {
|
| 216 |
+
|
| 217 |
+
global $coauthors_plus;
|
| 218 |
+
|
| 219 |
+
$user_id = $this->factory->user->create( array(
|
| 220 |
+
'user_login' => 'test_admin',
|
| 221 |
+
'user_nicename' => 'test_admiи',
|
| 222 |
+
) );
|
| 223 |
+
|
| 224 |
+
$user = get_user_by( 'id', $user_id );
|
| 225 |
+
|
| 226 |
+
// Backing up global variables.
|
| 227 |
+
$post_backup = $_POST;
|
| 228 |
+
$request_backup = $_REQUEST;
|
| 229 |
+
|
| 230 |
+
$_REQUEST['coauthors-nonce'] = wp_create_nonce( 'coauthors-edit' );;
|
| 231 |
+
$_POST['coauthors'] = array(
|
| 232 |
+
$user->user_nicename,
|
| 233 |
+
);
|
| 234 |
+
|
| 235 |
+
$post_id = $this->factory->post->create( array(
|
| 236 |
+
'post_author' => $user_id,
|
| 237 |
+
) );
|
| 238 |
+
|
| 239 |
+
$post = get_post( $post_id );
|
| 240 |
+
|
| 241 |
+
$data = $post_array = array(
|
| 242 |
+
'ID' => $post->ID,
|
| 243 |
+
'post_type' => $post->post_type,
|
| 244 |
+
'post_author' => $post->post_author,
|
| 245 |
+
);
|
| 246 |
+
|
| 247 |
+
$new_data = $coauthors_plus->coauthors_set_post_author_field( $data, $post_array );
|
| 248 |
+
|
| 249 |
+
$this->assertEquals( $data, $new_data );
|
| 250 |
+
|
| 251 |
+
// Store global variables from backup.
|
| 252 |
+
$_POST = $post_backup;
|
| 253 |
+
$_REQUEST = $request_backup;
|
| 254 |
+
}
|
| 255 |
+
|
| 256 |
+
/**
|
| 257 |
+
* Compares data when coauthor is set and it is linked with main wp user.
|
| 258 |
+
*
|
| 259 |
+
* @see https://github.com/Automattic/Co-Authors-Plus/issues/198
|
| 260 |
+
*
|
| 261 |
+
* @covers ::coauthors_set_post_author_field()
|
| 262 |
+
*/
|
| 263 |
+
public function test_coauthors_set_post_author_field_when_guest_author_is_linked_with_wp_user() {
|
| 264 |
+
|
| 265 |
+
global $coauthors_plus;
|
| 266 |
+
|
| 267 |
+
$author1 = get_user_by( 'id', $this->author1 );
|
| 268 |
+
|
| 269 |
+
$author1_post1 = get_post( $this->author1_post1 );
|
| 270 |
+
|
| 271 |
+
$data = $post_array = array(
|
| 272 |
+
'ID' => $author1_post1->ID,
|
| 273 |
+
'post_type' => $author1_post1->post_type,
|
| 274 |
+
'post_author' => $author1_post1->post_author,
|
| 275 |
+
);
|
| 276 |
+
|
| 277 |
+
// Backing up global variables.
|
| 278 |
+
$post_backup = $_POST;
|
| 279 |
+
$request_backup = $_REQUEST;
|
| 280 |
+
|
| 281 |
+
$_REQUEST['coauthors-nonce'] = wp_create_nonce( 'coauthors-edit' );;
|
| 282 |
+
$_POST['coauthors'] = array(
|
| 283 |
+
$author1->user_nicename,
|
| 284 |
+
);
|
| 285 |
+
|
| 286 |
+
// Create guest author with linked account with user.
|
| 287 |
+
$coauthors_plus->guest_authors = new CoAuthors_Guest_Authors;
|
| 288 |
+
$coauthors_plus->guest_authors->create_guest_author_from_user_id( $this->author1 );
|
| 289 |
+
|
| 290 |
+
$new_data = $coauthors_plus->coauthors_set_post_author_field( $data, $post_array );
|
| 291 |
+
|
| 292 |
+
$this->assertEquals( $data, $new_data );
|
| 293 |
+
|
| 294 |
+
// Store global variables from backup.
|
| 295 |
+
$_POST = $post_backup;
|
| 296 |
+
$_REQUEST = $request_backup;
|
| 297 |
+
}
|
| 298 |
+
|
| 299 |
+
/**
|
| 300 |
+
* Compares post author when it is not set in the main data array somehow.
|
| 301 |
+
*
|
| 302 |
+
* @see https://github.com/Automattic/Co-Authors-Plus/issues/198
|
| 303 |
+
*
|
| 304 |
+
* @covers ::coauthors_set_post_author_field()
|
| 305 |
+
*/
|
| 306 |
+
public function test_coauthors_set_post_author_field_when_post_author_is_not_set() {
|
| 307 |
+
|
| 308 |
+
global $coauthors_plus;
|
| 309 |
+
|
| 310 |
+
wp_set_current_user( $this->author1 );
|
| 311 |
+
|
| 312 |
+
// Backing up global variables.
|
| 313 |
+
$post_backup = $_POST;
|
| 314 |
+
$request_backup = $_REQUEST;
|
| 315 |
+
|
| 316 |
+
$_REQUEST = $_POST = array();
|
| 317 |
+
|
| 318 |
+
$author1_post1 = get_post( $this->author1_post1 );
|
| 319 |
+
|
| 320 |
+
$data = $post_array = array(
|
| 321 |
+
'ID' => $author1_post1->ID,
|
| 322 |
+
'post_type' => $author1_post1->post_type,
|
| 323 |
+
'post_author' => $author1_post1->post_author,
|
| 324 |
+
);
|
| 325 |
+
|
| 326 |
+
unset( $data['post_author'] );
|
| 327 |
+
|
| 328 |
+
$new_data = $coauthors_plus->coauthors_set_post_author_field( $data, $post_array );
|
| 329 |
+
|
| 330 |
+
$this->assertEquals( $this->author1, $new_data['post_author'] );
|
| 331 |
+
|
| 332 |
+
// Store global variables from backup.
|
| 333 |
+
$_POST = $post_backup;
|
| 334 |
+
$_REQUEST = $request_backup;
|
| 335 |
+
}
|
| 336 |
+
|
| 337 |
+
/**
|
| 338 |
+
* Bypass coauthors_update_post() when post type is not allowed.
|
| 339 |
+
*
|
| 340 |
+
* @see https://github.com/Automattic/Co-Authors-Plus/issues/198
|
| 341 |
+
*
|
| 342 |
+
* @covers ::coauthors_update_post()
|
| 343 |
+
*/
|
| 344 |
+
public function test_coauthors_update_post_when_post_type_is_attachment() {
|
| 345 |
+
|
| 346 |
+
global $coauthors_plus;
|
| 347 |
+
|
| 348 |
+
$this->assertEquals( 10, has_action( 'save_post', array(
|
| 349 |
+
$coauthors_plus,
|
| 350 |
+
'coauthors_update_post',
|
| 351 |
+
) ) );
|
| 352 |
+
|
| 353 |
+
$post_id = $this->factory->post->create( array(
|
| 354 |
+
'post_author' => $this->author1,
|
| 355 |
+
'post_type' => 'attachment',
|
| 356 |
+
) );
|
| 357 |
+
|
| 358 |
+
$post = get_post( $post_id );
|
| 359 |
+
$return = $coauthors_plus->coauthors_update_post( $post_id, $post );
|
| 360 |
+
|
| 361 |
+
$this->assertNull( $return );
|
| 362 |
+
}
|
| 363 |
+
|
| 364 |
+
/**
|
| 365 |
+
* Checks coauthors when current user can set authors.
|
| 366 |
+
*
|
| 367 |
+
* @see https://github.com/Automattic/Co-Authors-Plus/issues/198
|
| 368 |
+
*
|
| 369 |
+
* @covers ::coauthors_update_post()
|
| 370 |
+
*/
|
| 371 |
+
public function test_coauthors_update_post_when_current_user_can_set_authors() {
|
| 372 |
+
|
| 373 |
+
global $coauthors_plus;
|
| 374 |
+
|
| 375 |
+
wp_set_current_user( $this->admin1 );
|
| 376 |
+
|
| 377 |
+
$admin1 = get_user_by( 'id', $this->admin1 );
|
| 378 |
+
$author1 = get_user_by( 'id', $this->author1 );
|
| 379 |
+
|
| 380 |
+
$post_id = $this->factory->post->create( array(
|
| 381 |
+
'post_author' => $this->admin1,
|
| 382 |
+
) );
|
| 383 |
+
|
| 384 |
+
$post = get_post( $post_id );
|
| 385 |
+
|
| 386 |
+
// Backing up global variables.
|
| 387 |
+
$post_backup = $_POST;
|
| 388 |
+
$request_backup = $_REQUEST;
|
| 389 |
+
|
| 390 |
+
$_POST['coauthors-nonce'] = $_REQUEST['coauthors-nonce'] = wp_create_nonce( 'coauthors-edit' );
|
| 391 |
+
$_POST['coauthors'] = array(
|
| 392 |
+
$admin1->user_nicename,
|
| 393 |
+
$author1->user_nicename,
|
| 394 |
+
);
|
| 395 |
+
|
| 396 |
+
$coauthors_plus->coauthors_update_post( $post_id, $post );
|
| 397 |
+
|
| 398 |
+
$coauthors = get_coauthors( $post_id );
|
| 399 |
+
|
| 400 |
+
$this->assertEquals( array( $this->admin1, $this->author1 ), wp_list_pluck( $coauthors, 'ID' ) );
|
| 401 |
+
|
| 402 |
+
// Store global variables from backup.
|
| 403 |
+
$_POST = $post_backup;
|
| 404 |
+
$_REQUEST = $request_backup;
|
| 405 |
+
}
|
| 406 |
+
|
| 407 |
+
/**
|
| 408 |
+
* Coauthors should be empty if post does not have any author terms
|
| 409 |
+
* and current user can not set authors for the post.
|
| 410 |
+
*
|
| 411 |
+
* @see https://github.com/Automattic/Co-Authors-Plus/issues/198
|
| 412 |
+
*
|
| 413 |
+
* @covers ::coauthors_update_post()
|
| 414 |
+
*/
|
| 415 |
+
public function test_coauthors_update_post_when_post_has_not_author_terms() {
|
| 416 |
+
|
| 417 |
+
global $coauthors_plus;
|
| 418 |
+
|
| 419 |
+
$post_id = $this->factory->post->create();
|
| 420 |
+
$post = get_post( $post_id );
|
| 421 |
+
|
| 422 |
+
$coauthors_plus->coauthors_update_post( $post_id, $post );
|
| 423 |
+
|
| 424 |
+
$coauthors = get_coauthors( $post_id );
|
| 425 |
+
|
| 426 |
+
$this->assertEmpty( $coauthors );
|
| 427 |
+
}
|
| 428 |
}
|
|
@@ -0,0 +1,1068 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
|
| 3 |
+
class Test_Template_Tags extends CoAuthorsPlus_TestCase {
|
| 4 |
+
|
| 5 |
+
public function setUp() {
|
| 6 |
+
|
| 7 |
+
parent::setUp();
|
| 8 |
+
|
| 9 |
+
/**
|
| 10 |
+
* When 'coauthors_auto_apply_template_tags' is set to true,
|
| 11 |
+
* we need CoAuthors_Template_Filters object to check 'the_author' filter.
|
| 12 |
+
*/
|
| 13 |
+
global $coauthors_plus_template_filters;
|
| 14 |
+
$coauthors_plus_template_filters = new CoAuthors_Template_Filters;
|
| 15 |
+
|
| 16 |
+
$this->author1 = $this->factory->user->create_and_get( array( 'role' => 'author', 'user_login' => 'author1' ) );
|
| 17 |
+
$this->editor1 = $this->factory->user->create_and_get( array( 'role' => 'editor', 'user_login' => 'editor1' ) );
|
| 18 |
+
|
| 19 |
+
$this->post = $this->factory->post->create_and_get( array(
|
| 20 |
+
'post_author' => $this->author1->ID,
|
| 21 |
+
'post_status' => 'publish',
|
| 22 |
+
'post_content' => rand_str(),
|
| 23 |
+
'post_title' => rand_str(),
|
| 24 |
+
'post_type' => 'post',
|
| 25 |
+
) );
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
/**
|
| 29 |
+
* Tests for co-authors display names, with links to their posts.
|
| 30 |
+
*
|
| 31 |
+
* @see https://github.com/Automattic/Co-Authors-Plus/issues/279
|
| 32 |
+
*
|
| 33 |
+
* @covers ::coauthors_posts_links()
|
| 34 |
+
*/
|
| 35 |
+
public function test_coauthors_posts_links() {
|
| 36 |
+
|
| 37 |
+
global $coauthors_plus, $coauthors_plus_template_filters;
|
| 38 |
+
|
| 39 |
+
// Backing up global post.
|
| 40 |
+
$post_backup = $GLOBALS['post'];
|
| 41 |
+
|
| 42 |
+
$GLOBALS['post'] = $this->post;
|
| 43 |
+
|
| 44 |
+
// Checks for single post author.
|
| 45 |
+
$single_cpl = coauthors_posts_links( null, null, null, null, false );
|
| 46 |
+
|
| 47 |
+
$this->assertContains( 'href="' . get_author_posts_url( $this->author1->ID, $this->author1->user_nicename ) . '"', $single_cpl, 'Author link not found.' );
|
| 48 |
+
$this->assertContains( $this->author1->display_name, $single_cpl, 'Author name not found.' );
|
| 49 |
+
|
| 50 |
+
// Checks for multiple post author.
|
| 51 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 52 |
+
|
| 53 |
+
$multiple_cpl = coauthors_posts_links( null, null, null, null, false );
|
| 54 |
+
|
| 55 |
+
$this->assertContains( 'href="' . get_author_posts_url( $this->author1->ID, $this->author1->user_nicename ) . '"', $multiple_cpl, 'Main author link not found.' );
|
| 56 |
+
$this->assertContains( $this->author1->display_name, $multiple_cpl, 'Main author name not found.' );
|
| 57 |
+
|
| 58 |
+
// Here we are checking author name should not be more then one time.
|
| 59 |
+
// Asserting ">{$this->author1->display_name}<" because "$this->author1->display_name" can be multiple times like in href, title, etc.
|
| 60 |
+
$this->assertEquals( 1, substr_count( $multiple_cpl, ">{$this->author1->display_name}<" ) );
|
| 61 |
+
$this->assertContains( ' and ', $multiple_cpl, 'Coauthors name separator is not matched.' );
|
| 62 |
+
$this->assertContains( 'href="' . get_author_posts_url( $this->editor1->ID, $this->editor1->user_nicename ) . '"', $multiple_cpl, 'Coauthor link not found.' );
|
| 63 |
+
$this->assertContains( $this->editor1->display_name, $multiple_cpl, 'Coauthor name not found.' );
|
| 64 |
+
|
| 65 |
+
// Here we are checking editor name should not be more then one time.
|
| 66 |
+
// Asserting ">{$this->editor1->display_name}<" because "$this->editor1->display_name" can be multiple times like in href, title, etc.
|
| 67 |
+
$this->assertEquals( 1, substr_count( $multiple_cpl, ">{$this->editor1->display_name}<" ) );
|
| 68 |
+
|
| 69 |
+
$multiple_cpl = coauthors_links( null, ' or ', null, null, false );
|
| 70 |
+
|
| 71 |
+
$this->assertContains( ' or ', $multiple_cpl, 'Coauthors name separator is not matched.' );
|
| 72 |
+
|
| 73 |
+
$this->assertEquals( 10, has_filter( 'the_author', array(
|
| 74 |
+
$coauthors_plus_template_filters,
|
| 75 |
+
'filter_the_author',
|
| 76 |
+
) ) );
|
| 77 |
+
|
| 78 |
+
// Restore backed up post to global.
|
| 79 |
+
$GLOBALS['post'] = $post_backup;
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
/**
|
| 83 |
+
* Tests for co-authors display names.
|
| 84 |
+
*
|
| 85 |
+
* @see https://github.com/Automattic/Co-Authors-Plus/issues/279
|
| 86 |
+
*
|
| 87 |
+
* @covers ::coauthors_links()
|
| 88 |
+
*/
|
| 89 |
+
public function test_coauthors_links() {
|
| 90 |
+
|
| 91 |
+
global $coauthors_plus, $coauthors_plus_template_filters;
|
| 92 |
+
|
| 93 |
+
// Backing up global post.
|
| 94 |
+
$post_backup = $GLOBALS['post'];
|
| 95 |
+
|
| 96 |
+
$GLOBALS['post'] = $this->post;
|
| 97 |
+
|
| 98 |
+
// Checks for single post author.
|
| 99 |
+
$single_cpl = coauthors_links( null, null, null, null, false );
|
| 100 |
+
|
| 101 |
+
$this->assertEquals( $this->author1->display_name, $single_cpl, 'Author name not found.' );
|
| 102 |
+
|
| 103 |
+
// Checks for multiple post author.
|
| 104 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 105 |
+
|
| 106 |
+
$multiple_cpl = coauthors_links( null, null, null, null, false );
|
| 107 |
+
|
| 108 |
+
$this->assertContains( $this->author1->display_name, $multiple_cpl, 'Main author name not found.' );
|
| 109 |
+
$this->assertEquals( 1, substr_count( $multiple_cpl, $this->author1->display_name ) );
|
| 110 |
+
$this->assertContains( ' and ', $multiple_cpl, 'Coauthors name separator is not matched.' );
|
| 111 |
+
$this->assertContains( $this->editor1->display_name, $multiple_cpl, 'Coauthor name not found.' );
|
| 112 |
+
$this->assertEquals( 1, substr_count( $multiple_cpl, $this->editor1->display_name ) );
|
| 113 |
+
|
| 114 |
+
$multiple_cpl = coauthors_links( null, ' or ', null, null, false );
|
| 115 |
+
|
| 116 |
+
$this->assertContains( ' or ', $multiple_cpl, 'Coauthors name separator is not matched.' );
|
| 117 |
+
|
| 118 |
+
$this->assertEquals( 10, has_filter( 'the_author', array(
|
| 119 |
+
$coauthors_plus_template_filters,
|
| 120 |
+
'filter_the_author',
|
| 121 |
+
) ) );
|
| 122 |
+
|
| 123 |
+
// Restore backed up post to global.
|
| 124 |
+
$GLOBALS['post'] = $post_backup;
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
/**
|
| 128 |
+
* Checks coauthors when post not exist.
|
| 129 |
+
*
|
| 130 |
+
* @covers ::get_coauthors()
|
| 131 |
+
*/
|
| 132 |
+
public function test_get_coauthors_when_post_not_exists() {
|
| 133 |
+
|
| 134 |
+
$this->assertEmpty( get_coauthors() );
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
/**
|
| 138 |
+
* Checks coauthors when post exist (not global).
|
| 139 |
+
*
|
| 140 |
+
* @covers ::get_coauthors()
|
| 141 |
+
*/
|
| 142 |
+
public function test_get_coauthors_when_post_exists() {
|
| 143 |
+
|
| 144 |
+
global $coauthors_plus;
|
| 145 |
+
|
| 146 |
+
// Compare single author.
|
| 147 |
+
$this->assertEquals( array( $this->author1->ID ), wp_list_pluck( get_coauthors( $this->post->ID ), 'ID' ) );
|
| 148 |
+
|
| 149 |
+
// Compare multiple authors.
|
| 150 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 151 |
+
$this->assertEquals( array(
|
| 152 |
+
$this->author1->ID,
|
| 153 |
+
$this->editor1->ID,
|
| 154 |
+
), wp_list_pluck( get_coauthors( $this->post->ID ), 'ID' ) );
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
/**
|
| 158 |
+
* Checks coauthors when terms for post not exist.
|
| 159 |
+
*
|
| 160 |
+
* @covers ::get_coauthors()
|
| 161 |
+
*/
|
| 162 |
+
public function test_get_coauthors_when_terms_for_post_not_exists() {
|
| 163 |
+
|
| 164 |
+
$post_id = $this->factory->post->create();
|
| 165 |
+
$this->assertEmpty( get_coauthors( $post_id ) );
|
| 166 |
+
}
|
| 167 |
+
|
| 168 |
+
/**
|
| 169 |
+
* Checks coauthors when post not exist.
|
| 170 |
+
*
|
| 171 |
+
* @covers ::get_coauthors()
|
| 172 |
+
*/
|
| 173 |
+
public function test_get_coauthors_when_global_post_exists() {
|
| 174 |
+
|
| 175 |
+
global $post;
|
| 176 |
+
|
| 177 |
+
// Backing up global post.
|
| 178 |
+
$post_backup = $post;
|
| 179 |
+
|
| 180 |
+
$post = $this->factory->post->create_and_get();
|
| 181 |
+
|
| 182 |
+
$this->assertEmpty( get_coauthors() );
|
| 183 |
+
|
| 184 |
+
$user_id = $this->factory->user->create();
|
| 185 |
+
$post = $this->factory->post->create_and_get( array(
|
| 186 |
+
'post_author' => $user_id,
|
| 187 |
+
) );
|
| 188 |
+
|
| 189 |
+
$this->assertEquals( array( $user_id ), wp_list_pluck( get_coauthors(), 'ID' ) );
|
| 190 |
+
|
| 191 |
+
// Restore global post from backup.
|
| 192 |
+
$post = $post_backup;
|
| 193 |
+
}
|
| 194 |
+
|
| 195 |
+
/**
|
| 196 |
+
* Checks coauthors order.
|
| 197 |
+
*
|
| 198 |
+
* @covers ::get_coauthors()
|
| 199 |
+
*/
|
| 200 |
+
public function test_coauthors_order() {
|
| 201 |
+
|
| 202 |
+
global $coauthors_plus;
|
| 203 |
+
|
| 204 |
+
$post_id = $this->factory->post->create();
|
| 205 |
+
|
| 206 |
+
// Checks when no author exist.
|
| 207 |
+
$this->assertEmpty( get_coauthors( $post_id ) );
|
| 208 |
+
|
| 209 |
+
// Checks coauthors order.
|
| 210 |
+
$coauthors_plus->add_coauthors( $post_id, array( $this->author1->user_login ), true );
|
| 211 |
+
$coauthors_plus->add_coauthors( $post_id, array( $this->editor1->user_login ), true );
|
| 212 |
+
|
| 213 |
+
$expected = array( $this->author1->user_login, $this->editor1->user_login );
|
| 214 |
+
|
| 215 |
+
$this->assertEquals( $expected, wp_list_pluck( get_coauthors( $post_id ), 'user_login' ) );
|
| 216 |
+
|
| 217 |
+
// Checks coauthors order after modifying.
|
| 218 |
+
$post_id = $this->factory->post->create();
|
| 219 |
+
|
| 220 |
+
$coauthors_plus->add_coauthors( $post_id, array( $this->editor1->user_login ), true );
|
| 221 |
+
$coauthors_plus->add_coauthors( $post_id, array( $this->author1->user_login ), true );
|
| 222 |
+
|
| 223 |
+
$expected = array( $this->editor1->user_login, $this->author1->user_login );
|
| 224 |
+
|
| 225 |
+
$this->assertEquals( $expected, wp_list_pluck( get_coauthors( $post_id ), 'user_login' ) );
|
| 226 |
+
}
|
| 227 |
+
|
| 228 |
+
/**
|
| 229 |
+
* Checks whether user is a coauthor of the post when user or post not exists.
|
| 230 |
+
*
|
| 231 |
+
* @covers ::is_coauthor_for_post()
|
| 232 |
+
*/
|
| 233 |
+
public function test_is_coauthor_for_post_when_user_or_post_not_exists() {
|
| 234 |
+
|
| 235 |
+
global $post;
|
| 236 |
+
|
| 237 |
+
// Backing up global post.
|
| 238 |
+
$post_backup = $post;
|
| 239 |
+
|
| 240 |
+
$this->assertFalse( is_coauthor_for_post( '' ) );
|
| 241 |
+
$this->assertFalse( is_coauthor_for_post( '', $this->post->ID ) );
|
| 242 |
+
$this->assertFalse( is_coauthor_for_post( $this->author1->ID ) );
|
| 243 |
+
|
| 244 |
+
$post = $this->post;
|
| 245 |
+
|
| 246 |
+
$this->assertFalse( is_coauthor_for_post( '' ) );
|
| 247 |
+
|
| 248 |
+
// Restore global post from backup.
|
| 249 |
+
$post = $post_backup;
|
| 250 |
+
}
|
| 251 |
+
|
| 252 |
+
/**
|
| 253 |
+
* Checks whether user is a coauthor of the post when user is not expected as ID,
|
| 254 |
+
* or user_login is not set in user object.
|
| 255 |
+
*
|
| 256 |
+
* @covers ::is_coauthor_for_post()
|
| 257 |
+
*/
|
| 258 |
+
public function test_is_coauthor_for_post_when_user_not_numeric_or_user_login_not_set() {
|
| 259 |
+
|
| 260 |
+
$this->assertFalse( is_coauthor_for_post( 'test' ) );
|
| 261 |
+
}
|
| 262 |
+
|
| 263 |
+
/**
|
| 264 |
+
* Checks whether user is a coauthor of the post when user is set in either way,
|
| 265 |
+
* as user_id or user object but he/she is not coauthor of the post.
|
| 266 |
+
*
|
| 267 |
+
* @covers ::is_coauthor_for_post()
|
| 268 |
+
*/
|
| 269 |
+
public function test_is_coauthor_for_post_when_user_numeric_or_user_login_set_but_not_coauthor() {
|
| 270 |
+
|
| 271 |
+
$this->assertFalse( is_coauthor_for_post( $this->editor1->ID, $this->post->ID ) );
|
| 272 |
+
$this->assertFalse( is_coauthor_for_post( $this->editor1, $this->post->ID ) );
|
| 273 |
+
}
|
| 274 |
+
|
| 275 |
+
/**
|
| 276 |
+
* Checks whether user is a coauthor of the post.
|
| 277 |
+
*
|
| 278 |
+
* @covers ::is_coauthor_for_post()
|
| 279 |
+
*/
|
| 280 |
+
public function test_is_coauthor_for_post_when_user_is_coauthor() {
|
| 281 |
+
|
| 282 |
+
global $post, $coauthors_plus;
|
| 283 |
+
|
| 284 |
+
// Backing up global post.
|
| 285 |
+
$post_backup = $post;
|
| 286 |
+
|
| 287 |
+
// Checking with specific post and user_id as well ass user object.
|
| 288 |
+
$this->assertTrue( is_coauthor_for_post( $this->author1->ID, $this->post->ID ) );
|
| 289 |
+
$this->assertTrue( is_coauthor_for_post( $this->author1, $this->post->ID ) );
|
| 290 |
+
|
| 291 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 292 |
+
|
| 293 |
+
$this->assertTrue( is_coauthor_for_post( $this->editor1->ID, $this->post->ID ) );
|
| 294 |
+
$this->assertTrue( is_coauthor_for_post( $this->editor1, $this->post->ID ) );
|
| 295 |
+
|
| 296 |
+
// Now checking with global post and user_id as well ass user object.
|
| 297 |
+
$post = $this->post;
|
| 298 |
+
|
| 299 |
+
$this->assertTrue( is_coauthor_for_post( $this->author1->ID ) );
|
| 300 |
+
$this->assertTrue( is_coauthor_for_post( $this->author1 ) );
|
| 301 |
+
|
| 302 |
+
$this->assertTrue( is_coauthor_for_post( $this->editor1->ID ) );
|
| 303 |
+
$this->assertTrue( is_coauthor_for_post( $this->editor1 ) );
|
| 304 |
+
|
| 305 |
+
// Restore global post from backup.
|
| 306 |
+
$post = $post_backup;
|
| 307 |
+
}
|
| 308 |
+
|
| 309 |
+
/**
|
| 310 |
+
* Tests for co-authors display names, without links to their posts.
|
| 311 |
+
*
|
| 312 |
+
* @covers ::coauthors()
|
| 313 |
+
* @covers ::coauthors__echo()
|
| 314 |
+
**/
|
| 315 |
+
public function test_coauthors() {
|
| 316 |
+
|
| 317 |
+
global $post, $coauthors_plus;
|
| 318 |
+
|
| 319 |
+
// Backing up global post.
|
| 320 |
+
$post_backup = $post;
|
| 321 |
+
|
| 322 |
+
$post = $this->post;
|
| 323 |
+
|
| 324 |
+
// Checks for single post author.
|
| 325 |
+
$coauthors = coauthors( null, null, null, null, false );
|
| 326 |
+
|
| 327 |
+
$this->assertEquals( $this->author1->display_name, $coauthors );
|
| 328 |
+
|
| 329 |
+
$coauthors = coauthors( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 330 |
+
|
| 331 |
+
$this->assertEquals( '<span>' . $this->author1->display_name . '</span>', $coauthors );
|
| 332 |
+
|
| 333 |
+
// Checks for multiple post author.
|
| 334 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 335 |
+
|
| 336 |
+
$coauthors = coauthors( null, null, null, null, false );
|
| 337 |
+
|
| 338 |
+
$this->assertEquals( $this->author1->display_name . ' and ' . $this->editor1->display_name, $coauthors );
|
| 339 |
+
|
| 340 |
+
$coauthors = coauthors( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 341 |
+
|
| 342 |
+
$this->assertEquals( '<span>' . $this->author1->display_name . '</span><span>' . $this->editor1->display_name . '</span>', $coauthors );
|
| 343 |
+
|
| 344 |
+
// Restore global post from backup.
|
| 345 |
+
$post = $post_backup;
|
| 346 |
+
}
|
| 347 |
+
|
| 348 |
+
/**
|
| 349 |
+
* Checks single co-author linked to their post archive.
|
| 350 |
+
*
|
| 351 |
+
* @covers ::coauthors_posts_links_single()
|
| 352 |
+
*/
|
| 353 |
+
public function test_coauthors_posts_links_single() {
|
| 354 |
+
|
| 355 |
+
global $post;
|
| 356 |
+
|
| 357 |
+
// Backing up global post.
|
| 358 |
+
$post_backup = $post;
|
| 359 |
+
|
| 360 |
+
$post = $this->post;
|
| 361 |
+
|
| 362 |
+
$author_link = coauthors_posts_links_single( $this->author1 );
|
| 363 |
+
|
| 364 |
+
$this->assertContains( 'href="' . get_author_posts_url( $this->author1->ID, $this->author1->user_nicename ) . '"', $author_link, 'Author link not found.' );
|
| 365 |
+
$this->assertContains( $this->author1->display_name, $author_link, 'Author name not found.' );
|
| 366 |
+
|
| 367 |
+
// Here we are checking author name should not be more then one time.
|
| 368 |
+
// Asserting ">{$this->author1->display_name}<" because "$this->author1->display_name" can be multiple times like in href, title, etc.
|
| 369 |
+
$this->assertEquals( 1, substr_count( $author_link, ">{$this->author1->display_name}<" ) );
|
| 370 |
+
|
| 371 |
+
// Restore global post from backup.
|
| 372 |
+
$post = $post_backup;
|
| 373 |
+
}
|
| 374 |
+
|
| 375 |
+
/**
|
| 376 |
+
* Checks co-authors first names, without links to their posts.
|
| 377 |
+
*
|
| 378 |
+
* @covers ::coauthors_firstnames()
|
| 379 |
+
* @covers ::coauthors__echo()
|
| 380 |
+
*/
|
| 381 |
+
public function test_coauthors_firstnames() {
|
| 382 |
+
|
| 383 |
+
global $post, $coauthors_plus;
|
| 384 |
+
|
| 385 |
+
// Backing up global post.
|
| 386 |
+
$post_backup = $post;
|
| 387 |
+
|
| 388 |
+
$post = $this->post;
|
| 389 |
+
|
| 390 |
+
// Checking when first name is not set for user, so it should match with user_login.
|
| 391 |
+
$first_names = coauthors_firstnames( null, null, null, null, false );
|
| 392 |
+
|
| 393 |
+
$this->assertEquals( $this->author1->user_login, $first_names );
|
| 394 |
+
|
| 395 |
+
$first_names = coauthors_firstnames( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 396 |
+
|
| 397 |
+
$this->assertEquals( '<span>' . $this->author1->user_login . '</span>', $first_names );
|
| 398 |
+
|
| 399 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 400 |
+
|
| 401 |
+
$first_names = coauthors_firstnames( null, null, null, null, false );
|
| 402 |
+
|
| 403 |
+
$this->assertEquals( $this->author1->user_login . ' and ' . $this->editor1->user_login, $first_names );
|
| 404 |
+
|
| 405 |
+
$first_names = coauthors_firstnames( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 406 |
+
|
| 407 |
+
$this->assertEquals( '<span>' . $this->author1->user_login . '</span><span>' . $this->editor1->user_login . '</span>', $first_names );
|
| 408 |
+
|
| 409 |
+
// Checking when first name is set for user.
|
| 410 |
+
$first_name = 'Test';
|
| 411 |
+
$user_id = $this->factory->user->create( array(
|
| 412 |
+
'first_name' => $first_name,
|
| 413 |
+
) );
|
| 414 |
+
$post = $this->factory->post->create_and_get( array(
|
| 415 |
+
'post_author' => $user_id,
|
| 416 |
+
) );
|
| 417 |
+
|
| 418 |
+
$first_names = coauthors_firstnames( null, null, null, null, false );
|
| 419 |
+
|
| 420 |
+
$this->assertEquals( $first_name, $first_names );
|
| 421 |
+
|
| 422 |
+
// Restore global post from backup.
|
| 423 |
+
$post = $post_backup;
|
| 424 |
+
}
|
| 425 |
+
|
| 426 |
+
/**
|
| 427 |
+
* Checks co-authors last names, without links to their posts.
|
| 428 |
+
*
|
| 429 |
+
* @covers ::coauthors_lastnames()
|
| 430 |
+
* @covers ::coauthors__echo()
|
| 431 |
+
*/
|
| 432 |
+
public function test_coauthors_lastnames() {
|
| 433 |
+
|
| 434 |
+
global $post, $coauthors_plus;
|
| 435 |
+
|
| 436 |
+
// Backing up global post.
|
| 437 |
+
$post_backup = $post;
|
| 438 |
+
|
| 439 |
+
$post = $this->post;
|
| 440 |
+
|
| 441 |
+
// Checking when last name is not set for user, so it should match with user_login.
|
| 442 |
+
$last_names = coauthors_lastnames( null, null, null, null, false );
|
| 443 |
+
|
| 444 |
+
$this->assertEquals( $this->author1->user_login, $last_names );
|
| 445 |
+
|
| 446 |
+
$last_names = coauthors_lastnames( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 447 |
+
|
| 448 |
+
$this->assertEquals( '<span>' . $this->author1->user_login . '</span>', $last_names );
|
| 449 |
+
|
| 450 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 451 |
+
|
| 452 |
+
$last_names = coauthors_lastnames( null, null, null, null, false );
|
| 453 |
+
|
| 454 |
+
$this->assertEquals( $this->author1->user_login . ' and ' . $this->editor1->user_login, $last_names );
|
| 455 |
+
|
| 456 |
+
$last_names = coauthors_lastnames( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 457 |
+
|
| 458 |
+
$this->assertEquals( '<span>' . $this->author1->user_login . '</span><span>' . $this->editor1->user_login . '</span>', $last_names );
|
| 459 |
+
|
| 460 |
+
// Checking when last name is set for user.
|
| 461 |
+
$last_name = 'Test';
|
| 462 |
+
$user_id = $this->factory->user->create( array(
|
| 463 |
+
'last_name' => $last_name,
|
| 464 |
+
) );
|
| 465 |
+
$post = $this->factory->post->create_and_get( array(
|
| 466 |
+
'post_author' => $user_id,
|
| 467 |
+
) );
|
| 468 |
+
|
| 469 |
+
$last_names = coauthors_lastnames( null, null, null, null, false );
|
| 470 |
+
|
| 471 |
+
$this->assertEquals( $last_name, $last_names );
|
| 472 |
+
|
| 473 |
+
// Restore global post from backup.
|
| 474 |
+
$post = $post_backup;
|
| 475 |
+
}
|
| 476 |
+
|
| 477 |
+
/**
|
| 478 |
+
* Checks co-authors nicknames, without links to their posts.
|
| 479 |
+
*
|
| 480 |
+
* @covers ::coauthors_nicknames()
|
| 481 |
+
* @covers ::coauthors__echo()
|
| 482 |
+
*/
|
| 483 |
+
public function test_coauthors_nicknames() {
|
| 484 |
+
|
| 485 |
+
global $post, $coauthors_plus;
|
| 486 |
+
|
| 487 |
+
// Backing up global post.
|
| 488 |
+
$post_backup = $post;
|
| 489 |
+
|
| 490 |
+
$post = $this->post;
|
| 491 |
+
|
| 492 |
+
// Checking when nickname is not set for user, so it should match with user_login.
|
| 493 |
+
$nick_names = coauthors_nicknames( null, null, null, null, false );
|
| 494 |
+
|
| 495 |
+
$this->assertEquals( $this->author1->user_login, $nick_names );
|
| 496 |
+
|
| 497 |
+
$nick_names = coauthors_nicknames( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 498 |
+
|
| 499 |
+
$this->assertEquals( '<span>' . $this->author1->user_login . '</span>', $nick_names );
|
| 500 |
+
|
| 501 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 502 |
+
|
| 503 |
+
$nick_names = coauthors_nicknames( null, null, null, null, false );
|
| 504 |
+
|
| 505 |
+
$this->assertEquals( $this->author1->user_login . ' and ' . $this->editor1->user_login, $nick_names );
|
| 506 |
+
|
| 507 |
+
$nick_names = coauthors_nicknames( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 508 |
+
|
| 509 |
+
$this->assertEquals( '<span>' . $this->author1->user_login . '</span><span>' . $this->editor1->user_login . '</span>', $nick_names );
|
| 510 |
+
|
| 511 |
+
// Checking when nickname is set for user.
|
| 512 |
+
$nick_name = 'Test';
|
| 513 |
+
$user_id = $this->factory->user->create( array(
|
| 514 |
+
'nickname' => $nick_name,
|
| 515 |
+
) );
|
| 516 |
+
$post = $this->factory->post->create_and_get( array(
|
| 517 |
+
'post_author' => $user_id,
|
| 518 |
+
) );
|
| 519 |
+
|
| 520 |
+
$nick_names = coauthors_nicknames( null, null, null, null, false );
|
| 521 |
+
|
| 522 |
+
$this->assertEquals( $nick_name, $nick_names );
|
| 523 |
+
|
| 524 |
+
// Restore global post from backup.
|
| 525 |
+
$post = $post_backup;
|
| 526 |
+
}
|
| 527 |
+
|
| 528 |
+
/**
|
| 529 |
+
* Checks co-authors email addresses.
|
| 530 |
+
*
|
| 531 |
+
* @covers ::coauthors_emails()
|
| 532 |
+
* @covers ::coauthors__echo()
|
| 533 |
+
*/
|
| 534 |
+
public function test_coauthors_emails() {
|
| 535 |
+
|
| 536 |
+
global $post, $coauthors_plus;
|
| 537 |
+
|
| 538 |
+
// Backing up global post.
|
| 539 |
+
$post_backup = $post;
|
| 540 |
+
|
| 541 |
+
$post = $this->post;
|
| 542 |
+
|
| 543 |
+
$emails = coauthors_emails( null, null, null, null, false );
|
| 544 |
+
|
| 545 |
+
$this->assertEquals( $this->author1->user_email, $emails );
|
| 546 |
+
|
| 547 |
+
$emails = coauthors_emails( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 548 |
+
|
| 549 |
+
$this->assertEquals( '<span>' . $this->author1->user_email . '</span>', $emails );
|
| 550 |
+
|
| 551 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 552 |
+
|
| 553 |
+
$emails = coauthors_emails( null, null, null, null, false );
|
| 554 |
+
|
| 555 |
+
$this->assertEquals( $this->author1->user_email . ' and ' . $this->editor1->user_email, $emails );
|
| 556 |
+
|
| 557 |
+
$emails = coauthors_emails( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 558 |
+
|
| 559 |
+
$this->assertEquals( '<span>' . $this->author1->user_email . '</span><span>' . $this->editor1->user_email . '</span>', $emails );
|
| 560 |
+
|
| 561 |
+
$email = 'test@example.org';
|
| 562 |
+
$user_id = $this->factory->user->create( array(
|
| 563 |
+
'user_email' => $email,
|
| 564 |
+
) );
|
| 565 |
+
$post = $this->factory->post->create_and_get( array(
|
| 566 |
+
'post_author' => $user_id,
|
| 567 |
+
) );
|
| 568 |
+
|
| 569 |
+
$emails = coauthors_emails( null, null, null, null, false );
|
| 570 |
+
|
| 571 |
+
$this->assertEquals( $email, $emails );
|
| 572 |
+
|
| 573 |
+
// Restore global post from backup.
|
| 574 |
+
$post = $post_backup;
|
| 575 |
+
}
|
| 576 |
+
|
| 577 |
+
/**
|
| 578 |
+
* Checks single co-author if he/she is a guest author.
|
| 579 |
+
*
|
| 580 |
+
* @covers ::coauthors_links_single()
|
| 581 |
+
*/
|
| 582 |
+
public function test_coauthors_links_single_when_guest_author() {
|
| 583 |
+
|
| 584 |
+
global $post, $authordata;
|
| 585 |
+
|
| 586 |
+
// Backing up global post.
|
| 587 |
+
$post_backup = $post;
|
| 588 |
+
|
| 589 |
+
$post = $this->post;
|
| 590 |
+
|
| 591 |
+
// Backing up global author data.
|
| 592 |
+
$authordata_backup = $authordata;
|
| 593 |
+
|
| 594 |
+
$this->author1->type = 'guest-author';
|
| 595 |
+
|
| 596 |
+
$this->assertNull( coauthors_links_single( $this->author1 ) );
|
| 597 |
+
|
| 598 |
+
update_user_meta( $this->author1->ID, 'website', 'example.org' );
|
| 599 |
+
|
| 600 |
+
$this->assertNull( coauthors_links_single( $this->author1 ) );
|
| 601 |
+
|
| 602 |
+
$authordata = $this->author1;
|
| 603 |
+
$author_link = coauthors_links_single( $this->author1 );
|
| 604 |
+
|
| 605 |
+
$this->assertContains( get_the_author_meta( 'website' ), $author_link, 'Author link not found.' );
|
| 606 |
+
$this->assertContains( get_the_author(), $author_link, 'Author name not found.' );
|
| 607 |
+
|
| 608 |
+
// Here we are checking author name should not be more then one time.
|
| 609 |
+
// Asserting ">get_the_author()<" because "get_the_author()" can be multiple times like in href, title, etc.
|
| 610 |
+
$this->assertEquals( 1, substr_count( $author_link, '>' . get_the_author() . '<' ) );
|
| 611 |
+
|
| 612 |
+
// Restore global author data from backup.
|
| 613 |
+
$authordata = $authordata_backup;
|
| 614 |
+
|
| 615 |
+
// Restore global post from backup.
|
| 616 |
+
$post = $post_backup;
|
| 617 |
+
}
|
| 618 |
+
|
| 619 |
+
/**
|
| 620 |
+
* Checks single co-author when user's url is set and not a guest author.
|
| 621 |
+
*
|
| 622 |
+
* @covers ::coauthors_links_single()
|
| 623 |
+
*/
|
| 624 |
+
public function test_coauthors_links_single_author_url_is_set() {
|
| 625 |
+
|
| 626 |
+
global $post, $authordata;
|
| 627 |
+
|
| 628 |
+
// Backing up global post.
|
| 629 |
+
$post_backup = $post;
|
| 630 |
+
|
| 631 |
+
$post = $this->post;
|
| 632 |
+
|
| 633 |
+
// Backing up global author data.
|
| 634 |
+
$authordata_backup = $authordata;
|
| 635 |
+
|
| 636 |
+
$user_id = $this->factory->user->create( array(
|
| 637 |
+
'user_url' => 'example.org',
|
| 638 |
+
) );
|
| 639 |
+
$user = get_user_by( 'id', $user_id );
|
| 640 |
+
|
| 641 |
+
$authordata = $user;
|
| 642 |
+
$author_link = coauthors_links_single( $user );
|
| 643 |
+
|
| 644 |
+
$this->assertContains( get_the_author_meta( 'url' ), $author_link, 'Author link not found.' );
|
| 645 |
+
$this->assertContains( get_the_author(), $author_link, 'Author name not found.' );
|
| 646 |
+
|
| 647 |
+
// Here we are checking author name should not be more then one time.
|
| 648 |
+
// Asserting ">get_the_author()<" because "get_the_author()" can be multiple times like in href, title, etc.
|
| 649 |
+
$this->assertEquals( 1, substr_count( $author_link, '>' . get_the_author() . '<' ) );
|
| 650 |
+
|
| 651 |
+
// Restore global author data from backup.
|
| 652 |
+
$authordata = $authordata_backup;
|
| 653 |
+
|
| 654 |
+
// Restore global post from backup.
|
| 655 |
+
$post = $post_backup;
|
| 656 |
+
}
|
| 657 |
+
|
| 658 |
+
/**
|
| 659 |
+
* Checks single co-author when user's website/url not exist.
|
| 660 |
+
*
|
| 661 |
+
* @covers ::coauthors_links_single()
|
| 662 |
+
*/
|
| 663 |
+
public function test_coauthors_links_single_when_url_not_exist() {
|
| 664 |
+
|
| 665 |
+
global $post, $authordata;
|
| 666 |
+
|
| 667 |
+
// Backing up global post.
|
| 668 |
+
$post_backup = $post;
|
| 669 |
+
|
| 670 |
+
$post = $this->post;
|
| 671 |
+
|
| 672 |
+
// Backing up global author data.
|
| 673 |
+
$authordata_backup = $authordata;
|
| 674 |
+
|
| 675 |
+
$this->editor1->type = 'guest-author';
|
| 676 |
+
|
| 677 |
+
$author_link = coauthors_links_single( $this->editor1 );
|
| 678 |
+
|
| 679 |
+
$this->assertEmpty( $author_link );
|
| 680 |
+
|
| 681 |
+
$authordata = $this->author1;
|
| 682 |
+
$author_link = coauthors_links_single( $this->author1 );
|
| 683 |
+
|
| 684 |
+
$this->assertEquals( get_the_author(), $author_link );
|
| 685 |
+
|
| 686 |
+
// Restore global author data from backup.
|
| 687 |
+
$authordata = $authordata_backup;
|
| 688 |
+
|
| 689 |
+
// Restore global post from backup.
|
| 690 |
+
$post = $post_backup;
|
| 691 |
+
}
|
| 692 |
+
|
| 693 |
+
/**
|
| 694 |
+
* Checks co-authors IDs.
|
| 695 |
+
*
|
| 696 |
+
* @covers ::coauthors_ids()
|
| 697 |
+
* @covers ::coauthors__echo()
|
| 698 |
+
*/
|
| 699 |
+
public function test_coauthors_ids() {
|
| 700 |
+
|
| 701 |
+
global $post, $coauthors_plus;
|
| 702 |
+
|
| 703 |
+
// Backing up global post.
|
| 704 |
+
$post_backup = $post;
|
| 705 |
+
|
| 706 |
+
$post = $this->post;
|
| 707 |
+
|
| 708 |
+
$ids = coauthors_ids( null, null, null, null, false );
|
| 709 |
+
|
| 710 |
+
$this->assertEquals( $this->author1->ID, $ids );
|
| 711 |
+
|
| 712 |
+
$ids = coauthors_ids( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 713 |
+
|
| 714 |
+
$this->assertEquals( '<span>' . $this->author1->ID . '</span>', $ids );
|
| 715 |
+
|
| 716 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 717 |
+
|
| 718 |
+
$ids = coauthors_ids( null, null, null, null, false );
|
| 719 |
+
|
| 720 |
+
$this->assertEquals( $this->author1->ID . ' and ' . $this->editor1->ID, $ids );
|
| 721 |
+
|
| 722 |
+
$ids = coauthors_ids( '</span><span>', '</span><span>', '<span>', '</span>', false );
|
| 723 |
+
|
| 724 |
+
$this->assertEquals( '<span>' . $this->author1->ID . '</span><span>' . $this->editor1->ID . '</span>', $ids );
|
| 725 |
+
|
| 726 |
+
// Restore global post from backup.
|
| 727 |
+
$post = $post_backup;
|
| 728 |
+
}
|
| 729 |
+
|
| 730 |
+
/**
|
| 731 |
+
* Checks co-authors meta.
|
| 732 |
+
*
|
| 733 |
+
* @covers ::get_the_coauthor_meta()
|
| 734 |
+
*/
|
| 735 |
+
public function test_get_the_coauthor_meta() {
|
| 736 |
+
|
| 737 |
+
global $post;
|
| 738 |
+
|
| 739 |
+
// Backing up global post.
|
| 740 |
+
$post_backup = $post;
|
| 741 |
+
|
| 742 |
+
$this->assertEmpty( get_the_coauthor_meta( '' ) );
|
| 743 |
+
|
| 744 |
+
update_user_meta( $this->author1->ID, 'meta_key', 'meta_value' );
|
| 745 |
+
|
| 746 |
+
$this->assertEmpty( get_the_coauthor_meta( 'meta_key' ) );
|
| 747 |
+
|
| 748 |
+
$post = $this->post;
|
| 749 |
+
$meta = get_the_coauthor_meta( 'meta_key' );
|
| 750 |
+
|
| 751 |
+
$this->assertEquals( 'meta_value', $meta[ $this->author1->ID ] );
|
| 752 |
+
|
| 753 |
+
// Restore global post from backup.
|
| 754 |
+
$post = $post_backup;
|
| 755 |
+
}
|
| 756 |
+
|
| 757 |
+
/**
|
| 758 |
+
* Checks all the co-authors of the blog with default args.
|
| 759 |
+
*
|
| 760 |
+
* @covers ::coauthors_wp_list_authors()
|
| 761 |
+
*/
|
| 762 |
+
public function test_coauthors_wp_list_authors_for_default_args() {
|
| 763 |
+
|
| 764 |
+
global $coauthors_plus;
|
| 765 |
+
|
| 766 |
+
$args = array(
|
| 767 |
+
'echo' => false,
|
| 768 |
+
);
|
| 769 |
+
|
| 770 |
+
$coauthors = coauthors_wp_list_authors( $args );
|
| 771 |
+
|
| 772 |
+
$this->assertContains( 'href="' . get_author_posts_url( $this->author1->ID, $this->author1->user_nicename ) . '"', $coauthors, 'Author link not found.' );
|
| 773 |
+
$this->assertContains( $this->author1->display_name, $coauthors, 'Author name not found.' );
|
| 774 |
+
|
| 775 |
+
$coauthors = coauthors_wp_list_authors( $args );
|
| 776 |
+
|
| 777 |
+
$this->assertNotContains( 'href="' . get_author_posts_url( $this->editor1->ID, $this->editor1->user_nicename ) . '"', $coauthors );
|
| 778 |
+
$this->assertNotContains( $this->editor1->display_name, $coauthors );
|
| 779 |
+
|
| 780 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 781 |
+
|
| 782 |
+
$coauthors = coauthors_wp_list_authors( $args );
|
| 783 |
+
|
| 784 |
+
$this->assertContains( 'href="' . get_author_posts_url( $this->author1->ID, $this->author1->user_nicename ) . '"', $coauthors, 'Main author link not found.' );
|
| 785 |
+
$this->assertContains( $this->author1->display_name, $coauthors, 'Main author name not found.' );
|
| 786 |
+
|
| 787 |
+
// Here we are checking author name should not be more then one time.
|
| 788 |
+
// Asserting ">{$this->author1->display_name}<" because "$this->author1->display_name" can be multiple times like in href, title, etc.
|
| 789 |
+
$this->assertEquals( 1, substr_count( $coauthors, ">{$this->author1->display_name}<" ) );
|
| 790 |
+
|
| 791 |
+
$this->assertContains( '</li><li>', $coauthors, 'Coauthors name separator is not matched.' );
|
| 792 |
+
$this->assertContains( 'href="' . get_author_posts_url( $this->editor1->ID, $this->editor1->user_nicename ) . '"', $coauthors, 'Coauthor link not found.' );
|
| 793 |
+
$this->assertContains( $this->editor1->display_name, $coauthors, 'Coauthor name not found.' );
|
| 794 |
+
|
| 795 |
+
// Here we are checking editor name should not be more then one time.
|
| 796 |
+
// Asserting ">{$this->editor1->display_name}<" because "$this->editor1->display_name" can be multiple times like in href, title, etc.
|
| 797 |
+
$this->assertEquals( 1, substr_count( $coauthors, ">{$this->editor1->display_name}<" ) );
|
| 798 |
+
}
|
| 799 |
+
|
| 800 |
+
/**
|
| 801 |
+
* Checks all the co-authors of the blog with optioncount option.
|
| 802 |
+
*
|
| 803 |
+
* @covers ::coauthors_wp_list_authors()
|
| 804 |
+
*/
|
| 805 |
+
public function test_coauthors_wp_list_authors_for_optioncount() {
|
| 806 |
+
|
| 807 |
+
$this->assertContains( '(' . count_user_posts( $this->author1->ID ) . ')', coauthors_wp_list_authors( array(
|
| 808 |
+
'echo' => false,
|
| 809 |
+
'optioncount' => true,
|
| 810 |
+
) ) );
|
| 811 |
+
}
|
| 812 |
+
|
| 813 |
+
/**
|
| 814 |
+
* Checks all the co-authors of the blog with show_fullname option.
|
| 815 |
+
*
|
| 816 |
+
* @covers ::coauthors_wp_list_authors()
|
| 817 |
+
*/
|
| 818 |
+
public function test_coauthors_wp_list_authors_for_show_fullname() {
|
| 819 |
+
|
| 820 |
+
$args = array(
|
| 821 |
+
'echo' => false,
|
| 822 |
+
'show_fullname' => true,
|
| 823 |
+
);
|
| 824 |
+
|
| 825 |
+
$this->assertContains( $this->author1->display_name, coauthors_wp_list_authors( $args ) );
|
| 826 |
+
|
| 827 |
+
$user = $this->factory->user->create_and_get( array(
|
| 828 |
+
'first_name' => 'First',
|
| 829 |
+
'last_name' => 'Last',
|
| 830 |
+
) );
|
| 831 |
+
|
| 832 |
+
$this->factory->post->create( array(
|
| 833 |
+
'post_author' => $user->ID,
|
| 834 |
+
) );
|
| 835 |
+
|
| 836 |
+
$this->assertContains( "{$user->user_firstname} {$user->user_lastname}", coauthors_wp_list_authors( $args ) );
|
| 837 |
+
}
|
| 838 |
+
|
| 839 |
+
/**
|
| 840 |
+
* Checks all the co-authors of the blog with hide_empty option.
|
| 841 |
+
*
|
| 842 |
+
* @covers ::coauthors_wp_list_authors()
|
| 843 |
+
*/
|
| 844 |
+
public function test_coauthors_wp_list_authors_for_hide_empty() {
|
| 845 |
+
|
| 846 |
+
global $coauthors_plus;
|
| 847 |
+
|
| 848 |
+
$coauthors_plus->guest_authors->create( array(
|
| 849 |
+
'user_login' => 'author2',
|
| 850 |
+
'display_name' => 'author2',
|
| 851 |
+
) );
|
| 852 |
+
|
| 853 |
+
$this->assertContains( 'author2', coauthors_wp_list_authors( array(
|
| 854 |
+
'echo' => false,
|
| 855 |
+
'hide_empty' => false,
|
| 856 |
+
) ) );
|
| 857 |
+
}
|
| 858 |
+
|
| 859 |
+
/**
|
| 860 |
+
* Checks all the co-authors of the blog with feed option.
|
| 861 |
+
*
|
| 862 |
+
* @covers ::coauthors_wp_list_authors()
|
| 863 |
+
*/
|
| 864 |
+
public function test_coauthors_wp_list_authors_for_feed() {
|
| 865 |
+
|
| 866 |
+
$feed_text = 'link to feed';
|
| 867 |
+
$coauthors = coauthors_wp_list_authors( array(
|
| 868 |
+
'echo' => false,
|
| 869 |
+
'feed' => $feed_text,
|
| 870 |
+
) );
|
| 871 |
+
|
| 872 |
+
$this->assertContains( esc_url( get_author_feed_link( $this->author1->ID ) ), $coauthors );
|
| 873 |
+
$this->assertContains( $feed_text, $coauthors );
|
| 874 |
+
}
|
| 875 |
+
|
| 876 |
+
/**
|
| 877 |
+
* Checks all the co-authors of the blog with feed_image option.
|
| 878 |
+
*
|
| 879 |
+
* @covers ::coauthors_wp_list_authors()
|
| 880 |
+
*/
|
| 881 |
+
public function test_coauthors_wp_list_authors_for_feed_image() {
|
| 882 |
+
|
| 883 |
+
$feed_image = WP_TESTS_DOMAIN . '/path/to/a/graphic.png';
|
| 884 |
+
$coauthors = coauthors_wp_list_authors( array(
|
| 885 |
+
'echo' => false,
|
| 886 |
+
'feed_image' => $feed_image,
|
| 887 |
+
) );
|
| 888 |
+
|
| 889 |
+
$this->assertContains( esc_url( get_author_feed_link( $this->author1->ID ) ), $coauthors );
|
| 890 |
+
$this->assertContains( $feed_image, $coauthors );
|
| 891 |
+
}
|
| 892 |
+
|
| 893 |
+
/**
|
| 894 |
+
* Checks all the co-authors of the blog with feed_type option.
|
| 895 |
+
*
|
| 896 |
+
* @covers ::coauthors_wp_list_authors()
|
| 897 |
+
*/
|
| 898 |
+
public function test_coauthors_wp_list_authors_for_feed_type() {
|
| 899 |
+
|
| 900 |
+
$feed_type = 'atom';
|
| 901 |
+
$feed_text = 'link to feed';
|
| 902 |
+
$coauthors = coauthors_wp_list_authors( array(
|
| 903 |
+
'echo' => false,
|
| 904 |
+
'feed_type' => $feed_type,
|
| 905 |
+
'feed' => $feed_text,
|
| 906 |
+
) );
|
| 907 |
+
|
| 908 |
+
$this->assertContains( esc_url( get_author_feed_link( $this->author1->ID, $feed_type ) ), $coauthors );
|
| 909 |
+
$this->assertContains( $feed_type, $coauthors );
|
| 910 |
+
$this->assertContains( $feed_text, $coauthors );
|
| 911 |
+
}
|
| 912 |
+
|
| 913 |
+
/**
|
| 914 |
+
* Checks all the co-authors of the blog with style option.
|
| 915 |
+
*
|
| 916 |
+
* @covers ::coauthors_wp_list_authors()
|
| 917 |
+
*/
|
| 918 |
+
public function test_coauthors_wp_list_authors_for_style() {
|
| 919 |
+
|
| 920 |
+
$coauthors = coauthors_wp_list_authors( array(
|
| 921 |
+
'echo' => false,
|
| 922 |
+
'style' => 'none',
|
| 923 |
+
) );
|
| 924 |
+
|
| 925 |
+
$this->assertNotContains( '<li>', $coauthors );
|
| 926 |
+
$this->assertNotContains( '</li>', $coauthors );
|
| 927 |
+
}
|
| 928 |
+
|
| 929 |
+
/**
|
| 930 |
+
* Checks all the co-authors of the blog with html option.
|
| 931 |
+
*
|
| 932 |
+
* @covers ::coauthors_wp_list_authors()
|
| 933 |
+
*/
|
| 934 |
+
public function test_coauthors_wp_list_authors_for_html() {
|
| 935 |
+
|
| 936 |
+
global $coauthors_plus;
|
| 937 |
+
|
| 938 |
+
$args = array(
|
| 939 |
+
'echo' => false,
|
| 940 |
+
'html' => false,
|
| 941 |
+
);
|
| 942 |
+
|
| 943 |
+
$this->assertEquals( $this->author1->display_name, coauthors_wp_list_authors( $args ) );
|
| 944 |
+
|
| 945 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $this->editor1->user_login ), true );
|
| 946 |
+
|
| 947 |
+
$this->assertEquals( "{$this->author1->display_name}, {$this->editor1->display_name}", coauthors_wp_list_authors( $args ) );
|
| 948 |
+
}
|
| 949 |
+
|
| 950 |
+
/**
|
| 951 |
+
* Checks all the co-authors of the blog with guest_authors_only option.
|
| 952 |
+
*
|
| 953 |
+
* @covers ::coauthors_wp_list_authors()
|
| 954 |
+
*/
|
| 955 |
+
public function test_coauthors_wp_list_authors_for_guest_authors_only() {
|
| 956 |
+
|
| 957 |
+
global $coauthors_plus;
|
| 958 |
+
|
| 959 |
+
$args = array(
|
| 960 |
+
'echo' => false,
|
| 961 |
+
'guest_authors_only' => true,
|
| 962 |
+
);
|
| 963 |
+
|
| 964 |
+
$this->assertEmpty( coauthors_wp_list_authors( $args ) );
|
| 965 |
+
|
| 966 |
+
$guest_author_id = $coauthors_plus->guest_authors->create( array(
|
| 967 |
+
'user_login' => 'author2',
|
| 968 |
+
'display_name' => 'author2',
|
| 969 |
+
) );
|
| 970 |
+
|
| 971 |
+
$this->assertEmpty( coauthors_wp_list_authors( $args ) );
|
| 972 |
+
|
| 973 |
+
$guest_author = $coauthors_plus->guest_authors->get_guest_author_by( 'id', $guest_author_id );
|
| 974 |
+
|
| 975 |
+
$coauthors_plus->add_coauthors( $this->post->ID, array( $guest_author->user_login ), true );
|
| 976 |
+
|
| 977 |
+
$this->assertContains( $guest_author->display_name, coauthors_wp_list_authors( $args ) );
|
| 978 |
+
}
|
| 979 |
+
|
| 980 |
+
/**
|
| 981 |
+
* Checks co-author's avatar.
|
| 982 |
+
*
|
| 983 |
+
* @covers ::coauthors_get_avatar()
|
| 984 |
+
*/
|
| 985 |
+
public function test_coauthors_get_avatar_default() {
|
| 986 |
+
|
| 987 |
+
$this->assertEmpty( coauthors_get_avatar( $this->author1->ID ) );
|
| 988 |
+
$this->assertEquals( preg_match( "|^<img alt='[^']*' src='[^']*' srcset='[^']*' class='[^']*' height='[^']*' width='[^']*' />$|", coauthors_get_avatar( $this->author1 ) ), 1 );
|
| 989 |
+
}
|
| 990 |
+
|
| 991 |
+
/**
|
| 992 |
+
* Checks co-author's avatar when author is a guest author.
|
| 993 |
+
*
|
| 994 |
+
* @covers ::coauthors_get_avatar()
|
| 995 |
+
*/
|
| 996 |
+
public function test_coauthors_get_avatar_when_guest_author() {
|
| 997 |
+
|
| 998 |
+
global $coauthors_plus;
|
| 999 |
+
|
| 1000 |
+
$guest_author_id = $coauthors_plus->guest_authors->create( array(
|
| 1001 |
+
'user_login' => 'author2',
|
| 1002 |
+
'display_name' => 'author2',
|
| 1003 |
+
) );
|
| 1004 |
+
|
| 1005 |
+
$guest_author = $coauthors_plus->guest_authors->get_guest_author_by( 'id', $guest_author_id );
|
| 1006 |
+
|
| 1007 |
+
$this->assertEquals( preg_match( "|^<img alt='[^']*' src='[^']*' srcset='[^']*' class='[^']*' height='[^']*' width='[^']*' />$|", coauthors_get_avatar( $guest_author ) ), 1 );
|
| 1008 |
+
|
| 1009 |
+
$filename = rand_str() . '.jpg';
|
| 1010 |
+
$contents = rand_str();
|
| 1011 |
+
$upload = wp_upload_bits( $filename, null, $contents );
|
| 1012 |
+
|
| 1013 |
+
$this->assertTrue( empty( $upload['error'] ) );
|
| 1014 |
+
|
| 1015 |
+
$attachment_id = $this->_make_attachment( $upload );
|
| 1016 |
+
|
| 1017 |
+
set_post_thumbnail( $guest_author->ID, $attachment_id );
|
| 1018 |
+
|
| 1019 |
+
$avatar = coauthors_get_avatar( $guest_author );
|
| 1020 |
+
$attachment_url = wp_get_attachment_url( $attachment_id );
|
| 1021 |
+
|
| 1022 |
+
$this->assertContains( $filename, $avatar );
|
| 1023 |
+
$this->assertContains( 'src="' . $attachment_url . '"', $avatar );
|
| 1024 |
+
}
|
| 1025 |
+
|
| 1026 |
+
/**
|
| 1027 |
+
* Checks co-author's avatar when user's email is not set somehow.
|
| 1028 |
+
*
|
| 1029 |
+
* @covers ::coauthors_get_avatar()
|
| 1030 |
+
*/
|
| 1031 |
+
public function test_coauthors_get_avatar_when_user_email_not_set() {
|
| 1032 |
+
|
| 1033 |
+
global $coauthors_plus;
|
| 1034 |
+
|
| 1035 |
+
$guest_author_id = $coauthors_plus->guest_authors->create( array(
|
| 1036 |
+
'user_login' => 'author2',
|
| 1037 |
+
'display_name' => 'author2',
|
| 1038 |
+
) );
|
| 1039 |
+
|
| 1040 |
+
$guest_author = $coauthors_plus->guest_authors->get_guest_author_by( 'id', $guest_author_id );
|
| 1041 |
+
|
| 1042 |
+
unset( $guest_author->user_email );
|
| 1043 |
+
|
| 1044 |
+
$this->assertEmpty( coauthors_get_avatar( $guest_author ) );
|
| 1045 |
+
}
|
| 1046 |
+
|
| 1047 |
+
/**
|
| 1048 |
+
* Checks co-author's avatar with size.
|
| 1049 |
+
*
|
| 1050 |
+
* @covers ::coauthors_get_avatar()
|
| 1051 |
+
*/
|
| 1052 |
+
public function test_coauthors_get_avatar_size() {
|
| 1053 |
+
|
| 1054 |
+
$size = '100';
|
| 1055 |
+
$this->assertEquals( preg_match( "|^<img .*height='$size'.*width='$size'|", coauthors_get_avatar( $this->author1, $size ) ), 1 );
|
| 1056 |
+
}
|
| 1057 |
+
|
| 1058 |
+
/**
|
| 1059 |
+
* Checks co-author's avatar with alt.
|
| 1060 |
+
*
|
| 1061 |
+
* @covers ::coauthors_get_avatar()
|
| 1062 |
+
*/
|
| 1063 |
+
public function test_coauthors_get_avatar_alt() {
|
| 1064 |
+
|
| 1065 |
+
$alt = 'Test';
|
| 1066 |
+
$this->assertEquals( preg_match( "|^<img alt='$alt'|", coauthors_get_avatar( $this->author1, 96, '', $alt ) ), 1 );
|
| 1067 |
+
}
|
| 1068 |
+
}
|
