#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""StudioSoft: artikel baru — landing page vs website, mana yang dibuat lebih dulu (pilar A uang).

Jalur: python3 ss_artikel_landing_page_vs_website.py            (dry run: hitung + cek)
       python3 ss_artikel_landing_page_vs_website.py --draft    (buat DRAFT + meta Yoast)
       python3 ss_artikel_landing_page_vs_website.py --jadwal   (set status=future 2026-10-22 08:00)
"""
import base64, json, 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()

JUDUL = "Landing Page vs Website: Mana yang Perlu Dibuat Lebih Dulu"
SLUG = "landing-page-vs-website-mana-yang-dibuat-dulu"
FOKUS = "landing page vs website"
META_JUDUL = "Landing Page vs Website: Mana yang Dibuat Dulu?"
META_DESC = ("Landing page vs website bukan soal mana yang lebih bagus, tetapi mana yang perlu dibuat "
             "lebih dulu. Panduan memilih dari siklus penjualan dan biayanya.")
KATEGORI = [23]           # Website
TANGGAL = "2026-10-22T08:00:00"   # zona situs (Asia/Jakarta)

WA = ("https://wa.me/6281935000624?text=Halo%20StudioSoft%2C%20saya%20ingin%20konsultasi%20"
      "digital%20marketing")
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>')

ISI = """
<p>Pertanyaan yang sering muncul sebelum proyek dimulai bukan soal warna atau desain. Yang ditanyakan
biasanya ini: sebaiknya kami bikin landing page dulu, atau langsung website penuh. Pertanyaan itu wajar,
karena anggaran biasanya terbatas dan salah pilih di tahap awal terasa mahal.</p>

<p>Jawabannya bergantung pada satu hal yang jarang dibahas lebih dulu, yaitu bagaimana calon pelanggan
Anda mengambil keputusan. Ada pembeli yang butuh satu dorongan saja, ada yang perlu membaca lima halaman
sebelum mengirim pesan. Dua jenis pembeli itu butuh halaman yang berbeda, dan urutan pembuatannya juga
berbeda.</p>

<h2>Bedanya bukan soal mana yang lebih bagus</h2>
<p>Perbandingan landing page vs website sering berhenti di satu titik, seolah keduanya dua pilihan yang
saling menggantikan. Padahal keduanya bekerja di tahap yang berbeda dari perjalanan yang sama.</p>

<p>Landing page adalah satu halaman dengan satu tujuan. Semua isinya diarahkan ke satu tindakan, misalnya
mengisi formulir, menghubungi lewat WhatsApp, atau memesan produk tertentu. Tidak ada menu panjang, tidak
ada halaman artikel, dan tidak ada jalan keluar selain tindakan itu.</p>

<p>Website penuh berisi beberapa halaman yang saling menopang: profil usaha, daftar layanan, halaman
harga, artikel, dan halaman kontak. Fungsinya bukan mendorong satu tindakan, melainkan meyakinkan orang
bahwa usaha Anda memang ada, layak dipercaya, dan mengerti masalah yang mereka hadapi.</p>

<p>Kalau disederhanakan: landing page bekerja untuk orang yang sudah tahu apa yang dicarinya, sementara
website penuh bekerja untuk orang yang sedang menimbang. Menempatkan keduanya sebagai pilihan yang
bersaing justru membuat keputusan terasa lebih rumit daripada seharusnya.</p>

<h2>Kapan satu halaman sudah cukup</h2>
<p>Satu halaman biasanya cukup ketika permintaan sudah jelas dan tinggal diarahkan. Contohnya iklan
untuk satu layanan tertentu, promosi bulan tertentu, atau pendaftaran acara. Orang yang mengklik iklan
semacam itu sudah punya niat, dan yang mereka butuhkan adalah kejelasan bahwa mereka datang ke tempat
yang tepat.</p>

