#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""StudioSoft — hidupkan kembali 3 slug mati (404 → 200) dengan artikel baru.

Slug & judul mengikuti tautan yang sudah ada di artikel #3535:
  /kenapa-rumah-sakit-dan-klinik-wajib-punya-strategi-digital-marketing/
  /konten-edukasi-kesehatan-kepercayaan-pasien/
  /website-rumah-sakit-gagal-pasien/

Per artikel: 1.000-1.300 kata, tombol WA, FAQ + FAQPage schema, meta Yoast, gambar unggulan 1000x567 WebP,
kategori + 4 tag, tautan internal (semua sudah diperiksa hidup), tanpa patahan baris.

Jalur:  python3 ss_artikel_slug_mati.py            (uji)
        python3 ss_artikel_slug_mati.py --terbit   (buat + TERBITKAN, 404 jadi 200)
"""
import base64, json, os, re, sys, time, urllib.error, urllib.request

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
DOM = "studiosoft.id"
S = f"https://{DOM}"
AUTH = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()
H = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}
HJ = {**H, "Content-Type": "application/json"}

WA = ("https://wa.me/6281935000624?text=Halo%20StudioSoft%2C%20saya%20ingin%20konsultasi%20"
      "digital%20marketing%20rumah%20sakit")
TOMBOL = ('<p style="text-align:center;margin:32px 0 8px"><a href="' + WA +
          '" target="_blank" rel="noopener" style="display:inline-block;background-color:#0f2557;'
          'color:#ffffff;padding:15px 34px;font-size:18px;font-weight:bold;text-decoration:none;'
          'border-radius:6px;">Konsultasi Gratis</a></p>')

T = {
    "induk": ("https://studiosoft.id/9-contoh-konten-digital-marketing-rumah-sakit-yang-edukatif-dan-tetap-etis/",
              "contoh konten digital marketing rumah sakit"),
    "indikator": ("https://studiosoft.id/digital-marketing-rumah-sakit-indikator/",
                  "indikator digital marketing rumah sakit"),
    "seo_rs": ("https://studiosoft.id/seo-rumah-sakit/", "SEO rumah sakit"),
    "panduan": ("https://studiosoft.id/panduan-seo-klinik-rumah-sakit/", "panduan SEO klinik dan rumah sakit"),
    "gbp": ("https://studiosoft.id/google-business-profile-klinik/", "Google Business Profile untuk klinik"),
    "website": ("https://studiosoft.id/pembuatan-website-rumah-sakit/", "pembuatan website rumah sakit"),
    "panduan_dm": ("https://studiosoft.id/rs-klinik-digital-marketing-2026/",
                   "panduan digital marketing rumah sakit dan klinik"),
    "jasa_rs": ("https://studiosoft.id/jasa-digital-marketing-rs/", "jasa digital marketing rumah sakit"),
}


def l(k, teks=None):
    u, t = T[k]
    return f'<a href="{u}">{teks or t}</a>'


ARTIKEL = [
    {
        "judul": "Kenapa Rumah Sakit dan Klinik Wajib Punya Strategi Digital Marketing",
        "slug": "kenapa-rumah-sakit-dan-klinik-wajib-punya-strategi-digital-marketing",
        "fokus": "strategi digital marketing rumah sakit",
        "meta_judul": "Strategi Digital Marketing Rumah Sakit: Kenapa Wajib",
        "meta_desc": ("Strategi digital marketing rumah sakit menentukan apakah pasien menemukan layanan "
                      "Anda atau fasilitas lain. Ini alasan dan urutan menyusunnya."),
        "gambar": ["Strategi Digital Marketing", "Kenapa rumah sakit dan klinik wajib menyusunnya"],
        "tag": [634, 659, 639, 654],
        "isi": """
<p>Pasien jarang memilih fasilitas kesehatan secara kebetulan. Sebelum datang, hampir selalu ada
pencarian, pertanyaan ke keluarga, atau perbandingan di peta. Semua itu terjadi di layar sebelum seseorang
memutuskan tempat berobat. Karena itu, kehadiran digital bukan pelengkap, melainkan bagian dari cara pasien
menemukan layanan.</p>

<p>Masalahnya, banyak rumah sakit dan klinik sudah punya akun media sosial dan situs, tetapi belum punya
strategi. Isinya terbit sesekali, tidak ada yang tahu hasilnya, dan tidak ada yang mengukur apakah
pekerjaan itu mendatangkan pasien. Bagian berikut menjelaskan kenapa strategi dibutuhkan dan bagaimana
menyusunnya secara masuk akal.</p>

<h2>Pasien mencari sebelum memutuskan</h2>
<p>Keluhan yang dirasakan hampir selalu diubah menjadi kata kunci sebelum seseorang menghubungi layanan.
Bentuknya bisa sederhana, misalnya nama keluhan ditambah nama wilayah. Dari pencarian itu dia melihat peta,
membaca ulasan, membuka satu atau dua situs, lalu memutuskan.</p>

<p>Kalau rumah sakit tidak muncul di tahap itu, keputusan tetap berjalan, cuma berpindah ke fasilitas lain
yang muncul. Inilah bedanya promosi lama dengan pekerjaan digital: yang pertama menyampaikan pesan,
yang kedua memastikan Anda hadir pada saat orang mencari.</p>

