diff --git a/assets/css/frontend/forum/board.css b/assets/css/frontend/forum/board.css index 551f28fd..2c6c02c9 100644 --- a/assets/css/frontend/forum/board.css +++ b/assets/css/frontend/forum/board.css @@ -454,3 +454,204 @@ color: var(--color-primary); } + +/* Board sort tabs */ +.aksrt-forum-board__tabs { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin: 0 0 16px; + padding: 8px; + border-radius: var(--radius-xl, 12px); + background: var(--surface-1, #fff); + box-shadow: var(--shadow-sm); +} + +.aksrt-forum-board__tab { + display: inline-flex; + align-items: center; + padding: 8px 14px; + border-radius: 999px; + color: var(--color-ink-3, #5c6370); + text-decoration: none; + font-size: 14px; + font-weight: 600; + transition: background .15s ease, color .15s ease; +} + +.aksrt-forum-board__tab:hover { + background: rgba(240, 68, 148, 0.08); + color: var(--color-primary, #f04494); +} + +.aksrt-forum-board__tab.is-active { + background: var(--color-primary, #f04494); + color: #fff; +} + +.aksrt-forum-board__governance--footer { + margin-top: 28px; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: 16px; +} + +.aksrt-forum-topic-row { + display: flex; + align-items: flex-start; + gap: 12px; + padding: 14px 16px; + margin-bottom: 10px; + border-radius: var(--radius-xl, 12px); + background: var(--surface-1, #fff); + box-shadow: var(--shadow-sm); +} + +.aksrt-forum-topic-row__avatar img { + width: 40px; + height: 40px; + border-radius: 50%; + object-fit: cover; +} + +.aksrt-forum-topic-row__body { + flex: 1; + min-width: 0; +} + +.aksrt-forum-topic-row__title-wrap { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 6px; +} + +.aksrt-forum-topic-row__title { + margin: 0; + font-size: 16px; + font-weight: 700; +} + +.aksrt-forum-topic-row__title a { + color: var(--color-ink); + text-decoration: none; +} + +.aksrt-forum-topic-row__meta { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 6px; + color: var(--color-ink-4, #8a909c); + font-size: 12px; +} + +.aksrt-forum-topic-row__badge { + display: inline-flex; + align-items: center; + padding: 2px 8px; + border-radius: 999px; + font-size: 12px; + font-weight: 700; + line-height: 1.4; +} + +.aksrt-forum-topic-row__badge--sticky { background: rgba(255, 149, 0, 0.12); color: #c77700; } +.aksrt-forum-topic-row__badge--featured { background: rgba(240, 68, 148, 0.12); color: #f04494; } +.aksrt-forum-topic-row__badge--question { background: rgba(47, 128, 237, 0.12); color: #2f80ed; } +.aksrt-forum-topic-row__badge--question.is-solved { background: rgba(39, 174, 96, 0.12); color: #27ae60; } + +.aksrt-forum-topic-row__cover { + position: relative; + width: 84px; + height: 60px; + flex: 0 0 auto; + border-radius: 10px; + overflow: hidden; + background: var(--surface-2, #f5f6f8); +} + +.aksrt-forum-topic-row__cover img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.aksrt-forum-topic-row__cover .fa-play-circle, +.aksrt-forum-topic-row__cover-count { + position: absolute; + right: 6px; + bottom: 6px; + color: #fff; + text-shadow: 0 1px 2px rgba(0,0,0,.35); +} + +.aksrt-forum-board-card__grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); + gap: 12px; +} + +.aksrt-forum-board-card { + display: flex; + flex-direction: column; + overflow: hidden; + border-radius: var(--radius-xl, 12px); + background: var(--surface-1, #fff); + box-shadow: var(--shadow-sm); + text-decoration: none; + color: inherit; +} + +.aksrt-forum-board-card__cover { + display: block; + height: 96px; + background-size: cover; + background-position: center; +} + +.aksrt-forum-board-card__cover--empty { + display: flex; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, rgba(240,68,148,.08), rgba(47,128,237,.08)); + color: var(--color-primary, #f04494); + font-size: 24px; +} + +.aksrt-forum-board-card__body { + display: flex; + flex-direction: column; + gap: 6px; + padding: 12px 14px 14px; +} + +.aksrt-forum-board-card__title { + font-weight: 700; +} + +.aksrt-forum-board-card__desc, +.aksrt-forum-board-card__meta { + font-size: 12px; + color: var(--color-ink-4, #8a909c); +} + +.aksrt-forum__empty, +.aksrt-forum-board__empty, +.aksrt-forum-tag__empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 10px; + padding: 48px 20px; + text-align: center; + color: var(--color-ink-4, #8a909c); +} + +.aksrt-forum__empty a, +.aksrt-forum-board__empty a { + color: var(--color-primary, #f04494); + font-weight: 600; + text-decoration: none; +} diff --git a/assets/js/forum-governance.js b/assets/js/forum-governance.js index 1ef93f55..3b348bc0 100644 --- a/assets/js/forum-governance.js +++ b/assets/js/forum-governance.js @@ -1322,6 +1322,61 @@ } } + + function bindBoardSortTabs() { + var root = document.querySelector('.aksrt-forum-board[data-plate-id], .aksrt-forum-board[data-board-id]'); + if (!root) return; + var list = root.querySelector('.js-aksrt-board-topic-list'); + var tabs = root.querySelectorAll('.js-aksrt-board-sort-tab'); + if (!list || !tabs.length) return; + + var plateId = root.getAttribute('data-plate-id') || ''; + var boardId = root.getAttribute('data-board-id') || ''; + var nonce = root.getAttribute('data-nonce') || (window.aksrtForumGovernance && aksrtForumGovernance.publicNonce) || (window.aksrtData && aksrtData.nonce) || ''; + var ajaxUrl = (window.aksrtForumGovernance && aksrtForumGovernance.ajaxUrl) || (window.aksrtData && aksrtData.ajaxUrl) || ''; + + function loadSort(sort, pushUrl) { + if (!ajaxUrl) return; + list.style.opacity = '0.55'; + var fd = new FormData(); + fd.append('action', 'aksrt_forum_board_topics'); + fd.append('nonce', nonce); + fd.append('page', '1'); + fd.append('orderby', sort); + if (plateId) fd.append('plate_id', plateId); + if (boardId) fd.append('board_id', boardId); + + fetch(ajaxUrl, { method: 'POST', body: fd, credentials: 'same-origin' }) + .then(function (r) { return r.json(); }) + .then(function (res) { + list.style.opacity = '1'; + if (!res || !res.success) return; + list.innerHTML = res.data.html || ''; + root.setAttribute('data-active-sort', sort); + tabs.forEach(function (t) { + t.classList.toggle('is-active', (t.getAttribute('data-sort') || '') === sort); + }); + if (pushUrl && window.history && history.replaceState) { + try { + var u = new URL(window.location.href); + u.searchParams.set('forum_sort', sort); + history.replaceState({}, '', u.toString()); + } catch (e) {} + } + }) + .catch(function () { list.style.opacity = '1'; }); + } + + tabs.forEach(function (tab) { + tab.addEventListener('click', function (e) { + e.preventDefault(); + var sort = tab.getAttribute('data-sort') || 'date'; + if (sort === (root.getAttribute('data-active-sort') || '')) return; + loadSort(sort, true); + }); + }); + } + function boot() { var composeForm = document.querySelector('.js-aksrt-forum-compose-form'); if (composeForm) { @@ -1358,6 +1413,7 @@ document.querySelectorAll('.js-aksrt-unlock-topic').forEach(bindUnlockButton); bindForumCommentEngine(); bindForumHomeTabs(); + bindBoardSortTabs(); document.querySelectorAll('.js-aksrt-edit-plate').forEach(bindEditPlateButton); document.querySelectorAll('.js-aksrt-delete-plate').forEach(bindDeletePlateButton); var reportModal = document.querySelector('#aksrt-report-modal'); diff --git a/inc/bootstrap.php b/inc/bootstrap.php index 0f6e259e..23a0dc96 100644 --- a/inc/bootstrap.php +++ b/inc/bootstrap.php @@ -31,6 +31,7 @@ require_once AKSRT_DIR . '/inc/helpers/aksrt-single.php'; require_once AKSRT_DIR . '/inc/helpers/aksrt-archive.php'; require_once AKSRT_DIR . '/inc/helpers/aksrt-archive-filters.php'; require_once AKSRT_DIR . '/inc/helpers/aksrt-comments.php'; +require_once AKSRT_DIR . '/inc/helpers/aksrt-forum.php'; require_once AKSRT_DIR . '/inc/helpers/aksrt-slider.php'; require_once AKSRT_DIR . '/inc/helpers/aksrt-vip.php'; require_once AKSRT_DIR . '/inc/helpers/aksrt-i18n-switch.php'; diff --git a/inc/classes/class-aksrt-forum.php b/inc/classes/class-aksrt-forum.php index c2ade5e9..451e33f5 100644 --- a/inc/classes/class-aksrt-forum.php +++ b/inc/classes/class-aksrt-forum.php @@ -235,6 +235,14 @@ class AKSRT_Forum { $this->view_builder()->ajax_home_tab(); } + public function ajax_board_topics(): void { + $this->view_builder()->ajax_board_topics(); + } + + public function render_board_cards(array $boards): void { + $this->view_builder()->render_board_cards($boards); + } + public function render_topic_row(array $topic): void { $this->view_builder()->render_topic_row($topic); } @@ -365,6 +373,10 @@ class AKSRT_Forum { add_action('wp_ajax_aksrt_forum_home_tab', [$this, 'ajax_home_tab']); add_action('wp_ajax_nopriv_aksrt_forum_home_tab', [$this, 'ajax_home_tab']); + // Public plate/board topic list (sort tabs) + add_action('wp_ajax_aksrt_forum_board_topics', [$this, 'ajax_board_topics']); + add_action('wp_ajax_nopriv_aksrt_forum_board_topics', [$this, 'ajax_board_topics']); + add_action('admin_init', [$this, 'maybe_migrate_boards'], 25); add_filter('template_include', [$this, 'template_routing']); add_action('wp', [$this, 'maybe_refresh_recommend_on_view']); diff --git a/inc/classes/forum/board-service-traits/trait-aksrt-forum-board-service-part-2.php b/inc/classes/forum/board-service-traits/trait-aksrt-forum-board-service-part-2.php index 6a61e2e2..287b5de0 100644 --- a/inc/classes/forum/board-service-traits/trait-aksrt-forum-board-service-part-2.php +++ b/inc/classes/forum/board-service-traits/trait-aksrt-forum-board-service-part-2.php @@ -9,10 +9,46 @@ trait AKSRT_Forum_Board_Service_Part_2 { */ public function get_board_view(int $board_id, array $args = []): array { $user_id = (int) ($args['user_id'] ?? get_current_user_id()); - $page = max(1, (int) ($args['paged'] ?? 1)); + $page = max(1, (int) ($args['paged'] ?? $args['page'] ?? 1)); + $orderby = sanitize_key((string) ($args['orderby'] ?? $args['sort'] ?? '')); + + $board_page = class_exists('AKSRT_Settings') + ? (AKSRT_Settings::get_forum_settings()['board_page'] ?? []) + : []; + $tabs = is_array($board_page['tabs'] ?? null) ? $board_page['tabs'] : [ + ['label' => '全部', 'sort' => 'date'], + ['label' => '推荐', 'sort' => 'featured'], + ['label' => '最新回复', 'sort' => 'last_reply'], + ['label' => '热门', 'sort' => 'hot'], + ['label' => '精华', 'sort' => 'essence'], + ]; + $allowed_sorts = []; + foreach ($tabs as $tab) { + $sort = sanitize_key((string) ($tab['sort'] ?? '')); + if ($sort !== '') { + $allowed_sorts[] = $sort; + } + } + if ($orderby === '' || !in_array($orderby, $allowed_sorts, true)) { + $active_index = max(0, (int) ($board_page['tab_active_index'] ?? 0)); + $orderby = sanitize_key((string) ($tabs[$active_index]['sort'] ?? 'date')); + if ($orderby === '') { + $orderby = 'date'; + } + } + + $compose_url = function_exists('aksrt_get_forum_compose_url') + ? aksrt_get_forum_compose_url(['board' => $board_id]) + : home_url('/'); + $top_info = !isset($board_page['top_info']) || !empty($board_page['top_info']); if ($this->forum->is_plate_cpt_active()) { - return $this->get_plate_view_compat($board_id, $user_id, $page); + $view = $this->get_plate_view_compat($board_id, $user_id, $page, $orderby); + $view['tabs'] = $tabs; + $view['active_sort'] = $orderby; + $view['top_info'] = $top_info; + $view['compose_url'] = $compose_url; + return $view; } $board = get_term($board_id, 'aksrt_forum_board'); @@ -27,6 +63,10 @@ trait AKSRT_Forum_Board_Service_Part_2 { 'permissions' => [], 'application' => null, 'board_options' => [], + 'tabs' => $tabs, + 'active_sort' => $orderby, + 'top_info' => $top_info, + 'compose_url' => function_exists('aksrt_get_forum_compose_url') ? aksrt_get_forum_compose_url() : home_url('/'), ]; } @@ -36,6 +76,7 @@ trait AKSRT_Forum_Board_Service_Part_2 { 'limit' => 20, 'status' => 'publish', 'viewer_user_id' => $user_id, + 'orderby' => $orderby, ]); $sticky_topics = $this->forum->get_sticky_topics_for_board($board_id); @@ -75,13 +116,17 @@ trait AKSRT_Forum_Board_Service_Part_2 { ], 'application' => $user_id > 0 ? $this->forum->get_board_application_for_user($user_id, $board_id) : null, 'board_options' => $this->get_boards(), + 'tabs' => $tabs, + 'active_sort' => $orderby, + 'top_info' => $top_info, + 'compose_url' => $compose_url, ]; } /** * Plate CPT board view (backwards-compatible with get_board_view return shape). */ - private function get_plate_view_compat(int $plate_id, int $user_id, int $page): array { + private function get_plate_view_compat(int $plate_id, int $user_id, int $page, string $orderby = 'date'): array { $plate = $this->get_plate($plate_id); if (!$plate) { return [ @@ -123,6 +168,7 @@ trait AKSRT_Forum_Board_Service_Part_2 { 'limit' => 20, 'status' => 'publish', 'viewer_user_id' => $user_id, + 'orderby' => $orderby, ]); $sticky_topics = $this->get_sticky_topics_for_plate($plate_id); diff --git a/inc/classes/forum/class-aksrt-forum-comment-service.php b/inc/classes/forum/class-aksrt-forum-comment-service.php index 225412e0..5a76d038 100644 --- a/inc/classes/forum/class-aksrt-forum-comment-service.php +++ b/inc/classes/forum/class-aksrt-forum-comment-service.php @@ -34,6 +34,10 @@ class AKSRT_Forum_Comment_Service { if ((int) $comment->comment_approved !== 1) return; $commenter_id = (int) $comment->user_id; if ($commenter_id <= 0) return; + + // Topic-level last_reply for board sort tabs. + update_post_meta((int) $post->ID, '_aksrt_last_reply', (string) $comment->comment_date); + $this->forum->notify_topic_reply((int) $post->ID, $commenter_id); } diff --git a/inc/classes/forum/class-aksrt-forum-draft-service.php b/inc/classes/forum/class-aksrt-forum-draft-service.php index 43df7cb7..f270e853 100644 --- a/inc/classes/forum/class-aksrt-forum-draft-service.php +++ b/inc/classes/forum/class-aksrt-forum-draft-service.php @@ -379,6 +379,7 @@ class AKSRT_Forum_Draft_Service { update_post_meta($draft_id, '_aksrt_featured', '0'); update_post_meta($draft_id, '_aksrt_locked', '0'); update_post_meta($draft_id, '_aksrt_views', 0); + update_post_meta($draft_id, '_aksrt_last_reply', (string) get_post_field('post_date', $draft_id)); $bbs_type = get_post_meta($draft_id, '_aksrt_bbs_type', true) ?: AKSRT_Forum::BBS_TYPE_STANDARD; if ($bbs_type === AKSRT_Forum::BBS_TYPE_QUESTION) { @@ -403,7 +404,7 @@ class AKSRT_Forum_Draft_Service { : __('主题已提交审核,审核通过后对外展示', 'aksrt'), 'redirect' => $post_status === 'publish' ? get_permalink($draft_id) - : add_query_arg('compose_status', 'pending', home_url('/forums/')), + : add_query_arg('compose_status', 'pending', aksrt_get_forum_home_url()), ]; } } diff --git a/inc/classes/forum/class-aksrt-forum-moderation-service.php b/inc/classes/forum/class-aksrt-forum-moderation-service.php index d3b39218..370eef5d 100644 --- a/inc/classes/forum/class-aksrt-forum-moderation-service.php +++ b/inc/classes/forum/class-aksrt-forum-moderation-service.php @@ -135,7 +135,7 @@ class AKSRT_Forum_Moderation_Service { : __('已拒绝', 'aksrt'); $payload = [ 'title' => __('版主申请结果', 'aksrt'), - 'target_url' => isset($board['url']) ? (string) $board['url'] : home_url('/forums/'), + 'target_url' => isset($board['url']) ? (string) $board['url'] : aksrt_get_forum_home_url(), ]; $clean_note = sanitize_textarea_field($note); if ($clean_note !== '') { diff --git a/inc/classes/forum/class-aksrt-forum-score-service.php b/inc/classes/forum/class-aksrt-forum-score-service.php index 4b154be0..5cd648e0 100644 --- a/inc/classes/forum/class-aksrt-forum-score-service.php +++ b/inc/classes/forum/class-aksrt-forum-score-service.php @@ -354,7 +354,7 @@ class AKSRT_Forum_Score_Service { } $label = $action_labels[$action] ?? __('治理动作已执行', 'aksrt'); - $target_url = $action === 'delete' ? home_url('/forums/') : get_permalink($topic_id); + $target_url = $action === 'delete' ? aksrt_get_forum_home_url() : get_permalink($topic_id); $payload = [ 'title' => $label, 'target_url' => $target_url, diff --git a/inc/classes/forum/class-aksrt-forum-topic-service.php b/inc/classes/forum/class-aksrt-forum-topic-service.php index ced1f4ce..6922e401 100644 --- a/inc/classes/forum/class-aksrt-forum-topic-service.php +++ b/inc/classes/forum/class-aksrt-forum-topic-service.php @@ -167,6 +167,7 @@ class AKSRT_Forum_Topic_Service { update_post_meta($post_id, '_aksrt_featured', '0'); update_post_meta($post_id, '_aksrt_locked', '0'); update_post_meta($post_id, '_aksrt_views', 0); + update_post_meta($post_id, '_aksrt_last_reply', (string) get_post_field('post_date', $post_id)); update_post_meta($post_id, '_aksrt_bbs_type', $bbs_type); if ($bbs_type === AKSRT_Forum::BBS_TYPE_QUESTION) { update_post_meta($post_id, '_aksrt_question_status', AKSRT_Forum::QUESTION_UNSOLVED); @@ -196,7 +197,7 @@ class AKSRT_Forum_Topic_Service { : __('主题已提交审核,审核通过后对外展示', 'aksrt'), 'redirect' => $post_status === 'publish' ? get_permalink($post_id) - : add_query_arg('compose_status', 'pending', home_url('/forums/')), + : add_query_arg('compose_status', 'pending', aksrt_get_forum_home_url()), ]; } diff --git a/inc/classes/forum/class-aksrt-forum-view-builder.php b/inc/classes/forum/class-aksrt-forum-view-builder.php index 84e340de..c5a9aa24 100644 --- a/inc/classes/forum/class-aksrt-forum-view-builder.php +++ b/inc/classes/forum/class-aksrt-forum-view-builder.php @@ -34,35 +34,55 @@ class AKSRT_Forum_View_Builder { $visibility = sanitize_key((string) ($args['visibility'] ?? '')); $review_status = sanitize_key((string) ($args['review_status'] ?? '')); $author_id = (int) ($args['author_id'] ?? 0); - $orderby = sanitize_key((string) ($args['orderby'] ?? 'date')); + $orderby = sanitize_key((string) ($args['orderby'] ?? ($args['sort'] ?? 'date'))); $viewer_user_id = (int) ($args['viewer_user_id'] ?? get_current_user_id()); $include_hidden = !empty($args['include_hidden']); + // Settings tab aliases: hot→views, essence/featured→featured filter. + if ($orderby === 'hot') { + $orderby = 'views'; + } + $query_args = [ - 'post_type' => 'aksrt_forum_topic', - 'posts_per_page' => $limit, - 'offset' => $offset, - 'post_status' => $this->forum->normalize_post_status_query($status), - 'order' => 'DESC', - 'ignore_sticky_posts' => true, + 'post_type' => 'aksrt_forum_topic', + 'posts_per_page' => $limit, + 'offset' => $offset, + 'post_status' => $this->forum->normalize_post_status_query($status), + 'order' => 'DESC', + 'ignore_sticky_posts'=> true, ]; + $meta_query = []; + if ($orderby === 'views') { - $query_args['orderby'] = 'meta_value_num'; + $query_args['orderby'] = 'meta_value_num'; $query_args['meta_key'] = '_aksrt_views'; } elseif ($orderby === 'recommend') { - $query_args['orderby'] = 'meta_value_num'; + $query_args['orderby'] = 'meta_value_num'; $query_args['meta_key'] = '_aksrt_recommend_score'; } elseif ($orderby === 'comment_count') { $query_args['orderby'] = 'comment_count'; } elseif ($orderby === 'score') { - $query_args['orderby'] = 'meta_value_num'; + $query_args['orderby'] = 'meta_value_num'; $query_args['meta_key'] = '_aksrt_score'; } elseif ($orderby === 'favorites') { - $query_args['orderby'] = 'meta_value_num'; + $query_args['orderby'] = 'meta_value_num'; $query_args['meta_key'] = '_aksrt_favorite_count'; + } elseif ($orderby === 'last_reply') { + $query_args['orderby'] = 'meta_value'; + $query_args['meta_key'] = '_aksrt_last_reply'; + $query_args['meta_type']= 'DATETIME'; + } elseif ($orderby === 'featured' || $orderby === 'essence') { + // 推荐 / 精华 share _aksrt_featured (Zibll essence = featured). + $meta_query[] = [ + 'key' => '_aksrt_featured', + 'value' => '1', + 'compare' => '=', + ]; + $query_args['orderby'] = 'date'; } else { $query_args['orderby'] = 'date'; + $orderby = 'date'; } if ($keyword !== '') { @@ -76,14 +96,14 @@ class AKSRT_Forum_View_Builder { $plate_id = (int) ($args['plate_id'] ?? 0); $plate_ids = $args['plate_ids'] ?? []; if (!empty($plate_ids) && is_array($plate_ids)) { - $query_args['meta_query'][] = [ + $meta_query[] = [ 'key' => '_aksrt_plate_id', 'value' => array_map('intval', $plate_ids), 'type' => 'NUMERIC', 'compare' => 'IN', ]; } elseif ($plate_id > 0) { - $query_args['meta_query'][] = [ + $meta_query[] = [ 'key' => '_aksrt_plate_id', 'value' => $plate_id, 'type' => 'NUMERIC', @@ -92,29 +112,31 @@ class AKSRT_Forum_View_Builder { } elseif ($board_id > 0) { $query_args['tax_query'] = [[ 'taxonomy' => 'aksrt_forum_board', - 'field' => 'term_id', - 'terms' => $board_id, + 'field' => 'term_id', + 'terms' => $board_id, ]]; } - $meta_query = []; if ($visibility !== '') { $meta_query[] = [ - 'key' => '_aksrt_visibility', - 'value' => $visibility, + 'key' => '_aksrt_visibility', + 'value' => $visibility, 'compare' => '=', ]; } if ($review_status !== '') { $meta_query[] = [ - 'key' => '_aksrt_review_status', - 'value' => $review_status, + 'key' => '_aksrt_review_status', + 'value' => $review_status, 'compare' => '=', ]; } if (!empty($meta_query)) { + if (count($meta_query) > 1) { + $meta_query['relation'] = 'AND'; + } $query_args['meta_query'] = $meta_query; } @@ -129,7 +151,7 @@ class AKSRT_Forum_View_Builder { } $topic = $this->forum->build_topic_payload($post, $viewer_user_id); - if (!$include_hidden && !$topic['can_view']) { + if (!$include_hidden && empty($topic['can_view'])) { continue; } @@ -139,10 +161,11 @@ class AKSRT_Forum_View_Builder { wp_reset_postdata(); return [ - 'items' => $items, - 'total' => (int) $query->found_posts, + 'items' => $items, + 'total' => (int) $query->found_posts, 'max_pages' => (int) $query->max_num_pages, - 'page' => $page, + 'page' => $page, + 'orderby' => $orderby, ]; } @@ -152,16 +175,12 @@ class AKSRT_Forum_View_Builder { public function get_home_view(int $user_id = 0): array { $boards = $this->forum->get_boards(); $stats = $this->get_stats(); - $recent = $this->get_topic_list([ - 'limit' => 10, - 'status' => 'publish', - 'viewer_user_id' => $user_id, - ]); + $synthesis = $this->get_synthesis_stream(1, 15, $user_id); $hot = $this->get_topic_list([ - 'limit' => 8, - 'status' => 'publish', + 'limit' => 8, + 'status' => 'publish', 'viewer_user_id' => $user_id, - 'orderby' => 'views', + 'orderby' => 'views', ]); $applications = []; @@ -181,20 +200,23 @@ class AKSRT_Forum_View_Builder { $quick_posts = !empty($config['homepage']['quick_posts']); return [ - 'boards' => $boards, - 'recent_topics' => $recent['items'], - 'hot_topics' => $hot['items'], - 'stats' => $stats, - 'permissions' => [ - 'can_compose' => $user_id > 0 && $this->forum->forum_user_can($user_id, 'compose_post'), - 'can_manage' => $this->forum->is_forum_admin($user_id), - 'can_create_plate' => $this->forum->forum_user_can($user_id, 'plate_create'), - 'user_tier' => $user_id > 0 ? $this->forum->get_user_plate_tier($user_id, 0) : AKSRT_Forum::TIER_NONE, + 'boards' => $boards, + 'recent_topics' => $synthesis['items'], + 'synthesis' => $synthesis, + 'hot_topics' => $hot['items'], + 'stats' => $stats, + 'permissions' => [ + 'can_compose' => $user_id > 0 && $this->forum->forum_user_can($user_id, 'compose_post'), + 'can_manage' => $this->forum->is_forum_admin($user_id), + 'can_create_plate'=> $this->forum->forum_user_can($user_id, 'plate_create'), + 'user_tier' => $user_id > 0 ? $this->forum->get_user_plate_tier($user_id, 0) : AKSRT_Forum::TIER_NONE, ], - 'applications' => $applications, - 'home_tabs' => $home_tabs, - 'active_index' => $active_index, - 'quick_posts' => $quick_posts, + 'applications' => $applications, + 'home_tabs' => $home_tabs, + 'active_index' => $active_index, + 'quick_posts' => $quick_posts, + 'compose_url' => function_exists('aksrt_get_forum_compose_url') ? aksrt_get_forum_compose_url() : home_url('/'), + 'home_url' => function_exists('aksrt_get_forum_home_url') ? aksrt_get_forum_home_url() : home_url('/'), ]; } @@ -274,13 +296,17 @@ class AKSRT_Forum_View_Builder { $result = $this->get_pending_stream($user_id, $page); break; case 'plate': + ob_start(); + $this->render_board_cards($this->forum->get_boards()); + $html = ob_get_clean(); wp_send_json_success([ - 'html' => '', + 'html' => $html, 'type' => 'plate', 'boards' => $this->forum->get_boards(), - 'total' => 0, + 'total' => count($this->forum->get_boards()), 'max_pages' => 1, 'page' => 1, + 'has_more' => false, ]); return; default: @@ -293,7 +319,7 @@ class AKSRT_Forum_View_Builder { $this->render_topic_row($topic); } } else { - echo '
' . esc_html__('暂无内容', 'aksrt') . '
' . esc_html__('内容空空如也', 'aksrt') . '
' . esc_html__('内容空空如也', 'aksrt') . '
'; + if ($compose !== '') { + echo '' . esc_html__('发布第一个主题', 'aksrt') . ''; + } + echo '' . esc_html__('内容空空如也', 'aksrt') . '