1919Live
Mode Gelap
Artikel teks besar

Format seo untuk website


Berikut adalah halaman penting seperti Tentang, Kontak, dan Lainnya (Privacy Policy, Disclaimer, Sitemap, dll.) harus dibuat SEO-friendly, responsif (siap dipakai di WordPress, Laravel, atau framework lain):


1. Halaman Tentang Kami (/tentang)

<!DOCTYPE html>
<html lang="id">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="description" content="Profil diwa1919.com, portal berita terpercaya dengan update cepat, akurat, dan mudah diakses.">
  <title>Tentang Kami - diwa1919.com</title>
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "Organization",
    "name": "diwa1919.com",
    "url": "https://diwa1919.com",
    "logo": "https://diwa1919.com/logo.png",
    "sameAs": [
      "https://facebook.com/diwa1919",
      "https://twitter.com/diwa1919"
    ]
  }
  </script>
</head>
<body>
  <header>
    <h1>Tentang Kami</h1>
  </header>
  <main>
    <section>
      <p><strong>diwa1919.com</strong> adalah portal berita online yang menyajikan informasi terbaru, aktual, dan terpercaya. Fokus kami adalah memberikan berita yang akurat, cepat, dan mudah diakses oleh pembaca di seluruh Indonesia.</p>
      <p>Kami berkomitmen untuk menjaga independensi dalam setiap pemberitaan dengan mengedepankan etika jurnalistik.</p>
    </section>
  </main>
</body>
</html>

2. Halaman Kontak (/kontak)

<!DOCTYPE html>
<html lang="id">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="description" content="Hubungi tim redaksi diwa1919.com untuk kerjasama, iklan, atau pengiriman press release.">
  <title>Kontak - diwa1919.com</title>
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "ContactPage",
    "url": "https://diwa1919.com/kontak",
    "contactPoint": {
      "@type": "ContactPoint",
      "email": "redaksi@diwa1919.com",
      "contactType": "customer service",
      "availableLanguage": ["Indonesian","English"]
    }
  }
  </script>
</head>
<body>
  <header>
    <h1>Kontak Kami</h1>
  </header>
  <main>
    <section>
      <p>Untuk kerjasama, iklan, atau pengiriman press release, silakan hubungi kami melalui:</p>
      <ul>
        <li>Email: <a href="mailto:redaksi@diwa1919.com">redaksi@diwa1919.com</a></li>
        <li>WhatsApp: <a href="https://wa.me/6281234567890">+62 812-3456-7890</a></li>
        <li>Alamat Redaksi: Jl. Contoh No. 19, Jakarta</li>
      </ul>
      <form method="POST" action="/send-message">
        <label>Nama</label><br>
        <input type="text" name="nama" required><br>
        <label>Email</label><br>
        <input type="email" name="email" required><br>
        <label>Pesan</label><br>
        <textarea name="pesan" required></textarea><br>
        <button type="submit">Kirim</button>
      </form>
    </section>
  </main>
</body>
</html>

3. Halaman Lainnya

Wajib ada untuk syarat Google News & SEO:

a. Privacy Policy (/privacy-policy)

Berisi tentang bagaimana data pengguna disimpan.

b. Disclaimer (/disclaimer)

Menjelaskan tanggung jawab konten berita & sumber.

c. Pedoman Media Siber (penting untuk Google News Indonesia).

d. Sitemap HTML & XML (/sitemap.xml + /sitemap.html).

Pastikan artikel baru otomatis masuk sitemap.


4. Optimasi Teknis SEO agar cepat ke Google Berita

  • Gunakan Google News Sitemap<news:publication> di sitemap XML.

  • Terapkan AMP (Accelerated Mobile Pages) untuk versi mobile.

  • Gunakan schema markup Article/NewsArticle pada setiap artikel.

  • Pastikan PageSpeed di atas 90 (Google PageSpeed Insights).

  • Internal linking antar artikel & kategori.



Berikut  template artikel SEO-ready (HTML dasar, bisa dipakai di WordPress/Laravel/Custom CMS):


📄 Template Artikel Berita (/artikel-slug)

