From b32a036e52b657d1572559db2d231fde3f746376 Mon Sep 17 00:00:00 2001 From: idtemankampus-creator Date: Thu, 17 Sep 2026 22:37:56 +0700 Subject: [PATCH] feat(ui): add bilingual ID/EN support, toggle language, and documentation sidebars --- dummylab.php | 272 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 210 insertions(+), 62 deletions(-) diff --git a/dummylab.php b/dummylab.php index e135bba..3dcf376 100644 --- a/dummylab.php +++ b/dummylab.php @@ -47,10 +47,11 @@ class DummyLab { return; } + $ui_lang = isset($_GET['ui_lang']) && $_GET['ui_lang'] === 'en' ? 'en' : 'id'; $users = get_users(['fields' => ['ID', 'display_name']]); $query = new WP_Query([ - 'post_type' => ['post', 'page'], + 'post_type' => ['post', 'page', 'attachment'], 'posts_per_page' => -1, 'meta_key' => $this->meta_key, 'meta_value' => '1', @@ -58,10 +59,22 @@ class DummyLab { 'post_status' => 'any', ]); $dummy_count = $query->found_posts; + + $t = $this->get_translations($ui_lang); ?>
-

๐Ÿงช DummyLab โ€“ Post & Page Generator

-

Dibuat oleh masbudikusuma | Dokumentasi Plugin

+
+
+

๐Ÿงช DummyLab โ€“ Post & Page Generator

+

masbudikusuma |

+
+ +
+ UI Language: + ๐Ÿ‡ฎ๐Ÿ‡ฉ ID | + ๐Ÿ‡ฌ๐Ÿ‡ง EN +
+

@@ -69,9 +82,9 @@ class DummyLab {

@@ -79,28 +92,30 @@ class DummyLab {
-
-

Generate Content Dummy

+ +
+

+ - + - + - + - + - + - + - + - + - + - + - +
-

Kategori dibuat otomatis jika belum ada. Pisahkan dengan koma. Tidak berlaku untuk Halaman.

+

-

Opsional, pisahkan dengan koma.

+

-

Jika tanggal di masa depan, status otomatis "Scheduled".

+

Gambar Unggulan -

+

Opsi Tambahan -
- +
+
- +
-
-

Cleanup / Rollback

-

Total data dummy aktif:

-
- - -

Tindakan ini akan menghapus permanen seluruh post, page, dan gambar yang dibuat oleh DummyLab.

- ($dummy_count === 0)]); ?> -
+ +
+ +
+

+

:

+
+ + + +

+ ($dummy_count === 0)]); ?> +
+
+ + +
+

๐Ÿ“–

+
    +
  1. +
  2. +
  3. +
  4. +
+
+ + +
+

๐Ÿ›ก๏ธ

+
    +
  • +
  • +
  • +
