Progress yang sudah dilakukan

Uncanny Automator

Nama Recipe : Profil Klien – SiLaporKerjaCL

Keterangan

  • Trigger : a user submit form “profil klien” , form ID = 1103
  • Action : Create Post – Custom Post Type (CPT) “Update Klien” , dengan judul post diambil dari token yaitu “Date” “Time” | “Nama Klien”
  • Custom CSS tidak diaktifkan, Custom Java Script tidak diaktifkan

Post Content Code
<div class=”profil-klien-wrapper”>
<div class=”row”><span class=”label”>Nama Perusahaan:</span> <span class=”value”>{{1138:FRFORM:1103|text-4}}</span></div>
<div class=”row”><span class=”label”>Kode Klien:</span> <span class=”value”>{{1138:FRFORM:1103|text-1}}</span></div>
<div class=”row”><span class=”label”>Alamat:</span> <span class=”value”>{{1138:FRFORM:1103|textarea-3}}</span></div>
<div class=”row”><span class=”label”>Lokasi/Provinsi:</span> <span class=”value”>{{1138:FRFORM:1103|text-2}}</span></div>
<div class=”row”><span class=”label”>Contact Person:</span> <span class=”value”>{{1138:FRFORM:1103|name-2}}</span></div>
<div class=”row”><span class=”label”>Jabatan Contact Person:</span> <span class=”value”>{{1138:FRFORM:1103|text-3}}</span></div>
<div class=”row”><span class=”label”>Nomor Telepon/HP:</span> <span class=”value”>{{1138:FRFORM:1103|phone-1}}</span></div>
<div class=”row”><span class=”label”>Email:</span> <span class=”value”>{{1138:FRFORM:1103|email-1}}</span></div>
<div class=”row”><span class=”label”>Informasi Mengenai Klien:</span> <span class=”value”>{{1138:FRFORM:1103|textarea-1}}</span></div>
<div class=”row”><span class=”label”>Keterangan:</span> <span class=”value”>{{1138:FRFORM:1103|textarea-2}}</span></div>
</div>

Nama Recipe : Update Klien – SiLaporKerjaCL

Keterangan

  • Trigger : a user submit form “updaet klien form” , form ID = 1101
  • Action : Create Post – Custom Post Type (CPT) “Update Klien” , dengan judul post diambil dari token yaitu “Date” “Time” | “Nama Klien”
  • Custom CSS tidak diaktifkan, Custom Java Script tidak diaktifkan

Post Content Code
<div class=”update-klien-wrapper”>
<div class=”row”><strong><span class=”label”>Tanggal Update:</span></strong> <span class=”value”>{{1141:FRFORM:1101|date-1}}</span></div>
<div class=”row”><strong><span class=”label”>Kode Klien:</span></strong> <span class=”value”>{{1141:FRFORM:1101|text-1}}</span></div>
<div class=”row”><strong><span class=”label”>Nama Klien:</span></strong> <span class=”value”>{{1141:FRFORM:1101|text-2}}</span></div>
<div class=”row”><strong><span class=”label”>Status:</span></strong> <span class=”value”>{{1141:FRFORM:1101|select-1}}</span></div>
<div class=”row”><strong><span class=”label”>Update Klien:</span></strong> <span class=”value”>{{1141:FRFORM:1101|textarea-1}}</span></div>
<div class=”row”><strong><span class=”label”>Keterangan:</span></strong> <span class=”value”>{{1141:FRFORM:1101|textarea-2}}</span></div>
<div class=”row”><strong><span class=”label”>Dokumen #1:</span></strong> <span class=”value dokumen-link”> <a href=”{{1141:FRFORM:1101|upload-1}}” target=”_blank” rel=”noopener”>Lihat Dokumen</a> </span></div>
<div class=”row”><strong><span class=”label”>Dokumen #2:</span></strong> <span class=”value dokumen-link”> <a href=”{{1141:FRFORM:1101|upload-5}}” target=”_blank” rel=”noopener”>Lihat Dokumen</a> </span></div>
<div class=”row”><strong><span class=”label”>Image #1:</span></strong> <span class=”value image-preview”> <a href=”{{1141:FRFORM:1101|upload-6}}” target=”_blank” rel=”noopener”> <img style=”max-height: 120px;” src=”{{1141:FRFORM:1101|upload-6}}” alt=”Image #1″ /> </a> </span></div>
<div class=”row”><strong><span class=”label”>Image #2:</span></strong> <span class=”value image-preview”> <a href=”{{1141:FRFORM:1101|upload-4}}” target=”_blank” rel=”noopener”> <img style=”max-height: 120px;” src=”{{1141:FRFORM:1101|upload-4}}” alt=”Image #2″ /> </a> </span></div>
</div>