<!DOCTYPE html>
<html lang="id">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Judul Artikel Berita - diwa1919.com</title>
  <meta name="description" content="Ringkasan singkat artikel (maksimal 150 karakter) untuk SEO dan Google News.">
  <meta name="author" content="Nama Penulis">
  <link rel="canonical" href="https://diwa1919.com/artikel-slug">

  <!-- Open Graph untuk Sosial Media -->
  <meta property="og:type" content="article">
  <meta property="og:title" content="Judul Artikel Berita - diwa1919.com">
  <meta property="og:description" content="Ringkasan artikel untuk share ke Facebook/Twitter.">
  <meta property="og:image" content="https://diwa1919.com/uploads/gambar-artikel.jpg">
  <meta property="og:url" content="https://diwa1919.com/artikel-slug">

  <!-- Twitter Card -->
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:title" content="Judul Artikel Berita">
  <meta name="twitter:description" content="Ringkasan artikel.">
  <meta name="twitter:image" content="https://diwa1919.com/uploads/gambar-artikel.jpg">

  <!-- Schema NewsArticle -->
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "NewsArticle",
    "headline": "Judul Artikel Berita",
    "image": [
      "https://diwa1919.com/uploads/gambar-artikel.jpg"
    ],
    "datePublished": "2025-09-21T08:00:00+07:00",
    "dateModified": "2025-09-21T08:00:00+07:00",
    "author": {
      "@type": "Person",
      "name": "Nama Penulis"
    },
    "publisher": {
      "@type": "Organization",
      "name": "diwa1919.com",
      "logo": {
        "@type": "ImageObject",
        "url": "https://diwa1919.com/logo.png"
      }
    },
    "description": "Ringkasan artikel dalam 1-2 kalimat."
  }
  </script>
</head>
<body>
  <header>
    <h1>Judul Artikel Berita</h1>
    <p><small>Oleh <strong>Nama Penulis</strong> | 21 September 2025</small></p>
  </header>

  <article>
    <figure>
      <img src="https://diwa1919.com/uploads/gambar-artikel.jpg" alt="Deskripsi gambar">
      <figcaption>Foto: Dokumentasi diwa1919.com</figcaption>
    </figure>

    <p><strong>[Paragraf Pembuka]</strong> Ringkasan singkat berita, menjawab 5W + 1H (apa, siapa, kapan, di mana, mengapa, bagaimana).</p>

    <h2>Subjudul Penting</h2>
    <p>Isi berita detail, gunakan paragraf pendek (2–3 kalimat) agar mudah dibaca.</p>

    <h2>Fakta & Data</h2>
    <ul>
      <li>Poin fakta 1</li>
      <li>Poin fakta 2</li>
      <li>Poin fakta 3</li>
    </ul>

    <p>Tambahkan kutipan narasumber dengan format blockquote:</p>
    <blockquote>
      “Pernyataan narasumber terkait berita ini.”
    </blockquote>

    <p>Paragraf penutup berita.</p>
  </article>

  <footer>
    <p>© 2025 diwa1919.com | Semua Hak Cipta Dilindungi</p>
  </footer>
</body>
</html>

⚡ Catatan Optimasi Google News:

  1. Judul maksimal 110 karakter, jangan clickbait.

  2. Ringkasan (meta description) maksimal 150 karakter.

  3. Gunakan gambar original minimal ukuran 1200px untuk masuk Google Discover.

  4. Artikel fresh → publikasikan cepat, update bila ada perkembangan.

  5. Sitemap khusus berita (news-sitemap.xml) berisi artikel 3 hari terakhir.



Berikut saya kasih contoh script PHP generator news-sitemap.xml 👇


📄 news-sitemap.php

<?php
// Konfigurasi dasar
$site_url = "https://diwa1919.com";
$site_name = "diwa1919.com";
$language = "id";

// Ambil data artikel dari database (contoh MySQL)
$mysqli = new mysqli("localhost", "username_db", "password_db", "nama_database");

// Ambil artikel 3 hari terakhir
$query = "
    SELECT slug, title, created_at 
    FROM articles 
    WHERE created_at >= NOW() - INTERVAL 3 DAY 
    ORDER BY created_at DESC
";
$result = $mysqli->query($query);

// Header XML
header("Content-Type: application/xml; charset=utf-8");