+
'Created by', + 'plugin_doc' => 'Plugin Documentation', + 'msg_generated' => 'dummy posts generated successfully!', + 'msg_purged' => 'dummy items deleted successfully!', + 'form_title' => 'Generate Dummy Content', + 'lbl_count' => 'Post/Page Count', + 'lbl_type' => 'Content Type', + 'opt_post' => 'Post', + 'opt_page' => 'Page', + 'lbl_content_lang' => 'Content Language', + 'lbl_status' => 'Post Status', + 'opt_publish' => 'Publish', + 'opt_draft' => 'Draft', + 'opt_pending' => 'Pending Review', + 'opt_private' => 'Private', + 'lbl_cats' => 'Categories', + 'desc_cats' => 'Categories created automatically if not present. Comma-separated. Ignored for Pages.', + 'lbl_tags' => 'Additional Tags', + 'desc_tags' => 'Optional, comma-separated.', + 'lbl_author' => 'Author', + 'opt_random_author' => 'Random from all users', + 'lbl_date' => 'Post Date', + 'opt_date_now' => 'Current time', + 'opt_date_past' => 'Random in past few days', + 'opt_date_future' => 'Future date (Scheduled)', + 'desc_date' => 'If future date, post status will automatically set to "Scheduled".', + 'lbl_length' => 'Article Length', + 'opt_len_short' => 'Short (2-3 paragraphs)', + 'opt_len_medium' => 'Medium (4-6 paragraphs + heading)', + 'opt_len_long' => 'Long (7-10 paragraphs + heading, quote)', + 'lbl_image' => 'Featured Image', + 'opt_use_img' => 'Include random image from Picsum Photos', + 'opt_img_small' => 'Small (800x600)', + 'opt_img_med' => 'Medium (1200x800)', + 'opt_img_large' => 'Large (1600x1000)', + 'lbl_extra' => 'Additional Options', + 'opt_comments' => 'Include dummy comments', + 'opt_sticky' => 'Make first post sticky (Post type only)', + 'btn_generate' => 'Generate Dummy Data', + 'purge_title' => 'Cleanup / Rollback', + 'purge_active' => 'Active dummy items', + 'purge_desc' => 'Permanently deletes all posts, pages, and media attachments created by DummyLab.', + 'btn_purge' => 'Delete All Dummy Data', + 'guide_title' => 'Quick Usage Guide', + 'guide_step1' => 'Select total count and content type (Post/Page).', + 'guide_step2' => 'Choose generated text language and length.', + 'guide_step3' => 'Check image box to auto-fetch thumbnails from Picsum.', + 'guide_step4' => 'Click Purge anytime to completely clean test data.', + 'safety_title' => 'Safe Development', + 'safety_item1' => 'All dummy posts are tracked via unique metadata key.', + 'safety_item2' => 'Clean purge removes featured images from Media Library.', + 'safety_item3' => 'Safe for staging and local theme testing.', + ]; + } + + return [ + 'created_by' => 'Dibuat oleh', + 'plugin_doc' => 'Dokumentasi Plugin', + 'msg_generated' => 'konten dummy berhasil dibuat!', + 'msg_purged' => 'data dummy berhasil dibersihkan!', + 'form_title' => 'Generate Content Dummy', + 'lbl_count' => 'Jumlah Post/Halaman', + 'lbl_type' => 'Tipe Konten', + 'opt_post' => 'Post', + 'opt_page' => 'Halaman (Page)', + 'lbl_content_lang' => 'Bahasa Konten', + 'lbl_status' => 'Status Post', + 'opt_publish' => 'Publish (terbit)', + 'opt_draft' => 'Draft', + 'opt_pending' => 'Pending Review', + 'opt_private' => 'Private', + 'lbl_cats' => 'Kategori', + 'desc_cats' => 'Kategori dibuat otomatis jika belum ada. Pisahkan dengan koma. Tidak berlaku untuk Halaman.', + 'lbl_tags' => 'Tag Tambahan', + 'desc_tags' => 'Opsional, pisahkan dengan koma.', + 'lbl_author' => 'Penulis', + 'opt_random_author' => 'Acak dari semua pengguna', + 'lbl_date' => 'Tanggal Post', + 'opt_date_now' => 'Waktu sekarang', + 'opt_date_past' => 'Acak dalam beberapa hari terakhir', + 'opt_date_future' => 'Rentang tanggal tertentu (Future/Scheduled)', + 'desc_date' => 'Jika tanggal di masa depan, status otomatis "Scheduled".', + 'lbl_length' => 'Panjang Artikel', + 'opt_len_short' => 'Pendek (2-3 paragraf)', + 'opt_len_medium' => 'Sedang (4-6 paragraf + heading)', + 'opt_len_long' => 'Panjang (7-10 paragraf + heading, quote)', + 'lbl_image' => 'Gambar Unggulan', + 'opt_use_img' => 'Sertakan gambar acak dari Picsum Photos', + 'opt_img_small' => 'Kecil (800x600)', + 'opt_img_med' => 'Sedang (1200x800)', + 'opt_img_large' => 'Besar (1600x1000)', + 'lbl_extra' => 'Opsi Tambahan', + 'opt_comments' => 'Sertakan komentar dummy', + 'opt_sticky' => 'Jadikan post pertama sebagai sticky post (khusus Post)', + 'btn_generate' => 'Generate Data Dummy', + 'purge_title' => 'Cleanup / Rollback', + 'purge_active' => 'Total data dummy aktif', + 'purge_desc' => 'Tindakan ini akan menghapus permanen seluruh post, page, dan gambar yang dibuat oleh DummyLab.', + 'btn_purge' => 'Hapus Semua Data Dummy', + 'guide_title' => 'Panduan Penggunaan', + 'guide_step1' => 'Pilih jumlah data dan tipe konten (Post atau Halaman).', + 'guide_step2' => 'Atur bahasa dan panjang artikel yang akan dihasilkan.', + 'guide_step3' => 'Centang opsi gambar untuk mengunduh thumbnail dari Picsum.', + 'guide_step4' => 'Gunakan tombol Purge untuk menghapus semua data pengujian.', + 'safety_title' => 'Pengembangan Aman', + 'safety_item1' => 'Setiap postingan dummy dilindungi metadata internal unik.', + 'safety_item2' => 'Fitur Purge juga membersihkan berkas gambar dari Media Library.', + 'safety_item3' => 'Aman digunakan pada lingkungan staging maupun lokal.', + ]; + } + public function handle_generate() { if (!current_user_can('manage_options') || !check_admin_referer('dummylab_generate_action', 'dummylab_nonce')) { wp_die('Akses ditolak.'); @@ -213,6 +368,7 @@ class DummyLab { require_once(ABSPATH . 'wp-admin/includes/file.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); + $ui_lang = isset($_POST['ui_lang']) ? sanitize_text_field($_POST['ui_lang']) : 'id'; $count = isset($_POST['post_count']) ? min(50, max(1, intval($_POST['post_count']))) : 5; $post_type = isset($_POST['post_type']) && in_array($_POST['post_type'], ['post', 'page']) ? $_POST['post_type'] : 'post'; $lang = isset($_POST['content_lang']) ? sanitize_text_field($_POST['content_lang']) : 'id'; @@ -227,7 +383,6 @@ class DummyLab { $add_comments = isset($_POST['add_comments']) ? true : false; $make_sticky = isset($_POST['make_sticky']) ? true : false; - // Process categories $cat_ids = []; if ($post_type === 'post' && !empty($categories_raw)) { $cat_names = array_map('trim', explode(',', $categories_raw)); @@ -243,17 +398,12 @@ class DummyLab { } } - // Process tags $tag_names = !empty($tags_raw) ? array_map('trim', explode(',', $tags_raw)) : []; - - // Users pool $user_ids = get_users(['fields' => 'ID']); for ($i = 0; $i < $count; $i++) { - // Determine Author $author_id = ($author_opt === 'random') ? $user_ids[array_rand($user_ids)] : intval($author_opt); - // Determine Date $post_date = current_time('mysql'); $final_status = $status; if ($date_opt === 'random_past') { @@ -265,7 +415,6 @@ class DummyLab { $final_status = 'future'; } - // Build Content & Title $title = $this->get_sample_title($lang, $i); $content = $this->get_sample_content($lang, $content_length); @@ -291,7 +440,6 @@ class DummyLab { if ($post_id && !is_wp_error($post_id)) { update_post_meta($post_id, $this->meta_key, '1'); - // Featured Image via Picsum if ($use_image) { $image_url = 'https://picsum.photos/' . $image_size . '?random=' . rand(1, 9999); $tmp = download_url($image_url); @@ -309,12 +457,10 @@ class DummyLab { } } - // Sticky option if ($i === 0 && $make_sticky && $post_type === 'post') { stick_post($post_id); } - // Add comments if ($add_comments) { $comment_count = rand(1, 3); for ($c = 0; $c < $comment_count; $c++) { @@ -330,7 +476,7 @@ class DummyLab { } } - wp_redirect(admin_url('tools.php?page=dummylab&status=generated&count=' . $count)); + wp_redirect(admin_url('tools.php?page=dummylab&ui_lang=' . $ui_lang . '&status=generated&count=' . $count)); exit; } @@ -339,6 +485,8 @@ class DummyLab { wp_die('Akses ditolak.'); } + $ui_lang = isset($_POST['ui_lang']) ? sanitize_text_field($_POST['ui_lang']) : 'id'; + $query = new WP_Query([ 'post_type' => ['post', 'page', 'attachment'], 'posts_per_page' => -1, @@ -357,7 +505,7 @@ class DummyLab { } } - wp_redirect(admin_url('tools.php?page=dummylab&status=purged&count=' . $purged_count)); + wp_redirect(admin_url('tools.php?page=dummylab&ui_lang=' . $ui_lang . '&status=purged&count=' . $purged_count)); exit; }