Forminator

Nama Form: Profil Klien, ID Form = 1103 , untuk SiLaporKerjaCL,  shortcode=forminator_form id=”1103″ , tanda kurung  [ ] pada shortcode tidak dituliskan, supaya formulirnya tidak tampil di halaman ini

Field pada form Profil Klien

  • Label=Date ; Type=hidden-1 ; Submission date (dd/mm/yyy)
  • Label=Time ; Type=hidden-3 ; Submission Time (hh:mm:sss am/pm time zone)
  • Label=Nama ; Type=hidden-2 ; otomatis capture login username
  • Label=Jabatan ; Type=hidden-4 ; Custom Value dikosongkan
  • Label=Divisi ; Type=hidden-5 ; Custom Value dikosongkan
  • Label=Nama Klien ; Type=text-4 
  • Label=Kode Klien ; Type=text-1
  • Label=Alamat ; Type=textarea-3
  • Label=Lokasi ; Type=text-2
  • Label=Contact Person ; Type=name-2
  • Label=Jabatan Contact Person ; Type=text-3
  • Label=Nomor Telepon ; Type=phone-1
  • Label=Email ; Type=email-1
  • Label=Informasi Klien ; Type=textarea-1
  • Label=Keterangan ; Type=textarea-2

Nama Form: Profil Klien, ID Form = 1101 , untuk SiLaporKerjaCL, shortcode=forminator_form id=”1101″ , tanda kurung  [ ] pada shortcode tidak dituliskan, supaya formulirnya tidak tampil di halaman ini

Field pada form Update Klien

  • Label=Date ; Type=hidden-1 ; Submission date (dd/mm/yyy)
  • Label=Time ; Type=hidden-3 ; Submission Time (hh:mm:sss am/pm time zone)
  • Label=Nama ; Type=hidden-2 ; otomatis capture login username
  • Label=Jabatan ; Type=hidden-4 ; Custom Value dikosongkan
  • Label=Divisi ; Type=hidden-5 ; Custom Value dikosongkan
  • Label=Tanggal ; Type=date-1
  • Label=Kode Klien ; Type=text-1
  • Label=Nama Klien ; Type=text-2 
  • Label=Status ; Type=select-1
  • Label=Update Klien ; Type=textarea-1
  • Label=Keterangan ; Type=textarea-2
  • Label=Dokumen #1 ; Type=upload-1
  • Label=Dokumen #2 ; Type=upload-5
  • Label=Image #1 ; Type=upload-6
  • Label=Image #2 ; Type=upload-4
 

ACF

Nama Field Group: Profil Klien – SiLaporKerjaCL

Field Group “Profil Klien” (Status Aktif)

  • Label=Tanggal Submit ; Name=tanggal_submit ; Type=Date Picker
  • Label=Jam Submit ; Name=jam_submit ; Type=Time Picker
  • Label=User Login ; Name=user_login ; Type=Text
  • Label=Jabatan ; Name=user_jabatan ; Type=Text
  • Label=Divisi ; Name=user_divisi ; Type=Text
  • Label=Nama Perusahaan; Name=nama_perusahaan ; Type=Text
  • Label=Kode Klien; Name=kode_klien ; Type=Text
  • Label=Alamat; Name=alamat_klien ; Type=Text Area
  • Label=Lokasi; Name=lokasi_klien ; Type=Text
  • Label=Contact Person ; Name=contact_person ; Type=Text
  • Label=Nomor Telepon ; Name=nomor_telepon ; Type=Text
  • Label=Email ; Name=email_klien ; Type=Text
  • Label=Informasi Klien ; Name=informasi_klien ; Type=Text Area
  • Label=Keterangan Klien ; Name=keterangan_klien ; Type=Text Area
 
 