<h2>Tanpa strategi, pekerjaan konten berhenti di tengah jalan</h2>
<p>Gejala paling umum dari ketiadaan strategi bisa dikenali dari beberapa tanda:</p>
<ul>
<li>Konten terbit hanya kalau ada waktu luang, jadi tidak berkelanjutan.</li>
<li>Setiap unggahan berdiri sendiri, tidak menyambung ke halaman layanan apa pun.</li>
<li>Tidak ada yang tahu konten mana yang mendatangkan pasien.</li>
<li>Pekerjaannya bertumpu pada satu orang, sehingga berhenti ketika orang itu sibuk.</li>
<li>Anggaran dibelanjakan untuk iklan, tanpa perbaikan pada halaman yang dibuka iklan itu.</li>
</ul>
<p>Strategi yang sederhana tetapi dijalankan konsisten hampir selalu mengalahkan pekerjaan besar yang
berhenti di bulan kedua.</p>

<h2>Aturan dan etika membuat pendekatannya berbeda</h2>
<p>Pemasaran rumah sakit tidak bisa disamakan dengan pemasaran barang. Informasi harus benar, tidak
menyesatkan, dan tidak menjanjikan kesembuhan. Data pasien termasuk data yang paling perlu dilindungi.
Akibatnya, beberapa hal yang lazim di industri lain justru tidak pantas dilakukan di sini, misalnya
membandingkan hasil tindakan sebelum dan sesudah, atau memakai cerita pasien tanpa izin.</p>

<p>Karena itu, urutan pekerjaannya pun berbeda: bangun dulu kejelasan informasi dan kepercayaan, baru
memperluas jangkauan. Aturan ini bukan penghambat, justru pelindung reputasi fasilitas kesehatan.</p>

<h2>Empat pilar strategi digital rumah sakit</h2>
<p>Rumusan sesederhana ini sudah cukup untuk memulai:</p>
<ul>
<li><strong>Fondasi.</strong> Situs yang cepat, halaman layanan yang jelas, dan data yang konsisten di
semua tempat.</li>
<li><strong>Kehadiran lokal.</strong> Profil bisnis yang lengkap dan aktif, karena banyak pasien memutuskan
lewat peta dan ulasan.</li>
<li><strong>Isi yang menjawab.</strong> Halaman yang menjawab keluhan, prosedur, jadwal, dan cara
mendaftar.</li>
<li><strong>Pengukuran.</strong> Angka yang menunjukkan pekerjaan mana yang menghasilkan kontak, dan mana
yang hanya ramai tanpa hasil.</li>
</ul>
<p>Isi yang menjawab kebutuhan pasien adalah pilar yang paling sering ditunda, padahal paling tahan lama
hasilnya. Bentuk-bentuknya sudah dirangkum di """ + l("induk") + """.</p>

<h2>Urutan pengerjaan yang masuk akal</h2>
<p>Kalau dimulai dari nol, urutan berikut menghindarkan pemborosan:</p>
<ul>
<li>Pastikan informasi dasar benar dulu: nama, alamat, nomor telepon, jam layanan, dan daftar layanan.</li>
<li>Lengkapi profil bisnis sampai semua bagian terisi, termasuk foto dan jam praktik.</li>
<li>Perbaiki halaman layanan yang sudah ada sebelum menambah halaman baru.</li>
<li>Baru kemudian menambah isi baru secara berkala.</li>
<li>Tunda iklan berbayar sampai halaman tujuan sudah layak dikunjungi.</li>
</ul>

<h2>Kehadiran lokal menentukan lebih dulu</h2>
<p>Untuk layanan kesehatan, kueri yang bernilai hampir selalu bernuansa wilayah: nama layanan ditambah nama
kecamatan atau kota. Kueri seperti ini dijawab Google dengan peta dan daftar bisnis, bukan hanya tautan
biasa. Artinya, memperkuat profil bisnis sering kali lebih berdampak daripada menambah artikel.</p>

<p>Isi profil yang perlu dijaga: jam praktik yang akurat, daftar layanan, foto yang diperbarui, dan balasan
untuk setiap ulasan. Cara menyusunnya dijelaskan di """ + l("gbp") + """, sedangkan gambaran menyeluruh soal
kanal dan perannya ada di """ + l("panduan_dm") + """.</p>

<h2>Situs sebagai tempat mendarat</h2>
<p>Semua kanal pada akhirnya mengarah ke situs. Kalau halaman yang dibuka lambat, tidak menjelaskan
layanan, atau tidak menyediakan cara menghubungi, pekerjaan di kanal lain berhenti di tengah. Tiga hal
paling menentukan: kecepatan, kejelasan layanan, dan jalur menghubungi yang mudah ditemukan.</p>

<p>Untuk urusan teknis dan penamaan halaman, """ + l("seo_rs") + """ membahas pencarian pasien yang paling
sering muncul dan cara menyiapkannya.</p>

<h2>Mengukur, jangan menebak</h2>
<p>Tanpa pengukuran, pekerjaan digital cepat berubah menjadi perdebatan selera. Empat angka ini cukup untuk
memulai: jumlah kunjungan dari pencarian, jumlah kontak yang masuk, halaman yang menghasilkan kontak, dan
jumlah ulasan baru setiap bulan. Cara membaca angkanya, termasuk mana yang boleh diabaikan, ada di
""" + l("indikator") + """.</p>

<h2>Kapan sebaiknya menambah anggaran</h2>
<p>Setelah fondasi rapi dan pengukuran berjalan, anggaran tambahan bisa dipakai dengan lebih tenang. Yang
perlu dipastikan lebih dulu: halaman tujuan sudah menjelaskan layanan dengan jelas, jalur menghubungi mudah
ditemukan, dan ada catatan kontak yang masuk.</p>

