Merge pull request 'feat(shell): header multifunc + window._win + float cart/VIP' (#216) from worktree-header-runtime-float-1to1 into main
Reviewed-on: CYL/wordpress-theme-aksrt#216
This commit is contained in:
commit
3a883bc3d0
9 files changed
+568
-15
No files matched your search
@@ -0,0 +1,114 @@
|
|||||||
|
/**
|
||||||
|
* Header multi-function publish cluster + VIP CTA.
|
||||||
|
*
|
||||||
|
* @package AKSRT
|
||||||
|
*/
|
||||||
|
|
||||||
|
.navbar-but-cluster {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-but-cluster .navbar-but,
|
||||||
|
.navbar-but-cluster .navbar-vip {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-but-cluster .btn-primary,
|
||||||
|
.navbar-but-cluster .but.btn-primary,
|
||||||
|
.navbar-but-cluster .navbar-newposts.but,
|
||||||
|
.navbar-but-cluster a.but {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
padding: 6px 14px;
|
||||||
|
border-radius: 20px;
|
||||||
|
background: var(--color-primary, #2f6df6);
|
||||||
|
color: #fff;
|
||||||
|
text-decoration: none;
|
||||||
|
border: 0;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 1.4;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-but-cluster .payvip-icon.but {
|
||||||
|
background: linear-gradient(90deg, #ff6b6b, #f04494);
|
||||||
|
color: #fff;
|
||||||
|
padding: 6px 12px;
|
||||||
|
border-radius: 20px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.newadd-btns.hover-show {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.newadd-btns .drop-newadd,
|
||||||
|
.newadd-btns .hover-show-con {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
top: calc(100% + 6px);
|
||||||
|
right: 0;
|
||||||
|
min-width: 140px;
|
||||||
|
background: var(--main-bg-color, #fff);
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
|
||||||
|
padding: 6px 0;
|
||||||
|
z-index: 50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.newadd-btns.hover-show:hover .drop-newadd,
|
||||||
|
.newadd-btns.hover-show:hover .hover-show-con,
|
||||||
|
.newadd-btns.hover-show:focus-within .drop-newadd {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.newadd-btns__item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 8px 14px;
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.newadd-btns__item:hover {
|
||||||
|
background: var(--surface-2, rgba(0, 0, 0, 0.04));
|
||||||
|
color: var(--focus-color, var(--color-primary));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* float commerce */
|
||||||
|
.float-btn-shop-cart {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.float-btn-shop-cart badge,
|
||||||
|
.float-btn-shop-cart [cart-count] {
|
||||||
|
position: absolute;
|
||||||
|
top: -4px;
|
||||||
|
right: -4px;
|
||||||
|
min-width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
padding: 0 4px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background: #e74c3c;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 11px;
|
||||||
|
line-height: 16px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.float-btn-shop-cart badge:empty,
|
||||||
|
.float-btn-shop-cart [cart-count=""] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.float-btn.pay-vip {
|
||||||
|
color: #f5a623;
|
||||||
|
}
|
||||||
@@ -112,6 +112,16 @@
|
|||||||
var MAX_ZOOM_DESKTOP = 2;
|
var MAX_ZOOM_DESKTOP = 2;
|
||||||
var MAX_ZOOM_MOBILE = 3;
|
var MAX_ZOOM_MOBILE = 3;
|
||||||
|
|
||||||
|
function lightboxFlag(key, fallback) {
|
||||||
|
var w = window._win || (window.aksrtData && window.aksrtData.imgbox) || {};
|
||||||
|
if (w[key] === undefined || w[key] === null || w[key] === '') return fallback;
|
||||||
|
return w[key] === true || w[key] === 1 || w[key] === '1';
|
||||||
|
}
|
||||||
|
function lightboxEnabled() {
|
||||||
|
return lightboxFlag('imgbox', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function resolveFullUrl(img) {
|
function resolveFullUrl(img) {
|
||||||
var full = img.getAttribute('data-full-url') || img.getAttribute('data-src') || '';
|
var full = img.getAttribute('data-full-url') || img.getAttribute('data-src') || '';
|
||||||
if (full) return full;
|
if (full) return full;
|
||||||
@@ -134,6 +144,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function createLightbox() {
|
function createLightbox() {
|
||||||
|
if (!lightboxEnabled()) return;
|
||||||
if (lightboxEl) return;
|
if (lightboxEl) return;
|
||||||
|
|
||||||
lightboxEl = document.createElement('div');
|
lightboxEl = document.createElement('div');
|
||||||
@@ -161,6 +172,18 @@
|
|||||||
lightboxCounter = lightboxEl.querySelector('.aksrt-lightbox__counter');
|
lightboxCounter = lightboxEl.querySelector('.aksrt-lightbox__counter');
|
||||||
lightboxThumbsWrap = lightboxEl.querySelector('.aksrt-lightbox__thumbs');
|
lightboxThumbsWrap = lightboxEl.querySelector('.aksrt-lightbox__thumbs');
|
||||||
|
|
||||||
|
// Apply window._win imgbox feature flags
|
||||||
|
var zoomBtn = lightboxEl.querySelector('.toggle-zoom');
|
||||||
|
var thumbsBtn = lightboxEl.querySelector('.toggle-thumbs');
|
||||||
|
var playBtn = lightboxEl.querySelector('.toggle-play');
|
||||||
|
var fullBtn = lightboxEl.querySelector('.toggle-full');
|
||||||
|
var downBtn = lightboxEl.querySelector('.aksrt-lightbox__download');
|
||||||
|
if (zoomBtn) zoomBtn.hidden = !lightboxFlag('imgbox_zoom', true);
|
||||||
|
if (thumbsBtn) thumbsBtn.hidden = !lightboxFlag('imgbox_thumbs', true);
|
||||||
|
if (playBtn) playBtn.hidden = !lightboxFlag('imgbox_play', false);
|
||||||
|
if (fullBtn) fullBtn.hidden = !lightboxFlag('imgbox_full', true);
|
||||||
|
if (downBtn) downBtn.hidden = !lightboxFlag('imgbox_down', false);
|
||||||
|
|
||||||
// Close
|
// Close
|
||||||
lightboxEl.querySelector('.aksrt-lightbox__close').addEventListener('click', function (e) { e.stopPropagation(); closeLightbox(); });
|
lightboxEl.querySelector('.aksrt-lightbox__close').addEventListener('click', function (e) { e.stopPropagation(); closeLightbox(); });
|
||||||
lightboxEl.addEventListener('click', function (e) { if (e.target === lightboxEl || e.target.classList.contains('aksrt-lightbox__stage')) closeLightbox(); });
|
lightboxEl.addEventListener('click', function (e) { if (e.target === lightboxEl || e.target.classList.contains('aksrt-lightbox__stage')) closeLightbox(); });
|
||||||
@@ -435,7 +458,7 @@
|
|||||||
var img = e.target.closest(TRIGGER_SEL);
|
var img = e.target.closest(TRIGGER_SEL);
|
||||||
if (!img) return;
|
if (!img) return;
|
||||||
if (img.width < 100 || img.height < 100) return;
|
if (img.width < 100 || img.height < 100) return;
|
||||||
if (isNoLightbox(img)) return;
|
if (!lightboxEnabled() || isNoLightbox(img)) return;
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
|
|||||||
+23
-1
@@ -396,6 +396,18 @@ if ($floating_enabled) :
|
|||||||
<i class="fas fa-sun float-btn__icon-sun" aria-hidden="true"></i>
|
<i class="fas fa-sun float-btn__icon-sun" aria-hidden="true"></i>
|
||||||
<i class="fas fa-moon float-btn__icon-moon" aria-hidden="true"></i>
|
<i class="fas fa-moon float-btn__icon-moon" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
|
<?php elseif ($item_type === 'shop_cart') :
|
||||||
|
$cart_html = function_exists('aksrt_get_float_shop_cart_html') ? aksrt_get_float_shop_cart_html($item) : '';
|
||||||
|
if ($cart_html !== '') {
|
||||||
|
echo $cart_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<?php elseif ($item_type === 'pay_vip') :
|
||||||
|
$vip_html = function_exists('aksrt_get_float_pay_vip_html') ? aksrt_get_float_pay_vip_html($item) : '';
|
||||||
|
if ($vip_html !== '') {
|
||||||
|
echo $vip_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||||
|
}
|
||||||
|
?>
|
||||||
<?php elseif ($item_type === 'service_wechat') :
|
<?php elseif ($item_type === 'service_wechat') :
|
||||||
$item_class .= ' service-wechat';
|
$item_class .= ' service-wechat';
|
||||||
$wechat_img = $item['wechat_img'] ?? ($item['qrcode_img'] ?? '');
|
$wechat_img = $item['wechat_img'] ?? ($item['qrcode_img'] ?? '');
|
||||||
@@ -471,7 +483,17 @@ if ($floating_enabled) :
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</a>
|
</a>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<?php endforeach; ?>
|
<?php
|
||||||
|
// Commerce floats when admin list omits them.
|
||||||
|
$float_types = array_column($floating_items, 'type');
|
||||||
|
if (!in_array('shop_cart', $float_types, true) && function_exists('aksrt_get_float_shop_cart_html')) {
|
||||||
|
echo aksrt_get_float_shop_cart_html(['icon' => 'fas fa-shopping-cart']); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||||
|
}
|
||||||
|
if (!in_array('pay_vip', $float_types, true) && function_exists('aksrt_get_float_pay_vip_html')) {
|
||||||
|
echo aksrt_get_float_pay_vip_html(['icon' => 'fa fa-diamond']); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<?php endforeach; ?>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
|
|||||||
+19
-13
@@ -261,20 +261,26 @@ if (!empty($aksrt_bg_styles)) {
|
|||||||
</form>
|
</form>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<div class="nav-actions__cta">
|
<div class="nav-actions__cta navbar-but-cluster">
|
||||||
<?php if ($aksrt_can_publish) : ?>
|
<?php
|
||||||
<a class="btn-primary" href="<?php echo esc_url($aksrt_publish_url); ?>">
|
if (function_exists('aksrt_render_header_menu_buttons')) {
|
||||||
<i class="fas fa-pen-nib" aria-hidden="true"></i>
|
echo aksrt_render_header_menu_buttons(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||||
<span><?php esc_html_e('发布', 'aksrt'); ?></span>
|
} elseif (!empty($aksrt_can_publish)) {
|
||||||
</a>
|
?>
|
||||||
<?php endif; ?>
|
<a class="btn-primary" href="<?php echo esc_url($aksrt_publish_url); ?>">
|
||||||
|
<i class="fas fa-pen-nib" aria-hidden="true"></i>
|
||||||
|
<span><?php esc_html_e('发布', 'aksrt'); ?></span>
|
||||||
|
</a>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
<?php if (in_array('pc_nav', $aksrt_theme_toggle_positions, true)) : ?>
|
<?php if (in_array('pc_nav', $aksrt_theme_toggle_positions, true)) : ?>
|
||||||
<button type="button" class="btn-outline theme-toggle-desktop" id="theme-toggle-desktop" title="<?php esc_attr_e('切换亮暗色', 'aksrt'); ?>">
|
<button type="button" class="btn-outline theme-toggle-desktop" id="theme-toggle-desktop" title="<?php esc_attr_e('切换亮暗色', 'aksrt'); ?>">
|
||||||
<i class="fas fa-adjust" aria-hidden="true"></i>
|
<i class="fas fa-adjust" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php if ($aksrt_show_user_entry) : ?>
|
<?php if ($aksrt_show_user_entry) : ?>
|
||||||
<?php if (is_user_logged_in()) : ?>
|
<?php if (is_user_logged_in()) : ?>
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ require_once AKSRT_DIR . '/inc/helpers/aksrt-null.php';
|
|||||||
require_once AKSRT_DIR . '/inc/helpers/aksrt-ajax-list.php';
|
require_once AKSRT_DIR . '/inc/helpers/aksrt-ajax-list.php';
|
||||||
require_once AKSRT_DIR . '/inc/helpers/aksrt-links.php';
|
require_once AKSRT_DIR . '/inc/helpers/aksrt-links.php';
|
||||||
require_once AKSRT_DIR . '/inc/helpers/aksrt-header-userbox.php';
|
require_once AKSRT_DIR . '/inc/helpers/aksrt-header-userbox.php';
|
||||||
|
require_once AKSRT_DIR . '/inc/helpers/aksrt-header-menu-buttons.php';
|
||||||
|
require_once AKSRT_DIR . '/inc/helpers/aksrt-runtime-win.php';
|
||||||
require_once AKSRT_DIR . '/inc/helpers/aksrt-identity.php';
|
require_once AKSRT_DIR . '/inc/helpers/aksrt-identity.php';
|
||||||
require_once AKSRT_DIR . '/inc/helpers/aksrt-rewards.php';
|
require_once AKSRT_DIR . '/inc/helpers/aksrt-rewards.php';
|
||||||
require_once AKSRT_DIR . '/inc/helpers/menu-decoration.php';
|
require_once AKSRT_DIR . '/inc/helpers/menu-decoration.php';
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
<?php
|
<?php
|
||||||
defined('ABSPATH') || exit;
|
defined('ABSPATH') || exit;
|
||||||
|
|
||||||
|
// window._win runtime bridge (zibll zib_win_var)
|
||||||
|
add_action('wp_head', static function () {
|
||||||
|
if (function_exists('aksrt_print_win_var')) {
|
||||||
|
aksrt_print_win_var();
|
||||||
|
}
|
||||||
|
}, 1);
|
||||||
|
|
||||||
// 前端隐藏 WordPress Admin Bar
|
// 前端隐藏 WordPress Admin Bar
|
||||||
// ============================================================
|
// ============================================================
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,188 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Header multi-function cluster (zibll zib_menu_button publish/VIP subset).
|
||||||
|
*
|
||||||
|
* @package AKSRT
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined('ABSPATH') || exit;
|
||||||
|
|
||||||
|
if (!function_exists('aksrt_get_header_newposts_config')) :
|
||||||
|
/**
|
||||||
|
* @return array{enabled:bool,text:string,radius:int,class:string,types:string[]}
|
||||||
|
*/
|
||||||
|
function aksrt_get_header_newposts_config(): array {
|
||||||
|
$cfg = class_exists('\AKSRT\Settings\Settings')
|
||||||
|
? \AKSRT\Settings\Settings::get_header_newposts_config()
|
||||||
|
: ['enabled' => true, 'text' => __('发布', 'aksrt'), 'radius' => 20, 'class' => ''];
|
||||||
|
$all = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_all() : [];
|
||||||
|
// Prefer publish_btn from header nav when newposts not explicitly set.
|
||||||
|
$nav = class_exists('\AKSRT\Settings\Settings')
|
||||||
|
? \AKSRT\Settings\Settings::get_header_nav_settings()
|
||||||
|
: ['publish_btn' => true];
|
||||||
|
if (empty($cfg['enabled']) && !empty($nav['publish_btn'])) {
|
||||||
|
$cfg['enabled'] = true;
|
||||||
|
}
|
||||||
|
$types = [];
|
||||||
|
if (!empty($all['header_newposts_types']) && is_array($all['header_newposts_types'])) {
|
||||||
|
$types = array_values(array_filter(array_map('sanitize_key', $all['header_newposts_types'])));
|
||||||
|
}
|
||||||
|
if (!$types) {
|
||||||
|
$types = ['post'];
|
||||||
|
if (class_exists('\AKSRT\Settings\Settings')) {
|
||||||
|
$forum = \AKSRT\Settings\Settings::get_forum_settings();
|
||||||
|
$shop = \AKSRT\Settings\Settings::get_shop_settings();
|
||||||
|
if (!empty($forum['enabled'])) {
|
||||||
|
$types[] = 'topic';
|
||||||
|
}
|
||||||
|
if (!empty($shop['enabled'])) {
|
||||||
|
$types[] = 'product';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$cfg['types'] = $types;
|
||||||
|
return $cfg;
|
||||||
|
}
|
||||||
|
endif;
|
||||||
|
|
||||||
|
if (!function_exists('aksrt_get_new_add_actions')) :
|
||||||
|
/**
|
||||||
|
* Build multi-type publish actions.
|
||||||
|
*
|
||||||
|
* @param string[] $types post|topic|product
|
||||||
|
* @return list<array{type:string,url:string,label:string,icon:string}>
|
||||||
|
*/
|
||||||
|
function aksrt_get_new_add_actions(array $types = ['post']): array {
|
||||||
|
$out = [];
|
||||||
|
foreach ($types as $type) {
|
||||||
|
$type = sanitize_key((string) $type);
|
||||||
|
if ($type === 'post') {
|
||||||
|
$url = function_exists('aksrt_get_new_post_url') ? aksrt_get_new_post_url() : admin_url('post-new.php');
|
||||||
|
if ($url === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$out[] = [
|
||||||
|
'type' => 'post',
|
||||||
|
'url' => $url,
|
||||||
|
'label' => __('写文章', 'aksrt'),
|
||||||
|
'icon' => 'fa fa-file-text-o',
|
||||||
|
];
|
||||||
|
} elseif ($type === 'topic') {
|
||||||
|
$url = function_exists('aksrt_get_forum_compose_url') ? aksrt_get_forum_compose_url() : '';
|
||||||
|
if ($url === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$out[] = [
|
||||||
|
'type' => 'topic',
|
||||||
|
'url' => $url,
|
||||||
|
'label' => __('发帖', 'aksrt'),
|
||||||
|
'icon' => 'fa fa-comments-o',
|
||||||
|
];
|
||||||
|
} elseif ($type === 'product') {
|
||||||
|
// Prefer front product edit page when registered.
|
||||||
|
$url = '';
|
||||||
|
if (function_exists('aksrt_get_product_edit_url')) {
|
||||||
|
$url = (string) aksrt_get_product_edit_url();
|
||||||
|
}
|
||||||
|
if ($url === '') {
|
||||||
|
// Fallback: product-edit page template lookup is optional.
|
||||||
|
$url = home_url('/?page_id=0');
|
||||||
|
// Use admin product CPT if available.
|
||||||
|
$url = admin_url('post-new.php?post_type=aksrt_product');
|
||||||
|
}
|
||||||
|
$out[] = [
|
||||||
|
'type' => 'product',
|
||||||
|
'url' => $url,
|
||||||
|
'label' => __('发布商品', 'aksrt'),
|
||||||
|
'icon' => 'fa fa-shopping-bag',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
endif;
|
||||||
|
|
||||||
|
if (!function_exists('aksrt_render_new_add_btns')) :
|
||||||
|
/**
|
||||||
|
* Multi-type publish button (zibll newadd-btns).
|
||||||
|
*
|
||||||
|
* @param string[] $types
|
||||||
|
*/
|
||||||
|
function aksrt_render_new_add_btns(array $types, string $class = '', string $label = ''): string {
|
||||||
|
$actions = aksrt_get_new_add_actions($types);
|
||||||
|
if (!$actions) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if ($label === '') {
|
||||||
|
$label = __('发布', 'aksrt');
|
||||||
|
}
|
||||||
|
$class = trim('newadd-btns ' . $class);
|
||||||
|
|
||||||
|
if (count($actions) === 1) {
|
||||||
|
$a = $actions[0];
|
||||||
|
return '<a rel="nofollow" class="' . esc_attr(trim($class . ' but')) . '" href="' . esc_url($a['url']) . '">'
|
||||||
|
. '<i class="' . esc_attr($a['icon']) . '" aria-hidden="true"></i> '
|
||||||
|
. wp_kses_post($label)
|
||||||
|
. '</a>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$html = '<span class="' . esc_attr($class) . ' hover-show">';
|
||||||
|
$html .= '<a href="javascript:;" class="but newadd-btns__toggle" rel="nofollow">' . wp_kses_post($label) . ' <i class="fa fa-caret-down" aria-hidden="true"></i></a>';
|
||||||
|
$html .= '<div class="hover-show-con dropdown-menu drop-newadd">';
|
||||||
|
foreach ($actions as $a) {
|
||||||
|
$html .= '<a rel="nofollow" class="newadd-btns__item" href="' . esc_url($a['url']) . '">';
|
||||||
|
$html .= '<i class="' . esc_attr($a['icon']) . '" aria-hidden="true"></i> ' . esc_html($a['label']);
|
||||||
|
$html .= '</a>';
|
||||||
|
}
|
||||||
|
$html .= '</div></span>';
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
endif;
|
||||||
|
|
||||||
|
if (!function_exists('aksrt_render_header_menu_buttons')) :
|
||||||
|
/**
|
||||||
|
* Publish + optional VIP open button for header CTA.
|
||||||
|
*/
|
||||||
|
function aksrt_render_header_menu_buttons(): string {
|
||||||
|
$cfg = aksrt_get_header_newposts_config();
|
||||||
|
$html = '';
|
||||||
|
if (!empty($cfg['enabled'])) {
|
||||||
|
$class = 'btn-primary navbar-newposts';
|
||||||
|
if (!empty($cfg['class'])) {
|
||||||
|
$class .= ' ' . $cfg['class'];
|
||||||
|
}
|
||||||
|
$radius = (int) ($cfg['radius'] ?? 20);
|
||||||
|
$style = $radius > 0 ? ' style="border-radius:' . $radius . 'px"' : '';
|
||||||
|
$label = (string) ($cfg['text'] ?? __('发布', 'aksrt'));
|
||||||
|
// Strip outer <i> if present in settings HTML text — keep simple.
|
||||||
|
$btn = aksrt_render_new_add_btns($cfg['types'] ?? ['post'], $class, $label);
|
||||||
|
if ($btn !== '') {
|
||||||
|
$html .= '<div class="navbar-form navbar-right navbar-but"' . $style . '>' . $btn . '</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// VIP open CTA for guests / non-VIP.
|
||||||
|
$user_id = get_current_user_id();
|
||||||
|
$vip_url = function_exists('aksrt_get_vip_purchase_url') ? aksrt_get_vip_purchase_url() : (function_exists('aksrt_get_user_center_url') ? aksrt_get_user_center_url('vip') : '#');
|
||||||
|
$show_vip = true;
|
||||||
|
if (class_exists('\AKSRT\Settings\Settings') && method_exists('\AKSRT\Settings\Settings', 'get_vip_settings')) {
|
||||||
|
$vs = \AKSRT\Settings\Settings::get_vip_settings();
|
||||||
|
$show_vip = !empty($vs['enabled']) || !empty($vs['vip1_enabled']) || !empty($vs['vip2_enabled']);
|
||||||
|
}
|
||||||
|
if ($show_vip) {
|
||||||
|
$is_vip = false;
|
||||||
|
if ($user_id > 0 && function_exists('aksrt_get_user_vip_level')) {
|
||||||
|
$is_vip = (int) aksrt_get_user_vip_level($user_id) > 0;
|
||||||
|
}
|
||||||
|
if (!$is_vip) {
|
||||||
|
$cls = $user_id ? 'pay-vip' : 'signin-loader';
|
||||||
|
$html .= '<div class="navbar-form navbar-right navbar-vip hover-show inline-block">';
|
||||||
|
$html .= '<a class="but jb-red radius payvip-icon ml10 ' . esc_attr($cls) . '" href="' . ($user_id ? esc_url($vip_url) : 'javascript:;') . '">';
|
||||||
|
$html .= '<i class="fa fa-diamond em12 mr3" aria-hidden="true"></i>' . esc_html__('开通会员', 'aksrt');
|
||||||
|
$html .= '</a></div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
endif;
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Float button commerce types + runtime window._win bridge (zibll parity).
|
||||||
|
*
|
||||||
|
* @package AKSRT
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined('ABSPATH') || exit;
|
||||||
|
|
||||||
|
if (!function_exists('aksrt_get_float_shop_cart_html')) :
|
||||||
|
/**
|
||||||
|
* Floating shop cart button with badge.
|
||||||
|
*/
|
||||||
|
function aksrt_get_float_shop_cart_html(array $item = []): string {
|
||||||
|
if (!is_user_logged_in()) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$shop_on = true;
|
||||||
|
if (class_exists('\AKSRT\Settings\Settings')) {
|
||||||
|
$shop = \AKSRT\Settings\Settings::get_shop_settings();
|
||||||
|
$shop_on = !empty($shop['enabled']);
|
||||||
|
}
|
||||||
|
if (!$shop_on) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
// Skip on cart page.
|
||||||
|
if (function_exists('is_page_template') && is_page_template('templates/pages/page-cart.php')) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$url = function_exists('aksrt_get_cart_page_url') ? aksrt_get_cart_page_url() : '';
|
||||||
|
if ($url === '') {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$count = 0;
|
||||||
|
if (class_exists('\AKSRT\Shop\Shop')) {
|
||||||
|
$count = (int) \AKSRT\Shop\Shop::get_instance()->get_cart_count(get_current_user_id());
|
||||||
|
}
|
||||||
|
$icon = !empty($item['icon']) ? (string) $item['icon'] : 'fas fa-shopping-cart';
|
||||||
|
$style = [];
|
||||||
|
if (!empty($item['color'])) {
|
||||||
|
$style[] = '--this-color:' . esc_attr((string) $item['color']);
|
||||||
|
}
|
||||||
|
if (!empty($item['bg'])) {
|
||||||
|
$style[] = '--this-bg:' . esc_attr((string) $item['bg']);
|
||||||
|
}
|
||||||
|
$style_attr = $style ? ' style="' . implode(';', $style) . '"' : '';
|
||||||
|
$badge = $count > 0 ? (string) min(99, $count) : '';
|
||||||
|
return '<a class="float-btn float-btn-shop-cart nowave" href="' . esc_url($url) . '" title="' . esc_attr__('购物车', 'aksrt') . '"' . $style_attr . '>'
|
||||||
|
. '<i class="' . esc_attr($icon) . '" aria-hidden="true"></i>'
|
||||||
|
. '<badge cart-count="' . esc_attr($badge) . '">' . esc_html($badge) . '</badge>'
|
||||||
|
. '</a>';
|
||||||
|
}
|
||||||
|
endif;
|
||||||
|
|
||||||
|
if (!function_exists('aksrt_get_float_pay_vip_html')) :
|
||||||
|
/**
|
||||||
|
* Floating VIP open button.
|
||||||
|
*/
|
||||||
|
function aksrt_get_float_pay_vip_html(array $item = []): string {
|
||||||
|
$show_vip = true;
|
||||||
|
if (class_exists('\AKSRT\Settings\Settings') && method_exists('\AKSRT\Settings\Settings', 'get_vip_settings')) {
|
||||||
|
$vs = \AKSRT\Settings\Settings::get_vip_settings();
|
||||||
|
$show_vip = !empty($vs['enabled']) || !empty($vs['vip1_enabled']) || !empty($vs['vip2_enabled']);
|
||||||
|
}
|
||||||
|
if (!$show_vip) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$user_id = get_current_user_id();
|
||||||
|
$level = 0;
|
||||||
|
if ($user_id > 0 && function_exists('aksrt_get_user_vip_level')) {
|
||||||
|
$level = (int) aksrt_get_user_vip_level($user_id);
|
||||||
|
}
|
||||||
|
// Hide for max VIP if we only have 2 tiers and already VIP.
|
||||||
|
if ($level >= 2) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$vip_url = function_exists('aksrt_get_vip_purchase_url')
|
||||||
|
? aksrt_get_vip_purchase_url()
|
||||||
|
: (function_exists('aksrt_get_user_center_url') ? aksrt_get_user_center_url('vip') : '#');
|
||||||
|
$title = $level === 1 ? __('升级会员', 'aksrt') : __('开通会员', 'aksrt');
|
||||||
|
$icon = !empty($item['icon']) ? (string) $item['icon'] : 'fa fa-diamond';
|
||||||
|
$cls = $user_id > 0 ? 'float-btn pay-vip' : 'float-btn signin-loader';
|
||||||
|
$href = $user_id > 0 ? $vip_url : 'javascript:;';
|
||||||
|
$style = [];
|
||||||
|
if (!empty($item['color'])) {
|
||||||
|
$style[] = '--this-color:' . esc_attr((string) $item['color']);
|
||||||
|
}
|
||||||
|
if (!empty($item['bg'])) {
|
||||||
|
$style[] = '--this-bg:' . esc_attr((string) $item['bg']);
|
||||||
|
}
|
||||||
|
$style_attr = $style ? ' style="' . implode(';', $style) . '"' : '';
|
||||||
|
return '<a class="' . esc_attr($cls) . '" href="' . esc_url($href) . '" title="' . esc_attr($title) . '"' . $style_attr . '>'
|
||||||
|
. '<i class="' . esc_attr($icon) . '" aria-hidden="true"></i>'
|
||||||
|
. '</a>';
|
||||||
|
}
|
||||||
|
endif;
|
||||||
|
|
||||||
|
if (!function_exists('aksrt_get_win_runtime_config')) :
|
||||||
|
/**
|
||||||
|
* Build window._win payload (zibll zib_win_var subset).
|
||||||
|
*
|
||||||
|
* @return array<string,mixed>
|
||||||
|
*/
|
||||||
|
function aksrt_get_win_runtime_config(): array {
|
||||||
|
$post_display = class_exists('\AKSRT\Settings\Settings')
|
||||||
|
? \AKSRT\Settings\Settings::get_post_page_settings()
|
||||||
|
: [];
|
||||||
|
$is_mobile = wp_is_mobile();
|
||||||
|
$list_style = class_exists('\AKSRT\Settings\Settings')
|
||||||
|
? \AKSRT\Settings\Settings::get_post_list_style_settings()
|
||||||
|
: [];
|
||||||
|
$signin = function_exists('aksrt_get_login_url')
|
||||||
|
? aksrt_get_login_url(function_exists('aksrt_get_current_url') ? aksrt_get_current_url() : home_url('/'))
|
||||||
|
: wp_login_url();
|
||||||
|
$signup = function_exists('aksrt_get_register_url')
|
||||||
|
? aksrt_get_register_url()
|
||||||
|
: wp_registration_url();
|
||||||
|
|
||||||
|
$views = 0;
|
||||||
|
if (is_singular()) {
|
||||||
|
$views = (int) get_queried_object_id();
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'views' => $views,
|
||||||
|
'www' => home_url('/'),
|
||||||
|
'uri' => get_template_directory_uri(),
|
||||||
|
'ver' => defined('AKSRT_VERSION') ? AKSRT_VERSION : '3.4.0-dev',
|
||||||
|
'imgbox' => !isset($post_display['lightbox']) || !empty($post_display['lightbox']) ? '1' : '',
|
||||||
|
'imgbox_type' => 'group',
|
||||||
|
'imgbox_thumbs' => !isset($post_display['lightbox_thumbs']) || !empty($post_display['lightbox_thumbs']) ? '1' : '',
|
||||||
|
'imgbox_zoom' => !isset($post_display['lightbox_zoom']) || !empty($post_display['lightbox_zoom']) ? '1' : '',
|
||||||
|
'imgbox_full' => !isset($post_display['lightbox_full']) || !empty($post_display['lightbox_full']) ? '1' : '',
|
||||||
|
'imgbox_play' => !empty($post_display['lightbox_play']) ? '1' : '',
|
||||||
|
'imgbox_down' => !empty($post_display['lightbox_down']) ? '1' : '',
|
||||||
|
'sign_type' => class_exists('\AKSRT\Settings\Settings')
|
||||||
|
? (string) (\AKSRT\Settings\Settings::get_all()['user_sign_type'] ?? 'page')
|
||||||
|
: 'page',
|
||||||
|
'signin_url' => $signin,
|
||||||
|
'signup_url' => $signup,
|
||||||
|
'ajax_url' => admin_url('admin-ajax.php'),
|
||||||
|
'ajaxpager' => '1',
|
||||||
|
'ajax_trigger' => (string) ($list_style['ajax_trigger_text'] ?? __('加载更多', 'aksrt')),
|
||||||
|
'ajax_nomore' => (string) ($list_style['ajax_nomore_text'] ?? __('没有更多了', 'aksrt')),
|
||||||
|
'qj_loading' => __('加载中...', 'aksrt'),
|
||||||
|
'is_mobile' => $is_mobile ? '1' : '',
|
||||||
|
'is_logged_in' => is_user_logged_in() ? '1' : '',
|
||||||
|
'user_id' => get_current_user_id(),
|
||||||
|
'rest_url' => esc_url_raw(rest_url('aksrt/v1')),
|
||||||
|
'rest_nonce' => wp_create_nonce('wp_rest'),
|
||||||
|
'nonce' => wp_create_nonce('aksrt_public_nonce'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
endif;
|
||||||
|
|
||||||
|
if (!function_exists('aksrt_print_win_var')) :
|
||||||
|
/**
|
||||||
|
* Echo window._win + alias window.aksrtData bridge.
|
||||||
|
*/
|
||||||
|
function aksrt_print_win_var(): void {
|
||||||
|
static $done = false;
|
||||||
|
if ($done) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$done = true;
|
||||||
|
$cfg = aksrt_get_win_runtime_config();
|
||||||
|
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||||
|
echo '<script type="text/javascript">window._win=' . wp_json_encode($cfg, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . ';'
|
||||||
|
. 'window.aksrtData=window.aksrtData||{};'
|
||||||
|
. 'window.aksrtData.ajaxUrl=window.aksrtData.ajaxUrl||window._win.ajax_url;'
|
||||||
|
. 'window.aksrtData.siteUrl=window.aksrtData.siteUrl||window._win.www;'
|
||||||
|
. 'window.aksrtData.themeUri=window.aksrtData.themeUri||window._win.uri;'
|
||||||
|
. 'window.aksrtData.restUrl=window.aksrtData.restUrl||window._win.rest_url;'
|
||||||
|
. 'window.aksrtData.restNonce=window.aksrtData.restNonce||window._win.rest_nonce;'
|
||||||
|
. 'window.aksrtData.nonce=window.aksrtData.nonce||window._win.nonce;'
|
||||||
|
. 'window.aksrtData.imgbox=window._win;'
|
||||||
|
. '</script>' . "\n";
|
||||||
|
}
|
||||||
|
endif;
|
||||||
@@ -150,6 +150,18 @@ trait ScriptsPart1b {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Header multi-function publish/VIP cluster
|
||||||
|
$hmb_css = get_template_directory() . '/assets/css/frontend/nav/header-menu-buttons.css';
|
||||||
|
if (file_exists($hmb_css)) {
|
||||||
|
wp_enqueue_style(
|
||||||
|
'aksrt-header-menu-buttons',
|
||||||
|
$base_uri . '/assets/css/frontend/nav/header-menu-buttons.css',
|
||||||
|
[$core_dep],
|
||||||
|
(string) filemtime($hmb_css)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Print stylesheet — only load on singular pages
|
// Print stylesheet — only load on singular pages
|
||||||
if (is_singular()) {
|
if (is_singular()) {
|
||||||
wp_enqueue_style(
|
wp_enqueue_style(
|
||||||
|
|||||||
Reference in new issue
Block a user