Nama Field Group: Update Klien – SiLaporKerjaCL

Field Group “Update Klien” (Status Aktif)

  • Label=Tanggal Submit ; Name=tanggal_submit ; Type=Date Picker
  • Label=Jam Submit ; Name=jam_submit ; Type=Time Picker
  • Label=User Login ; Name=user_login ; Type=Text
  • Label=Jabatan ; Name=user_jabatan ; Type=Text
  • Label=Divisi ; Name=user_divisi ; Type=Text
  • Label=Tanggal Update; Name=tanggal_update ; Type=Date Picker
  • Label=Kode Klien; Name=kode_klien ; Type=Text
  • Label=Nama Klien; Name=nama_klien ; Type=Text
  • Label=Status ; Name=status ; Type=Select
  •  Label=Update Klien; Name=update_klien; Type=Text Area
  • Label=Keterangan Klien ; Name=keterangan_klien ; Type=Text Area
  • Label=Dokumen #1 ; Name=dokumen_1; Type=File
  • Label=Dokumen #2 ; Name=dokumen_2; Type=File
  • Label=Image #1 ; Name=image_1; Type=Image
  • Label=Image #2 ; Name=image_2; Type=Image

SNIPPETS

Nama : Register CPT Aktivitas Regular

Keterangan “Register CPT Aktivitas Regular”

  • Membuat Custom Post Type Aktivitas Regular
  • Run snippet everywhere
  • Status Aktif
  • Muncul menu WP “Aktivitas Regular”
  • Untuk versi SiLaporKerja Demo

Script:
add_action(‘init’, function() {
$labels = array(
‘name’ => ‘Aktivitas Regular’,
‘singular_name’ => ‘Aktivitas Regular’,
‘add_new’ => ‘Tambah Aktivitas’,
‘add_new_item’ => ‘Tambah Aktivitas Baru’,
‘edit_item’ => ‘Edit Aktivitas’,
‘new_item’ => ‘Aktivitas Baru’,
‘view_item’ => ‘Lihat Aktivitas’,
‘search_items’ => ‘Cari Aktivitas’,
‘not_found’ => ‘Tidak ditemukan’,
‘not_found_in_trash’ => ‘Tidak ditemukan di tong sampah’,
‘all_items’ => ‘Semua Aktivitas’,
‘archives’ => ‘Arsip Aktivitas’,
‘insert_into_item’ => ‘Masukkan ke Aktivitas’,
‘uploaded_to_this_item’ => ‘Upload ke Aktivitas ini’,
);

$args = array(
‘labels’ => $labels,
‘public’ => true,
‘publicly_queryable’ => true,
‘show_ui’ => true,
‘show_in_rest’ => true, // Penting untuk REST API & block editor
‘rest_base’ => ‘aktivitas_regular’,
‘menu_icon’ => ‘dashicons-welcome-write-blog’,
‘supports’ => array(‘title’, ‘editor’, ‘author’, ‘custom-fields’),
‘has_archive’ => true,
‘rewrite’ => array(‘slug’ => ‘aktivitas’),
);

register_post_type(‘aktivitas_regular’, $args);
});

 

Nama : Custom Java Script

Keterangan “Custom Java Script”

Untuk modifikasi dan logika content post pada Uncanny Automator , yaitu :

  • Sembunyikan Dokumen, jika tidak ada URL
  • Sembunyikan Gambar, jika tidak ada URL
  • Format angka ribuan pada field nominal kontrak
  • Run snippet everywhere
  • Kondisi Aktif
  • Untuk versi SiLaporKerja Demo

