fix(videoGpt1): normalize seo pages and fallback services

This commit is contained in:
root
2026-04-17 13:02:00 +08:00
parent dd3cbf09cc
commit 56644e7f50
19 changed files with 253 additions and 173 deletions

View File

@@ -18,6 +18,4 @@ $title = $Slot['title_text'] ?? null;
{// ===== Shell + Item ===== }
{include file="module/list/shell/_shell_router" /}
</section>
</section>
</section>

View File

@@ -38,7 +38,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_url ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_url ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</nav>
{/case}
@@ -118,7 +118,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_url ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_url ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</div>
{/case}
@@ -198,7 +198,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_url ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_url ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</footer>
{/case}
@@ -278,7 +278,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_url ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_url ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</section>
{/case}
@@ -358,7 +358,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_url ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_url ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</aside>
{/case}
@@ -438,7 +438,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_url ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_url ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</nav>
{/case}
@@ -518,7 +518,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_url ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_url ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</div>
{/case}
@@ -598,7 +598,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_url ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_url ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</footer>
{/case}
@@ -678,7 +678,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_url ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_url ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</section>
{/case}
@@ -758,7 +758,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_url ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_url ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</aside>
{/case}
@@ -834,4 +834,4 @@
</ol>
</footer>
{/default}
{/switch}
{/switch}

View File

@@ -327,7 +327,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_urll ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_urll ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</div>
@@ -745,7 +745,7 @@
<label>跳到</label>
<input class="{$TpStyle.dom_prefix}-pg-inp" type="number" min="1" max="{$pages}" value="{$page}">
<button class="{$TpStyle.dom_prefix}-pg-btn" type="button"
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);p=Math.max(1,Math.min(max,p));var u='{:$first_urll ?? '#'}';if(!u){return;}u=u.replace(/page\d+$/i,'page'+p);window.location.href=u;})(this)">确定</button>
onclick="(function(btn){var wrap=btn.parentNode;var inp=wrap.querySelector('input');var max=parseInt(wrap.getAttribute('data-pages')||1);var p=parseInt(inp.value||1);var u='{:$first_urll ?? '#'}';p=Math.max(1,Math.min(max,p));if(!u||u==='#'){return;}if(/[?&]page=\\d+/i.test(u)){u=u.replace(/([?&]page=)\\d+/i,'$1'+p);}else if(/[?&]page=\\{page\\}/i.test(u)){u=u.replace(/([?&]page=)\\{page\\}/i,'$1'+p);}else if(/-\\{page\\}(?=$|[?#])/i.test(u)){u=u.replace(/-\\{page\\}(?=$|[?#])/i,'-'+p);}else{u=u.replace(/-(\\d+)(?=$|[?#])/,'-'+p);}window.location.href=u;})(this)">确定</button>
</div>
</div>
@@ -875,4 +875,4 @@
</footer>
{/default}
{/switch}
{/switch}

View File

@@ -4,7 +4,7 @@
{if !empty($arrGrm[$key + [start]])}
{$arrGrm[$key+[start]]|raw}
{/if}
<a href='{site:vurl v_id='$vo.v_id' v_py='$vo.v_name_en'/}'
<a href='{site:vurl v_id='$Video.v_id' v_py='$Video.v_name_en'/}'
title="{$Video.v_name ?? ''} - {$Video.v_parent_category ?? ''}{$Video.v_category ?? ''}免费高清电影在线观看">
<span class='badge
{eq name="$key" value="1"}badge-first {/eq}

View File

@@ -5,7 +5,7 @@
{$arrGrm[$key+[start]]|raw}
{/if}
<a class="stui-vodlist__thumb "
href='{site:vurl v_id='$vo.v_id' v_py='$vo.v_name_en'/}'
href='{site:vurl v_id='$Video.v_id' v_py='$Video.v_name_en'/}'
title="{$Video.v_name ?? ''} - {$Video.v_parent_category ?? ''}{$Video.v_category ?? ''}免费高清电影在线观看"
>
<img class="lazyload-img" src="/static/img/loading.webp" data-src="{site:cfg code='PUBLIC_COVER_DOMAIN' encode='false'/}{$Video.v_pic}"
@@ -15,7 +15,7 @@
</a>
<div class="stui-vodlist__detail">
<h3 class="title text-overflow">
<a href='{site:vurl v_id='$vo.v_id' v_py='$vo.v_name_en'/}'
<a href='{site:vurl v_id='$Video.v_id' v_py='$Video.v_name_en'/}'
title="{$Video.v_name ?? ''} - {$Video.v_parent_category ?? ''}{$Video.v_category ?? ''}免费高清电影在线观看">
{$Video.v_name}
</a>

