Notifications()
Description #
AnsPress notifications hooks.
Source #
File: addons/notifications/notifications.php
class Notifications extends \AnsPress\Singleton { /** * Instance of this class. * * @var object * @since 4.1.8 */ protected static $instance = null; /** * Initialize the class. * * @since 4.1.8 */ protected function __construct() { ap_add_default_options( array( 'user_page_title_notifications' => __( 'Notifications', 'anspress-question-answer' ), 'user_page_slug_notifications' => 'notifications', ) ); anspress()->add_filter( 'ap_settings_menu_features_groups', $this, 'add_to_settings_page' ); anspress()->add_filter( 'ap_form_options_features_notification', $this, 'load_options' ); // Activate AnsPress notifications only if buddypress not active. if ( ap_is_addon_active( 'buddypress.php' ) ) { return; } ap_register_page( 'notifications', __( 'Notifications', 'anspress-question-answer' ), '', true, true ); anspress()->add_filter( 'ap_menu_object', $this, 'ap_menu_object' ); anspress()->add_action( 'ap_notification_verbs', $this, 'register_verbs' ); anspress()->add_action( 'ap_user_pages', $this, 'ap_user_pages' ); anspress()->add_action( 'ap_after_new_answer', $this, 'new_answer', 10, 2 ); anspress()->add_action( 'ap_trash_question', $this, 'trash_question', 10, 2 ); anspress()->add_action( 'ap_before_delete_question', $this, 'trash_question', 10, 2 ); anspress()->add_action( 'ap_trash_answer', $this, 'trash_answer', 10, 2 ); anspress()->add_action( 'ap_before_delete_answer', $this, 'trash_answer', 10, 2 ); anspress()->add_action( 'ap_untrash_answer', $this, 'new_answer', 10, 2 ); anspress()->add_action( 'ap_select_answer', $this, 'select_answer' ); anspress()->add_action( 'ap_unselect_answer', $this, 'unselect_answer' ); anspress()->add_action( 'ap_publish_comment', $this, 'new_comment' ); anspress()->add_action( 'ap_unpublish_comment', $this, 'delete_comment' ); anspress()->add_action( 'ap_vote_up', $this, 'vote_up' ); anspress()->add_action( 'ap_vote_down', $this, 'vote_down' ); anspress()->add_action( 'ap_undo_vote_up', $this, 'undo_vote_up' ); anspress()->add_action( 'ap_undo_vote_down', $this, 'undo_vote_down' ); anspress()->add_action( 'ap_insert_reputation', $this, 'insert_reputation', 10, 4 ); anspress()->add_action( 'ap_delete_reputation', $this, 'delete_reputation', 10, 3 ); anspress()->add_action( 'ap_ajax_mark_notifications_seen', $this, 'mark_notifications_seen' ); anspress()->add_action( 'ap_ajax_load_more_notifications', $this, 'load_more_notifications' ); anspress()->add_action( 'ap_ajax_get_notifications', $this, 'get_notifications' ); } /** * Add tags settings to features settings page. * * @param array $groups Features settings group. * @return array * @since 4.2.0 */ public function add_to_settings_page( $groups ) { $groups['notification'] = array( 'label' => __( 'Notification', 'anspress-question-answer' ), ); return $groups; } /** * Register notification addon options. * * @return array * @since 4.1.8 */ public function load_options() { $opt = ap_opt(); $form = array( 'fields' => array( 'user_page_title_notifications' => array( 'label' => __( 'Notifications page title', 'anspress-question-answer' ), 'desc' => __( 'Custom title for user profile notifications page', 'anspress-question-answer' ), 'value' => $opt['user_page_title_notifications'], ), 'user_page_slug_notifications' => array( 'label' => __( 'Notifications page slug', 'anspress-question-answer' ), 'desc' => __( 'Custom slug for user profile notifications page', 'anspress-question-answer' ), 'value' => $opt['user_page_slug_notifications'], ), ), ); return $form; } /** * Filter notification menu title. * * @param object $items Menu item object. * @return array */ public function ap_menu_object( $items ) { foreach ( $items as $k => $i ) { if ( isset( $i->object ) && 'notifications' === $i->object ) { $items[ $k ]->url = '#apNotifications'; $items[ $k ]->type = 'custom'; } } return $items; } /** * Register notifications verbs. * * @since unknown */ public function register_verbs() { ap_register_notification_verb( 'new_answer', array( 'label' => __( 'posted an answer on your question', 'anspress-question-answer' ), ) ); ap_register_notification_verb( 'new_comment', array( 'ref_type' => 'comment', // translators: %cpt% is AnsPress placeholder not gettext. 'label' => __( 'commented on your %cpt%', 'anspress-question-answer' ), ) ); ap_register_notification_verb( 'vote_up', array( 'ref_type' => 'post', // translators: %cpt% is AnsPress placeholder not gettext. 'label' => __( 'up voted your %cpt%', 'anspress-question-answer' ), ) ); ap_register_notification_verb( 'vote_down', array( 'ref_type' => 'post', 'hide_actor' => true, 'icon' => 'apicon-thumb-down', // translators: %cpt% is AnsPress placeholder not gettext. 'label' => __( 'down voted your %cpt%', 'anspress-question-answer' ), ) ); ap_register_notification_verb( 'best_answer', array( 'ref_type' => 'post', 'label' => __( 'selected your answer', 'anspress-question-answer' ), ) ); ap_register_notification_verb( 'new_points', array( 'ref_type' => 'reputation', 'label' => __( 'You have earned %points% points', 'anspress-question-answer' ), ) ); ap_register_notification_verb( 'lost_points', array( 'ref_type' => 'reputation', 'label' => __( 'You lose %points% points', 'anspress-question-answer' ), ) ); } /** * Adds reputations tab in AnsPress authors page. */ public function ap_user_pages() { anspress()->user_pages[] = array( 'slug' => 'notifications', 'label' => __( 'Notifications', 'anspress-question-answer' ), 'count' => ap_count_unseen_notifications(), 'icon' => 'apicon-globe', 'cb' => array( $this, 'notification_page' ), 'private' => true, ); } /** * Display reputation tab content in AnsPress author page. */ public function notification_page() { $user_id = ap_current_user_id(); $seen = ! empty( ap_sanitize_unslash( 'seen', 'r' ) ) ? ap_sanitize_unslash( 'seen', 'r', 'all' ) : 0; if ( get_current_user_id() === $user_id ) { $seen = 'all' === $seen ? null : (int) $seen; $notifications = new \AnsPress\Notifications( array( 'user_id' => $user_id, 'seen' => $seen, ) ); do_action( 'ap_before_notification_page', $notifications ); include ap_get_theme_location( 'addons/notification/index.php' ); } else { esc_attr_e( 'You do not have permission to view this page', 'anspress-question-answer' ); } } /** * Remove all notifications related to question when its get deleted. * * @param integer $post_id Post ID. * @param object $_post Post object. */ public function trash_question( $post_id, $_post ) { ap_delete_notifications( array( 'parent' => $post_id, 'ref_type' => array( 'answer', 'vote_up', 'vote_down', 'post' ), ) ); } /** * Add notification for new answer. * * @param integer $post_id Post ID. * @param object $_post Post object. */ public function new_answer( $post_id, $_post ) { $_question = get_post( $_post->post_parent ); // Return if question is not available. if ( ! $_question ) { return; } // Insert the notification. ap_insert_notification( array( 'user_id' => $_question->post_author, 'actor' => $_post->post_author, 'parent' => $_post->post_parent, 'ref_id' => $_post->ID, 'ref_type' => 'answer', 'verb' => 'new_answer', ) ); } /** * Remove all notifications related to answer when its get deleted. * * @param integer $post_id Post ID. * @param object $_post Post object. */ public function trash_answer( $post_id, $_post ) { ap_delete_notifications( array( 'ref_id' => $post_id, 'ref_type' => array( 'answer', 'vote_up', 'vote_down', 'post' ), ) ); } /** * Notify user when their answer is selected. * * @param object $_post Post object. */ public function select_answer( $_post ) { // Award select answer points to question author only. if ( get_current_user_id() !== (int) $_post->post_author ) { ap_insert_notification( array( 'user_id' => $_post->post_author, 'actor' => get_current_user_id(), 'parent' => $_post->post_parent, 'ref_id' => $_post->ID, 'ref_type' => 'answer', 'verb' => 'best_answer', ) ); } } /** * Remove notification when users answer get unselected. * * @param object $_post Post object. */ public function unselect_answer( $_post ) { ap_delete_notifications( array( 'parent' => $_post->post_parent, 'ref_type' => 'answer', 'verb' => 'best_answer', ) ); } /** * Notify user on new comment. * * @param object $comment WordPress comment object. */ public function new_comment( $comment ) { $_post = get_post( $comment->comment_post_ID ); if ( get_current_user_id() !== (int) $_post->post_author ) { ap_insert_notification( array( 'user_id' => $_post->post_author, 'actor' => $comment->user_id, 'parent' => $comment->comment_post_ID, 'ref_id' => $comment->comment_ID, 'ref_type' => 'comment', 'verb' => 'new_comment', ) ); } } /** * Remove notification on deleting comment. * * @param object $comment Comment object. */ public function delete_comment( $comment ) { ap_delete_notifications( array( 'actor' => $comment->user_id, 'parent' => $comment->comment_post_ID, 'ref_type' => 'comment', ) ); } /** * Award reputation when user recive an up vote. * * @param integer $post_id Post ID. */ public function vote_up( $post_id ) { $_post = get_post( $post_id ); if ( get_current_user_id() !== (int) $_post->post_author ) { ap_insert_notification( array( 'user_id' => $_post->post_author, 'actor' => get_current_user_id(), 'parent' => $_post->ID, 'ref_id' => $_post->ID, 'ref_type' => $_post->post_type, 'verb' => 'vote_up', ) ); } } /** * Notify when user recive an down vote. * * @param integer $post_id Post ID. */ public function vote_down( $post_id ) { $_post = get_post( $post_id ); if ( get_current_user_id() !== (int) $_post->post_author ) { ap_insert_notification( array( 'user_id' => $_post->post_author, 'actor' => get_current_user_id(), 'parent' => $_post->ID, 'ref_id' => $_post->ID, 'ref_type' => $_post->post_type, 'verb' => 'vote_down', ) ); } } /** * Notify when user recive an up vote. * * @param integer $post_id Post ID. */ public function undo_vote_up( $post_id ) { ap_delete_notifications( array( 'ref_id' => $post_id, 'actor' => get_current_user_id(), 'verb' => 'vote_up', ) ); } /** * Notify when user recive an down vote. * * @param integer $post_id Post ID. */ public function undo_vote_down( $post_id ) { ap_delete_notifications( array( 'ref_id' => $post_id, 'actor' => get_current_user_id(), 'verb' => 'vote_down', ) ); } /** * Notify user on new reputation. * * @param integer $reputation_id Reputation id. * @param integer $user_id User id. * @param string $event Reputation event. * @param integer $ref_id Reputation reference id. */ public function insert_reputation( $reputation_id, $user_id, $event, $ref_id ) { ap_insert_notification( array( 'user_id' => $user_id, 'ref_id' => $reputation_id, 'ref_type' => 'reputation', 'verb' => ap_get_reputation_event_points( $event ) > 0 ? 'new_points' : 'lost_points', ) ); } /** * Notify user on new reputation. * * @param integer|false $deleted NUmbers of rows deleted. * @param integer $user_id User id. * @param string $event Reputation event. */ public function delete_reputation( $deleted, $user_id, $event ) { ap_delete_notifications( array( 'ref_type' => 'reputation', 'user_id' => $user_id, ) ); } /** * Ajax callback for marking all notification of current user * as seen. */ public function mark_notifications_seen() { if ( ! is_user_logged_in() || ! anspress_verify_nonce( 'mark_notifications_seen' ) ) { ap_ajax_json( array( 'success' => false, 'snackbar' => array( 'message' => __( 'There was a problem processing your request', 'anspress-question-answer' ) ), ) ); } // Mark all notifications as seen. ap_set_notifications_as_seen( get_current_user_id() ); ap_ajax_json( array( 'success' => true, 'btn' => array( 'hide' => true ), 'snackbar' => array( 'message' => __( 'Successfully updated all notifications', 'anspress-question-answer' ) ), 'cb' => 'notificationAllRead', ) ); wp_die(); } /** * Ajax callback for loading more notifications. */ public function load_more_notifications() { check_admin_referer( 'load_more_notifications', '__nonce' ); $user_id = ap_sanitize_unslash( 'user_id', 'r' ); $paged = ap_sanitize_unslash( 'current', 'r', 1 ) + 1; ob_start(); $notifications = new \AnsPress\Notifications( array( 'user_id' => $user_id, 'paged' => $paged, ) ); while ( $notifications->have() ) : $notifications->the_notification(); $notifications->item_template(); endwhile; $html = ob_get_clean(); $paged = $notifications->total_pages > $paged ? $paged : 0; ap_ajax_json( array( 'success' => true, 'args' => array( 'ap_ajax_action' => 'load_more_notifications', '__nonce' => wp_create_nonce( 'load_more_notifications' ), 'current' => (int) $paged, 'user_id' => $user_id, ), 'html' => $html, 'element' => '.ap-noti', ) ); } /** * Ajax callback for loading user notifications dropdown. */ public function get_notifications() { if ( ! is_user_logged_in() ) { wp_die(); } $notifications = new \AnsPress\Notifications( array( 'user_id' => get_current_user_id() ) ); $items = array(); while ( $notifications->have() ) : $notifications->the_notification(); $items[] = array( 'ID' => $notifications->object->noti_id, 'verb' => $notifications->object->noti_verb, 'verb_label' => $notifications->get_verb(), 'icon' => $notifications->get_icon(), 'avatar' => $notifications->actor_avatar(), 'hide_actor' => $notifications->hide_actor(), 'actor' => $notifications->get_actor(), 'ref_title' => $notifications->get_ref_title(), 'ref_type' => $notifications->object->noti_ref_type, 'points' => $notifications->get_reputation_points(), 'date' => ap_human_time( $notifications->get_date(), false ), 'permalink' => $notifications->get_permalink(), 'seen' => $notifications->object->noti_seen, ); endwhile; ap_ajax_json( array( 'success' => true, 'notifications' => $items, 'total' => ap_count_unseen_notifications(), 'mark_args' => array( 'ap_ajax_action' => 'mark_notifications_seen', '__nonce' => wp_create_nonce( 'mark_notifications_seen' ), ), ) ); } }
Expand full source code Collapse full source code View on GitHub: addons/notifications/notifications.php:36
Add your comment