BuddyPress - Version 6.0.0-RC1

Version Description

= 5.2.0 = See: https://codex.buddypress.org/releases/version-5-2-0/

= 5.1.2 = See: https://codex.buddypress.org/releases/version-5-1-2/

= 5.1.1 = See: https://codex.buddypress.org/releases/version-5-1-1/

= 5.1.0 = See: https://codex.buddypress.org/releases/version-5-1-0/

= 5.0.0 = See: https://codex.buddypress.org/releases/version-5-0-0/

= 4.4.0 = See: https://codex.buddypress.org/releases/version-4-4-0/

= 4.3.0 = See: https://codex.buddypress.org/releases/version-4-3-0/

= 4.2.0 = See: https://codex.buddypress.org/releases/version-4-2-0/

= 4.1.0 = See: https://codex.buddypress.org/releases/version-4-1-0/

= 4.0.0 = See: https://codex.buddypress.org/releases/version-4-0-0/

Download this release

Release Info

Developer imath
Plugin Icon 128x128 BuddyPress
Version 6.0.0-RC1
Comparing to
See all releases

Code changes from version 5.2.0 to 6.0.0-RC1

Files changed (270) hide show
  1. bp-activity/actions/feeds.php +17 -13
  2. bp-activity/admin/js/admin.js +20 -20
  3. bp-activity/bp-activity-admin.php +49 -14
  4. bp-activity/bp-activity-adminbar.php +2 -2
  5. bp-activity/bp-activity-akismet.php +1 -1
  6. bp-activity/bp-activity-embeds.php +7 -6
  7. bp-activity/bp-activity-filters.php +1 -1
  8. bp-activity/bp-activity-functions.php +74 -47
  9. bp-activity/bp-activity-notifications.php +26 -9
  10. bp-activity/bp-activity-template.php +23 -3
  11. bp-activity/classes/class-bp-activity-activity.php +32 -3
  12. bp-activity/classes/class-bp-activity-component.php +6 -2
  13. bp-activity/classes/class-bp-activity-list-table.php +79 -28
  14. bp-activity/classes/class-bp-akismet.php +35 -5
  15. bp-activity/classes/class-bp-rest-activity-endpoint.php +26 -6
  16. bp-activity/js/mentions.js +9 -9
  17. bp-activity/screens/permalink.php +2 -2
  18. bp-blogs/bp-blogs-activity.php +58 -31
  19. bp-blogs/bp-blogs-cache.php +1 -1
  20. bp-blogs/bp-blogs-functions.php +61 -46
  21. bp-blogs/bp-blogs-template.php +102 -31
  22. bp-blogs/classes/class-bp-blogs-blog.php +1 -1
  23. bp-blogs/classes/class-bp-blogs-component.php +28 -1
  24. bp-blogs/classes/class-bp-rest-attachments-blog-avatar-endpoint.php +305 -0
  25. bp-blogs/classes/class-bp-rest-blogs-endpoint.php +537 -0
  26. bp-blogs/screens/create.php +2 -4
  27. bp-core/admin/bp-core-admin-actions.php +1 -1
  28. bp-core/admin/bp-core-admin-components.php +54 -8
  29. bp-core/admin/bp-core-admin-functions.php +158 -103
  30. bp-core/admin/bp-core-admin-schema.php +3 -0
  31. bp-core/admin/bp-core-admin-settings.php +28 -20
  32. bp-core/admin/bp-core-admin-slugs.php +17 -4
  33. bp-core/admin/bp-core-admin-tools.php +75 -2
  34. bp-core/admin/css/common-rtl.css +5 -0
  35. bp-core/admin/css/common-rtl.min.css +1 -1
  36. bp-core/admin/css/common.css +5 -0
  37. bp-core/admin/css/common.min.css +1 -1
  38. bp-core/bp-core-actions.php +1 -0
  39. bp-core/bp-core-admin.php +1 -0
  40. bp-core/bp-core-adminbar.php +1 -1
  41. bp-core/bp-core-attachments.php +114 -61
  42. bp-core/bp-core-avatars.php +18 -20
  43. bp-core/bp-core-blocks.php +81 -0
  44. bp-core/bp-core-cache.php +3 -3
  45. bp-core/bp-core-catchuri.php +1 -1
  46. bp-core/bp-core-cssjs.php +2 -2
  47. bp-core/bp-core-dependency.php +15 -1
  48. bp-core/bp-core-filters.php +18 -2
  49. bp-core/bp-core-functions.php +38 -37
  50. bp-core/bp-core-template-loader.php +2 -2
  51. bp-core/bp-core-template.php +41 -10
  52. bp-core/bp-core-theme-compatibility.php +4 -4
  53. bp-core/bp-core-update.php +0 -1
  54. bp-core/bp-core-wpabstraction.php +165 -0
  55. bp-core/classes/class-bp-admin.php +106 -97
  56. bp-core/classes/class-bp-attachment-avatar.php +7 -4
  57. bp-core/classes/class-bp-attachment-cover-image.php +7 -4
  58. bp-core/classes/class-bp-attachment.php +12 -2
  59. bp-core/classes/class-bp-block.php +197 -0
  60. bp-core/classes/class-bp-component.php +43 -3
  61. bp-core/classes/class-bp-core-nav.php +10 -10
  62. bp-core/classes/class-bp-core-user.php +45 -5
  63. bp-core/classes/class-bp-invitation.php +40 -40
  64. bp-core/classes/class-bp-media-extractor.php +8 -3
  65. bp-core/classes/class-bp-phpmailer.php +1 -1
  66. bp-core/classes/class-bp-recursive-query.php +3 -3
  67. bp-core/classes/class-bp-rest-attachments-group-avatar-endpoint.php +4 -489
  68. bp-core/classes/class-bp-rest-attachments-member-avatar-endpoint.php +4 -505
  69. bp-core/classes/class-bp-rest-components-endpoint.php +5 -38
  70. bp-core/classes/class-bp-user-query.php +2 -2
  71. bp-core/classes/class-bp-walker-nav-menu.php +17 -10
  72. bp-core/classes/trait-attachments.php +166 -27
  73. bp-core/compat/php53/class-bp-compat-walker-nav-menu.php +0 -32
  74. bp-core/compat/php56/class-bp-compat-walker-nav-menu.php +0 -31
  75. bp-core/deprecated/1.2.php +12 -12
  76. bp-core/deprecated/1.5.php +18 -8
  77. bp-core/deprecated/1.6.php +8 -8
  78. bp-core/deprecated/1.7.php +2 -2
  79. bp-core/deprecated/1.9.php +22 -22
  80. bp-core/deprecated/2.0.php +1 -1
  81. bp-core/deprecated/2.1.php +40 -15
  82. bp-core/deprecated/2.2.php +3 -3
  83. bp-core/deprecated/2.5.php +2 -2
  84. bp-core/deprecated/2.8.php +11 -1
  85. bp-core/deprecated/3.0.php +10 -2
  86. bp-core/deprecated/6.0.php +159 -0
  87. bp-core/images/Jcrop.gif +0 -0
  88. bp-core/images/admin-menu-arrow.gif +0 -0
  89. bp-core/images/bp-blocks.gif +0 -0
  90. bp-core/images/bp-nouveau-improvements.png +0 -0
  91. bp-core/images/bp-nouveau-wide-aligns.png +0 -0
  92. bp-core/images/buddypress-blocks-category.png +0 -0
  93. bp-core/images/manage-members-interface.png +0 -0
  94. bp-core/images/mystery-man-50.jpg +0 -0
  95. bp-core/images/mystery-man.jpg +0 -0
  96. bp-core/images/site-health-buddypress-section.png +0 -0
  97. bp-core/js/avatar.js +61 -61
  98. bp-core/js/avatar.min.js +1 -1
  99. bp-core/js/block-components.js +23 -0
  100. bp-core/js/bp-api-request.js +2 -2
  101. bp-core/js/bp-plupload.js +23 -23
  102. bp-core/js/cover-image.js +26 -26
  103. bp-core/js/vendor/jquery-cookie.js +5 -5
  104. bp-core/js/vendor/jquery-scroll-to.js +20 -20
  105. bp-core/js/vendor/jquery.atwho.js +1 -1
  106. bp-core/js/vendor/jquery.caret.js +1 -1
  107. bp-core/js/vendor/moment-js/moment.js +218 -218
  108. bp-core/js/webcam.js +24 -24
  109. bp-friends/bp-friends-activity.php +3 -1
  110. bp-friends/bp-friends-functions.php +16 -1
  111. bp-friends/bp-friends-notifications.php +11 -7
  112. bp-friends/bp-friends-template.php +40 -19
  113. bp-friends/classes/class-bp-friends-component.php +17 -1
  114. bp-friends/classes/class-bp-rest-friends-endpoint.php +924 -0
  115. bp-groups/actions/feed.php +6 -3
  116. bp-groups/bp-groups-activity.php +13 -2
  117. bp-groups/bp-groups-admin.php +7 -1
  118. bp-groups/bp-groups-adminbar.php +4 -2
  119. bp-groups/bp-groups-blocks.php +203 -0
  120. bp-groups/bp-groups-functions.php +26 -2
  121. bp-groups/bp-groups-notifications.php +20 -5
  122. bp-groups/bp-groups-template.php +127 -91
  123. bp-groups/bp-groups-widgets.php +12 -2
  124. bp-groups/classes/class-bp-groups-component.php +77 -4
  125. bp-groups/classes/class-bp-groups-group-members-template.php +1 -0
  126. bp-groups/classes/class-bp-groups-invite-template.php +45 -7
  127. bp-groups/classes/class-bp-groups-list-table.php +78 -8
  128. bp-groups/classes/class-bp-groups-membership-requests-template.php +1 -0
  129. bp-groups/classes/class-bp-groups-widget.php +1 -0
  130. bp-groups/classes/class-bp-rest-attachments-group-avatar-endpoint.php +497 -0
  131. bp-groups/classes/class-bp-rest-attachments-group-cover-endpoint.php +430 -0
  132. bp-groups/classes/class-bp-rest-group-invites-endpoint.php +2 -4
  133. bp-groups/classes/class-bp-rest-group-membership-endpoint.php +25 -35
  134. bp-groups/classes/class-bp-rest-groups-endpoint.php +50 -7
  135. bp-groups/css/blocks/group-rtl.css +118 -0
  136. bp-groups/css/blocks/group-rtl.min.css +1 -0
  137. bp-groups/css/blocks/group.css +118 -0
  138. bp-groups/css/blocks/group.min.css +1 -0
  139. bp-groups/js/blocks/group.js +3 -0
  140. bp-groups/screens/user/invites.php +4 -2
  141. bp-loader.php +3 -3
  142. {bp-xprofile → bp-members}/actions/delete-avatar.php +6 -7
  143. bp-members/admin/css/admin-rtl.css +22 -14
  144. bp-members/admin/css/admin-rtl.min.css +1 -1
  145. bp-members/admin/css/admin.css +22 -14
  146. bp-members/admin/css/admin.min.css +1 -1
  147. bp-members/bp-members-activity.php +3 -1
  148. bp-members/bp-members-adminbar.php +9 -9
  149. bp-members/bp-members-blocks.php +194 -0
  150. bp-members/bp-members-functions.php +132 -5
  151. bp-members/bp-members-template.php +39 -1
  152. bp-members/classes/class-bp-members-admin.php +165 -9
  153. bp-members/classes/class-bp-members-component.php +264 -3
  154. bp-members/classes/class-bp-members-list-table.php +1 -0
  155. bp-members/classes/class-bp-members-ms-list-table.php +1 -0
  156. bp-members/classes/class-bp-rest-attachments-member-avatar-endpoint.php +513 -0
  157. bp-members/classes/class-bp-rest-attachments-member-cover-endpoint.php +430 -0
  158. bp-members/classes/class-bp-rest-members-endpoint.php +65 -18
  159. bp-members/classes/class-bp-rest-signup-endpoint.php +1067 -0
  160. bp-members/classes/class-bp-signup.php +9 -3
  161. bp-members/css/blocks/member-rtl.css +110 -0
  162. bp-members/css/blocks/member-rtl.min.css +1 -0
  163. bp-members/css/blocks/member.css +110 -0
  164. bp-members/css/blocks/member.min.css +1 -0
  165. bp-members/js/blocks/member.js +3 -0
  166. {bp-xprofile → bp-members}/screens/change-avatar.php +27 -21
  167. bp-members/screens/change-cover-image.php +42 -0
  168. bp-members/screens/profile.php +1 -1
  169. bp-messages/actions/bulk-manage-star.php +3 -1
  170. bp-messages/bp-messages-functions.php +1 -0
  171. bp-messages/bp-messages-notifications.php +5 -1
  172. bp-messages/bp-messages-template.php +11 -1
  173. bp-messages/classes/class-bp-messages-box-template.php +2 -2
  174. bp-messages/classes/class-bp-messages-notices-list-table.php +5 -4
  175. bp-messages/classes/class-bp-messages-thread.php +1 -0
  176. bp-messages/classes/class-bp-rest-messages-endpoint.php +110 -91
  177. bp-messages/screens/view.php +4 -2
  178. bp-notifications/bp-notifications-adminbar.php +3 -3
  179. bp-notifications/bp-notifications-cache.php +1 -1
  180. bp-notifications/bp-notifications-functions.php +19 -3
  181. bp-notifications/bp-notifications-template.php +1 -0
  182. bp-notifications/classes/class-bp-rest-notifications-endpoint.php +6 -6
  183. bp-settings/actions/delete-account.php +9 -2
  184. bp-settings/actions/general.php +1 -1
  185. bp-settings/bp-settings-template.php +18 -10
  186. bp-templates/bp-legacy/buddypress-functions.php +3 -0
  187. bp-templates/bp-legacy/buddypress/activity/comment.php +1 -1
  188. bp-templates/bp-legacy/buddypress/activity/entry.php +6 -1
  189. bp-templates/bp-legacy/buddypress/activity/index.php +41 -5
  190. bp-templates/bp-legacy/buddypress/activity/post-form.php +11 -5
  191. bp-templates/bp-legacy/buddypress/assets/emails/single-bp-email.php +3 -3
  192. bp-templates/bp-legacy/buddypress/blogs/index.php +14 -2
  193. bp-templates/bp-legacy/buddypress/groups/index.php +16 -2
  194. bp-templates/bp-legacy/buddypress/groups/single/request-membership.php +1 -1
  195. bp-templates/bp-legacy/buddypress/members/activate.php +6 -1
  196. bp-templates/bp-legacy/buddypress/members/register.php +1 -0
  197. bp-templates/bp-legacy/buddypress/members/single/groups/invites.php +10 -1
  198. bp-templates/bp-legacy/buddypress/members/single/messages/single.php +8 -2
  199. bp-templates/bp-legacy/buddypress/members/single/profile/edit.php +6 -1
  200. bp-templates/bp-legacy/buddypress/members/single/settings/data.php +12 -2
  201. bp-templates/bp-legacy/css/twentyfifteen.scss +0 -6
  202. bp-templates/bp-legacy/css/twentyseventeen-rtl.css +1 -1
  203. bp-templates/bp-legacy/css/twentyseventeen-rtl.min.css +1 -1
  204. bp-templates/bp-legacy/css/twentyseventeen.css +1 -1
  205. bp-templates/bp-legacy/css/twentyseventeen.min.css +1 -1
  206. bp-templates/bp-legacy/css/twentyseventeen.scss +4 -4
  207. bp-templates/bp-nouveau/buddypress-functions.php +19 -17
  208. bp-templates/bp-nouveau/buddypress/activity/index.php +2 -1
  209. bp-templates/bp-nouveau/buddypress/assets/emails/single-bp-email.php +1 -1
  210. bp-templates/bp-nouveau/buddypress/blogs/index.php +2 -1
  211. bp-templates/bp-nouveau/buddypress/common/js-templates/invites/index.php +2 -2
  212. bp-templates/bp-nouveau/buddypress/groups/groups-loop.php +1 -1
  213. bp-templates/bp-nouveau/buddypress/groups/index.php +2 -1
  214. bp-templates/bp-nouveau/buddypress/groups/single/cover-image-header.php +1 -1
  215. bp-templates/bp-nouveau/buddypress/groups/single/default-front.php +1 -0
  216. bp-templates/bp-nouveau/buddypress/groups/single/group-header.php +1 -1
  217. bp-templates/bp-nouveau/buddypress/groups/single/request-membership.php +1 -1
  218. bp-templates/bp-nouveau/buddypress/members/index.php +4 -1
  219. bp-templates/bp-nouveau/buddypress/members/members-loop.php +13 -11
  220. bp-templates/bp-nouveau/buddypress/members/single/default-front.php +1 -0
  221. bp-templates/bp-nouveau/buddypress/members/single/settings/general.php +6 -1
  222. bp-templates/bp-nouveau/common-styles/_bp_activity_entries.scss +1 -1
  223. bp-templates/bp-nouveau/common-styles/_bp_filters.scss +1 -1
  224. bp-templates/bp-nouveau/common-styles/_bp_generic_and_typography.scss +1 -4
  225. bp-templates/bp-nouveau/common-styles/_bp_layouts.scss +2 -3
  226. bp-templates/bp-nouveau/common-styles/_bp_members_loop.scss +8 -1
  227. bp-templates/bp-nouveau/common-styles/_bp_navigation.scss +0 -4
  228. bp-templates/bp-nouveau/css/buddypress-rtl.css +8 -6
  229. bp-templates/bp-nouveau/css/buddypress-rtl.min.css +1 -1
  230. bp-templates/bp-nouveau/css/buddypress.css +8 -6
  231. bp-templates/bp-nouveau/css/buddypress.min.css +1 -1
  232. bp-templates/bp-nouveau/includes/activity/functions.php +1 -1
  233. bp-templates/bp-nouveau/includes/blogs/template-tags.php +9 -9
  234. bp-templates/bp-nouveau/includes/customizer.php +24 -0
  235. bp-templates/bp-nouveau/includes/functions.php +2 -0
  236. bp-templates/bp-nouveau/includes/groups/functions.php +2 -0
  237. bp-templates/bp-nouveau/includes/groups/loader.php +5 -1
  238. bp-templates/bp-nouveau/includes/groups/template-tags.php +1 -8
  239. bp-templates/bp-nouveau/includes/members/functions.php +6 -4
  240. bp-templates/bp-nouveau/includes/members/loader.php +5 -1
  241. bp-templates/bp-nouveau/includes/members/template-tags.php +40 -8
  242. bp-templates/bp-nouveau/includes/messages/functions.php +2 -0
  243. bp-templates/bp-nouveau/includes/template-tags.php +52 -1
  244. bp-templates/bp-nouveau/js/buddypress-messages.js +61 -61
  245. bp-templates/bp-nouveau/js/buddypress-notifications.js +7 -7
  246. bp-templates/bp-nouveau/js/buddypress-nouveau.js +49 -49
  247. bp-templates/bp-nouveau/js/buddypress-xprofile.js +3 -3
  248. bp-templates/bp-nouveau/js/customizer.js +2 -2
  249. bp-templates/bp-nouveau/js/password-verify.js +2 -2
  250. bp-xprofile/admin/js/admin.js +20 -20
  251. bp-xprofile/bp-xprofile-activity.php +6 -2
  252. bp-xprofile/bp-xprofile-admin.php +27 -25
  253. bp-xprofile/bp-xprofile-cache.php +1 -1
  254. bp-xprofile/bp-xprofile-filters.php +2 -2
  255. bp-xprofile/bp-xprofile-functions.php +20 -51
  256. bp-xprofile/bp-xprofile-template.php +10 -34
  257. bp-xprofile/classes/class-bp-rest-xprofile-data-endpoint.php +12 -12
  258. bp-xprofile/classes/class-bp-rest-xprofile-fields-endpoint.php +136 -102
  259. bp-xprofile/classes/class-bp-xprofile-component.php +4 -57
  260. bp-xprofile/classes/class-bp-xprofile-field-type.php +1 -1
  261. bp-xprofile/classes/class-bp-xprofile-field.php +21 -9
  262. bp-xprofile/classes/class-bp-xprofile-group.php +3 -3
  263. bp-xprofile/classes/class-bp-xprofile-query.php +1 -1
  264. bp-xprofile/classes/class-bp-xprofile-user-admin.php +4 -117
  265. bp-xprofile/screens/change-cover-image.php +0 -37
  266. bp-xprofile/screens/settings-profile.php +1 -1
  267. buddypress.pot +5423 -5025
  268. class-buddypress.php +102 -92
  269. cli/license.txt +280 -0
  270. composer.json +1 -1