<p>Sebelum tiga hal itu ada, penambahan anggaran hanya menambah jumlah orang yang datang lalu pergi tanpa
menghubungi. Kalau sudah ada, anggaran bisa diarahkan ke kanal yang terbukti menghasilkan kontak, bukan
dibagi rata ke semua kanal hanya supaya semua terlihat dikerjakan.</p>

<h2>Kesalahan yang paling sering terjadi</h2>
<ul>
<li>Menargetkan kata kunci umum seperti nama kota saja, padahal pasien mencari layanan yang spesifik.</li>
<li>Menyerahkan pekerjaan kepada satu orang tanpa catatan, sehingga berhenti saat dia pergi.</li>
<li>Mengukur keberhasilan dari jumlah pengikut, bukan dari kontak yang masuk.</li>
<li>Mengunggah konten tanpa arah ke halaman layanan, sehingga pembaca tidak tahu langkah berikutnya.</li>
</ul>

<h2>Pertanyaan yang sering muncul</h2>

<h3>Apakah rumah sakit kecil tetap butuh strategi digital?</h3>
<p>Butuh, tetapi cakupannya bisa lebih sederhana: satu situs yang rapi, satu profil bisnis yang aktif, dan
beberapa halaman layanan yang benar-benar menjawab.</p>

<h3>Berapa lama hasilnya mulai terlihat?</h3>
<p>Perbaikan pada profil bisnis dan halaman layanan biasanya terasa dalam beberapa pekan. Penambahan isi
baru memerlukan waktu lebih panjang karena perlu diproses mesin pencari.</p>

<h3>Siapa yang sebaiknya menyusun strateginya?</h3>
<p>Satu orang penanggung jawab dari pihak rumah sakit, didampingi tim yang mengerjakan isi dan teknis.
Yang penting ada yang memutuskan, bukan hanya yang menjalankan.</p>

<h3>Apakah media sosial bisa menggantikan situs?</h3>
<p>Tidak. Media sosial berguna untuk menjangkau, tetapi halaman layanan yang lengkap tetap dibutuhkan
sebagai tempat pembaca memastikan informasi.</p>

<h3>Kapan sebaiknya mulai beriklan?</h3>
<p>Setelah halaman tujuan rapi dan terukur. Beriklan ke halaman yang belum siap hanya membayar kunjungan
yang berhenti tanpa menghubungi.</p>

<h2>Baca juga</h2>
<p>Sebagai lanjutan, bentuk konten yang bisa dikerjakan sendiri sudah dirangkum di """ + l("induk") + """.
Kalau rumah sakit ingin membandingkan pekerjaan sendiri dengan bantuan pihak luar, pertimbangannya ada di
""" + l("jasa_rs") + """.</p>

""" + TOMBOL + """
""",
    },
    {
        "judul": "Pentingnya Konten Edukasi Kesehatan untuk Meningkatkan Kepercayaan Pasien",
        "slug": "konten-edukasi-kesehatan-kepercayaan-pasien",
        "fokus": "konten edukasi kesehatan",
        "meta_judul": "Konten Edukasi Kesehatan: Membangun Kepercayaan Pasien",
        "meta_desc": ("Konten edukasi kesehatan membentuk kepercayaan pasien jauh sebelum kunjungan "
                      "pertama. Ini yang membedakannya dari promosi dan cara mengukurnya."),
        "gambar": ["Konten Edukasi Kesehatan", "Membangun kepercayaan sebelum pasien datang"],
        "tag": [653, 634, 659, 654],
        "isi": """
<p>Keputusan pasien memilih fasilitas kesehatan jarang terjadi mendadak. Ada masa ragu yang diisi dengan
membaca, membandingkan, dan bertanya. Di masa itulah konten edukasi bekerja: bukan meminta pasien datang,
melainkan menjelaskan sampai dia merasa cukup paham untuk memutuskan.</p>

<p>Karena bentuknya menjelaskan, konten seperti ini sering dianggap kurang menghasilkan. Padahal justru
inilah yang membuat calon pasien percaya, karena informasi yang menolong lebih meyakinkan daripada
tawaran yang mendesak.</p>

<h2>Kepercayaan terbentuk sebelum pasien datang</h2>
<p>Orang menilai fasilitas kesehatan dari banyak hal kecil: apakah informasi di situsnya jelas, apakah
pertanyaannya dijawab, apakah jam praktik yang tertulis sesuai kenyataan. Penilaian itu berlangsung cepat
dan sering tanpa disadari.</p>

<p>Konten edukasi memperbaiki penilaian itu tanpa memerlukan tatap muka. Pembaca yang menemukan penjelasan
rinci tentang keluhannya akan menyimpulkan satu hal sederhana: fasilitas ini tahu apa yang dikerjakannya.</p>

<h2>Apa yang membuat konten edukasi dipercaya</h2>
<p>Empat hal ini membedakan edukasi yang dianggap serius dari yang dianggap promosi:</p>
<ul>
<li><strong>Ada penanggung jawab yang jelas.</strong> Isinya diperiksa tenaga medis, dan sumbernya tidak
disembunyikan.</li>
<li><strong>Tidak menjanjikan hasil.</strong> Tidak ada kalimat tentang kesembuhan pasti atau hasil yang
dijamin.</li>
<li><strong>Menjelaskan batasnya.</strong> Sebut kapan keluhan cukup ditangani mandiri dan kapan harus
diperiksa.</li>
<li><strong>Konsisten.</strong> Terbit teratur, dan jawabannya tidak berubah-ubah antara satu halaman dan
halaman lain.</li>
</ul>

<h2>Edukasi dan promosi tidak boleh dicampur</h2>
<p>Kesalahan yang paling sering terjadi adalah menyisipkan ajakan berobat di setiap paragraf. Pembaca
mengenali polanya, lalu berhenti mempercayai isinya. Cara yang lebih aman: pisahkan keduanya. Halaman
edukasi menjelaskan sampai tuntas, sedangkan ajakan diletakkan sekali saja di bagian akhir.</p>

<p>Kalau bingung menentukan batasnya, pakai ukuran sederhana: kalau seandainya ajakan di akhir halaman
dihapus, apakah isinya tetap berguna? Kalau tidak, berarti halaman itu promosi yang dibungkus edukasi.</p>

<h2>Konten yang paling cepat membangun kepercayaan</h2>
<p>Tiga jenis ini terbukti paling sering dibaca dan paling sering menutup keraguan:</p>
<ul>
<li><strong>Penjelasan prosedur.</strong> Apa yang akan dijalani pasien, apa yang dirasakan, dan berapa
lama.</li>
<li><strong>Tanya jawab.</strong> Pertanyaan nyata yang masuk ke kanal rumah sakit, dijawab tenaga medis
dan bisa dibaca orang lain.</li>
<li><strong>Pengingat pemeriksaan berkala.</strong> Informasi yang berguna bahkan ketika pembaca belum
sedang berobat.</li>
</ul>
<p>Ketiganya punya satu kesamaan: dibaca berulang, dan dibaca oleh orang yang belum tentu sedang sakit.
Justru itu yang membuatnya membangun ingatan jangka panjang.</p>

<h2>Tanda kepercayaan yang bisa diamati</h2>
<p>Kepercayaan memang terasa abstrak, tetapi jejaknya bisa dilihat:</p>
<ul>
<li>Ulasan yang menyebut hal spesifik, bukan hanya kalimat pujian umum.</li>
<li>Kunjungan berulang, atau pasien yang kembali untuk keluhan lain.</li>
<li>Rujukan dari mulut ke mulut, termasuk dari petugas kesehatan di tempat lain.</li>
<li>Pertanyaan yang masuk bergeser makin spesifik, tanda pembaca sudah memahami dasar-dasarnya.</li>
<li>Keluhan yang datang dengan perkiraan yang realistis, bukan harapan yang berlebihan.</li>
</ul>

<h2>Hasilnya tidak bisa diburu-buru</h2>
<p>Konten edukasi bekerja perlahan karena ia mengubah pemahaman, bukan sekadar menampilkan penawaran.
Kalau diukur mingguan, hasilnya sering terlihat kosong. Yang lebih masuk akal: ukur per kuartal, dan lihat
arahnya, bukan satu lonjakan.</p>

<p>Karena lambat, pekerjaan ini paling sering dihentikan di tengah jalan sebelum menampakkan hasilnya.
Padahal justru di situlah keunggulannya: fasilitas yang bertahan lebih lama akan memiliki kumpulan halaman
yang tidak dimiliki pesaingnya.</p>

<p>Ada satu cara untuk menjaga pekerjaan ini tetap berjalan meski hasilnya belum terlihat: tetapkan jadwal
terbit dan penanggung jawabnya sejak awal. Dengan begitu, keputusan melanjutkan atau menghentikan dibuat
berdasarkan catatan, bukan berdasarkan perasaan pada minggu itu.</p>

<h2>Menyebarkannya tanpa terasa mengganggu</h2>
<p>Isi yang sama bisa dipakai di beberapa kanal, dengan bentuk yang disesuaikan. Yang perlu dijaga:</p>
<ul>
<li>Jangan mengunggah isi yang sama persis di banyak tempat pada waktu yang sama.</li>
<li>Arahkan pembaca ke satu sumber utama, biasanya halaman di situs</li>
<li>Balas pertanyaan di kolom komentar dengan tambahan penjelasan, bukan sekadar mengarahkan ke tautan.</li>
<li>Hindari memasang tautan ke situs sendiri di ruang percakapan orang lain tanpa diminta.</li>
</ul>

<h2>Melibatkan tenaga medis tanpa membebani</h2>
<p>Bagian tersulit dalam pekerjaan ini biasanya bukan menulis, melainkan memastikan isinya benar. Tenaga
medis punya jadwal yang padat, sehingga meminta mereka menulis dari nol hampir selalu gagal di tengah
jalan.</p>

<p>Pola yang lebih masuk akal: tim komunikasi menyiapkan kerangka dan draf berdasarkan pertanyaan yang
benar-benar masuk, lalu dokter atau perawat memeriksa dan mengoreksi. Cara ini memangkas waktu pemeriksaan
karena yang dibaca sudah berupa tulisan utuh, bukan halaman kosong.</p>

<p>Supaya tidak menumpuk, sepakati jumlah pemeriksaan per pekan, misalnya dua naskah. Simpan juga jawaban
yang sudah diperiksa sebagai rujukan, sehingga pertanyaan serupa tidak perlu dibahas dua kali.</p>

<h2>Menyimpan dan memakai ulang isi</h2>
<p>Satu penjelasan yang sudah diperiksa jangan berhenti di satu tempat. Kalimat yang sama bisa dipakai untuk
halaman tanya jawab di situs, potongan unggahan media sosial, balasan siap pakai bagi petugas, dan pengingat
singkat di ruang tunggu.</p>