<p>Halaman tunggal juga cukup ketika Anda perlu menguji satu tawaran sebelum berinvestasi lebih besar.
Anda bisa melihat berapa banyak orang yang tertarik, apa keberatan yang muncul di percakapan, dan
kalimat mana yang paling banyak membuat orang menghubungi. Semua temuan itu jadi bahan saat website
penuh dibangun setelahnya.</p>

<p>Yang perlu diingat, halaman tunggal tetap butuh kedalaman. Penjelasan masalah, rincian layanan,
bukti pekerjaan, dan jawaban atas keberatan umum harus ada di halaman yang sama. Kalau isinya hanya
satu paragraf berisi jualan, halaman itu tidak akan meyakinkan siapa pun.</p>

<h2>Kapan website penuh lebih masuk akal</h2>
<p>Website penuh lebih masuk akal kalau orang tidak membeli sekali lihat. Layanan jasa, alat kesehatan,
peralatan industri, dan pendidikan biasanya melewati beberapa kali pertemuan sebelum keputusan diambil.
Halaman profil dan artikel yang menjelaskan cara kerja Anda berperan besar di masa pertimbangan itu.</p>

<p>Website penuh juga dibutuhkan ketika Anda ingin ditemukan lewat pencarian, bukan hanya lewat iklan.
Mesin pencari menilai sekumpulan halaman yang saling menjelaskan, bukan satu halaman tunggal. Satu
halaman yang membahas lima jenis layanan sekaligus jadi kabur, sedangkan lima halaman yang masing-masing
membahas satu layanan bisa menjawab kueri yang berbeda.</p>

<p>Alasan ketiga praktis: reputasi. Banyak calon pelanggan memeriksa lebih dulu, dan mereka mencari
jejak yang membuat mereka yakin. Halaman tentang usaha Anda, cara Anda bekerja, dan contoh pekerjaan
sebelumnya bekerja seperti referensi yang bisa dibaca kapan saja.</p>

<h2>Cara menentukan dari siklus penjualan</h2>
<p>Cara paling cepat mengambil keputusan adalah menghitung berapa lama waktu yang dibutuhkan dari
kontak pertama sampai pembayaran. Kalau hampir semua pembeli memutuskan di hari yang sama, mulai dari
landing page. Kalau pembeli membutuhkan beberapa pertemuan, beberapa penawaran, dan persetujuan orang
lain, mulai dari website penuh.</p>

<p>Langkah kedua, periksa dari mana calon pelanggan datang. Kalau semuanya berasal dari iklan berbayar
dan jaringan pribadi, landing page cukup untuk mulai. Kalau sebagian besar datang dari pencarian dan
rekomendasi, halaman yang bisa ditemukan dan dirujuk orang lain jauh lebih berguna.</p>

<p>Langkah ketiga, hitung berapa jenis tawaran yang Anda punya. Satu tawaran cocok dengan satu halaman.
Kalau ada lima jenis layanan yang berbeda dengan pembeli berbeda, Anda butuh rumah untuk semuanya. Di
situ website penuh berhenti menjadi kemewahan dan mulai jadi kebutuhan.</p>

<h2>Soal biaya dan waktu: mana yang lebih ringan di awal</h2>
<p>Dari sisi pekerjaan, satu halaman jelas lebih cepat jadi. Yang perlu disusun hanya alurnya: masalah
yang dihadapi pembaca, penjelasan solusi, bukti, lalu satu tombol tindakan. Tapi halaman yang jadi
cepat sering juga cepat tertinggal, karena tidak ada tempat untuk menampung pertanyaan baru yang muncul
setelah promosi berjalan.</p>

<p>Website penuh butuh waktu lebih lama sejak awal, sebab ada struktur yang harus diputuskan lebih dulu:
halaman apa saja yang dibuat, bagaimana semuanya saling menaut, dan siapa yang memelihara isinya.
Pengeluaran dan waktu untuk halaman-halaman awal itu bisa dibaca di
<a href="https://studiosoft.id/berapa-biaya-jasa-pembuatan-website/">rincian biaya pembuatan
website</a>, supaya Anda bisa membandingkan dengan hasil yang diharapkan.</p>