View File

@@ -4,7 +4,7 @@
{$arrGrm[$key+[start]]|raw}
{/if}
<a class="top-line-dot text-overflow"
href='{site:vurl v_id='$vo.v_id' v_py='$vo.v_name_en'/}'
href='{site:vurl v_id='$Video.v_id' v_py='$Video.v_name_en'/}'
title="{$Video.v_name ?? ''} - {$Video.v_parent_category ?? ''}{$Video.v_category ?? ''}免费高清电影在线观看">
<i class="icon iconfont icon-more pull-right text-muted"></i>
{$Video.v_name}

View File

@@ -36,7 +36,7 @@
{// 社交媒体标签}
<meta property="og:title" content='{site:seotkd code="title" page="category_list" /}' />
<meta property="og:description" content='{site:seotkd code="description" page="category_list" /}' />
<meta property="og:url" content="https://{$DomainModel->d_domain}" />
<meta property="og:url" content='https://{$DomainModel->d_domain}{site:vclurl parent_category="$Request.route.strParentCategory" category="$Request.route.strCategory" page="$Request.route.intPage" /}' />
{switch $Request.route.strParentCategory }
{case 'dian-ying' }
<meta property="og:type" content="video.movie" />
@@ -64,27 +64,13 @@
"@context": "https://schema.org",
"@type": "CollectionPage",
"name": "{$DomainModel->d_name} - 最新{site:getval code="strVideoParentCategoryName" /}推荐",
"url": "https://{$DomainModel->d_domain}",
"url": "https://{$DomainModel->d_domain}{site:vclurl parent_category="$Request.route.strParentCategory" category="$Request.route.strCategory" page="$Request.route.intPage" /}",
"description": "{site:seotkd code="description" page="category_list" /}",
"potentialAction": {
"@type": "SearchAction",
"target": 'https://{$DomainModel->d_domain}{site:vsurl key="search_term_string" p="1"/}",
"query-input": "required name=search_term_string"
}
"hasPart": [
{volist name="resData.data" id="Video" key="key"}
{if $key < 5 }
{
"@type": "VideoObject",
"name": "{$Video.v_name}",
"description": "{$Video.v_description}",
"thumbnailUrl": '{$Video.v_pic}',
"uploadDate": "{:date('Y-m-d')}",
"url": 'https://{$DomainModel->d_domain}{site:vurl v_id="$Video.v_id" v_py="$Video.v_name_en"/}',
},
{/if}
{/volist}
]
},
{
"@context": "https://schema.org",
@@ -109,7 +95,7 @@
"item": "https://{$DomainModel->d_domain}{site:vclurl parent_category="$Request.route.strParentCategory" category="$Request.route.strCategory" page="$Request.route.intPage"}"
}
]
},
}
]
</script>
@@ -130,6 +116,16 @@
{include file="module/list/shell/_shell_router" /}
{video:seocopy scene="category_list"
parent_category="$Request.route.strParentCategory"
category="$Request.route.strCategory"
page="$resData.p_data.page|default=1"
total="$resData.p_data.total|default=0"
pages="$resData.p_data.pages|default=1"
visible="$resData.data|count"
export_name="seoCopy" /}
{include file="module/seo_copy/collection" /}
{// ===== Pagination ===== }
{php}
$pagerArr = $resData['p_data']['pager'] ?? [];
@@ -144,4 +140,4 @@
</main>
{/block}
{/block}

View File

@@ -14,9 +14,9 @@
<meta name="robots" content="index,follow">
<link rel="canonical" href='https://{$DomainModel->d_domain}{site:vciurl parent_category="$Request.route.strParentCategory" /}'>
<meta property="og:title" content='{site:replace code="VIDEO@GETCATEGORYINDEX@TITLE"}' />
<meta property="og:description" content='{site:replace code="VIDEO@GETCATEGORYINDEX@DESCRIPTION"}' />
<meta property="og:url" content="https://{$DomainModel->d_domain}" />
<meta property="og:title" content='{site:seotkd code="title" page="category_index" /}' />
<meta property="og:description" content='{site:seotkd code="description" page="category_index" /}' />
<meta property="og:url" content='https://{$DomainModel->d_domain}{site:vciurl parent_category="$Request.route.strParentCategory" /}' />
{switch $Request.route.strParentCategory }
{case 'dian-ying' }
<meta property="og:type" content="video.movie" />
@@ -39,37 +39,17 @@
<script type="application/ld+json">
[
{
"@context": "https://schema.org",
"@type": "CollectionPage",
"name": "{$DomainModel->d_name} - 最新{site:getval code="strVideoParentCategoryName" /}推荐",
"url": "https://{$DomainModel->d_domain}",
"description": "{site:replace code="VIDEO@GETCATEGORYINDEX@DESCRIPTION"}",
"url": "https://{$DomainModel->d_domain}{site:vciurl parent_category="$Request.route.strParentCategory" /}",
"description": "{site:seotkd code='description' page='category_index' /}",
"potentialAction": {
"@type": "SearchAction",
"target": 'https://{$DomainModel->d_domain}{site:vsurl key="search_term_string" p="1"/}",
"query-input": "required name=search_term_string"
}
"hasPart": [
{video:ranklist count="5"
v_parent_category_en="$Request.route.strParentCategory"
sort_type="weekly"
d_key="key" d_val="Video" cache_life="3600"}
{if $key < 5 }
{
"@type": "VideoObject",
"name": "{$Video.v_name}",
"description": "{$Video.v_description}",
"thumbnailUrl": '{$Video.v_pic}',
"uploadDate": "{:date('Y-m-d')}",
"url": 'https://{$DomainModel->d_domain}{site:vurl v_id="$Video.v_id" v_py="$Video.v_name_en"/}',
},
{/if}
{/video:ranklist}
]
},
{
"@context": "https://schema.org",
@@ -88,7 +68,7 @@
"item": "https://{$DomainModel->d_domain}{site:vciurl parent_category="$Request.route.strParentCategory" /}"
}
]
},
}
]
</script>
{/block}
@@ -170,6 +150,10 @@
{/video:categorytype}
{video:seocopy scene="category_index"
parent_category="$Request.route.strParentCategory"
export_name="seoCopy" /}
{include file="module/seo_copy/collection" /}
</main>
@@ -178,4 +162,4 @@
{block name="customize"}
{/block}
{/block}

