feat(frontend): adopt zibll site-layout-1/2/3 float dual-column system
Wire settings-driven sidebar visibility and body site-layout classes, replace content-layout CSS grid with Zibll float geometry, move sidebar DOM to content-wrap sibling across single/archive/page/home, and add post meta show_layout overrides.
This commit is contained in:
1 parent
232b6eb752
commit
12673fb819
15 files changed
+354
-168
No files matched your search
@@ -275,26 +275,19 @@ if (!function_exists('aksrt_archive_has_sidebar')) :
|
||||
/**
|
||||
* Resolve whether a stream page should show an aside.
|
||||
*
|
||||
* @param string $preferred Preferred sidebar id.
|
||||
* @param string $preferred Preferred sidebar id (compat only).
|
||||
* @param bool $enabled Page-level sidebar toggle.
|
||||
*/
|
||||
function aksrt_archive_has_sidebar(string $preferred = '', bool $enabled = true): bool {
|
||||
if (!$enabled || wp_is_mobile()) {
|
||||
// $preferred kept for call-site compat; visibility is settings/meta driven (zibll).
|
||||
unset($preferred);
|
||||
if (!$enabled) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($preferred !== '' && is_active_sidebar($preferred)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (function_exists('aksrt_is_show_sidebar')) {
|
||||
return aksrt_is_show_sidebar();
|
||||
}
|
||||
|
||||
$fallback = function_exists('aksrt_resolve_sidebar_id') ? aksrt_resolve_sidebar_id() : 'sidebar-blog';
|
||||
return is_active_sidebar($fallback)
|
||||
|| is_active_sidebar('all_sidebar_top')
|
||||
|| is_active_sidebar('all_sidebar_bottom');
|
||||
return !wp_is_mobile();
|
||||
}
|
||||
endif;
|
||||
|
||||
@@ -440,6 +433,7 @@ endif;
|
||||
if (!function_exists('aksrt_archive_close_shell')) :
|
||||
/**
|
||||
* Close a shared archive shell.
|
||||
* Sidebar is a sibling of .content-wrap (Zibll float dual-column).
|
||||
*
|
||||
* @param array<string,mixed> $args Shell args.
|
||||
*/
|
||||
@@ -450,11 +444,11 @@ if (!function_exists('aksrt_archive_close_shell')) :
|
||||
]);
|
||||
?>
|
||||
</div>
|
||||
<?php if (!empty($args['has_sidebar'])) : ?>
|
||||
<?php get_sidebar(); ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php if (!empty($args['has_sidebar'])) : ?>
|
||||
<?php get_sidebar(); ?>
|
||||
<?php endif; ?>
|
||||
<?php
|
||||
if (!empty($args['bottom_fluid']) && is_array($args['bottom_fluid'])) {
|
||||
aksrt_archive_render_widget_zone($args['bottom_fluid'], 'fluid-widget-wrap');
|
||||
|
||||
@@ -532,6 +532,9 @@ if (!function_exists('aksrt_homepage_has_sidebar')) {
|
||||
* Whether the fixed homepage should render an aside column.
|
||||
*/
|
||||
function aksrt_homepage_has_sidebar(): bool {
|
||||
if (function_exists('aksrt_is_show_sidebar')) {
|
||||
return aksrt_is_show_sidebar();
|
||||
}
|
||||
return aksrt_homepage_has_active_sidebars([
|
||||
'all_sidebar_top',
|
||||
'home_sidebar',
|
||||
@@ -986,10 +989,10 @@ if (!function_exists('aksrt_homepage_render_layout')) {
|
||||
);
|
||||
?>
|
||||
</div>
|
||||
|
||||
<?php aksrt_homepage_render_sidebar(); ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php aksrt_homepage_render_sidebar(); ?>
|
||||
</main>
|
||||
<?php
|
||||
aksrt_homepage_render_widget_zone(
|
||||
|
||||
@@ -99,9 +99,9 @@ if (!function_exists('aksrt_single_build_context')) :
|
||||
$show_pay_box = false;
|
||||
}
|
||||
|
||||
$aside_widgets = is_active_sidebar('sidebar-article')
|
||||
|| is_active_sidebar('all_sidebar_top')
|
||||
|| is_active_sidebar('all_sidebar_bottom');
|
||||
$show_aside = function_exists('aksrt_is_show_sidebar')
|
||||
? aksrt_is_show_sidebar()
|
||||
: false;
|
||||
|
||||
return [
|
||||
'post_id' => $post_id,
|
||||
@@ -138,7 +138,7 @@ if (!function_exists('aksrt_single_build_context')) :
|
||||
'paid_box_position' => $paid_box_position,
|
||||
'breadcrumbs_html' => $breadcrumbs_html,
|
||||
'status_badge' => $status_badge,
|
||||
'show_aside' => $aside_widgets || $show_toc || $has_download || $show_pay_box,
|
||||
'show_aside' => $show_aside,
|
||||
'toc_title' => __('文章目录', 'aksrt'),
|
||||
];
|
||||
}
|
||||
@@ -948,7 +948,7 @@ if (!function_exists('aksrt_single_render_aside')) :
|
||||
return;
|
||||
}
|
||||
?>
|
||||
<aside class="sidebar content-layout__aside" role="complementary" aria-label="<?php esc_attr_e('侧栏', 'aksrt'); ?>">
|
||||
<div class="sidebar" role="complementary" aria-label="<?php esc_attr_e('侧栏', 'aksrt'); ?>">
|
||||
<?php if (!empty($ctx['has_download'])) : ?>
|
||||
<?php get_template_part('templates/parts/resource-meta-box'); ?>
|
||||
<?php endif; ?>
|
||||
@@ -971,7 +971,7 @@ if (!function_exists('aksrt_single_render_aside')) :
|
||||
<?php if (is_active_sidebar('all_sidebar_bottom')) : ?>
|
||||
<?php dynamic_sidebar('all_sidebar_bottom'); ?>
|
||||
<?php endif; ?>
|
||||
</aside>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
endif;
|
||||
|
||||
@@ -46,23 +46,200 @@ function aksrt_resolve_sidebar_id(): string {
|
||||
return 'page_sidebar_' . get_queried_object_id();
|
||||
}
|
||||
|
||||
if (is_home() || is_front_page()) {
|
||||
return 'home_sidebar';
|
||||
}
|
||||
|
||||
return 'sidebar-blog';
|
||||
}
|
||||
endif;
|
||||
|
||||
if (!function_exists('aksrt_get_post_show_layout')):
|
||||
/**
|
||||
* Zibll-compatible post/page layout override.
|
||||
*
|
||||
* Meta key: `_aksrt_show_layout`
|
||||
* Values: '' (follow) | no_sidebar | sidebar_left | sidebar_right
|
||||
*
|
||||
* @param int|null $post_id Post ID.
|
||||
*/
|
||||
function aksrt_get_post_show_layout($post_id = null): string {
|
||||
$post_id = $post_id ? (int) $post_id : (int) get_queried_object_id();
|
||||
if ($post_id <= 0) {
|
||||
return '';
|
||||
}
|
||||
$value = (string) get_post_meta($post_id, '_aksrt_show_layout', true);
|
||||
return in_array($value, ['no_sidebar', 'sidebar_left', 'sidebar_right'], true) ? $value : '';
|
||||
}
|
||||
endif;
|
||||
|
||||
if (!function_exists('aksrt_get_sidebar_config_safe')):
|
||||
/**
|
||||
* @return array{enabled:bool,position:string,width:int,home:bool,category:bool,tag:bool,single:bool,page:bool,search:bool}
|
||||
*/
|
||||
function aksrt_get_sidebar_config_safe(): array {
|
||||
if (class_exists('AKSRT_Settings') && method_exists('AKSRT_Settings', 'get_sidebar_config')) {
|
||||
$cfg = AKSRT_Settings::get_sidebar_config();
|
||||
if (is_array($cfg)) {
|
||||
return $cfg;
|
||||
}
|
||||
}
|
||||
return [
|
||||
'enabled' => true,
|
||||
'position' => 'right',
|
||||
'width' => 311,
|
||||
'home' => true,
|
||||
'category' => true,
|
||||
'tag' => true,
|
||||
'single' => true,
|
||||
'page' => true,
|
||||
'search' => true,
|
||||
];
|
||||
}
|
||||
endif;
|
||||
|
||||
if (!function_exists('aksrt_is_show_sidebar')):
|
||||
/**
|
||||
* 统一判断当前页面是否展示侧栏。
|
||||
* Zibll-strict sidebar visibility (settings + post meta, not widget presence).
|
||||
*
|
||||
* Filter: aksrt_is_show_sidebar
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function aksrt_is_show_sidebar(): bool {
|
||||
if (wp_is_mobile()) {
|
||||
$show = aksrt_is_show_sidebar_filter();
|
||||
return (bool) apply_filters('aksrt_is_show_sidebar', $show);
|
||||
}
|
||||
endif;
|
||||
|
||||
if (!function_exists('aksrt_is_show_sidebar_filter')):
|
||||
/**
|
||||
* Core sidebar visibility decision (Zibll zib_is_show_sidebar_filter parity).
|
||||
*/
|
||||
function aksrt_is_show_sidebar_filter(): bool {
|
||||
if (function_exists('wp_is_mobile') && wp_is_mobile()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$sidebar_id = aksrt_resolve_sidebar_id();
|
||||
return is_active_sidebar($sidebar_id) || is_active_sidebar('all_sidebar_top') || is_active_sidebar('all_sidebar_bottom');
|
||||
$cfg = aksrt_get_sidebar_config_safe();
|
||||
if (empty($cfg['enabled'])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Single / page: post meta can force show/hide (Zibll show_layout).
|
||||
if (is_singular()) {
|
||||
$layout = aksrt_get_post_show_layout(get_queried_object_id());
|
||||
if ($layout === 'no_sidebar') {
|
||||
return false;
|
||||
}
|
||||
if ($layout === 'sidebar_left' || $layout === 'sidebar_right') {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if ((is_home() || is_front_page()) && empty($cfg['home'])) {
|
||||
return false;
|
||||
}
|
||||
if (is_single() && empty($cfg['single'])) {
|
||||
return false;
|
||||
}
|
||||
if (is_page() && empty($cfg['page'])) {
|
||||
return false;
|
||||
}
|
||||
if (is_category() && empty($cfg['category'])) {
|
||||
return false;
|
||||
}
|
||||
if (is_tag() && empty($cfg['tag'])) {
|
||||
return false;
|
||||
}
|
||||
if (is_search() && empty($cfg['search'])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Category/tag term meta can still force off (existing AKSRT contract).
|
||||
if ((is_category() || is_tag()) && class_exists('AKSRT_Term_Meta') && method_exists('AKSRT_Term_Meta', 'resolve_archive_settings')) {
|
||||
$term_id = (int) get_queried_object_id();
|
||||
if ($term_id > 0) {
|
||||
$resolved = AKSRT_Term_Meta::resolve_archive_settings($term_id);
|
||||
if (is_array($resolved) && array_key_exists('show_sidebar', $resolved) && empty($resolved['show_sidebar'])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Search page display setting can force off.
|
||||
if (is_search() && class_exists('AKSRT_Settings') && method_exists('AKSRT_Settings', 'get_other_page_settings')) {
|
||||
$other = AKSRT_Settings::get_other_page_settings();
|
||||
if (is_array($other) && array_key_exists('page_search_sidebar', $other) && empty($other['page_search_sidebar'])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Scene switches above already gated; when enabled, show the column
|
||||
// (widgets may be empty — matches zibll empty sidebar column policy).
|
||||
if (is_home() || is_front_page()) {
|
||||
return !empty($cfg['home']);
|
||||
}
|
||||
if (is_single()) {
|
||||
return !empty($cfg['single']);
|
||||
}
|
||||
if (is_page()) {
|
||||
return !empty($cfg['page']);
|
||||
}
|
||||
if (is_category()) {
|
||||
return !empty($cfg['category']);
|
||||
}
|
||||
if (is_tag()) {
|
||||
return !empty($cfg['tag']);
|
||||
}
|
||||
if (is_search()) {
|
||||
return !empty($cfg['search']);
|
||||
}
|
||||
|
||||
// Author / other archives: follow global enabled.
|
||||
return true;
|
||||
}
|
||||
endif;
|
||||
|
||||
if (!function_exists('aksrt_get_site_layout')):
|
||||
/**
|
||||
* Zibll site-layout mode: 1=no sidebar, 2=right, 3=left.
|
||||
*/
|
||||
function aksrt_get_site_layout(): int {
|
||||
if (!aksrt_is_show_sidebar()) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
$position = 'right';
|
||||
if (is_singular()) {
|
||||
$meta = aksrt_get_post_show_layout(get_queried_object_id());
|
||||
if ($meta === 'sidebar_left') {
|
||||
$position = 'left';
|
||||
} elseif ($meta === 'sidebar_right') {
|
||||
$position = 'right';
|
||||
} else {
|
||||
$cfg = aksrt_get_sidebar_config_safe();
|
||||
$position = ($cfg['position'] ?? 'right') === 'left' ? 'left' : 'right';
|
||||
}
|
||||
} else {
|
||||
$cfg = aksrt_get_sidebar_config_safe();
|
||||
$position = ($cfg['position'] ?? 'right') === 'left' ? 'left' : 'right';
|
||||
}
|
||||
|
||||
return $position === 'left' ? 3 : 2;
|
||||
}
|
||||
endif;
|
||||
|
||||
if (!function_exists('aksrt_body_layout_classes')):
|
||||
/**
|
||||
* @return string[] e.g. ['site-layout-2']
|
||||
*/
|
||||
function aksrt_body_layout_classes(): array {
|
||||
$layout = aksrt_get_site_layout();
|
||||
if (!in_array($layout, [1, 2, 3], true)) {
|
||||
$layout = 1;
|
||||
}
|
||||
return ['site-layout-' . $layout];
|
||||
}
|
||||
endif;
|
||||
|
||||
|
||||
Reference in new issue
Block a user