<p>Caranya, simpan jawaban dalam satu berkas kerja bersama nama penanggung jawab dan tanggal pemeriksaan
terakhir. Ketika jam layanan atau alur pendaftaran berubah, cukup satu sumber yang diperbarui, lalu versi
di kanal lain mengikuti.</p>

<p>Kebiasaan ini juga membuat pekerjaan tidak bergantung pada satu orang. Kalau nanti ada petugas baru,
jawaban yang sudah tersusun bisa langsung dipakai tanpa perlu mengulang dari awal.</p>

<h2>Kesalahan yang paling sering terjadi</h2>
<ul>
<li>Menulis dengan istilah medis tanpa penjelasan, sehingga pembaca merasa isinya bukan untuk dia.</li>
<li>Menghentikan pekerjaan setelah beberapa pekan karena tidak ada lonjakan kunjungan.</li>
<li>Menyalin isi dari situs lain, termasuk kalimat yang sebenarnya belum tentu berlaku di Indonesia.</li>
<li>Memuat info jadwal dan layanan yang sudah kedaluwarsa, sehingga kepercayaan yang dibangun justru
runtuh di kunjungan pertama.</li>
</ul>

<h2>Pertanyaan yang sering muncul</h2>

<h3>Apakah konten edukasi perlu ditulis tenaga medis sendiri?</h3>
<p>Tidak selalu. Tim komunikasi bisa menyusun drafnya, lalu tenaga medis memeriksa isinya sebelum terbit.</p>

<h3>Bagaimana mengukur keberhasilan konten edukasi?</h3>
<p>Lihat pertumbuhan kunjungan dari pencarian, jumlah kontak yang masuk dari halaman itu, dan perubahan
jenis pertanyaan yang diterima petugas dari waktu ke waktu.</p>

<h3>Apakah boleh mengangkat cerita pasien?</h3>
<p>Boleh dengan izin tertulis, dan sebaiknya dibatasi pada pengalaman, bukan klaim hasil. Cerita sensitif
sebaiknya tidak diangkat sama sekali.</p>

<h3>Berapa sering sebaiknya terbit?</h3>
<p>Yang lebih penting daripada jumlah adalah keteraturan. Satu kali sepekan secara konsisten lebih berguna
daripada lima kali dalam sebulan lalu berhenti.</p>

<h3>Apakah perlu menyesuaikan bahasa untuk wilayah tertentu?</h3>
<p>Bahasa nasional sudah cukup, tetapi menyebut wilayah layanan membantu pembaca lokal mengenali bahwa
fasilitas ini memang melayani daerahnya.</p>

<h2>Baca juga</h2>
<p>Bentuk-bentuk konten edukasi yang bisa langsung dipakai rumah sakit dirangkum di """ + l("induk") + """.
Supaya halaman tersebut mudah ditemukan pembaca, langkah teknisnya ada di """ + l("panduan") + """, dan
perannya dalam keseluruhan rencana pemasaran dibahas di """ + l("panduan_dm") + """.</p>

""" + TOMBOL + """
""",
    },
    {
        "judul": "Kenapa Website Rumah Sakit Sering Gagal Menghasilkan Pasien Baru?",
        "slug": "website-rumah-sakit-gagal-pasien",
        "fokus": "website rumah sakit",
        "meta_judul": "Website Rumah Sakit Gagal Menarik Pasien: Tujuh Sebab",
        "meta_desc": ("Website rumah sakit sering gagal menarik pasien bukan karena desainnya, tetapi "
                      "karena informasi layanan dan jalur menghubungi yang tidak jelas."),
        "gambar": ["Website Rumah Sakit", "Tujuh sebab gagal menghasilkan pasien"],
        "tag": [634, 654, 639, 659],
        "isi": """
<p>Banyak rumah sakit sudah memiliki situs yang tampak rapi dan lengkap. Namun setelah dilihat lebih dekat,
jumlah pasien baru yang datang dari situs itu tidak sebanding dengan pekerjaan yang dikeluarkan.
Kegagalannya jarang karena desain. Penyebabnya biasanya jauh lebih mendasar.</p>

<p>Halaman ini membahas tujuh sebab yang paling sering ditemui, diurutkan dari yang paling mudah
diperbaiki, sekaligus cara memeriksanya sendiri tanpa perlu alat berbayar.</p>

<h2>Keluhan yang paling sering muncul dari pihak rumah sakit</h2>
<p>Sebelum masuk ke sebabnya, ada beberapa keluhan yang hampir selalu sama: situs sudah lama dibuat tetapi
kunjungannya sedikit, isinya sudah banyak tetapi tidak ada yang menghubungi, dan tidak ada yang tahu
halaman mana yang sebenarnya bekerja. Tiga keluhan itu biasanya berasal dari sebab-sebab di bawah ini.</p>

<h2>Sebab pertama: halaman layanan tidak menjelaskan apa pun</h2>
<p>Buka satu halaman layanan di situs Anda, lalu baca seperti calon pasien. Apakah di situ dijelaskan
layanan apa itu, siapa yang menanganinya, kapan tersedia, dan bagaimana cara mendaftar? Kalau halamannya
hanya berisi satu paragraf pengantar dan daftar nama tindakan, calon pasien tidak mendapat apa pun yang
membantunya memutuskan.</p>