Script:
add_action(‘wp_footer’, function () {
if (is_singular(‘aktivitas_regular’)) : ?>
<script>
document.addEventListener(“DOMContentLoaded”, function () {
// Sembunyikan dokumen jika tidak ada URL
document.querySelectorAll(“.dokumen”).forEach(function (el) {
const url = el.getAttribute(“data-url”)?.trim();
if (!url || url === “#” || url.includes(“null”)) {
const link = el.querySelector(“a”);
if (link) link.style.display = “none”;
}
});

// Sembunyikan gambar jika tidak ada URL
document.querySelectorAll(“.gambar”).forEach(function (el) {
const url = el.getAttribute(“data-url”)?.trim();
if (!url || url === “#” || url.includes(“null”)) {
const link = el.querySelector(“a”);
if (link) link.style.display = “none”;
}
});

// Format angka Nominal Kontrak
const nominalEl = document.querySelector(“.nominal-kontrak”);
if (nominalEl) {
const raw = nominalEl.innerText || nominalEl.textContent;
const cleaned = raw.replace(/\D/g, “”);
const number = parseInt(cleaned, 10);
if (!isNaN(number)) {
nominalEl.textContent = “Rp ” + number.toLocaleString(“id-ID”);
}
}
});
</script>
<?php endif;
});

Nama : Custom CSS

Keterangan “Custom CSS”

  • Run snippet everywhere
  • Status Aktif
  • Untuk versi SiLaporKerja Demo

Untuk Uncanny Automator Post & lainnya:

  • Layout single post “Aktivitas Regular”
  • tampilan 2 kolom pada pc, dan 1 kolom pada mobile
  • Styling judul pada post
  • Styling judul pada WP Show posts
  • Styling tampilan dashboard SiLaporKerja
  • Pagination pada daftar judul post Aktivitas Regular 

Script:
add_action(‘wp_head’, function () { ?>

  <style>
    /* ✅ Layout single post ‘Aktivitas Regular’ */
    <?php if (is_singular(‘aktivitas_regular’)) : ?>
    .content-grid {
      display: grid;
      grid-template-columns: repeat(2, 1fr);
      gap: 20px;
    }
    @media (max-width: 768px) {
      .content-grid {
        grid-template-columns: 1fr;
      }
    }
    .field-wrapper {
      border: 1px dashed #ccc;
      padding: 15px;
      border-radius: 8px;
      background: #fafafa;
    }
    .thumbnail {
      width: 100%;
      max-width: 200px;
      height: auto;
      margin-top: 10px;
      border: 1px solid #ddd;
      border-radius: 4px;
    }
    <?php endif; ?>
 
    /* ✅ Styling Judul Post */
    .entry-title {
      font-size: 20px;
      font-weight: 550;
      margin-top: 20px;
      margin-bottom: 15px;
      line-height: 1.3;
      text-align: left;
      color: #333;
    }
 
    /* ✅ Styling WP Show Posts */
    .wp-show-posts-entry-title {
      font-size: 16px !important;
      color: #000 !important;
      margin-bottom: 10px;
      font-weight: 485;
    }
 
    .wp-show-posts-single {
      border-bottom: 1px dashed #ccc;
      padding: 15px 0;
    }
 
    .wp-show-posts-entry-title a {
      text-decoration: none;
    }
 
    .wp-show-posts-entry-title a:hover {
      color: #0073aa;
    }
 
    /* ✅ Styling dashboard user list & aktivitas */
    .aktivitas-list, .user-list, form {
      border: 1px dashed #aaa;
      background-color: #f9f9f9;
      padding: 15px;
      border-radius: 6px;
      margin-bottom: 20px;
    }
 
    .aktivitas-list li,
    .user-list li {
      margin: 8px 0;
    }
 
    .aktivitas-list li a,
    .user-list li a,
    select {
      text-decoration: none;
      color: #0073aa;
    }
 
    .aktivitas-list li a:hover,
    .user-list li a:hover {
      color: #004c7a;
    }
 
    .user-list strong {
      display: inline-block;
      margin-bottom: 5px;
      font-size: 15px;
    }
 
    select {
      padding: 6px 10px;
      border: 1px solid #ccc;
      border-radius: 4px;
      margin-top: 5px;
    }
 
    .aktivitas-user-label {
      font-weight: bold;
      margin-bottom: 10px;
      display: block;
    }
  
.pagination-nav a {
  margin-left: 5px;
  text-decoration: none;
  font-size: 18px;
  padding: 4px 8px;
  border: 1px solid #ccc;
  border-radius: 4px;
  color: #0073aa;
}
 
.pagination-nav a:hover {
  background-color: #eee;
  color: #004c7a;
}
 
    </style>
<?php });

