Files
wordpress-theme-aksrt/inc/helpers/homepage/layout.php
T
2026-09-05 17:32:18 +08:00

189 lines
6.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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 '';
}
$is_card = class_exists('\AKSRT\Settings\PostDisplay')
&& \AKSRT\Settings\PostDisplay::get_archive_layout() === 'card';
$is_mobel = wp_is_mobile();
if ($is_card) {
$placeholder_type = 'card';
$placeholder_num = $is_mobel ? 4 : 12;
} else {
$placeholder_type = 'list';
$placeholder_num = $is_mobel ? 4 : 6;
}
$placeholder = aksrt_render_placeholder($placeholder_type, $placeholder_num);
$html = '';
foreach ($tab_configs as $index => $tab_cfg) {
$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;
}
}