-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Editor: Add emoji reactions as a comment type for Notes #10930
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: trunk
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -105,7 +105,7 @@ public function prepare_items() { | |||||
|
|
||||||
| $comment_type = ''; | ||||||
|
|
||||||
| if ( ! empty( $_REQUEST['comment_type'] ) && 'note' !== $_REQUEST['comment_type'] ) { | ||||||
| if ( ! empty( $_REQUEST['comment_type'] ) && ! in_array( $_REQUEST['comment_type'], array( 'note', 'reaction' ), true ) ) { | ||||||
| $comment_type = $_REQUEST['comment_type']; | ||||||
| } | ||||||
|
|
||||||
|
|
@@ -155,7 +155,7 @@ public function prepare_items() { | |||||
| 'number' => $number, | ||||||
| 'post_id' => $post_id, | ||||||
| 'type' => $comment_type, | ||||||
| 'type__not_in' => array( 'note' ), | ||||||
| 'type__not_in' => array( 'note', 'reaction' ), | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. With the above suggestion:
Suggested change
|
||||||
| 'orderby' => $orderby, | ||||||
| 'order' => $order, | ||||||
| 'post_type' => $post_type, | ||||||
|
|
||||||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -158,7 +158,7 @@ function get_pending_comments_num( $post_id ) { | |||||||||||||||||||
| $post_id_array = array_map( 'intval', $post_id_array ); | ||||||||||||||||||||
| $post_id_in = "'" . implode( "', '", $post_id_array ) . "'"; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| $pending = $wpdb->get_results( "SELECT comment_post_ID, COUNT(comment_ID) as num_comments FROM $wpdb->comments WHERE comment_post_ID IN ( $post_id_in ) AND comment_approved = '0' AND comment_type != 'note' GROUP BY comment_post_ID", ARRAY_A ); | ||||||||||||||||||||
| $pending = $wpdb->get_results( "SELECT comment_post_ID, COUNT(comment_ID) as num_comments FROM $wpdb->comments WHERE comment_post_ID IN ( $post_id_in ) AND comment_approved = '0' AND comment_type != 'note' AND comment_type != 'reaction' GROUP BY comment_post_ID", ARRAY_A ); | ||||||||||||||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||
|
|
||||||||||||||||||||
| if ( $single ) { | ||||||||||||||||||||
| if ( empty( $pending ) ) { | ||||||||||||||||||||
|
|
||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2875,7 +2875,7 @@ function wp_update_comment_count_now( $post_id ) { | |
| $new = apply_filters( 'pre_wp_update_comment_count_now', null, $old, $post_id ); | ||
|
|
||
| if ( is_null( $new ) ) { | ||
| $new = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1' AND comment_type != 'note'", $post_id ) ); | ||
| $new = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1' AND comment_type != 'note' AND comment_type != 'reaction'", $post_id ) ); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ditto above with using something like |
||
| } else { | ||
| $new = (int) $new; | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -4349,10 +4349,11 @@ function is_avatar_comment_type( $comment_type ) { | |||||
| * @since 3.0.0 | ||||||
| * | ||||||
| * @since 6.9.0 The 'note' comment type was added. | ||||||
| * @since 7.0.0 The 'reaction' comment type was added. | ||||||
| * | ||||||
| * @param array $types An array of content types. Default contains 'comment' and 'note'. | ||||||
| * @param array $types An array of content types. Default contains 'comment', 'note', and 'reaction'. | ||||||
| */ | ||||||
| $allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment', 'note' ) ); | ||||||
| $allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment', 'note', 'reaction' ) ); | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| return in_array( $comment_type, (array) $allowed_comment_types, true ); | ||||||
| } | ||||||
|
|
||||||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -123,7 +123,7 @@ public function register_routes() { | |||||
| * @return true|WP_Error True if the request has read access, error object otherwise. | ||||||
| */ | ||||||
| public function get_items_permissions_check( $request ) { | ||||||
| $is_note = 'note' === $request['type']; | ||||||
| $is_note = in_array( $request['type'], array( 'note', 'reaction' ), true ); | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| $is_edit_context = 'edit' === $request['context']; | ||||||
| $protected_params = array( 'author', 'author_exclude', 'author_email', 'type', 'status' ); | ||||||
| $forbidden_params = array(); | ||||||
|
|
@@ -437,8 +437,8 @@ public function get_item_permissions_check( $request ) { | |||||
| return $comment; | ||||||
| } | ||||||
|
|
||||||
| // Re-map edit context capabilities when requesting `note` type. | ||||||
| $edit_cap = 'note' === $comment->comment_type ? array( 'edit_comment', $comment->comment_ID ) : array( 'moderate_comments' ); | ||||||
| // Re-map edit context capabilities when requesting `note` or `reaction` type. | ||||||
| $edit_cap = in_array( $comment->comment_type, array( 'note', 'reaction' ), true ) ? array( 'edit_comment', $comment->comment_ID ) : array( 'moderate_comments' ); | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| if ( ! empty( $request['context'] ) && 'edit' === $request['context'] && ! current_user_can( ...$edit_cap ) ) { | ||||||
| return new WP_Error( | ||||||
| 'rest_forbidden_context', | ||||||
|
|
@@ -497,7 +497,7 @@ public function get_item( $request ) { | |||||
| * @return true|WP_Error True if the request has access to create items, error object otherwise. | ||||||
| */ | ||||||
| public function create_item_permissions_check( $request ) { | ||||||
| $is_note = ! empty( $request['type'] ) && 'note' === $request['type']; | ||||||
| $is_note = ! empty( $request['type'] ) && in_array( $request['type'], array( 'note', 'reaction' ), true ); | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| if ( ! is_user_logged_in() && $is_note ) { | ||||||
| return new WP_Error( | ||||||
|
|
@@ -649,14 +649,65 @@ public function create_item( $request ) { | |||||
| } | ||||||
|
|
||||||
| // Do not allow comments to be created with a non-core type. | ||||||
| if ( ! empty( $request['type'] ) && ! in_array( $request['type'], array( 'comment', 'note' ), true ) ) { | ||||||
| if ( ! empty( $request['type'] ) && ! in_array( $request['type'], array( 'comment', 'note', 'reaction' ), true ) ) { | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| return new WP_Error( | ||||||
| 'rest_invalid_comment_type', | ||||||
| __( 'Cannot create a comment with that type.' ), | ||||||
| array( 'status' => 400 ) | ||||||
| ); | ||||||
| } | ||||||
|
|
||||||
| // Validate reaction-specific constraints. | ||||||
| if ( ! empty( $request['type'] ) && 'reaction' === $request['type'] ) { | ||||||
| $valid_emojis = array( 'heart', 'celebration', 'smile', 'eyes', 'rocket' ); | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No 💩? 😜 |
||||||
|
|
||||||
| // Reaction content must be a valid emoji slug. | ||||||
| if ( empty( $request['content'] ) || ! in_array( $request['content'], $valid_emojis, true ) ) { | ||||||
| return new WP_Error( | ||||||
| 'rest_reaction_invalid_emoji', | ||||||
| __( 'Reaction content must be a valid emoji slug.' ), | ||||||
| array( 'status' => 400 ) | ||||||
| ); | ||||||
| } | ||||||
|
|
||||||
| // Reaction parent must exist and be a note. | ||||||
| if ( empty( $request['parent'] ) ) { | ||||||
| return new WP_Error( | ||||||
| 'rest_reaction_parent_required', | ||||||
| __( 'Reactions must have a parent note.' ), | ||||||
| array( 'status' => 400 ) | ||||||
| ); | ||||||
| } | ||||||
|
|
||||||
| $parent_comment = get_comment( $request['parent'] ); | ||||||
| if ( ! $parent_comment || 'note' !== $parent_comment->comment_type ) { | ||||||
| return new WP_Error( | ||||||
| 'rest_reaction_invalid_parent', | ||||||
| __( 'Reactions can only be added to notes.' ), | ||||||
| array( 'status' => 400 ) | ||||||
| ); | ||||||
| } | ||||||
|
|
||||||
| // Enforce uniqueness: one emoji per user per note. | ||||||
|
Comment on lines
+682
to
+691
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In the future, perhaps reactions could be enabled for non-note comments as well? |
||||||
| $existing = get_comments( | ||||||
| array( | ||||||
| 'comment_type' => 'reaction', | ||||||
| 'comment_parent' => $request['parent'], | ||||||
| 'user_id' => get_current_user_id(), | ||||||
| 'search' => $request['content'], | ||||||
| 'count' => true, | ||||||
| ) | ||||||
| ); | ||||||
|
|
||||||
| if ( $existing > 0 ) { | ||||||
| return new WP_Error( | ||||||
| 'rest_reaction_duplicate', | ||||||
| __( 'You have already added this reaction.' ), | ||||||
| array( 'status' => 409 ) | ||||||
| ); | ||||||
| } | ||||||
| } | ||||||
|
|
||||||
| $prepared_comment = $this->prepare_item_for_database( $request ); | ||||||
| if ( is_wp_error( $prepared_comment ) ) { | ||||||
| return $prepared_comment; | ||||||
|
|
@@ -735,9 +786,9 @@ public function create_item( $request ) { | |||||
| ); | ||||||
| } | ||||||
|
|
||||||
| // Don't check for duplicates or flooding for notes. | ||||||
| // Don't check for duplicates or flooding for notes or reactions. | ||||||
| $prepared_comment['comment_approved'] = | ||||||
| 'note' === $prepared_comment['comment_type'] ? | ||||||
| in_array( $prepared_comment['comment_type'], array( 'note', 'reaction' ), true ) ? | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| '1' : | ||||||
| wp_allow_comment( $prepared_comment, true ); | ||||||
|
|
||||||
|
|
@@ -1297,7 +1348,7 @@ protected function prepare_links( $comment ) { | |||||
| } | ||||||
|
|
||||||
| // Embedding children for notes requires `type` and `status` inheritance. | ||||||
| if ( isset( $links['children'] ) && 'note' === $comment->comment_type ) { | ||||||
| if ( isset( $links['children'] ) && in_array( $comment->comment_type, array( 'note', 'reaction' ), true ) ) { | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| $args = array( | ||||||
| 'parent' => $comment->comment_ID, | ||||||
| 'type' => $comment->comment_type, | ||||||
|
|
@@ -1911,7 +1962,7 @@ protected function check_read_post_permission( $post, $request ) { | |||||
| * @return bool Whether the comment can be read. | ||||||
| */ | ||||||
| protected function check_read_permission( $comment, $request ) { | ||||||
| if ( 'note' !== $comment->comment_type && ! empty( $comment->comment_post_ID ) ) { | ||||||
| if ( ! in_array( $comment->comment_type, array( 'note', 'reaction' ), true ) && ! empty( $comment->comment_post_ID ) ) { | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| $post = get_post( $comment->comment_post_ID ); | ||||||
| if ( $post ) { | ||||||
| if ( $this->check_read_post_permission( $post, $request ) && 1 === (int) $comment->comment_approved ) { | ||||||
|
|
@@ -2026,6 +2077,11 @@ protected function check_is_comment_content_allowed( $prepared_comment ) { | |||||
| return true; | ||||||
| } | ||||||
|
|
||||||
| // Reactions always have content (the emoji slug), so allow them. | ||||||
| if ( isset( $check['comment_type'] ) && 'reaction' === $check['comment_type'] ) { | ||||||
| return true; | ||||||
| } | ||||||
|
|
||||||
| /* | ||||||
| * Do not allow a comment to be created with missing or empty | ||||||
| * comment_content. See wp_handle_comment_submission(). | ||||||
|
|
||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems like perhaps there should be some centralized place for this list of non-comment comment types which can be re-used. This would avoid having to manually and tediously update all these instances whenever there is a new such type introduced. Maybe like a
wp_get_internal_comment_types().Then this could be: