Changeset 6623453 in Klonkt


Ignore:
Timestamp:
06/18/2026 07:50:13 AM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
03af7f8
Parents:
0dbb5c1
Message:

Admin: dedicated SEO page (/admin/seo) for advanced SEO

The <head> already consumed a rich SEO set (title_template, canonical,
default_description, og_image_default, og_locale, author, *_verification,
facebook_app_id, publisher_*/schema_type for JSON-LD), but many fields
had nowhere to be edited. New god-only page manages the full set for the
primary site, accessible via a 🔎 SEO button in /admin.

The old hidden SEO block in Appearance has been removed (+ its columns
from the appearance-save so saving no longer zeroes them out) and replaced
with a link to the new page — single source of truth.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@…>

Location:
src
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • src/routes/admin-sites.js

    r0dbb5c1 r6623453  
    303303      feed_view_default = ?, feed_view_switch = ?,
    304304      show_search = ?, show_archive_link = ?,
    305       title_template = ?, twitter = ?, canonical = ?,
    306       google_verification = ?, bing_verification = ?,
    307       pinterest_verification = ?, yandex_verification = ?,
    308305      custom_css = ?, custom_head_html = ?, custom_foot_html = ?,
    309306      updated_at = CURRENT_TIMESTAMP
     
    330327    f.show_search ? 1 : 0,
    331328    f.show_archive_link ? 1 : 0,
    332     (f.title_template || '{title} — {site}').slice(0, 200),
    333     (f.twitter || '').slice(0, 64) || null,
    334     (f.canonical || '').slice(0, 200) || null,
    335     (f.google_verification    || '').slice(0, 200) || null,
    336     (f.bing_verification      || '').slice(0, 200) || null,
    337     (f.pinterest_verification || '').slice(0, 200) || null,
    338     (f.yandex_verification    || '').slice(0, 200) || null,
    339329    f.custom_css      || null,
    340330    f.custom_head_html || null,
  • src/server.js

    r0dbb5c1 r6623453  
    3333import adminCommentsRoutes from './routes/admin-comments.js';
    3434import adminSettingsRoutes from './routes/admin-settings.js';
     35import adminSeoRoutes from './routes/admin-seo.js';
    3536import prutterRoutes from './routes/prutter.js';
    3637import audioRoutes from './routes/audio.js';
     
    245246app.use('/admin/comments', adminCommentsRoutes);
    246247app.use('/admin/settings', adminSettingsRoutes);
     248app.use('/admin/seo', adminSeoRoutes);
    247249app.use('/admin/circle', adminCircleRoutes);
    248250app.use('/admin/updates', adminUpdatesRoutes);
  • src/views/pages/admin-site-edit.ejs

    r0dbb5c1 r6623453  
    226226    </fieldset>
    227227
    228     <fieldset>
     228    <fieldset class="seo-pointer">
    229229      <legend>SEO &amp; social</legend>
    230       <label>
    231         <span>Titel-sjabloon (gebruik {title} en {site})</span>
    232         <input type="text" name="title_template" value="<%= site.title_template || '{title} — {site}' %>" maxlength="200">
    233       </label>
    234       <label>
    235         <span>Canonieke basis-URL (voor productie-HTTPS)</span>
    236         <input type="text" name="canonical" value="<%= site.canonical || '' %>" placeholder="https://jouw-domein.com">
    237       </label>
    238       <label>
    239         <span>Twitter / X-handle (met @)</span>
    240         <input type="text" name="twitter" value="<%= site.twitter || '' %>" placeholder="@jouwnaam" maxlength="64">
    241       </label>
    242       <details>
    243         <summary>Zoekmachine-verificatie</summary>
    244         <label>
    245           <span>Google site-verificatie</span>
    246           <input type="text" name="google_verification"    value="<%= site.google_verification    || '' %>" maxlength="200">
    247         </label>
    248         <label>
    249           <span>Bing (msvalidate.01)</span>
    250           <input type="text" name="bing_verification"      value="<%= site.bing_verification      || '' %>" maxlength="200">
    251         </label>
    252         <label>
    253           <span>Pinterest (p:domain_verify)</span>
    254           <input type="text" name="pinterest_verification" value="<%= site.pinterest_verification || '' %>" maxlength="200">
    255         </label>
    256         <label>
    257           <span>Yandex</span>
    258           <input type="text" name="yandex_verification"    value="<%= site.yandex_verification    || '' %>" maxlength="200">
    259         </label>
    260       </details>
     230      <p>Titel-sjabloon, canonical, deel-afbeelding, verificatie-metas en meer staan
     231        nu op een eigen pagina: <a href="/admin/seo">🔎 SEO &amp; vindbaarheid</a>.</p>
    261232    </fieldset>
    262233
  • src/views/pages/admin.ejs

    r0dbb5c1 r6623453  
    1414      <a href="/admin/playlists" class="btn">📃 Playlists</a>
    1515      <a href="/admin/comments" class="btn">💬 Reacties</a>
     16      <% if (primarySite) { %><a href="/admin/seo" class="btn">🔎 SEO</a><% } %>
    1617      <a href="/admin/settings" class="btn">⚙️ Instellingen</a>
    1718    <% } else { %>
     
    2728        <a href="/admin/circle" class="btn">🔗 Cirkel</a>
    2829      <% } %>
     30      <% if (primarySite) { %><a href="/admin/seo" class="btn">🔎 SEO</a><% } %>
    2931      <a href="/admin/settings" class="btn">⚙️ Instellingen</a>
    3032    <% } %>
Note: See TracChangeset for help on using the changeset viewer.