View File

@@ -11,6 +11,15 @@
{block name="head"}
<meta name="robots" content="index,follow">
<link rel="canonical" href='https://{$DomainModel->d_domain}{site:vciurl parent_category="$Request.route.strParentCategory" /}'>
<meta property="og:title" content='{site:seotkd code="title" page="category_home" /}' />
<meta property="og:description" content='{site:seotkd code="description" page="category_home" /}' />
<meta property="og:url" content="https://{$DomainModel->d_domain}" />
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content='{site:seotkd code="title" page="category_home" /}'>
<meta name="twitter:description" content='{site:seotkd code="description" page="category_home" /}'>
{/block}
@@ -44,4 +53,4 @@
{/block}
{block name="customize"}
{/block}
{/block}

View File

@@ -5,20 +5,28 @@
{/block}
{block name="title"}{site:seotkd code="title" page="rank_index" /}{/block}
{block name="keywords"}{site:seotkd code="keywords" page="rank_index" /}{/block}
{block name="keywords"}{php}
$strRankKeywords = trim((string)($DomainModel->d_keywords ?: $DomainModel->d_name));
$strRankKeywords = $strRankKeywords !== ''
? $strRankKeywords . ',热门榜单,视频排行'
: trim((string)$DomainModel->d_name) . ',热门榜单,视频排行';
{/php}{$strRankKeywords}{/block}
{block name="description"}{site:seotkd code="description" page="rank_index" /}{/block}
{block name="head"}
{php}
$strRankCanonicalUrl = 'https://' . $DomainModel->d_domain . $strRankUrlTemp;
{/php}
<meta name="robots" content="index,follow">
<link rel="canonical" href='https://{$DomainModel->d_domain}{$strRankUrlTemp}'>
<link rel="canonical" href='{$strRankCanonicalUrl}'>
{// 社交媒体标签}
<meta property="og:title" content='{site:seotkd code="title" page="rank_index" /}' />
<meta property="og:description" content='{site:seotkd code="description" page="rank_index" /}' />
<meta property="og:url" content="https://{$DomainModel->d_domain}" />
<meta property="og:type" content="video.movie" />
<meta property="og:url" content="{$strRankCanonicalUrl}" />
<meta property="og:type" content="website" />
<script type="application/ld+json">
[
@@ -27,7 +35,7 @@
"@context": "https://schema.org",
"@type": "CollectionPage",
"name": "{$DomainModel->d_name} - 最新排行榜推荐",
"url": "https://{$DomainModel->d_domain}",
"url": "{$strRankCanonicalUrl}",
"headline": '{site:seotkd code="title" page="rank_index" /}',
"description": '{site:seotkd code="description" page="rank_index" /}',
"potentialAction": {
@@ -35,24 +43,6 @@
"target": 'https://{$DomainModel->d_domain}{site:vsurl key="search_term_string" p="1"/}",
"query-input": "required name=search_term_string"
}
"hasPart": [
{video:ranklist count="5"
sort_type="weekly"
d_key="key" d_val="Video" cache_life="3600"}
{if $key < 10 }
{
"@type": "VideoObject",
"name": "{$Video.v_name}",
"description": "{$Video.v_description}",
"thumbnailUrl": '{$Video.v_pic}',
"uploadDate": "{:date('Y-m-d')}",
"url": 'https://{$DomainModel->d_domain}{site:vurl v_id="$Video.v_id" v_py="$Video.v_name_en"/}',
},
{/if}
{/video:ranklist}
]
},
{
"@context": "https://schema.org",
@@ -71,7 +61,7 @@
"item": "https://{$DomainModel->d_domain}{$strRankUrlTemp}"
}
]
},
}
]
</script>
@@ -105,6 +95,9 @@
{include file="module/list/shell/_shell_router" /}
{/foreach}
{video:seocopy scene="rank_index" export_name="seoCopy" /}
{include file="module/seo_copy/collection" /}
</section>
{/block}
@@ -113,4 +106,4 @@
{block name="customize"}
{/block}
{/block}