<p>Kalau Anda memutuskan mulai dari website, pilih pengembang yang juga memikirkan cara halaman itu
ditemukan. Halaman yang rapi tapi tidak pernah muncul di pencarian hanya memindahkan masalah ke depan.
Untuk gambaran pekerjaan itu, lihat <a
href="https://studiosoft.id/jasa-pembuatan-website-surabaya/">jasa pembuatan website Surabaya</a> yang
memuat alur pengerjaan dari struktur sampai peluncuran.</p>

<h2>Kesalahan yang sering terjadi saat memilih</h2>
<p>Kesalahan pertama, membuat halaman tunggal untuk masalah yang sebenarnya butuh penjelasan panjang.
Halaman seperti itu akhirnya ditambahi menu, bagian tambahan, dan tautan keluar seadanya. Dalam
praktiknya, halaman tunggal yang dibebani banyak tujuan berubah jadi website setengah matang.</p>

<p>Kesalahan kedua, menunda peluncuran karena mengejar kelengkapan. Website yang menunggu semua halaman
selesai tidak menghasilkan apa pun selama dikerjakan. Lebih baik menerbitkan halaman yang paling
menguntungkan lebih dulu, lalu menambah halaman lain secara berkala.</p>

<p>Kesalahan ketiga, membangun website lalu membiarkannya tanpa perawatan. Isi yang tidak diperbarui
melemahkan kepercayaan, dan masalah teknis kecil yang dibiarkan menumpuk sampai akhirnya menurunkan
jumlah kunjungan dari pencarian.</p>

<h2>Pertanyaan yang sering diajukan</h2>

<h3>Kalau anggaran terbatas, sebaiknya mulai dari mana</h3>
<p>Mulai dari satu halaman untuk tawaran yang paling menguntungkan, lalu ukur hasilnya. Kalau percakapan
dengan calon pembeli mulai berulang ke pertanyaan yang sama, pertanyaan itu jadi halaman berikutnya.
Dengan cara ini, setiap halaman baru dibangun karena ada kebutuhan yang terbukti, bukan karena
perkiraan.</p>

<h3>Apakah landing page bisa dipasang di website yang sudah ada</h3>
<p>Bisa, dan biasanya itu pilihan paling hemat. Satu website bisa memuat beberapa halaman kampanye
dengan alamat yang berbeda, sementara halaman profil dan artikel tetap ada. Yang perlu dijaga hanya
struktur tautannya, supaya halaman kampanye tidak bersaing dengan halaman layanan utama di hasil
pencarian.</p>

<h3>Berapa lama sampai hasilnya terlihat</h3>
<p>Halaman kampanye yang didatangkan lewat iklan bisa memberi data dalam hitungan hari, karena
kunjungannya langsung. Halaman yang mengandalkan pencarian organik butuh waktu lebih panjang, umumnya
beberapa bulan, sebab mesin pencari perlu merayapi, menilai, dan membandingkan halaman Anda dengan
halaman lain. Dua jalur ini bisa disiapkan bersamaan dengan tujuan berbeda.</p>

<h3>Apakah website penuh bisa dibangun bertahap</h3>
<p>Bisa, asalkan strukturnya ditentukan sejak awal. Tentukan lebih dulu halaman apa saja yang akan ada
dan alamat masing-masing, lalu terbitkan satu per satu sesuai prioritas. Menambah halaman di struktur
yang sudah rapi jauh lebih murah daripada membongkar struktur yang tumbuh tanpa rencana.</p>

<h2>Langkah berikutnya</h2>
<p>Sebelum memutuskan, tuliskan jawaban atas tiga hal ini: berapa lama calon pembeli Anda mengambil
keputusan, dari mana mereka biasanya datang, dan berapa jenis tawaran yang perlu ditampung. Dari tiga
jawaban itu, pilihannya menjadi jelas dengan sendirinya.</p>