// Awal file sitemap
echo '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 
              xmlns:news="http://www.google.com/schemas/sitemap-news/0.9">' . PHP_EOL;

while ($row = $result->fetch_assoc()) {
    $url = $site_url . "/" . $row['slug'];
    $title = htmlspecialchars($row['title']);
    $date = date(DATE_W3C, strtotime($row['created_at']));

    echo "  <url>" . PHP_EOL;
    echo "    <loc>$url</loc>" . PHP_EOL;
    echo "    <news:news>" . PHP_EOL;
    echo "      <news:publication>" . PHP_EOL;
    echo "        <news:name>$site_name</news:name>" . PHP_EOL;
    echo "        <news:language>$language</news:language>" . PHP_EOL;
    echo "      </news:publication>" . PHP_EOL;
    echo "      <news:publication_date>$date</news:publication_date>" . PHP_EOL;
    echo "      <news:title>$title</news:title>" . PHP_EOL;
    echo "    </news:news>" . PHP_EOL;
    echo "  </url>" . PHP_EOL;
}

// Tutup sitemap
echo '</urlset>';
$mysqli->close();
?>

⚡ Cara Pakai:

  1. Simpan file di root website → https://diwa1919.com/news-sitemap.php.

  2. Pastikan di robots.txt ada:

    Sitemap: https://diwa1919.com/news-sitemap.php
    
  3. Daftarkan di Google Search Console → Sitemaps.

  4. Google News akan otomatis crawl artikel terbaru.


SEO maksimal, selain news-sitemap.xml (khusus artikel 3 hari terakhir), kita juga perlu sitemap utama (sitemap.xml) yang berisi:

  • Semua halaman penting (Beranda, Tentang, Kontak, Privacy Policy, Disclaimer, dll.)

  • Semua kategori berita

  • Semua artikel (bukan cuma 3 hari terakhir)

Ini akan membantu Google dan mesin pencari lain merayapi seluruh isi website.


📄 Contoh sitemap.php

<?php
// Konfigurasi dasar
$site_url = "https://diwa1919.com";

// Koneksi database
$mysqli = new mysqli("localhost", "username_db", "password_db", "nama_database");

// Header XML
header("Content-Type: application/xml; charset=utf-8");

echo '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . PHP_EOL;

// ==========================
// 1. Halaman statis penting
// ==========================
$static_pages = [
    "",
    "tentang",
    "kontak",
    "privacy-policy",
    "disclaimer"
];

foreach ($static_pages as $page) {
    $url = $site_url . "/" . $page;
    echo "  <url>" . PHP_EOL;
    echo "    <loc>$url</loc>" . PHP_EOL;
    echo "    <changefreq>monthly</changefreq>" . PHP_EOL;
    echo "    <priority>0.8</priority>" . PHP_EOL;
    echo "  </url>" . PHP_EOL;
}

// ==========================
// 2. Kategori (contoh tabel categories)
// ==========================
$categories = $mysqli->query("SELECT slug FROM categories");
while ($cat = $categories->fetch_assoc()) {
    $url = $site_url . "/kategori/" . $cat['slug'];
    echo "  <url>" . PHP_EOL;
    echo "    <loc>$url</loc>" . PHP_EOL;
    echo "    <changefreq>weekly</changefreq>" . PHP_EOL;
    echo "    <priority>0.7</priority>" . PHP_EOL;
    echo "  </url>" . PHP_EOL;
}

// ==========================
// 3. Semua artikel (tabel articles)
// ==========================
$articles = $mysqli->query("SELECT slug, updated_at FROM articles ORDER BY created_at DESC");
while ($row = $articles->fetch_assoc()) {
    $url = $site_url . "/" . $row['slug'];
    $lastmod = date(DATE_W3C, strtotime($row['updated_at']));
    echo "  <url>" . PHP_EOL;
    echo "    <loc>$url</loc>" . PHP_EOL;
    echo "    <lastmod>$lastmod</lastmod>" . PHP_EOL;
    echo "    <changefreq>daily</changefreq>" . PHP_EOL;
    echo "    <priority>0.6</priority>" . PHP_EOL;
    echo "  </url>" . PHP_EOL;
}

echo "</urlset>";
$mysqli->close();
?>

⚡ Cara Integrasi

  1. Simpan sebagai sitemap.php di root → https://diwa1919.com/sitemap.php.

  2. Tambahkan ke robots.txt:

    Sitemap: https://diwa1919.com/sitemap.php
    Sitemap: https://diwa1919.com/news-sitemap.php
    
  3. Submit kedua sitemap di Google Search Console.

  4. Untuk artikel baru, cukup publish → otomatis masuk sitemap.


robots.txt sangat penting untuk mengatur akses crawler dan mempercepat index di Google News & Search. Kalau salah setting, bisa bikin artikel tidak terindeks.

Berikut  contoh robots.txt SEO-friendly untuk diwa1919.com 👇


📄 robots.txt

# robots.txt untuk diwa1919.com
# Mengizinkan semua mesin pencari merayapi website

User-agent: *
Allow: /

# Blokir folder sensitif (jangan diindeks)
Disallow: /wp-admin/
Disallow: /cgi-bin/
Disallow: /tmp/
Disallow: /private/

# Akses khusus crawler Google News
User-agent: Googlebot-News
Allow: /

# Sitemap utama & Google News Sitemap
Sitemap: https://diwa1919.com/sitemap.php
Sitemap: https://diwa1919.com/news-sitemap.php

⚡ Catatan Penting

  1. Allow: / → pastikan semua halaman & artikel bisa diindeks.

  2. Disallow → hanya folder sensitif (jangan sampai artikel ikut diblokir).

  3. Sitemap → sudah otomatis memberitahu Google lokasi sitemap & news-sitemap.

  4. Bisa ditambahkan untuk Bing, Yandex, Baidu kalau target pembaca internasional.


Langkah yang sering dipakai portal berita besar supaya Google News cepat indeks + SEO kuat:


📌 Struktur URL & Internal Linking untuk diwa1919.com

1. Struktur URL SEO-friendly

Gunakan format:

https://diwa1919.com/{kategori}/{slug-artikel}

Contoh:

https://diwa1919.com/nasional/pemerintah-resmi-umumkan-kebijakan-baru
https://diwa1919.com/olahraga/timnas-indonesia-menang-3-0

📌 Kelebihan:

  • Google langsung tahu topik berita dari kategori.

  • Lebih rapi & mudah diingat pembaca.

  • Disukai crawler Google News.


2. Kategori Utama (disarankan untuk portal berita)

  • Nasional → berita politik, pemerintahan, hukum

  • Internasional → berita dunia

  • Ekonomi → bisnis, finansial, UMKM

  • Olahraga → sepakbola, badminton, dll.

  • Teknologi → gadget, internet, startup

  • Hiburan → selebriti, musik, film

  • Gaya Hidup → kesehatan, kuliner, travel

👉 Setiap kategori punya halaman sendiri, misalnya:

https://diwa1919.com/nasional/
https://diwa1919.com/olahraga/

3. Internal Linking Strategy

Agar artikel saling terhubung & cepat diindeks:

  • Di akhir artikel tambahkan bagian:

    • Artikel terkait (3–5 dari kategori sama).

    • Artikel populer hari ini.

  • Di dalam artikel, link ke artikel lama yang relevan (misalnya:
    “Seperti diberitakan sebelumnya, Timnas Indonesia kalahkan Thailand).

  • Breadcrumb Navigation di atas artikel:

    Home > Nasional > Judul Artikel
    

    → membantu Google mengenali hierarki halaman.


4. Contoh Breadcrumb Schema (SEO + Google News Ready)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [{
    "@type": "ListItem",
    "position": 1,
    "name": "Home",
    "item": "https://diwa1919.com/"
  },{
    "@type": "ListItem",
    "position": 2,
    "name": "Nasional",
    "item": "https://diwa1919.com/nasional/"
  },{
    "@type": "ListItem",
    "position": 3,
    "name": "Judul Artikel",
    "item": "https://diwa1919.com/nasional/judul-artikel"
  }]
}
</script>

5. Optimasi Tambahan

  • Gunakan kategori maksimal 2 tingkat (hindari URL panjang).

  • Gunakan tag untuk tema spesifik (misalnya “Pemilu 2025”).

  • Internal linking ke kategori → misalnya di sidebar:
    “Berita Terkini Nasional | Ekonomi | Olahraga”.