bp-activity/actions/feeds.php CHANGED
@@ -24,9 +24,8 @@ function bp_activity_action_sitewide_feed() {
24
buddypress()->activity->feed = new BP_Activity_Feed( array(
25
'id' => 'sitewide',
26
27
- /* translators: Sitewide activity RSS title - "[Site Name] | Site Wide Activity" */
28
'title' => sprintf( __( '%s | Site-Wide Activity', 'buddypress' ), bp_get_site_name() ),
29
-
30
'link' => bp_get_activity_directory_permalink(),
31
'description' => __( 'Activity feed for the entire site.', 'buddypress' ),
32
'activity_args' => 'display_comments=threaded'
@@ -50,10 +49,11 @@ function bp_activity_action_personal_feed() {
50
buddypress()->activity->feed = new BP_Activity_Feed( array(
51
'id' => 'personal',
52
53
- /* translators: Personal activity RSS title - "[Site Name] | [User Display Name] | Activity" */
54
- 'title' => sprintf( __( '%1$s | %2$s | Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ),
55
-
56
'link' => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() ),
57
'description' => sprintf( __( 'Activity feed for %s.', 'buddypress' ), bp_get_displayed_user_fullname() ),
58
'activity_args' => 'user_id=' . bp_displayed_user_id()
59
) );
@@ -76,10 +76,11 @@ function bp_activity_action_friends_feed() {
76
buddypress()->activity->feed = new BP_Activity_Feed( array(
77
'id' => 'friends',
78
79
- /* translators: Friends activity RSS title - "[Site Name] | [User Display Name] | Friends Activity" */
80
'title' => sprintf( __( '%1$s | %2$s | Friends Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ),
81
-
82
'link' => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_friends_slug() ),
83
'description' => sprintf( __( "Activity feed for %s's friends.", 'buddypress' ), bp_get_displayed_user_fullname() ),
84
'activity_args' => 'scope=friends'
85
) );
@@ -106,10 +107,11 @@ function bp_activity_action_my_groups_feed() {
106
buddypress()->activity->feed = new BP_Activity_Feed( array(
107
'id' => 'mygroups',
108
109
- /* translators: Member groups activity RSS title - "[Site Name] | [User Display Name] | Groups Activity" */
110
'title' => sprintf( __( '%1$s | %2$s | Group Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ),
111
-
112
'link' => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_groups_slug() ),
113
'description' => sprintf( __( "Public group activity feed of which %s is a member.", 'buddypress' ), bp_get_displayed_user_fullname() ),
114
'activity_args' => array(
115
'object' => buddypress()->groups->id,
@@ -140,10 +142,11 @@ function bp_activity_action_mentions_feed() {
140
buddypress()->activity->feed = new BP_Activity_Feed( array(
141
'id' => 'mentions',
142
143
- /* translators: User mentions activity RSS title - "[Site Name] | [User Display Name] | Mentions" */
144
'title' => sprintf( __( '%1$s | %2$s | Mentions', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ),
145
-
146
'link' => bp_displayed_user_domain() . bp_get_activity_slug() . '/mentions/',
147
'description' => sprintf( __( "Activity feed mentioning %s.", 'buddypress' ), bp_get_displayed_user_fullname() ),
148
'activity_args' => array(
149
'search_terms' => '@' . bp_core_get_username( bp_displayed_user_id() )
@@ -172,10 +175,11 @@ function bp_activity_action_favorites_feed() {
172
buddypress()->activity->feed = new BP_Activity_Feed( array(
173
'id' => 'favorites',
174
175
- /* translators: User activity favorites RSS title - "[Site Name] | [User Display Name] | Favorites" */
176
'title' => sprintf( __( '%1$s | %2$s | Favorites', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ),
177
-
178
'link' => bp_displayed_user_domain() . bp_get_activity_slug() . '/favorites/',
179
'description' => sprintf( __( "Activity feed of %s's favorites.", 'buddypress' ), bp_get_displayed_user_fullname() ),
180
'activity_args' => 'include=' . $fav_ids
181
) );
24
buddypress()->activity->feed = new BP_Activity_Feed( array(
25
'id' => 'sitewide',
26
27
+ /* translators: %s Site Name */
28
'title' => sprintf( __( '%s | Site-Wide Activity', 'buddypress' ), bp_get_site_name() ),
29
'link' => bp_get_activity_directory_permalink(),
30
'description' => __( 'Activity feed for the entire site.', 'buddypress' ),
31
'activity_args' => 'display_comments=threaded'
49
buddypress()->activity->feed = new BP_Activity_Feed( array(
50
'id' => 'personal',
51
52
+ /* translators: 1: Site Name. 2: User Display Name. */
53
+ 'title' => sprintf( _x( '%1$s | %2$s | Activity', 'Personal activity feed title', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ),
54
'link' => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() ),
55
+
56
+ /* translators: %s: User Display Name */
57
'description' => sprintf( __( 'Activity feed for %s.', 'buddypress' ), bp_get_displayed_user_fullname() ),
58
'activity_args' => 'user_id=' . bp_displayed_user_id()
59
) );
76
buddypress()->activity->feed = new BP_Activity_Feed( array(
77
'id' => 'friends',
78
79
+ /* translators: 1: Site Name 2: User Display Name */
80
'title' => sprintf( __( '%1$s | %2$s | Friends Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ),
81
'link' => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_friends_slug() ),
82
+
83
+ /* translators: %s: User Display Name */
84
'description' => sprintf( __( "Activity feed for %s's friends.", 'buddypress' ), bp_get_displayed_user_fullname() ),
85
'activity_args' => 'scope=friends'
86
) );
107
buddypress()->activity->feed = new BP_Activity_Feed( array(
108
'id' => 'mygroups',
109
110
+ /* translators: 1: Site Name 2: User Display Name */
111
'title' => sprintf( __( '%1$s | %2$s | Group Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ),
112
'link' => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_groups_slug() ),
113
+
114
+ /* translators: %s: User Display Name */
115
'description' => sprintf( __( "Public group activity feed of which %s is a member.", 'buddypress' ), bp_get_displayed_user_fullname() ),
116
'activity_args' => array(
117
'object' => buddypress()->groups->id,
142
buddypress()->activity->feed = new BP_Activity_Feed( array(
143
'id' => 'mentions',
144
145
+ /* translators: 1: Site Name 2: User Display Name */
146
'title' => sprintf( __( '%1$s | %2$s | Mentions', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ),
147
'link' => bp_displayed_user_domain() . bp_get_activity_slug() . '/mentions/',
148
+
149
+ /* translators: %s: User Display Name */
150
'description' => sprintf( __( "Activity feed mentioning %s.", 'buddypress' ), bp_get_displayed_user_fullname() ),
151
'activity_args' => array(
152
'search_terms' => '@' . bp_core_get_username( bp_displayed_user_id() )
175
buddypress()->activity->feed = new BP_Activity_Feed( array(
176
'id' => 'favorites',
177
178
+ /* translators: 1: Site Name 2: User Display Name */
179
'title' => sprintf( __( '%1$s | %2$s | Favorites', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ),
180
'link' => bp_displayed_user_domain() . bp_get_activity_slug() . '/favorites/',
181
+
182
+ /* translators: %s: User Display Name */
183
'description' => sprintf( __( "Activity feed of %s's favorites.", 'buddypress' ), bp_get_displayed_user_fullname() ),
184
'activity_args' => 'include=' . $fav_ids
185
) );
bp-activity/admin/js/admin.js CHANGED
@@ -2,7 +2,7 @@
2
(function( $ ) {
3
4
/**
5
- * Activity reply object for the activity index screen
6
*
7
* @since 1.6.0
8
*/
@@ -18,7 +18,7 @@ var activityReply = {
18
$(document).on( 'click', '#bp-activities-container a.cancel', activityReply.close );
19
$(document).on( 'click', '#bp-activities-container a.save', activityReply.send );
20
21
- // Close textarea on escape
22
$(document).on( 'keyup', '#bp-activities:visible', function( e ) {
23
if ( 27 === e.which ) {
24
activityReply.close();
@@ -32,7 +32,7 @@ var activityReply = {
32
* @since 1.6.0
33
*/
34
open : function() {
35
- // Hide the container row, and move it to the new location
36
var box = $( '#bp-activities-container' ).hide();
37
$( this ).parents( 'tr' ).after( box );
38
@@ -49,13 +49,13 @@ var activityReply = {
49
* @since 1.6.0
50
*/
51
close : function() {
52
- // Hide the container row
53
$('#bp-activities-container').fadeOut( '200', function () {
54
55
- // Empty and unfocus the text area
56
$( '#bp-activities' ).val( '' ).blur();
57
58
- // Remove any error message and disable the spinner
59
$( '#bp-replysubmit .error' ).html( '' ).hide();
60
$( '#bp-replysubmit .waiting' ).hide();
61
});
@@ -69,27 +69,27 @@ var activityReply = {
69
* @since 1.6.0
70
*/
71
send : function() {
72
- // Hide any existing error message, and show the loading spinner
73
$( '#bp-replysubmit .error' ).hide();
74
$( '#bp-replysubmit .waiting' ).show();
75
76
- // Grab the nonce
77
var reply = {};
78
reply['_ajax_nonce-bp-activity-admin-reply'] = $( '#bp-activities-container input[name="_ajax_nonce-bp-activity-admin-reply"]' ).val();
79
80
- // Get the rest of the data
81
reply.action = 'bp-activity-admin-reply';
82
reply.content = $( '#bp-activities' ).val();
83
reply.parent_id = $( '#bp-activities-container' ).prev().data( 'parent_id' );
84
reply.root_id = $( '#bp-activities-container' ).prev().data( 'root_id' );
85
86
- // Make the AJAX call
87
$.ajax({
88
data : reply,
89
type : 'POST',
90
url : ajaxurl,
91
92
- // Callbacks
93
error : function( r ) { activityReply.error( r ); },
94
success : function( r ) { activityReply.show( r ); }
95
});
@@ -98,7 +98,7 @@ var activityReply = {
98
},
99
100
/**
101
- * send() error message handler
102
*
103
* @since 1.6.0
104
*/
@@ -116,14 +116,14 @@ var activityReply = {
116
},
117
118
/**
119
- * send() success handler
120
*
121
* @since 1.6.0
122
*/
123
show : function ( xml ) {
124
var bg, id, response;
125
126
- // Handle any errors in the response
127
if ( typeof( xml ) === 'string' ) {
128
activityReply.error( { 'responseText': xml } );
129
return false;
@@ -139,17 +139,17 @@ var activityReply = {
139
// Close and reset the reply row, and add the new Activity item into the list.
140
$('#bp-activities-container').fadeOut( '200', function () {
141
142
- // Empty and unfocus the text area
143
$( '#bp-activities' ).val( '' ).blur();
144
145
- // Remove any error message and disable the spinner
146
$( '#bp-replysubmit .error' ).html( '' ).hide();
147
$( '#bp-replysubmit .waiting' ).hide();
148
149
- // Insert new activity item
150
$( '#bp-activities-container' ).before( response.data );
151
152
- // Get background colour and animate the flash
153
id = $( '#activity-' + response.id );
154
bg = id.closest( '.widefat' ).css( 'backgroundColor' );
155
id.animate( { 'backgroundColor': '#CEB' }, 300 ).animate( { 'backgroundColor': bg }, 300 );
@@ -158,10 +158,10 @@ var activityReply = {
158
};
159
160
$(document).ready( function () {
161
- // Create the Activity reply object after domready event
162
activityReply.init();
163
164
- // On the edit screen, unload the close/open toggle js for the action & content metaboxes
165
$( '#bp_activity_action h3, #bp_activity_content h3' ).unbind( 'click' );
166
167
// redo the post box toggles to reset the one made by comment.js in favor
2
(function( $ ) {
3
4
/**
5
+ * Activity reply object for the activity index screen.
6
*
7
* @since 1.6.0
8
*/
18
$(document).on( 'click', '#bp-activities-container a.cancel', activityReply.close );
19
$(document).on( 'click', '#bp-activities-container a.save', activityReply.send );
20
21
+ // Close textarea on escape.
22
$(document).on( 'keyup', '#bp-activities:visible', function( e ) {
23
if ( 27 === e.which ) {
24
activityReply.close();
32
* @since 1.6.0
33
*/
34
open : function() {
35
+ // Hide the container row, and move it to the new location.
36
var box = $( '#bp-activities-container' ).hide();
37
$( this ).parents( 'tr' ).after( box );
38
49
* @since 1.6.0
50
*/
51
close : function() {
52
+ // Hide the container row.
53
$('#bp-activities-container').fadeOut( '200', function () {
54
55
+ // Empty and unfocus the text area.
56
$( '#bp-activities' ).val( '' ).blur();
57
58
+ // Remove any error message and disable the spinner.
59
$( '#bp-replysubmit .error' ).html( '' ).hide();
60
$( '#bp-replysubmit .waiting' ).hide();
61
});
69
* @since 1.6.0
70
*/
71
send : function() {
72
+ // Hide any existing error message, and show the loading spinner.
73
$( '#bp-replysubmit .error' ).hide();
74
$( '#bp-replysubmit .waiting' ).show();
75
76
+ // Grab the nonce.
77
var reply = {};
78
reply['_ajax_nonce-bp-activity-admin-reply'] = $( '#bp-activities-container input[name="_ajax_nonce-bp-activity-admin-reply"]' ).val();
79
80
+ // Get the rest of the data.
81
reply.action = 'bp-activity-admin-reply';
82
reply.content = $( '#bp-activities' ).val();
83
reply.parent_id = $( '#bp-activities-container' ).prev().data( 'parent_id' );
84
reply.root_id = $( '#bp-activities-container' ).prev().data( 'root_id' );
85
86
+ // Make the AJAX call.
87
$.ajax({
88
data : reply,
89
type : 'POST',
90
url : ajaxurl,
91
92
+ // Callbacks.
93
error : function( r ) { activityReply.error( r ); },
94
success : function( r ) { activityReply.show( r ); }
95
});
98
},
99
100
/**
101
+ * send() error message handler.
102
*
103
* @since 1.6.0
104
*/
116
},
117
118
/**
119
+ * send() success handler.
120
*
121
* @since 1.6.0
122
*/
123
show : function ( xml ) {
124
var bg, id, response;
125
126
+ // Handle any errors in the response.
127
if ( typeof( xml ) === 'string' ) {
128
activityReply.error( { 'responseText': xml } );
129
return false;
139
// Close and reset the reply row, and add the new Activity item into the list.
140
$('#bp-activities-container').fadeOut( '200', function () {
141
142
+ // Empty and unfocus the text area.
143
$( '#bp-activities' ).val( '' ).blur();
144
145
+ // Remove any error message and disable the spinner.
146
$( '#bp-replysubmit .error' ).html( '' ).hide();
147
$( '#bp-replysubmit .waiting' ).hide();
148
149
+ // Insert new activity item.
150
$( '#bp-activities-container' ).before( response.data );
151
152
+ // Get background colour and animate the flash.
153
id = $( '#activity-' + response.id );
154
bg = id.closest( '.widefat' ).css( 'backgroundColor' );
155
id.animate( { 'backgroundColor': '#CEB' }, 300 ).animate( { 'backgroundColor': bg }, 300 );
158
};
159
160
$(document).ready( function () {
161
+ // Create the Activity reply object after domready event.
162
activityReply.init();
163
164
+ // On the edit screen, unload the close/open toggle js for the action & content metaboxes.
165
$( '#bp_activity_action h3, #bp_activity_content h3' ).unbind( 'click' );
166
167
// redo the post box toggles to reset the one made by comment.js in favor
bp-activity/bp-activity-admin.php CHANGED
@@ -29,8 +29,8 @@ function bp_activity_add_admin_menu() {
29
30
// Add our screen.
31
$hook = add_menu_page(
32
- _x( 'Activity', 'Admin Dashbord SWA page title', 'buddypress' ),
33
- _x( 'Activity', 'Admin Dashbord SWA menu', 'buddypress' ),
34
'bp_moderate',
35
'bp-activity',
36
'bp_activity_admin',
@@ -75,7 +75,7 @@ function bp_activity_admin_reply() {
75
$parent_id = ! empty( $_REQUEST['parent_id'] ) ? (int) $_REQUEST['parent_id'] : 0;
76
$root_id = ! empty( $_REQUEST['root_id'] ) ? (int) $_REQUEST['root_id'] : 0;
77
78
- // $parent_id is required
79
if ( empty( $parent_id ) )
80
die( '-1' );
81
@@ -356,7 +356,7 @@ function bp_activity_admin_load() {
356
check_admin_referer( 'spam-activity_' . $activity_ids[0] );
357
}
358
359
- // Initialise counters for how many of each type of item we perform an action on.
360
$deleted = $spammed = $unspammed = 0;
361
362
// Store any errors that occurs when updating the database items.
@@ -660,7 +660,12 @@ function bp_activity_admin_edit() {
660
do_action_ref_array( 'bp_activity_admin_edit', array( &$activity ) ); ?>
661
662
<div class="wrap">
663
- <h1><?php printf( __( 'Editing Activity (ID #%s)', 'buddypress' ), number_format_i18n( (int) $_REQUEST['aid'] ) ); ?></h1>
664
665
<?php if ( ! empty( $activity ) ) : ?>
666
@@ -761,7 +766,12 @@ function bp_activity_admin_edit_metabox_status( $item ) {
761
$datef = __( 'M j, Y @ G:i', 'buddypress' );
762
$date = date_i18n( $datef, strtotime( $item->date_recorded ) );
763
?>
764
- <span id="timestamp"><?php printf( __( 'Submitted on: %s', 'buddypress' ), '<strong>' . $date . '</strong>' ); ?></span>&nbsp;<a href="#edit_timestamp" class="edit-timestamp hide-if-no-js" tabindex='4'><?php _e( 'Edit', 'buddypress' ); ?></a>
765
766
<div id='timestampdiv' class='hide-if-js'>
767
<?php touch_time( 1, 0, 5 ); ?>
@@ -899,7 +909,16 @@ function bp_activity_admin_edit_metabox_type( $item ) {
899
* of the list.
900
*/
901
if ( ! isset( $actions[ $selected ] ) ) {
902
- _doing_it_wrong( __FUNCTION__, sprintf( __( 'This activity item has a type (%s) that is not registered using bp_activity_set_action(), so no label is available.', 'buddypress' ), $selected ), '2.0.0' );
903
$actions[ $selected ] = $selected;
904
}
905
@@ -973,11 +992,14 @@ function bp_activity_admin_index() {
973
// Reindex array.
974
$errors = array_values( $errors );
975
976
- if ( $deleted > 0 )
977
$messages[] = sprintf( _n( '%s activity item has been permanently deleted.', '%s activity items have been permanently deleted.', $deleted, 'buddypress' ), number_format_i18n( $deleted ) );
978
979
if ( ! empty( $errors ) ) {
980
if ( 1 == count( $errors ) ) {
981
$messages[] = sprintf( __( 'An error occurred when trying to update activity ID #%s.', 'buddypress' ), number_format_i18n( $errors[0] ) );
982
983
} else {
@@ -986,7 +1008,7 @@ function bp_activity_admin_index() {
986
987
// Display each error as a list item.
988
foreach ( $errors as $error ) {
989
- // Translators: This is a bulleted list of item IDs.
990
$error_msg .= '<li>' . sprintf( __( '#%s', 'buddypress' ), number_format_i18n( $error ) ) . '</li>';
991
}
992
@@ -995,14 +1017,19 @@ function bp_activity_admin_index() {
995
}
996
}
997
998
- if ( $spammed > 0 )
999
$messages[] = sprintf( _n( '%s activity item has been successfully spammed.', '%s activity items have been successfully spammed.', $spammed, 'buddypress' ), number_format_i18n( $spammed ) );
1000
1001
- if ( $unspammed > 0 )
1002
$messages[] = sprintf( _n( '%s activity item has been successfully unspammed.', '%s activity items have been successfully unspammed.', $unspammed, 'buddypress' ), number_format_i18n( $unspammed ) );
1003
1004
- if ( $updated > 0 )
1005
$messages[] = __( 'The activity item has been updated successfully.', 'buddypress' );
1006
}
1007
1008
// Prepare the activity items for display.
@@ -1020,13 +1047,21 @@ function bp_activity_admin_index() {
1020
<div class="wrap">
1021
<h1>
1022
<?php if ( !empty( $_REQUEST['aid'] ) ) : ?>
1023
- <?php printf( __( 'Activity related to ID #%s', 'buddypress' ), number_format_i18n( (int) $_REQUEST['aid'] ) ); ?>
1024
<?php else : ?>
1025
<?php _ex( 'Activity', 'Admin SWA page', 'buddypress' ); ?>
1026
<?php endif; ?>
1027
1028
<?php if ( !empty( $_REQUEST['s'] ) ) : ?>
1029
- <span class="subtitle"><?php printf( __( 'Search results for &#8220;%s&#8221;', 'buddypress' ), wp_html_excerpt( esc_html( stripslashes( $_REQUEST['s'] ) ), 50 ) ); ?></span>
1030
<?php endif; ?>
1031
</h1>
1032
29
30
// Add our screen.
31
$hook = add_menu_page(
32
+ _x( 'Activity', 'Admin Dashboard SWA page title', 'buddypress' ),
33
+ _x( 'Activity', 'Admin Dashboard SWA menu', 'buddypress' ),
34
'bp_moderate',
35
'bp-activity',
36
'bp_activity_admin',
75
$parent_id = ! empty( $_REQUEST['parent_id'] ) ? (int) $_REQUEST['parent_id'] : 0;
76
$root_id = ! empty( $_REQUEST['root_id'] ) ? (int) $_REQUEST['root_id'] : 0;
77
78
+ // $parent_id is required.
79
if ( empty( $parent_id ) )
80
die( '-1' );
81
356
check_admin_referer( 'spam-activity_' . $activity_ids[0] );
357
}
358
359
+ // Initialize counters for how many of each type of item we perform an action on.
360
$deleted = $spammed = $unspammed = 0;
361
362
// Store any errors that occurs when updating the database items.
660
do_action_ref_array( 'bp_activity_admin_edit', array( &$activity ) ); ?>
661
662
<div class="wrap">
663
+ <h1>
664
+ <?php
665
+ /* translators: %s: the activity ID */
666
+ printf( __( 'Editing Activity (ID #%s)', 'buddypress' ), number_format_i18n( (int) $_REQUEST['aid'] ) );
667
+ ?>
668
+ </h1>
669
670
<?php if ( ! empty( $activity ) ) : ?>
671
766
$datef = __( 'M j, Y @ G:i', 'buddypress' );
767
$date = date_i18n( $datef, strtotime( $item->date_recorded ) );
768
?>
769
+ <span id="timestamp">
770
+ <?php
771
+ /* translators: %s: the date the activity was submitted on */
772
+ printf( __( 'Submitted on: %s', 'buddypress' ), '<strong>' . $date . '</strong>' );
773
+ ?>
774
+ </span>&nbsp;<a href="#edit_timestamp" class="edit-timestamp hide-if-no-js" tabindex='4'><?php _e( 'Edit', 'buddypress' ); ?></a>
775
776
<div id='timestampdiv' class='hide-if-js'>
777
<?php touch_time( 1, 0, 5 ); ?>
909
* of the list.
910
*/
911
if ( ! isset( $actions[ $selected ] ) ) {
912
+ _doing_it_wrong(
913
+ __FUNCTION__,
914
+ sprintf(
915
+ /* translators: %s: the name of the activity type */
916
+ __( 'This activity item has a type (%s) that is not registered using bp_activity_set_action(), so no label is available.', 'buddypress' ),
917
+ $selected
918
+ ),
919
+ '2.0.0'
920
+ );
921
+
922
$actions[ $selected ] = $selected;
923
}
924
992
// Reindex array.
993
$errors = array_values( $errors );
994
995
+ if ( $deleted > 0 ) {
996
+ /* translators: %s: the number of permanently deleted activities */
997
$messages[] = sprintf( _n( '%s activity item has been permanently deleted.', '%s activity items have been permanently deleted.', $deleted, 'buddypress' ), number_format_i18n( $deleted ) );
998
+ }
999
1000
if ( ! empty( $errors ) ) {
1001
if ( 1 == count( $errors ) ) {
1002
+ /* translators: %s: the ID of the activity which errored during an update */
1003
$messages[] = sprintf( __( 'An error occurred when trying to update activity ID #%s.', 'buddypress' ), number_format_i18n( $errors[0] ) );
1004
1005
} else {
1008
1009
// Display each error as a list item.
1010
foreach ( $errors as $error ) {
1011
+ /* Translators: %s: the activity ID */
1012
$error_msg .= '<li>' . sprintf( __( '#%s', 'buddypress' ), number_format_i18n( $error ) ) . '</li>';
1013
}
1014
1017
}
1018
}
1019
1020
+ if ( $spammed > 0 ) {
1021
+ /* translators: %s: the number of activities successfully marked as spam */
1022
$messages[] = sprintf( _n( '%s activity item has been successfully spammed.', '%s activity items have been successfully spammed.', $spammed, 'buddypress' ), number_format_i18n( $spammed ) );
1023
+ }
1024
1025
+ if ( $unspammed > 0 ) {
1026
+ /* translators: %s: the number of activities successfully marked as ham */
1027
$messages[] = sprintf( _n( '%s activity item has been successfully unspammed.', '%s activity items have been successfully unspammed.', $unspammed, 'buddypress' ), number_format_i18n( $unspammed ) );
1028
+ }
1029
1030
+ if ( $updated > 0 ) {
1031
$messages[] = __( 'The activity item has been updated successfully.', 'buddypress' );
1032
+ }
1033
}
1034
1035
// Prepare the activity items for display.
1047
<div class="wrap">
1048
<h1>
1049
<?php if ( !empty( $_REQUEST['aid'] ) ) : ?>
1050
+ <?php
1051
+ /* translators: %s: the activity ID */
1052
+ printf( __( 'Activity related to ID #%s', 'buddypress' ), number_format_i18n( (int) $_REQUEST['aid'] ) );
1053
+ ?>
1054
<?php else : ?>
1055
<?php _ex( 'Activity', 'Admin SWA page', 'buddypress' ); ?>
1056
<?php endif; ?>
1057
1058
<?php if ( !empty( $_REQUEST['s'] ) ) : ?>
1059
+ <span class="subtitle">
1060
+ <?php
1061
+ /* translators: %s: the activity search terms */
1062
+ printf( __( 'Search results for &#8220;%s&#8221;', 'buddypress' ), wp_html_excerpt( esc_html( stripslashes( $_REQUEST['s'] ) ), 50 ) );
1063
+ ?>
1064
+ </span>
1065
<?php endif; ?>
1066
</h1>
1067
bp-activity/bp-activity-adminbar.php CHANGED
@@ -26,7 +26,7 @@ function bp_activity_admin_menu() {
26
return;
27
}
28
29
- // Only show this menu to super admins
30
if ( ! bp_current_user_can( 'bp_moderate' ) ) {
31
return;
32
}
@@ -38,7 +38,7 @@ function bp_activity_admin_menu() {
38
), bp_get_admin_url( 'admin.php' ) );
39
40
// Add the top-level Edit Activity button.
41
- $wp_admin_bar->add_menu( array(
42
'id' => 'activity-admin',
43
'title' => __( 'Edit Activity', 'buddypress' ),
44
'href' => esc_url( $activity_edit_link ),
26
return;
27
}
28
29
+ // Only show this menu to super admins.
30
if ( ! bp_current_user_can( 'bp_moderate' ) ) {
31
return;
32
}
38
), bp_get_admin_url( 'admin.php' ) );
39
40
// Add the top-level Edit Activity button.
41
+ $wp_admin_bar->add_node( array(
42
'id' => 'activity-admin',
43
'title' => __( 'Edit Activity', 'buddypress' ),
44
'href' => esc_url( $activity_edit_link ),
bp-activity/bp-activity-akismet.php CHANGED
@@ -60,7 +60,7 @@ function bp_activity_akismet_delete_old_metadata() {
60
// Enforce a minimum of 1 day.
61
$interval = max( 1, absint( $interval ) );
62
63
- // _bp_akismet_submission meta values are large, so expire them after $interval days regardless of the activity status
64
$sql = $wpdb->prepare( "SELECT a.id FROM {$bp->activity->table_name} a LEFT JOIN {$bp->activity->table_name_meta} m ON a.id = m.activity_id WHERE m.meta_key = %s AND DATE_SUB(%s, INTERVAL {$interval} DAY) > a.date_recorded LIMIT 10000", '_bp_akismet_submission', current_time( 'mysql', 1 ) );
65
$activity_ids = $wpdb->get_col( $sql );
66
60
// Enforce a minimum of 1 day.
61
$interval = max( 1, absint( $interval ) );
62
63
+ // _bp_akismet_submission meta values are large, so expire them after $interval days regardless of the activity status.
64
$sql = $wpdb->prepare( "SELECT a.id FROM {$bp->activity->table_name} a LEFT JOIN {$bp->activity->table_name_meta} m ON a.id = m.activity_id WHERE m.meta_key = %s AND DATE_SUB(%s, INTERVAL {$interval} DAY) > a.date_recorded LIMIT 10000", '_bp_akismet_submission', current_time( 'mysql', 1 ) );
65
$activity_ids = $wpdb->get_col( $sql );
66
bp-activity/bp-activity-embeds.php CHANGED
@@ -100,7 +100,7 @@ function bp_activity_embed_has_activity( $activity_id = 0 ) {
100
$activity = (array) $activities_template->activities;
101
$activity = reset( $activity );
102
103
- // No need to requery if we already got the embed activity
104
if ( (int) $activity_id === $activity->id ) {
105
return $activities_template->has_activities();
106
}
@@ -234,10 +234,10 @@ function bp_activity_embed_media() {
234
$thumbnail = $oembed->thumbnail_url;
235
236
/* Non-oEmbed standard attributes */
237
- // Mixcloud
238
} elseif ( isset( $oembed->image ) ) {
239
$thumbnail = $oembed->image;
240
- // ReverbNation
241
} elseif ( isset( $oembed->{'thumbnail-url'} ) ) {
242
$thumbnail = $oembed->{'thumbnail-url'};
243
}
@@ -261,7 +261,7 @@ EOD;
261
$play_icon = sprintf( '<a rel="nofollow" class="play-btn" href="%1$s" onclick="top.location.href=\'%1$s\'">%2$s</a>', esc_url( $url ), $play_icon );
262
}
263
264
- // Thumb width
265
$thumb_width = isset( $oembed->thumbnail_width ) && 'photo' !== $oembed->type && (int) $oembed->thumbnail_width < 550 ? (int) $oembed->thumbnail_width : $width;
266
267
$float_width = 350;
@@ -274,17 +274,18 @@ EOD;
274
$caption .= sprintf( '<p class="caption-title"><strong>%s</strong></p>', apply_filters( 'single_post_title', $oembed->title ) );
275
}
276
277
- // Show description (non-oEmbed standard)
278
if ( isset( $oembed->description ) ) {
279
$caption .= sprintf( '<div class="caption-description">%s</div>', apply_filters( 'bp_activity_get_embed_excerpt', $oembed->description ) );
280
}
281
282
// Show author info.
283
if ( isset( $oembed->provider_name ) && isset( $oembed->author_name ) ) {
284
- /* translators: By [oEmbed author] on [oEmbed provider]. eg. By BuddyPress on YouTube. */
285
$anchor_text = sprintf( __( 'By %1$s on %2$s', 'buddypress' ), $oembed->author_name, $oembed->provider_name );
286
287
} elseif ( isset( $oembed->provider_name ) ) {
288
$anchor_text = sprintf( __( 'View on %s', 'buddypress' ), $oembed->provider_name );
289
}
290
100
$activity = (array) $activities_template->activities;
101
$activity = reset( $activity );
102
103
+ // No need to requery if we already got the embed activity.
104
if ( (int) $activity_id === $activity->id ) {
105
return $activities_template->has_activities();
106
}
234
$thumbnail = $oembed->thumbnail_url;
235
236
/* Non-oEmbed standard attributes */
237
+ // Mixcloud.
238
} elseif ( isset( $oembed->image ) ) {
239
$thumbnail = $oembed->image;
240
+ // ReverbNation.
241
} elseif ( isset( $oembed->{'thumbnail-url'} ) ) {
242
$thumbnail = $oembed->{'thumbnail-url'};
243
}
261
$play_icon = sprintf( '<a rel="nofollow" class="play-btn" href="%1$s" onclick="top.location.href=\'%1$s\'">%2$s</a>', esc_url( $url ), $play_icon );
262
}
263
264
+ // Thumb width.
265
$thumb_width = isset( $oembed->thumbnail_width ) && 'photo' !== $oembed->type && (int) $oembed->thumbnail_width < 550 ? (int) $oembed->thumbnail_width : $width;
266
267
$float_width = 350;
274
$caption .= sprintf( '<p class="caption-title"><strong>%s</strong></p>', apply_filters( 'single_post_title', $oembed->title ) );
275
}
276
277
+ // Show description (non-oEmbed standard).
278
if ( isset( $oembed->description ) ) {
279
$caption .= sprintf( '<div class="caption-description">%s</div>', apply_filters( 'bp_activity_get_embed_excerpt', $oembed->description ) );
280
}
281
282
// Show author info.
283
if ( isset( $oembed->provider_name ) && isset( $oembed->author_name ) ) {
284
+ /* translators: 1: oEmbed author. 2: oEmbed provider. eg. By BuddyPress on YouTube. */
285
$anchor_text = sprintf( __( 'By %1$s on %2$s', 'buddypress' ), $oembed->author_name, $oembed->provider_name );
286
287
} elseif ( isset( $oembed->provider_name ) ) {
288
+ /* translators: %s: oEmbed provider. */
289
$anchor_text = sprintf( __( 'View on %s', 'buddypress' ), $oembed->provider_name );
290
}
291
bp-activity/bp-activity-filters.php CHANGED
@@ -615,7 +615,7 @@ function bp_activity_heartbeat_strings( $strings = array() ) {
615
*/
616
$heartbeat_settings = apply_filters( 'heartbeat_settings', array() );
617
if ( ! empty( $heartbeat_settings['interval'] ) ) {
618
- // 'Fast' is 5
619
$global_pulse = is_numeric( $heartbeat_settings['interval'] ) ? absint( $heartbeat_settings['interval'] ) : 5;
620
}
621
615
*/
616
$heartbeat_settings = apply_filters( 'heartbeat_settings', array() );
617
if ( ! empty( $heartbeat_settings['interval'] ) ) {
618
+ // 'Fast' is 5.
619
$global_pulse = is_numeric( $heartbeat_settings['interval'] ) ? absint( $heartbeat_settings['interval'] ) : 5;
620
}
621
bp-activity/bp-activity-functions.php CHANGED
@@ -522,12 +522,12 @@ function bp_activity_get_post_type_tracking_args( $post_type ) {
522
$post_type_activity->new_post_type_action_ms = $post_type_object->labels->bp_activity_new_post_ms;
523
}
524
525
- // If the post type supports comments and has a comment action id, build the comments tracking args
526
if ( $post_type_support_comments && ! empty( $post_type_activity->comment_action_id ) ) {
527
- // Init a new container for the activity type for comments
528
$post_type_activity->comments_tracking = new stdClass();
529
530
- // Build the activity type for comments
531
$post_type_activity->comments_tracking->component_id = $post_type_activity->component_id;
532
$post_type_activity->comments_tracking->action_id = $post_type_activity->comment_action_id;
533
@@ -597,9 +597,9 @@ function bp_activity_get_post_types_tracking_args() {
597
$track_post_type = bp_activity_get_post_type_tracking_args( $post_type );
598
599
if ( ! empty( $track_post_type ) ) {
600
- // Set the post type comments tracking args
601
if ( ! empty( $track_post_type->comments_tracking->action_id ) ) {
602
- // Used to check support for comment tracking by activity type (new_post_type_comment)
603
$track_post_type->comments_tracking->comments_tracking = true;
604
605
// Used to be able to find the post type this activity type is associated to.
@@ -607,7 +607,7 @@ function bp_activity_get_post_types_tracking_args() {
607
608
$post_types_tracking_args[ $track_post_type->comments_tracking->action_id ] = $track_post_type->comments_tracking;
609
610
- // Used to check support for comment tracking by activity type (new_post_type)
611
$track_post_type->comments_tracking = true;
612
}
613
@@ -650,7 +650,7 @@ function bp_activity_type_supports( $activity_type = '', $feature = '' ) {
650
* eg. 'new_blog_post' and 'new_blog_comment' will both return true.
651
*/
652
case 'post-type-comment-tracking' :
653
- // Set the activity track global if not set yet
654
if ( empty( $bp->activity->track ) ) {
655
$bp->activity->track = bp_activity_get_post_types_tracking_args();
656
}
@@ -726,7 +726,7 @@ function bp_activity_post_type_get_tracking_arg( $activity_type, $arg = '' ) {
726
727
$bp = buddypress();
728
729
- // Set the activity track global if not set yet
730
if ( empty( $bp->activity->track ) ) {
731
$bp->activity->track = bp_activity_get_post_types_tracking_args();
732
}
@@ -1277,7 +1277,22 @@ function bp_activity_remove_all_user_data( $user_id = 0 ) {
1277
do_action( 'bp_activity_remove_all_user_data', $user_id );
1278
}
1279
add_action( 'wpmu_delete_user', 'bp_activity_remove_all_user_data' );
1280
- add_action( 'delete_user', 'bp_activity_remove_all_user_data' );
1281
1282
/**
1283
* Mark all of the user's activity as spam.
@@ -1523,7 +1538,11 @@ function bp_activity_generate_action_string( $activity ) {
1523
* @return string $action
1524
*/
1525
function bp_activity_format_activity_action_activity_update( $action, $activity ) {
1526
- $action = sprintf( esc_html__( '%s posted an update', 'buddypress' ), bp_core_get_userlink( $activity->user_id ) );
1527
1528
/**
1529
* Filters the formatted activity action update string.
@@ -1546,7 +1565,11 @@ function bp_activity_format_activity_action_activity_update( $action, $activity
1546
* @return string $action
1547
*/
1548
function bp_activity_format_activity_action_activity_comment( $action, $activity ) {
1549
- $action = sprintf( esc_html__( '%s posted a new activity comment', 'buddypress' ), bp_core_get_userlink( $activity->user_id ) );
1550
1551
/**
1552
* Filters the formatted activity action comment string.
@@ -1597,13 +1620,14 @@ function bp_activity_format_activity_action_custom_post_type_post( $action, $act
1597
if ( ! empty( $bp->activity->track[ $activity->type ]->new_post_type_action_ms ) ) {
1598
$action = sprintf( $bp->activity->track[ $activity->type ]->new_post_type_action_ms, $user_link, esc_url( $post_url ), $blog_link );
1599
} else {
1600
-
1601
$action = sprintf( esc_html_x( '%1$s wrote a new %2$s, on the site %3$s', 'Activity Custom Post Type post action', 'buddypress' ), $user_link, $post_link, $blog_link );
1602
}
1603
} else {
1604
if ( ! empty( $bp->activity->track[ $activity->type ]->new_post_type_action ) ) {
1605
$action = sprintf( $bp->activity->track[ $activity->type ]->new_post_type_action, $user_link, $post_url );
1606
} else {
1607
$action = sprintf( esc_html_x( '%1$s wrote a new %2$s', 'Activity Custom Post Type post action', 'buddypress' ), $user_link, $post_link );
1608
}
1609
}
@@ -1650,12 +1674,14 @@ function bp_activity_format_activity_action_custom_post_type_comment( $action, $
1650
if ( ! empty( $bp->activity->track[ $activity->type ]->new_post_type_comment_action_ms ) ) {
1651
$action = sprintf( $bp->activity->track[ $activity->type ]->new_post_type_comment_action_ms, $user_link, $activity->primary_link, $blog_link );
1652
} else {
1653
$action = sprintf( esc_html_x( '%1$s commented on the %2$s, on the site %3$s', 'Activity Custom Post Type comment action', 'buddypress' ), $user_link, $post_link, $blog_link );
1654
}
1655
} else {
1656
if ( ! empty( $bp->activity->track[ $activity->type ]->new_post_type_comment_action ) ) {
1657
$action = sprintf( $bp->activity->track[ $activity->type ]->new_post_type_comment_action, $user_link, $activity->primary_link );
1658
} else {
1659
$action = sprintf( esc_html_x( '%1$s commented on the %2$s', 'Activity Custom Post Type post comment action', 'buddypress' ), $user_link, $post_link );
1660
}
1661
}
@@ -1702,17 +1728,17 @@ function bp_activity_get( $args = '' ) {
1702
'max' => false, // Maximum number of results to return.
1703
'fields' => 'all',
1704
'page' => 1, // Page 1 without a per_page will result in no pagination.
1705
- 'per_page' => false, // results per page
1706
- 'sort' => 'DESC', // sort ASC or DESC
1707
'display_comments' => false, // False for no comments. 'stream' for within stream display, 'threaded' for below each activity item.
1708
1709
- 'search_terms' => false, // Pass search terms as a string
1710
- 'meta_query' => false, // Filter by activity meta. See WP_Meta_Query for format
1711
'date_query' => false, // Filter by date. See first parameter of WP_Date_Query for format.
1712
'filter_query' => false,
1713
'show_hidden' => false, // Show activity items that are hidden site-wide?
1714
'exclude' => false, // Comma-separated list of activity IDs to exclude.
1715
- 'in' => false, // Comma-separated list or array of activity IDs to which you
1716
// want to limit the query.
1717
'spam' => 'ham_only', // 'ham_only' (default), 'spam_only' or 'all'.
1718
'update_meta_cache' => true,
@@ -1788,7 +1814,7 @@ function bp_activity_get_specific( $args = '' ) {
1788
'page' => 1, // Page 1 without a per_page will result in no pagination.
1789
'per_page' => false, // Results per page.
1790
'show_hidden' => true, // When fetching specific items, show all.
1791
- 'sort' => 'DESC', // Sort ASC or DESC
1792
'spam' => 'ham_only', // Retrieve items marked as spam.
1793
'update_meta_cache' => true,
1794
), 'activity_get_specific' );
@@ -1861,8 +1887,8 @@ function bp_activity_add( $args = '' ) {
1861
1862
$r = bp_parse_args( $args, array(
1863
'id' => false, // Pass an existing activity ID to update an existing entry.
1864
- 'action' => '', // The activity action - e.g. "Jon Doe posted an update"
1865
- 'content' => '', // Optional: The content of the activity item e.g. "BuddyPress is awesome guys!"
1866
'component' => false, // The name/ID of the component e.g. groups, profile, mycomponent.
1867
'type' => false, // The activity type e.g. activity_update, profile_updated.
1868
'primary_link' => '', // Optional: The primary URL for this item in RSS feeds (defaults to activity permalink).
@@ -2298,20 +2324,20 @@ function bp_activity_post_type_unpublish( $post_id = 0, $post = null ) {
2298
* @return null|WP_Error|bool|int The ID of the activity on success. False on error.
2299
*/
2300
function bp_activity_post_type_comment( $comment_id = 0, $is_approved = true, $activity_post_object = null ) {
2301
- // Get the users comment
2302
$post_type_comment = get_comment( $comment_id );
2303
2304
- // Don't record activity if the comment hasn't been approved
2305
if ( empty( $is_approved ) ) {
2306
return false;
2307
}
2308
2309
- // Don't record activity if no email address has been included
2310
if ( empty( $post_type_comment->comment_author_email ) ) {
2311
return false;
2312
}
2313
2314
- // Don't record activity if the comment has already been marked as spam
2315
if ( 'spam' === $is_approved ) {
2316
return false;
2317
}
@@ -2319,18 +2345,18 @@ function bp_activity_post_type_comment( $comment_id = 0, $is_approved = true, $a
2319
// Get the user by the comment author email.
2320
$user = get_user_by( 'email', $post_type_comment->comment_author_email );
2321
2322
- // If user isn't registered, don't record activity
2323
if ( empty( $user ) ) {
2324
return false;
2325
}
2326
2327
- // Get the user_id
2328
$user_id = (int) $user->ID;
2329
2330
- // Get blog and post data
2331
$blog_id = get_current_blog_id();
2332
2333
- // Get the post
2334
$post_type_comment->post = get_post( $post_type_comment->comment_post_ID );
2335
2336
if ( ! is_a( $post_type_comment->post, 'WP_Post' ) ) {
@@ -2346,25 +2372,25 @@ function bp_activity_post_type_comment( $comment_id = 0, $is_approved = true, $a
2346
*/
2347
$is_post_status_not_allowed = (bool) apply_filters( 'bp_activity_post_type_is_post_status_allowed', 'publish' !== $post_type_comment->post->post_status || ! empty( $post_type_comment->post->post_password ) );
2348
2349
- // If this is a password protected post, or not a public post don't record the comment
2350
if ( $is_post_status_not_allowed ) {
2351
return false;
2352
}
2353
2354
- // Set post type
2355
$post_type = $post_type_comment->post->post_type;
2356
2357
if ( empty( $activity_post_object ) ) {
2358
// Get the post type tracking args.
2359
$activity_post_object = bp_activity_get_post_type_tracking_args( $post_type );
2360
2361
- // Bail if the activity type does not exist
2362
if ( empty( $activity_post_object->comments_tracking->action_id ) ) {
2363
return false;
2364
}
2365
}
2366
2367
- // Set the $activity_comment_object
2368
$activity_comment_object = $activity_post_object->comments_tracking;
2369
2370
/**
@@ -2503,13 +2529,13 @@ function bp_activity_post_type_remove_comment( $comment_id = 0, $activity_post_o
2503
// Get the post type tracking args.
2504
$activity_post_object = bp_activity_get_post_type_tracking_args( $post_type );
2505
2506
- // Bail if the activity type does not exist
2507
if ( empty( $activity_post_object->comments_tracking->action_id ) ) {
2508
return false;
2509
}
2510
}
2511
2512
- // Set the $activity_comment_object
2513
$activity_comment_object = $activity_post_object->comments_tracking;
2514
2515
if ( empty( $activity_comment_object->action_id ) ) {
@@ -3417,7 +3443,8 @@ function bp_activity_create_summary( $content, $activity ) {
3417
if ( $use_media_type === 'embeds' ) {
3418
$summary .= PHP_EOL . PHP_EOL . $extracted_media['url'];
3419
} elseif ( $use_media_type === 'images' ) {
3420
- $summary .= sprintf( ' <img src="%s">', esc_url( $extracted_media['url'] ) );
3421
} elseif ( in_array( $use_media_type, array( 'audio', 'videos' ), true ) ) {
3422
$summary .= PHP_EOL . PHP_EOL . $extracted_media['original']; // Full shortcode.
3423
}
@@ -4032,16 +4059,16 @@ function bp_activity_transition_post_type_comment_status( $new_status, $old_stat
4032
// Get the post type tracking args.
4033
$activity_post_object = bp_activity_get_post_type_tracking_args( $post_type );
4034
4035
- // Bail if the activity type does not exist
4036
if ( empty( $activity_post_object->comments_tracking->action_id ) ) {
4037
return false;
4038
4039
- // Set the $activity_comment_object
4040
} else {
4041
$activity_comment_object = $activity_post_object->comments_tracking;
4042
}
4043
4044
- // Init an empty activity ID
4045
$activity_id = 0;
4046
4047
/**
@@ -4065,7 +4092,7 @@ function bp_activity_transition_post_type_comment_status( $new_status, $old_stat
4065
$action = 'ham_activity';
4066
}
4067
4068
- // Get the activity
4069
if ( bp_disable_blogforum_comments() ) {
4070
$activity_id = bp_activity_get_activity_id( array(
4071
'component' => $activity_comment_object->component_id,
@@ -4093,7 +4120,7 @@ function bp_activity_transition_post_type_comment_status( $new_status, $old_stat
4093
return false;
4094
}
4095
4096
- // Check activity item exists
4097
if ( empty( $activity_id ) ) {
4098
// If no activity exists, but the comment has been approved, record it into the activity table.
4099
if ( 'approved' == $new_status ) {
@@ -4103,20 +4130,20 @@ function bp_activity_transition_post_type_comment_status( $new_status, $old_stat
4103
return;
4104
}
4105
4106
- // Create an activity object
4107
$activity = new BP_Activity_Activity( $activity_id );
4108
if ( empty( $activity->component ) ) {
4109
return;
4110
}
4111
4112
- // Spam/ham the activity if it's not already in that state
4113
if ( 'spam_activity' === $action && ! $activity->is_spam ) {
4114
bp_activity_mark_as_spam( $activity );
4115
} elseif ( 'ham_activity' == $action) {
4116
bp_activity_mark_as_ham( $activity );
4117
}
4118
4119
- // Add "new_post_type_comment" to the whitelisted activity types, so that the activity's Akismet history is generated
4120
$post_type_comment_action = $activity_comment_object->action_id;
4121
$comment_akismet_history = function ( $activity_types ) use ( $post_type_comment_action ) {
4122
$activity_types[] = $post_type_comment_action;
@@ -4125,16 +4152,16 @@ function bp_activity_transition_post_type_comment_status( $new_status, $old_stat
4125
};
4126
add_filter( 'bp_akismet_get_activity_types', $comment_akismet_history );
4127
4128
- // Make sure the activity change won't edit the comment if sync is on
4129
remove_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 );
4130
4131
- // Save the updated activity
4132
$activity->save();
4133
4134
- // Restore the action
4135
add_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 );
4136
4137
- // Remove the "new_blog_comment" activity type whitelist so we don't break anything
4138
remove_filter( 'bp_akismet_get_activity_types', $comment_akismet_history );
4139
}
4140
add_action( 'transition_comment_status', 'bp_activity_transition_post_type_comment_status', 10, 3 );
522
$post_type_activity->new_post_type_action_ms = $post_type_object->labels->bp_activity_new_post_ms;
523
}
524
525
+ // If the post type supports comments and has a comment action id, build the comments tracking args.
526
if ( $post_type_support_comments && ! empty( $post_type_activity->comment_action_id ) ) {
527
+ // Init a new container for the activity type for comments.
528
$post_type_activity->comments_tracking = new stdClass();
529
530
+ // Build the activity type for comments.
531
$post_type_activity->comments_tracking->component_id = $post_type_activity->component_id;
532
$post_type_activity->comments_tracking->action_id = $post_type_activity->comment_action_id;
533
597
$track_post_type = bp_activity_get_post_type_tracking_args( $post_type );
598
599
if ( ! empty( $track_post_type ) ) {
600
+ // Set the post type comments tracking args.
601
if ( ! empty( $track_post_type->comments_tracking->action_id ) ) {
602
+ // Used to check support for comment tracking by activity type (new_post_type_comment).
603
$track_post_type->comments_tracking->comments_tracking = true;
604
605
// Used to be able to find the post type this activity type is associated to.
607
608
$post_types_tracking_args[ $track_post_type->comments_tracking->action_id ] = $track_post_type->comments_tracking;
609
610
+ // Used to check support for comment tracking by activity type (new_post_type).
611
$track_post_type->comments_tracking = true;
612
}
613
650
* eg. 'new_blog_post' and 'new_blog_comment' will both return true.
651
*/
652
case 'post-type-comment-tracking' :
653
+ // Set the activity track global if not set yet.
654
if ( empty( $bp->activity->track ) ) {
655
$bp->activity->track = bp_activity_get_post_types_tracking_args();
656
}
726
727
$bp = buddypress();
728
729
+ // Set the activity track global if not set yet.
730
if ( empty( $bp->activity->track ) ) {
731
$bp->activity->track = bp_activity_get_post_types_tracking_args();
732
}
1277
do_action( 'bp_activity_remove_all_user_data', $user_id );
1278
}
1279
add_action( 'wpmu_delete_user', 'bp_activity_remove_all_user_data' );
1280
+
1281
+ /**
1282
+ * Deletes user activity data on the 'delete_user' hook.
1283
+ *
1284
+ * @since 6.0.0
1285
+ *
1286
+ * @param int $user_id The ID of the deleted user.
1287
+ */
1288
+ function bp_activity_remove_all_user_data_on_delete_user( $user_id ) {
1289
+ if ( ! bp_remove_user_data_on_delete_user_hook( 'activity', $user_id ) ) {
1290
+ return;
1291
+ }
1292
+
1293
+ bp_activity_remove_all_user_data( $user_id );
1294
+ }
1295
+ add_action( 'delete_user', 'bp_activity_remove_all_user_data_on_delete_user' );
1296
1297
/**
1298
* Mark all of the user's activity as spam.
1538
* @return string $action
1539
*/
1540
function bp_activity_format_activity_action_activity_update( $action, $activity ) {
1541
+ $action = sprintf(
1542
+ /* translators: %s: the activity author user link */
1543
+ esc_html__( '%s posted an update', 'buddypress' ),
1544
+ bp_core_get_userlink( $activity->user_id )
1545
+ );
1546
1547
/**
1548
* Filters the formatted activity action update string.
1565
* @return string $action
1566
*/
1567
function bp_activity_format_activity_action_activity_comment( $action, $activity ) {
1568
+ $action = sprintf(
1569
+ /* translators: %s: the activity author user link */
1570
+ esc_html__( '%s posted a new activity comment', 'buddypress' ),
1571
+ bp_core_get_userlink( $activity->user_id )
1572
+ );
1573
1574
/**
1575
* Filters the formatted activity action comment string.
1620
if ( ! empty( $bp->activity->track[ $activity->type ]->new_post_type_action_ms ) ) {
1621
$action = sprintf( $bp->activity->track[ $activity->type ]->new_post_type_action_ms, $user_link, esc_url( $post_url ), $blog_link );
1622
} else {
1623
+ /* translators: 1: the activity author user link. 2: the post link. 3: the blog link. */
1624
$action = sprintf( esc_html_x( '%1$s wrote a new %2$s, on the site %3$s', 'Activity Custom Post Type post action', 'buddypress' ), $user_link, $post_link, $blog_link );
1625
}
1626
} else {
1627
if ( ! empty( $bp->activity->track[ $activity->type ]->new_post_type_action ) ) {
1628
$action = sprintf( $bp->activity->track[ $activity->type ]->new_post_type_action, $user_link, $post_url );
1629
} else {
1630
+ /* translators: 1: the activity author user link. 2: the post link. */
1631
$action = sprintf( esc_html_x( '%1$s wrote a new %2$s', 'Activity Custom Post Type post action', 'buddypress' ), $user_link, $post_link );
1632
}
1633
}
1674
if ( ! empty( $bp->activity->track[ $activity->type ]->new_post_type_comment_action_ms ) ) {
1675
$action = sprintf( $bp->activity->track[ $activity->type ]->new_post_type_comment_action_ms, $user_link, $activity->primary_link, $blog_link );
1676
} else {
1677
+ /* translators: 1: the activity author user link. 2: the post link. 3: the blog link. */
1678
$action = sprintf( esc_html_x( '%1$s commented on the %2$s, on the site %3$s', 'Activity Custom Post Type comment action', 'buddypress' ), $user_link, $post_link, $blog_link );
1679
}
1680
} else {
1681
if ( ! empty( $bp->activity->track[ $activity->type ]->new_post_type_comment_action ) ) {
1682
$action = sprintf( $bp->activity->track[ $activity->type ]->new_post_type_comment_action, $user_link, $activity->primary_link );
1683
} else {
1684
+ /* translators: 1: the activity author user link. 2: the post link. */
1685
$action = sprintf( esc_html_x( '%1$s commented on the %2$s', 'Activity Custom Post Type post comment action', 'buddypress' ), $user_link, $post_link );
1686
}
1687
}
1728
'max' => false, // Maximum number of results to return.
1729
'fields' => 'all',
1730
'page' => 1, // Page 1 without a per_page will result in no pagination.
1731
+ 'per_page' => false, // results per page.
1732
+ 'sort' => 'DESC', // sort ASC or DESC.
1733
'display_comments' => false, // False for no comments. 'stream' for within stream display, 'threaded' for below each activity item.
1734
1735
+ 'search_terms' => false, // Pass search terms as a string.
1736
+ 'meta_query' => false, // Filter by activity meta. See WP_Meta_Query for format.
1737
'date_query' => false, // Filter by date. See first parameter of WP_Date_Query for format.
1738
'filter_query' => false,
1739
'show_hidden' => false, // Show activity items that are hidden site-wide?
1740
'exclude' => false, // Comma-separated list of activity IDs to exclude.
1741
+ 'in' => false, // Comma-separated list or array of activity IDs to which you.
1742
// want to limit the query.
1743
'spam' => 'ham_only', // 'ham_only' (default), 'spam_only' or 'all'.
1744
'update_meta_cache' => true,
1814
'page' => 1, // Page 1 without a per_page will result in no pagination.
1815
'per_page' => false, // Results per page.
1816
'show_hidden' => true, // When fetching specific items, show all.
1817
+ 'sort' => 'DESC', // Sort ASC or DESC.
1818
'spam' => 'ham_only', // Retrieve items marked as spam.
1819
'update_meta_cache' => true,
1820
), 'activity_get_specific' );
1887
1888
$r = bp_parse_args( $args, array(
1889
'id' => false, // Pass an existing activity ID to update an existing entry.
1890
+ 'action' => '', // The activity action - e.g. "Jon Doe posted an update".
1891
+ 'content' => '', // Optional: The content of the activity item e.g. "BuddyPress is awesome guys!".
1892
'component' => false, // The name/ID of the component e.g. groups, profile, mycomponent.
1893
'type' => false, // The activity type e.g. activity_update, profile_updated.
1894
'primary_link' => '', // Optional: The primary URL for this item in RSS feeds (defaults to activity permalink).
2324
* @return null|WP_Error|bool|int The ID of the activity on success. False on error.
2325
*/
2326
function bp_activity_post_type_comment( $comment_id = 0, $is_approved = true, $activity_post_object = null ) {
2327
+ // Get the users comment.
2328
$post_type_comment = get_comment( $comment_id );
2329
2330
+ // Don't record activity if the comment hasn't been approved.
2331
if ( empty( $is_approved ) ) {
2332
return false;
2333
}
2334
2335
+ // Don't record activity if no email address has been included.
2336
if ( empty( $post_type_comment->comment_author_email ) ) {
2337
return false;
2338
}
2339
2340
+ // Don't record activity if the comment has already been marked as spam.
2341
if ( 'spam' === $is_approved ) {
2342
return false;
2343
}
2345
// Get the user by the comment author email.
2346
$user = get_user_by( 'email', $post_type_comment->comment_author_email );
2347
2348
+ // If user isn't registered, don't record activity.
2349
if ( empty( $user ) ) {
2350
return false;
2351
}
2352
2353
+ // Get the user_id.
2354
$user_id = (int) $user->ID;
2355
2356
+ // Get blog and post data.
2357
$blog_id = get_current_blog_id();
2358
2359
+ // Get the post.
2360
$post_type_comment->post = get_post( $post_type_comment->comment_post_ID );
2361
2362
if ( ! is_a( $post_type_comment->post, 'WP_Post' ) ) {
2372
*/
2373
$is_post_status_not_allowed = (bool) apply_filters( 'bp_activity_post_type_is_post_status_allowed', 'publish' !== $post_type_comment->post->post_status || ! empty( $post_type_comment->post->post_password ) );
2374
2375
+ // If this is a password protected post, or not a public post don't record the comment.
2376
if ( $is_post_status_not_allowed ) {
2377
return false;
2378
}
2379
2380
+ // Set post type.
2381
$post_type = $post_type_comment->post->post_type;
2382
2383
if ( empty( $activity_post_object ) ) {
2384
// Get the post type tracking args.
2385
$activity_post_object = bp_activity_get_post_type_tracking_args( $post_type );
2386
2387
+ // Bail if the activity type does not exist.
2388
if ( empty( $activity_post_object->comments_tracking->action_id ) ) {
2389
return false;
2390
}
2391
}
2392
2393
+ // Set the $activity_comment_object.
2394
$activity_comment_object = $activity_post_object->comments_tracking;
2395
2396
/**
2529
// Get the post type tracking args.
2530
$activity_post_object = bp_activity_get_post_type_tracking_args( $post_type );
2531
2532
+ // Bail if the activity type does not exist.
2533
if ( empty( $activity_post_object->comments_tracking->action_id ) ) {
2534
return false;
2535
}
2536
}
2537
2538
+ // Set the $activity_comment_object.
2539
$activity_comment_object = $activity_post_object->comments_tracking;
2540
2541
if ( empty( $activity_comment_object->action_id ) ) {
3443
if ( $use_media_type === 'embeds' ) {
3444
$summary .= PHP_EOL . PHP_EOL . $extracted_media['url'];
3445
} elseif ( $use_media_type === 'images' ) {
3446
+ $extracted_media_url = isset( $extracted_media['url'] ) ? $extracted_media['url'] : '';
3447
+ $summary .= sprintf( ' <img src="%s">', esc_url( $extracted_media_url ) );
3448
} elseif ( in_array( $use_media_type, array( 'audio', 'videos' ), true ) ) {
3449
$summary .= PHP_EOL . PHP_EOL . $extracted_media['original']; // Full shortcode.
3450
}
4059
// Get the post type tracking args.
4060
$activity_post_object = bp_activity_get_post_type_tracking_args( $post_type );
4061
4062
+ // Bail if the activity type does not exist.
4063
if ( empty( $activity_post_object->comments_tracking->action_id ) ) {
4064
return false;
4065
4066
+ // Set the $activity_comment_object.
4067
} else {
4068
$activity_comment_object = $activity_post_object->comments_tracking;
4069
}
4070
4071
+ // Init an empty activity ID.
4072
$activity_id = 0;
4073
4074
/**
4092
$action = 'ham_activity';
4093
}
4094
4095
+ // Get the activity.
4096
if ( bp_disable_blogforum_comments() ) {
4097
$activity_id = bp_activity_get_activity_id( array(
4098
'component' => $activity_comment_object->component_id,
4120
return false;
4121
}
4122
4123
+ // Check activity item exists.
4124
if ( empty( $activity_id ) ) {
4125
// If no activity exists, but the comment has been approved, record it into the activity table.
4126
if ( 'approved' == $new_status ) {
4130
return;
4131
}
4132
4133
+ // Create an activity object.
4134
$activity = new BP_Activity_Activity( $activity_id );
4135
if ( empty( $activity->component ) ) {
4136
return;
4137
}
4138
4139
+ // Spam/ham the activity if it's not already in that state.
4140
if ( 'spam_activity' === $action && ! $activity->is_spam ) {
4141
bp_activity_mark_as_spam( $activity );
4142
} elseif ( 'ham_activity' == $action) {
4143
bp_activity_mark_as_ham( $activity );
4144
}
4145
4146
+ // Add "new_post_type_comment" to the whitelisted activity types, so that the activity's Akismet history is generated.
4147
$post_type_comment_action = $activity_comment_object->action_id;
4148
$comment_akismet_history = function ( $activity_types ) use ( $post_type_comment_action ) {
4149
$activity_types[] = $post_type_comment_action;
4152
};
4153
add_filter( 'bp_akismet_get_activity_types', $comment_akismet_history );
4154
4155
+ // Make sure the activity change won't edit the comment if sync is on.
4156
remove_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 );
4157
4158
+ // Save the updated activity.
4159
$activity->save();
4160
4161
+ // Restore the action.
4162
add_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 );
4163
4164
+ // Remove the "new_blog_comment" activity type whitelist so we don't break anything.
4165
remove_filter( 'bp_akismet_get_activity_types', $comment_akismet_history );
4166
}
4167
add_action( 'transition_comment_status', 'bp_activity_transition_post_type_comment_status', 10, 3 );
bp-activity/bp-activity-notifications.php CHANGED
@@ -34,13 +34,17 @@ function bp_activity_format_notifications( $action, $item_id, $secondary_item_id
34
case 'new_at_mention':
35
$action_filter = 'at_mentions';
36
$link = bp_loggedin_user_domain() . bp_get_activity_slug() . '/mentions/';
37
- $title = sprintf( __( '@%s Mentions', 'buddypress' ), bp_get_loggedin_user_username() );
38
- $amount = 'single';
39
40
if ( (int) $total_items > 1 ) {
41
$text = sprintf( __( 'You have %1$d new mentions', 'buddypress' ), (int) $total_items );
42
$amount = 'multiple';
43
} else {
44
$text = sprintf( __( '%1$s mentioned you', 'buddypress' ), $user_fullname );
45
}
46
break;
@@ -51,11 +55,15 @@ function bp_activity_format_notifications( $action, $item_id, $secondary_item_id
51
$amount = 'single';
52
53
if ( (int) $total_items > 1 ) {
54
- $link = add_query_arg( 'type', $action, $link );
55
$text = sprintf( __( 'You have %1$d new replies', 'buddypress' ), (int) $total_items );
56
$amount = 'multiple';
57
} else {
58
$link = add_query_arg( 'rid', (int) $id, bp_activity_get_permalink( $activity_id ) );
59
$text = sprintf( __( '%1$s commented on one of your updates', 'buddypress' ), $user_fullname );
60
}
61
break;
@@ -66,11 +74,15 @@ function bp_activity_format_notifications( $action, $item_id, $secondary_item_id
66
$amount = 'single';
67
68
if ( (int) $total_items > 1 ) {
69
- $link = add_query_arg( 'type', $action, $link );
70
$text = sprintf( __( 'You have %1$d new comment replies', 'buddypress' ), (int) $total_items );
71
$amount = 'multiple';
72
} else {
73
$link = add_query_arg( 'crid', (int) $id, bp_activity_get_permalink( $activity_id ) );
74
$text = sprintf( __( '%1$s replied to one of your activity comments', 'buddypress' ), $user_fullname );
75
}
76
break;
@@ -396,14 +408,19 @@ function bp_activity_screen_notification_settings() {
396
<?php if ( bp_activity_do_mentions() ) : ?>
397
<tr id="activity-notification-settings-mentions">
398
<td>&nbsp;</td>
399
- <td><?php printf( __( 'A member mentions you in an update using "@%s"', 'buddypress' ), bp_core_get_username( bp_displayed_user_id() ) ) ?></td>
400
<td class="yes"><input type="radio" name="notifications[notification_activity_new_mention]" id="notification-activity-new-mention-yes" value="yes" <?php checked( $mention, 'yes', true ) ?>/><label for="notification-activity-new-mention-yes" class="bp-screen-reader-text"><?php
401
/* translators: accessibility text */
402
- _e( 'Yes, send email', 'buddypress' );
403
?></label></td>
404
<td class="no"><input type="radio" name="notifications[notification_activity_new_mention]" id="notification-activity-new-mention-no" value="no" <?php checked( $mention, 'no', true ) ?>/><label for="notification-activity-new-mention-no" class="bp-screen-reader-text"><?php
405
/* translators: accessibility text */
406
- _e( 'No, do not send email', 'buddypress' );
407
?></label></td>
408
</tr>
409
<?php endif; ?>
@@ -413,11 +430,11 @@ function bp_activity_screen_notification_settings() {
413
<td><?php _e( "A member replies to an update or comment you've posted", 'buddypress' ) ?></td>
414
<td class="yes"><input type="radio" name="notifications[notification_activity_new_reply]" id="notification-activity-new-reply-yes" value="yes" <?php checked( $reply, 'yes', true ) ?>/><label for="notification-activity-new-reply-yes" class="bp-screen-reader-text"><?php
415
/* translators: accessibility text */
416
- _e( 'Yes, send email', 'buddypress' );
417
?></label></td>
418
<td class="no"><input type="radio" name="notifications[notification_activity_new_reply]" id="notification-activity-new-reply-no" value="no" <?php checked( $reply, 'no', true ) ?>/><label for="notification-activity-new-reply-no" class="bp-screen-reader-text"><?php
419
/* translators: accessibility text */
420
- _e( 'No, do not send email', 'buddypress' );
421
?></label></td>
422
</tr>
423
34
case 'new_at_mention':
35
$action_filter = 'at_mentions';
36
$link = bp_loggedin_user_domain() . bp_get_activity_slug() . '/mentions/';
37
+
38
+ /* translators: %s: the current user display name */
39
+ $title = sprintf( __( '@%s Mentions', 'buddypress' ), bp_get_loggedin_user_username() );
40
+ $amount = 'single';
41
42
if ( (int) $total_items > 1 ) {
43
+ /* translators: 1: the number of activity mentions */
44
$text = sprintf( __( 'You have %1$d new mentions', 'buddypress' ), (int) $total_items );
45
$amount = 'multiple';
46
} else {
47
+ /* translators: 1: the user display name */
48
$text = sprintf( __( '%1$s mentioned you', 'buddypress' ), $user_fullname );
49
}
50
break;
55
$amount = 'single';
56
57
if ( (int) $total_items > 1 ) {
58
+ $link = add_query_arg( 'type', $action, $link );
59
+
60
+ /* translators: 1: the number of activity replies */
61
$text = sprintf( __( 'You have %1$d new replies', 'buddypress' ), (int) $total_items );
62
$amount = 'multiple';
63
} else {
64
$link = add_query_arg( 'rid', (int) $id, bp_activity_get_permalink( $activity_id ) );
65
+
66
+ /* translators: 1: the user display name */
67
$text = sprintf( __( '%1$s commented on one of your updates', 'buddypress' ), $user_fullname );
68
}
69
break;
74
$amount = 'single';
75
76
if ( (int) $total_items > 1 ) {
77
+ $link = add_query_arg( 'type', $action, $link );
78
+
79
+ /* translators: 1: the number of activity comment replies */
80
$text = sprintf( __( 'You have %1$d new comment replies', 'buddypress' ), (int) $total_items );
81
$amount = 'multiple';
82
} else {
83
$link = add_query_arg( 'crid', (int) $id, bp_activity_get_permalink( $activity_id ) );
84
+
85
+ /* translators: 1: the user display name */
86
$text = sprintf( __( '%1$s replied to one of your activity comments', 'buddypress' ), $user_fullname );
87
}
88
break;
408
<?php if ( bp_activity_do_mentions() ) : ?>
409
<tr id="activity-notification-settings-mentions">
410
<td>&nbsp;</td>
411
+ <td>
412
+ <?php
413
+ /* translators: %s: the displayed user username */
414
+ printf( __( 'A member mentions you in an update using "@%s"', 'buddypress' ), bp_core_get_username( bp_displayed_user_id() ) );
415
+ ?>
416
+ </td>
417
<td class="yes"><input type="radio" name="notifications[notification_activity_new_mention]" id="notification-activity-new-mention-yes" value="yes" <?php checked( $mention, 'yes', true ) ?>/><label for="notification-activity-new-mention-yes" class="bp-screen-reader-text"><?php
418
/* translators: accessibility text */
419
+ esc_html_e( 'Yes, send email', 'buddypress' );
420
?></label></td>
421
<td class="no"><input type="radio" name="notifications[notification_activity_new_mention]" id="notification-activity-new-mention-no" value="no" <?php checked( $mention, 'no', true ) ?>/><label for="notification-activity-new-mention-no" class="bp-screen-reader-text"><?php
422
/* translators: accessibility text */
423
+ esc_html_e( 'No, do not send email', 'buddypress' );
424
?></label></td>
425
</tr>
426
<?php endif; ?>
430
<td><?php _e( "A member replies to an update or comment you've posted", 'buddypress' ) ?></td>
431
<td class="yes"><input type="radio" name="notifications[notification_activity_new_reply]" id="notification-activity-new-reply-yes" value="yes" <?php checked( $reply, 'yes', true ) ?>/><label for="notification-activity-new-reply-yes" class="bp-screen-reader-text"><?php
432
/* translators: accessibility text */
433
+ esc_html_e( 'Yes, send email', 'buddypress' );
434
?></label></td>
435
<td class="no"><input type="radio" name="notifications[notification_activity_new_reply]" id="notification-activity-new-reply-no" value="no" <?php checked( $reply, 'no', true ) ?>/><label for="notification-activity-new-reply-no" class="bp-screen-reader-text"><?php
436
/* translators: accessibility text */
437
+ esc_html_e( 'No, do not send email', 'buddypress' );
438
?></label></td>
439
</tr>
440
bp-activity/bp-activity-template.php CHANGED
@@ -452,6 +452,7 @@ function bp_activity_pagination_count() {
452
if ( 1 == $activities_template->total_activity_count ) {
453
$message = __( 'Viewing 1 item', 'buddypress' );
454
} else {
455
$message = sprintf( _n( 'Viewing %1$s - %2$s of %3$s item', 'Viewing %1$s - %2$s of %3$s items', $activities_template->total_activity_count, 'buddypress' ), $from_num, $to_num, $total );
456
}
457
@@ -1034,7 +1035,11 @@ function bp_activity_avatar( $args = '' ) {
1034
$dn_default = isset( $current_activity_item->display_name ) ? $current_activity_item->display_name : '';
1035
1036
// Prepend some descriptive text to alt.
1037
- $alt_default = !empty( $dn_default ) ? sprintf( __( 'Profile picture of %s', 'buddypress' ), $dn_default ) : __( 'Profile picture', 'buddypress' );
1038
1039
$defaults = array(
1040
'alt' => $alt_default,
@@ -1182,6 +1187,7 @@ function bp_activity_secondary_avatar( $args = '' ) {
1182
$alt = __( 'Group logo', 'buddypress' );
1183
1184
if ( ! empty( $name ) ) {
1185
$alt = sprintf( __( 'Group logo of %s', 'buddypress' ), $name );
1186
}
1187
}
@@ -1193,6 +1199,7 @@ function bp_activity_secondary_avatar( $args = '' ) {
1193
$link = home_url();
1194
1195
if ( empty( $alt ) ) {
1196
$alt = sprintf( __( 'Profile picture of the author of the site %s', 'buddypress' ), get_blog_option( $item_id, 'blogname' ) );
1197
}
1198
@@ -1203,6 +1210,7 @@ function bp_activity_secondary_avatar( $args = '' ) {
1203
$link = bp_core_get_userlink( $item_id, false, true );
1204
1205
if ( empty( $alt ) ) {
1206
$alt = sprintf( __( 'Profile picture of %s', 'buddypress' ), bp_core_get_user_displayname( $activities_template->activity->secondary_item_id ) );
1207
}
1208
@@ -1214,6 +1222,7 @@ function bp_activity_secondary_avatar( $args = '' ) {
1214
$link = bp_core_get_userlink( $item_id, false, true );
1215
1216
if ( empty( $alt ) ) {
1217
$alt = sprintf( __( 'Profile picture of %s', 'buddypress' ), $activities_template->activity->display_name );
1218
}
1219
@@ -1306,6 +1315,7 @@ function bp_activity_action( $args = array() ) {
1306
* Return the activity action.
1307
*
1308
* @since 1.2.0
1309
*
1310
* @global object $activities_template {@link BP_Activity_Template}
1311
*
@@ -1344,8 +1354,9 @@ function bp_activity_action( $args = array() ) {
1344
* Filters the activity action after the action has been inserted as meta.
1345
*
1346
* @since 1.2.0
1347
*
1348
- * @param array $value Array containing the current action, the current activity, and the $args array passed into the function.
1349
*/
1350
return apply_filters_ref_array( 'bp_get_activity_action', array(
1351
$action,
@@ -2174,7 +2185,16 @@ function bp_activity_comment_count() {
2174
2175
// Deprecated notice about $args.
2176
if ( ! empty( $deprecated ) ) {
2177
- _deprecated_argument( __FUNCTION__, '1.2', sprintf( __( '%1$s no longer accepts arguments. See the inline documentation at %2$s for more details.', 'buddypress' ), __FUNCTION__, __FILE__ ) );
2178
}
2179
2180
// Get the count using the purpose-built recursive function.
452
if ( 1 == $activities_template->total_activity_count ) {
453
$message = __( 'Viewing 1 item', 'buddypress' );
454
} else {
455
+ /* translators: 1: the from number item. 2: the to number item. 3: the total number of items. */
456
$message = sprintf( _n( 'Viewing %1$s - %2$s of %3$s item', 'Viewing %1$s - %2$s of %3$s items', $activities_template->total_activity_count, 'buddypress' ), $from_num, $to_num, $total );
457
}
458
1035
$dn_default = isset( $current_activity_item->display_name ) ? $current_activity_item->display_name : '';
1036
1037
// Prepend some descriptive text to alt.
1038
+ $alt_default = __( 'Profile picture', 'buddypress' );
1039
+ if ( ! empty( $dn_default ) ) {
1040
+ /* translators: %s: member name */
1041
+ $alt_default = sprintf( __( 'Profile picture of %s', 'buddypress' ), $dn_default );
1042
+ }
1043
1044
$defaults = array(
1045
'alt' => $alt_default,
1187
$alt = __( 'Group logo', 'buddypress' );
1188
1189
if ( ! empty( $name ) ) {
1190
+ /* translators: %s: the Group name */
1191
$alt = sprintf( __( 'Group logo of %s', 'buddypress' ), $name );
1192
}
1193
}
1199
$link = home_url();
1200
1201
if ( empty( $alt ) ) {
1202
+ /* translators: %s: the blog name */
1203
$alt = sprintf( __( 'Profile picture of the author of the site %s', 'buddypress' ), get_blog_option( $item_id, 'blogname' ) );
1204
}
1205
1210
$link = bp_core_get_userlink( $item_id, false, true );
1211
1212
if ( empty( $alt ) ) {
1213
+ /* translators: %s: member name */
1214
$alt = sprintf( __( 'Profile picture of %s', 'buddypress' ), bp_core_get_user_displayname( $activities_template->activity->secondary_item_id ) );
1215
}
1216
1222
$link = bp_core_get_userlink( $item_id, false, true );
1223
1224
if ( empty( $alt ) ) {
1225
+ /* translators: %s: member name */
1226
$alt = sprintf( __( 'Profile picture of %s', 'buddypress' ), $activities_template->activity->display_name );
1227
}
1228
1315
* Return the activity action.
1316
*
1317
* @since 1.2.0
1318
+ * @since 1.7.0 Introduce function parameter, $args.
1319
*
1320
* @global object $activities_template {@link BP_Activity_Template}
1321
*
1354
* Filters the activity action after the action has been inserted as meta.
1355
*
1356
* @since 1.2.0
1357
+ * @since 1.7.0 Now passes a 3rd parameter, $r, an array of arguments from the function.
1358
*
1359
+ * @param array $value Array containing the current action, the current activity, and the $r array passed into the function.
1360
*/
1361
return apply_filters_ref_array( 'bp_get_activity_action', array(
1362
$action,
2185
2186
// Deprecated notice about $args.
2187
if ( ! empty( $deprecated ) ) {
2188
+ _deprecated_argument(
2189
+ __FUNCTION__,
2190
+ '1.2',
2191
+ sprintf(
2192
+ /* translators: 1: the name of the function. 2: the name of the file. */
2193
+ __( '%1$s no longer accepts arguments. See the inline documentation at %2$s for more details.', 'buddypress' ),
2194
+ __FUNCTION__,
2195
+ __FILE__
2196
+ )
2197
+ );
2198
}
2199
2200
// Get the count using the purpose-built recursive function.
bp-activity/classes/class-bp-activity-activity.php CHANGED
@@ -268,15 +268,35 @@ class BP_Activity_Activity {
268
return false;
269
} else {
270
if ( empty( $this->component ) ) {
271
- $this->errors->add( 'bp_activity_missing_component' );
272
} else {
273
- $this->errors->add( 'bp_activity_missing_type' );
274
}
275
276
return $this->errors;
277
}
278
}
279
280
if ( empty( $this->primary_link ) ) {
281
$this->primary_link = bp_loggedin_user_domain();
282
}
@@ -364,7 +384,16 @@ class BP_Activity_Activity {
364
365
// Backward compatibility with old method of passing arguments.
366
if ( !is_array( $args ) || count( $function_args ) > 1 ) {
367
- _deprecated_argument( __METHOD__, '1.6', sprintf( __( 'Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'buddypress' ), __METHOD__, __FILE__ ) );
368
369
$old_args_keys = array(
370
0 => 'max',
268
return false;
269
} else {
270
if ( empty( $this->component ) ) {
271
+ $this->errors->add( 'bp_activity_missing_component', __( 'You need to define a component parameter to insert activity.', 'buddypress' ) );
272
} else {
273
+ $this->errors->add( 'bp_activity_missing_type', __( 'You need to define a type parameter to insert activity.', 'buddypress' ) );
274
}
275
276
return $this->errors;
277
}
278
}
279
280
+ /**
281
+ * Use this filter to make the content of your activity required.
282
+ *
283
+ * @since 6.0.0
284
+ *
285
+ * @param bool $value True if the content of the activity type is required.
286
+ * False otherwise.
287
+ * @param string $type The type of the activity we are about to insert.
288
+ */
289
+ $type_requires_content = (bool) apply_filters( 'bp_activity_type_requires_content', $this->type === 'activity_update', $this->type );
290
+ if ( $type_requires_content && ! $this->content ) {
291
+ if ( 'bool' === $this->error_type ) {
292
+ return false;
293
+ } else {
294
+ $this->errors->add( 'bp_activity_missing_content', __( 'Please enter some content to post.', 'buddypress' ) );
295
+
296
+ return $this->errors;
297
+ }
298
+ }
299
+
300
if ( empty( $this->primary_link ) ) {
301
$this->primary_link = bp_loggedin_user_domain();
302
}
384
385
// Backward compatibility with old method of passing arguments.
386
if ( !is_array( $args ) || count( $function_args ) > 1 ) {
387
+ _deprecated_argument(
388
+ __METHOD__,
389
+ '1.6',
390
+ sprintf(
391
+ /* translators: 1: the name of the method. 2: the name of the file. */
392
+ __( 'Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'buddypress' ),
393
+ __METHOD__,
394
+ __FILE__
395
+ )
396
+ );
397
398
$old_args_keys = array(
399
0 => 'max',
bp-activity/classes/class-bp-activity-component.php CHANGED
@@ -71,7 +71,7 @@ class BP_Activity_Component extends BP_Component {
71
$includes[] = 'akismet';
72
}
73
74
- // Embeds
75
if ( bp_is_active( $this->id, 'embeds' ) ) {
76
$includes[] = 'embeds';
77
}
@@ -431,7 +431,11 @@ class BP_Activity_Component extends BP_Component {
431
$bp->bp_options_avatar = bp_core_fetch_avatar( array(
432
'item_id' => bp_displayed_user_id(),
433
'type' => 'thumb',
434
- 'alt' => sprintf( __( 'Profile picture of %s', 'buddypress' ), bp_get_displayed_user_fullname() )
435
) );
436
$bp->bp_options_title = bp_get_displayed_user_fullname();
437
}
71
$includes[] = 'akismet';
72
}
73
74
+ // Embeds.
75
if ( bp_is_active( $this->id, 'embeds' ) ) {
76
$includes[] = 'embeds';
77
}
431
$bp->bp_options_avatar = bp_core_fetch_avatar( array(
432
'item_id' => bp_displayed_user_id(),
433
'type' => 'thumb',
434
+ 'alt' => sprintf(
435
+ /* translators: %s: member name */
436
+ __( 'Profile picture of %s', 'buddypress' ),
437
+ bp_get_displayed_user_fullname()
438
+ ),
439
) );
440
$bp->bp_options_title = bp_get_displayed_user_fullname();
441
}
bp-activity/classes/class-bp-activity-list-table.php CHANGED
@@ -38,6 +38,14 @@ class BP_Activity_List_Table extends WP_List_Table {
38
*/
39
public $spam_count = 0;
40
41
/**
42
* Store activity-to-user-ID mappings for use in the In Response To column.
43
*
@@ -97,23 +105,18 @@ class BP_Activity_List_Table extends WP_List_Table {
97
$per_page = $this->get_items_per_page( str_replace( '-', '_', "{$this->screen->id}_per_page" ) );
98
99
// Check if we're on the "Spam" view.
100
- if ( !empty( $_REQUEST['activity_status'] ) && 'spam' == $_REQUEST['activity_status'] ) {
101
$spam = 'spam_only';
102
$this->view = 'spam';
103
}
104
105
- // Sort order.
106
- if ( !empty( $_REQUEST['order'] ) && 'desc' != $_REQUEST['order'] )
107
- $sort = 'ASC';
108
-
109
- // Order by.
110
- /*if ( !empty( $_REQUEST['orderby'] ) ) {
111
- }*/
112
-
113
// Filter.
114
if ( ! empty( $_REQUEST['activity_type'] ) ) {
115
$filter = array( 'action' => $_REQUEST['activity_type'] );
116
117
/**
118
* Filter here to override the filter with a filter query
119
*
@@ -124,22 +127,30 @@ class BP_Activity_List_Table extends WP_List_Table {
124
$has_filter_query = apply_filters( 'bp_activity_list_table_filter_activity_type_items', $filter );
125
126
if ( ! empty( $has_filter_query['filter_query'] ) ) {
127
- // Reset the filter
128
$filter = array();
129
130
- // And use the filter query instead
131
$filter_query = $has_filter_query['filter_query'];
132
}
133
}
134
135
// Are we doing a search?
136
- if ( !empty( $_REQUEST['s'] ) )
137
$search_terms = $_REQUEST['s'];
138
139
// Check if user has clicked on a specific activity (if so, fetch only that, and any related, activity).
140
- if ( !empty( $_REQUEST['aid'] ) )
141
$include_id = (int) $_REQUEST['aid'];
142
143
// Get the spam total (ignoring any search query or filter).
144
$spams = bp_activity_get( array(
145
'display_comments' => 'stream',
@@ -160,7 +171,6 @@ class BP_Activity_List_Table extends WP_List_Table {
160
'search_terms' => $search_terms,
161
'filter_query' => $filter_query,
162
'show_hidden' => true,
163
- // 'sort' => $sort,
164
'spam' => $spam,
165
'count_total' => 'count_query',
166
) );
@@ -184,7 +194,7 @@ class BP_Activity_List_Table extends WP_List_Table {
184
}
185
186
// Set raw data to display.
187
- $this->items = $new_activities;
188
189
// Store information needed for handling table pagination.
190
$this->set_pagination_args( array(
@@ -195,6 +205,25 @@ class BP_Activity_List_Table extends WP_List_Table {
195
196
// Don't truncate activity items; bp_activity_truncate_entry() needs to be used inside a BP_Activity_Template loop.
197
remove_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 );
198
}
199
200
/**
@@ -309,12 +338,34 @@ class BP_Activity_List_Table extends WP_List_Table {
309
310
<h2 class="screen-reader-text"><?php
311
/* translators: accessibility text */
312
- _e( 'Filter activities list', 'buddypress' );
313
?></h2>
314
315
<ul class="subsubsub">
316
- <li class="all"><a href="<?php echo esc_url( $url_base ); ?>" class="<?php if ( 'spam' != $this->view ) echo 'current'; ?>"><?php _e( 'All', 'buddypress' ); ?></a> |</li>
317
- <li class="spam"><a href="<?php echo esc_url( add_query_arg( array( 'activity_status' => 'spam' ), $url_base ) ); ?>" class="<?php if ( 'spam' == $this->view ) echo 'current'; ?>"><?php printf( __( 'Spam <span class="count">(%s)</span>', 'buddypress' ), number_format_i18n( $this->spam_count ) ); ?></a></li>
318
319
<?php
320
@@ -553,6 +604,7 @@ class BP_Activity_List_Table extends WP_List_Table {
553
if ( isset( $actions[ $item['type'] ] ) ) {
554
echo $actions[ $item['type'] ];
555
} else {
556
printf( __( 'Unregistered action - %s', 'buddypress' ), $item['type'] );
557
}
558
}
@@ -645,21 +697,20 @@ class BP_Activity_List_Table extends WP_List_Table {
645
// End timestamp.
646
echo '</div>';
647
648
// Get activity content - if not set, use the action.
649
if ( ! empty( $item['content'] ) ) {
650
- $activity = new BP_Activity_Activity( $item['id'] );
651
-
652
/** This filter is documented in bp-activity/bp-activity-template.php */
653
$content = apply_filters_ref_array( 'bp_get_activity_content_body', array( $item['content'], &$activity ) );
654
} else {
655
- /**
656
- * Filters current activity item action.
657
- *
658
- * @since 1.2.0
659
- *
660
- * @var array $item Array index holding current activity item action.
661
- */
662
- $content = apply_filters_ref_array( 'bp_get_activity_action', array( $item['action'] ) );
663
}
664
665
/**
38
*/
39
public $spam_count = 0;
40
41
+ /**
42
+ * Total number of activities.
43
+ *
44
+ * @since 6.0.0
45
+ * @var int $all_count
46
+ */
47
+ public $all_count = 0;
48
+
49
/**
50
* Store activity-to-user-ID mappings for use in the In Response To column.
51
*
105
$per_page = $this->get_items_per_page( str_replace( '-', '_', "{$this->screen->id}_per_page" ) );
106
107
// Check if we're on the "Spam" view.
108
+ if ( ! empty( $_REQUEST['activity_status'] ) && 'spam' === $_REQUEST['activity_status'] ) {
109
$spam = 'spam_only';
110
$this->view = 'spam';
111
}
112
113
// Filter.
114
if ( ! empty( $_REQUEST['activity_type'] ) ) {
115
$filter = array( 'action' => $_REQUEST['activity_type'] );
116
117
+ // Set the view as a filtered one.
118
+ $this->view = 'filtered';
119
+
120
/**
121
* Filter here to override the filter with a filter query
122
*
127
$has_filter_query = apply_filters( 'bp_activity_list_table_filter_activity_type_items', $filter );
128
129
if ( ! empty( $has_filter_query['filter_query'] ) ) {
130
+ // Reset the filter.
131
$filter = array();
132
133
+ // And use the filter query instead.
134
$filter_query = $has_filter_query['filter_query'];
135
}
136
}
137
138
// Are we doing a search?
139
+ if ( ! empty( $_REQUEST['s'] ) ) {
140
$search_terms = $_REQUEST['s'];
141
142
+ // Set the view as a search request.
143
+ $this->view = 'search';
144
+ }
145
+
146
// Check if user has clicked on a specific activity (if so, fetch only that, and any related, activity).
147
+ if ( ! empty( $_REQUEST['aid'] ) ) {
148
$include_id = (int) $_REQUEST['aid'];
149
150
+ // Set the view as a single activity.
151
+ $this->view = 'single';
152
+ }
153
+
154
// Get the spam total (ignoring any search query or filter).
155
$spams = bp_activity_get( array(
156
'display_comments' => 'stream',
171
'search_terms' => $search_terms,
172
'filter_query' => $filter_query,
173
'show_hidden' => true,
174
'spam' => $spam,
175
'count_total' => 'count_query',
176
) );
194
}
195
196
// Set raw data to display.
197
+ $this->items = $new_activities;
198
199
// Store information needed for handling table pagination.
200
$this->set_pagination_args( array(
205
206
// Don't truncate activity items; bp_activity_truncate_entry() needs to be used inside a BP_Activity_Template loop.
207
remove_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 );
208
+
209
+ // Set the Total number of activities.
210
+ if ( 'all' === $this->view ) {
211
+ $this->all_count = (int) $activities['total'];
212
+
213
+ // Only perform a query if not on the main list view.
214
+ } elseif ( 'single' !== $this->view ) {
215
+ $count_activities = bp_activity_get(
216
+ array(
217
+ 'fields' => 'ids',
218
+ 'show_hidden' => true,
219
+ 'count_total' => 'count_query',
220
+ )
221
+ );
222
+
223
+ if ( $count_activities['total'] ) {
224
+ $this->all_count = (int) $count_activities['total'];
225
+ }
226
+ }
227
}
228
229
/**
338
339
<h2 class="screen-reader-text"><?php
340
/* translators: accessibility text */
341
+ esc_html_e( 'Filter activities list', 'buddypress' );
342
?></h2>
343
344
<ul class="subsubsub">
345
+ <li class="all">
346
+ <a href="<?php echo esc_url( $url_base ); ?>" class="<?php if ( 'all' === $this->view ) echo 'current'; ?>">
347
+ <?php printf(
348
+ /* translators: %s is the placeholder for the count html tag `<span class="count"/>` */
349
+ esc_html__( 'All %s', 'buddypress' ),
350
+ sprintf(
351
+ '<span class="count">(%s)</span>',
352
+ number_format_i18n( $this->all_count )
353
+ )
354
+ ); ?>
355
+ </a> |
356
+ </li>
357
+ <li class="spam">
358
+ <a href="<?php echo esc_url( add_query_arg( array( 'activity_status' => 'spam' ), $url_base ) ); ?>" class="<?php if ( 'spam' === $this->view ) echo 'current'; ?>">
359
+ <?php printf(
360
+ /* translators: %s is the placeholder for the count html tag `<span class="count"/>` */
361
+ esc_html__( 'Spam %s', 'buddypress' ),
362
+ sprintf(
363
+ '<span class="count">(%s)</span>',
364
+ number_format_i18n( $this->spam_count )
365
+ )
366
+ ); ?>
367
+ </a>
368
+ </li>
369
370
<?php
371
604
if ( isset( $actions[ $item['type'] ] ) ) {
605
echo $actions[ $item['type'] ];
606
} else {
607
+ /* translators: %s: the name of the activity type */
608
printf( __( 'Unregistered action - %s', 'buddypress' ), $item['type'] );
609
}
610
}
697
// End timestamp.
698
echo '</div>';
699
700
+ $activity = new BP_Activity_Activity( $item['id'] );
701
+
702
// Get activity content - if not set, use the action.
703
if ( ! empty( $item['content'] ) ) {
704
/** This filter is documented in bp-activity/bp-activity-template.php */
705
$content = apply_filters_ref_array( 'bp_get_activity_content_body', array( $item['content'], &$activity ) );
706
} else {
707
+ // Emulate bp_get_activity_action().
708
+ $r = array(
709
+ 'no_timestamp' => false,
710
+ );
711
+
712
+ /** This filter is documented in bp-activity/bp-activity-template.php */
713
+ $content = apply_filters_ref_array( 'bp_get_activity_action', array( $item['action'], &$activity, $r ) );
714
}
715
716
/**
bp-activity/classes/class-bp-akismet.php CHANGED
@@ -92,10 +92,13 @@ class BP_Akismet {
92
} else {
93
$who = bp_activity_get_meta( $activity['id'], '_bp_akismet_user' );
94
95
- if ( 'true' == $user_result )
96
$desc = sprintf( __( 'Flagged as spam by %s', 'buddypress' ), $who );
97
- else
98
$desc = sprintf( __( 'Un-spammed by %s', 'buddypress' ), $who );
99
}
100
101
// Add a History item to the hover links, just after Edit.
@@ -442,7 +445,16 @@ class BP_Akismet {
442
if ( !in_array( $activity->type, BP_Akismet::get_activity_types() ) )
443
return;
444
445
- $this->update_activity_history( $activity->id, sprintf( __( '%s reported this activity as spam', 'buddypress' ), bp_get_loggedin_user_username() ), 'report-spam' );
446
bp_activity_update_meta( $activity->id, '_bp_akismet_user_result', 'true' );
447
bp_activity_update_meta( $activity->id, '_bp_akismet_user', bp_get_loggedin_user_username() );
448
}
@@ -459,7 +471,16 @@ class BP_Akismet {
459
if ( !in_array( $activity->type, BP_Akismet::get_activity_types() ) )
460
return;
461
462
- $this->update_activity_history( $activity->id, sprintf( __( '%s reported this activity as not spam', 'buddypress' ), bp_get_loggedin_user_username() ), 'report-ham' );
463
bp_activity_update_meta( $activity->id, '_bp_akismet_user_result', 'false' );
464
bp_activity_update_meta( $activity->id, '_bp_akismet_user', bp_get_loggedin_user_username() );
465
}
@@ -493,7 +514,15 @@ class BP_Akismet {
493
// Uh oh, something's gone horribly wrong. Unexpected result.
494
} else {
495
bp_activity_update_meta( $activity->id, '_bp_akismet_error', bp_core_current_time() );
496
- $this->update_activity_history( $activity->id, sprintf( __( 'Akismet was unable to check this item (response: %s), will automatically retry again later.', 'buddypress' ), $this->last_activity->akismet_submission['bp_as_result'] ), 'check-error' );
497
}
498
499
// Record the original data which was submitted to Akismet for checking.
@@ -618,6 +647,7 @@ class BP_Akismet {
618
return;
619
620
echo '<div class="akismet-history"><div>';
621
printf( _x( '%1$s &mdash; %2$s', 'x hours ago - akismet cleared this item', 'buddypress' ), '<span>' . bp_core_time_since( $history[2] ) . '</span>', esc_html( $history[1] ) );
622
echo '</div></div>';
623
}
92
} else {
93
$who = bp_activity_get_meta( $activity['id'], '_bp_akismet_user' );
94
95
+ if ( 'true' == $user_result ) {
96
+ /* translators: %s: the name of the user */
97
$desc = sprintf( __( 'Flagged as spam by %s', 'buddypress' ), $who );
98
+ } else {
99
+ /* translators: %s: the name of the user */
100
$desc = sprintf( __( 'Un-spammed by %s', 'buddypress' ), $who );
101
+ }
102
}
103
104
// Add a History item to the hover links, just after Edit.
445
if ( !in_array( $activity->type, BP_Akismet::get_activity_types() ) )
446
return;
447
448
+ $this->update_activity_history(
449
+ $activity->id,
450
+ sprintf(
451
+ /* translators: %s: the current user username */
452
+ __( '%s reported this activity as spam', 'buddypress' ),
453
+ bp_get_loggedin_user_username()
454
+ ),
455
+ 'report-spam'
456
+ );
457
+
458
bp_activity_update_meta( $activity->id, '_bp_akismet_user_result', 'true' );
459
bp_activity_update_meta( $activity->id, '_bp_akismet_user', bp_get_loggedin_user_username() );
460
}
471
if ( !in_array( $activity->type, BP_Akismet::get_activity_types() ) )
472
return;
473
474
+ $this->update_activity_history(
475
+ $activity->id,
476
+ sprintf(
477
+ /* translators: %s: the current user username */
478
+ __( '%s reported this activity as not spam', 'buddypress' ),
479
+ bp_get_loggedin_user_username()
480
+ ),
481
+ 'report-ham'
482
+ );
483
+
484
bp_activity_update_meta( $activity->id, '_bp_akismet_user_result', 'false' );
485
bp_activity_update_meta( $activity->id, '_bp_akismet_user', bp_get_loggedin_user_username() );
486
}
514
// Uh oh, something's gone horribly wrong. Unexpected result.
515
} else {
516
bp_activity_update_meta( $activity->id, '_bp_akismet_error', bp_core_current_time() );
517
+ $this->update_activity_history(
518
+ $activity->id,
519
+ sprintf(
520
+ /* translators: %s the akismet result */
521
+ __( 'Akismet was unable to check this item (response: %s), will automatically retry again later.', 'buddypress' ),
522
+ $this->last_activity->akismet_submission['bp_as_result']
523
+ ),
524
+ 'check-error'
525
+ );
526
}
527
528
// Record the original data which was submitted to Akismet for checking.
647
return;
648
649
echo '<div class="akismet-history"><div>';
650
+ /* translators: 1: the human diff time. 2: the akismet history data. */
651
printf( _x( '%1$s &mdash; %2$s', 'x hours ago - akismet cleared this item', 'buddypress' ), '<span>' . bp_core_time_since( $history[2] ) . '</span>', esc_html( $history[1] ) );
652
echo '</div></div>';
653
}
bp-activity/classes/class-bp-rest-activity-endpoint.php CHANGED
@@ -140,6 +140,7 @@ class BP_REST_Activity_Endpoint extends WP_REST_Controller {
140
'display_comments' => $request['display_comments'],
141
'site_id' => $request['site_id'],
142
'group_id' => $request['group_id'],
143
'count_total' => true,
144
'fields' => 'all',
145
'show_hidden' => false,
@@ -193,6 +194,10 @@ class BP_REST_Activity_Endpoint extends WP_REST_Controller {
193
}
194
}
195
196
if ( isset( $request['type'] ) ) {
197
$args['filter']['action'] = $request['type'];
198
}
@@ -278,6 +283,16 @@ class BP_REST_Activity_Endpoint extends WP_REST_Controller {
278
public function get_item( $request ) {
279
$activity = $this->get_activity_object( $request );
280
281
$retval = array(
282
$this->prepare_response_for_collection(
283
$this->prepare_item_for_response( $activity, $request )
@@ -783,9 +798,6 @@ class BP_REST_Activity_Endpoint extends WP_REST_Controller {
783
);
784
}
785
786
- // Setting context.
787
- $request->set_param( 'context', 'edit' );
788
-
789
// Prepare the response now the user favorites has been updated.
790
$retval = array(
791
$this->prepare_response_for_collection(
@@ -876,7 +888,7 @@ class BP_REST_Activity_Endpoint extends WP_REST_Controller {
876
// Set up activity oEmbed cache.
877
bp_activity_embed();
878
879
- $rendered = apply_filters( 'bp_get_activity_content_body', $activity->content );
880
881
// Restore the `activities_template` global.
882
$GLOBALS['activities_template'] = $activities_template;
@@ -1391,7 +1403,7 @@ class BP_REST_Activity_Endpoint extends WP_REST_Controller {
1391
1392
$avatar_properties['full'] = array(
1393
'context' => array( 'view', 'edit' ),
1394
- /* translators: Full image size for the member Avatar */
1395
'description' => sprintf( __( 'Avatar URL with full image size (%1$d x %2$d pixels).', 'buddypress' ), number_format_i18n( bp_core_avatar_full_width() ), number_format_i18n( bp_core_avatar_full_height() ) ),
1396
'type' => 'string',
1397
'format' => 'uri',
@@ -1399,7 +1411,7 @@ class BP_REST_Activity_Endpoint extends WP_REST_Controller {
1399
1400
$avatar_properties['thumb'] = array(
1401
'context' => array( 'view', 'edit' ),
1402
- /* translators: Thumb imaze size for the member Avatar */
1403
'description' => sprintf( __( 'Avatar URL with thumb image size (%1$d x %2$d pixels).', 'buddypress' ), number_format_i18n( bp_core_avatar_thumb_width() ), number_format_i18n( bp_core_avatar_thumb_height() ) ),
1404
'type' => 'string',
1405
'format' => 'uri',
@@ -1484,6 +1496,14 @@ class BP_REST_Activity_Endpoint extends WP_REST_Controller {
1484
'validate_callback' => 'rest_validate_request_arg',
1485
);
1486
1487
$params['group_id'] = array(
1488
'description' => __( 'Limit result set to items created by a specific group.', 'buddypress' ),
1489
'default' => 0,
140
'display_comments' => $request['display_comments'],
141
'site_id' => $request['site_id'],
142
'group_id' => $request['group_id'],
143
+ 'scope' => $request['scope'],
144
'count_total' => true,
145
'fields' => 'all',
146
'show_hidden' => false,
194
}
195
}
196
197
+ if ( empty( $request['scope'] ) ) {
198
+ $args['scope'] = false;
199
+ }
200
+
201
if ( isset( $request['type'] ) ) {
202
$args['filter']['action'] = $request['type'];
203
}
283
public function get_item( $request ) {
284
$activity = $this->get_activity_object( $request );
285
286
+ if ( empty( $activity->id ) ) {
287
+ return new WP_Error(
288
+ 'bp_rest_invalid_id',
289
+ __( 'Invalid activity ID.', 'buddypress' ),
290
+ array(
291
+ 'status' => 404,
292
+ )
293
+ );
294
+ }
295
+
296
$retval = array(
297
$this->prepare_response_for_collection(
298
$this->prepare_item_for_response( $activity, $request )
798
);
799
}
800
801
// Prepare the response now the user favorites has been updated.
802
$retval = array(
803
$this->prepare_response_for_collection(
888
// Set up activity oEmbed cache.
889
bp_activity_embed();
890
891
+ $rendered = apply_filters( 'bp_get_activity_content_body', $activity->content, $activity );
892
893
// Restore the `activities_template` global.
894
$GLOBALS['activities_template'] = $activities_template;
1403
1404
$avatar_properties['full'] = array(
1405
'context' => array( 'view', 'edit' ),
1406
+ /* translators: 1: Full avatar width in pixels. 2: Full avatar height in pixels */
1407
'description' => sprintf( __( 'Avatar URL with full image size (%1$d x %2$d pixels).', 'buddypress' ), number_format_i18n( bp_core_avatar_full_width() ), number_format_i18n( bp_core_avatar_full_height() ) ),
1408
'type' => 'string',
1409
'format' => 'uri',
1411
1412
$avatar_properties['thumb'] = array(
1413
'context' => array( 'view', 'edit' ),
1414
+ /* translators: 1: Thumb avatar width in pixels. 2: Thumb avatar height in pixels */
1415
'description' => sprintf( __( 'Avatar URL with thumb image size (%1$d x %2$d pixels).', 'buddypress' ), number_format_i18n( bp_core_avatar_thumb_width() ), number_format_i18n( bp_core_avatar_thumb_height() ) ),
1416
'type' => 'string',
1417
'format' => 'uri',
1496
'validate_callback' => 'rest_validate_request_arg',
1497
);
1498
1499
+ $params['scope'] = array(
1500
+ 'description' => __( 'Limit result set to items with a specific scope.', 'buddypress' ),
1501
+ 'type' => 'string',
1502
+ 'enum' => array( 'just-me', 'friends', 'groups', 'favorites', 'mentions' ),
1503
+ 'sanitize_callback' => 'sanitize_text_field',
1504
+ 'validate_callback' => 'rest_validate_request_arg',
1505
+ );
1506
+
1507
$params['group_id'] = array(
1508
'description' => __( 'Limit result set to items created by a specific group.', 'buddypress' ),
1509
'default' => 0,
bp-activity/js/mentions.js CHANGED
@@ -87,7 +87,7 @@ window.bp = window.bp || {};
87
* @since 2.1.0
88
*/
89
before_reposition: function( offset ) {
90
- // get the iframe, if any, already applied with atwho
91