Nama : Struktur Data Akses (Map Direktur, Manager & Staf)

Keterangan “Struktur Data Akses (Map Direktur, Manager & Staf)”

Mendefinisikan hubungan staff, manager dan direktur, serta hak akses masing masing

  • Direktur bisa akses ke seluruh tim nya
  • Manager bisa akses ke seluruh tim di bawahnya, tidak bisa akses ke manager lain, tidak bisa akses ke staff yang berada di bawah manager lain
  • Staff hanya bisa akses datanya sendiri
  • Run snippet everywhere
  • Kondisi Aktif
  • Untuk versi SiLaporKerja Demo

Script
function silaporkerja_get_team_structure() {
return [
‘marketing’ => [
‘manager’ => ‘rina’,
‘staff’ => [‘bpro1’, ‘bpro2’, ‘bpro3’],
],
‘sales’ => [
‘manager’ => ‘deni’,
‘staff’ => [‘bpro4’, ‘bpro5’, ‘bpro6’],
],
‘direktur’ => [‘pakyudho’]
];
}

 

Nama : Shortcode silaporkerja_dashboard

Keterangan “Shortcode: silaporkerja_dashboard”

  • Dashboard SiLaporKerja
  • Membatasi user sesuai hak akses, jika akses ke halaman yang tidak sesuai level nya, maka akan di blok dan ada notifikasi 
  • Direktur berupa tampilan Folder Tree, bisa melihat seluruh tim nya
    Manager berupa dropdown list, bisa melihat seluruh staf nya
  • Staf hanya melihat data nya sendiri
  • Ada filter bulan
  • Ada Pagination, jika jumlah judul post lebih dari 10
  • Run snippet everywhere
  • Status Aktif
  • Untuk versi SiLaporKerja Demo

