AnsPress_Notification_Hook()
Description #
AnsPress notification hooks.
Source #
File: addons/free/notification.php
class AnsPress_Notification_Hook {
/**
* Initialize the class.
*/
public static function init() {
ap_add_default_options([
'user_page_title_notifications' => __( 'Notifications', 'anspress-question-answer' ),
'user_page_slug_notifications' => 'notifications',
]);
// Activate AnsPress notifications only if buddypress not active.
if ( ! ap_is_addon_active( 'free/buddypress.php' ) ) {
ap_register_page( 'notifications', __( 'Notifications', 'anspress-question-answer' ), '', true, true );
//anspress()->add_filter( 'ap_menu_link', __CLASS__, 'menu_link', 10, 2 );
anspress()->add_filter( 'ap_menu_object', __CLASS__, 'ap_menu_object' );
anspress()->add_filter( 'ap_form_addon-free_notification', __CLASS__, 'load_options' );
anspress()->add_action( 'ap_notification_verbs', __CLASS__, 'register_verbs' );
anspress()->add_action( 'ap_user_pages', __CLASS__, 'ap_user_pages' );
anspress()->add_action( 'ap_after_new_answer', __CLASS__, 'new_answer', 10, 2 );
anspress()->add_action( 'ap_trash_question', __CLASS__, 'trash_question', 10, 2 );
anspress()->add_action( 'ap_before_delete_question', __CLASS__, 'trash_question', 10, 2 );
anspress()->add_action( 'ap_trash_answer', __CLASS__, 'trash_answer', 10, 2 );
anspress()->add_action( 'ap_before_delete_answer', __CLASS__, 'trash_answer', 10, 2 );
anspress()->add_action( 'ap_untrash_answer', __CLASS__, 'new_answer', 10, 2 );
anspress()->add_action( 'ap_select_answer', __CLASS__, 'select_answer' );
anspress()->add_action( 'ap_unselect_answer', __CLASS__, 'unselect_answer' );
anspress()->add_action( 'ap_publish_comment', __CLASS__, 'new_comment' );
anspress()->add_action( 'ap_unpublish_comment', __CLASS__, 'delete_comment' );
anspress()->add_action( 'ap_vote_up', __CLASS__, 'vote_up' );
anspress()->add_action( 'ap_vote_down', __CLASS__, 'vote_down' );
anspress()->add_action( 'ap_undo_vote_up', __CLASS__, 'undo_vote_up' );
anspress()->add_action( 'ap_undo_vote_down', __CLASS__, 'undo_vote_down' );
anspress()->add_action( 'ap_insert_reputation', __CLASS__, 'insert_reputation', 10, 4 );
anspress()->add_action( 'ap_delete_reputation', __CLASS__, 'delete_reputation', 10, 3 );
anspress()->add_action( 'ap_ajax_mark_notifications_seen', __CLASS__, 'mark_notifications_seen' );
anspress()->add_action( 'ap_ajax_load_more_notifications', __CLASS__, 'load_more_notifications' );
anspress()->add_action( 'ap_ajax_get_notifications', __CLASS__, 'get_notifications' );
}
}
/**
* Register Avatar options
*/
public static function load_options( $form ) {
$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 user menu links.
*
* @param string $url Menu url.
* @param object $item Menu item object.
* @return string
* @deprecated 4.1.2
*/
public static function menu_link( $url, $item ) {
if ( 'notifications' === $item->post_name ) {
$url = '#apNotifications';
}
return $url;
}
/**
* Filter notification menu title.
*
* @param object $items Menu item object.
* @return array
* @deprecated 4.1.2
*/
public static function ap_menu_items( $items ) {
foreach ( $items as $k => $i ) {
if ( isset( $i->post_name ) && 'notifications' === $i->post_name ) {
$count = ap_count_unseen_notifications();
if ( $count > 0 ) {
$items[ $k ]->title = $i->title . '<i class="noti-count">' . esc_attr( number_format_i18n( $count ) ) . '</i>';
}
}
}
return $items;
}
/**
* Filter notification menu title.
*
* @param object $items Menu item object.
* @return array
*/
public static 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;
}
public static 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',
'label' => __( 'commented on your %cpt%', 'anspress-question-answer' ),
) );
ap_register_notification_verb( 'vote_up', array(
'ref_type' => 'post',
'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',
'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 static function ap_user_pages() {
anspress()->user_pages[] = array(
'slug' => 'notifications',
'label' => __( 'Notifications', 'anspress-question-answer' ),
'count' => ap_count_unseen_notifications(),
'icon' => 'apicon-globe',
'cb' => [ __CLASS__, 'notification_page' ],
'private' => true,
);
}
/**
* Display reputation tab content in AnsPress author page.
*/
public static function notification_page() {
$user_id = ap_current_user_id();
$seen = ap_sanitize_unslash( 'seen', 'r', 'all' );
if ( get_current_user_id() === $user_id ) {
$seen = 'all' === $seen ? null : (int) $seen;
$notifications = new AnsPress_Notification_Query( [ 'user_id' => $user_id, 'seen' => $seen ] );
do_action( 'ap_before_notification_page', $notifications );
include ap_get_theme_location( 'addons/notification/index.php' );
} else {
_e( 'You do not have permission to view this page', 'anspress-question-answer' ); // xss okay.
}
}
/**
* Remove all notifications related to question when its get deleted.
*
* @param integer $post_id Post ID.
* @param object $_post Post object.
*/
public static function trash_question( $post_id, $_post ) {
ap_delete_notifications( array(
'parent' => $post_id,
'ref_type' => [ 'answer', 'vote_up', 'vote_down', 'post' ],
) );
}
/**
* Add notification for new answer.
*
* @param integer $post_id Post ID.
* @param object $_post Post object.
*/
public static function new_answer( $post_id, $_post ) {
$_question = get_post( $_post->post_parent );
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 static function trash_answer( $post_id, $_post ) {
ap_delete_notifications( array(
'ref_id' => $post_id,
'ref_type' => [ 'answer', 'vote_up', 'vote_down', 'post' ],
) );
}
/**
* Notify user when their answer is selected.
*
* @param object $_post Post object.
*/
public static function select_answer( $_post ) {
// Award select answer points to question author only.
if ( get_current_user_id() !== $_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 static 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 static function new_comment( $comment ) {
$_post = get_post( $comment->comment_post_ID );
if ( get_current_user_id() !== $_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 static 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 static function vote_up( $post_id ) {
$_post = get_post( $post_id );
if ( get_current_user_id() !== $_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 static function vote_down( $post_id ) {
$_post = get_post( $post_id );
if ( get_current_user_id() !== $_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 static 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 static 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 static 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 static 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 static function mark_notifications_seen() {
if ( ! is_user_logged_in() || ! ap_verify_nonce( 'mark_notifications_seen' ) ) {
ap_ajax_json( array(
'success' => false,
'snackbar' => [ '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' => [ 'hide' => true ],
'snackbar' => [ 'message' => __( 'Successfully updated all notifications', 'anspress-question-answer' ) ],
'cb' => 'notificationAllRead',
) );
wp_die();
}
/**
* Ajax callback for loading more notifications.
*/
public static 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_Notification_Query( [ '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' => [ '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 static function get_notifications() {
if ( ! is_user_logged_in() ) {
wp_die();
}
$notifications = new AnsPress_Notification_Query( [ 'user_id' => get_current_user_id() ] );
$items = [];
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/free/notification.php:36
Add your comment