Remove deprecated widget locations and widgets, standardize sidebar labels, and render a compact paid-post purchase card in the article sidebar.
425 lines
18 KiB
PHP
425 lines
18 KiB
PHP
<?php
|
|
/**
|
|
* @package AKSRT
|
|
*/
|
|
|
|
namespace AKSRT\Core;
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
trait SetupPart1 {
|
|
|
|
public function register_sidebars(): void {
|
|
$fluid_wrapper_before = '<div id="%1$s" class="zib-widget %2$s">';
|
|
$card_wrapper_before = '<div id="%1$s" class="zib-widget %2$s">';
|
|
$title_before = '<h3>';
|
|
$title_after = '</h3>';
|
|
|
|
// ===== 全站 / 首页挂载位(对齐 Zibll 首页骨架) =====
|
|
register_sidebar([
|
|
'id' => 'all_top_fluid',
|
|
'name' => __('全站 - 顶部全宽', 'aksrt'),
|
|
'description' => __('显示在所有页面内容区上方的全宽挂载位。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'all_bottom_fluid',
|
|
'name' => __('全站 - 底部全宽', 'aksrt'),
|
|
'description' => __('显示在所有页面页脚上方的全宽挂载位。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'all_sidebar_top',
|
|
'name' => __('全站 - 侧栏顶部', 'aksrt'),
|
|
'description' => __('显示在全站侧栏顶部。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'all_sidebar_bottom',
|
|
'name' => __('全站 - 侧栏底部', 'aksrt'),
|
|
'description' => __('显示在全站侧栏底部。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'all_footer',
|
|
'name' => __('全站 - 页脚小工具', 'aksrt'),
|
|
'description' => __('显示在页脚内部的统一小工具区域。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'mobile_nav_fluid',
|
|
'name' => __('移动端 - 菜单底部', 'aksrt'),
|
|
'description' => __('显示在移动端抽屉菜单底部。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'home_top_fluid',
|
|
'name' => __('首页 - 顶部全宽', 'aksrt'),
|
|
'description' => __('显示在首页主内容上方的全宽区域。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'home_top_content',
|
|
'name' => __('首页 - 内容上方', 'aksrt'),
|
|
'description' => __('显示在首页主内容区顶部。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'home_bottom_content',
|
|
'name' => __('首页 - 内容下方', 'aksrt'),
|
|
'description' => __('显示在首页主内容区底部。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'home_bottom_fluid',
|
|
'name' => __('首页 - 底部全宽', 'aksrt'),
|
|
'description' => __('显示在首页页脚上方的全宽区域。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'home_sidebar',
|
|
'name' => __('首页 - 侧边栏', 'aksrt'),
|
|
'description' => __('显示在首页右侧栏。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
// 文章详情页侧栏
|
|
register_sidebar([
|
|
'id' => 'sidebar-article',
|
|
'name' => __('文章页 - 侧边栏', 'aksrt'),
|
|
'description' => __('显示在文章详情页右侧。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
// ===== 文章页 Widget 区域(模板zibll 多位置) =====
|
|
register_sidebar([
|
|
'id' => 'single_top_fluid',
|
|
'name' => __('文章页 - 顶部全宽', 'aksrt'),
|
|
'description' => __('文章页顶部全宽区域(在封面/面包屑之上)。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'single_top_content',
|
|
'name' => __('文章页 - 内容上方', 'aksrt'),
|
|
'description' => __('文章主体卡片上方(在内容列内)。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'single_bottom_content',
|
|
'name' => __('文章页 - 内容下方', 'aksrt'),
|
|
'description' => __('评论区下方(在内容列内)。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'single_bottom_fluid',
|
|
'name' => __('文章页 - 底部全宽', 'aksrt'),
|
|
'description' => __('文章页底部全宽区域(在页脚之上)。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
// ===== 分类页 Widget 区域 =====
|
|
register_sidebar([
|
|
'id' => 'cat_top_fluid',
|
|
'name' => __('分类页 - 顶部全宽', 'aksrt'),
|
|
'description' => __('分类归档页顶部全宽区域。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'cat_top_content',
|
|
'name' => __('分类页 - 内容上方', 'aksrt'),
|
|
'description' => __('分类归档页内容区上方。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'cat_bottom_content',
|
|
'name' => __('分类页 - 内容下方', 'aksrt'),
|
|
'description' => __('分类归档页内容区下方。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'cat_bottom_fluid',
|
|
'name' => __('分类页 - 底部全宽', 'aksrt'),
|
|
'description' => __('分类归档页底部全宽区域。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'cat_sidebar',
|
|
'name' => __('分类页 - 侧栏', 'aksrt'),
|
|
'description' => __('分类归档页侧栏区域。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
// ===== 标签页 Widget 区域 =====
|
|
register_sidebar([
|
|
'id' => 'tag_top_fluid',
|
|
'name' => __('标签页 - 顶部全宽', 'aksrt'),
|
|
'description' => __('标签归档页顶部全宽区域。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'tag_top_content',
|
|
'name' => __('标签页 - 内容上方', 'aksrt'),
|
|
'description' => __('标签归档页内容区上方。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'tag_bottom_content',
|
|
'name' => __('标签页 - 内容下方', 'aksrt'),
|
|
'description' => __('标签归档页内容区下方。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'tag_bottom_fluid',
|
|
'name' => __('标签页 - 底部全宽', 'aksrt'),
|
|
'description' => __('标签归档页底部全宽区域。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'tag_sidebar',
|
|
'name' => __('标签页 - 侧栏', 'aksrt'),
|
|
'description' => __('标签归档页侧栏区域。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
// ===== 搜索页 Widget 区域 =====
|
|
register_sidebar([
|
|
'id' => 'search_top_fluid',
|
|
'name' => __('搜索页 - 顶部全宽', 'aksrt'),
|
|
'description' => __('搜索结果页顶部全宽区域。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'search_top_content',
|
|
'name' => __('搜索页 - 内容上方', 'aksrt'),
|
|
'description' => __('搜索结果页内容区上方。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'search_bottom_content',
|
|
'name' => __('搜索页 - 内容下方', 'aksrt'),
|
|
'description' => __('搜索结果页内容区下方。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'search_bottom_fluid',
|
|
'name' => __('搜索页 - 底部全宽', 'aksrt'),
|
|
'description' => __('搜索结果页底部全宽区域。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'search_sidebar',
|
|
'name' => __('搜索页 - 侧栏', 'aksrt'),
|
|
'description' => __('搜索结果页侧栏区域。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'archive_bottom_fluid',
|
|
'name' => __('归档页 - 底部全宽', 'aksrt'),
|
|
'description' => __('分类/标签/归档页底部全宽区域。', 'aksrt'),
|
|
'before_widget' => $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
register_sidebar([
|
|
'id' => 'author-sidebar',
|
|
'name' => __('作者页 - 侧栏', 'aksrt'),
|
|
'description' => __('作者归档页侧栏区域。', 'aksrt'),
|
|
'before_widget' => $card_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
|
|
// ── Per-page dynamic sidebars (zibll zib_page_register_sidebar parity) ──
|
|
// Pages that opt in via meta `widgets_register=1` + `widgets_register_container`
|
|
// (a serialized list of area keys) get page_{key}_{ID} sidebars registered, and
|
|
// the matching `page_sidebar_{ID}` is treated as active when any of its areas
|
|
// hold widgets. page.php reads page_top_fluid_/page_top_content_/etc.
|
|
$this->register_page_sidebars();
|
|
}
|
|
|
|
/**
|
|
* Register dynamic per-page widget areas (aligns Zibll zib_page_register_sidebar).
|
|
*
|
|
* Zibll stores, per page, a `widgets_register` flag and a `widgets_register_container`
|
|
* serialized array of area keys (sidebar/top_fluid/top_content/bottom_content/bottom_fluid).
|
|
* We replicate that: for every page opted in, register page_{key}_{ID} sidebars.
|
|
*/
|
|
public function register_page_sidebars(): void {
|
|
global $wpdb;
|
|
// Cache the opt-in page list (postmeta-driven), mirroring zib_get_widgets_register_pages.
|
|
$pages = wp_cache_get('aksrt_widgets_register_pages', 'aksrt_cache_group', true);
|
|
if (false === $pages) {
|
|
// phpcs:ignore WordPress.DB.DirectDatabaseQuery
|
|
$rows = $wpdb->get_results(
|
|
"SELECT p.ID, p.post_title, pm.meta_value
|
|
FROM {$wpdb->posts} p
|
|
INNER JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID
|
|
WHERE p.post_type = 'page'
|
|
AND p.post_status = 'publish'
|
|
AND pm.meta_key = 'widgets_register_container'
|
|
AND pm.meta_value LIKE '%;}'"
|
|
);
|
|
$pages = is_array($rows) ? $rows : [];
|
|
wp_cache_set('aksrt_widgets_register_pages', $pages, 'aksrt_cache_group');
|
|
}
|
|
|
|
$area_labels = [
|
|
'sidebar' => __('侧边栏', 'aksrt'),
|
|
'top_fluid' => __('顶部全宽度', 'aksrt'),
|
|
'top_content' => __('主内容上面', 'aksrt'),
|
|
'bottom_content' => __('主内容下面', 'aksrt'),
|
|
'bottom_fluid' => __('底部全宽度', 'aksrt'),
|
|
];
|
|
|
|
$fluid_wrapper_before = '<div id="%1$s" class="zib-widget %2$s">';
|
|
$card_wrapper_before = '<div id="%1$s" class="zib-widget %2$s">';
|
|
$title_before = '<h3>';
|
|
$title_after = '</h3>';
|
|
|
|
foreach ($pages as $page) {
|
|
$meta_value = maybe_unserialize($page->meta_value);
|
|
if (!is_array($meta_value)) {
|
|
continue;
|
|
}
|
|
$name = function_exists('aksrt_str_cut') ? aksrt_str_cut($page->post_title, 0, 10, '...') : mb_substr((string) $page->post_title, 0, 10);
|
|
foreach ($meta_value as $key) {
|
|
if (!isset($area_labels[$key])) {
|
|
continue;
|
|
}
|
|
$id = 'page_' . $key . '_' . (int) $page->ID;
|
|
register_sidebar([
|
|
'name' => sprintf(__('[页面: %1$s] - %2$s', 'aksrt'), $name, $area_labels[$key]),
|
|
'id' => $id,
|
|
'description' => sprintf(__('显示在[页面:%1$s]的 %2$s 位置', 'aksrt'), $name, $area_labels[$key]),
|
|
'before_widget' => $key === 'sidebar' ? $card_wrapper_before : $fluid_wrapper_before,
|
|
'after_widget' => '</div>',
|
|
'before_title' => $title_before,
|
|
'after_title' => $title_after,
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
}
|