Skip to:
Content

BuddyPress.org

Ticket #5148: 5148.class.01.patch

File 5148.class.01.patch, 20.7 KB (added by r-a-y, 11 years ago)
  • bp-activity/bp-activity-notifications.php

    if ( !defined( 'ABSPATH' ) ) exit; 
    3939 */
    4040function bp_activity_at_message_notification( $activity_id, $receiver_user_id ) {
    4141
    42         // Don't leave multiple notifications for the same activity item
    43         $notifications = BP_Core_Notification::get_all_for_user( $receiver_user_id, 'all' );
    44 
    45         foreach( $notifications as $notification ) {
    46                 if ( $activity_id == $notification->item_id ) {
    47                         return;
    48                 }
     42        // Check to see if an at-mention notification exists for this activity item
     43        $notifications = BP_Core_Notification::get( array(
     44                'user_id'          => $receiver_user_id,
     45                'item_id'          => $notification->item_id,
     46                'component_action' => 'new_at_mention'
     47        ) );
     48
     49        // At-mention notification already exists, so stop!
     50        if ( ! empty( $notifications ) ) {
     51                return;
    4952        }
    5053
     54        // Setup new BP notification
    5155        $activity = new BP_Activity_Activity( $activity_id );
    5256
    5357        $subject = '';
  • bp-core/bp-core-classes.php

    class BP_Core_Notification { 
    13141314        /**
    13151315         * Update or insert notification details into the database.
    13161316         *
    1317          * @global BuddyPress $bp The one true BuddyPress instance
    13181317         * @global wpdb $wpdb WordPress database object
    13191318         * @return bool Success or failure
    13201319         */
    13211320        public function save() {
    1322                 global $bp, $wpdb;
     1321                global $wpdb;
     1322
     1323                $bp = buddypress();
     1324
     1325                // Allow manipulation before saving
     1326                do_action_ref_array( 'bp_notification_before_save', array( &$this ) );
     1327
     1328                // Make sure there's a user ID before saving. If not, stop now!
     1329                // This allows plugin devs to bail out of saving notifications if necessary
     1330                if ( empty( $this->user_id ) ) {
     1331                        return false;
     1332                }
    13231333
    13241334                // Update
    13251335                if ( !empty( $this->id ) ) {
    1326                         $sql = $wpdb->prepare( "UPDATE {$bp->core->table_name_notifications} 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", $this->item_id, $this->secondary_item_id, $this->user_id, $this->component_name, $this->component_action, $this->date_notified, $this->is_new, $this->id );
     1336                        $sql = $wpdb->prepare( "UPDATE {$bp->core->table_name_notifications} 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", $this->item_id, $this->secondary_item_id, $this->user_id, $this->component_name, $this->component_action, $this->date_notified, $this->is_new, $this->id );
    13271337
    13281338                // Save
    13291339                } else {
    class BP_Core_Notification { 
    13351345
    13361346                $this->id = $wpdb->insert_id;
    13371347
     1348                // Allow manipulation after saving
     1349                do_action_ref_array( 'bp_notification_after_save', array( &$this ) );
     1350
    13381351                return true;
    13391352        }
    13401353
    class BP_Core_Notification { 
    13431356        /**
    13441357         * Fetches the notification data from the database.
    13451358         *
    1346          * @global BuddyPress $bp The one true BuddyPress instance
    13471359         * @global wpdb $wpdb WordPress database object
    13481360         */
    13491361        public function populate() {
    1350                 global $bp, $wpdb;
     1362                global $wpdb;
     1363
     1364                $bp = buddypress();
    13511365
    13521366                if ( $notification = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$bp->core->table_name_notifications} WHERE id = %d", $this->id ) ) ) {
    1353                         $this->item_id = $notification->item_id;
     1367                        $this->item_id           = $notification->item_id;
    13541368                        $this->secondary_item_id = $notification->secondary_item_id;
    13551369                        $this->user_id           = $notification->user_id;
    13561370                        $this->component_name    = $notification->component_name;
    class BP_Core_Notification { 
    13631377        /** Static Methods ********************************************************/
    13641378
    13651379        public static function check_access( $user_id, $notification_id ) {
    1366                 global $wpdb, $bp;
     1380                global $wpdb;
     1381
     1382                $bp = buddypress();
    13671383
    13681384                return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(id) FROM {$bp->core->table_name_notifications} WHERE id = %d AND user_id = %d", $notification_id, $user_id ) );
    13691385        }
    13701386
    13711387        /**
     1388         * Get notifications.
     1389         *
     1390         * @since BuddyPress (1.9)
     1391         *
     1392         * @param array $args The parameters to get notifications {
     1393         *      @type int|string $id If integer, the notification ID. If string, list of
     1394         *       comma-delimited notification IDs.
     1395         *      @type int $user_id The user ID to filter by
     1396         *      @type int $item_id The item ID to filter by
     1397         *      @type int $secondary_item_id The secondary item ID to filter by
     1398         *      @type string $component_name The component name to filter by
     1399         *      @type string $component_action The component action to filter by
     1400         *      @type int $is_new Whether to filter by new notifications. Either 1 or 0.
     1401         * }
     1402         */
     1403        public static function get( $args = array() ) {
     1404                global $wpdb;
     1405
     1406                $bp = buddypress();
     1407
     1408                $defaults = array(
     1409                        'id'                => false,                 // the notificaton ID; can be comma-delimited to grab multiple notifications
     1410                        'user_id'           => bp_loggedin_user_id(), // the user ID you want to grab notifications for
     1411                        'item_id'           => false,
     1412                        'secondary_item_id' => false,
     1413                        'component_name'    => false,                 // the BP component ID
     1414                        'component_action'  => false,                 // the notification action
     1415                        'is_new'            => false,                 // check if the notification is new
     1416                );
     1417               
     1418                $r = wp_parse_args( $args, $defaults );
     1419
     1420                // SQL statement begins
     1421                $select_sql = "SELECT *";
     1422                $from_sql   = "FROM {$bp->core->table_name_notifications}";
     1423                $where_sql  = self::get_where_sql( $r );
     1424
     1425                // Apply a filter for plugin devs
     1426                $sql = apply_filters( 'bp_notifications_get_sql',
     1427                        "{$select_sql} {$from_sql} {$where_sql}",
     1428                        $r
     1429                );
     1430
     1431                return $wpdb->get_results( $sql );
     1432        }
     1433
     1434        /**
     1435         * Delete notifications.
     1436         *
     1437         * @since BuddyPress (1.9)
     1438         *
     1439         * @param int|array If int, the notification ID. Otherwise, an array of parameters to delete notifications {
     1440         *      @type int|string $id If integer, the notification ID. If string, comma-delimited
     1441         *       notification IDs.
     1442         *      @type int $user_id The user ID to filter by
     1443         *      @type int $item_id The item ID to filter by
     1444         *      @type int $secondary_item_id The secondary item ID to filter by
     1445         *      @type string $component_name The component name to filter by
     1446         *      @type string $component_action The component action to filter by
     1447         *      @type int $is_new Whether to filter by new notifications. Either 1 or 0.
     1448         * }
     1449         */
     1450        public static function delete( $args = array() ) {
     1451                global $wpdb;
     1452
     1453                $bp = buddypress();
     1454               
     1455                // support older integer parameter as referenced in
     1456                // bp_core_delete_notification()
     1457                if ( is_numeric( $args ) ) {
     1458                        $r = array();
     1459                        $r['id'] = $args;
     1460
     1461                // new way of doing things
     1462                } else {
     1463                        $defaults = array(
     1464                                'id'                => false, // the notificaton ID; can be comma-delimited to grab multiple notifications
     1465                                'user_id'           => false, // the user ID you want to grab notifications for
     1466                                'item_id'           => false,
     1467                                'secondary_item_id' => false,
     1468                                'component_name'    => false, // the BP component ID
     1469                                'component_action'  => false, // the notification action
     1470                                'is_new'            => false, // check if the notification is new
     1471                        );
     1472
     1473                        $r = wp_parse_args( $args, $defaults );
     1474                }
     1475
     1476                // generate WHERE sql
     1477                $where_sql = self::get_where_sql( $r );
     1478
     1479                // Apply a filter for plugin devs
     1480                $sql = apply_filters( 'bp_notifications_delete_sql',
     1481                        "DELETE FROM {$bp->core->table_name_notifications} {$where_sql}",
     1482                        $r
     1483                );
     1484
     1485                // Finally remove the group entry from the DB
     1486                if ( ! $wpdb->query( $sql ) ) {
     1487                        return false;
     1488                }
     1489
     1490                return true;
     1491        }
     1492
     1493        /**
     1494         * Utility method to generate the WHERE sql statement used in the
     1495         * {@link BP_Core_Notication::get()} and {@link BP_Core_Notication::delete()} methods.
     1496         *
     1497         * @since BuddyPress (1.9)
     1498         *
     1499         * @todo 'date_notified' column is omitted currently.
     1500         *
     1501         * @param array $params See BP_Core_Notication::get() for full description.
     1502         */
     1503        public static function get_where_sql( $params = array() ) {
     1504                global $wpdb;
     1505
     1506                $where_conditions = array();
     1507
     1508                if ( ! empty( $params['id'] ) ) {
     1509                        $in = implode( ',', wp_parse_id_list( $in ) );
     1510                        $where_conditions['id'] = "id IN ({$in})";
     1511                }
     1512
     1513                if ( ! empty( $params['user_id'] ) ) {
     1514                        $where_conditions['user_id']           =  $wpdb->prepare( "user_id = %d", $params['user_id'] );
     1515                }
     1516
     1517                if ( ! empty( $params['item_id'] ) ) {
     1518                        $where_conditions['item_id']           = $wpdb->prepare( "item_id = %d", $params['item_id'] );
     1519                }
     1520
     1521                if (  $params['secondary_item_id'] !== false ) {
     1522                        $where_conditions['secondary_item_id'] = $wpdb->prepare( "secondary_item_id = %d", $params['secondary_item_id'] );
     1523                }
     1524
     1525                if ( ! empty( $params['component'] ) ) {
     1526                        $where_conditions['component_name']    = $wpdb->prepare( "component_name = %s", $params['component_name'] );
     1527                }
     1528
     1529                if ( ! empty( $params['action'] ) ) {
     1530                        $where_conditions['component_action']  = $wpdb->prepare( "component_action = %s", $params['component_action'] );
     1531                }
     1532
     1533                if ( $params['is_new'] !== false ) {
     1534                        $where_conditions['is_new']            = $wpdb->prepare( "is_new = %d", $params['is_new'] );
     1535                }
     1536
     1537                return 'WHERE ' . join( ' AND ', $where_conditions );
     1538
     1539        }
     1540
     1541        /** Deprecated ************************************************************/
     1542
     1543        /**
    13721544         * Fetches all the notifications in the database for a specific user.
    13731545         *
    1374          * @global BuddyPress $bp The one true BuddyPress instance
    1375          * @global wpdb $wpdb WordPress database object
     1546         * @deprecated 1.9 Use BP_Core_Notification::get() with the 'user_id' and 'is_new'
     1547         *  parameters instead.
     1548         *
    13761549         * @param integer $user_id User ID
    13771550         * @param string $status 'is_new' or 'all'
    13781551         * @return array Associative array
    13791552         * @static
    13801553         */
    13811554        public static function get_all_for_user( $user_id, $status = 'is_new' ) {
    1382                 global $bp, $wpdb;
    1383 
    1384                 $is_new = ( 'is_new' == $status ) ? ' AND is_new = 1 ' : '';
     1555                _deprecated_function( __METHOD__, '1.9', "BP_Core_Notification::get() with the 'user_id' and 'is_new' parameters" );
    13851556
    1386                 return $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$bp->core->table_name_notifications} WHERE user_id = %d {$is_new}", $user_id ) );
     1557                return self::get( array(
     1558                        'user_id' => $user_id,
     1559                        'is_new'  => ( 'is_new' == $status ) ? 1 : false
     1560                ) );
    13871561        }
    13881562
    13891563        /**
    1390          * Delete all the notifications for a user based on the component name and action.
     1564         * Delete all the notifications for a user based on the component name and
     1565         * action.
     1566         *
     1567         * @deprecated 1.9 Use BP_Core_Notification::get() with the 'user_id', 'component_name',
     1568         *  and 'component_action' parameters instead.
    13911569         *
    1392          * @global BuddyPress $bp The one true BuddyPress instance
    1393          * @global wpdb $wpdb WordPress database object
    13941570         * @param integer $user_id
    13951571         * @param string $component_name
    13961572         * @param string $component_action
    13971573         * @static
    13981574         */
    13991575        public static function delete_for_user_by_type( $user_id, $component_name, $component_action ) {
    1400                 global $bp, $wpdb;
     1576                _deprecated_function( __METHOD__, '1.9', "BP_Core_Notification::get() with the 'user_id', 'component_name' and 'component_action' parameters" );
    14011577
    1402                 return $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->core->table_name_notifications} WHERE user_id = %d AND component_name = %s AND component_action = %s", $user_id, $component_name, $component_action ) );
     1578                return self::delete( array(
     1579                        'user_id'          => $user_id,
     1580                        'component_name'   => $component_name,
     1581                        'component_action' => $component_action
     1582                ) );
    14031583        }
    14041584
    14051585        /**
    1406          * Delete all the notifications that have a specific item id, component name and action.
     1586         * Delete all the notifications that have a specific item id, component name
     1587         * and action.
     1588         *
     1589         * @deprecated 1.9 Use BP_Core_Notification::get() with the 'user_id', 'item_id',
     1590         *  'component_name', 'component_action' and 'secondary_item_id' parameters instead.
    14071591         *
    1408          * @global BuddyPress $bp The one true BuddyPress instance
    1409          * @global wpdb $wpdb WordPress database object
    14101592         * @param integer $user_id The ID of the user who the notifications are for.
    14111593         * @param integer $item_id The item ID of the notifications we wish to delete.
    14121594         * @param string $component_name The name of the component that the notifications we wish to delete.
    class BP_Core_Notification { 
    14151597         * @static
    14161598         */
    14171599        public static function delete_for_user_by_item_id( $user_id, $item_id, $component_name, $component_action, $secondary_item_id = false ) {
    1418                 global $bp, $wpdb;
    1419 
    1420                 $secondary_item_sql = !empty( $secondary_item_id ) ? $wpdb->prepare( " AND secondary_item_id = %d", $secondary_item_id ) : '';
    1421 
    1422                 return $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->core->table_name_notifications} WHERE user_id = %d AND item_id = %d AND component_name = %s AND component_action = %s{$secondary_item_sql}", $user_id, $item_id, $component_name, $component_action ) );
     1600                _deprecated_function( __METHOD__, '1.9', "BP_Core_Notification::get() with the 'user_id', 'item_id', 'component_name', 'component_action' and 'secondary_item_id' parameters." );
     1601
     1602                return self::delete( array(
     1603                        'user_id'           => $user_id,
     1604                        'item_id'           => $item_id,
     1605                        'component_name'    => $component_name,
     1606                        'component_action'  => $component_action,
     1607                        'secondary_item_id' => $secondary_item_id,
     1608                ) );
    14231609        }
    14241610
    14251611        /**
    1426          * Deletes all the notifications sent by a specific user, by component and action.
     1612         * Deletes all the notifications sent by a specific user, by component and
     1613         * action.
     1614         *
     1615         * @deprecated 1.9 Use BP_Core_Notification::get() with the 'user_id', 'component_name'
     1616         *  and 'secondary_item_id' parameters instead.
    14271617         *
    1428          * @global BuddyPress $bp The one true BuddyPress instance
    1429          * @global wpdb $wpdb WordPress database object
    14301618         * @param integer $user_id The ID of the user whose sent notifications we wish to delete.
    14311619         * @param string $component_name The name of the component the notification was sent from.
    14321620         * @param string $component_action The action of the component the notification was sent from.
    14331621         * @static
    14341622         */
    14351623        public static function delete_from_user_by_type( $user_id, $component_name, $component_action ) {
    1436                 global $bp, $wpdb;
     1624                _deprecated_function( __METHOD__, '1.9', "BP_Core_Notification::get() with the 'user_id', 'component_name' and 'component_action' parameters" );
    14371625
    1438                 return $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->core->table_name_notifications} WHERE item_id = %d AND component_name = %s AND component_action = %s", $user_id, $component_name, $component_action ) );
     1626                return self::delete( array(
     1627                        'user_id'           => $user_id,
     1628                        'component_name'    => $component_name,
     1629                        'component_action'  => $component_action
     1630                ) );
    14391631        }
    14401632
    14411633        /**
    1442          * Deletes all the notifications for all users by item id, and optional secondary item id, and component name and action.
     1634         * Deletes all the notifications for all users by item id, and optional
     1635         * secondary item id, and component name and action.
     1636         *
     1637         * @deprecated 1.9 Use BP_Core_Notification::get() with the 'item_id', 'component_name'
     1638         *  and 'secondary_item_id' parameters instead.
    14431639         *
    1444          * @global BuddyPress $bp The one true BuddyPress instance
    1445          * @global wpdb $wpdb WordPress database object
    14461640         * @param string $item_id The item id that they notifications are to be for.
    14471641         * @param string $component_name The component that the notifications are to be from.
    14481642         * @param string $component_action The action that the notificationsa are to be from.
    class BP_Core_Notification { 
    14501644         * @static
    14511645         */
    14521646        public static function delete_all_by_type( $item_id, $component_name, $component_action, $secondary_item_id ) {
    1453                 global $bp, $wpdb;
    1454 
    1455                 if ( $component_action )
    1456                         $component_action_sql = $wpdb->prepare( "AND component_action = %s", $component_action );
    1457                 else
    1458                         $component_action_sql = '';
    1459 
    1460                 if ( $secondary_item_id )
    1461                         $secondary_item_sql = $wpdb->prepare( "AND secondary_item_id = %d", $secondary_item_id );
    1462                 else
    1463                         $secondary_item_sql = '';
    1464 
    1465                 return $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->core->table_name_notifications} WHERE item_id = %d AND component_name = %s {$component_action_sql} {$secondary_item_sql}", $item_id, $component_name ) );
     1647                _deprecated_function( __METHOD__, '1.9', "BP_Core_Notification::get() with the 'item_id', 'component_name', 'component_action' and 'secondary_item_id' parameters" );
     1648
     1649                return self::delete( array(
     1650                        'item_id'           => $item_id,
     1651                        'component_name'    => $component_name,
     1652                        'component_action'  => $component_action,
     1653                        'secondary_item_id' => $secondary_item_id,
     1654                ) );
    14661655        }
    14671656}
    14681657
  • bp-core/deprecated/1.5.php

    To view and respond to the message, log in and visit: %4$s 
    381381 */
    382382function bp_core_delete_notifications_for_user_by_type( $user_id, $component_name, $component_action ) {
    383383        _deprecated_function( __FUNCTION__, '1.5', 'bp_core_delete_notifications_by_type()' );
    384         return BP_Core_Notification::delete_for_user_by_type( $user_id, $component_name, $component_action );
     384        return bp_core_delete_notifications_by_type( $user_id, $component_name, $component_action );
    385385}
    386386
    387387function bp_core_delete_notifications_for_user_by_item_id( $user_id, $item_id, $component_name, $component_action, $secondary_item_id = false ) {
    388388        _deprecated_function( __FUNCTION__, '1.5', 'bp_core_delete_notifications_by_item_id()' );
    389         return BP_Core_Notification::delete_for_user_by_item_id( $user_id, $item_id, $component_name, $component_action, $secondary_item_id );
     389        return bp_core_delete_notifications_by_item_id( $user_id, $item_id, $component_name, $component_action, $secondary_item_id );
    390390}
    391391
    392392/**
  • bp-members/bp-members-notifications.php

    function bp_core_get_notification( $id ) { 
    8383function bp_core_get_notifications_for_user( $user_id, $format = 'simple' ) {
    8484        global $bp;
    8585
    86         $notifications         = BP_Core_Notification::get_all_for_user( $user_id );
     86        $notifications         = BP_Core_Notification::get( array( 'user_id' => $user_id ) );
    8787        $grouped_notifications = array(); // Notification groups
    8888        $renderable            = array(); // Renderable notifications
    8989
    function bp_core_get_notifications_for_user( $user_id, $format = 'simple' ) { 
    184184 * @return boolean True on success, false on fail
    185185 */
    186186function bp_core_delete_notifications_by_type( $user_id, $component_name, $component_action ) {
    187         return BP_Core_Notification::delete_for_user_by_type( $user_id, $component_name, $component_action );
     187        return BP_Core_Notification::delete( array(
     188                'user_id'          => $user_id,
     189                'component_name'   => $component_name,
     190                'component_action' => $component_action
     191        ) );
    188192}
    189193
    190194/**
    function bp_core_delete_notifications_by_type( $user_id, $component_name, $compo 
    200204 * @return boolean True on success, false on fail
    201205 */
    202206function bp_core_delete_notifications_by_item_id( $user_id, $item_id, $component_name, $component_action, $secondary_item_id = false ) {
    203         return BP_Core_Notification::delete_for_user_by_item_id( $user_id, $item_id, $component_name, $component_action, $secondary_item_id );
     207        return BP_Core_Notification::delete( array(
     208                'user_id'           => $user_id,
     209                'item_id'           => $item_id,
     210                'component_name'    => $component_name,
     211                'component_action'  => $component_action,
     212                'secondary_item_id' => $secondary_item_id
     213        ) );
    204214}
    205215
    206216/**
    function bp_core_delete_notifications_by_item_id( $user_id, $item_id, $component 
    215225 * @return boolean True on success, false on fail
    216226 */
    217227function bp_core_delete_all_notifications_by_type( $item_id, $component_name, $component_action = false, $secondary_item_id = false ) {
    218         return BP_Core_Notification::delete_all_by_type( $item_id, $component_name, $component_action, $secondary_item_id );
     228        return BP_Core_Notification::delete( array(
     229                'item_id'           => $item_id,
     230                'component_name'    => $component_name,
     231                'component_action'  => $component_action,
     232                'secondary_item_id' => $secondary_item_id
     233        ) );
    219234}
    220235
    221236/**
    function bp_core_delete_all_notifications_by_type( $item_id, $component_name, $c 
    230245 * @return boolean True on success, false on fail
    231246 */
    232247function bp_core_delete_notifications_from_user( $user_id, $component_name, $component_action ) {
    233         return BP_Core_Notification::delete_from_user_by_type( $user_id, $component_name, $component_action );
     248        return BP_Core_Notification::delete( array(
     249                'user_id'           => $user_id,
     250                'component_name'    => $component_name,
     251                'component_action'  => $component_action
     252        ) );
    234253}
    235254
    236255/**