View File

@@ -12,19 +12,35 @@ p_val="page_data" button_num="10" cache_life="3600" export_name="arrVideoRankLis
{site:grm page_code="h5_rank_list_type" diff="$Request.route.intPage" num="100" g_key="arrGrm" /}
{site:helper func="initVideoRankListTKD" /}
{php}
$strRankListKeywordsBase = trim((string)($DomainModel->d_keywords ?: $DomainModel->d_name));
$strRankListKeywordsOrder = trim((string)($strOrderName ?? '热门'));
$strRankListKeywords = $strRankListKeywordsBase !== ''
? $strRankListKeywordsBase . ',' . $strRankListKeywordsOrder . '榜单,视频排行'
: trim((string)$DomainModel->d_name) . ',' . $strRankListKeywordsOrder . '榜单,视频排行';
$strRankListDescCategory = trim((string)(\app\model\ConverterMovel::getVal('strVideoParentCategoryName') ?? '影视'));
if ($strRankListDescCategory === '') {
$strRankListDescCategory = '影视';
}
$strRankListDescOrder = $strRankListKeywordsOrder !== '' ? $strRankListKeywordsOrder : '热门';
$strRankListDescription = trim((string)$DomainModel->d_name) . '整理' . $strRankListDescOrder . $strRankListDescCategory . '榜单入口,方便继续查看热度内容、详情页与播放页。';
{/php}
{/block}
{block name="title"}{site:seotkd code="title" page="rank_list" /}{/block}
{block name="keywords"}{site:seotkd code="title" page="rank_list" /}{/block}
{block name="description"}{site:seotkd code="title" page="rank_list" /}{/block}
{block name="keywords"}{$strRankListKeywords}{/block}
{block name="description"}{$strRankListDescription}{/block}
{block name="head"}
<meta name="robots" content="index,follow">
<link rel="canonical" href='https://{$DomainModel->d_domain}{site:vrlurl parent_category="$Request.route.strParentCategory" category="$Request.route.strCategory" sort_type="$Request.route.strSortType" page="1"/}'>
{// 社交媒体标签}
<meta property="og:title" content='{site:seotkd code="title" page="rank_list" /}' />
<meta property="og:description" content='{site:seotkd code="title" page="rank_list" /}' />
<meta property="og:url" content="https://{$DomainModel->d_domain}" />
<meta property="og:description" content='{$strRankListDescription}' />
<meta property="og:url" content='https://{$DomainModel->d_domain}{site:vrlurl parent_category="$Request.route.strParentCategory" category="$Request.route.strCategory" sort_type="$Request.route.strSortType" page="1"/}' />
<meta property="og:type" content="video.movie" />
@@ -35,30 +51,14 @@ p_val="page_data" button_num="10" cache_life="3600" export_name="arrVideoRankLis
"@context": "https://schema.org",
"@type": "CollectionPage",
"name": "{$DomainModel->d_name} - 最新排行榜推荐",
"url": "https://{$DomainModel->d_domain}",
"url": "https://{$DomainModel->d_domain}{site:vrlurl parent_category="$Request.route.strParentCategory" category="$Request.route.strCategory" sort_type="$Request.route.strSortType" page="1"/}",
"headline": '{site:seotkd code="title" page="rank_list" /}',
"description": '{site:seotkd code="title" page="rank_list" /}',
"description": '{$strRankListDescription}',
"potentialAction": {
"@type": "SearchAction",
"target": 'https://{$DomainModel->d_domain}{site:vsurl key="search_term_string" p="1"/}",
"query-input": "required name=search_term_string"
}
"hasPart": [
{volist name="arrVideoRankList" id="Video" key="key"}
{if $key < 10 }
{
"@type": "VideoObject",
"name": "{$Video.v_name}",
"description": "{$Video.v_description}",
"thumbnailUrl": '{$Video.v_pic}',
"uploadDate": "{:date('Y-m-d')}",
"url": 'https://{$DomainModel->d_domain}{site:vurl v_id='$vo.v_id' v_py='$vo.v_name_en'/}',
},
{/if}
{/volist}
]
},
{
"@context": "https://schema.org",
@@ -83,7 +83,7 @@ p_val="page_data" button_num="10" cache_life="3600" export_name="arrVideoRankLis
"item": "https://{$DomainModel->d_domain}{site:vrlurl parent_category="$Request.route.strParentCategory" category="$Request.route.strCategory" sort_type="$Request.route.strSortType" page="1"/}"
}
]
},
}
]
</script>
@@ -129,6 +129,17 @@ p_val="page_data" button_num="10" cache_life="3600" export_name="arrVideoRankLis
</h1>
<h4 class="view-description">{site:replace code="VIDEO@GETVIDEORANKLIST@TEXT"}</h4>
{video:seocopy scene="rank_list"
sort_type="$Request.route.strSortType"
parent_category="$Request.route.strParentCategory"
category="$Request.route.strCategory"
page="1"
total="0"
pages="1"
visible="$arrVideoRankList|count"
export_name="seoCopy" /}
{include file="module/seo_copy/collection" /}
<div class="row">
<div class="stui-pannel stui-pannel-bg clearfix">
<div class="stui-pannel-box">
@@ -200,4 +211,4 @@ p_val="page_data" button_num="10" cache_life="3600" export_name="arrVideoRankLis
{/block}
{block name="customize"}
{/block}
{/block}