<p>Kalau Anda ingin membandingkan dengan pekerjaan yang sudah berjalan, lihat
<a href="https://studiosoft.id/pentingnya-landing-page-bisnis-kecil/">panduan landing page untuk bisnis
kecil</a> serta <a href="https://studiosoft.id/jasa-seo-surabaya-paket-harga/">paket dan harga jasa SEO
Surabaya</a> untuk sisi pencariannya. Anda bisa mulai dari satu halaman yang paling menguntungkan
minggu ini, tanpa menunggu seluruh rencana selesai.</p>

""" + TOMBOL + """
<p><em>Catatan: urutan pengerjaan di atas kami pakai saat membantu klien memilih antara halaman tunggal
dan website penuh. Kalau posisi usaha Anda ada di tengah keduanya, sebutkan saja kondisi Anda, itu lebih
cepat dibanding menebak sendiri.</em></p>
"""

SCHEMA = """
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[
{"@type":"Question","name":"Kalau anggaran terbatas, sebaiknya mulai dari mana","acceptedAnswer":{"@type":"Answer","text":"Mulai dari satu halaman untuk tawaran yang paling menguntungkan, lalu ukur hasilnya. Kalau percakapan dengan calon pembeli mulai berulang ke pertanyaan yang sama, pertanyaan itu jadi halaman berikutnya. Dengan cara ini, setiap halaman baru dibangun karena ada kebutuhan yang terbukti, bukan karena perkiraan."}},
{"@type":"Question","name":"Apakah landing page bisa dipasang di website yang sudah ada","acceptedAnswer":{"@type":"Answer","text":"Bisa, dan biasanya itu pilihan paling hemat. Satu website bisa memuat beberapa halaman kampanye dengan alamat yang berbeda, sementara halaman profil dan artikel tetap ada. Yang perlu dijaga hanya struktur tautannya, supaya halaman kampanye tidak bersaing dengan halaman layanan utama di hasil pencarian."}},
{"@type":"Question","name":"Berapa lama sampai hasilnya terlihat","acceptedAnswer":{"@type":"Answer","text":"Halaman kampanye yang didatangkan lewat iklan bisa memberi data dalam hitungan hari, karena kunjungannya langsung. Halaman yang mengandalkan pencarian organik butuh waktu lebih panjang, umumnya beberapa bulan, sebab mesin pencari perlu merayapi, menilai, dan membandingkan halaman Anda dengan halaman lain."}},
{"@type":"Question","name":"Apakah website penuh bisa dibangun bertahap","acceptedAnswer":{"@type":"Answer","text":"Bisa, asalkan strukturnya ditentukan sejak awal. Tentukan lebih dulu halaman apa saja yang akan ada dan alamat masing-masing, lalu terbitkan satu per satu sesuai prioritas. Menambah halaman di struktur yang sudah rapi jauh lebih murah daripada membongkar struktur yang tumbuh tanpa rencana."}}]}
</script>
"""
ISI_FULL = ISI + SCHEMA

UA = {"User-Agent": "Mozilla/5.0"}


def rest(p, method="GET", data=None):
    h = {"Authorization": f"Basic {AUTH}", **UA}
    body = None
    if data is not None:
        body = json.dumps(data).encode()
        h["Content-Type"] = "application/json"
    r = urllib.request.Request(S + p, data=body, headers=h, method=method)
    terakhir = "gagal"
    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(html):
    t = re.sub(r"<script.*?</script>", " ", html, flags=re.S | re.I)
    t = re.sub(r"<[^>]+>", " ", t)
    return re.sub(r"\s+", " ", t).strip()


if __name__ == "__main__":
    teks = polos(ISI_FULL)
    kata = len(teks.split())
    internal = re.findall(r'href="(https://studiosoft\.id/[^"]+)"', ISI_FULL)
    print(f"judul    : {JUDUL} ({len(JUDUL)} char)")
    print(f"slug     : {SLUG}")
    print(f"meta jdl : {META_JUDUL} ({len(META_JUDUL)} char)")
    print(f"meta desc: {len(META_DESC)} char · mulai dgn fokus: {META_DESC.lower().startswith(FOKUS)}")
    print(f"panjang  : {kata} kata (baku 1.000-1.300)")
    print(f"h2       : {ISI_FULL.count('<h2>')} · h3: {ISI_FULL.count('<h3>')}")
    print(f"internal : {len(internal)} {internal}")
    print(f"tombol WA: {'ada' if 'Konsultasi Gratis' in ISI_FULL and 'wa.me/6281935000624' in ISI_FULL else 'TIDAK ADA'}")
    print(f"FAQPage  : {'ada' if 'FAQPage' in ISI_FULL else 'TIDAK ADA'}")
    print(f"fokus kw di ISI: {ISI_FULL.lower().count(FOKUS)}x")

    if "--draft" not in sys.argv and "--jadwal" not in sys.argv:
        print("\n(dry run)")
        sys.exit(0)

    st, cek = rest(f"/wp-json/wp/v2/posts?slug={SLUG}&status=any&_fields=id,status")
    if isinstance(cek, list) and cek:
        pid = cek[0]["id"]
        print(f"\n   sudah ada #{pid} status={cek[0]['status']} -> lanjut pakai id itu")
    else:
        st, d = rest("/wp-json/wp/v2/posts", "POST", {
            "title": JUDUL, "slug": SLUG, "content": ISI_FULL, "status": "draft",
            "comment_status": "closed", "categories": KATEGORI, "excerpt": META_DESC})
        if not isinstance(d, dict) or "id" not in d:
            print(f"   X gagal buat draft: http={st} {str(d)[:300]}")
            sys.exit(1)
        pid = d["id"]
        print(f"\n   OK DRAFT #{pid} -> {d.get('link')} status={d.get('status')}")

    st, d2 = rest(f"/wp-json/wp/v2/posts/{pid}", "POST", {"meta": {
        "_yoast_wpseo_title": META_JUDUL, "_yoast_wpseo_metadesc": META_DESC,
        "_yoast_wpseo_focuskw": FOKUS}})
    print(f"   meta: http={st}")

    st, v = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit")
    if isinstance(v, dict):
        m = v.get("meta") or {}
        isi_raw = v["content"]["raw"]
        print(f"   baca balik: status={v['status']} tanggal={v['date']} slug={v['slug']} kategori={v.get('categories')}")
        print(f"   meta tersimpan: fokus='{m.get('_yoast_wpseo_focuskw')}' "
              f"judul='{m.get('_yoast_wpseo_title')}' desc={len(m.get('_yoast_wpseo_metadesc') or '')} char")
        print(f"   isi: {len(isi_raw)} char · {len(polos(isi_raw).split())} kata · "
              f"wa.me={'ya' if 'wa.me/6281935000624' in isi_raw else 'TIDAK'} · "
              f"FAQPage={'ya' if 'FAQPage' in isi_raw else 'TIDAK'}")
    else:
        print(f"   X baca balik gagal: {v}")

    if "--jadwal" in sys.argv:
        st, d3 = rest(f"/wp-json/wp/v2/posts/{pid}", "POST", {"status": "future", "date": TANGGAL})
        print(f"\n   set future: http={st} status={(d3 or {}).get('status') if isinstance(d3, dict) else d3}")
        st, v2 = rest(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=id,status,date,date_gmt,slug,link")
        print(f"   baca balik: {json.dumps(v2, ensure_ascii=False)}")
        json.dump({"id": pid, "slug": SLUG, "status": (v2 or {}).get("status"),
                   "date": (v2 or {}).get("date"), "kata": kata, "internal": internal},
                  open(f"{WS}/ss_artikel_landing_page_hasil.json", "w"), ensure_ascii=False, indent=1)
        print("   -> ss_artikel_landing_page_hasil.json")
