Align homepage and category discovery, modern widgets, admin controls, quotes, and comments with the reference theme. Remove superseded paths and add rendering and behavior coverage. Update stale asset and finance contracts; all 760 Node tests and 139 widget assertions pass.
180 lines
6.2 KiB
PHP
180 lines
6.2 KiB
PHP
<?php
|
||
/**
|
||
* Fixed homepage layout renderer.
|
||
*
|
||
* @package AKSRT
|
||
*/
|
||
|
||
defined('ABSPATH') || exit;
|
||
|
||
if (!function_exists('aksrt_homepage_render_layout')) {
|
||
/**
|
||
* Render the fixed homepage layout (legacy latest-first content stream).
|
||
*
|
||
* Order (legacy-aligned):
|
||
* fluid top → main.container → top content → tabs/list → bottom content → sidebar
|
||
* → fluid bottom. Hero/header-slider is rendered from header.php, not here.
|
||
*/
|
||
function aksrt_homepage_render_layout(): void {
|
||
$main_list_enabled = !class_exists('\AKSRT\Settings\Settings') || \AKSRT\Settings\Settings::home_posts_list_enabled();
|
||
|
||
// Fluid zones live outside <main>, once only (removed from header.php).
|
||
aksrt_homepage_render_widget_zone(
|
||
['home_top_fluid'],
|
||
'fluid-widget-wrap aksrt-homepage__fluid-zone aksrt-homepage__fluid-zone--top'
|
||
);
|
||
?>
|
||
<main id="main-content" role="main" class="container site-main aksrt-homepage" tabindex="-1">
|
||
<div class="content-wrap aksrt-homepage__shell">
|
||
<div class="content-layout aksrt-homepage__content-layout aksrt-homepage__primary">
|
||
<?php
|
||
aksrt_homepage_render_widget_zone(
|
||
['home_top_content'],
|
||
'aksrt-homepage__content-zone aksrt-homepage__content-zone--top'
|
||
);
|
||
|
||
?>
|
||
|
||
<?php if ($main_list_enabled) :
|
||
$tab_configs = aksrt_homepage_get_current_page() === 1 ? aksrt_homepage_get_tab_configs() : [];
|
||
?>
|
||
<div class="home-tab-content">
|
||
<?php echo aksrt_homepage_get_tab_header_html($tab_configs); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
|
||
<div class="tab-content">
|
||
<div class="posts-row ajaxpager tab-pane fade in active" id="index-tab-main">
|
||
<?php aksrt_homepage_render_ajax_option_menu(); ?>
|
||
<?php aksrt_homepage_render_posts_grid(aksrt_homepage_get_latest_query(), true); ?>
|
||
</div>
|
||
<?php echo aksrt_homepage_get_tab_panes_html($tab_configs); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
|
||
</div>
|
||
</div>
|
||
<?php endif; ?>
|
||
|
||
<?php
|
||
aksrt_homepage_render_widget_zone(
|
||
['home_bottom_content'],
|
||
'aksrt-homepage__content-zone aksrt-homepage__content-zone--bottom'
|
||
);
|
||
?>
|
||
</div>
|
||
</div>
|
||
|
||
<?php aksrt_homepage_render_sidebar(); ?>
|
||
</main>
|
||
<?php
|
||
aksrt_homepage_render_widget_zone(
|
||
['home_bottom_fluid'],
|
||
'fluid-widget-wrap aksrt-homepage__fluid-zone aksrt-homepage__fluid-zone--bottom'
|
||
);
|
||
}
|
||
}
|
||
|
||
if (!function_exists('aksrt_homepage_get_tab_header_html')) {
|
||
/**
|
||
* legacy zib_index_tab_html:tab 导航 / 翻页标题条 / 空占位 三态。
|
||
*
|
||
* @param array<int, array<string, mixed>> $tab_configs Configured term tabs.
|
||
*/
|
||
function aksrt_homepage_get_tab_header_html(array $tab_configs): string {
|
||
$list_title = class_exists('\AKSRT\Settings\Settings')
|
||
? \AKSRT\Settings\Settings::home_list_title()
|
||
: '';
|
||
$fallback_title = $list_title !== '' ? $list_title : __('最新发布', 'aksrt');
|
||
$paged = aksrt_homepage_get_current_page();
|
||
|
||
//不是第一页
|
||
if ($paged > 1) {
|
||
return '<div class="box-body notop nobottom"><div class="title-theme">' . $fallback_title
|
||
. '<small class="ml10">' . esc_html(sprintf(__('第%s页', 'aksrt'), $paged)) . '</small></div></div>';
|
||
}
|
||
|
||
$index_tab_nav = '';
|
||
foreach ($tab_configs as $index => $tab_cfg) {
|
||
$index_tab_nav .= '<li><a data-toggle="tab" data-ajax="' . esc_url(aksrt_homepage_get_tab_link($tab_cfg))
|
||
. '" href="#index-tab-' . (int) $index . '">' . wp_kses_post($tab_cfg['title']) . '</a></li>';
|
||
}
|
||
|
||
if (!$index_tab_nav) {
|
||
return $list_title !== ''
|
||
? '<div class="box-body notop nobottom"><div class="title-theme">' . wp_kses_post($list_title) . '</div></div>'
|
||
: '<div></div>';
|
||
}
|
||
|
||
$html = '<li class="active"><a data-toggle="tab" href="#index-tab-main">' . wp_kses_post($fallback_title) . '</a></li>' . $index_tab_nav;
|
||
|
||
return '<div class="index-tab affix-header-sm relative home-tab-nav-box mb10" offset-top="-8"><ul style="width:100%;" class="scroll-x no-scrollbar">' . $html . '</ul></div>';
|
||
}
|
||
}
|
||
|
||
if (!function_exists('aksrt_homepage_get_tab_panes_html')) {
|
||
/**
|
||
* legacy zib_index_tab('content'):每个栏目的原位刷新 pane。
|
||
*
|
||
* pane 本身就是 .ajaxpager;post_ajax_trigger 指向栏目页,post_ajax 加载后
|
||
* 用栏目页自身的列表 DOM 原地替换 loader,不新建区域。
|
||
*
|
||
* @param array<int, array<string, mixed>> $tab_configs Configured term tabs.
|
||
*/
|
||
function aksrt_homepage_get_tab_panes_html(array $tab_configs): string {
|
||
if (!$tab_configs) {
|
||
return '';
|
||
}
|
||
|
||
$html = '';
|
||
foreach ($tab_configs as $index => $tab_cfg) {
|
||
$config = aksrt_archive_get_render_config(['context' => 'category', 'term_id' => (int) $tab_cfg['term_id']]);
|
||
$is_card = ($config['mode'] ?? 'list') === 'card';
|
||
$placeholder = aksrt_render_placeholder($is_card ? 'card' : 'list', $is_card ? (wp_is_mobile() ? 4 : 12) : (wp_is_mobile() ? 4 : 6));
|
||
$html .= '<div class="ajaxpager tab-pane fade" id="index-tab-' . (int) $index . '">';
|
||
$html .= '<span class="post_ajax_trigger"><a class="ajax_load ajax-next ajax-open" href="' . esc_url(aksrt_homepage_get_tab_link($tab_cfg)) . '"></a></span>';
|
||
$html .= '<div class="post_ajax_loader">' . $placeholder . '</div>';
|
||
$html .= '</div>';
|
||
}
|
||
|
||
return $html;
|
||
}
|
||
}
|
||
|
||
if (!function_exists('aksrt_homepage_get_tab_link')) {
|
||
/**
|
||
* 栏目 tab 的加载链接:栏目页 + nofilter(抑制响应页的筛选菜单)。
|
||
*
|
||
* @param array<string, mixed> $tab_cfg Tab config with term and orderby.
|
||
*/
|
||
function aksrt_homepage_get_tab_link(array $tab_cfg): string {
|
||
$term = $tab_cfg['term'] ?? null;
|
||
if (!$term instanceof WP_Term) {
|
||
return home_url('/');
|
||
}
|
||
|
||
$query_arg = ['nofilter' => 'true'];
|
||
if (!empty($tab_cfg['orderby'])) {
|
||
$query_arg['orderby'] = $tab_cfg['orderby'];
|
||
}
|
||
|
||
$link = get_term_link($term);
|
||
if (is_wp_error($link)) {
|
||
return home_url('/');
|
||
}
|
||
|
||
return add_query_arg($query_arg, $link);
|
||
}
|
||
}
|
||
|
||
if (!function_exists('aksrt_render_fixed_homepage')) {
|
||
/**
|
||
* Render the new fixed homepage layout.
|
||
*/
|
||
function aksrt_render_fixed_homepage(): bool {
|
||
if (!aksrt_is_fixed_homepage_request()) {
|
||
return false;
|
||
}
|
||
|
||
get_header();
|
||
aksrt_homepage_render_layout();
|
||
get_footer();
|
||
|
||
return true;
|
||
}
|
||
}
|