fix(videoGpt1): normalize seo pages and fallback services
This commit is contained in:
@@ -18,6 +18,4 @@ $title = $Slot['title_text'] ?? null;
|
||||
{// ===== Shell + Item ===== }
|
||||
{include file="module/list/shell/_shell_router" /}
|
||||
|
||||
</section>
|
||||
|
||||
</section>
|
||||
@@ -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}
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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'] ?? [];
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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"}
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询符合条件的随机多条小说
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
: [];
|
||||
|
||||
|
||||
@@ -1,30 +1,30 @@
|
||||
<?php
|
||||
return [
|
||||
[
|
||||
'为您提供《{strVideoName}》高清高清播放服务,包含剧情简介、演员信息({strVideoActor})与导演({strVideoDirector}),支持快速选集与流畅播放。',
|
||||
'为您提供《{strVideoName}》高清播放服务,包含剧情简介、演员信息({strVideoActor})与导演({strVideoDirector}),支持快速选集与流畅播放。',
|
||||
'《{strVideoName}》({strYear}){strVideoCategoryName},{strAreaName}{strLangName}。执导:{strVideoDirector},演员:{strVideoActor}。内容简介:{strVideoDescription}。在{strSiteName}支持在线点播与多端访问。',
|
||||
'《{strVideoName}》({strYear}){strVideoCategoryName},{strAreaName}{strLangName}。执导:{strVideoDirector},演员:{strVideoActor}。内容简介:{strVideoDescription}。在{strSiteName}支持在线播放与多端访问。',
|
||||
'{strVideoName}由{strVideoDirector}导演,{strVideoActor}演员参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清高清播放、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'{strVideoName}由{strVideoDirector}导演,{strVideoActor}演员参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清播放、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'为您提供《{strVideoName}》高清在线播放服务,包含精彩看点、演员信息({strVideoActor})与导演({strVideoDirector}),支持快速选集与流畅播放。',
|
||||
'为您提供《{strVideoName}》高清高清播放服务,包含精彩看点、演员信息({strVideoActor})与导演({strVideoDirector}),支持快速选集与流畅播放。',
|
||||
'为您提供《{strVideoName}》高清播放服务,包含精彩看点、演员信息({strVideoActor})与导演({strVideoDirector}),支持快速选集与流畅播放。',
|
||||
'《{strVideoName}》({strYear}){strVideoCategoryName},{strAreaName}{strLangName}。执导:{strVideoDirector},主演:{strVideoActor}。精彩看点:{strVideoDescription}。在{strSiteName}支持在线播放与多端访问。',
|
||||
'{strVideoName}由{strVideoDirector}导演,{strVideoActor}主演参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清在线点播、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'为您提供《{strVideoName}》高清高清播放服务,包含内容简介、演员信息({strVideoActor})与导演({strVideoDirector}),支持快速选集与流畅播放。',
|
||||
'为您提供《{strVideoName}》高清播放服务,包含内容简介、演员信息({strVideoActor})与导演({strVideoDirector}),支持快速选集与流畅播放。',
|
||||
'为您提供《{strVideoName}》高清在线点播服务,包含内容简介、演员信息({strVideoActor})与导演({strVideoDirector}),支持快速选集与流畅播放。',
|
||||
'《{strVideoName}》({strYear}){strVideoCategoryName},{strAreaName}{strLangName}。执导:{strVideoDirector},演员:{strVideoActor}。精彩看点:{strVideoDescription}。在{strSiteName}支持高清播放与多端访问。',
|
||||
'{strVideoName}由{strVideoDirector}执导,{strVideoActor}主演参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清在线点播、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'《{strVideoName}》({strYear}){strVideoCategoryName},{strAreaName}{strLangName}。执导:{strVideoDirector},主演:{strVideoActor}。精彩看点:{strVideoDescription}。在{strSiteName}支持高清播放与多端访问。',
|
||||
'为您提供《{strVideoName}》高清在线播放服务,包含内容简介、演员信息({strVideoActor})与导演({strVideoDirector}),支持快速选集与流畅播放。',
|
||||
'{strVideoName}由{strVideoDirector}导演,{strVideoActor}主演参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清高清播放、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'{strVideoName}由{strVideoDirector}导演,{strVideoActor}主演参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清播放、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'{strVideoName}由{strVideoDirector}导演,{strVideoActor}演员参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清在线播放、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'{strVideoName}由{strVideoDirector}执导,{strVideoActor}演员参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清在线播放、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'{strVideoName}由{strVideoDirector}执导,{strVideoActor}演员参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清高清播放、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'{strVideoName}由{strVideoDirector}执导,{strVideoActor}演员参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清播放、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'{strVideoName}由{strVideoDirector}执导,{strVideoActor}主演参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清在线播放、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'《{strVideoName}》({strYear}){strVideoCategoryName},{strAreaName}{strLangName}。导演:{strVideoDirector},主演:{strVideoActor}。剧情简介:{strVideoDescription}。在{strSiteName}支持在线点播与多端访问。',
|
||||
'为您提供《{strVideoName}》高清在线点播服务,包含精彩看点、演员信息({strVideoActor})与导演({strVideoDirector}),支持快速选集与流畅播放。',
|
||||
'{strVideoName}由{strVideoDirector}导演,{strVideoActor}演员参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清在线点播、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'《{strVideoName}》({strYear}){strVideoCategoryName},{strAreaName}{strLangName}。执导:{strVideoDirector},演员:{strVideoActor}。剧情简介:{strVideoDescription}。在{strSiteName}支持在线播放与多端访问。',
|
||||
'{strVideoName}由{strVideoDirector}执导,{strVideoActor}主演参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清高清播放、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'{strVideoName}由{strVideoDirector}执导,{strVideoActor}主演参演,类型为{strVideoParentCategoryName}/{strVideoCategoryName}。提供高清播放、剧情介绍与相关推荐,尽在{strSiteName}。',
|
||||
'《{strVideoName}》({strYear}){strVideoCategoryName},{strAreaName}{strLangName}。导演:{strVideoDirector},演员:{strVideoActor}。内容简介:{strVideoDescription}。在{strSiteName}支持在线点播与多端访问。',
|
||||
'《{strVideoName}》({strYear}){strVideoCategoryName},{strAreaName}{strLangName}。导演:{strVideoDirector},演员:{strVideoActor}。内容简介:{strVideoDescription}。在{strSiteName}支持高清播放与多端访问。',
|
||||
'《{strVideoName}》({strYear}){strVideoCategoryName},{strAreaName}{strLangName}。导演:{strVideoDirector},演员:{strVideoActor}。精彩看点:{strVideoDescription}。在{strSiteName}支持高清播放与多端访问。',
|
||||
|
||||
@@ -7,7 +7,7 @@ return [
|
||||
'《{strVideoName}》在线播放页面:第{intPlayIndex}集,免费观看,播放稳定流畅,支持手机与电脑访问。',
|
||||
'《{strVideoName}》在线播放页面:第{intPlayIndex}集,无需注册观看,播放稳定流畅,支持手机与电脑访问。',
|
||||
'正在播放《{strVideoName}》第{intPlayIndex}集,支持高清在线点播与快速选集。更多{strVideoCategoryName}内容与相关推荐尽在{strSiteName}。',
|
||||
'正在播放《{strVideoName}》第{intPlayIndex}集,支持高清高清播放与快速选集。更多{strVideoCategoryName}内容与相关推荐尽在{strSiteName}。',
|
||||
'正在播放《{strVideoName}》第{intPlayIndex}集,支持高清播放与快速选集。更多{strVideoCategoryName}内容与相关推荐尽在{strSiteName}。',
|
||||
'{strSiteName}提供{strVideoName} 第{intVideoPlaySort}集免费播放,{strVideoDescription},主演{strVideoActor},{strSiteKeywords},访问{strSiteDomain}!',
|
||||
'畅享{strVideoName} 第{intVideoPlaySort}集高清,{strVideoDescription},{strVideoDirector}执导,{strSiteKeywords},立即访问{strSiteDomain}!',
|
||||
'{strSiteName}献上{strVideoName} 第{intVideoPlaySort}集,{strVideoDescription},{strVideoActor}主演{strVideoCategoryName},{strSiteKeywords},访问{strSiteDomain}!',
|
||||
|
||||
Reference in New Issue
Block a user