Script:
add_shortcode(‘silaporkerja_dashboard’, function () {
if (!is_user_logged_in() || !user_can(get_current_user_id(), ‘read’)) {
return ‘<p>❌ Kamu tidak diizinkan mengakses halaman ini.</p>’;
}

$current_user = wp_get_current_user();
$current_user_login = $current_user->user_login;
$current_user_name = $current_user->display_name;
$struktur = silaporkerja_get_team_structure();

$target_user = isset($_GET[‘lihat’]) ? sanitize_text_field($_GET[‘lihat’]) : $current_user_login;
$selected_month = isset($_GET[‘bulan’]) ? sanitize_text_field($_GET[‘bulan’]) : date(‘Y-m’);
$paged = isset($_GET[‘hal’]) ? max(1, intval($_GET[‘hal’])) : 1;
$posts_per_page = 10;

$is_direktur = in_array($current_user_login, $struktur[‘direktur’] ?? []);
$is_manager = false;
$manager_divisi = ”;

foreach ($struktur as $divisi => $data) {
if (!is_array($data)) continue;
if (isset($data[‘manager’]) && $data[‘manager’] === $current_user_login) {
$is_manager = true;
$manager_divisi = $divisi;
break;
}
}

// Validasi akses: hanya user yang sesuai struktur bisa melihat
$akses_diperbolehkan = false;
if ($target_user === $current_user_login) {
$akses_diperbolehkan = true;
} elseif ($is_direktur) {
$akses_diperbolehkan = true;
} elseif ($is_manager) {
$allowed = array_merge([$current_user_login], $struktur[$manager_divisi][‘staff’]);
if (in_array($target_user, $allowed)) {
$akses_diperbolehkan = true;
}
}

if (!$akses_diperbolehkan) {
return ‘<p>❌ Kamu tidak punya akses ke data ini.</p>’;
}

ob_start();

// Direktur: tampilkan daftar user
if ($is_direktur) {
echo “<div class=’user-list’>”;
echo “<p><strong>Pilih User:</strong></p><ul>”;
echo “<li><a href=’?lihat=$current_user_login&bulan=$selected_month#aktivitas-list’>Saya ($current_user_name)</a></li>”;
foreach ($struktur as $divisi => $data) {
if ($divisi === ‘direktur’) continue;
echo “<li><strong>📂 $divisi</strong><ul>”;
echo “<li>👤 <a href=’?lihat={$data[‘manager’]}&bulan=$selected_month#aktivitas-list’>{$data[‘manager’]} (Manager)</a></li>”;
foreach ($data[‘staff’] as $staf) {
echo “<li>👥 <a href=’?lihat=$staf&bulan=$selected_month#aktivitas-list’>$staf</a></li>”;
}
echo “</ul></li>”;
}
echo “</ul></div><hr>”;
}

// Manager: dropdown + bulan + tombol Pilih
if ($is_manager) {
echo “<form method=’get’>”;
echo “<p><strong>✅ Pilih user yang datanya ingin kamu lihat:</strong></p>”;
echo “<select name=’lihat’>”;
echo “<option value=’$current_user_login'” . selected($target_user, $current_user_login, false) . “>Saya ($current_user_name)</option>”;
echo “<optgroup label=’Staff’>”;
foreach ($struktur[$manager_divisi][‘staff’] as $staf) {
echo “<option value=’$staf'” . selected($target_user, $staf, false) . “>👥 $staf</option>”;
}
echo “</optgroup>”;
echo “</select>”;

// Filter bulan
echo “<select name=’bulan’ style=’margin-left:10px’>”;
for ($i = 0; $i < 12; $i++) {
$bulan = date(‘Y-m’, strtotime(“-$i months”));
$label = date(‘F Y’, strtotime($bulan));
echo “<option value=’$bulan'” . selected($selected_month, $bulan, false) . “>$label</option>”;
}
echo “</select>”;

echo ” <button type=’submit’>Pilih</button>”;
echo “</form><hr>”;
}

// Filter bulan (untuk non-manager)
if (!$is_manager) {
echo “<div style=’margin-bottom:20px;’>”;
echo “<form method=’get’>”;
echo “<input type=’hidden’ name=’lihat’ value='” . esc_attr($target_user) . “‘>”;
echo “<select name=’bulan’>”;
for ($i = 0; $i < 12; $i++) {
$bulan = date(‘Y-m’, strtotime(“-$i months”));
$label = date(‘F Y’, strtotime($bulan));
echo “<option value=’$bulan'” . selected($selected_month, $bulan, false) . “>$label</option>”;
}
echo “</select> “;
echo “<button type=’submit’>Filter Bulan</button>”;
echo “</form></div>”;
}

// Query data CPT
$args = [
‘post_type’ => ‘aktivitas_regular’,
‘post_status’ => ‘publish’,
‘author_name’ => $target_user,
‘posts_per_page’ => $posts_per_page,
‘paged’ => $paged,
‘date_query’ => [
[
‘after’ => $selected_month . ‘-01’,
‘before’ => $selected_month . ‘-31’,
‘inclusive’ => true,
]
]
];

$query = new WP_Query($args);
$max_pages = $query->max_num_pages;

echo “<div id=’aktivitas-list’ class=’aktivitas-list’>”;
$target_user_data = get_user_by(‘login’, $target_user);
if ($target_user_data) {
echo “<span class=’aktivitas-user-label’>👤 Data aktivitas: <strong>{$target_user_data->display_name}</strong></span>”;
}

if ($query->have_posts()) {
echo “<ul>”;
while ($query->have_posts()) {
$query->the_post();
echo “<li><a href='” . get_permalink() . “‘>” . get_the_title() . “</a></li>”;
}
echo “</ul>”;
} else {
echo “<p>📭 Tidak ada aktivitas yang ditemukan untuk bulan ini.</p>”;
}

// Pagination (jika jumlah post > 10)
if ($max_pages > 1) {
echo “<div class=’pagination’ style=’display:flex;justify-content:flex-end;gap:5px;margin-top:10px’>”;
$base_url = “?lihat=$target_user&bulan=$selected_month”;
echo “<a href='{$base_url}&hal=1#aktivitas-list’ title=’Halaman Pertama’>&laquo;</a>”;
if ($paged > 1) {
echo “<a href='{$base_url}&hal=” . ($paged – 1) . “#aktivitas-list’ title=’Sebelumnya’>&lsaquo;</a>”;
}
if ($paged < $max_pages) {
echo “<a href='{$base_url}&hal=” . ($paged + 1) . “#aktivitas-list’ title=’Berikutnya’>&rsaquo;</a>”;
}
echo “<a href='{$base_url}&hal=$max_pages#aktivitas-list’ title=’Halaman Terakhir’>&raquo;</a>”;
echo “</div>”;
}

echo “</div>”;
wp_reset_postdata();

return ob_get_clean();
});