<p>Halaman layanan adalah tempat pembaca memastikan pilihannya. Kalau kosong, dia akan kembali ke hasil
pencarian dan membuka situs lain.</p>

<h2>Sebab kedua: jalur menghubungi tersembunyi</h2>
<p>Periksa satu hal sederhana: berapa kali harus menggulir untuk menemukan nomor telepon atau tautan
WhatsApp? Kalau jawabannya lebih dari satu layar, itu terlalu jauh. Pembaca yang datang dari pencarian
biasanya sedang mencari penyelesaian, bukan sedang membaca berkeliling.</p>

<p>Letakkan jalur menghubungi di tempat yang bisa ditemukan tanpa berpikir: bagian atas halaman, akhir
setiap halaman layanan, dan satu tombol tetap yang ikut bergulir.</p>

<h2>Sebab ketiga: lambat saat dibuka dari ponsel</h2>
<p>Sebagian besar kunjungan datang dari ponsel, sering dengan koneksi seadanya. Gambar berukuran besar,
tema yang memuat banyak skrip, dan tata letak yang bergeser saat dimuat membuat pembaca pergi sebelum
halaman selesai terbuka.</p>

<p>Akibatnya sering salah dibaca sebagai "tidak ada minat". Padahal minatnya ada, hanya tidak sempat
tertampung.</p>

<h2>Sebab keempat: tidak ada halaman untuk layanan dan wilayah tertentu</h2>
<p>Pasien mencari dengan menyebut layanan dan wilayah sekaligus. Kalau situs hanya punya satu halaman
layanan untuk seluruh wilayah, halaman itu harus bersaing dengan situs yang punya halaman khusus untuk
setiap kombinasi layanan dan daerah.</p>

<p>Solusinya bukan membuat ratusan halaman serupa, melainkan menyusun halaman yang benar-benar menjelaskan
satu layanan di satu wilayah, lengkap dengan jadwal dan alamat.</p>

<h2>Sebab kelima: isinya tentang rumah sakit, bukan tentang pasien</h2>
<p>Banyak situs dipenuhi berita internal, sambutan direktur, dan penghargaan. Semua itu wajar, tetapi tidak
menjawab pertanyaan calon pasien. Yang dicari orang adalah penjelasan keluhan, pilihan penanganan, jadwal
dokter, dan cara mendaftar.</p>

<p>Sebagai patokan: kalau delapan dari sepuluh halaman situs bercerita tentang rumah sakit, bukan tentang
kebutuhan pembaca, susunannya perlu diperiksa ulang.</p>

<p>Perbaikan pada bagian ini tidak selalu berarti membuat halaman baru. Sering kali cukup dengan mengubah
urutan: taruh penjelasan layanan dan cara mendaftar di bagian atas, lalu pindahkan berita internal ke
bagian yang tidak mengganggu pembaca yang sedang mencari pertolongan.</p>

<h2>Sebab keenam: tidak tersambung ke peta dan daftar bisnis</h2>
<p>Pencarian layanan kesehatan sangat sering dijawab dengan peta. Kalau profil bisnis rumah sakit tidak
lengkap, atau informasi di sana berbeda dengan yang ada di situs, calon pasien bisa bingung dan memilih
tempat lain.</p>

<p>Pastikan nama, alamat, dan nomor telepon sama persis di situs, di peta, dan di semua daftar tempat
rumah sakit tercatat. Ketidakcocokan sekecil apa pun membuat mesin pencari ragu menentukan mana yang benar.
Penjelasan lebih lengkap ada di """ + l("gbp") + """.</p>

<h2>Sebab ketujuh: tidak ada yang diukur</h2>
<p>Kalau tidak ada catatan tentang halaman mana yang dikunjungi dan dari mana asalnya, perbaikan berjalan
tanpa arah. Pengukuran yang paling dasar pun sudah berguna: jumlah kunjungan dari pencarian, halaman yang
paling banyak dibuka, dan jumlah kontak yang masuk.</p>

<p>Pasang pencatatan untuk klik WhatsApp, klik telepon, dan permintaan arah. Tiga hal itu yang paling dekat
dengan pasien yang benar-benar datang.</p>

<h2>Periksa sendiri dalam sepuluh menit</h2>
<p>Sebelum memutuskan perbaikan besar, lakukan pemeriksaan singkat ini langsung dari ponsel Anda: buka
situs, cari satu layanan, lalu hitung berapa kali harus menggulir sebelum menemukan cara menghubungi.
Ulangi untuk dua layanan lain agar hasilnya tidak kebetulan.</p>

<p>Setelah itu, buka satu halaman layanan dan baca sebagai calon pasien. Kalau Anda sendiri bingung
menentukan apa yang harus dilakukan setelah membacanya, calon pasien juga akan bingung. Dua pemeriksaan ini
biasanya sudah cukup menunjukkan bagian mana yang perlu dibenahi lebih dulu.</p>

<p>Langkah ketiga, minta satu orang di luar tim Anda melakukan hal yang sama tanpa diarahkan. Perhatikan di
bagian mana dia ragu atau berhenti membaca. Bagian itulah yang paling perlu diperbaiki, dan biasanya bukan
bagian yang selama ini dianggap penting.</p>