View File

@@ -18,20 +18,27 @@ p_val="page_data" button_num="5" cache_life="3600" func="generateSearchPager" ex
{block name="description"}{site:seotkd code="description" page="search" /}{/block}
{block name="head"}
{php}
$strSearchKeyword = trim((string)($Request->get('keyword', '')));
$urlBuilder = new \app\common\helper\UrlBuilder($TpStyle);
$strSearchCanonicalUrl = $strSearchKeyword !== ''
? 'https://' . $DomainModel->d_domain . $urlBuilder->searchResult($strSearchKeyword)
: 'https://' . $DomainModel->d_domain;
{/php}
<meta name="robots" content="index,follow">
<link rel="canonical" href='https://{$DomainModel->d_domain}{site:vsurl key="$Request.get.keyword" p="1"/}'>
<link rel="canonical" href='{$strSearchCanonicalUrl}'>
<meta property="og:title" content='{site:seotkd code="title" page="search" /}'>
<meta property="og:description" content='{site:seotkd code="description" page="search" /}'>
<meta property="og:url" content='https://{$DomainModel->d_domain}{site:vsurl key="search_term_string" p="1"/}'>
<meta property="og:url" content='{$strSearchCanonicalUrl}'>
<meta property="og:type" content="website">
<meta property="og:site_name" content='{$DomainModel->d_name}'>
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content='{site:seotkd code="title" page="search" /}'>
<meta name="twitter:description" content='{site:seotkd code="description" page="search" /}'>
<meta name="twitter:image:alt" content="动作电影 搜索结果第1页">
<meta name="twitter:image:alt" content="{if $strSearchKeyword !== ''}{$strSearchKeyword|raw} 搜索结果第{$resData.p_data.page|default=1}页{else/}{$DomainModel->d_name|raw} 搜索结果{/if}">
{// 结构化数据}
<script type="application/ld+json">
@@ -41,7 +48,7 @@ p_val="page_data" button_num="5" cache_life="3600" func="generateSearchPager" ex
"name": "{$DomainModel->d_name}",
"url": "https://{$DomainModel->d_domain}",
"alternateName": "{$DomainModel->d_domain}",
"description": "{site:replace code="VIDEO@INDEX@INDEX@DESCRIPTION"}",
"description": "{site:seotkd code='description' page='home' /}",
"potentialAction": {
"@type": "SearchAction",
"target": 'https://{$DomainModel->d_domain}{site:vsurl key="search_term_string" p="1"/}',
@@ -52,41 +59,9 @@ p_val="page_data" button_num="5" cache_life="3600" func="generateSearchPager" ex
{
"@type": "CollectionPage",
"name": "{$DomainModel->d_name} - {$DomainModel->d_logo_text}",
"url": "https://{$DomainModel->d_domain}",
"url": "{$strSearchCanonicalUrl}",
"alternateName": "{$DomainModel->d_domain}",
"description": '{site:seotkd code="description" page="search" /}',
"mainEntity": {
"@type": "ItemList",
"itemListElement": [
{volist name="resData.data" id="Video" key="key"}
{if $key < 5 }
{
"@type": "ListItem",
"position": {$key},
"item": {
"@type": "Movies",
"name": "{$Video.v_name}",
"url": 'https://{$DomainModel->d_domain}{site:vurl v_id="$Video.v_id" v_py="$Video.v_name_en"/}',
"description": "{$Video.v_description}",
"actor": [
{foreach $Video.v_actor as $strActorKey=>$strActor }
{if $strActorKey < 5 }
{ "@type": "Person", "name": "{$strActor}" },
{/if}
{/foreach}
],
"numberOfEpisodes": {$Video.v_play_url|count},
"image": "{$Video.v_pic}",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "{$Video.v_score}",
}
}
},
{/if}
{/volist}
]
}
"description": '{site:seotkd code="description" page="search" /}'
}
]
</script>
@@ -112,6 +87,14 @@ p_val="page_data" button_num="5" cache_life="3600" func="generateSearchPager" ex
{assign name="__LIST__" value="$resData.data"}
{include file="module/list/shell/_shell_router" /}
{video:seocopy scene="search"
keyword="$Request.get.keyword"
page="$resData.p_data.page|default=1"
total="$resData.p_data.total|default=0"
pages="$resData.p_data.pages|default=1"
visible="$resData.data|count"
export_name="seoCopy" /}
{include file="module/seo_copy/collection" /}
{// ===== Pagination ===== }
{php}
@@ -129,4 +112,4 @@ $pagerCfg = $TpStyle['template_cfg']['components']['pager'] ?? [];
{/block}
{block name="customize"}
{/block}
{/block}

View File

@@ -3,9 +3,9 @@
{block name="get-data"}
{if $Request.route.intVId && $Request.route.intVForgeId}
{video:info v_id="$Request.route.intVId" v_key="arrVideo" v_fid="$Request.route.intVForgeId" export_name="arrVideo"/}
{elseif $Request.route.intVId}
{video:info v_id="$Request.route.intVId" v_key="arrVideo" export_name="arrVideo"/}
{video:info v_id="$Request.route.intVId" v_pinyin="$Request.route.strPinyin" v_key="arrVideo" v_fid="$Request.route.intVForgeId" export_name="arrVideo"/}
{elseif $Request.route.intVId || $Request.route.strPinyin}
{video:info v_id="$Request.route.intVId" v_pinyin="$Request.route.strPinyin" v_key="arrVideo" export_name="arrVideo"/}
{else}
{video:info v_id="$DomainModel->info_id" n_key="arrVideo" export_name="arrVideo" /}
{/if}
@@ -26,11 +26,11 @@
{/block}
{block name="title"}{if $DomainModel->info_id == $Request.route.intVId || empty($Request.route.intVId)}{site:replace code="VIDEO@INDEX@INDEX@TITLE" /}{else/}{site:seotkd code="title" page="detail" /}{/if}{/block}
{block name="title"}{if !empty($arrVideo.v_id) && ((int)$arrVideo.v_id !== (int)$DomainModel->info_id || !empty($Request.route.strPinyin))}{site:seotkd code="title" page="detail" /}{else/}{site:seotkd code="title" page="home" /}{/if}{/block}
{block name="keywords"}{if $DomainModel->info_id == $Request.route.intVId || empty($Request.route.intVId)}{site:replace code="VIDEO@INDEX@INDEX@KEYWORDS" /}{else/}{site:seotkd code="keywords" page="detail" /}{/if}{/block}
{block name="keywords"}{if !empty($arrVideo.v_id) && ((int)$arrVideo.v_id !== (int)$DomainModel->info_id || !empty($Request.route.strPinyin))}{site:seotkd code="keywords" page="detail" /}{else/}{site:seotkd code="keywords" page="home" /}{/if}{/block}
{block name="description"}{if $DomainModel->info_id == $Request.route.intVId || empty($Request.route.intVId)}{site:replace code="VIDEO@INDEX@INDEX@DESCRIPTION" /}{else/}{site:seotkd code="description" page="detail" /}{/if}{/block}
{block name="description"}{if !empty($arrVideo.v_id) && ((int)$arrVideo.v_id !== (int)$DomainModel->info_id || !empty($Request.route.strPinyin))}{site:seotkd code="description" page="detail" /}{else/}{site:seotkd code="description" page="home" /}{/if}{/block}
{block name="head"}

View File

@@ -369,6 +369,41 @@ class VideoCategoryModel extends MongoModel
return self::$arrCategory;
}
/**
* Resolve category display name by slug.
*/
static public function getNameBySlug(string $strSlug): string
{
$strSlug = trim($strSlug);
if ($strSlug === '') {
return '';
}
if (isset(self::$arrCategory[$strSlug])) {
return (string)self::$arrCategory[$strSlug];
}
foreach (self::getCustomCategory() as $arrParentCategory) {
if (!is_array($arrParentCategory)) {
continue;
}
if ((string)($arrParentCategory['v_category_en'] ?? '') === $strSlug) {
return trim((string)($arrParentCategory['v_category'] ?? ''));
}
foreach ((array)($arrParentCategory['children'] ?? []) as $arrChildCategory) {
if ((string)($arrChildCategory['v_category_en'] ?? '') !== $strSlug) {
continue;
}
return trim((string)($arrChildCategory['v_category'] ?? ''));
}
}
return '';
}
/**
* get pinyin based on chinese characters
*

View File

@@ -145,6 +145,20 @@ class VideoModel extends MongoModel
}
}
/**
* Compatibility wrapper for callers that expect a sorted cached query helper.
*/
public function findManySortedWithCache(
array $arrFilter,
int $intCount = 0,
array $arrSort = [],
string $strKey = '',
int $intLifeTime = 24 * 3600,
array $arrOptions = []
): null|array {
return $this->findManyWithCache($arrFilter, $intCount, $arrSort, $arrOptions, $strKey, $intLifeTime);
}
/**
* find one Video
*
@@ -179,6 +193,16 @@ class VideoModel extends MongoModel
return $this->findOne($arrFilter);
}
public function getVideoByNameEn(string $strNameEn): null|array
{
$strNameEn = trim($strNameEn);
if ($strNameEn === '') {
return null;
}
return $this->findOne(['v_name_en' => $strNameEn]);
}
/**
* 查询符合条件的随机多条小说

View File

@@ -909,6 +909,12 @@ class SiteContext
protected function normalizeSeoKeywords(string $strValue): string
{
$strSanitized = @iconv('UTF-8', 'UTF-8//IGNORE', $strValue);
if ($strSanitized !== false) {
$strValue = $strSanitized;
}
$strValue = str_replace("\u{FFFD}", '', $strValue);
$strValue = preg_replace('/排<>+/u', '排行', $strValue) ?? $strValue;
$strValue = str_replace(['', '、', ';', '', '|', ''], ',', $strValue);
$arrRawParts = preg_split('/\s*,\s*/u', $strValue) ?: [];
$arrNoiseSuffixes = [
@@ -933,6 +939,7 @@ class SiteContext
'疗愈力',
'英雄塑造',
'人性挖掘',
'隐喻意义',
];
$arrStopWords = [
'在线',
@@ -970,6 +977,10 @@ class SiteContext
}
$strPart = trim($strPart, " \t\n\r\0\x0B-_|,。;、,;");
$strPart = preg_replace('/排<>+/u', '排行', $strPart) ?? $strPart;
if (preg_match('/榜排$/u', $strPart) || preg_match('/视频排$/u', $strPart)) {
$strPart .= '行';
}
if (in_array($strPart, $arrStopWords, true)) {
continue;
@@ -994,6 +1005,14 @@ class SiteContext
return '';
}
$strSanitized = @iconv('UTF-8', 'UTF-8//IGNORE', $strValue);
if ($strSanitized !== false) {
$strValue = $strSanitized;
}
$strValue = str_replace("\u{FFFD}", '', $strValue);
$strValue = preg_replace('/排<>+/u', '排行', $strValue) ?? $strValue;
$strSiteName = trim((string)($this->DomainModel->d_name ?? ''));
$strSiteKeywords = trim((string)(ConverterMovel::getVal('strSiteKeywords') ?? ''));
$strVideoName = trim((string)(ConverterMovel::getVal('strVideoName') ?? ''));
@@ -1019,6 +1038,9 @@ class SiteContext
'的叙事模型',
'的英雄之旅',
'的成长母题',
'的精神内核',
'的文化符号',
'的隐喻意义',
];
$strValue = str_replace($arrNoisePhrases, '', $strValue);
@@ -1044,6 +1066,18 @@ class SiteContext
$boolDescriptionLooksWeak = true;
}
if (preg_match('/精神内核|文化符号|隐喻意义|叙事模型|英雄之旅|成长母题/u', $strValue)) {
$boolDescriptionLooksWeak = true;
}
if ($strPage === 'play' && preg_match('/解析/u', $strValue)) {
$boolDescriptionLooksWeak = true;
}
if ($strPage === 'play' && mb_strlen($strValue) > 80) {
$boolDescriptionLooksWeak = true;
}
if ($boolDescriptionLooksWeak) {
return $this->buildSeoDescriptionFallback($strPage, $strSiteName, $strVideoName, $strVideoCategoryName);
}