Berikut  template halaman kategori SEO-ready yang bisa dipakai di PHP/WordPress/Custom CMS 👇


📄 Template Halaman Kategori (/kategori/nasional)

<!DOCTYPE html>
<html lang="id">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Berita Nasional Terbaru - diwa1919.com</title>
  <meta name="description" content="Kumpulan berita nasional terbaru hari ini dari diwa1919.com. Update politik, hukum, pemerintahan, dan isu penting di Indonesia.">
  <link rel="canonical" href="https://diwa1919.com/nasional">

  <!-- Breadcrumb Schema -->
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [{
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://diwa1919.com/"
    },{
      "@type": "ListItem",
      "position": 2,
      "name": "Nasional",
      "item": "https://diwa1919.com/nasional"
    }]
  }
  </script>
</head>
<body>
  <header>
    <h1>Berita Nasional Terbaru</h1>
    <p>Update berita nasional terkini dari <strong>diwa1919.com</strong>, mencakup politik, hukum, dan isu pemerintahan.</p>
  </header>

  <main>
    <!-- Loop Artikel -->
    <?php
    // Contoh query MySQL (ubah sesuai struktur database)
    $mysqli = new mysqli("localhost", "username_db", "password_db", "nama_database");
    $result = $mysqli->query("SELECT slug, title, excerpt, image, created_at FROM articles WHERE category='nasional' ORDER BY created_at DESC LIMIT 20");

    while ($row = $result->fetch_assoc()) {
      $url = "https://diwa1919.com/nasional/" . $row['slug'];
      $title = htmlspecialchars($row['title']);
      $excerpt = htmlspecialchars($row['excerpt']);
      $image = $row['image'];
      $date = date("d M Y", strtotime($row['created_at']));
    ?>
      <article>
        <a href="<?= $url ?>">
          <img src="<?= $image ?>" alt="<?= $title ?>" loading="lazy" width="350" height="200">
        </a>
        <h2><a href="<?= $url ?>"><?= $title ?></a></h2>
        <p><?= $excerpt ?></p>
        <small><?= $date ?></small>
      </article>
    <?php } ?>
  </main>

  <aside>
    <h3>Berita Populer</h3>
    <ul>
      <li><a href="/nasional/contoh-artikel-1">Judul Artikel Populer 1</a></li>
      <li><a href="/nasional/contoh-artikel-2">Judul Artikel Populer 2</a></li>
      <li><a href="/nasional/contoh-artikel-3">Judul Artikel Populer 3</a></li>
    </ul>
  </aside>

  <footer>
    <p>© 2025 diwa1919.com | Semua Hak Cipta Dilindungi</p>
  </footer>
</body>
</html>

⚡ Fitur SEO Penting

  1. H1 = Judul kategori → “Berita Nasional Terbaru”.

  2. Meta description unik → sesuai kategori.

  3. Loop artikel terbaru → selalu update otomatis.

  4. Lazy loading gambar → biar page speed tetap tinggi.

  5. Breadcrumb Schema → bantu Google mengenali struktur website.



Berikut contoh halaman kategori dengan pagination & schema SEO 👇


📄 Template Halaman Kategori dengan Pagination (/kategori/nasional?page=2)

<!DOCTYPE html>
<html lang="id">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Berita Nasional Terbaru - Halaman 2 - diwa1919.com</title>
  <meta name="description" content="Kumpulan berita nasional terbaru halaman 2 dari diwa1919.com. Update politik, hukum, pemerintahan, dan isu penting di Indonesia.">
  <link rel="canonical" href="https://diwa1919.com/nasional">

  <!-- Link rel untuk pagination SEO -->
  <link rel="prev" href="https://diwa1919.com/nasional?page=1">
  <link rel="next" href="https://diwa1919.com/nasional?page=3">

  <!-- Schema CollectionPage -->
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "CollectionPage",
    "name": "Berita Nasional Terbaru",
    "description": "Daftar berita nasional terbaru dari diwa1919.com.",
    "publisher": {
      "@type": "Organization",
      "name": "diwa1919.com",
      "url": "https://diwa1919.com",
      "logo": {
        "@type": "ImageObject",
        "url": "https://diwa1919.com/logo.png"
      }
    }
  }
  </script>