<h2>Urutan perbaikan yang saya sarankan</h2>
<ul>
<li>Rapikan halaman layanan yang sudah ada, jangan tambah dulu.</li>
<li>Pastikan jalur menghubungi mudah ditemukan di ponsel.</li>
<li>Bereskan kecepatan: perkecil gambar, kurangi skrip yang tidak perlu.</li>
<li>Samakan data di situs, peta, dan daftar tempat lain.</li>
<li>Baru kemudian tambah halaman untuk layanan dan wilayah yang belum tercakup.</li>
<li>Pasang pencatatan kontak sebelum mulai beriklan.</li>
</ul>
<p>Susunan teknis situs yang layak dipakai rumah sakit, termasuk fitur apa yang wajib ada, dibahas di
""" + l("website") + """, sedangkan pola pencarian pasien yang perlu dilayani ada di """ + l("seo_rs") + """.</p>

<h2>Pertanyaan yang sering muncul</h2>

<h3>Apakah desain baru akan menyelesaikan masalah ini?</h3>
<p>Belum tentu. Desain baru tanpa perbaikan isi dan jalur menghubungi hanya memindahkan masalah ke tampilan
yang lebih rapi.</p>

<h3>Berapa lama perbaikannya terasa?</h3>
<p>Perbaikan kecepatan dan jalur menghubungi biasanya terasa dalam hitungan pekan. Penambahan halaman baru
memerlukan waktu lebih panjang untuk muncul di pencarian.</p>

<h3>Apakah perlu aplikasi sendiri?</h3>
<p>Untuk sebagian besar rumah sakit, tidak. Situs yang cepat dan jelas serta profil bisnis yang lengkap
jauh lebih menentukan daripada aplikasi.</p>

<h3>Bagaimana kalau anggaran terbatas?</h3>
<p>Kerjakan berurutan. Halaman layanan dan jalur menghubungi lebih dulu, karena keduanya tidak memerlukan
biaya besar tetapi berpengaruh langsung.</p>

<h3>Siapa yang sebaiknya mengurus ini?</h3>
<p>Satu orang penanggung jawab dari internal yang memahami layanan, didampingi pihak teknis untuk
pengerjaan. Yang penting ada yang memutuskan dan memeriksa hasilnya.</p>

<h2>Baca juga</h2>
<p>Penyebab di atas berkaitan langsung dengan isi situs. Bentuk konten yang layak dikerjakan sudah
dirangkum di """ + l("induk") + """. Untuk menilai apakah perbaikan berjalan, ukurannya ada di
""" + l("indikator") + """ dan """ + l("panduan") + """.</p>

