Skip to:
Content

BuddyPress.org

source: trunk/src/bp-core/classes/class-bp-core-notification.php

Last change on this file was 12753, checked in by imath, 2 years ago

Core: use only one global to store the Notifications DB table name

  • Deprecate $bp->core->table_name_notifications.
  • Add a magic getter to BP_Core, with a fallback if the Notifications component isn't active.
  • Audit the related queries and method params, and makes sure they work as intended, and update them to our latest coding standards.

Props johnjamesjacoby

Fixes #8360

File size: 9.0 KB
Line 
1<?php
2/**
3 * Core component classes.
4 *
5 * @package BuddyPress
6 * @subpackage Core
7 * @since 1.0.0
8 */
9
10// Exit if accessed directly.
11defined( 'ABSPATH' ) || exit;
12
13/**
14 * BP_Core_Notification is deprecated.
15 *
16 * Use BP_Notifications_Notification instead.
17 *
18 * @deprecated since 1.9.0
19 */
20class BP_Core_Notification {
21
22        /**
23         * The notification id.
24         *
25         * @var int
26         */
27        public $id = 0;
28
29        /**
30         * The ID to which the notification relates to within the component.
31         *
32         * @var int
33         */
34        public $item_id = 0;
35
36        /**
37         * The secondary ID to which the notification relates to within the component.
38         *
39         * @var int
40         */
41        public $secondary_item_id = null;
42
43        /**
44         * The user ID for who the notification is for.
45         *
46         * @var int
47         */
48        public $user_id = 0;
49
50        /**
51         * The name of the component that the notification is for.
52         *
53         * @var string
54         */
55        public $component_name = '';
56
57        /**
58         * The action within the component which the notification is related to.
59         *
60         * @var string
61         */
62        public $component_action = '';
63
64        /**
65         * The date the notification was created.
66         *
67         * @var string
68         */
69        public $date_notified = '';
70
71        /**
72         * Is the notification new or has it already been read.
73         *
74         * @var boolean
75         */
76        public $is_new = false;
77
78        /** Public Methods ********************************************************/
79
80        /**
81         * Constructor
82         *
83         * @param int $id ID for the notification.
84         */
85        public function __construct( $id = 0 ) {
86
87                // Bail if no ID
88                if ( empty( $id ) ) {
89                        return;
90                }
91
92                $this->id = absint( $id );
93                $this->populate();
94        }
95
96        /**
97         * Update or insert notification details into the database.
98         *
99         * @global wpdb $wpdb WordPress database object.
100         *
101         * @return bool Success or failure.
102         */
103        public function save() {
104                global $wpdb;
105
106                $bp = buddypress();
107
108                // Update.
109                if ( ! empty( $this->id ) ) {
110                        $query = "UPDATE {$bp->notifications->table_name} SET item_id = %d, secondary_item_id = %d, user_id = %d, component_name = %s, component_action = %d, date_notified = %s, is_new = %d ) WHERE id = %d";
111                        $sql   = $wpdb->prepare( $query, $this->item_id, $this->secondary_item_id, $this->user_id, $this->component_name, $this->component_action, $this->date_notified, $this->is_new, $this->id );
112
113                // Save.
114                } else {
115                        $query = "INSERT INTO {$bp->notifications->table_name} ( item_id, secondary_item_id, user_id, component_name, component_action, date_notified, is_new ) VALUES ( %d, %d, %d, %s, %s, %s, %d )";
116                        $sql   = $wpdb->prepare( $query, $this->item_id, $this->secondary_item_id, $this->user_id, $this->component_name, $this->component_action, $this->date_notified, $this->is_new );
117                }
118
119                $result = $wpdb->query( $sql );
120
121                if ( empty( $result ) || is_wp_error( $result ) ) {
122                        return false;
123                }
124
125                $this->id = $wpdb->insert_id;
126
127                return true;
128        }
129
130        /** Private Methods *******************************************************/
131
132        /**
133         * Fetches the notification data from the database.
134         *
135         * @global wpdb $wpdb WordPress database object.
136         */
137        public function populate() {
138                global $wpdb;
139
140                $bp = buddypress();
141
142                $query   = "SELECT * FROM {$bp->notifications->table_name} WHERE id = %d";
143                $prepare = $wpdb->prepare( $query, $this->id );
144                $result  = $wpdb->get_row( $prepare );
145
146                if ( ! empty( $result ) ) {
147                        $this->item_id = $result->item_id;
148                        $this->secondary_item_id = $result->secondary_item_id;
149                        $this->user_id           = $result->user_id;
150                        $this->component_name    = $result->component_name;
151                        $this->component_action  = $result->component_action;
152                        $this->date_notified     = $result->date_notified;
153                        $this->is_new            = $result->is_new;
154                }
155        }
156
157        /** Static Methods ********************************************************/
158
159        /**
160         * Check the access for a user.
161         *
162         * @param int $user_id         ID to check access for.
163         * @param int $notification_id Notification ID to check for.
164         * @return string
165         */
166        public static function check_access( $user_id = 0, $notification_id = 0 ) {
167                global $wpdb;
168
169                $bp = buddypress();
170
171                $query   = "SELECT COUNT(id) FROM {$bp->notifications->table_name} WHERE id = %d AND user_id = %d";
172                $prepare = $wpdb->prepare( $query, $notification_id, $user_id );
173                $result  = $wpdb->get_var( $prepare );
174
175                return $result;
176        }
177
178        /**
179         * Fetches all the notifications in the database for a specific user.
180         *
181         * @global wpdb $wpdb WordPress database object
182         *
183         * @static
184         *
185         * @param int    $user_id User ID.
186         * @param string $status 'is_new' or 'all'.
187         * @return array Associative array
188         */
189        public static function get_all_for_user( $user_id, $status = 'is_new' ) {
190                global $wpdb;
191
192                $bp = buddypress();
193
194                $is_new = ( 'is_new' === $status )
195                        ? ' AND is_new = 1 '
196                        : '';
197
198                $query   = "SELECT * FROM {$bp->notifications->table_name} WHERE user_id = %d {$is_new}";
199                $prepare = $wpdb->prepare( $query, $user_id );
200                $result  = $wpdb->get_results( $prepare );
201
202                return $result;
203        }
204
205        /**
206         * Delete all the notifications for a user based on the component name and action.
207         *
208         * @global wpdb $wpdb WordPress database object.
209         *
210         * @static
211         *
212         * @param int    $user_id          ID of the user to delet notification for.
213         * @param string $component_name   Component name.
214         * @param string $component_action Component action.
215         * @return mixed
216         */
217        public static function delete_for_user_by_type( $user_id, $component_name, $component_action ) {
218                global $wpdb;
219
220                $bp = buddypress();
221
222                $query   = "DELETE FROM {$bp->notifications->table_name} WHERE user_id = %d AND component_name = %s AND component_action = %s";
223                $prepare = $wpdb->prepare( $query, $user_id, $component_name, $component_action );
224                $result  = $wpdb->query( $prepare );
225
226                return $result;
227        }
228
229        /**
230         * Delete all the notifications that have a specific item id, component name and action.
231         *
232         * @global wpdb $wpdb WordPress database object.
233         *
234         * @static
235         *
236         * @param int      $user_id           The ID of the user who the notifications are for.
237         * @param int      $item_id           The item ID of the notifications we wish to delete.
238         * @param string   $component_name    The name of the component that the notifications we wish to delete.
239         * @param string   $component_action  The action of the component that the notifications we wish to delete.
240         * @param int      $secondary_item_id (optional) The secondary item id of the notifications that we wish to
241         *                                    use to delete.
242         * @return mixed
243         */
244        public static function delete_for_user_by_item_id( $user_id, $item_id, $component_name, $component_action, $secondary_item_id = 0 ) {
245                global $wpdb;
246
247                $bp = buddypress();
248
249                $secondary_item_sql = ! empty( $secondary_item_id )
250                        ? $wpdb->prepare( " AND secondary_item_id = %d", $secondary_item_id )
251                        : '';
252
253                $query   = "DELETE FROM {$bp->notifications->table_name} WHERE user_id = %d AND item_id = %d AND component_name = %s AND component_action = %s{$secondary_item_sql}";
254                $prepare = $wpdb->prepare( $query, $user_id, $item_id, $component_name, $component_action );
255                $result  = $wpdb->query( $prepare );
256
257                return $result;
258        }
259
260        /**
261         * Deletes all the notifications sent by a specific user, by component and action.
262         *
263         * @global wpdb $wpdb WordPress database object.
264         *
265         * @static
266         *
267         * @param int    $user_id          The ID of the user whose sent notifications we wish to delete.
268         * @param string $component_name   The name of the component the notification was sent from.
269         * @param string $component_action The action of the component the notification was sent from.
270         * @return mixed
271         */
272        public static function delete_from_user_by_type( $user_id, $component_name, $component_action ) {
273                global $wpdb;
274
275                $bp = buddypress();
276
277                $query   = "DELETE FROM {$bp->notifications->table_name} WHERE item_id = %d AND component_name = %s AND component_action = %s";
278                $prepare = $wpdb->prepare( $query, $user_id, $component_name, $component_action );
279                $result  = $wpdb->query( $prepare );
280
281                return $result;
282        }
283
284        /**
285         * Deletes all the notifications for all users by item id, and optional secondary item id,
286         * and component name and action.
287         *
288         * @global wpdb $wpdb WordPress database object.
289         *
290         * @static
291         *
292         * @param int    $item_id           The item id that they notifications are to be for.
293         * @param string $component_name    The component that the notifications are to be from.
294         * @param string $component_action  The action that the notifications are to be from.
295         * @param int    $secondary_item_id Optional secondary item id that the notifications are to have.
296         * @return mixed
297         */
298        public static function delete_all_by_type( $item_id, $component_name, $component_action = '', $secondary_item_id = 0 ) {
299                global $wpdb;
300
301                $component_action_sql = ! empty( $component_action )
302                        ? $wpdb->prepare( "AND component_action = %s", $component_action )
303                        : '';
304
305                $secondary_item_sql = ! empty( $secondary_item_id )
306                        ? $wpdb->prepare( "AND secondary_item_id = %d", $secondary_item_id )
307                        : '';
308
309                $bp = buddypress();
310
311                $query   = "DELETE FROM {$bp->notifications->table_name} WHERE item_id = %d AND component_name = %s {$component_action_sql} {$secondary_item_sql}";
312                $prepare = $wpdb->prepare( $query, $item_id, $component_name );
313                $result  = $wpdb->query( $prepare );
314
315                return $result;
316        }
317}
Note: See TracBrowser for help on using the repository browser.