- 后台「支付&付费 → 售后策略」:售后功能开关、申请时效、超时效提示(HTML)、 预置原因、申请售后说明、所需材料、申请说明占位文案、可上传图片开关; PHP schema 与 SPA schema 1:1 对齐,group 字段支持拖拽排序 - PaymentRuntime 新增售后设置解析(缺键回退 schema 默认、HTML 走 kses、 中文原因稳定 slug)与 after_sale_expired 时效判定(支付时间起算) - 售后工单支持举证图片(order_aftersale.images 列,最多 3 张, 复用评论图片上传校验)与上传路由;订单视图模型输出 after_sale 按钮状态 - 前台申请 / 超时效提示 / 售后详细三个独立弹窗(modal-mini + 蓝色炫彩头), 订单详情弹窗不再内嵌售后表单并清理相关死代码 - 新增 after-sale-policy 契约测试与运行时 harness,527 项契约测试通过
726 lines
30 KiB
PHP
726 lines
30 KiB
PHP
<?php
|
||
/**
|
||
* @package AKSRT
|
||
*/
|
||
|
||
namespace AKSRT\Core;
|
||
|
||
defined('ABSPATH') || exit;
|
||
|
||
trait ScriptsPart1b {
|
||
|
||
public function enqueue_public(): void {
|
||
$base_uri = get_template_directory_uri();
|
||
$version = AKSRT_VERSION;
|
||
|
||
// Keep WordPress's managed jQuery so core and plugin UI scripts share one compatible API.
|
||
wp_enqueue_script('jquery');
|
||
$public_filename = file_exists(get_template_directory() . '/assets/css/build/public.min.css')
|
||
? 'public.min.css'
|
||
: 'public.css';
|
||
$public_bundle = get_template_directory() . '/assets/css/build/' . $public_filename;
|
||
wp_enqueue_style(
|
||
'bootstrap',
|
||
$base_uri . '/assets/css/bootstrap.min.css',
|
||
[],
|
||
'3.4.1'
|
||
);
|
||
aksrt_enqueue_fontawesome(['bootstrap']);
|
||
$main_css_path = get_template_directory() . '/assets/css/main.min.css';
|
||
wp_enqueue_style(
|
||
'aksrt-main',
|
||
$base_uri . '/assets/css/main.min.css',
|
||
['aksrt-font-awesome'],
|
||
file_exists($main_css_path) ? (string) filemtime($main_css_path) : $version
|
||
);
|
||
wp_enqueue_style(
|
||
'aksrt-public',
|
||
$base_uri . '/assets/css/build/' . $public_filename,
|
||
['aksrt-main'],
|
||
file_exists($public_bundle) ? (string) filemtime($public_bundle) : $version
|
||
);
|
||
|
||
$lazy_animation = class_exists('\AKSRT\Settings\Settings')
|
||
? (string) \AKSRT\Settings\Settings::get_value('lazy_animation', 'blur')
|
||
: 'blur';
|
||
if ($lazy_animation === 'fade') {
|
||
wp_add_inline_style('aksrt-public', '.lazyloaded{--lazy-animation:lazy_fade!important;}');
|
||
} elseif ($lazy_animation === 'scale') {
|
||
wp_add_inline_style('aksrt-public', '.lazyloaded{--lazy-animation:lazy_scale!important;}');
|
||
}
|
||
|
||
$core_dep = 'aksrt-public';
|
||
|
||
$deps = [$core_dep];
|
||
$enqueue_module = function ($slug) use ($base_uri, $version, $deps) {
|
||
$path = get_template_directory() . '/assets/css/frontend/' . $slug . '.css';
|
||
wp_enqueue_style(
|
||
'aksrt-' . $slug,
|
||
$base_uri . '/assets/css/frontend/' . $slug . '.css',
|
||
$deps,
|
||
(file_exists($path) ? (string) filemtime($path) : $version)
|
||
);
|
||
};
|
||
|
||
// 顶部导航用户卡片(legacy header-userbox 模块样式)。
|
||
$enqueue_module('header-userbox');
|
||
|
||
if (!is_user_logged_in() || (bool) get_query_var('aksrt_sign')) {
|
||
$auth_css = get_template_directory() . '/assets/css/routes/sign.css';
|
||
wp_enqueue_style(
|
||
'aksrt-auth',
|
||
$base_uri . '/assets/css/routes/sign.css',
|
||
[$core_dep],
|
||
file_exists($auth_css) ? (string) filemtime($auth_css) : $version
|
||
);
|
||
}
|
||
|
||
// Shared VIP purchase/poll coordinator for modal and credits surfaces.
|
||
$vip_on = class_exists('\AKSRT\Settings\Settings')
|
||
&& !empty(\AKSRT\Settings\Settings::get_payment_vip_settings()['enabled']);
|
||
$credits_on = is_user_logged_in()
|
||
&& class_exists('\AKSRT\Settings\Settings')
|
||
&& \AKSRT\Settings\Settings::credits_enabled();
|
||
$balance_on = is_user_logged_in()
|
||
&& !empty(\AKSRT\Settings\Settings::get_payment_recharge_settings()['enabled']);
|
||
$affiliate_on = is_user_logged_in()
|
||
&& class_exists('\\AKSRT\\Settings\\Settings')
|
||
&& !empty(\AKSRT\Settings\Settings::get_affiliate_settings()['enabled']);
|
||
$signin_on = is_user_logged_in()
|
||
&& class_exists('\AKSRT\Credits\Signin')
|
||
&& class_exists('\AKSRT\Settings\Settings')
|
||
&& !empty(\AKSRT\Settings\Settings::get_signin_reward_settings()['enabled']);
|
||
$vip_coordinator = get_template_directory() . '/assets/js/vip-purchase-coordinator.js';
|
||
if ((($vip_on && is_user_logged_in()) || $credits_on || $affiliate_on) && file_exists($vip_coordinator)) {
|
||
wp_enqueue_script(
|
||
'aksrt-vip-coordinator',
|
||
$base_uri . '/assets/js/vip-purchase-coordinator.js',
|
||
['loader_js'],
|
||
(string) filemtime($vip_coordinator),
|
||
true
|
||
);
|
||
}
|
||
|
||
// VIP modal (legacy .pay-vip)
|
||
if ($vip_on && is_user_logged_in()) {
|
||
$vip_css = get_template_directory() . '/assets/css/frontend/vip-modal.css';
|
||
if (file_exists($vip_css)) {
|
||
wp_enqueue_style(
|
||
'aksrt-vip-modal',
|
||
$base_uri . '/assets/css/frontend/vip-modal.css',
|
||
[$core_dep],
|
||
(string) filemtime($vip_css)
|
||
);
|
||
}
|
||
$vip_js = get_template_directory() . '/assets/js/pay-vip.js';
|
||
if (file_exists($vip_js)) {
|
||
wp_enqueue_script(
|
||
'aksrt-pay-vip',
|
||
$base_uri . '/assets/js/pay-vip.js',
|
||
['loader_js', 'aksrt-vip-coordinator'],
|
||
(string) filemtime($vip_js),
|
||
true
|
||
);
|
||
}
|
||
}
|
||
|
||
// 4b. 路由判定
|
||
$is_home_or_archive = is_home() || is_front_page() || is_archive() || is_search();
|
||
// 资源单页(post + _aksrt_is_resource)
|
||
$is_single_resource = (function_exists('aksrt_is_resource_post') && is_singular() && aksrt_is_resource_post(get_queried_object_id()));
|
||
// 普通博客 single(排除资源型 post)
|
||
$is_single_post = is_singular('post') && !$is_single_resource;
|
||
// 付费下载/付费墙:任意 singular 需收银台/下载脚本
|
||
$is_paid_content_single = false;
|
||
if (is_singular()) {
|
||
$qid = (int) get_queried_object_id();
|
||
if ($qid > 0) {
|
||
if (function_exists('aksrt_is_downloadable_content') && aksrt_is_downloadable_content($qid)) {
|
||
$is_paid_content_single = true;
|
||
} elseif (function_exists('aksrt_is_paid_post') && aksrt_is_paid_post($qid)) {
|
||
$is_paid_content_single = true;
|
||
} elseif (function_exists('aksrt_get_pay_meta')) {
|
||
$pm = aksrt_get_pay_meta($qid);
|
||
$pt = (string) ($pm['pay_type'] ?? 'no');
|
||
$is_paid_content_single = ($pt !== '' && $pt !== 'no');
|
||
}
|
||
}
|
||
}
|
||
// 独立下载页模板
|
||
$is_download_file_page = is_page_template('templates/pages/page-download-file.php');
|
||
// 资源虚拟列表 /resources/
|
||
$is_resource_archive = function_exists('aksrt_is_resource_archive') && aksrt_is_resource_archive();
|
||
// /user/{nicename}/ 自定义重写路由(class-aksrt-user.php 注册)
|
||
// 此路径下 is_page() / is_page_template() 均为 false,需手动识别以正确入队 CSS
|
||
$is_profile_route = (bool) get_query_var('aksrt_author_identifier');
|
||
$is_user_center_route = (bool) get_query_var('aksrt_user_center');
|
||
$is_static_page = is_page() || is_singular('page') || $is_profile_route || $is_user_center_route;
|
||
$is_auth_route = (bool) get_query_var('aksrt_sign');
|
||
$is_auth_page = $is_auth_route
|
||
|| (function_exists('aksrt_is_auth_page_request') && aksrt_is_auth_page_request());
|
||
$is_profile_page = $is_profile_route
|
||
|| (function_exists('aksrt_is_user_home_page') && aksrt_is_user_home_page())
|
||
|| (function_exists('aksrt_is_user_center_page') && aksrt_is_user_center_page())
|
||
|| is_page_template('templates/pages/page-profile.php')
|
||
|| is_page_template('templates/pages/page-user-home.php');
|
||
$is_fixed_homepage = function_exists('aksrt_is_fixed_homepage_request') && aksrt_is_fixed_homepage_request();
|
||
|
||
// CMS route detection.
|
||
$is_cms_mode = function_exists('aksrt_is_cms_mode') ? aksrt_is_cms_mode() : false;
|
||
$singular_assets = $this->resolve_singular_asset_requirements(
|
||
$is_single_post,
|
||
$is_single_resource,
|
||
$is_paid_content_single
|
||
);
|
||
|
||
// 打印样式(media=print):内容页常驻,无设置开关(参考主题未提供该配置)。
|
||
if ($is_single_post || $is_single_resource || $is_static_page) {
|
||
$print_path = get_template_directory() . '/assets/css/frontend/print.css';
|
||
wp_enqueue_style(
|
||
'aksrt-print',
|
||
$base_uri . '/assets/css/frontend/print.css',
|
||
[],
|
||
file_exists($print_path) ? (string) filemtime($print_path) : $version,
|
||
'print'
|
||
);
|
||
}
|
||
|
||
// 首页/归档/搜索:卡片 + 侧栏
|
||
if ($is_home_or_archive && !$is_fixed_homepage) {
|
||
$enqueue_module('post-card');
|
||
$enqueue_module('sidebar');
|
||
$enqueue_module('breadcrumb');
|
||
}
|
||
|
||
// Normal articles: one small core bundle plus content/settings-driven feature leaves.
|
||
if ($is_single_post && !empty($singular_assets['is_article'])) {
|
||
$single_filename = file_exists(get_template_directory() . '/assets/css/build/single.min.css')
|
||
? 'single.min.css'
|
||
: 'single.css';
|
||
$single_path = get_template_directory() . '/assets/css/build/' . $single_filename;
|
||
wp_enqueue_style(
|
||
'aksrt-single-core',
|
||
$base_uri . '/assets/css/build/' . $single_filename,
|
||
[$core_dep],
|
||
file_exists($single_path) ? (string) filemtime($single_path) : $version
|
||
);
|
||
|
||
$single_features = [
|
||
'has_code' => 'single-post/code-blocks',
|
||
'needs_navigation' => 'single-post/navigation',
|
||
'needs_cover' => 'single-post/cover',
|
||
'needs_related_toc' => 'single-post/related-toc',
|
||
'has_hidden_content' => 'single-post/hidden-content',
|
||
'needs_pay_box' => 'pay-box',
|
||
];
|
||
$single_feature_handles = [];
|
||
foreach ($single_features as $requirement => $part) {
|
||
if (empty($singular_assets[$requirement])) {
|
||
continue;
|
||
}
|
||
$path = get_template_directory() . '/assets/css/frontend/' . $part . '.css';
|
||
if (!file_exists($path)) {
|
||
continue;
|
||
}
|
||
$handle = 'aksrt-' . str_replace('/', '-', $part);
|
||
wp_enqueue_style(
|
||
$handle,
|
||
$base_uri . '/assets/css/frontend/' . $part . '.css',
|
||
['aksrt-single-core'],
|
||
(string) filemtime($path)
|
||
);
|
||
$single_feature_handles[] = $handle;
|
||
}
|
||
|
||
// Preserve the public aggregate handle without requesting its @import file.
|
||
wp_register_style(
|
||
'aksrt-single-post',
|
||
false,
|
||
array_merge(['aksrt-single-core'], $single_feature_handles),
|
||
$version
|
||
);
|
||
wp_enqueue_style('aksrt-single-post');
|
||
|
||
if (!empty($singular_assets['needs_post_card'])) {
|
||
$enqueue_module('post-card');
|
||
}
|
||
|
||
if (!empty($singular_assets['needs_sidebar'])) {
|
||
$enqueue_module('sidebar');
|
||
}
|
||
if (!empty($singular_assets['needs_breadcrumb'])) {
|
||
$enqueue_module('breadcrumb');
|
||
}
|
||
}
|
||
|
||
// 评论区样式(硬切换后全部自有):任何会渲染评论区的 singular
|
||
// (普通文章 / 资源型 post / 启用评论的页面)统一加载 build 聚合。
|
||
// 缺失时手机端 .mobile-fixed 抽屉规则不生效,表单会按文档流直接显示。
|
||
if (is_singular() && !empty($singular_assets['needs_comments'])) {
|
||
$comments_filename = file_exists(get_template_directory() . '/assets/css/build/comments.min.css')
|
||
? 'comments.min.css'
|
||
: 'comments.css';
|
||
$comments_path = get_template_directory() . '/assets/css/build/' . $comments_filename;
|
||
wp_enqueue_style(
|
||
'aksrt-comments',
|
||
$base_uri . '/assets/css/build/' . $comments_filename,
|
||
[$core_dep],
|
||
file_exists($comments_path) ? (string) filemtime($comments_path) : $version
|
||
);
|
||
}
|
||
|
||
// 静态页面 + 用户中心 + 友链等
|
||
if ($is_static_page) {
|
||
$enqueue_module('pages');
|
||
$enqueue_module('single-post'); // 复用 entry-content 排版
|
||
$enqueue_module('post-card'); // post-grid / post-card(用户中心文章列表)
|
||
$enqueue_module('breadcrumb');
|
||
// 评论区样式由上方 is_singular 统一入口按 needs_comments 加载。
|
||
}
|
||
|
||
// 举报脚本:举报入口渲染于文章页 meta 菜单、评论区与用户主页/个人中心,
|
||
// 因此 singular 页面与 profile 路由都需要加载(文章页举报按钮此前无脚本支撑)。
|
||
// 禁封脚本:禁封入口渲染于用户主页封面三点菜单、评论区三点菜单与文章
|
||
// 作者栏三点菜单,与举报脚本同一组页面,合并加载。
|
||
if (is_singular() || $is_profile_page) {
|
||
$report_js_path = get_template_directory() . '/assets/js/report.js';
|
||
if (file_exists($report_js_path)) {
|
||
wp_enqueue_script(
|
||
'aksrt-report',
|
||
$base_uri . '/assets/js/report.js',
|
||
['loader_js'],
|
||
filemtime($report_js_path) ?: $version,
|
||
true
|
||
);
|
||
}
|
||
$user_ban_js_path = get_template_directory() . '/assets/js/user-ban.js';
|
||
if (file_exists($user_ban_js_path)) {
|
||
wp_enqueue_script(
|
||
'aksrt-user-ban',
|
||
$base_uri . '/assets/js/user-ban.js',
|
||
['loader_js'],
|
||
filemtime($user_ban_js_path) ?: $version,
|
||
true
|
||
);
|
||
}
|
||
}
|
||
|
||
// 用户中心 / 公开主页:路由专属 CSS
|
||
if ($is_profile_page) {
|
||
// 关注脚本已在全局栈注册(ScriptsPart1c),data-aksrt-follow 按钮
|
||
// 也渲染于文章页作者栏与各处用户卡片,不能仅限本路由加载。
|
||
|
||
$author_js_path = get_template_directory() . '/assets/js/author.js';
|
||
if (file_exists($author_js_path)) {
|
||
wp_enqueue_script(
|
||
'aksrt-author',
|
||
$base_uri . '/assets/js/author.js',
|
||
['loader_js'],
|
||
(string) filemtime($author_js_path),
|
||
true
|
||
);
|
||
}
|
||
|
||
// Enqueue every profile leaf directly. Nested @imports are not versioned,
|
||
// so browsers can otherwise retain stale layout/modal rules after deploys.
|
||
$profile_parts = ['layout', 'lists'];
|
||
$profile_deps = [$core_dep];
|
||
foreach ($profile_parts as $part_index => $part) {
|
||
$part_path = get_template_directory() . '/assets/css/routes/profile/' . $part . '.css';
|
||
$is_last_part = $part_index === count($profile_parts) - 1;
|
||
$part_handle = $is_last_part ? 'aksrt-route-profile' : 'aksrt-route-profile-' . $part;
|
||
wp_enqueue_style(
|
||
$part_handle,
|
||
$base_uri . '/assets/css/routes/profile/' . $part . '.css',
|
||
$profile_deps,
|
||
file_exists($part_path) ? (string) filemtime($part_path) : $version
|
||
);
|
||
$profile_deps = [$part_handle];
|
||
}
|
||
|
||
// 本人中心 vs 公开主页拆分加载
|
||
$is_public_user_home = $is_profile_route
|
||
|| (function_exists('aksrt_is_user_home_page') && aksrt_is_user_home_page())
|
||
|| is_page_template('templates/pages/page-user-home.php');
|
||
if ($is_public_user_home) {
|
||
// /user/{nicename}/ 公开主页
|
||
$user_home_css_path = get_template_directory() . '/assets/css/routes/user-home.css';
|
||
wp_enqueue_style(
|
||
'aksrt-route-user-home',
|
||
$base_uri . '/assets/css/routes/user-home.css',
|
||
['aksrt-route-profile'],
|
||
file_exists($user_home_css_path) ? (string) filemtime($user_home_css_path) : $version
|
||
);
|
||
} else {
|
||
// Keep the legacy aggregate's cascade order, but give every leaf its
|
||
// own cache version. The final leaf retains the public aggregate handle.
|
||
$user_center_parts = [
|
||
'user-center/shell',
|
||
'user-center/credits',
|
||
'user-center/vip',
|
||
'user-center/level',
|
||
'user-center/settings',
|
||
'user-center/revenue',
|
||
'user-center/revenue-earnings',
|
||
'user-center/responsive',
|
||
];
|
||
$user_center_deps = ['aksrt-route-profile'];
|
||
foreach ($user_center_parts as $part_index => $part) {
|
||
$part_path = get_template_directory() . '/assets/css/routes/' . $part . '.css';
|
||
$is_last_part = $part_index === count($user_center_parts) - 1;
|
||
$part_handle = $is_last_part
|
||
? 'aksrt-route-user-center'
|
||
: 'aksrt-route-' . str_replace('/', '-', $part);
|
||
wp_enqueue_style(
|
||
$part_handle,
|
||
$base_uri . '/assets/css/routes/' . $part . '.css',
|
||
$user_center_deps,
|
||
file_exists($part_path) ? (string) filemtime($part_path) : $version
|
||
);
|
||
$user_center_deps = [$part_handle];
|
||
}
|
||
// Orders is a lazy user-center panel, so its independent assets must
|
||
// be ready before client-side panel replacement can insert its markup.
|
||
$has_orders_panel = false;
|
||
if (class_exists('\AKSRT\User\Center')) {
|
||
$dashboard_tabs = \AKSRT\User\Center::get_instance()->get_dashboard_tabs();
|
||
$has_orders_panel = isset($dashboard_tabs['orders']);
|
||
}
|
||
if ($has_orders_panel) {
|
||
$orders_css = get_template_directory() . '/assets/css/routes/orders.css';
|
||
if (file_exists($orders_css)) {
|
||
wp_enqueue_style(
|
||
'aksrt-orders',
|
||
$base_uri . '/assets/css/routes/orders.css',
|
||
[$core_dep],
|
||
(string) filemtime($orders_css)
|
||
);
|
||
}
|
||
|
||
$order_center_js = get_template_directory() . '/assets/js/order-center.js';
|
||
if (file_exists($order_center_js)) {
|
||
wp_enqueue_script(
|
||
'aksrt-order-center',
|
||
$base_uri . '/assets/js/order-center.js',
|
||
['loader_js'],
|
||
(string) filemtime($order_center_js),
|
||
true
|
||
);
|
||
}
|
||
|
||
// 售后弹窗(申请 / 超时效提示 / 售后详细):与订单中心同面板、同条件入队。
|
||
$order_after_sale_js = get_template_directory() . '/assets/js/order-after-sale.js';
|
||
if (file_exists($order_after_sale_js)) {
|
||
wp_enqueue_script(
|
||
'aksrt-order-after-sale',
|
||
$base_uri . '/assets/js/order-after-sale.js',
|
||
['loader_js'],
|
||
(string) filemtime($order_after_sale_js),
|
||
true
|
||
);
|
||
}
|
||
}
|
||
|
||
$identity_js = get_template_directory() . '/assets/js/routes/user-center-auth.js';
|
||
if (file_exists($identity_js)) {
|
||
wp_enqueue_script(
|
||
'aksrt-route-user-center-auth',
|
||
$base_uri . '/assets/js/routes/user-center-auth.js',
|
||
['loader_js'],
|
||
(string) filemtime($identity_js),
|
||
true
|
||
);
|
||
}
|
||
$user_center_deps = file_exists($identity_js)
|
||
? ['loader_js', 'aksrt-route-user-center-auth']
|
||
: ['loader_js'];
|
||
if ($has_orders_panel && wp_script_is('aksrt-order-center', 'registered')) {
|
||
$user_center_deps[] = 'aksrt-order-center';
|
||
}
|
||
wp_enqueue_script(
|
||
'aksrt-route-user-center',
|
||
$base_uri . '/assets/js/routes/user-center.js',
|
||
$user_center_deps,
|
||
file_exists(get_template_directory() . '/assets/js/routes/user-center.js')
|
||
? (string) filemtime(get_template_directory() . '/assets/js/routes/user-center.js')
|
||
: $version,
|
||
true
|
||
);
|
||
}
|
||
}
|
||
|
||
// 搜索结果页:路由专属 CSS(顶部卡片/胶囊搜索框/工具栏/空状态/关键词高亮)
|
||
if (is_search()) {
|
||
wp_enqueue_style(
|
||
'aksrt-route-search',
|
||
$base_uri . '/assets/css/routes/search.css',
|
||
['aksrt-public', 'aksrt-post-card'],
|
||
$version
|
||
);
|
||
}
|
||
|
||
// 分类汇总页:路由专属 CSS
|
||
if (is_page_template('templates/pages/page-categories.php')) {
|
||
wp_enqueue_style(
|
||
'aksrt-route-categories',
|
||
$base_uri . '/assets/css/routes/categories.css',
|
||
['aksrt-public'],
|
||
$version
|
||
);
|
||
}
|
||
|
||
// 友情链接页:路由专属 CSS
|
||
if (is_page_template('templates/pages/page-friends.php')) {
|
||
wp_enqueue_style(
|
||
'aksrt-route-friends',
|
||
$base_uri . '/assets/css/routes/friends.css',
|
||
['aksrt-public'],
|
||
file_exists(get_template_directory() . '/assets/css/routes/friends.css')
|
||
? (string) filemtime(get_template_directory() . '/assets/css/routes/friends.css')
|
||
: $version
|
||
);
|
||
}
|
||
|
||
// 网址导航页(legacy links.php)
|
||
// 文章导航页(legacy postsnavs.php)
|
||
if (is_page_template('templates/pages/page-posts-navs.php')) {
|
||
$page_navs_js = get_template_directory() . '/assets/js/page-navs.js';
|
||
if (file_exists($page_navs_js)) {
|
||
wp_enqueue_script(
|
||
'aksrt-page-navs',
|
||
$base_uri . '/assets/js/page-navs.js',
|
||
['loader_js'],
|
||
(string) filemtime($page_navs_js),
|
||
true
|
||
);
|
||
}
|
||
|
||
$pn_css = get_template_directory() . '/assets/css/routes/posts-navs.css';
|
||
if (file_exists($pn_css)) {
|
||
wp_enqueue_style(
|
||
'aksrt-route-posts-navs',
|
||
$base_uri . '/assets/css/routes/posts-navs.css',
|
||
['aksrt-public'],
|
||
(string) filemtime($pn_css)
|
||
);
|
||
}
|
||
$section_navs = get_template_directory() . '/assets/js/section-navs.js';
|
||
if (file_exists($section_navs)) {
|
||
wp_enqueue_script(
|
||
'aksrt-section-navs',
|
||
$base_uri . '/assets/js/section-navs.js',
|
||
['jquery'],
|
||
(string) filemtime($section_navs),
|
||
true
|
||
);
|
||
}
|
||
$pn_js = get_template_directory() . '/assets/js/posts-navs-page.js';
|
||
if (file_exists($pn_js)) {
|
||
wp_enqueue_script(
|
||
'aksrt-posts-navs-page',
|
||
$base_uri . '/assets/js/posts-navs-page.js',
|
||
['loader_js'],
|
||
(string) filemtime($pn_js),
|
||
true
|
||
);
|
||
}
|
||
}
|
||
|
||
// 文章归档页
|
||
if (is_page_template('templates/pages/page-archives.php')) {
|
||
$ar_css = get_template_directory() . '/assets/css/routes/archives.css';
|
||
if (file_exists($ar_css)) {
|
||
wp_enqueue_style(
|
||
'aksrt-route-archives',
|
||
$base_uri . '/assets/css/routes/archives.css',
|
||
['aksrt-public'],
|
||
(string) filemtime($ar_css)
|
||
);
|
||
}
|
||
}
|
||
|
||
// 消息中心页
|
||
if (get_query_var('aksrt_message_view')) {
|
||
$messages_css = get_template_directory() . '/assets/css/frontend/messages.css';
|
||
if (file_exists($messages_css)) {
|
||
wp_enqueue_style(
|
||
'aksrt-messages',
|
||
$base_uri . '/assets/css/frontend/messages.css',
|
||
['aksrt-public'],
|
||
(string) filemtime($messages_css)
|
||
);
|
||
}
|
||
$messages_js = get_template_directory() . '/assets/js/messages.js';
|
||
if (file_exists($messages_js)) {
|
||
wp_enqueue_script(
|
||
'aksrt-messages',
|
||
$base_uri . '/assets/js/messages.js',
|
||
['loader_js'],
|
||
(string) filemtime($messages_js),
|
||
true
|
||
);
|
||
}
|
||
}
|
||
|
||
// Unified authentication page shell.
|
||
if ($is_auth_page) {
|
||
$enqueue_module('pages');
|
||
}
|
||
|
||
|
||
// 404 页面
|
||
if (is_404()) {
|
||
$enqueue_module('pages');
|
||
}
|
||
|
||
// Resource archives use the canonical legacy article-card stylesheet.
|
||
if ($is_resource_archive || $is_single_resource || ($is_cms_mode && ($is_home_or_archive || $is_static_page) && !$is_fixed_homepage)) {
|
||
if (!$is_home_or_archive && !$is_single_post && !$is_static_page) {
|
||
$enqueue_module('post-card');
|
||
}
|
||
}
|
||
|
||
// 单篇资源专属样式
|
||
if ($is_single_resource) {
|
||
$enqueue_module('single-post');
|
||
// 资源单页同样渲染文章封面(needs_cover 对资源文章同样成立)。
|
||
// cover 样式必须以 filemtime 版本号的 leaf 直接入队:聚合文件的
|
||
// @import 无版本号,浏览器会拿旧缓存(含已废弃的 .single-cover
|
||
// padding 规则)把封面高度链挤成 0,导致封面空白。
|
||
if (!empty($singular_assets['needs_cover'])) {
|
||
$single_cover_path = get_template_directory() . '/assets/css/frontend/single-post/cover.css';
|
||
if (file_exists($single_cover_path)) {
|
||
wp_enqueue_style(
|
||
'aksrt-single-post-cover',
|
||
$base_uri . '/assets/css/frontend/single-post/cover.css',
|
||
$deps,
|
||
(string) filemtime($single_cover_path)
|
||
);
|
||
}
|
||
}
|
||
$resource_meta_path = get_template_directory() . '/assets/css/frontend/resource-meta/part.css';
|
||
wp_enqueue_style(
|
||
'aksrt-resource-meta',
|
||
$base_uri . '/assets/css/frontend/resource-meta/part.css',
|
||
$deps,
|
||
file_exists($resource_meta_path) ? (string) filemtime($resource_meta_path) : $version
|
||
);
|
||
// 评论区样式由统一入口按 needs_comments 加载。
|
||
}
|
||
|
||
// 资源归档专属样式
|
||
if ($is_resource_archive) {
|
||
$enqueue_module('resource-archive');
|
||
}
|
||
|
||
// 单篇资源 / 付费内容 / 独立下载页:下载 + 收银台脚本
|
||
if ($is_single_resource || $is_paid_content_single || $is_download_file_page) {
|
||
$cms_download_css_path = get_template_directory() . '/assets/css/frontend/cms-download.css';
|
||
wp_enqueue_style(
|
||
'aksrt-cms-download',
|
||
$base_uri . '/assets/css/frontend/cms-download.css',
|
||
[$core_dep],
|
||
file_exists($cms_download_css_path) ? (string) filemtime($cms_download_css_path) : $version
|
||
);
|
||
|
||
$cms_download_js_path = get_template_directory() . '/assets/js/cms-download.js';
|
||
wp_enqueue_script(
|
||
'aksrt-cms-download',
|
||
$base_uri . '/assets/js/cms-download.js',
|
||
['loader_js'],
|
||
file_exists($cms_download_js_path) ? (string) filemtime($cms_download_js_path) : $version,
|
||
true
|
||
);
|
||
}
|
||
|
||
if ($is_fixed_homepage) {
|
||
$homepage_filename = file_exists(get_template_directory() . '/assets/css/build/homepage.min.css')
|
||
? 'homepage.min.css'
|
||
: 'homepage.css';
|
||
$homepage_bundle = get_template_directory() . '/assets/css/build/' . $homepage_filename;
|
||
wp_enqueue_style(
|
||
'aksrt-homepage-fixed',
|
||
$base_uri . '/assets/css/build/' . $homepage_filename,
|
||
['aksrt-public'],
|
||
file_exists($homepage_bundle) ? (string) filemtime($homepage_bundle) : $version
|
||
);
|
||
}
|
||
|
||
// 积分相关:已登录 + 启用积分功能时全站加载
|
||
if ($credits_on || $balance_on || $affiliate_on) {
|
||
$enqueue_module('credits');
|
||
|
||
// profile 页:加载 credits.js(签到 + 邀请 + 提现交互)
|
||
if ($is_profile_page) {
|
||
$affiliate_deps = [];
|
||
if ($affiliate_on) {
|
||
// 推广二维码生成库(本地打包,无外部 CDN)。
|
||
$qrcode_js_path = get_template_directory() . '/assets/js/vendor/qrcode.min.js';
|
||
wp_enqueue_script(
|
||
'aksrt-qrcode',
|
||
$base_uri . '/assets/js/vendor/qrcode.min.js',
|
||
[],
|
||
file_exists($qrcode_js_path) ? (string) filemtime($qrcode_js_path) : $version,
|
||
true
|
||
);
|
||
$affiliate_deps[] = 'aksrt-qrcode';
|
||
}
|
||
$credits_js_path = get_template_directory() . '/assets/js/credits.js';
|
||
wp_enqueue_script(
|
||
'aksrt-credits',
|
||
$base_uri . '/assets/js/credits.js',
|
||
array_merge(['loader_js', 'aksrt-vip-coordinator'], $affiliate_deps),
|
||
file_exists($credits_js_path) ? (string) filemtime($credits_js_path) : $version,
|
||
true
|
||
);
|
||
|
||
}
|
||
}
|
||
|
||
if ($signin_on) {
|
||
$signin_js_path = get_template_directory() . '/assets/js/signin.js';
|
||
wp_enqueue_script(
|
||
'aksrt-signin',
|
||
$base_uri . '/assets/js/signin.js',
|
||
['loader_js'],
|
||
file_exists($signin_js_path) ? (string) filemtime($signin_js_path) : $version,
|
||
true
|
||
);
|
||
}
|
||
|
||
// Badges UI: user center + public profile (legacy medal modal/list).
|
||
if (class_exists('\AKSRT\User\Badges') && \AKSRT\User\Badges::enabled()) {
|
||
$is_badge_surface = $is_profile_page
|
||
|| is_author()
|
||
|| (function_exists('aksrt_is_user_home_page') && aksrt_is_user_home_page())
|
||
|| (function_exists('aksrt_is_user_center_page') && aksrt_is_user_center_page());
|
||
if ($is_badge_surface) {
|
||
$enqueue_module('medal');
|
||
$badge_actions_path = get_template_directory() . '/assets/js/user-badge-actions.js';
|
||
if (file_exists($badge_actions_path)) {
|
||
wp_enqueue_script(
|
||
'aksrt-user-badge-actions',
|
||
$base_uri . '/assets/js/user-badge-actions.js',
|
||
['loader_js'],
|
||
(string) filemtime($badge_actions_path),
|
||
true
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
$this->enqueue_public_fonts_js_and_data(
|
||
$base_uri,
|
||
$core_dep,
|
||
$deps,
|
||
$is_fixed_homepage,
|
||
$is_home_or_archive,
|
||
$is_single_post,
|
||
$is_single_resource,
|
||
$version,
|
||
$singular_assets
|
||
);
|
||
}
|
||
|
||
}
|