""" + TOMBOL + """
""",
    },
]


def rapikan(isi):
    """Gabungkan baris baru di dalam elemen teks supaya kalimat tidak patah di tengah."""
    TAG = ("p", "li", "h1", "h2", "h3", "h4", "blockquote", "figcaption")
    pola = re.compile(r"(<(" + "|".join(TAG) + r")(?:\s[^>]*)?>)(.*?)</\2>", re.S | re.I)

    def ganti(mo):
        dalam = mo.group(3)
        if "<br" in dalam or "\n" not in dalam:
            return mo.group(0)
        rapi = re.sub(r"\s{2,}", " ", re.sub(r"\s*\n\s*", " ", dalam)).strip()
        return f"{mo.group(1)}{rapi}</{mo.group(2)}>"
    return pola.sub(ganti, isi)


def skema_faq(isi):
    pasangan = []
    for mo in re.finditer(r"<h3>(.*?)</h3>\s*<p>(.*?)</p>", isi, re.S):
        tanya = re.sub(r"\s+", " ", re.sub("<[^>]+>", "", mo.group(1))).strip()
        jawab = re.sub(r"\s+", " ", re.sub("<[^>]+>", "", mo.group(2))).strip()
        if tanya and jawab:
            pasangan.append({"@type": "Question", "name": tanya,
                             "acceptedAnswer": {"@type": "Answer", "text": jawab}})
    if not pasangan:
        return ""
    return ('\n<script type="application/ld+json">'
            + json.dumps({"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": pasangan},
                         ensure_ascii=False) + "</script>\n")


def buat_gambar(judul_baris, sub, nama_berkas):
    from PIL import Image, ImageDraw, ImageFont
    FONTS = os.path.expanduser("~/.fonts")
    f = lambda n, s: ImageFont.truetype(os.path.join(FONTS, n), s)
    NAVY, BIRU, ABU, PUTIH = (11, 31, 58), (37, 99, 235), (100, 116, 139), (255, 255, 255)
    W, H, PAD = 1000, 567, 62

    def bungkus(t, font, maks):
        baris, kini = [], ""
        for k in t.split():
            c = (kini + " " + k).strip()
            if font.getlength(c) <= maks:
                kini = c
            else:
                if kini:
                    baris.append(kini)
                kini = k
        if kini:
            baris.append(kini)
        return baris

    img = Image.new("RGB", (W, H), PUTIH)
    dr = ImageDraw.Draw(img)
    dr.rectangle([0, 0, W, 12], fill=BIRU)
    dr.rectangle([W - 300, H - 300, W, H], fill=(240, 245, 255))
    for i in range(3):
        dr.ellipse([W - 230 + i * 26, H - 210 + i * 26, W - 60, H - 40], outline=BIRU, width=2)
    maks = W - 360
    y = 168
    for b in bungkus(judul_baris, f("Poppins-Bold.ttf", 56), maks):
        dr.text((PAD, y), b, font=f("Poppins-Bold.ttf", 56), fill=NAVY)
        y += 68
    y += 6
    for b in bungkus(sub, f("Poppins-Regular.ttf", 26), maks):
        dr.text((PAD, y), b, font=f("Poppins-Regular.ttf", 26), fill=ABU)
        y += 36
    dr.text((PAD, 62), "STUDIOSOFT", font=f("Poppins-SemiBold.ttf", 24), fill=BIRU)
    dr.text((PAD, 96), "Digital marketing rumah sakit", font=f("Poppins-Regular.ttf", 20), fill=ABU)
    dr.rectangle([PAD, H - 96, PAD + 74, H - 92], fill=BIRU)
    dr.text((PAD, H - 78), "studiosoft.id", font=f("Poppins-SemiBold.ttf", 23), fill=NAVY)
    dr.text((PAD, H - 46), "Konsultasi lewat WhatsApp · 0819-3500-0624",
            font=f("Poppins-Regular.ttf", 20), fill=ABU)
    img.save(nama_berkas, "WEBP", quality=92, method=6)
    return nama_berkas, img.size


def rest(path, method="GET", data=None):
    body = json.dumps(data).encode() if data is not None else None
    r = urllib.request.Request(S + path, data=body, headers=HJ, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=180) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            return e.code, e.read().decode()[:300]
        except Exception as e:
            terakhir = str(e)[:120]
            time.sleep(4)
    return 0, terakhir


def polos(h):
    h = re.sub(r"<script.*?</script>|<style.*?</style>", " ", h, flags=re.S | re.I)
    return re.sub(r"\s+", " ", re.sub("<[^>]+>", " ", h)).strip()


if __name__ == "__main__":
    print(f"hidupkan slug mati — {len(ARTIKEL)} artikel\n")
    for a in ARTIKEL:
        isi = rapikan(a["isi"])
        kata = len(polos(isi).split())
        internal = re.findall(r'href="(https://studiosoft\.id/[^"]+)"', isi)
        print(f"■ {a['judul']}")
        print(f"   /{a['slug']}/")
        print(f"   {kata} kata · h2 {isi.count('<h2')} · faq {isi.count('<h3>')} · "
              f"meta jdl {len(a['meta_judul'])} · desc {len(a['meta_desc'])} (mulai fokus: "
              f"{a['meta_desc'].lower().startswith(a['fokus'])}) · WA "
              f"{'ada' if 'wa.me/6281935000624' in isi else 'TIDAK'} · FAQPage "
              f"{'ada' if 'FAQPage' in skema_faq(isi) else 'TIDAK'}")
        print(f"   tautan internal {len(internal)}:")
        for u in internal:
            print(f"        {u.replace('https://studiosoft.id', '')}")
        print()

    if "--terbit" not in sys.argv:
        print("(uji — pakai --terbit untuk membuat + menerbitkan)")
        sys.exit(0)

    for a in ARTIKEL:
        st, cek = rest(f"/wp-json/wp/v2/posts?slug={a['slug']}&status=any&_fields=id,status,link")
        if isinstance(cek, list) and cek:
            print(f"\n■ /{a['slug']}/ sudah ada #{cek[0]['id']} status={cek[0]['status']} — dilewati")
            continue
        isi = rapikan(a["isi"])
        st, d = rest("/wp-json/wp/v2/posts", "POST", {
            "title": a["judul"], "slug": a["slug"], "content": isi + skema_faq(isi),
            "status": "publish", "comment_status": "closed", "categories": [1042, 26],
            "tags": a["tag"], "excerpt": a["meta_desc"]})
        if not isinstance(d, dict) or "id" not in d:
            print(f"   X gagal: http={st} {str(d)[:200]}")
            continue
        pid = d["id"]
        print(f"\n■ TERBIT #{pid} · {d.get('link')}")
        st2, _ = rest(f"/wp-json/wp/v2/posts/{pid}", "POST", {"meta": {
            "_yoast_wpseo_title": a["meta_judul"], "_yoast_wpseo_metadesc": a["meta_desc"],
            "_yoast_wpseo_focuskw": a["fokus"]}})
        print(f"   meta: http={st2}")
        try:
            berkas = f"{WS}/ss_feat_{a['slug'][:40]}.webp"
            _, ukuran = buat_gambar(a["gambar"][0], a["gambar"][1], berkas)
            data = open(berkas, "rb").read()
            hh = {**H, "Content-Type": "image/webp",
                  "Content-Disposition": f'attachment; filename="{os.path.basename(berkas)}"'}
            r = urllib.request.Request(f"{S}/wp-json/wp/v2/media", data=data, headers=hh, method="POST")
            with urllib.request.urlopen(r, timeout=300) as x:
                med = json.loads(x.read())
            rest(f"/wp-json/wp/v2/media/{med['id']}", "POST",
                 {"alt_text": a["judul"], "title": a["judul"][:80], "caption": "StudioSoft"})
            rest(f"/wp-json/wp/v2/posts/{pid}", "POST", {"featured_media": med["id"]})
            print(f"   gambar: media #{med['id']} {ukuran[0]}x{ukuran[1]} webp · {os.path.getsize(berkas)//1024} KB")
        except Exception as e:
            print(f"   gambar GAGAL: {str(e)[:120]}")
        time.sleep(1)
        st3, v = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=id,status,link,categories,tags,featured_media,content,meta")
        if isinstance(v, dict):
            m = v.get("meta") or {}
            print(f"   baca balik: status={v['status']} · gambar={v['featured_media']} · "
                  f"fokus='{m.get('_yoast_wpseo_focuskw')}' · {len(polos(v['content']['raw']).split())} kata")
            print(f"   alamat: {v.get('link')}")