</head>
<body>
  <header>
    <h1>Berita Nasional Terbaru</h1>
    <p>Update berita nasional terkini dari <strong>diwa1919.com</strong>, mencakup politik, hukum, dan isu pemerintahan.</p>
  </header>

  <main>
    <!-- Loop Artikel -->
    <?php
    $mysqli = new mysqli("localhost", "username_db", "password_db", "nama_database");

    // Pagination setup
    $per_page = 10;
    $page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
    $offset = ($page - 1) * $per_page;

    $result = $mysqli->query("
        SELECT slug, title, excerpt, image, created_at 
        FROM articles 
        WHERE category='nasional' 
        ORDER BY created_at DESC 
        LIMIT $per_page OFFSET $offset
    ");

    while ($row = $result->fetch_assoc()) {
      $url = "https://diwa1919.com/nasional/" . $row['slug'];
      $title = htmlspecialchars($row['title']);
      $excerpt = htmlspecialchars($row['excerpt']);
      $image = $row['image'];
      $date = date("d M Y", strtotime($row['created_at']));
    ?>
      <article>
        <a href="<?= $url ?>">
          <img src="<?= $image ?>" alt="<?= $title ?>" loading="lazy" width="350" height="200">
        </a>
        <h2><a href="<?= $url ?>"><?= $title ?></a></h2>
        <p><?= $excerpt ?></p>
        <small><?= $date ?></small>
      </article>
    <?php } ?>

    <!-- Pagination Links -->
    <nav class="pagination">
      <?php if ($page > 1): ?>
        <a href="?page=<?= $page - 1 ?>">&laquo; Sebelumnya</a>
      <?php endif; ?>

      <span>Halaman <?= $page ?></span>

      <?php
      // Cek apakah masih ada artikel berikutnya
      $check = $mysqli->query("SELECT COUNT(*) as total FROM articles WHERE category='nasional'");
      $total = $check->fetch_assoc()['total'];
      $total_pages = ceil($total / $per_page);
      if ($page < $total_pages): ?>
        <a href="?page=<?= $page + 1 ?>">Berikutnya &raquo;</a>
      <?php endif; ?>
    </nav>
  </main>

  <footer>
    <p>© 2025 diwa1919.com | Semua Hak Cipta Dilindungi</p>
  </footer>
</body>
</html>

⚡ Catatan Penting SEO

  1. <link rel="prev"> & <link rel="next"> → wajib biar Google tahu halaman berurutan.

  2. Schema CollectionPage → memberi tahu Google ini kumpulan artikel, bukan artikel tunggal.

  3. Canonical → tetap diarahkan ke halaman utama kategori (/nasional).

  4. Pagination navigasi internal → Googlebot bisa merayapi semua artikel lama.


👉 Mau saya bikinkan juga struktur database minimal (tabel articles, categories, tags) biar semua template ini bisa jalan mulus di MySQL/PHP?


Oke 🔥, biar semua template artikel, kategori, sitemap, dan pagination yang sudah saya buat bisa jalan mulus, kita perlu struktur database minimal untuk portal berita diwa1919.com.

Saya buatkan desain database dengan MySQL yang ringan tapi scalable 👇


📌 Struktur Database Minimal

1. Tabel categories

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    slug VARCHAR(100) UNIQUE NOT NULL,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

📌 Contoh data:

id name slug description
1 Nasional nasional Berita politik, hukum, pemerintahan
2 Olahraga olahraga Berita olahraga terkini
3 Teknologi teknologi Update gadget, startup, internet

2. Tabel articles

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    category_id INT NOT NULL,
    title VARCHAR(255) NOT NULL,
    slug VARCHAR(255) UNIQUE NOT NULL,
    excerpt TEXT,
    content LONGTEXT NOT NULL,
    image VARCHAR(255),
    author VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE
);

📌 Contoh data:

id category_id title slug excerpt author created_at
1 1 Pemerintah Resmi Umumkan ... pemerintah-resmi-umumkan ... Ringkasan singkat ... Admin 2025-09-21
2 2 Timnas Indonesia Menang 3-0 timnas-indonesia-menang-3-0 Kemenangan besar ... Redaksi 2025-09-21