Nama : Register CPT Klien Update_SiLaporKerjaCL

Register CPT Klien Update_SiLaporKerjaCL”

  • Mendaftarkan Custom Post Type (CPT) “Update Klien” dan akan muncul menu “Update Klien” pada menu WP Dashboar Admin
  • Kondisi Aktif
  • Run snippet everywhere
  • Untuk SiLaporKerjaCL

Script
add_action(‘init’, ‘register_klien_update_cpt’);
function register_klien_update_cpt() {
$labels = array(
‘name’ => ‘Update Klien’,
‘singular_name’ => ‘Update Klien’,
‘menu_name’ => ‘Update Klien’,
‘name_admin_bar’ => ‘Update Klien’,
‘add_new’ => ‘Tambah Update’,
‘add_new_item’ => ‘Tambah Update Baru’,
‘new_item’ => ‘Update Baru’,
‘edit_item’ => ‘Edit Update’,
‘view_item’ => ‘Lihat Update’,
‘all_items’ => ‘Semua Update Klien’,
‘search_items’ => ‘Cari Update Klien’,
‘not_found’ => ‘Tidak ditemukan.’,
‘not_found_in_trash’ => ‘Tidak ditemukan di tong sampah.’
);

$args = array(
‘labels’ => $labels,
‘public’ => true,
‘show_in_menu’ => true,
‘menu_position’ => 25,
‘menu_icon’ => ‘dashicons-id-alt’,
‘supports’ => array(‘title’, ‘editor’, ‘author’, ‘custom-fields’),
‘has_archive’ => false,
‘show_in_rest’ => true, // mendukung Gutenberg & REST API
‘capability_type’ => ‘post’
);

register_post_type(‘klien_update’, $args);
}

Nama : REST API “Nama_Klien” SiLaporKerjaCL

Keterangan REST API “Nama_Klien” SiLaporKerjaCL

  • REST API – Daftar Nama & Kode Klien
    Endpoint REST

  • Menyediakan daftar kode klien dan nama perusahaan secara publik (tanpa login)
    ✅ Digunakan oleh form “Update Klien” untuk:

    • Mencegah input manual di field “Nama Klien”

    • Memvalidasi “Kode Klien”

    • Menampilkan notifikasi “✅ Kode klien valid” atau “❌ Kode klien tidak ditemukan”

Script
add_action(‘rest_api_init’, function () {

    register_rest_route(‘silaporkerja/v1’, ‘/klien-public’, [

        ‘methods’  => ‘GET’,

        ‘callback’ => ‘silaporkerja_get_klien_public’,

        ‘permission_callback’ => ‘__return_true’,

    ]);

});

function silaporkerja_get_klien_public($request) {

    $args = [

        ‘post_type’      => ‘profil_klien’,

        ‘post_status’    => ‘publish’,

        ‘posts_per_page’ => -1,

    ];

    $query = new WP_Query($args);

    $result = [];

    if ($query->have_posts()) {

        foreach ($query->posts as $post) {

            $kode_klien = get_field(‘kode_klien’, $post->ID);

            $nama_klien = get_field(‘nama_klien’, $post->ID); // Diambil dari field ACF

            if (!empty($kode_klien) && !empty($nama_klien)) {

                $result[] = [

                    ‘kode’ => sanitize_text_field($kode_klien),

                    ‘nama’ => sanitize_text_field($nama_klien),

                ];

            }

        }

    }

    return rest_ensure_response($result);

}