237 lines
9.9 KiB
PHP
237 lines
9.9 KiB
PHP
<?php
|
|
/**
|
|
* Template Name: 消息中心
|
|
* Template Post Type: page
|
|
*
|
|
* 独立消息中心页面 — 两栏布局(左侧导航 + 右侧消息列表)
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
get_header();
|
|
|
|
if ( ! is_user_logged_in() ) {
|
|
$login_url = function_exists( 'aksrt_get_login_url' ) ? aksrt_get_login_url() : wp_login_url( get_permalink() );
|
|
wp_safe_redirect( $login_url );
|
|
exit;
|
|
}
|
|
|
|
$user_id = get_current_user_id();
|
|
|
|
// 获取所有通知(持久化 + 即时状态)
|
|
$all_notifications = function_exists( 'aksrt_get_user_all_notifications' )
|
|
? aksrt_get_user_all_notifications( $user_id )
|
|
: [];
|
|
|
|
// 筛选类型
|
|
$current_type = isset( $_GET['msg_type'] ) ? sanitize_key( $_GET['msg_type'] ) : 'all';
|
|
|
|
// 按类型过滤
|
|
$filtered = $all_notifications;
|
|
if ( $current_type === 'unread' ) {
|
|
$filtered = array_filter( $filtered, static fn( $n ) => empty( $n['read'] ) );
|
|
} elseif ( $current_type !== 'all' ) {
|
|
$filtered = array_filter( $filtered, static fn( $n ) => ( $n['type'] ?? '' ) === $current_type );
|
|
}
|
|
$filtered = array_values( $filtered );
|
|
|
|
// 分页
|
|
$per_page = 20;
|
|
$current_page = max( 1, (int) ( $_GET['msg_page'] ?? 1 ) );
|
|
$total = count( $filtered );
|
|
$total_pages = max( 1, (int) ceil( $total / $per_page ) );
|
|
$offset = ( $current_page - 1 ) * $per_page;
|
|
$paged_items = array_slice( $filtered, $offset, $per_page );
|
|
|
|
// 统计各类型数量
|
|
$type_counts = [ 'all' => count( $all_notifications ), 'unread' => 0 ];
|
|
foreach ( $all_notifications as $n ) {
|
|
$t = $n['type'] ?? 'notice';
|
|
$type_counts[ $t ] = ( $type_counts[ $t ] ?? 0 ) + 1;
|
|
if ( empty( $n['read'] ) ) {
|
|
$type_counts['unread']++;
|
|
}
|
|
}
|
|
|
|
// 导航定义
|
|
$nav_items = [
|
|
'all' => __( '全部消息', 'aksrt' ),
|
|
'unread' => __( '未读', 'aksrt' ),
|
|
'conversation' => __( '私信', 'aksrt' ),
|
|
'comment_reply' => __( '评论回复', 'aksrt' ),
|
|
'comment_approved' => __( '评论审核', 'aksrt' ),
|
|
'credits_added' => __( '积分增加', 'aksrt' ),
|
|
'credits_deducted' => __( '积分扣减', 'aksrt' ),
|
|
'download_ready' => __( '下载就绪', 'aksrt' ),
|
|
'upload_moderation'=> __( '图片审核', 'aksrt' ),
|
|
'notice' => __( '系统通知', 'aksrt' ),
|
|
];
|
|
|
|
// 图标映射
|
|
$icon_map = [
|
|
'comment_reply' => 'fas fa-comment-dots',
|
|
'comment_approved' => 'fas fa-check-circle',
|
|
'credits_added' => 'fas fa-coins',
|
|
'credits_deducted' => 'fas fa-coins',
|
|
'download_ready' => 'fas fa-download',
|
|
'upload_moderation'=> 'fas fa-image',
|
|
'verify_email' => 'fas fa-envelope-open-text',
|
|
'pending_comments' => 'fas fa-clock',
|
|
'conversation' => 'fas fa-envelope',
|
|
'notice' => 'fas fa-bell',
|
|
];
|
|
?>
|
|
|
|
<div class="messages-center container">
|
|
<aside class="messages-center__nav">
|
|
<ul class="messages-nav__list">
|
|
<?php foreach ( $nav_items as $key => $label ) :
|
|
$count = (int) ( $type_counts[ $key ] ?? 0 );
|
|
if ( $key !== 'all' && $key !== 'unread' && $count < 1 ) continue;
|
|
$is_active = $current_type === $key;
|
|
?>
|
|
<li>
|
|
<a href="<?php echo esc_url( add_query_arg( [ 'msg_type' => $key, 'msg_page' => 1 ] ) ); ?>"
|
|
class="messages-nav__item<?php echo $is_active ? ' is-active' : ''; ?>"
|
|
data-type="<?php echo esc_attr( $key ); ?>">
|
|
<span><?php echo esc_html( $label ); ?></span>
|
|
<?php if ( $count > 0 ) : ?>
|
|
<span class="messages-nav__badge" data-type="<?php echo esc_attr( $key ); ?>" data-count="<?php echo esc_attr( (string) $count ); ?>"><?php echo esc_html( (string) $count ); ?></span>
|
|
<?php endif; ?>
|
|
</a>
|
|
</li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
<div class="messages-nav__actions">
|
|
<button type="button" class="messages-nav__action-btn js-msg-mark-all-read"><?php esc_html_e( '全部已读', 'aksrt' ); ?></button>
|
|
<button type="button" class="messages-nav__action-btn js-msg-clear-read"><?php esc_html_e( '清除已读', 'aksrt' ); ?></button>
|
|
</div>
|
|
</aside>
|
|
|
|
<main class="messages-center__content">
|
|
<?php if ( $current_type === 'conversation' ) :
|
|
$pm = class_exists( 'AKSRT_Private_Message' ) ? AKSRT_Private_Message::get_instance() : null;
|
|
$conversations = $pm ? $pm->get_conversations( $user_id, 30 ) : [];
|
|
$pm_nonce = wp_create_nonce( 'aksrt_pm' );
|
|
?>
|
|
<div class="messages-conversations" id="aksrt-pm-conversations"
|
|
data-ajax="<?php echo esc_url( admin_url( 'admin-ajax.php' ) ); ?>"
|
|
data-nonce="<?php echo esc_attr( $pm_nonce ); ?>">
|
|
<?php if ( ! empty( $conversations ) ) : ?>
|
|
<div class="aksrt-pm__list">
|
|
<?php foreach ( $conversations as $conv ) : ?>
|
|
<div class="aksrt-pm__item<?php echo $conv['unread'] > 0 ? ' is-unread' : ''; ?>"
|
|
data-conv-id="<?php echo esc_attr( (string) $conv['id'] ); ?>"
|
|
data-other-id="<?php echo esc_attr( (string) $conv['other_user_id'] ); ?>">
|
|
<img class="aksrt-pm__avatar" src="<?php echo esc_url( $conv['other_avatar'] ); ?>" alt=""<?php echo function_exists('aksrt_lazy_loading') ? aksrt_lazy_loading('avatar') : ' loading="lazy"'; ?> />
|
|
<div class="aksrt-pm__info">
|
|
<div class="aksrt-pm__name">
|
|
<?php echo esc_html( $conv['other_name'] ); ?>
|
|
<?php if ( $conv['unread'] > 0 ) : ?>
|
|
<span class="aksrt-pm__badge"><?php echo esc_html( (string) $conv['unread'] ); ?></span>
|
|
<?php endif; ?>
|
|
</div>
|
|
<div class="aksrt-pm__preview"><?php echo esc_html( mb_substr( $conv['last_message'], 0, 50 ) ); ?></div>
|
|
</div>
|
|
<div class="aksrt-pm__time"><?php echo esc_html( $conv['last_message_at'] ? mysql2date( 'm-d H:i', $conv['last_message_at'] ) : '' ); ?></div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
<?php else : ?>
|
|
<div class="messages-empty">
|
|
<span class="messages-empty__icon"><i class="fas fa-envelope"></i></span>
|
|
<p class="messages-empty__text"><?php esc_html_e( '暂无私信', 'aksrt' ); ?></p>
|
|
<p class="messages-empty__hint"><?php esc_html_e( '你可以在用户主页发起私信。', 'aksrt' ); ?></p>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<div class="aksrt-pm__thread" id="aksrt-pm-thread" style="display:none;">
|
|
<div class="aksrt-pm__thread-header">
|
|
<button type="button" class="aksrt-pm__back-btn" id="aksrt-pm-back"><i class="fas fa-arrow-left"></i> <?php esc_html_e( '返回', 'aksrt' ); ?></button>
|
|
<span class="aksrt-pm__thread-name" id="aksrt-pm-thread-name"></span>
|
|
</div>
|
|
<div class="aksrt-pm__messages" id="aksrt-pm-messages"></div>
|
|
<div class="aksrt-pm__compose">
|
|
<textarea id="aksrt-pm-input" rows="2" placeholder="<?php esc_attr_e( '输入消息...', 'aksrt' ); ?>"></textarea>
|
|
<button type="button" id="aksrt-pm-send" class="aksrt-pm__send-btn"><i class="fas fa-paper-plane"></i></button>
|
|
</div>
|
|
</div>
|
|
|
|
<?php /* conversation.js is enqueued via AKSRT_Scripts */ ?>
|
|
<?php elseif ( ! empty( $paged_items ) ) : ?>
|
|
<div class="messages-list">
|
|
<?php foreach ( $paged_items as $notice ) :
|
|
$n_type = (string) ( $notice['type'] ?? 'notice' );
|
|
$n_title = (string) ( $notice['title'] ?? '' );
|
|
$n_desc = (string) ( $notice['desc'] ?? '' );
|
|
$n_url = (string) ( $notice['url'] ?? '' );
|
|
$n_id = (string) ( $notice['id'] ?? '' );
|
|
$is_read = ! empty( $notice['read'] );
|
|
$is_state = ! empty( $notice['stateful'] );
|
|
$created = (string) ( $notice['created_at'] ?? '' );
|
|
$time_str = $is_state
|
|
? __( '状态提醒', 'aksrt' )
|
|
: ( $created !== '' ? get_date_from_gmt( $created, 'Y-m-d H:i' ) : '' );
|
|
$icon_cls = $icon_map[ $n_type ] ?? 'fas fa-bell';
|
|
?>
|
|
<div class="message-item<?php echo ! $is_read ? ' is-unread' : ''; ?>" data-notification-id="<?php echo esc_attr( $n_id ); ?>">
|
|
<span class="message-item__icon">
|
|
<i class="<?php echo esc_attr( $icon_cls ); ?>" aria-hidden="true"></i>
|
|
</span>
|
|
<div class="message-item__body">
|
|
<div class="message-item__title">
|
|
<?php echo esc_html( $n_title ); ?>
|
|
<?php if ( ! $is_read && ! $is_state ) : ?>
|
|
<span class="message-item__new-badge">NEW</span>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php if ( $n_desc !== '' ) : ?>
|
|
<div class="message-item__desc"><?php echo esc_html( $n_desc ); ?></div>
|
|
<?php endif; ?>
|
|
<?php if ( $time_str !== '' ) : ?>
|
|
<div class="message-item__time"><?php echo esc_html( $time_str ); ?></div>
|
|
<?php endif; ?>
|
|
</div>
|
|
<div class="message-item__actions">
|
|
<?php if ( $n_url !== '' ) : ?>
|
|
<a href="<?php echo esc_url( $n_url ); ?>" class="message-item__action-btn"><?php esc_html_e( '查看', 'aksrt' ); ?></a>
|
|
<?php endif; ?>
|
|
<?php if ( ! $is_state && ! $is_read ) : ?>
|
|
<button type="button" class="message-item__action-btn js-msg-mark-read" data-id="<?php echo esc_attr( $n_id ); ?>"><?php esc_html_e( '已读', 'aksrt' ); ?></button>
|
|
<?php endif; ?>
|
|
<?php if ( ! $is_state ) : ?>
|
|
<button type="button" class="message-item__action-btn message-item__action-btn--danger js-msg-delete" data-id="<?php echo esc_attr( $n_id ); ?>"><?php esc_html_e( '删除', 'aksrt' ); ?></button>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
|
|
<?php if ( $total_pages > 1 ) : ?>
|
|
<div class="messages-pagination">
|
|
<?php for ( $i = 1; $i <= $total_pages; $i++ ) :
|
|
$page_url = add_query_arg( [ 'msg_type' => $current_type, 'msg_page' => $i ] );
|
|
?>
|
|
<?php if ( $i === $current_page ) : ?>
|
|
<span class="profile-status-chip is-active"><?php echo esc_html( (string) $i ); ?></span>
|
|
<?php else : ?>
|
|
<a href="<?php echo esc_url( $page_url ); ?>" class="profile-status-chip"><?php echo esc_html( (string) $i ); ?></a>
|
|
<?php endif; ?>
|
|
<?php endfor; ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<?php else : ?>
|
|
<div class="messages-empty">
|
|
<span class="messages-empty__icon"><i class="fas fa-bell-slash"></i></span>
|
|
<p class="messages-empty__text"><?php esc_html_e( '暂无消息', 'aksrt' ); ?></p>
|
|
</div>
|
|
<?php endif; ?>
|
|
</main>
|
|
</div>
|
|
|
|
<?php get_footer(); ?>
|