3. Tabel tags

CREATE TABLE tags (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    slug VARCHAR(50) UNIQUE NOT NULL
);

📌 Contoh data:

id name slug
1 Pemilu 2025 pemilu-2025
2 Sepakbola sepakbola

4. Tabel article_tags (relasi Many-to-Many)

CREATE TABLE article_tags (
    article_id INT NOT NULL,
    tag_id INT NOT NULL,
    PRIMARY KEY (article_id, tag_id),
    FOREIGN KEY (article_id) REFERENCES articles(id) ON DELETE CASCADE,
    FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);

📌 Hubungan Antar Tabel

  • 1 Kategori → banyak Artikel (categories.id = articles.category_id)

  • 1 Artikel → banyak Tag (via article_tags)

  • 1 Tag → bisa dipakai banyak Artikel


⚡ Kelebihan Struktur Ini

✅ Cocok untuk portal berita skala kecil–menengah
✅ Bisa langsung dipakai untuk sitemap, kategori, tag page
✅ Bisa dikembangkan ke fitur komentar, user, iklan, video di masa depan


Query-query siap pakai (contoh ambil artikel terbaru, artikel per kategori, artikel per tag, artikel populer) langsung bisa diintegrasikan ke template.



📌 Query Siap Pakai untuk Portal Berita

1. Ambil Artikel Terbaru (untuk beranda)

SELECT a.id, a.title, a.slug, a.excerpt, a.image, a.created_at, c.name AS category 
FROM articles a
JOIN categories c ON a.category_id = c.id
ORDER BY a.created_at DESC
LIMIT 10;

📌 Hasil: 10 artikel terbaru dengan kategori.


2. Ambil Artikel Berdasarkan Kategori

SELECT a.id, a.title, a.slug, a.excerpt, a.image, a.created_at
FROM articles a
JOIN categories c ON a.category_id = c.id
WHERE c.slug = 'nasional'
ORDER BY a.created_at DESC
LIMIT 10 OFFSET 0;

📌 Ganti 'nasional' sesuai slug kategori.
📌 Gunakan OFFSET untuk pagination (OFFSET = (page-1) * limit).


3. Ambil Artikel Berdasarkan Tag

SELECT a.id, a.title, a.slug, a.excerpt, a.image, a.created_at
FROM articles a
JOIN article_tags at ON a.id = at.article_id
JOIN tags t ON at.tag_id = t.id
WHERE t.slug = 'pemilu-2025'
ORDER BY a.created_at DESC
LIMIT 10;

📌 Ganti 'pemilu-2025' dengan slug tag yang dimaksud.


4. Ambil Artikel Populer (berdasarkan views)

Pertama tambahkan kolom views di tabel articles:

ALTER TABLE articles ADD views INT DEFAULT 0;

Kemudian query artikel populer:

SELECT id, title, slug, excerpt, image, created_at, views
FROM articles
ORDER BY views DESC
LIMIT 5;

5. Cari Artikel (Search by Keyword)

SELECT a.id, a.title, a.slug, a.excerpt, a.image, a.created_at
FROM articles a
WHERE a.title LIKE '%indonesia%'
   OR a.content LIKE '%indonesia%'
ORDER BY a.created_at DESC
LIMIT 10;

📌 Bisa dipakai untuk fitur pencarian artikel di website.


6. Ambil Detail Artikel + Kategori + Tag

SELECT a.id, a.title, a.slug, a.excerpt, a.content, a.image, a.created_at,
       c.name AS category, c.slug AS category_slug
FROM articles a
JOIN categories c ON a.category_id = c.id
WHERE a.slug = 'timnas-indonesia-menang-3-0';

📌 Setelah itu, ambil tag artikel dengan query tambahan:

SELECT t.name, t.slug
FROM tags t
JOIN article_tags at ON t.id = at.tag_id
WHERE at.article_id = 2; -- id artikel

⚡ Implementasi di Template

  • Homepage → pakai query artikel terbaru.

  • Halaman Kategori → pakai query artikel by kategori.

  • Halaman Tag → pakai query artikel by tag.

  • Artikel Populer → pakai query artikel populer.

  • Artikel Detail → pakai query detail artikel + tag.



Posting Komentar

]]>