Merge pull request 'Worktree ux depth batch37 39' (#241) from worktree-ux-depth-batch37-39 into main
Reviewed-on: CYL/wordpress-theme-aksrt#241
This commit is contained in:
@@ -2479,3 +2479,41 @@ a.main-color > .icon-cover-card:hover,
|
||||
.widget-tab-posts__skeleton .placeholder.k1 { width: 80%; }
|
||||
.widget-tab-posts__skeleton .placeholder.s1 { width: 48%; }
|
||||
.posts-mini-lists.aksrt-main-posts { /* zibll mini outer */ }
|
||||
|
||||
|
||||
/* batch37-39 residual */
|
||||
.aksrt-post-pay-box { position: relative; overflow: hidden; }
|
||||
.aksrt-post-pay-box .pay-tag.abs-center {
|
||||
position: absolute; top: 12px; left: 50%; transform: translateX(-50%);
|
||||
z-index: 2; padding: 2px 10px; border-radius: 999px; background: rgba(0,0,0,.35); color: #fff; font-size: 12px;
|
||||
}
|
||||
.aksrt-post-pay-box__hero { position: relative; overflow: hidden; min-height: 120px; color: #fff; }
|
||||
.aksrt-post-pay-box__blob { opacity: .55; pointer-events: none; }
|
||||
.aksrt-post-pay-box__blob--a { height: 200px; left: 75%; width: 200px; top: -34%; border-radius: 100%; }
|
||||
.aksrt-post-pay-box__blob--b { height: 305px; width: 337px; left: -229px; border-radius: 100%; opacity: .7; }
|
||||
.aksrt-post-pay-box .box-body { position: relative; z-index: 1; }
|
||||
.aksrt-post-pay-box .img-badge.hot { position: absolute; top: 8px; right: 8px; z-index: 2; }
|
||||
.aksrt-post-pay-box .but.btn-block { width: 100%; justify-content: center; }
|
||||
.aksrt-main-posts__skeleton .placeholder-row,
|
||||
.aksrt-product-tab__skeleton .placeholder-row {
|
||||
display: flex; flex-direction: column; gap: 8px; margin-bottom: 12px;
|
||||
}
|
||||
.aksrt-main-posts__skeleton .posts-mini.placeholder-row { flex-direction: row; align-items: center; gap: 10px; }
|
||||
.aksrt-main-posts__skeleton .thumb-placeholder,
|
||||
.aksrt-product-tab__skeleton .placeholder.thumb {
|
||||
width: 72px; height: 54px; border-radius: 8px; background: var(--surface-2, #eee);
|
||||
}
|
||||
.aksrt-product-tab__skeleton .placeholder.thumb { width: 100%; height: 100px; }
|
||||
.aksrt-main-posts__skeleton .placeholder.k1,
|
||||
.aksrt-main-posts__skeleton .placeholder.t1,
|
||||
.aksrt-main-posts__skeleton .placeholder.s1,
|
||||
.aksrt-product-tab__skeleton .placeholder.k1,
|
||||
.aksrt-product-tab__skeleton .placeholder.s1 {
|
||||
height: 12px; border-radius: 4px; background: var(--surface-2, #eee);
|
||||
}
|
||||
.aksrt-main-posts__skeleton .placeholder.k1,
|
||||
.aksrt-product-tab__skeleton .placeholder.k1 { width: 80%; }
|
||||
.aksrt-main-posts__skeleton .placeholder.s1,
|
||||
.aksrt-product-tab__skeleton .placeholder.s1 { width: 48%; }
|
||||
.aksrt-main-posts[data-load-mode="ajax"].is-ajax-loading { opacity: .85; }
|
||||
.widget-search-box.is-affix { position: sticky; top: 72px; }
|
||||
|
||||
+275
-8
@@ -9,8 +9,16 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
function restHeaders() {
|
||||
var headers = { Accept: 'application/json' };
|
||||
if (window.aksrtData && aksrtData.restNonce) {
|
||||
headers['X-WP-Nonce'] = aksrtData.restNonce;
|
||||
}
|
||||
return headers;
|
||||
}
|
||||
|
||||
function initWidgetTabs() {
|
||||
document.querySelectorAll('.widget-tab-posts').forEach(function (widget) {
|
||||
document.querySelectorAll('.widget-tab-posts[data-aksrt-tab-posts]').forEach(function (widget) {
|
||||
if (widget.dataset.aksrtWidgetTabsBound === '1') return;
|
||||
widget.dataset.aksrtWidgetTabsBound = '1';
|
||||
|
||||
@@ -37,11 +45,7 @@
|
||||
});
|
||||
var url = rest + (rest.indexOf('?') > -1 ? '&' : '?') + qs.toString();
|
||||
panel.classList.add('is-ajax-loading');
|
||||
var headers = { Accept: 'application/json' };
|
||||
if (window.aksrtData && aksrtData.restNonce) {
|
||||
headers['X-WP-Nonce'] = aksrtData.restNonce;
|
||||
}
|
||||
fetch(url, { credentials: 'same-origin', headers: headers })
|
||||
fetch(url, { credentials: 'same-origin', headers: restHeaders() })
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (j) {
|
||||
var d = (j && j.data) || j || {};
|
||||
@@ -59,16 +63,16 @@
|
||||
tabs.forEach(function (tab) {
|
||||
tab.addEventListener('click', function () {
|
||||
var target = tab.getAttribute('data-tab');
|
||||
|
||||
tabs.forEach(function (item) {
|
||||
var active = item === tab;
|
||||
item.classList.toggle('active', active);
|
||||
item.classList.toggle('is-active', active);
|
||||
item.setAttribute('aria-selected', active ? 'true' : 'false');
|
||||
});
|
||||
|
||||
panels.forEach(function (panel) {
|
||||
var active = panel.getAttribute('data-tab-panel') === target;
|
||||
panel.classList.toggle('active', active);
|
||||
panel.classList.toggle('is-active', active);
|
||||
if (active) {
|
||||
panel.removeAttribute('hidden');
|
||||
loadPanel(panel, tab);
|
||||
@@ -81,6 +85,265 @@
|
||||
});
|
||||
}
|
||||
|
||||
// Homepage category tabs (was inline in CategoryTabsWidget).
|
||||
function initCategoryTabs() {
|
||||
document.querySelectorAll('[data-aksrt-home-cat-tabs]').forEach(function (section) {
|
||||
if (section.dataset.aksrtCatTabsBound === '1') return;
|
||||
section.dataset.aksrtCatTabsBound = '1';
|
||||
var rest = section.getAttribute('data-rest') || '';
|
||||
var count = section.getAttribute('data-count') || '6';
|
||||
var layout = section.getAttribute('data-layout') || 'card';
|
||||
var columns = section.getAttribute('data-columns') || '3';
|
||||
var context = section.getAttribute('data-context') || 'homepage';
|
||||
var showMore = section.getAttribute('data-show-more') === '1';
|
||||
var tabs = [].slice.call(section.querySelectorAll('.widget-tab-posts__tab'));
|
||||
var panels = [].slice.call(section.querySelectorAll('.widget-tab-posts__panel'));
|
||||
if (!tabs.length || !panels.length || !rest) return;
|
||||
|
||||
function load(panel) {
|
||||
if (!panel || panel.getAttribute('data-loaded') === '1') return;
|
||||
var cat = panel.getAttribute('data-cat') || '0';
|
||||
var more = panel.getAttribute('data-more') || '';
|
||||
var qs = new URLSearchParams({
|
||||
cat: cat,
|
||||
count: String(count),
|
||||
layout: layout,
|
||||
columns: String(columns),
|
||||
context: context,
|
||||
});
|
||||
var url = rest + (rest.indexOf('?') > -1 ? '&' : '?') + qs.toString();
|
||||
panel.classList.add('is-ajax-loading');
|
||||
fetch(url, { credentials: 'same-origin', headers: restHeaders() })
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (j) {
|
||||
var d = (j && j.data) || j || {};
|
||||
var html = d.html || '';
|
||||
if (showMore && more) {
|
||||
html += '<div class="aksrt-home-widget__footer"><a class="aksrt-home-widget__more" href="' + more + '">查看更多</a></div>';
|
||||
}
|
||||
panel.innerHTML = html || '<div class="ajax-item widget-empty muted-2-color">暂无文章</div>';
|
||||
panel.setAttribute('data-loaded', '1');
|
||||
panel.classList.remove('is-ajax-loading');
|
||||
})
|
||||
.catch(function () {
|
||||
panel.classList.remove('is-ajax-loading');
|
||||
});
|
||||
}
|
||||
|
||||
tabs.forEach(function (tab) {
|
||||
tab.addEventListener('click', function () {
|
||||
var target = tab.getAttribute('data-tab');
|
||||
tabs.forEach(function (item) {
|
||||
var active = item === tab;
|
||||
item.classList.toggle('active', active);
|
||||
item.setAttribute('aria-selected', active ? 'true' : 'false');
|
||||
});
|
||||
panels.forEach(function (panel) {
|
||||
var active = panel.getAttribute('data-tab-panel') === target;
|
||||
panel.classList.toggle('active', active);
|
||||
if (active) {
|
||||
panel.removeAttribute('hidden');
|
||||
load(panel);
|
||||
} else {
|
||||
panel.setAttribute('hidden', '');
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Forum multi-tab topics.
|
||||
function initForumTabTopics() {
|
||||
document.querySelectorAll('.aksrt-ftab[data-aksrt-ftab]').forEach(function (root) {
|
||||
if (root.dataset.aksrtFtabBound === '1') return;
|
||||
root.dataset.aksrtFtabBound = '1';
|
||||
var rest = root.getAttribute('data-rest') || '';
|
||||
var count = root.getAttribute('data-count') || '6';
|
||||
var style = root.getAttribute('data-style') || 'mini';
|
||||
var plate = root.getAttribute('data-plate') || '0';
|
||||
var btns = [].slice.call(root.querySelectorAll('.aksrt-ftab__btn'));
|
||||
var panels = [].slice.call(root.querySelectorAll('.aksrt-ftab__panel'));
|
||||
|
||||
function load(panel, orderby) {
|
||||
if (!panel || panel.getAttribute('data-loaded') === '1' || !rest) return;
|
||||
var qs = new URLSearchParams({
|
||||
page: '1',
|
||||
count: count,
|
||||
orderby: orderby || 'date',
|
||||
style: style,
|
||||
plate: plate,
|
||||
period: 'all',
|
||||
paginate: 'none',
|
||||
});
|
||||
var url = rest + (rest.indexOf('?') > -1 ? '&' : '?') + qs.toString();
|
||||
panel.classList.add('is-ajax-loading');
|
||||
fetch(url, { credentials: 'same-origin', headers: restHeaders() })
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (j) {
|
||||
var d = (j && j.data) || j || {};
|
||||
var html = d.html || '';
|
||||
panel.innerHTML = html || '<div class="ajax-item aksrt-ftab__empty muted-2-color">暂无内容</div>';
|
||||
panel.setAttribute('data-loaded', '1');
|
||||
panel.classList.remove('is-ajax-loading');
|
||||
})
|
||||
.catch(function () {
|
||||
panel.classList.remove('is-ajax-loading');
|
||||
});
|
||||
}
|
||||
|
||||
function go(i) {
|
||||
btns.forEach(function (b, idx) {
|
||||
var on = idx === i;
|
||||
b.classList.toggle('is-active', on);
|
||||
b.setAttribute('aria-selected', on ? 'true' : 'false');
|
||||
});
|
||||
panels.forEach(function (p, idx) {
|
||||
var on = idx === i;
|
||||
p.classList.toggle('is-active', on);
|
||||
if (on) {
|
||||
p.removeAttribute('hidden');
|
||||
} else {
|
||||
p.setAttribute('hidden', '');
|
||||
}
|
||||
});
|
||||
var btn = btns[i];
|
||||
var panel = panels[i];
|
||||
if (btn && panel) load(panel, btn.getAttribute('data-orderby') || 'date');
|
||||
}
|
||||
|
||||
btns.forEach(function (b) {
|
||||
b.addEventListener('click', function () {
|
||||
go(parseInt(b.getAttribute('data-index') || '0', 10));
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Product multi-tab.
|
||||
function initProductTabs() {
|
||||
document.querySelectorAll('[data-aksrt-product-tab]').forEach(function (root) {
|
||||
if (root.dataset.aksrtProductTabBound === '1') return;
|
||||
root.dataset.aksrtProductTabBound = '1';
|
||||
var rest = root.getAttribute('data-rest') || '';
|
||||
var per = root.getAttribute('data-per-page') || '8';
|
||||
var style = root.getAttribute('data-style') || 'default';
|
||||
var paginate = root.getAttribute('data-paginate') || 'ajax';
|
||||
|
||||
function skeleton(n) {
|
||||
n = Math.max(1, Math.min(12, parseInt(n, 10) || 4));
|
||||
var html = '<div class="aksrt-product-tab__skeleton">';
|
||||
for (var i = 0; i < n; i++) {
|
||||
html += '<div class="placeholder-row product-card-placeholder"><div class="placeholder thumb"></div><div class="placeholder k1"></div><div class="placeholder s1"></div></div>';
|
||||
}
|
||||
return html + '</div>';
|
||||
}
|
||||
|
||||
function loadPanel(panel, btn) {
|
||||
if (!panel || panel.getAttribute('data-loaded') === '1' || !rest) return;
|
||||
var grid = panel.querySelector('[data-aksrt-ajaxpager]');
|
||||
if (!grid) return;
|
||||
var qs = new URLSearchParams({
|
||||
page: '1',
|
||||
per_page: per,
|
||||
style: style,
|
||||
paginate: paginate,
|
||||
orderby: btn.getAttribute('data-orderby') || 'date',
|
||||
order: 'DESC',
|
||||
cat_ids: btn.getAttribute('data-cat-ids') || '',
|
||||
tag_ids: btn.getAttribute('data-tag-ids') || '',
|
||||
discount_ids: btn.getAttribute('data-discount-ids') || '',
|
||||
});
|
||||
var url = rest + (rest.indexOf('?') > -1 ? '&' : '?') + qs.toString();
|
||||
grid.classList.add('is-ajax-loading');
|
||||
if (!grid.querySelector('.aksrt-product-tab__skeleton') && !grid.querySelector('.ajax-item')) {
|
||||
grid.insertAdjacentHTML('afterbegin', skeleton(per));
|
||||
}
|
||||
fetch(url, { credentials: 'same-origin', headers: restHeaders() })
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (j) {
|
||||
var d = (j && j.data && (j.data.data || j.data)) || j || {};
|
||||
var html = d.html || '';
|
||||
var pag = d.paginate_html || d.paginateHtml || '';
|
||||
var loader = grid.querySelector('[data-aksrt-ajax-loader]');
|
||||
grid.innerHTML = '';
|
||||
if (html) grid.insertAdjacentHTML('beforeend', html);
|
||||
else grid.insertAdjacentHTML('beforeend', '<p class="widget-empty ajax-item">暂无商品</p>');
|
||||
if (pag) grid.insertAdjacentHTML('beforeend', pag);
|
||||
if (loader) grid.appendChild(loader);
|
||||
panel.setAttribute('data-loaded', '1');
|
||||
grid.classList.remove('is-ajax-loading');
|
||||
})
|
||||
.catch(function () {
|
||||
grid.classList.remove('is-ajax-loading');
|
||||
});
|
||||
}
|
||||
|
||||
root.querySelectorAll('.aksrt-product-tab__header').forEach(function (btn) {
|
||||
btn.addEventListener('click', function () {
|
||||
root.querySelectorAll('.aksrt-product-tab__header').forEach(function (b) {
|
||||
b.classList.remove('is-active');
|
||||
});
|
||||
root.querySelectorAll('.aksrt-product-tab__panel').forEach(function (p) {
|
||||
p.style.display = 'none';
|
||||
p.classList.remove('is-active');
|
||||
});
|
||||
btn.classList.add('is-active');
|
||||
var idx = btn.getAttribute('data-tab-index');
|
||||
var panel = root.querySelector('.aksrt-product-tab__panel[data-tab-index="' + idx + '"]');
|
||||
if (panel) {
|
||||
panel.style.display = '';
|
||||
panel.classList.add('is-active');
|
||||
loadPanel(panel, btn);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Main posts load_mode=ajax first paint.
|
||||
function initMainPostsLazy() {
|
||||
document.querySelectorAll('.aksrt-main-posts[data-load-mode="ajax"]').forEach(function (root) {
|
||||
if (root.dataset.aksrtMainLazyBound === '1') return;
|
||||
root.dataset.aksrtMainLazyBound = '1';
|
||||
if (root.getAttribute('data-loaded') === '1') return;
|
||||
var rest = root.getAttribute('data-aksrt-ajax-url') || root.getAttribute('data-rest') || '';
|
||||
if (!rest) return;
|
||||
var qs = root.getAttribute('data-query') || '';
|
||||
var url = rest + (rest.indexOf('?') > -1 ? '&' : '?') + (qs || 'page=1');
|
||||
root.classList.add('is-ajax-loading');
|
||||
fetch(url, { credentials: 'same-origin', headers: restHeaders() })
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (j) {
|
||||
var d = (j && j.data) || j || {};
|
||||
var html = d.html || '';
|
||||
var pag = d.paginate_html || d.paginateHtml || '';
|
||||
var loader = root.querySelector('[data-aksrt-ajax-loader]');
|
||||
// Remove skeleton rows.
|
||||
root.querySelectorAll('.aksrt-main-posts__skeleton, .posts-mini.placeholder-row, .placeholder-row').forEach(function (n) {
|
||||
n.remove();
|
||||
});
|
||||
if (html) {
|
||||
root.insertAdjacentHTML('afterbegin', html);
|
||||
} else {
|
||||
root.insertAdjacentHTML('afterbegin', '<p class="widget-empty ajax-item">暂无文章</p>');
|
||||
}
|
||||
// Replace/append paginate.
|
||||
var oldPag = root.querySelector('.ajax-pag, .pagenav.ajax-pag');
|
||||
if (oldPag) oldPag.remove();
|
||||
if (pag) {
|
||||
if (loader) loader.insertAdjacentHTML('beforebegin', pag);
|
||||
else root.insertAdjacentHTML('beforeend', pag);
|
||||
}
|
||||
root.setAttribute('data-loaded', '1');
|
||||
root.classList.remove('is-ajax-loading');
|
||||
})
|
||||
.catch(function () {
|
||||
root.classList.remove('is-ajax-loading');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function initFloatingQRCodes() {
|
||||
var wrap = document.querySelector('.float-right');
|
||||
if (!wrap) return;
|
||||
@@ -121,6 +384,10 @@
|
||||
|
||||
function init() {
|
||||
initWidgetTabs();
|
||||
initCategoryTabs();
|
||||
initForumTabTopics();
|
||||
initProductTabs();
|
||||
initMainPostsLazy();
|
||||
initFloatingQRCodes();
|
||||
}
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@ function aksrt_register_widgets() {
|
||||
register_widget('\AKSRT\Widgets\WidgetFeatureIntro');
|
||||
register_widget('\AKSRT\Widgets\WidgetTermCards');
|
||||
register_widget('\AKSRT\Widgets\WidgetPaidPosts');
|
||||
register_widget('\AKSRT\Widgets\WidgetPostPayBox');
|
||||
register_widget('\AKSRT\Widgets\WidgetAuthorCard');
|
||||
register_widget('\AKSRT\Widgets\WidgetOnelinePosts');
|
||||
register_widget('\AKSRT\Widgets\WidgetTiltCases');
|
||||
|
||||
@@ -240,6 +240,7 @@ class WidgetAjax {
|
||||
'include' => sanitize_text_field((string) ($request->get_param('include') ?? '')),
|
||||
'exclude' => sanitize_text_field((string) ($request->get_param('exclude') ?? '')),
|
||||
'hide_box' => (int) ($request->get_param('hide_box') ?? 0),
|
||||
'blur_bg' => (int) ($request->get_param('blur_bg') ?? 0),
|
||||
];
|
||||
$html = \AKSRT\Widgets\WidgetUserLists::render_html($instance);
|
||||
return new \WP_REST_Response(['success' => true, 'html' => $html], 200);
|
||||
|
||||
@@ -38,7 +38,7 @@ class CategoryTabsWidget extends \WP_Widget {
|
||||
$tabs = $this->resolve_tabs($instance);
|
||||
|
||||
echo $args['before_widget'];
|
||||
echo '<section class="aksrt-home-widget aksrt-home-widget--tabs widget-tab-posts" data-aksrt-home-cat-tabs data-aksrt-tabs="1">';
|
||||
echo '<section class="aksrt-home-widget aksrt-home-widget--tabs widget-tab-posts" data-aksrt-home-cat-tabs data-aksrt-tabs="1" data-rest="' . esc_url(rest_url('aksrt/v1/widgets/category-tabs')) . '" data-count="' . esc_attr((string) $count) . '" data-layout="' . esc_attr($layout) . '" data-columns="' . esc_attr((string) $columns) . '" data-context="' . esc_attr($context) . '" data-show-more="' . (!empty($show_more) ? '1' : '0') . '">';
|
||||
|
||||
if (empty($tabs)) {
|
||||
echo function_exists('aksrt_get_widget_null') ? aksrt_get_widget_null(__('暂无可用分类', 'aksrt')) : '<p class="widget-empty">' . esc_html__('暂无可用分类', 'aksrt') . '</p>';
|
||||
@@ -95,65 +95,16 @@ class CategoryTabsWidget extends \WP_Widget {
|
||||
</div>
|
||||
<?php endif;
|
||||
else : ?>
|
||||
<div class="post_ajax_loader" data-aksrt-ajax-loader></div>
|
||||
<div class="post_ajax_loader" data-aksrt-ajax-loader>
|
||||
<?php for ($si = 0; $si < $count; $si++) : ?>
|
||||
<div class="posts-mini placeholder-row"><div class="placeholder radius thumb-placeholder"></div><div class="flex1"><div class="placeholder k1"></div><div class="placeholder s1 mt6"></div></div></div>
|
||||
<?php endfor; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
$rest = rest_url('aksrt/v1/widgets/category-tabs');
|
||||
?>
|
||||
<script>
|
||||
(function(){
|
||||
var section=document.currentScript?document.currentScript.parentElement:null;
|
||||
if(!section||section._aksrtCatTabs)return; section._aksrtCatTabs=1;
|
||||
var rest=<?php echo wp_json_encode($rest); ?>;
|
||||
var count=<?php echo (int) $count; ?>;
|
||||
var layout=<?php echo wp_json_encode($layout); ?>;
|
||||
var columns=<?php echo (int) $columns; ?>;
|
||||
var context=<?php echo wp_json_encode($context); ?>;
|
||||
var showMore=<?php echo $show_more ? 'true' : 'false'; ?>;
|
||||
var tabs=[].slice.call(section.querySelectorAll('.widget-tab-posts__tab'));
|
||||
var panels=[].slice.call(section.querySelectorAll('.widget-tab-posts__panel'));
|
||||
function load(panel){
|
||||
if(!panel||panel.getAttribute('data-loaded')==='1')return;
|
||||
var cat=panel.getAttribute('data-cat')||'0';
|
||||
var more=panel.getAttribute('data-more')||'';
|
||||
var qs=new URLSearchParams({cat:cat,count:String(count),layout:layout,columns:String(columns),context:context});
|
||||
var url=rest+(rest.indexOf('?')>-1?'&':'?')+qs.toString();
|
||||
panel.classList.add('is-ajax-loading');
|
||||
var headers={Accept:'application/json'};
|
||||
if(window.aksrtData&&aksrtData.restNonce)headers['X-WP-Nonce']=aksrtData.restNonce;
|
||||
fetch(url,{credentials:'same-origin',headers:headers}).then(function(r){return r.json()}).then(function(j){
|
||||
var d=(j&&j.data)||j||{};
|
||||
var html=d.html||'';
|
||||
if(showMore&&more){
|
||||
html+='<div class="aksrt-home-widget__footer"><a class="aksrt-home-widget__more" href="'+more+'">查看更多</a></div>';
|
||||
}
|
||||
panel.innerHTML=html||'<div class="ajax-item widget-empty muted-2-color">暂无文章</div>';
|
||||
panel.setAttribute('data-loaded','1');
|
||||
panel.classList.remove('is-ajax-loading');
|
||||
}).catch(function(){panel.classList.remove('is-ajax-loading');});
|
||||
}
|
||||
tabs.forEach(function(tab){
|
||||
tab.addEventListener('click',function(){
|
||||
var target=tab.getAttribute('data-tab');
|
||||
tabs.forEach(function(item){
|
||||
var active=item===tab;
|
||||
item.classList.toggle('active',active);
|
||||
item.setAttribute('aria-selected',active?'true':'false');
|
||||
});
|
||||
panels.forEach(function(panel){
|
||||
var active=panel.getAttribute('data-tab-panel')===target;
|
||||
panel.classList.toggle('active',active);
|
||||
if(active){panel.removeAttribute('hidden');load(panel);} else {panel.setAttribute('hidden','');}
|
||||
});
|
||||
});
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<?php
|
||||
|
||||
echo '</section>';
|
||||
echo $args['after_widget'];
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ class SearchWidget extends \WP_Widget {
|
||||
|
||||
$uid = 'aksrt-sw-' . esc_attr($this->id);
|
||||
?>
|
||||
<div class="widget-search-box aksrt-search-widget search-input" id="<?php echo $uid; ?>">
|
||||
<div class="widget-search-box aksrt-search-widget search-input<?php echo !empty($instance['in_affix']) ? ' is-affix' : ''; ?>" id="<?php echo $uid; ?>"<?php echo !empty($instance['in_affix']) ? ' data-affix="true"' : ''; ?>>
|
||||
<form
|
||||
role="search"
|
||||
method="get"
|
||||
@@ -239,7 +239,8 @@ class SearchWidget extends \WP_Widget {
|
||||
<label><input type="checkbox" name="<?php echo esc_attr($this->get_field_name('show_type')); ?>" value="1" <?php checked(!empty($instance['show_type']) || !isset($instance['show_type'])); ?>> <?php esc_html_e('显示类型切换(≥2 种时)', 'aksrt'); ?></label><br>
|
||||
<label><input type="checkbox" name="<?php echo esc_attr($this->get_field_name('show_input_cat')); ?>" value="1" <?php checked(!empty($instance['show_input_cat'])); ?>> <?php esc_html_e('显示分类筛选', 'aksrt'); ?></label><br>
|
||||
<label><input type="checkbox" name="<?php echo esc_attr($this->get_field_name('show_keywords')); ?>" value="1" <?php checked(!empty($instance['show_keywords'])); ?>> <?php esc_html_e('显示热门关键词', 'aksrt'); ?></label><br>
|
||||
<label><input type="checkbox" name="<?php echo esc_attr($this->get_field_name('show_history')); ?>" value="1" <?php checked(!empty($instance['show_history'])); ?>> <?php esc_html_e('显示搜索历史', 'aksrt'); ?></label>
|
||||
<label><input type="checkbox" name="<?php echo esc_attr($this->get_field_name('show_history')); ?>" value="1" <?php checked(!empty($instance['show_history'])); ?>> <?php esc_html_e('显示搜索历史', 'aksrt'); ?></label><br>
|
||||
<label><input type="checkbox" name="<?php echo esc_attr($this->get_field_name('in_affix')); ?>" value="1" <?php checked(!empty($instance['in_affix'])); ?>> <?php esc_html_e('侧栏随动', 'aksrt'); ?></label>
|
||||
</p>
|
||||
<p>
|
||||
<label><?php esc_html_e('默认类型', 'aksrt'); ?>
|
||||
@@ -298,6 +299,7 @@ class SearchWidget extends \WP_Widget {
|
||||
'keywords' => sanitize_textarea_field((string) ($new_instance['keywords'] ?? '')),
|
||||
'more_but' => sanitize_text_field((string) ($new_instance['more_but'] ?? '')),
|
||||
'more_but_url' => esc_url_raw(trim((string) ($new_instance['more_but_url'] ?? ''))),
|
||||
'in_affix' => !empty($new_instance['in_affix']) ? 1 : 0,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,10 +73,29 @@ class WidgetForumPlateModerator extends \WP_Widget {
|
||||
$style = 'list';
|
||||
}
|
||||
|
||||
$show_apply = !isset($instance['apply_btn']) || !empty($instance['apply_btn']);
|
||||
$apply_html = '';
|
||||
if ($show_apply && is_user_logged_in()) {
|
||||
$forum = class_exists('\AKSRT\Forum\Forum') ? \AKSRT\Forum\Forum::get_instance() : null;
|
||||
$cuid = get_current_user_id();
|
||||
$can_apply = $forum && method_exists($forum, 'forum_user_can')
|
||||
? $forum->forum_user_can($cuid, 'moderator_apply')
|
||||
: true;
|
||||
$is_mod = $forum && method_exists($forum, 'is_board_moderator')
|
||||
? $forum->is_board_moderator($cuid, $id)
|
||||
: in_array($cuid, array_merge([$author_id], $mods, $super), true);
|
||||
if ($can_apply && !$is_mod) {
|
||||
$apply_url = add_query_arg(['aksrt_apply_moderator' => 1, 'plate' => $id], get_permalink($id));
|
||||
$apply_html = '<a class="but hollow c-blue p2-10 em09" href="' . esc_url($apply_url) . '">' . esc_html__('申请版主', 'aksrt') . '</a>';
|
||||
}
|
||||
}
|
||||
ob_start();
|
||||
echo '<div class="zib-widget moderator-box aksrt-plate-mods style-' . esc_attr($style) . ' ajax-item">';
|
||||
if ($title_text !== '') {
|
||||
echo '<div class="mb10 flex jsb ac aksrt-plate-mods__head"><div class="title-theme">' . esc_html($title_text) . '</div></div>';
|
||||
if ($title_text !== '' || $apply_html !== '') {
|
||||
echo '<div class="mb10 flex jsb ac aksrt-plate-mods__head">';
|
||||
echo $title_text !== '' ? '<div class="title-theme">' . esc_html($title_text) . '</div>' : '<div></div>';
|
||||
echo $apply_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
echo '</div>';
|
||||
}
|
||||
echo '<div class="aksrt-plate-mods__list">';
|
||||
foreach ($people as $row) {
|
||||
@@ -144,7 +163,8 @@ class WidgetForumPlateModerator extends \WP_Widget {
|
||||
</label>
|
||||
</p>
|
||||
<p>
|
||||
<label><input type="checkbox" name="<?php echo esc_attr($this->get_field_name('show_avatar')); ?>" value="1" <?php checked(!isset($instance['show_avatar']) || !empty($instance['show_avatar'])); ?>> <?php esc_html_e('显示头像', 'aksrt'); ?></label>
|
||||
<label><input type="checkbox" name="<?php echo esc_attr($this->get_field_name('show_avatar')); ?>" value="1" <?php checked(!isset($instance['show_avatar']) || !empty($instance['show_avatar'])); ?>> <?php esc_html_e('显示头像', 'aksrt'); ?></label><br>
|
||||
<label><input type="checkbox" name="<?php echo esc_attr($this->get_field_name('apply_btn')); ?>" value="1" <?php checked(!isset($instance['apply_btn']) || !empty($instance['apply_btn'])); ?>> <?php esc_html_e('显示申请版主入口', 'aksrt'); ?></label>
|
||||
</p>
|
||||
<p class="description"><?php esc_html_e('仅在版块/帖子页显示。', 'aksrt'); ?></p>
|
||||
<?php
|
||||
@@ -155,6 +175,7 @@ class WidgetForumPlateModerator extends \WP_Widget {
|
||||
'title_text' => sanitize_text_field((string) ($new_instance['title_text'] ?? '')),
|
||||
'style' => ($new_instance['style'] ?? '') === 'grid' ? 'grid' : 'list',
|
||||
'show_avatar' => !empty($new_instance['show_avatar']) ? 1 : 0,
|
||||
'apply_btn' => !empty($new_instance['apply_btn']) ? 1 : 0,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ class WidgetForumTabTopics extends \WP_Widget {
|
||||
echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
}
|
||||
|
||||
echo '<div class="aksrt-ftab widget-tab-posts" id="' . $uid . '" data-aksrt-tabs="1" data-rest="' . esc_url($rest) . '" data-count="' . esc_attr((string) $count) . '" data-style="' . esc_attr($style) . '" data-plate="' . esc_attr((string) $plate) . '">';
|
||||
echo '<div class="aksrt-ftab widget-tab-posts" id="' . $uid . '" data-aksrt-tabs="1" data-aksrt-ftab="1" data-rest="' . esc_url($rest) . '" data-count="' . esc_attr((string) $count) . '" data-style="' . esc_attr($style) . '" data-plate="' . esc_attr((string) $plate) . '">';
|
||||
echo '<ul class="aksrt-ftab__nav widget-tab-posts__nav" role="tablist">';
|
||||
foreach ($tabs as $i => $tab) {
|
||||
$cls = $i === 0 ? ' is-active' : '';
|
||||
@@ -78,50 +78,6 @@ class WidgetForumTabTopics extends \WP_Widget {
|
||||
echo '</div>';
|
||||
}
|
||||
echo '</div>';
|
||||
?>
|
||||
<script>
|
||||
(function(){
|
||||
var root=document.getElementById(<?php echo wp_json_encode($uid); ?>);
|
||||
if(!root||root._aksrtFtab)return; root._aksrtFtab=1;
|
||||
var rest=root.getAttribute('data-rest')||'';
|
||||
var count=root.getAttribute('data-count')||'6';
|
||||
var style=root.getAttribute('data-style')||'mini';
|
||||
var plate=root.getAttribute('data-plate')||'0';
|
||||
var btns=[].slice.call(root.querySelectorAll('.aksrt-ftab__btn'));
|
||||
var panels=[].slice.call(root.querySelectorAll('.aksrt-ftab__panel'));
|
||||
function load(panel, orderby){
|
||||
if(!panel||panel.getAttribute('data-loaded')==='1'||!rest)return;
|
||||
var qs=new URLSearchParams({page:'1',count:count,orderby:orderby||'date',style:style,plate:plate,period:'all',paginate:'none'});
|
||||
var url=rest+(rest.indexOf('?')>-1?'&':'?')+qs.toString();
|
||||
panel.classList.add('is-ajax-loading');
|
||||
fetch(url,{credentials:'same-origin',headers:{Accept:'application/json','X-WP-Nonce':(window.aksrtData&&aksrtData.restNonce)||''}})
|
||||
.then(function(r){return r.json()}).then(function(j){
|
||||
var d=(j&&j.data)||j||{};
|
||||
var html=d.html||'';
|
||||
panel.innerHTML=html||'<div class="ajax-item aksrt-ftab__empty muted-2-color">暂无内容</div>';
|
||||
panel.setAttribute('data-loaded','1');
|
||||
panel.classList.remove('is-ajax-loading');
|
||||
}).catch(function(){panel.classList.remove('is-ajax-loading');});
|
||||
}
|
||||
function go(i){
|
||||
btns.forEach(function(b,idx){
|
||||
var on=idx===i;
|
||||
b.classList.toggle('is-active',on);
|
||||
b.setAttribute('aria-selected',on?'true':'false');
|
||||
});
|
||||
panels.forEach(function(p,idx){
|
||||
var on=idx===i;
|
||||
p.classList.toggle('is-active',on);
|
||||
if(on){p.removeAttribute('hidden');}else{p.setAttribute('hidden','');}
|
||||
});
|
||||
var btn=btns[i], panel=panels[i];
|
||||
if(btn&&panel) load(panel, btn.getAttribute('data-orderby')||'date');
|
||||
}
|
||||
btns.forEach(function(b){ b.addEventListener('click', function(){ go(parseInt(b.getAttribute('data-index')||'0',10)); }); });
|
||||
})();
|
||||
</script>
|
||||
<?php
|
||||
|
||||
echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
}
|
||||
|
||||
|
||||
@@ -31,8 +31,9 @@ class WidgetIframe extends \WP_Widget {
|
||||
if ($raw === '') {
|
||||
if (current_user_can('manage_options')) {
|
||||
echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
echo '<div class="c-red muted-box mb20"><b>' . esc_html__('超级嵌入:', 'aksrt') . '</b>' .
|
||||
esc_html__('请配置 URL 或 iframe 代码', 'aksrt') . '</div>';
|
||||
echo function_exists('aksrt_get_widget_null')
|
||||
? aksrt_get_widget_null(__('请配置 URL 或 iframe 代码', 'aksrt')) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
: '<div class="c-red muted-box mb20"><b>' . esc_html__('超级嵌入:', 'aksrt') . '</b>' . esc_html__('请配置 URL 或 iframe 代码', 'aksrt') . '</div>';
|
||||
echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -255,6 +255,7 @@ class WidgetMainPosts extends \WP_Widget {
|
||||
'show_meta' => !isset($instance['show_meta']) || !empty($instance['show_meta']) ? 1 : 0,
|
||||
'show_number' => !empty($instance['show_number']) ? 1 : 0,
|
||||
'paginate' => $paginate,
|
||||
'load_mode' => sanitize_key((string) ($new_instance['load_mode'] ?? 'detail')) === 'ajax' ? 'ajax' : 'detail',
|
||||
], static function ($v) {
|
||||
return $v !== '' && $v !== null;
|
||||
});
|
||||
@@ -288,28 +289,63 @@ class WidgetMainPosts extends \WP_Widget {
|
||||
$style = 'list';
|
||||
}
|
||||
$paginate = sanitize_key((string) ($instance['paginate'] ?? 'none'));
|
||||
if (!in_array($paginate, ['none', 'ajax', 'number'], true)) {
|
||||
$paginate = 'none';
|
||||
}
|
||||
$load_mode = sanitize_key((string) ($instance['load_mode'] ?? 'detail'));
|
||||
if (!in_array($load_mode, ['detail', 'ajax'], true)) {
|
||||
$load_mode = 'detail';
|
||||
}
|
||||
$instance['style'] = $style;
|
||||
$instance['paginate'] = $paginate;
|
||||
|
||||
$payload = self::query_payload($instance, 1);
|
||||
if ($payload['html'] === '' && empty($payload['total'])) {
|
||||
return;
|
||||
}
|
||||
|
||||
echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
$title = apply_filters('widget_title', (string) ($instance['title'] ?? ''), $instance, $this->id_base);
|
||||
if ($title !== '') {
|
||||
echo $args['before_title'] . esc_html($title) . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
}
|
||||
|
||||
$count = max(1, min(30, (int) ($instance['count'] ?? 6)));
|
||||
$rest = rest_url('aksrt/v1/widgets/posts');
|
||||
$qs = http_build_query(array_filter([
|
||||
'page' => 1,
|
||||
'count' => $count,
|
||||
'orderby' => sanitize_key((string) ($instance['orderby'] ?? 'date')),
|
||||
'cat' => (int) ($instance['cat'] ?? 0),
|
||||
'limit_day' => (int) ($instance['limit_day'] ?? 0),
|
||||
'topics' => (string) ($instance['topics'] ?? ''),
|
||||
'pay_type' => sanitize_key((string) ($instance['pay_type'] ?? '')),
|
||||
'style' => $style,
|
||||
'show_thumb' => !isset($instance['show_thumb']) || !empty($instance['show_thumb']) ? 1 : 0,
|
||||
'show_meta' => !isset($instance['show_meta']) || !empty($instance['show_meta']) ? 1 : 0,
|
||||
'show_number' => !empty($instance['show_number']) ? 1 : 0,
|
||||
'paginate' => $paginate,
|
||||
'load_mode' => sanitize_key((string) ($new_instance['load_mode'] ?? 'detail')) === 'ajax' ? 'ajax' : 'detail',
|
||||
], static function ($v) {
|
||||
return $v !== '' && $v !== null;
|
||||
}));
|
||||
$wrap_cls = 'aksrt-main-posts style-' . $style . ' ajaxpager';
|
||||
if ($style === 'mini') {
|
||||
$wrap_cls .= ' zib-widget posts-mini-lists';
|
||||
}
|
||||
echo '<div class="' . esc_attr($wrap_cls) . '" data-aksrt-ajaxpager data-aksrt-ajax-url="' . esc_url($rest) . '">';
|
||||
echo $payload['html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
echo $payload['paginate_html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
echo '<div class="' . esc_attr($wrap_cls) . '" data-aksrt-ajaxpager data-aksrt-ajax-url="' . esc_url($rest) . '" data-load-mode="' . esc_attr($load_mode) . '" data-query="' . esc_attr($qs) . '"' . ($load_mode === 'ajax' ? ' data-loaded="0"' : ' data-loaded="1"') . '>';
|
||||
|
||||
if ($load_mode === 'ajax') {
|
||||
// Skeleton first paint (zibll load_mode=ajax).
|
||||
echo '<div class="aksrt-main-posts__skeleton">';
|
||||
for ($si = 0; $si < $count; $si++) {
|
||||
if ($style === 'card') {
|
||||
echo '<div class="placeholder-row card"><div class="placeholder thumb"></div><div class="placeholder k1"></div></div>';
|
||||
} else {
|
||||
echo '<div class="posts-mini placeholder-row"><div class="placeholder radius thumb-placeholder"></div><div class="flex1"><div class="placeholder t1 k1"></div><div class="placeholder s1"></div></div></div>';
|
||||
}
|
||||
}
|
||||
echo '</div>';
|
||||
} else {
|
||||
$payload = self::query_payload($instance, 1);
|
||||
echo $payload['html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
echo $payload['paginate_html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
}
|
||||
echo '<div class="post_ajax_loader" data-aksrt-ajax-loader data-aksrt-ajax-loader-hide hidden></div>';
|
||||
echo '</div>';
|
||||
|
||||
@@ -345,8 +381,8 @@ class WidgetMainPosts extends \WP_Widget {
|
||||
<option value="views" <?php selected(($instance['orderby'] ?? ''), 'views'); ?>><?php esc_html_e('浏览', 'aksrt'); ?></option>
|
||||
<option value="comments" <?php selected(($instance['orderby'] ?? ''), 'comments'); ?>><?php esc_html_e('评论', 'aksrt'); ?></option>
|
||||
<option value="likes" <?php selected(($instance['orderby'] ?? ''), 'likes'); ?>><?php esc_html_e('点赞', 'aksrt'); ?></option>
|
||||
<option value=\"favorites\" <?php selected(($instance['orderby'] ?? ''), 'favorites'); ?>><?php esc_html_e('收藏', 'aksrt'); ?></option>
|
||||
<option value=\"downloads\" <?php selected(($instance['orderby'] ?? ''), 'downloads'); ?>><?php esc_html_e('下载', 'aksrt'); ?></option>
|
||||
<option value="favorites" <?php selected(($instance['orderby'] ?? ''), 'favorites'); ?>><?php esc_html_e('收藏', 'aksrt'); ?></option>
|
||||
<option value="downloads" <?php selected(($instance['orderby'] ?? ''), 'downloads'); ?>><?php esc_html_e('下载', 'aksrt'); ?></option>
|
||||
<option value="rand" <?php selected(($instance['orderby'] ?? ''), 'rand'); ?>><?php esc_html_e('随机', 'aksrt'); ?></option>
|
||||
</select>
|
||||
</label>
|
||||
@@ -361,7 +397,15 @@ class WidgetMainPosts extends \WP_Widget {
|
||||
<input class="tiny-text" type="number" min="0" name="<?php echo esc_attr($this->get_field_name('limit_day')); ?>" value="<?php echo esc_attr((string) ((int) ($instance['limit_day'] ?? 0))); ?>">
|
||||
</label>
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
<label><?php esc_html_e('模块加载', 'aksrt'); ?>
|
||||
<select name="<?php echo esc_attr($this->get_field_name('load_mode')); ?>">
|
||||
<option value="detail" <?php selected(($instance['load_mode'] ?? 'detail'), 'detail'); ?>><?php esc_html_e('直接加载', 'aksrt'); ?></option>
|
||||
<option value="ajax" <?php selected(($instance['load_mode'] ?? ''), 'ajax'); ?>><?php esc_html_e('AJAX 懒加载', 'aksrt'); ?></option>
|
||||
</select>
|
||||
</label>
|
||||
</p>
|
||||
<p>
|
||||
<label><?php esc_html_e('分页', 'aksrt'); ?>
|
||||
<select name="<?php echo esc_attr($this->get_field_name('paginate')); ?>">
|
||||
<option value="none" <?php selected(($instance['paginate'] ?? 'none'), 'none'); ?>><?php esc_html_e('无', 'aksrt'); ?></option>
|
||||
@@ -419,6 +463,7 @@ class WidgetMainPosts extends \WP_Widget {
|
||||
'topics' => sanitize_text_field((string) ($new_instance['topics'] ?? '')),
|
||||
'pay_type' => sanitize_key((string) ($new_instance['pay_type'] ?? '')),
|
||||
'paginate' => $paginate,
|
||||
'load_mode' => sanitize_key((string) ($new_instance['load_mode'] ?? 'detail')) === 'ajax' ? 'ajax' : 'detail',
|
||||
'show_thumb' => !empty($new_instance['show_thumb']) ? 1 : 0,
|
||||
'show_meta' => !empty($new_instance['show_meta']) ? 1 : 0,
|
||||
'show_number' => !empty($new_instance['show_number']) ? 1 : 0,
|
||||
|
||||
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
/**
|
||||
* Singular post pay purchase sidebar card (zibll zib_widget_ui_posts_pay).
|
||||
*
|
||||
* @package AKSRT
|
||||
*/
|
||||
|
||||
namespace AKSRT\Widgets;
|
||||
|
||||
defined('ABSPATH') || exit;
|
||||
|
||||
class WidgetPostPayBox extends \WP_Widget {
|
||||
|
||||
public function __construct() {
|
||||
parent::__construct(
|
||||
'aksrt_post_pay_box',
|
||||
esc_html__('AKSRT 付费购买', 'aksrt'),
|
||||
[
|
||||
'description' => esc_html__('显示当前文章/帖子的付费购买模块,推荐放在详情侧栏。', 'aksrt'),
|
||||
'classname' => 'widget_aksrt_post_pay_box',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string,mixed> $instance
|
||||
*/
|
||||
public static function render_html(array $instance = []): string {
|
||||
if (!is_singular(['post', 'page', 'aksrt_forum_topic', 'aksrt_product'])) {
|
||||
return '';
|
||||
}
|
||||
$post = get_queried_object();
|
||||
if (!$post instanceof \WP_Post) {
|
||||
return '';
|
||||
}
|
||||
if (!function_exists('aksrt_get_pay_meta') || !function_exists('aksrt_is_paid_post')) {
|
||||
return '';
|
||||
}
|
||||
if (!aksrt_is_paid_post($post)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$meta = aksrt_get_pay_meta($post);
|
||||
$pay_type = (string) ($meta['pay_type'] ?? 'no');
|
||||
if ($pay_type === '' || $pay_type === 'no') {
|
||||
return '';
|
||||
}
|
||||
|
||||
$theme = sanitize_html_class((string) ($instance['theme'] ?? 'jb-red'));
|
||||
if ($theme === '') {
|
||||
$theme = 'jb-red';
|
||||
}
|
||||
|
||||
$has_access = function_exists('aksrt_has_paid_access') ? aksrt_has_paid_access($post) : false;
|
||||
$priced = function_exists('aksrt_get_user_pay_price') ? aksrt_get_user_pay_price($post) : null;
|
||||
$pay_modo = is_array($priced) && (($priced['modo'] ?? '') === 'points') ? 'points' : '0';
|
||||
$amount = is_array($priced) ? (float) ($priced['amount'] ?? 0) : (float) ($meta['price'] ?? 0);
|
||||
$currency = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_currency_name() : __('积分', 'aksrt');
|
||||
$cash_symbol = '¥';
|
||||
if (class_exists('\AKSRT\Settings\Settings')) {
|
||||
$paid_s = \AKSRT\Settings\Settings::get_paid_content_settings();
|
||||
$cash_symbol = (string) ($paid_s['display']['currency_symbol'] ?? '¥');
|
||||
}
|
||||
$price_text = $pay_modo === 'points'
|
||||
? (function_exists('aksrt_format_price') ? aksrt_format_price($amount) : (string) $amount) . ' ' . $currency
|
||||
: $cash_symbol . (function_exists('aksrt_format_price') ? aksrt_format_price($amount) : number_format($amount, 2, '.', ''));
|
||||
|
||||
$type_labels = [
|
||||
'reading' => __('付费阅读', 'aksrt'),
|
||||
'download' => __('付费下载', 'aksrt'),
|
||||
'gallery' => __('付费图库', 'aksrt'),
|
||||
'video' => __('付费视频', 'aksrt'),
|
||||
'vip' => __('会员专属', 'aksrt'),
|
||||
];
|
||||
$type_label = $type_labels[$pay_type] ?? __('付费内容', 'aksrt');
|
||||
$cta_map = [
|
||||
'reading' => __('查看内容', 'aksrt'),
|
||||
'download' => __('获取下载', 'aksrt'),
|
||||
'gallery' => __('查看图片', 'aksrt'),
|
||||
'video' => __('查看视频', 'aksrt'),
|
||||
'vip' => __('查看内容', 'aksrt'),
|
||||
];
|
||||
$cta_label = $cta_map[$pay_type] ?? __('查看内容', 'aksrt');
|
||||
|
||||
$sales = 0;
|
||||
if (function_exists('aksrt_get_download_box_meta')) {
|
||||
$box = aksrt_get_download_box_meta($post);
|
||||
$sales = (int) ($box['sales_count'] ?? 0);
|
||||
}
|
||||
|
||||
$login_url = function_exists('aksrt_get_login_url') ? aksrt_get_login_url() : wp_login_url(get_permalink($post));
|
||||
$is_logged_in = is_user_logged_in();
|
||||
$demo = trim((string) ($meta['demo_url'] ?? ''));
|
||||
|
||||
ob_start();
|
||||
echo '<div class="zib-widget pay-box pay-widget aksrt-post-pay-box order-type-' . esc_attr($pay_type) . ($has_access ? ' is-paid' : ' is-unpaid') . '" style="padding:0;">';
|
||||
echo '<badge class="pay-tag abs-center">' . esc_html($type_label) . '</badge>';
|
||||
echo '<div class="relative-h ' . esc_attr($theme) . ' aksrt-post-pay-box__hero">';
|
||||
echo '<div class="absolute radius ' . esc_attr($theme) . ' aksrt-post-pay-box__blob aksrt-post-pay-box__blob--a"></div>';
|
||||
echo '<div class="absolute radius ' . esc_attr($theme) . ' aksrt-post-pay-box__blob aksrt-post-pay-box__blob--b"></div>';
|
||||
echo '<div class="relative box-body text-center">';
|
||||
if ($has_access) {
|
||||
echo '<p class="mt10 mb6"><i class="fa fa-shopping-bag fa-3x" aria-hidden="true"></i></p>';
|
||||
echo '<b class="em14">' . esc_html__('已解锁', 'aksrt') . '</b>';
|
||||
} else {
|
||||
echo '<div class="text-center mt10 aksrt-post-pay-box__price">';
|
||||
if ($amount > 0) {
|
||||
echo '<div class="em14 font-bold">' . esc_html($price_text) . '</div>';
|
||||
} else {
|
||||
echo '<div class="em14 font-bold">' . esc_html__('免费', 'aksrt') . '</div>';
|
||||
}
|
||||
echo '</div>';
|
||||
}
|
||||
echo '</div></div>';
|
||||
|
||||
echo '<div class="box-body">';
|
||||
if ($has_access) {
|
||||
echo '<div class="mt10"><a href="#posts-pay" class="but padding-lg btn-block ' . esc_attr($theme) . '"><i class="fa fa-dot-circle-o fa-fw" aria-hidden="true"></i> ' . esc_html($cta_label) . '</a></div>';
|
||||
} elseif (!$is_logged_in) {
|
||||
echo '<div class="mt10"><a href="' . esc_url($login_url) . '" class="but padding-lg btn-block jb-blue"><i class="fa fa-sign-in" aria-hidden="true"></i> ' . esc_html__('登录后购买', 'aksrt') . '</a></div>';
|
||||
if ($amount > 0 && $pay_modo !== 'points' && function_exists('aksrt_allow_guest_content_pay') && aksrt_allow_guest_content_pay($post)) {
|
||||
echo '<div class="mt10"><button type="button" class="but padding-lg btn-block ' . esc_attr($theme) . '" data-aksrt-pay-content="' . esc_attr((string) $post->ID) . '"><i class="fa fa-shopping-cart fa-fw" aria-hidden="true"></i> ' . esc_html(sprintf(/* translators: price */ __('游客购买(%s)', 'aksrt'), $price_text)) . '</button></div>';
|
||||
}
|
||||
} else {
|
||||
echo '<div class="mt10"><button type="button" class="but padding-lg btn-block ' . esc_attr($theme) . ' cashier-link" data-aksrt-pay-content="' . esc_attr((string) $post->ID) . '"><i class="fa fa-shopping-cart fa-fw" aria-hidden="true"></i> ' . esc_html(sprintf(/* translators: price */ __('立即购买(%s)', 'aksrt'), $price_text)) . '</button></div>';
|
||||
}
|
||||
if ($demo !== '') {
|
||||
echo '<div class="mt10"><a class="but hollow btn-block" href="' . esc_url($demo) . '" target="_blank" rel="noopener noreferrer"><i class="fa fa-external-link" aria-hidden="true"></i> ' . esc_html__('演示地址', 'aksrt') . '</a></div>';
|
||||
}
|
||||
echo '</div>';
|
||||
if ($sales > 0) {
|
||||
echo '<badge class="img-badge hot jb-blue px12">' . esc_html(sprintf(/* translators: sales count */ __('已售 %s', 'aksrt'), (string) $sales)) . '</badge>';
|
||||
}
|
||||
echo '</div>';
|
||||
return (string) ob_get_clean();
|
||||
}
|
||||
|
||||
public function widget($args, $instance): void {
|
||||
$html = self::render_html($instance);
|
||||
if ($html === '') {
|
||||
return;
|
||||
}
|
||||
echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
}
|
||||
|
||||
public function form($instance): void {
|
||||
$theme = sanitize_html_class((string) ($instance['theme'] ?? 'jb-red'));
|
||||
$opts = [
|
||||
'jb-red' => __('红', 'aksrt'),
|
||||
'jb-yellow' => __('橙', 'aksrt'),
|
||||
'jb-blue' => __('蓝', 'aksrt'),
|
||||
'jb-green' => __('绿', 'aksrt'),
|
||||
'jb-purple' => __('紫', 'aksrt'),
|
||||
'jb-vip1' => __('会员金', 'aksrt'),
|
||||
'jb-vip2' => __('会员灰', 'aksrt'),
|
||||
];
|
||||
?>
|
||||
<p class="description"><?php esc_html_e('仅在文章/帖子详情侧栏显示当前内容的付费购买卡。', 'aksrt'); ?></p>
|
||||
<p>
|
||||
<label><?php esc_html_e('色彩主题', 'aksrt'); ?>
|
||||
<select class="widefat" name="<?php echo esc_attr($this->get_field_name('theme')); ?>">
|
||||
<?php foreach ($opts as $k => $label) : ?>
|
||||
<option value="<?php echo esc_attr($k); ?>" <?php selected($theme, $k); ?>><?php echo esc_html($label); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</label>
|
||||
</p>
|
||||
<?php
|
||||
}
|
||||
|
||||
public function update($new_instance, $old_instance): array {
|
||||
$theme = sanitize_html_class((string) ($new_instance['theme'] ?? 'jb-red'));
|
||||
$allowed = ['jb-red', 'jb-yellow', 'jb-blue', 'jb-green', 'jb-purple', 'jb-vip1', 'jb-vip2'];
|
||||
if (!in_array($theme, $allowed, true)) {
|
||||
$theme = 'jb-red';
|
||||
}
|
||||
return ['theme' => $theme];
|
||||
}
|
||||
}
|
||||
@@ -105,47 +105,18 @@ class WidgetProductTab extends \WP_Widget {
|
||||
echo '</div>';
|
||||
} else {
|
||||
echo '<div class="ajaxpager aksrt-product-widget__grid product-lists-row aksrt-product-widget--' . esc_attr($style) . ' is-lazy" data-aksrt-ajaxpager>';
|
||||
echo '<div class="post_ajax_loader" data-aksrt-ajax-loader></div>';
|
||||
echo '<div class="post_ajax_loader" data-aksrt-ajax-loader>';
|
||||
echo '<div class="aksrt-product-tab__skeleton">';
|
||||
for ($si = 0; $si < min(4, $per_page); $si++) {
|
||||
echo '<div class="placeholder-row product-card-placeholder"><div class="placeholder thumb"></div><div class="placeholder k1"></div><div class="placeholder s1"></div></div>';
|
||||
}
|
||||
echo '</div></div>';
|
||||
echo '<div class="ajax-pag hide"><div class="next-page ajax-next"><a href="#"></a></div></div>';
|
||||
echo '</div>';
|
||||
}
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
// Lightweight tab switch + lazy REST load (no inline product HTML duplication).
|
||||
echo '<script>(function(){';
|
||||
echo 'var root=document.currentScript&&document.currentScript.parentElement;if(!root)return;';
|
||||
echo 'var rest=root.getAttribute("data-rest")||"";';
|
||||
echo 'var per=root.getAttribute("data-per-page")||"8";';
|
||||
echo 'var style=root.getAttribute("data-style")||"default";';
|
||||
echo 'var paginate=root.getAttribute("data-paginate")||"ajax";';
|
||||
echo 'function loadPanel(panel,btn){if(!panel||panel.getAttribute("data-loaded")==="1")return;';
|
||||
echo 'var grid=panel.querySelector("[data-aksrt-ajaxpager]");if(!grid||!rest)return;';
|
||||
echo 'var qs=new URLSearchParams({page:"1",per_page:per,style:style,paginate:paginate,';
|
||||
echo 'orderby:btn.getAttribute("data-orderby")||"date",order:"DESC",';
|
||||
echo 'cat_ids:btn.getAttribute("data-cat-ids")||"",tag_ids:btn.getAttribute("data-tag-ids")||"",';
|
||||
echo 'discount_ids:btn.getAttribute("data-discount-ids")||""});';
|
||||
echo 'var url=rest+(rest.indexOf("?")>-1?"&":"?")+qs.toString();';
|
||||
echo 'grid.classList.add("is-ajax-loading");';
|
||||
echo 'fetch(url,{credentials:"same-origin",headers:{Accept:"application/json","X-WP-Nonce":(window.aksrtData&&aksrtData.restNonce)||""}})';
|
||||
echo '.then(function(r){return r.json()}).then(function(j){';
|
||||
echo 'var d=(j&&j.data&&(j.data.data||j.data))||j||{};';
|
||||
echo 'var html=d.html||""; var pag=d.paginate_html||d.paginateHtml||"";';
|
||||
echo 'var loader=grid.querySelector("[data-aksrt-ajax-loader]");';
|
||||
echo 'grid.innerHTML=""; if(html)grid.insertAdjacentHTML("beforeend",html); if(pag)grid.insertAdjacentHTML("beforeend",pag);';
|
||||
echo 'if(loader)grid.appendChild(loader); panel.setAttribute("data-loaded","1"); grid.classList.remove("is-ajax-loading");';
|
||||
echo '}).catch(function(){grid.classList.remove("is-ajax-loading");});}';
|
||||
echo 'root.querySelectorAll(".aksrt-product-tab__header").forEach(function(btn){';
|
||||
echo 'btn.addEventListener("click",function(){';
|
||||
echo 'root.querySelectorAll(".aksrt-product-tab__header").forEach(function(b){b.classList.remove("is-active")});';
|
||||
echo 'root.querySelectorAll(".aksrt-product-tab__panel").forEach(function(p){p.style.display="none"});';
|
||||
echo 'btn.classList.add("is-active");';
|
||||
echo 'var idx=btn.getAttribute("data-tab-index");';
|
||||
echo 'var panel=root.querySelector(\'.aksrt-product-tab__panel[data-tab-index="\'+idx+\'"]\');';
|
||||
echo 'if(panel){panel.style.display="";loadPanel(panel,btn);}';
|
||||
echo '});});';
|
||||
echo '})();</script>';
|
||||
|
||||
echo '</div>';
|
||||
echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user