niki-til

<h1 class="admin-page-title">キーワード</h1>

{% assign keywords = site.data.dashboard.keywords %} {% if keywords and keywords.size > 0 %}

<div class="admin-table-wrap"> <table class="admin-table" id="kw-table"> <thead> <tr> <th data-sort="0">キーワード</th> <th data-sort="1">クラスター</th> <th data-sort="2">検索意図</th> <th data-sort="3">対象記事</th> <th data-sort="4">順位</th> <th data-sort="5">表示数</th> <th data-sort="6">CTR</th> <th data-sort="7">ステータス</th> <th>メモ</th> </tr> </thead> <tbody> {% for kw in keywords %} <tr> <td>{{ kw.keyword | default: "—" }}</td> <td>{{ kw.cluster | default: "—" }}</td> <td>{{ kw.intent | default: "—" }}</td> <td> {% if kw.target_page and kw.target_page != "" %} <a href="{{ kw.target_page | relative_url }}" style="font-family:var(--font-family-mono);font-size:12px;">{{ kw.target_page }}</a> {% else %}—{% endif %} </td> <td class="td-mono">{{ kw.current_rank | default: "—" }}</td> <td class="td-mono">{{ kw.impressions | default: "0" }}</td> <td class="td-mono"> {% if kw.ctr %}{{ kw.ctr | times: 100 | round: 1 }}%{% else %}—{% endif %} </td> <td> {% assign st = kw.status | default: "candidate" %} {% if st == "target" or st == "candidate" %} <span class="badge badge--candidate">候補</span> {% elsif st == "live" %} <span class="badge badge--live">公開済み</span> {% elsif st == "won" or st == "ranked" %} <span class="badge badge--ranked">順位獲得</span> {% elsif st == "paused" %} <span class="badge badge--paused">一時停止</span> {% else %} <span class="badge badge--candidate">{{ st }}</span> {% endif %} </td> <td style="font-size:12px;color:var(--color-fg-muted);">{{ kw.note | default: "" }}</td> </tr> {% endfor %} </tbody> </table> </div>

<script defer> (function() { var table = document.getElementById('kw-table'); if (!table) return; var headers = table.querySelectorAll('th[data-sort]'); var sortDir = {}; headers.forEach(function(th) { var colIdx = parseInt(th.getAttribute('data-sort'), 10); th.addEventListener('click', function() { var asc = !sortDir[colIdx]; sortDir = {}; sortDir[colIdx] = asc; var tbody = table.querySelector('tbody'); var rows = Array.from(tbody.querySelectorAll('tr')); rows.sort(function(a, b) { var av = a.cells[colIdx] ? a.cells[colIdx].textContent.trim() : ''; var bv = b.cells[colIdx] ? b.cells[colIdx].textContent.trim() : ''; var an = parseFloat(av), bn = parseFloat(bv); if (!isNaN(an) && !isNaN(bn)) return asc ? an - bn : bn - an; return asc ? av.localeCompare(bv, 'ja') : bv.localeCompare(av, 'ja'); }); rows.forEach(function(r) { tbody.appendChild(r); }); }); }); })(); </script>

{% else %} <div class="admin-empty"> キーワードデータなし。<code>_data/dashboard.json</code> を生成してください。 </div> {% endif %}