sebbef8d Posted September 20, 2018 Share Posted September 20, 2018 (edited) Hi! I am at the moment trying to add a notification for the notification system in the wordpress plugin called buddypress. i am pretty new to some of the coding language used in the plugin and there are no guides out there which is working for me so that is why I am here asking for help. Here is a link to the buddypress plugin guide on how to add the notification but I do not understand it so if you could please help me it would help so much! link ---> https://codex.buddypress.org/developer/function-examples/bp_notifications_add_notification/#source-file Here is the file code at where the function need to be added to ---> <?php /** * BuddyPress Member Notifications Functions. * * Functions and filters used in the Notifications component. * * @package BuddyPress * @subpackage NotificationsFunctions * @since 1.9.0 */ // Exit if accessed directly. defined( 'ABSPATH' ) || exit; /** * Add a notification for a specific user, from a specific component. * * @since 1.9.0 * * @param array $args { * Array of arguments describing the notification. All are optional. * @type int $user_id ID of the user to associate the notification with. * @type int $item_id ID of the item to associate the notification with. * @type int $secondary_item_id ID of the secondary item to associate the * notification with. * @type string $component_name Name of the component to associate the * notification with. * @type string $component_action Name of the action to associate the * notification with. * @type string $date_notified Timestamp for the notification. * } * @return int|bool ID of the newly created notification on success, false * on failure. */ function bp_notifications_add_notification( $args = array() ) { $r = bp_parse_args( $args, array( 'user_id' => 0, 'item_id' => 0, 'secondary_item_id' => 0, 'component_name' => '', 'component_action' => '', 'date_notified' => bp_core_current_time(), 'is_new' => 1, 'allow_duplicate' => false, ), 'notifications_add_notification' ); // Check for existing duplicate notifications. if ( ! $r['allow_duplicate'] ) { // Date_notified, allow_duplicate don't count toward // duplicate status. $existing = BP_Notifications_Notification::get( array( 'user_id' => $r['user_id'], 'item_id' => $r['item_id'], 'secondary_item_id' => $r['secondary_item_id'], 'component_name' => $r['component_name'], 'component_action' => $r['component_action'], 'is_new' => $r['is_new'], ) ); if ( ! empty( $existing ) ) { return false; } } // Setup the new notification. $notification = new BP_Notifications_Notification; $notification->user_id = $r['user_id']; $notification->item_id = $r['item_id']; $notification->secondary_item_id = $r['secondary_item_id']; $notification->component_name = $r['component_name']; $notification->component_action = $r['component_action']; $notification->date_notified = $r['date_notified']; $notification->is_new = $r['is_new']; // Save the new notification. return $notification->save(); } /** * Get a specific notification by its ID. * * @since 1.9.0 * * @param int $id ID of the notification. * @return BP_Notifications_Notification Notification object for ID specified. */ function bp_notifications_get_notification( $id ) { return new BP_Notifications_Notification( $id ); } /** * Delete a specific notification by its ID. * * @since 1.9.0 * * @param int $id ID of the notification to delete. * @return false|int True on success, false on failure. */ function bp_notifications_delete_notification( $id ) { if ( ! bp_notifications_check_notification_access( bp_displayed_user_id(), $id ) ) { return false; } return BP_Notifications_Notification::delete( array( 'id' => $id ) ); } /** * Mark notification read/unread for a user by ID. * * Used when clearing out notifications for a specific notification item. * * @since 1.9.0 * * @param int $id ID of the notification. * @param int|bool $is_new 0 for read, 1 for unread. * @return false|int True on success, false on failure. */ function bp_notifications_mark_notification( $id, $is_new = false ) { if ( ! bp_notifications_check_notification_access( bp_displayed_user_id(), $id ) ) { return false; } return BP_Notifications_Notification::update( array( 'is_new' => $is_new ), array( 'id' => $id ) ); } /** * Get all notifications for a user and cache them. * * @since 2.1.0 * * @param int $user_id ID of the user whose notifications are being fetched. * @return array $notifications Array of notifications for user. */ function bp_notifications_get_all_notifications_for_user( $user_id = 0 ) { // Default to displayed user if no ID is passed. if ( empty( $user_id ) ) { $user_id = ( bp_displayed_user_id() ) ? bp_displayed_user_id() : bp_loggedin_user_id(); } // Get notifications out of the cache, or query if necessary. $notifications = wp_cache_get( 'all_for_user_' . $user_id, 'bp_notifications' ); if ( false === $notifications ) { $notifications = BP_Notifications_Notification::get( array( 'user_id' => $user_id ) ); wp_cache_set( 'all_for_user_' . $user_id, $notifications, 'bp_notifications' ); } /** * Filters all notifications for a user. * * @since 2.1.0 * * @param array $notifications Array of notifications for user. * @param int $user_id ID of the user being fetched. */ return apply_filters( 'bp_notifications_get_all_notifications_for_user', $notifications, $user_id ); } /** * Get a user's unread notifications, grouped by component and action. * * This function returns a list of notifications collapsed by component + action. * See BP_Notifications_Notification::get_grouped_notifications_for_user() for * more details. * * @since 3.0.0 * * @param int $user_id ID of the user whose notifications are being fetched. * @return array $notifications */ function bp_notifications_get_grouped_notifications_for_user( $user_id = 0 ) { if ( empty( $user_id ) ) { $user_id = ( bp_displayed_user_id() ) ? bp_displayed_user_id() : bp_loggedin_user_id(); } $notifications = wp_cache_get( $user_id, 'bp_notifications_grouped_notifications' ); if ( false === $notifications ) { $notifications = BP_Notifications_Notification::get_grouped_notifications_for_user( $user_id ); wp_cache_set( $user_id, $notifications, 'bp_notifications_grouped_notifications' ); } return $notifications; } /** * Get notifications for a specific user. * * @since 1.9.0 * * @param int $user_id ID of the user whose notifications are being fetched. * @param string $format Format of the returned values. 'string' returns HTML, * while 'object' returns a structured object for parsing. * @return mixed Object or array on success, false on failure. */ function bp_notifications_get_notifications_for_user( $user_id, $format = 'string' ) { $bp = buddypress(); $notifications = bp_notifications_get_grouped_notifications_for_user( $user_id ); // Calculate a renderable output for each notification type. foreach ( $notifications as $notification_item ) { $component_name = $notification_item->component_name; // We prefer that extended profile component-related notifications use // the component_name of 'xprofile'. However, the extended profile child // object in the $bp object is keyed as 'profile', which is where we need // to look for the registered notification callback. if ( 'xprofile' == $notification_item->component_name ) { $component_name = 'profile'; } // Callback function exists. if ( isset( $bp->{$component_name}->notification_callback ) && is_callable( $bp->{$component_name}->notification_callback ) ) { // Function should return an object. if ( 'object' === $format ) { // Retrieve the content of the notification using the callback. $content = call_user_func( $bp->{$component_name}->notification_callback, $notification_item->component_action, $notification_item->item_id, $notification_item->secondary_item_id, $notification_item->total_count, 'array', $notification_item->id ); // Create the object to be returned. $notification_object = $notification_item; // Minimal backpat with non-compatible notification // callback functions. if ( is_string( $content ) ) { $notification_object->content = $content; $notification_object->href = bp_loggedin_user_domain(); } else { $notification_object->content = $content['text']; $notification_object->href = $content['link']; } $renderable[] = $notification_object; // Return an array of content strings. } else { $content = call_user_func( $bp->{$component_name}->notification_callback, $notification_item->component_action, $notification_item->item_id, $notification_item->secondary_item_id, $notification_item->total_count, 'string', $notification_item->id ); $renderable[] = $content; } // @deprecated format_notification_function - 1.5 } elseif ( isset( $bp->{$component_name}->format_notification_function ) && function_exists( $bp->{$component_name}->format_notification_function ) ) { $renderable[] = call_user_func( $bp->{$component_name}->notification_callback, $notification_item->component_action, $notification_item->item_id, $notification_item->secondary_item_id, $notification_item->total_count ); // Allow non BuddyPress components to hook in. } else { // The array to reference with apply_filters_ref_array(). $ref_array = array( $notification_item->component_action, $notification_item->item_id, $notification_item->secondary_item_id, $notification_item->total_count, $format, $notification_item->component_action, // Duplicated so plugins can check the canonical action name. $component_name, $notification_item->id, ); // Function should return an object. if ( 'object' === $format ) { /** * Filters the notification content for notifications created by plugins. * If your plugin extends the {@link BP_Component} class, you should use the * 'notification_callback' parameter in your extended * {@link BP_Component::setup_globals()} method instead. * * @since 1.9.0 * @since 2.6.0 Added $component_action_name, $component_name, $id as parameters. * * @param string $content Component action. Deprecated. Do not do checks against this! Use * the 6th parameter instead - $component_action_name. * @param int $item_id Notification item ID. * @param int $secondary_item_id Notification secondary item ID. * @param int $action_item_count Number of notifications with the same action. * @param string $format Format of return. Either 'string' or 'object'. * @param string $component_action_name Canonical notification action. * @param string $component_name Notification component ID. * @param int $id Notification ID. * * @return string|array If $format is 'string', return a string of the notification content. * If $format is 'object', return an array formatted like: * array( 'text' => 'CONTENT', 'link' => 'LINK' ) */ $content = apply_filters_ref_array( 'bp_notifications_get_notifications_for_user', $ref_array ); // Create the object to be returned. $notification_object = $notification_item; // Minimal backpat with non-compatible notification // callback functions. if ( is_string( $content ) ) { $notification_object->content = $content; $notification_object->href = bp_loggedin_user_domain(); } else { $notification_object->content = $content['text']; $notification_object->href = $content['link']; } $renderable[] = $notification_object; // Return an array of content strings. } else { /** This filters is documented in bp-notifications/bp-notifications-functions.php */ $renderable[] = apply_filters_ref_array( 'bp_notifications_get_notifications_for_user', $ref_array ); } } } // If renderable is empty array, set to false. if ( empty( $renderable ) ) { $renderable = false; } /** * Filters the final array of notifications to be displayed for a user. * * @since 1.6.0 * * @param array|bool $renderable Array of notifications to render or false if no notifications. * @param int $user_id ID of the user whose notifications are being displayed. * @param string $format Display format requested for the notifications. */ return apply_filters( 'bp_core_get_notifications_for_user', $renderable, $user_id, $format ); } /** Delete ********************************************************************/ /** * Delete notifications for a user by type. * * Used when clearing out notifications for a specific component when the user * has visited that component. * * @since 1.9.0 * * @param int $user_id ID of the user whose notifications are being deleted. * @param string $component_name Name of the associated component. * @param string $component_action Name of the associated action. * @return int|false True on success, false on failure. */ function bp_notifications_delete_notifications_by_type( $user_id, $component_name, $component_action ) { return BP_Notifications_Notification::delete( array( 'user_id' => $user_id, 'component_name' => $component_name, 'component_action' => $component_action, ) ); } /** * Delete notifications for an item ID. * * Used when clearing out notifications for a specific component when the user * has visited that component. * * @since 1.9.0 * * @param int $user_id ID of the user whose notifications are being deleted. * @param int $item_id ID of the associated item. * @param string $component_name Name of the associated component. * @param string $component_action Name of the associated action. * @param int|bool $secondary_item_id ID of the secondary associated item. * @return int|false True on success, false on failure. */ function bp_notifications_delete_notifications_by_item_id( $user_id, $item_id, $component_name, $component_action, $secondary_item_id = false ) { return BP_Notifications_Notification::delete( array( 'user_id' => $user_id, 'item_id' => $item_id, 'secondary_item_id' => $secondary_item_id, 'component_name' => $component_name, 'component_action' => $component_action, ) ); } /** * Delete all notifications by type. * * Used when clearing out notifications for an entire component. * * @since 1.9.0 * * @param int $item_id ID of the user whose notifications are being deleted. * @param string $component_name Name of the associated component. * @param string|bool $component_action Optional. Name of the associated action. * @param int|bool $secondary_item_id Optional. ID of the secondary associated item. * @return int|false True on success, false on failure. */ function bp_notifications_delete_all_notifications_by_type( $item_id, $component_name, $component_action = false, $secondary_item_id = false ) { return BP_Notifications_Notification::delete( array( 'item_id' => $item_id, 'secondary_item_id' => $secondary_item_id, 'component_name' => $component_name, 'component_action' => $component_action, ) ); } /** * Delete all notifications from a user. * * Used when clearing out all notifications for a user, when deleted or spammed. * * @todo This function assumes that items with the user_id in the item_id slot * are associated with that user. However, this will only be true with * certain components (such as Friends). Use with caution! * * @since 1.9.0 * * @param int $user_id ID of the user whose associated items are being deleted. * @param string $component_name Name of the associated component. * @param string $component_action Name of the associated action. * @return int|false True on success, false on failure. */ function bp_notifications_delete_notifications_from_user( $user_id, $component_name, $component_action ) { return BP_Notifications_Notification::delete( array( 'item_id' => $user_id, 'component_name' => $component_name, 'component_action' => $component_action, ) ); } /** * Delete a user's notifications when the user is deleted. * * @since 2.5.0 * * @param int $user_id ID of the user who is about to be deleted. * @return int|false The number of rows deleted, or false on error. */ function bp_notifications_delete_notifications_on_user_delete( $user_id ) { return BP_Notifications_Notification::delete( array( 'user_id' => $user_id, 'item_id' => false, 'secondary_item_id' => false, 'component_action' => false, 'component_name' => false, ) ); } add_action( 'wpmu_delete_user', 'bp_notifications_delete_notifications_on_user_delete' ); add_action( 'delete_user', 'bp_notifications_delete_notifications_on_user_delete' ); /** Mark **********************************************************************/ /** * Mark notifications read/unread for a user by type. * * Used when clearing out notifications for a specific component when the user * has visited that component. * * @since 1.9.0 * * @param int $user_id ID of the user whose notifications are being deleted. * @param string $component_name Name of the associated component. * @param string $component_action Name of the associated action. * @param int|bool $is_new 0 for read, 1 for unread. * @return int|false True on success, false on failure. */ function bp_notifications_mark_notifications_by_type( $user_id, $component_name, $component_action, $is_new = false ) { return BP_Notifications_Notification::update( array( 'is_new' => $is_new ), array( 'user_id' => $user_id, 'component_name' => $component_name, 'component_action' => $component_action ) ); } /** * Mark notifications read/unread for an item ID. * * Used when clearing out notifications for a specific component when the user * has visited that component. * * @since 1.9.0 * * @param int $user_id ID of the user whose notifications are being deleted. * @param int $item_id ID of the associated item. * @param string $component_name Name of the associated component. * @param string $component_action Name of the associated action. * @param int|bool $secondary_item_id ID of the secondary associated item. * @param int|bool $is_new 0 for read, 1 for unread. * @return int|false True on success, false on failure. */ function bp_notifications_mark_notifications_by_item_id( $user_id, $item_id, $component_name, $component_action, $secondary_item_id = false, $is_new = false ) { return BP_Notifications_Notification::update( array( 'is_new' => $is_new ), array( 'user_id' => $user_id, 'item_id' => $item_id, 'secondary_item_id' => $secondary_item_id, 'component_name' => $component_name, 'component_action' => $component_action ) ); } /** * Mark all notifications read/unread by type. * * Used when clearing out notifications for an entire component. * * @since 1.9.0 * * @param int $item_id ID of the user whose notifications are being deleted. * @param string $component_name Name of the associated component. * @param string|bool $component_action Optional. Name of the associated action. * @param int|bool $secondary_item_id Optional. ID of the secondary associated item. * @param int|bool $is_new 0 for read, 1 for unread. * @return int|false True on success, false on failure. */ function bp_notifications_mark_all_notifications_by_type( $item_id, $component_name, $component_action = false, $secondary_item_id = false, $is_new = false ) { return BP_Notifications_Notification::update( array( 'is_new' => $is_new ), array( 'item_id' => $item_id, 'secondary_item_id' => $secondary_item_id, 'component_name' => $component_name, 'component_action' => $component_action ) ); } /** * Mark all notifications read/unread from a user. * * Used when clearing out all notifications for a user, when deleted or spammed. * * @todo This function assumes that items with the user_id in the item_id slot * are associated with that user. However, this will only be true with * certain components (such as Friends). Use with caution! * * @since 1.9.0 * * @param int $user_id ID of the user whose associated items are being deleted. * @param string $component_name Name of the associated component. * @param string $component_action Name of the associated action. * @param int|bool $is_new 0 for read, 1 for unread. * @return int|false True on success, false on failure. */ function bp_notifications_mark_notifications_from_user( $user_id, $component_name, $component_action, $is_new = false ) { return BP_Notifications_Notification::update( array( 'is_new' => $is_new ), array( 'item_id' => $user_id, 'component_name' => $component_name, 'component_action' => $component_action ) ); } /** Helpers *******************************************************************/ /** * Check if a user has access to a specific notification. * * Used before deleting a notification for a user. * * @since 1.9.0 * * @param int $user_id ID of the user being checked. * @param int $notification_id ID of the notification being checked. * @return bool True if the notification belongs to the user, otherwise false. */ function bp_notifications_check_notification_access( $user_id, $notification_id ) { return (bool) BP_Notifications_Notification::check_access( $user_id, $notification_id ); } /** * Get a count of unread notification items for a user. * * @since 1.9.0 * * @param int $user_id ID of the user whose unread notifications are being * counted. * @return int Unread notification count. */ function bp_notifications_get_unread_notification_count( $user_id = 0 ) { if ( empty( $user_id ) ) { $user_id = ( bp_displayed_user_id() ) ? bp_displayed_user_id() : bp_loggedin_user_id(); } $count = wp_cache_get( $user_id, 'bp_notifications_unread_count' ); if ( false === $count ) { $count = BP_Notifications_Notification::get_total_count( array( 'user_id' => $user_id, 'is_new' => true, ) ); wp_cache_set( $user_id, $count, 'bp_notifications_unread_count' ); } /** * Filters the count of unread notification items for a user. * * @since 1.9.0 * @since 2.7.0 Added user ID parameter. * * @param int $count Count of unread notification items for a user. * @param int $user_id User ID for notifications count. */ return apply_filters( 'bp_notifications_get_total_notification_count', (int) $count, $user_id ); } /** * Return an array of component names that are currently active and have * registered Notifications callbacks. * * @since 1.9.1 * * @see http://buddypress.trac.wordpress.org/ticket/5300 * * @return array $component_names Array of registered components. */ function bp_notifications_get_registered_components() { // Load BuddyPress. $bp = buddypress(); // Setup return value. $component_names = array(); // Get the active components. $active_components = array_keys( $bp->active_components ); // Loop through components, look for callbacks, add to return value. foreach ( $active_components as $component ) { if ( !empty( $bp->$component->notification_callback ) ) { $component_names[] = $component; } // The extended profile component is identified in the active_components array as 'xprofile'. // However, the extended profile child object has the key 'profile' in the $bp object. if ( 'xprofile' == $component && ! empty( $bp->profile->notification_callback ) ) { $component_names[] = $component; } } /** * Filters active components with registered notifications callbacks. * * @since 1.9.1 * * @param array $component_names Array of registered component names. * @param array $active_components Array of active components. */ return apply_filters( 'bp_notifications_get_registered_components', $component_names, $active_components ); } /** * Catch and route the 'settings' notifications screen. * * This is currently unused. * * @since 1.9.0 */ function bp_notifications_screen_settings() {} /** Meta **********************************************************************/ /** * Delete a meta entry from the DB for a notification item. * * @since 2.3.0 * * @global object $wpdb WordPress database access object. * * @param int $notification_id ID of the notification item whose metadata is being deleted. * @param string $meta_key Optional. The key of the metadata being deleted. If * omitted, all metadata associated with the notification * item will be deleted. * @param string $meta_value Optional. If present, the metadata will only be * deleted if the meta_value matches this parameter. * @param bool $delete_all Optional. If true, delete matching metadata entries * for all objects, ignoring the specified object_id. Otherwise, * only delete matching metadata entries for the specified * notification item. Default: false. * @return bool True on success, false on failure. */ function bp_notifications_delete_meta( $notification_id, $meta_key = '', $meta_value = '', $delete_all = false ) { // Legacy - if no meta_key is passed, delete all for the item. if ( empty( $meta_key ) ) { $all_meta = bp_notifications_get_meta( $notification_id ); $keys = ! empty( $all_meta ) ? array_keys( $all_meta ) : array(); // With no meta_key, ignore $delete_all. $delete_all = false; } else { $keys = array( $meta_key ); } $retval = true; add_filter( 'query', 'bp_filter_metaid_column_name' ); foreach ( $keys as $key ) { $retval = delete_metadata( 'notification', $notification_id, $key, $meta_value, $delete_all ); } remove_filter( 'query', 'bp_filter_metaid_column_name' ); return $retval; } /** * Get metadata for a given notification item. * * @since 2.3.0 * * @param int $notification_id ID of the notification item whose metadata is being requested. * @param string $meta_key Optional. If present, only the metadata matching * that meta key will be returned. Otherwise, all metadata for the * notification item will be fetched. * @param bool $single Optional. If true, return only the first value of the * specified meta_key. This parameter has no effect if meta_key is not * specified. Default: true. * @return mixed The meta value(s) being requested. */ function bp_notifications_get_meta( $notification_id = 0, $meta_key = '', $single = true ) { add_filter( 'query', 'bp_filter_metaid_column_name' ); $retval = get_metadata( 'notification', $notification_id, $meta_key, $single ); remove_filter( 'query', 'bp_filter_metaid_column_name' ); /** * Filters the metadata for a specified notification item. * * @since 2.3.0 * * @param mixed $retval The meta values for the notification item. * @param int $notification_id ID of the notification item. * @param string $meta_key Meta key for the value being requested. * @param bool $single Whether to return one matched meta key row or all. */ return apply_filters( 'bp_notifications_get_meta', $retval, $notification_id, $meta_key, $single ); } /** * Update a piece of notification meta. * * @since 1.2.0 * * @param int $notification_id ID of the notification item whose metadata is being * updated. * @param string $meta_key Key of the metadata being updated. * @param mixed $meta_value Value to be set. * @param mixed $prev_value Optional. If specified, only update existing * metadata entries with the specified value. * Otherwise, update all entries. * @return bool|int Returns false on failure. On successful * update of existing metadata, returns true. On * successful creation of new metadata, returns * the integer ID of the new metadata row. */ function bp_notifications_update_meta( $notification_id, $meta_key, $meta_value, $prev_value = '' ) { add_filter( 'query', 'bp_filter_metaid_column_name' ); $retval = update_metadata( 'notification', $notification_id, $meta_key, $meta_value, $prev_value ); remove_filter( 'query', 'bp_filter_metaid_column_name' ); return $retval; } /** * Add a piece of notification metadata. * * @since 2.3.0 * * @param int $notification_id ID of the notification item. * @param string $meta_key Metadata key. * @param mixed $meta_value Metadata value. * @param bool $unique Optional. Whether to enforce a single metadata value * for the given key. If true, and the object already has a value for * the key, no change will be made. Default: false. * @return int|bool The meta ID on successful update, false on failure. */ function bp_notifications_add_meta( $notification_id, $meta_key, $meta_value, $unique = false ) { add_filter( 'query', 'bp_filter_metaid_column_name' ); $retval = add_metadata( 'notification', $notification_id, $meta_key, $meta_value, $unique ); remove_filter( 'query', 'bp_filter_metaid_column_name' ); return $retval; } Edited September 20, 2018 by Barand Added code tags Quote Link to comment Share on other sites More sharing options...
Barand Posted September 20, 2018 Share Posted September 20, 2018 In future, please use code tags (<> button in toolbar) and restrict it to relevant code oonly. Quote Link to comment Share on other sites More sharing options...
maxxd Posted September 22, 2018 Share Posted September 22, 2018 (edited) What exactly are you trying to do? The sample code (not the source code, but the usage example) is pretty straight-forward. Select the action hook you want to use (codex listing) and call the bp_notifications_add_notifications() function at that point. Note the difference in the sample code between the ' bp_activity_at_mention_add_notification ' function and the called system ' bp_notifications_add_notification ' function - the first calls the second at the time the ' bp_activity_sent_mention_email ' action fires. If you're not familiar with WordPress's action and filter hooks, I'd recommend doing some digging into them. It's a pretty easy concept to grasp, though admittedly the WP documentation can be lacking and/or outdated, especially right now as some major changes are happening with the core. Edited September 22, 2018 by maxxd grammer - apparently it's a good idea. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.