Files
wordpress-theme-aksrt/src/Core/ScriptsPart1b.php
T
kate522 cb76b95b01 feat(vip): skeleton loading state and faster modal/site startup
The VIP purchase/renew modal opened with a single "loading..." line, which
reads as a hang while /pay/vip/modal round-trips. Every frontend pageview
also paid an option write inside wp_head, and the header user-card CSS was
enqueued even for guests who never see the card.

pay-vip.js now builds a full-layout skeleton (user box, level tabs, the
two-column package panel) from vipSkeleton(), reusing the global
aksrt-modal-runtime__skeleton line/block classes; the VIP-specific shapes
live in the conditionally loaded vip-modal.css, and the 640px two-column
threshold matches .pay-vip-form-row. The modal cache TTL goes 15s -> 60s
(purchase, card-pass redeem and points exchange already invalidate the
vip tag), and hover/focus on a .pay-vip trigger now prefetches the payload
through the same cacheKey and flight openRemote uses, so a warm click
opens instantly.

The bottom note and the whole help_text pipeline behind it are removed; the
admin-editable pay_user_vip_desc still renders at the top of the modal, and
the recharge/gateway help_text keys are untouched. get_catalog() reads
points and wallet balance through one new LedgerService::points_and_balance()
call. The StatsTracker counter write moves to shutdown so wp_head only does
the visitor check and setcookie, and header-userbox.css is enqueued for
logged-in users only.

Verification: node --test across the suite (628 tests, including the 7 new
contract assertions in tests/widget-system/vip-modal-skeleton.test.cjs) and
php -l on every changed PHP file. No visual acceptance performed, per request.
2026-10-18 13:44:01 +08:00

729 lines
31 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
/**
* @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 模块样式)。
// 仅登录用户渲染用户卡(aksrt-header-userbox.php 的渲染条件),访客页面不加载。
if (is_user_logged_in()) {
$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
);
}
}