View File

@@ -376,6 +376,21 @@ class VideoService
$arrFilter['v_parent_category_en'],
);
if (empty($arrVideo) || !is_array($arrVideo)) {
$arrVideo = $this->getVideoList([
'count' => $intCount,
'v_category_en' => $arrFilter['v_category_en'] ?? 'all',
'v_parent_category_en' => $arrFilter['v_parent_category_en'] ?? 'all',
'v_lang_en' => 'all',
'v_area_en' => 'all',
'v_year' => 'all',
'sort_type' => 'news',
'v_status' => $strVStatus,
'diff_key' => $strDiffKey !== '' ? $strDiffKey . ':rank_fallback' : 'rank_fallback',
'cache_life' => $intCacheLifeTime,
]);
}
return $arrVideo;
}
@@ -1180,11 +1195,9 @@ class VideoService
$arrPageKeys = $this->buildSeoCopyPageKeys($strScene, $arrOptions);
if ($this->shouldSuppressDefaultOnlySeoCopy($strScene, $strHost, $arrPageKeys)) {
return [];
}
$boolSuppressDefaultOnlySeoCopy = $this->shouldSuppressDefaultOnlySeoCopy($strScene, $strHost, $arrPageKeys);
$arrData = !empty($arrPageKeys)
$arrData = (!$boolSuppressDefaultOnlySeoCopy && !empty($arrPageKeys))
? SeoCopyStore::getPreferredPageData($strHost, $strScene, $arrPageKeys)
: [];