Versi: 1.4.12
VD Store adalah plugin inti untuk toko online.
Plugin ini menjadi dasar untuk:
- produk
- katalog
- keranjang
- wishlist
- checkout
- pesanan
- kupon
- tracking pesanan
- profil customer
- ulasan produk
Kalau butuh fitur seller, toko per penjual, atau checkout multi-seller, tambahkan VD Marketplace di atas plugin ini.
Pakai VD Store jika ingin membuat:
- toko online biasa
- katalog produk dengan checkout langsung
- produk fisik dan digital
- sistem order tanpa marketplace multi-seller
- CPT produk:
store_product - CPT pesanan:
store_order - CPT kupon:
store_coupon - Taxonomy kategori produk:
store_product_cat - Produk fisik dan digital
- Harga reguler dan harga promo. Harga boleh kosong untuk produk katalog/inquiry.
- Opsi varian dengan harga tambahan atau harga akhir per pilihan
- Keranjang dan wishlist
- Checkout dan tracking order
- Kupon produk dan kupon ongkir
- Profil customer
- Ulasan produk dari halaman pesanan
- Label manual produk
- Dukungan dropship di checkout dan profil customer
- Integrasi ongkir dengan mode normal, gratis ongkir, dan nonaktif
- Pengaturan checkout untuk tetap mengumpulkan alamat saat ongkir gratis/nonaktif
- Integrasi pembayaran manual dan gateway
- Aktifkan plugin
VD Store. - Buka menu pengaturan
VD Store. - Tentukan halaman sistem:
- katalog
- keranjang
- checkout
- terima kasih
- tracking order
- profil saya
- Isi pengaturan pembayaran dan ongkir.
- Tambahkan kategori produk.
- Tambahkan produk.
- wajib isi harga
- wajib isi berat
- ikut perhitungan ongkir
- wajib isi harga
- tidak wajib isi berat
- wajib isi file digital atau URL file digital
- jika cart hanya berisi produk digital, checkout tidak memaksa ongkir
VD Store menyediakan label manual bawaan untuk merchandising produk:
- Best Seller
- Limited
- Pre Order
- Ready Stock
- New
- Recommended
- Sale
Label ini disimpan di meta _store_label dan dipakai oleh:
- thumbnail produk
- galeri produk
- katalog
- katalog print/PDF
Addon plugin bisa menambah atau mengubah daftar label lewat filter:
wp_store_product_labelswp_store_product_labels_registrywp_store_product_label_optionswp_store_product_label_badge_html
Kalau ingin menyesuaikan tampilan badge, gunakan filter wp_store_product_label_badge_html agar core tetap bersih.
VD Store memakai helper wps_icon() untuk semua icon UI.
Addon bisa menambah atau override icon lewat filter:
wp_store_iconswp_store_icon_registrywp_store_icon_html
Format yang didukung:
htmluntuk SVG finalrenderuntuk callback yang menerima data icon
Kalau icon baru tidak ada di registry addon, core tetap jatuh ke icon bawaan di template components/icons.php.
Customer bisa:
- melihat daftar produk
- mencari produk
- filter kategori
- filter brand
- filter harga
- mengurutkan produk
- membuka landing archive kategori dan brand dengan URL bersih; parameter filter tambahan tetap didukung
- print katalog lewat halaman print browser
Customer bisa:
- melihat galeri produk
- melihat harga promo
- memilih varian
- memilih opsi harga tambahan
- tambah ke keranjang
- tambah ke wishlist
- melihat produk terkait
- melihat rating dan ulasan
Customer bisa:
- ubah jumlah item
- hapus item
- lihat opsi item yang dipilih
- lanjut ke checkout
Customer bisa:
- isi data penerima
- isi alamat
- pilih ongkir
- pilih metode pembayaran
- pakai kupon
- upload bukti transfer jika perlu
- melihat ringkasan dropship jika fitur diaktifkan di profil customer
Setelah checkout selesai, customer diarahkan ke halaman tracking order.
Halaman tracking dipakai untuk:
- melihat status order
- melihat detail item
- melihat resi
- melihat ringkasan pembayaran
Jenis kupon yang didukung:
- diskon produk
- diskon ongkir
Aturan yang didukung:
- nominal
- persen
- minimal belanja
- batas penggunaan
- tanggal mulai
- tanggal kadaluarsa
Catatan:
- kupon produk menghitung minimal belanja dari subtotal produk
- kupon ongkir butuh ongkir yang sudah dipilih
Customer bisa memberi ulasan dari:
Profil Saya -> Pesanan
Syaratnya:
- order sudah selesai
- produk berasal dari order customer tersebut
- satu produk pada satu order hanya bisa direview sekali
Di halaman edit pesanan admin tersedia field:
- status pesanan
- nomor resi
- kurir
- layanan
- biaya ongkir
- catatan admin
Admin juga bisa:
- print invoice
- print data pengiriman
Catatan:
- print memakai halaman HTML print-friendly browser
- tidak memakai generator PDF server-side
| Shortcode | Fungsi |
|---|---|
[wp_store_shop] |
Render daftar produk berdasarkan query shortcode. |
[wp_store_catalog] |
Render katalog produk sederhana. |
[wp_store_shop_with_filters] |
Render shop dengan sidebar filter. |
[wp_store_single] |
Render halaman single produk. |
[wp_store_cart_page] |
Render halaman keranjang. |
[store_cart] |
Alias dari [wp_store_cart_page]. |
[wp_store_checkout] |
Render halaman checkout. |
[store_checkout] |
Alias dari [wp_store_checkout]. |
[wp_store_thanks] |
Render halaman terima kasih. |
[store_thanks] |
Alias dari [wp_store_thanks]. |
[wp_store_tracking] |
Render halaman tracking pesanan. |
[store_tracking] |
Alias dari [wp_store_tracking]. |
[wp_store_wishlist] |
Render halaman wishlist. |
| Shortcode | Fungsi |
|---|---|
[wp_store_product_card] |
Render reusable product card. |
[wp_store_component] |
Render komponen produk reusable, misalnya title, price, rating, actions, description, related. |
[wp_store_product_info] |
Render tabel info/meta produk. |
[wp_store_info] |
Alias dari [wp_store_product_info]. |
[wp_store_product_meta] |
Alias dari [wp_store_product_info]. |
[wp_store_related] |
Render produk terkait. |
[wp_store_gallery] |
Render galeri produk. |
[wp_store_thumbnail] |
Render thumbnail produk. |
[wp_store_price] |
Render harga produk. |
[wp_store_add_to_cart] |
Tombol tambah ke keranjang. Untuk PHP/theme bisa memakai wp_store_add_to_cart_button(). |
[wp_store_buy_button] |
Alias dari [wp_store_add_to_cart]. |
[wp_store_detail] |
Link ke detail produk. |
[wp_store_add_to_wishlist] |
Tombol tambah ke wishlist. |
[wp_store_rating] |
Ringkasan bintang rating produk. |
[wp_store_review_count] |
Jumlah ulasan produk. |
[wp_store_product_reviews] |
Daftar ulasan produk. |
[wp_store_recently_viewed] |
Produk yang baru dilihat customer. |
[wp_store_products_carousel] |
Carousel produk. |
| Shortcode | Fungsi |
|---|---|
[wp_store_cart] |
Shortcut atau offcanvas keranjang. Atribut: size untuk ukuran icon. |
[wp_store_link_profile] |
Link atau icon ke halaman profil customer. Atribut: size untuk ukuran foto profil. |
[wp_store_filters] |
Sidebar filter shop. |
[wp_store_shipping_checker] |
Cek ongkir di halaman publik. |
[wp_store_couriers] |
Render daftar / logo kurir aktif dari pengaturan toko. |
[wp_store_captcha] |
Komponen captcha. Memakai Velocity Addons jika aktif, fallback ke captcha bawaan VD Store jika tidak. |
[wp-store-captcha] |
Alias dari [wp_store_captcha]. |
[wp_store_categories] |
Daftar kategori produk. |
[wp_store_taxonomies_carousel] |
Carousel kategori atau brand dengan gambar taxonomy. |
[wp_store_sosmed] |
Daftar sosial media. |
[wp_store_contact] |
Informasi kontak toko. |
[wp_store_bank_accounts] |
Daftar rekening toko. |
[wp_store_shop_with_filters per_page="12"]
[wp_store_add_to_cart id="123"]
Untuk tombol Beli Sekarang yang langsung memproses produk tersebut tanpa mengubah isi keranjang:
[wp_store_add_to_cart id="123" buy_now="yes" text="Beli Sekarang"]
Dengan tombol icon saja:
[wp_store_add_to_cart id="123" text="" class="btn btn-primary btn-sm"]
Kalau dipakai di file PHP theme atau template:
echo wp_store_add_to_cart_button(123, [
'text' => 'Beli Sekarang',
'class' => 'btn btn-primary btn-sm',
'buy_now' => 'yes',
]);Fungsi ini memakai jalur yang sama dengan shortcode, jadi opsi produk, minimal order, dan modal pilihan tetap seragam.
[wp_store_price id="123"]
Tanpa wrapper luar dan harga sebagai span:
[wp_store_price id="123" wrapper="" tag="span"]
Alternatif yang lebih eksplisit:
[wp_store_price id="123" wrapper="none" tag="span"]
[wp_store_gallery id="123"]
[wp_store_related id="123" limit="4"]
Gunakan filter wp_store_checkout_fields dari plugin kustom atau child theme
untuk menambah field pada checkout VD Store dan Velocity Marketplace yang sudah
mendukung integrasi ini. Tersedia tipe text, textarea, email, tel,
select, dan checkbox, dengan pengaturan label, placeholder, wajib isi, dan urutan serta section.
Field otomatis dikirim, divalidasi di server, dan disimpan pada metadata pesanan
_store_order_checkout_fields. Nilainya dapat dilihat di box Field Tambahan
Checkout pada editor pesanan WordPress. Filter ini hanya mengatur field tambahan,
belum field bawaan checkout. Tidak ada field tambahan aktif secara default.
Contoh kode dan kontrak integrasi tersedia pada Field tambahan checkout.
Versi plugin: 1.4.12
Dokumen ini ditujukan untuk developer yang ingin:
- memahami struktur plugin
- mengetahui fungsi file-file penting
- mengetahui shortcode yang tersedia
- mengetahui kalau mau ubah fitur harus mulai dari file mana
VD Store adalah core commerce.
Plugin ini menjadi pemilik utama untuk:
- produk
- cart
- wishlist
- checkout
- order
- kupon
- tracking order
- profil customer
- review produk
Kalau VD Marketplace aktif, addon itu seharusnya membaca data inti dari VD Store, bukan membuat sistem produk, order, atau kupon versi kedua.
Isi dan fungsi:
- file bootstrap utama plugin
- mendefinisikan versi plugin
- membuat tabel database plugin
- memanggil class utama plugin
- menyediakan helper global seperti:
wps_icon()wps_icon_registry()wps_icon_render_registered()wps_discount_badge_html()wps_product_price_html()wp_store_add_to_cart_button()wp_store_render_product_card()wp_store_render_product_component()wp_store_render_product_info()wp_store_product_filter_args()wp_store_courier_labels()wp_store_bank_labels()wp_store_bank_logo()wp_store_order_status_labels()wp_store_order_statuses()wps_product_label_options()wps_product_label_badge_html()
Hook label yang tersedia:
wp_store_product_labelswp_store_product_labels_registrywp_store_product_label_optionswp_store_product_label_badge_html
Hook icon yang tersedia:
wp_store_iconswp_store_icon_registrywp_store_icon_html
Isi dan fungsi:
- class utama yang menjalankan semua module
- mendaftarkan admin, frontend, assets, dan API
Isi dan fungsi:
- register post type
store_product - register post type
store_order - register post type
store_coupon - register taxonomy
store_product_cat - register taxonomy
brand
Dipakai untuk area admin WordPress.
Fungsi:
- menambah menu admin plugin
Fungsi:
- pengaturan admin plugin
Fungsi:
- field produk di wp-admin
- simpan data produk dari editor admin
Fungsi:
- kolom custom di daftar produk admin
Fungsi:
- field status pesanan
- nomor resi
- kurir
- layanan
- biaya ongkir
- catatan admin
Fungsi:
- kolom custom di daftar order admin
Fungsi:
- aksi tambahan terkait order di admin
Fungsi:
- kirim email order dari admin/backend
Fungsi:
- cetak invoice dan data pengiriman
- memakai halaman HTML print-friendly browser
- auto memanggil
window.print()saat halaman dibuka
Fungsi:
- field kupon di wp-admin
Fungsi:
- kolom custom daftar kupon
Dipakai untuk REST API.
Fungsi:
- endpoint produk
- data produk untuk frontend
- print katalog browser lewat route
catalog/print
Fungsi:
- endpoint keranjang
- tambah item, ubah qty, hapus item
Fungsi:
- endpoint wishlist
Fungsi:
- proses checkout
- validasi checkout
- simpan order
- simpan ringkasan dropship jika data itu dikirim frontend
Fungsi:
- validasi kupon
- hitung diskon kupon
Fungsi:
- data customer profile
- data order customer
- submit review produk dari pesanan
- membaca data dropship yang tersimpan di profil customer
Fungsi:
- endpoint ongkir dan wilayah
- mode
shipping_mode:normal= ongkir dihitung biasafree= ongkir tetap tampil, tetapi biaya dipaksa0off= kalkulasi ongkir dimatikan
- mode
offtetap kompatibel dengandisable_shippinglama freecocok untuk tampilan checkout dengan layanan Rp0
Fungsi:
- endpoint pengaturan toko
- simpan pengaturan shipping baru:
shipping_mode,collect_address,allow_cod disable_shippingdipertahankan sebagai alias lama untuk modeoff
Fungsi:
- endpoint captcha gambar bawaan VD Store
- dipakai sebagai fallback jika captcha Velocity Addons tidak aktif
Fungsi:
- adapter captcha resmi VD Store
- otomatis memakai shortcode
[velocity_captcha]dari Velocity Addons jika fitur captcha Velocity Addons aktif - validasi Google reCAPTCHA dan image captcha Velocity Addons
- fallback ke captcha gambar bawaan VD Store
Fungsi:
- tools tambahan untuk maintenance atau debug
Dipakai untuk business logic utama plugin.
Fungsi:
- sumber aturan field produk
- menentukan field apa saja yang ada
- menentukan field wajib atau tidak
- menentukan field hanya tampil untuk jenis produk tertentu
- menyediakan field label manual
_store_label
Kalau mau tambah field produk baru, biasanya mulai dari file ini.
Fungsi:
- render field produk berdasarkan schema
- menyiapkan atribut field untuk admin dan frontend
Fungsi:
- helper baca dan tulis meta produk
- normalisasi key label produk
- baca label manual dari meta
_store_label
Fungsi:
- memetakan data produk menjadi payload siap pakai
- menghitung harga efektif
- menghitung harga reguler, promo, dan harga dengan opsi tambahan
- membawa label produk ke payload frontend/API
Kalau ada bug harga, biasanya file ini yang harus dicek dulu.
Fungsi:
- query produk
- normalisasi filter query
- apply filter ke
WP_Query - menyediakan opsi label manual untuk admin/filter
Fungsi:
- logika produk terkait
Fungsi:
- logika produk yang baru dilihat customer
Fungsi:
- logic utama cart
- simpan cart user atau guest
- hitung subtotal item
Fungsi:
- logic utama wishlist
Fungsi:
- membuat order
- menyimpan item order
- menyimpan total dan ringkasan order
Fungsi:
- orkestrasi pembayaran
Fungsi:
- daftar metode pembayaran yang aktif
Fungsi:
- integrasi payment gateway Duitku
Fungsi:
- menangani callback pembayaran dari Duitku
Fungsi:
- simpan dan ambil review produk
- memastikan review terikat ke
product_id,order_id, danuser_id
Fungsi:
- render bintang rating
- helper tampilan rating produk
Dipakai untuk frontend rendering dan template.
Fungsi:
- register semua shortcode plugin
- render halaman dan komponen frontend
- override template archive dan single produk
Ini salah satu file paling penting di plugin.
Fungsi:
- enqueue CSS dan JS frontend
Fungsi:
- halaman profil customer
- tab profil, wishlist, pesanan, alamat, dan review
- ringkasan dropship customer jika fitur aktif
Fungsi:
- aksi order yang bisa dipanggil dari halaman publik
Fungsi:
- helper render template frontend
Fungsi:
- fallback render icon bawaan jika registry addon tidak menyediakan icon tersebut
Fungsi:
- branding halaman login jika dipakai
Dipakai untuk file tampilan frontend.
Fungsi:
- template archive default produk
Fungsi:
- template single default produk
Fungsi:
- template kategori produk
Fungsi:
- template arsip brand dengan layout shop dan filter yang sama seperti kategori produk
- brand tetap taxonomy non-hierarkis; perbedaannya hanya pada model term, bukan layout frontend
Fungsi:
- layout daftar produk
Fungsi:
- layout single produk berbasis section dan komponen
Fungsi:
- layout checkout
Fungsi:
- layout keranjang
Fungsi:
- layout tracking order
Fungsi:
- layout halaman terima kasih
Fungsi:
- tampilan produk terkait
Fungsi:
- tampilan produk yang baru dilihat
Fungsi:
- tampilan katalog default
Fungsi:
- tampilan cek ongkir
Fungsi:
- card produk default plugin
Fungsi:
- galeri gambar produk
Fungsi:
- daftar ulasan produk
Fungsi:
- sidebar filter produk
- term taxonomy aktif dikunci di state filter tetapi tidak ditulis ulang sebagai parameter URL
- kategori/brand tambahan, harga, sort, dan pagination tetap disimpan di query string
- URL filter pada archive produk memakai canonical ke path archive tanpa query string
Fungsi:
- tombol dan flow add to cart
- dipakai oleh shortcode
[wp_store_add_to_cart]dan helper PHPwp_store_add_to_cart_button() - menangani opsi produk, minimal order, dan data modal pilihan sebelum produk masuk keranjang
Fungsi:
- tombol wishlist
Fungsi:
- shortcut atau offcanvas keranjang
Fungsi:
- tampilan wishlist
Fungsi:
- carousel produk
Fungsi:
- daftar kategori
Fungsi:
- komponen captcha internal VD Store
- jangan dipanggil langsung untuk halaman publik baru; gunakan
\WpStore\Frontend\Captcha::render()atau shortcode[wp_store_captcha]supaya otomatis mengikuti Velocity Addons jika aktif
Meta canonical produk:
_store_product_type_store_priceboleh kosong. Produk tanpa harga tampil sebagai katalog/inquiry dan tombol beli menjadi disabledHubungi Admin._store_sale_price_store_flashsale_until_store_digital_file_store_sku_store_stock_store_min_order_store_weight_kgboleh kosong. Produk fisik tanpa berat tidak bisa dibeli karena ongkir tidak dapat dihitung.- mode
freetetap memakai ongkir, tetapi nilai layanan menjadi0 - mode
offtidak menghitung ongkir, namun alamat, provinsi, kota, dan kecamatan masih dikumpulkan jikacollect_addressaktif _store_gallery_ids_store_option_name_store_options_store_option2_name_store_advanced_options_store_sold_count_store_review_count_store_rating_average
Meta canonical kupon:
_store_coupon_code_store_coupon_scope_store_coupon_type_store_coupon_value_store_coupon_min_purchase_store_coupon_usage_limit_store_coupon_usage_count_store_coupon_starts_at_store_coupon_expires_at
Meta order yang sering dipakai:
_store_order_status_store_order_shipping_courier_store_order_shipping_service_store_order_shipping_costbisa0saat modefreeatau order tanpa ongkir_store_order_receipt_no_store_order_admin_note_store_order_coupon_code_store_order_coupon_scope_store_order_discount_total
- berat wajib
- ikut hitung ongkir
- berat tidak wajib
- file digital wajib
- cart digital-only tidak boleh memaksa shipping
- alamat dan dropdown lokasi bisa tetap dikumpulkan jika setting
collect_addressaktif, tetapi bukan syarat ongkir
shipping_mode = normalmenghitung ongkir normalshipping_mode = freetetap menampilkan layanan kirim dengan biaya0shipping_mode = offmematikan kalkulasi ongkircollect_addresshanya berpengaruh pada modefreedanoff; modenormalselalu meminta alamat untuk produk fisikcollect_addressdanallow_coddefault aktif jika belum ada nilai tersimpanallow_codmengontrol COD, dan otomatis false saat modeoff
- meta
_store_option_price_modemenentukan cara menghitung nilai pada_store_advanced_options - Tambahan Harga (
adjustment) menghitung harga akhir = harga produk + angka pilihan - Harga Tetap (
absolute) memakai angka pilihan sebagai harga akhir - produk lama tanpa meta mode otomatis memakai
adjustment
Contoh Tambahan Harga dengan harga produk Rp100.000:
Small=0
Large=20000
Contoh Harga Tetap:
Small=100000
Large=120000
- filtering
- sorting
- cart
- checkout
- order
semuanya harus membaca harga efektif, bukan selalu harga reguler.
- review harus terikat ke:
product_idorder_iduser_id
- tidak memakai comment WordPress biasa
Semua shortcode di bawah didaftarkan di Shortcode.php.
| Shortcode | Method | Template utama | Fungsi |
|---|---|---|---|
[wp_store_shop] |
render_shop() |
shop.php |
Daftar produk berdasarkan query shortcode. |
[wp_store_catalog] |
render_catalog() |
catalog.php |
Katalog produk sederhana. |
[wp_store_shop_with_filters] |
render_shop_with_filters() |
filters.php + shop.php |
Shop dengan sidebar filter. |
[wp_store_single] |
render_single() |
single-flex.php |
Single produk berbasis section dan komponen. |
[wp_store_cart_page] |
render_cart_page() |
cart.php |
Halaman keranjang. |
[store_cart] |
render_cart_page() |
cart.php |
Alias cart page. |
[wp_store_checkout] |
render_checkout() |
checkout.php |
Halaman checkout. |
[store_checkout] |
render_checkout() |
checkout.php |
Alias checkout. |
[wp_store_thanks] |
render_thanks() |
thanks.php |
Halaman terima kasih. |
[store_thanks] |
render_thanks() |
thanks.php |
Alias thanks. |
[wp_store_tracking] |
render_tracking() |
tracking.php |
Tracking pesanan. |
[store_tracking] |
render_tracking() |
tracking.php |
Alias tracking. |
[wp_store_wishlist] |
render_wishlist() |
wishlist-widget.php |
Halaman wishlist. |
| Shortcode | Method | Template utama | Fungsi |
|---|---|---|---|
[wp_store_product_card] |
render_product_card() |
product-card.php |
Render reusable product card. |
[wp_store_component] |
render_component() |
ProductRenderer.php |
Render komponen produk reusable berdasarkan name atau component. |
[wp_store_product_info] |
render_product_info() |
ProductRenderer::product_info() |
Tabel info/meta produk. |
[wp_store_info] |
render_product_info() |
ProductRenderer::product_info() |
Alias info produk. |
[wp_store_product_meta] |
render_product_info() |
ProductRenderer::product_info() |
Alias meta produk. |
[wp_store_related] |
render_related() |
related.php |
Produk terkait. |
[wp_store_gallery] |
render_gallery() |
product-gallery.php |
Galeri produk. |
[wp_store_thumbnail] |
render_thumbnail() |
method langsung | Thumbnail produk. |
[wp_store_price] |
render_price() |
helper wps_product_price_html() |
Harga produk. |
[wp_store_add_to_cart] |
render_add_to_cart() |
add-to-cart.php |
Tombol add to cart. Atribut teks tombol memakai text. Untuk file PHP theme/template bisa memakai wp_store_add_to_cart_button(). |
[wp_store_buy_button] |
render_add_to_cart() |
add-to-cart.php |
Alias tombol beli/add to cart. |
[wp_store_detail] |
render_detail() |
method langsung | Link detail produk. |
[wp_store_add_to_wishlist] |
render_add_to_wishlist() |
add-to-wishlist.php |
Tombol wishlist. |
[wp_store_rating] |
render_rating() |
RatingRenderer.php |
Bintang rating produk. |
[wp_store_review_count] |
render_review_count() |
method langsung | Jumlah ulasan produk. |
[wp_store_product_reviews] |
render_product_reviews() |
product-reviews.php |
Daftar ulasan produk. |
[wp_store_recently_viewed] |
render_recently_viewed() |
recently-viewed.php |
Produk yang baru dilihat. |
[wp_store_products_carousel] |
render_products_carousel() |
products-carousel.php |
Carousel produk. |
| Shortcode | Method | Template utama | Fungsi |
|---|---|---|---|
[wp_store_cart] |
render_cart_widget() |
cart-widget.php |
Shortcut atau offcanvas keranjang. Atribut: size untuk ukuran icon. |
[wp_store_link_profile] |
render_link_profile() |
method langsung | Link atau icon profil customer. Atribut: size untuk ukuran foto profil. |
[wp_store_filters] |
render_filters() |
filters.php |
Sidebar filter shop. |
[wp_store_shipping_checker] |
render_shipping_checker() |
shipping-checker.php |
Cek ongkir. |
[wp_store_categories] |
render_categories() |
categories-list.php |
Daftar kategori. |
[wp_store_taxonomies_carousel] |
render_taxonomies_carousel() |
taxonomy-carousel.php |
Carousel visual kategori atau brand dengan gambar taxonomy. |
[wp_store_sosmed] |
render_sosmed() |
method langsung | Sosial media toko. |
[wp_store_contact] |
render_contact() |
method langsung | Kontak toko. |
[wp_store_bank_accounts] |
render_bank_accounts() |
method langsung | Daftar rekening toko. |
[wp_store_couriers] |
render_couriers() |
method langsung | Logo kurir aktif. |
[wp_store_captcha] |
render_captcha() |
captcha.php |
Captcha. |
[wp-store-captcha] |
render_captcha() |
captcha.php |
Alias captcha. |
Default di bawah mengikuti shortcode_atts() di Shortcode.php. Nilai id="123" bisa dikosongkan pada konteks loop produk karena sistem akan mencoba membaca produk aktif.
| Shortcode | Contoh atribut utama | Catatan |
|---|---|---|
[wp_store_shop] |
[wp_store_shop per_page="12"] |
per_page dibatasi maksimal 50. |
[wp_store_catalog] |
[wp_store_catalog] |
Tidak punya atribut shortcode khusus. |
[wp_store_shop_with_filters] |
[wp_store_shop_with_filters per_page="12"] |
Filter bekerja setelah tombol Terapkan diklik. Atribut filter_mode lama tetap kompatibel sebagai submit GET biasa. |
[wp_store_filters] |
[wp_store_filters] |
Filter bekerja setelah tombol Terapkan diklik. Atribut mode lama tetap kompatibel sebagai submit GET biasa. |
[wp_store_single] |
[wp_store_single id="123" hide="rating,related"] |
hide berisi section single produk yang ingin disembunyikan. |
[wp_store_cart_page] |
[wp_store_cart_page] |
Alias: [store_cart]. |
[wp_store_checkout] |
[wp_store_checkout] |
Alias: [store_checkout]. |
[wp_store_thanks] |
[wp_store_thanks] |
Alias: [store_thanks], order dibaca dari query ?order=.... |
[wp_store_tracking] |
[wp_store_tracking] |
Alias: [store_tracking], label form bisa diubah lewat filter PHP. |
[wp_store_wishlist] |
[wp_store_wishlist] |
Tidak punya atribut shortcode khusus. |
[wp_store_product_card] |
[wp_store_product_card id="123" context="shortcode" variant="default" image_size="medium" width="300" height="300" crop="true" class="custom-card"] |
Render card produk reusable. |
[wp_store_component] |
[wp_store_component id="123" name="price" component=""] |
Pakai name atau component; contoh: price, rating, gallery. |
[wp_store_product_info] |
[wp_store_product_info id="123"] |
Alias: [wp_store_info] dan [wp_store_product_meta]. |
[wp_store_related] |
[wp_store_related id="123" per_page="4"] |
per_page dibatasi maksimal 12. |
[wp_store_gallery] |
[wp_store_gallery id="123"] |
Galeri membaca featured image dan gallery meta produk. |
[wp_store_thumbnail] |
[wp_store_thumbnail id="123" width="300" height="300" crop="true" upscale="true" alt="" hover="change" label="true"] |
hover="change" memakai gambar galeri pertama sebagai hover. |
[wp_store_price] |
[wp_store_price id="123" countdown="false" wrapper="" tag="" class=""] |
wrapper="" bisa dipakai untuk output tanpa wrapper luar. |
[wp_store_add_to_cart] |
[wp_store_add_to_cart id="123" text="Beli" label="+" class="wps-btn wps-btn-primary" qty="0"] |
text mengatur teks tombol; text="" membuat tombol icon-only; alias: [wp_store_buy_button]. |
[wp_store_detail] |
[wp_store_detail id="123" text="Detail" size="" class="wps-btn wps-btn-secondary wps-w-full"] |
size="sm" memakai tombol kecil. |
[wp_store_add_to_wishlist] |
[wp_store_add_to_wishlist id="123" size="" label_add="Wishlist" label_remove="Hapus" icon_only="0"] |
icon_only="1" menyembunyikan teks. |
[wp_store_rating] |
[wp_store_rating id="123" size="16" show_value="true" show_count="true" class="" count_text="ulasan"] |
Mengambil ringkasan review produk. |
[wp_store_review_count] |
[wp_store_review_count id="123" class="" suffix="ulasan"] |
Output jumlah review. |
[wp_store_product_reviews] |
[wp_store_product_reviews id="123" limit="20"] |
limit dibatasi 1 sampai 100. |
[wp_store_recently_viewed] |
[wp_store_recently_viewed limit="4" exclude_current="true" title="Produk yang Baru Dilihat"] |
Menampilkan produk yang pernah dilihat customer. |
[wp_store_products_carousel] |
[wp_store_products_carousel label="" per_page="10" per_row="1" img_width="200" img_height="300" crop="true" autoplay="0" pause_on_hover="true" wrap_around="true" page_dots="false" prev_next_buttons="true" lazy_load="0" cell_align="center" draggable="true" contain="true"] |
per_page dibatasi maksimal 20. |
[wp_store_cart] |
[wp_store_cart size="16"] |
size mengatur ukuran icon cart. |
[wp_store_link_profile] |
[wp_store_link_profile size="32"] |
size dibatasi 16 sampai 160 px. |
[wp_store_shipping_checker] |
[wp_store_shipping_checker] |
Tidak punya atribut shortcode khusus; konfigurasi ongkir dari setting toko. |
[wp_store_categories] |
[wp_store_categories hide_empty="0" orderby="name" order="ASC"] |
Membaca taxonomy store_product_cat. |
[wp_store_taxonomies_carousel] |
[wp_store_taxonomies_carousel taxonomy="store_product_cat" columns="10" rows="2" limit="40" image_size="large" parent="" hide_empty="0" orderby="name" order="ASC"] |
taxonomy default store_product_cat; gunakan taxonomy="brand" untuk brand. image_size default large dan dapat memakai ukuran gambar WordPress lain, misalnya medium. parent kosong menampilkan semua term, parent="0" hanya kategori tingkat atas, dan parent="123" hanya anak langsung term ID 123. Gambar diatur pada edit kategori/brand. limit="0" membaca semua term. |
[wp_store_sosmed] |
[wp_store_sosmed facebook="https://facebook.com/..." instagram="https://instagram.com/..." twitter="https://x.com/..." youtube="https://youtube.com/..." caption-facebook="Find us on"] |
Atribut URL sosial media opsional; caption per platform memakai prefix caption-. |
[wp_store_contact] |
[wp_store_contact style="true"] |
style="false" memakai gaya link sederhana. |
[wp_store_bank_accounts] |
[wp_store_bank_accounts] |
Membaca daftar rekening dari pengaturan toko. |
[wp_store_couriers] |
[wp_store_couriers height="30" gap="10" class=""] |
Menampilkan logo kurir aktif dari pengaturan pengiriman. |
[wp_store_captcha] |
[wp_store_captcha target-button="#submit-order" target_button=""] |
Alias shortcode: [wp-store-captcha]; target-button dan target_button sama-sama didukung. |
Gambar kategori dan brand dikelola dari halaman taxonomy VD Store. Gambar dapat diubah melalui form tambah/edit maupun Quick Edit; term tanpa gambar memakai assets/frontend/img/empty.png pada kolom admin.
Mulai dari:
ProductSchema.phpProductFields.php
Kalau yang diubah khusus label manual:
vd-store.phpProductMeta.phpProductQuery.php
Kalau field tampil di admin:
ProductMetaBoxes.php
Mulai dari:
ProductData.php
Kalau mau ubah HTML harga:
vd-store.php- helper
wps_product_price_html()
- helper
Mulai dari:
product-card.php
Kalau data card kurang:
Shortcode.php- method
card_item_from_product()
- method
Mulai dari:
product-gallery.phpstore.jsstyle.css
Mulai dari:
Shortcode.phprender_shop()render_filters()render_shop_with_filters()adjust_archive_query()
filters.phpshop.phpstyle.css
Mulai dari:
RelatedProducts.phpShortcode.phprender_related()
related.php
Mulai dari:
CartService.phpCartController.phpcart.phpcart-widget.php
Mulai dari:
CheckoutController.phpcheckout.phpOrderService.php
Mulai dari:
CouponController.phpCouponMetaBoxes.php
Mulai dari:
OrderMetaBoxes.phpOrderColumns.phpOrderActions.php
Mulai dari:
ProductReviewRepository.phpCustomerController.phpCustomerProfile.phpproduct-reviews.php
Mulai dari:
CustomerProfile.phpCustomerController.php
Mulai dari:
tracking.phpOrderPublicActions.php
Mulai dari:
Assets.phpstyle.cssstore.js
Mulai dari:
vd-store.php- helper
wps_icon() - registry filter
wp_store_icons - filter hasil akhir
wp_store_icon_html
- helper
templates/frontend/components/icons.php- fallback icon bawaan
Kalau ingin cepat memahami alur frontend, fokus dulu ke method ini:
render_shop()render_filters()render_shop_with_filters()adjust_archive_query()
render_single()render_gallery()render_related()render_product_reviews()
card_item_from_product()render_thumbnail()render_price()render_add_to_cart()render_add_to_wishlist()
render_cart_widget()render_cart_page()filter_cart_page_content()render_checkout()render_tracking()render_thanks()
override_archive_template()redirect_page_conflict()
Kalau mengubah area ini, tes ulang end-to-end:
- produk fisik
- produk digital
- harga promo
- opsi harga tambahan
- gallery produk
- filter harga
- sort harga
- reset filter
- archive produk
- produk terkait
- add to cart
- update qty
- hapus item
- cart digital-only
- cart campuran fisik + digital
- pilih ongkir
- mode
freemenampilkan opsi kirim dengan biayaRp0 - mode
offmenyembunyikan kalkulasi ongkir tetapi tetap bisa menyimpan alamat dan dropdown lokasi jikacollect_addressaktif - checkout selesai
- kupon produk
- kupon ongkir
- minimal belanja
- batas penggunaan
- tanggal aktif dan kadaluarsa
- status order
- nomor resi
- tracking publik
- upload bukti transfer
- submit review dari pesanan
- review ganda ditolak
- review tampil di single produk
- field produk diatur dari schema
- admin dan frontend membaca aturan yang sama
- validasi server tetap jadi sumber kebenaran
- angka backend harus membaca harga efektif
- helper tampilan harga lewat
wps_product_price_html() - kalau perlu teks biasa, pakai
wrapper_tag => ''danprice_tag => 'span' - produk tanpa harga tidak bisa dibeli
- produk fisik tanpa berat tidak bisa dibeli
- review tetap custom data
- jangan pindah ke comment WordPress biasa
- addon harus membaca kontrak canonical
VD Store - jangan buat meta produk, order, atau kupon versi kedua kalau tidak benar-benar perlu
Addon klien bisa override template tanpa mengubah file vd-store:
add_filter('wp_store_template_candidates', function ($paths, $template) {
$paths[] = plugin_dir_path(__FILE__) . 'templates/vd-store/' . $template . '.php';
return $paths;
}, 10, 2);Template default tetap menjadi fallback terakhir dari templates/frontend.
Gunakan renderer resmi supaya archive, related, carousel, shortcode, dan Beaver Builder memakai output yang sama:
echo wp_store_render_product_card($product_id, [
'context' => 'archive',
'variant' => 'default',
]);
echo wp_store_render_product_component('price', $product_id);
echo wp_store_render_product_component('rating', $product_id);
echo wp_store_product_info($product_id);
echo wp_store_render_single_product($product_id, [
'hide' => 'rating,related',
]);Shortcode yang tersedia:
[wp_store_product_card id="123"]
[wp_store_product_card id="123" width="400" height="400"]
[wp_store_component id="123" name="rating"]
[wp_store_product_info id="123"]
[wp_store_info id="123"]
[wp_store_single id="123" hide="rating,related"]
Section single produk bisa dikurangi atau diurutkan dari addon:
add_filter('wp_store_single_product_sections', function ($sections, $product_id) {
unset($sections['rating']);
return $sections;
}, 10, 2);Filter archive sekarang dibaca lewat request terstruktur lalu diterapkan ke WP_Query args:
$args = wp_store_product_filter_args([
'post_type' => 'store_product',
'posts_per_page' => 12,
]);
$query = new WP_Query($args);Hook yang dipakai:
pre_get_posts
fl_builder_loop_query_args
wp_store_product_query_args
wp_store_product_filter_request
Mode filter:
off = full GET/non-JS
auto = GET + enhancement ringan
ajax = disiapkan sebagai mode lanjutan
Bagian ini menjelaskan contoh paling praktis. Anggap vd-store adalah mesin toko, sedangkan plugin pendamping hanya mengubah tampilan dan kebutuhan khusus klien.
Misalnya buat plugin baru:
wp-content/plugins/vd-store-client-a/
- vd-store-client-a.php
- templates/
- vd-store/
- components/
- product-card.php
- pages/
- single-flex.php
- assets/
- client-a.css
File utama plugin pendamping:
<?php
/**
* Plugin Name: VD Store Client A
*/
if (!defined('ABSPATH')) {
exit;
}
add_filter('wp_store_template_candidates', function ($paths, $template) {
$paths[] = plugin_dir_path(__FILE__) . 'templates/vd-store/' . $template . '.php';
return $paths;
}, 10, 2);
add_action('wp_enqueue_scripts', function () {
wp_enqueue_style(
'vd-store-client-a',
plugin_dir_url(__FILE__) . 'assets/client-a.css',
[],
WP_STORE_VERSION
);
});Penjelasan sederhana:
vd-storetetap jalan seperti biasa.- Kalau
vd-storemau render template, plugin pendamping diberi kesempatan menyediakan file pengganti. - Kalau file pengganti tidak ada, template bawaan
vd-storetetap dipakai.
Kalau ingin semua card produk berubah, buat file:
vd-store-client-a/templates/vd-store/components/product-card.php
Isi contoh sederhana:
<?php
$id = (int) ($item['id'] ?? 0);
$title = (string) ($item['title'] ?? '');
$link = (string) ($item['link'] ?? '#');
$thumbnail_width = isset($thumbnail_width) ? (int) $thumbnail_width : 200;
$thumbnail_height = isset($thumbnail_height) ? (int) $thumbnail_height : 300;
?>
<article class="client-product-card">
<a href="<?php echo esc_url($link); ?>" class="client-product-card__image">
<?php echo do_shortcode('[wp_store_thumbnail id="' . esc_attr((string) $id) . '" width="' . esc_attr((string) $thumbnail_width) . '" height="' . esc_attr((string) $thumbnail_height) . '"]'); ?>
</a>
<h3 class="client-product-card__title">
<a href="<?php echo esc_url($link); ?>">
<?php echo esc_html($title); ?>
</a>
</h3>
<?php echo wp_store_render_product_component('price', $id); ?>
<div class="client-product-card__action">
<?php echo do_shortcode('[wp_store_add_to_cart id="' . esc_attr((string) $id) . '" text="Beli"]'); ?>
</div>
</article>Dampaknya:
- Archive produk ikut berubah.
- Related product ikut berubah.
- Recently viewed ikut berubah.
- Carousel ikut berubah.
- Shortcode
[wp_store_product_card]ikut berubah.
Jadi developer cukup ubah satu file product card.
Untuk mengubah teks tombol add to cart, gunakan atribut text:
[wp_store_add_to_cart id="123" text="Masukkan Keranjang"]
Prioritas label tombol: text jika atribut dikirim, lalu label lama. Jika text="", tombol menjadi icon-only.
Kalau plugin pendamping punya template custom sendiri:
echo wp_store_render_product_card(get_the_ID(), [
'context' => 'custom-section',
'variant' => 'compact',
]);Kalau butuh ukuran thumbnail khusus:
echo wp_store_render_product_card($product_id, [
'thumbnail_width' => 400,
'thumbnail_height' => 400,
]);Kalau tidak mengirim ukuran, ukuran default mengikuti pengaturan:
wp-admin/admin.php?page=wp-store-settings&tab=style
Single produk default sekarang dirender lewat:
wp_store_render_single_product($product_id);Kalau klien tidak mau rating dan related product:
echo wp_store_render_single_product($product_id, [
'hide' => 'rating,related',
]);Kalau ingin aturan global dari plugin pendamping:
add_filter('wp_store_single_product_sections', function ($sections, $product_id) {
unset($sections['rating']);
unset($sections['share']);
return $sections;
}, 10, 2);Penjelasan sederhana:
- Section adalah bagian-bagian single produk.
- Developer bisa mematikan bagian tertentu tanpa copy seluruh template single produk.
- Kalau butuh layout total berbeda, override file
pages/single-flex.php.
Buat file:
vd-store-client-a/templates/vd-store/pages/single-flex.php
Isi contoh minimal:
<?php
$id = isset($id) ? (int) $id : 0;
if ($id <= 0) {
return;
}
?>
<div class="client-single-product">
<div class="client-single-product__media">
<?php echo wp_store_render_product_component('gallery', $id); ?>
</div>
<div class="client-single-product__summary">
<?php echo wp_store_render_product_component('title', $id); ?>
<?php echo wp_store_render_product_component('price', $id); ?>
<?php echo wp_store_product_info($id); ?>
<?php echo wp_store_render_product_component('actions', $id); ?>
</div>
<div class="client-single-product__description">
<?php echo wp_store_render_product_component('description', $id); ?>
</div>
</div>Di Beaver Builder, developer bisa membuat layout single produk secara manual, lalu isi tiap module HTML/Shortcode dengan shortcode berikut.
Judul produk:
[wp_store_component name="title"]
Gallery:
[wp_store_component name="gallery"]
Harga:
[wp_store_component name="price"]
Rating:
[wp_store_component name="rating"]
Info produk:
[wp_store_product_info]
Tombol beli:
[wp_store_component name="actions"]
Deskripsi:
[wp_store_component name="description"]
Related product:
[wp_store_component name="related"]
Catatan:
- Kalau shortcode dipakai di halaman single produk,
idboleh dikosongkan. - Kalau dipakai di halaman biasa, isi
idproduk.
Contoh di halaman biasa:
[wp_store_component id="123" name="price"]
[wp_store_product_info id="123"]
[wp_store_product_card id="123"]
Contoh susunan module:
Row 1, dua kolom
- Kolom kiri: [wp_store_component name="gallery"]
- Kolom kanan:
- [wp_store_component name="title"]
- [wp_store_component name="price"]
- [wp_store_product_info]
- [wp_store_component name="actions"]
Row 2
- [wp_store_component name="description"]
Row 3
- [wp_store_component name="related"]
Dengan cara ini Beaver Builder hanya mengatur layout. Data produk, harga, tombol beli, dan logic cart tetap berasal dari vd-store.
Untuk halaman yang dibuat manual, pakai:
[wp_store_shop_with_filters filter_mode="off" per_page="12"]
Mode off berarti:
- Form filter submit biasa.
- URL berisi query seperti
?sort=price_asc&min_price=10000. - Tetap jalan tanpa JavaScript.
- Cocok untuk halaman sederhana dan stabil.
Filter selalu menggunakan submit GET setelah tombol Terapkan diklik. Atribut lama mode="auto" dan filter_mode="auto" tidak lagi melakukan reload saat input berubah, sehingga aman untuk archive custom dan Beaver Builder.
Kalau plugin pendamping punya template halaman sendiri:
$args = wp_store_product_filter_args([
'post_type' => 'store_product',
'posts_per_page' => 12,
'paged' => max(1, (int) get_query_var('paged')),
]);
$query = new WP_Query($args);
while ($query->have_posts()) {
$query->the_post();
echo wp_store_render_product_card(get_the_ID());
}
wp_reset_postdata();Penjelasan sederhana:
wp_store_product_filter_args()membaca filter dari URL.- Hasilnya menjadi args untuk
WP_Query. - Card tetap dirender lewat renderer resmi.
Kalau Beaver Builder memakai module Posts atau Loop dengan post type store_product, filter dari URL akan masuk lewat hook:
fl_builder_loop_query_args
Artinya:
- User pilih kategori/harga/sort dari form filter.
- URL berubah.
- Query Beaver Builder ikut membaca filter.
- Developer tidak perlu menulis ulang logic filter di Beaver.
Untuk filter-nya, tetap taruh shortcode ini di sidebar atau row kiri:
[wp_store_filters mode="off"]
Atau pakai paket lengkap:
[wp_store_shop_with_filters filter_mode="off"]
Pakai template override kalau:
- desain card atau single produk berbeda jauh;
- semua loop harus ikut berubah;
- klien punya desain khusus.
Pakai shortcode Beaver Builder kalau:
- hanya butuh susun ulang layout;
- ingin cepat membuat single produk custom;
- tidak ingin membuat file template.
Pakai PHP renderer kalau:
- plugin pendamping punya template sendiri;
- butuh loop custom;
- butuh kontrol lebih detail dari shortcode.
Pakai filter query kalau:
- halaman produk dibuat manual;
- query dibuat oleh Beaver Builder;
- query dibuat oleh shortcode;
- semua harus membaca filter URL yang sama.
Contoh ini langsung menambahkan Nama Perusahaan, Jenis Pembeli, dan Konfirmasi Data di bagian checkout yang sesuai. Nilainya otomatis disimpan dan bisa dilihat pada editor pesanan WordPress. Tidak perlu menambah kode JavaScript atau kode penyimpanan sendiri.
- Buat folder
checkout-tambahandiwp-content/plugins/. - Buat file
checkout-tambahan.phpdi dalam folder tersebut, lalu salin seluruh kode berikut. - Buka WordPress Admin ? Plugin, lalu aktifkan Checkout Tambahan.
Fitur field tambahan beserta pilihan section tersedia mulai VD Store 1.4.7 dan Velocity Marketplace 1.0.6. Jika memakai marketplace, gunakan kedua versi tersebut atau yang lebih baru. Contoh cukup dipasang sekali untuk checkout VD Store maupun marketplace.
<?php
/**
* Plugin Name: Checkout Tambahan
* Description: Menambahkan field checkout VD Store dan Velocity Marketplace.
* Version: 1.0.0
*/
if (!defined('ABSPATH')) {
exit;
}
add_filter('wp_store_checkout_fields', function ($fields) {
// Isian teks, boleh dikosongkan.
$fields['nama_perusahaan'] = [
'type' => 'text',
'label' => 'Nama Perusahaan',
'placeholder' => 'Contoh: PT Maju Bersama',
'section' => 'customer',
'required' => false,
'priority' => 10,
];
// Pilihan yang wajib diisi pembeli.
$fields['jenis_pembeli'] = [
'type' => 'select',
'label' => 'Jenis Pembeli',
'placeholder' => 'Pilih jenis pembeli',
'section' => 'customer',
'required' => true,
'priority' => 20,
'options' => [
'pribadi' => 'Pribadi',
'perusahaan' => 'Perusahaan',
],
];
// Kotak centang yang wajib dicentang sebelum memesan.
$fields['konfirmasi_data'] = [
'type' => 'checkbox',
'label' => 'Saya sudah memeriksa data pesanan',
'section' => 'before_submit',
'required' => true,
'priority' => 30,
];
return $fields;
});Buka halaman checkout: Nama Perusahaan dan Jenis Pembeli muncul setelah data pembeli, sedangkan Konfirmasi Data muncul sebelum tombol Buat Pesanan. Pilih Jenis Pembeli, centang Konfirmasi Data, lalu selesaikan pesanan uji. Buka pesanan tersebut di admin WordPress dan lihat box Field Tambahan Checkout.
Jika field wajib belum diisi, checkout akan menampilkan pesan kesalahan. Nilai belum ditampilkan otomatis pada email atau dashboard seller marketplace. Menonaktifkan plugin contoh menghilangkan field dari checkout; nilai pesanan lama tetap tersimpan.
Edit kode di file checkout-tambahan.php yang baru dibuat:
| Yang ingin diubah | Yang perlu diedit |
|---|---|
| Nama yang tampil | Ubah isi label, misalnya menjadi Nama Usaha. |
| Teks petunjuk | Ubah isi placeholder. |
| Wajib diisi | Pakai 'required' => true. Untuk opsional, pakai false. |
| Lokasi field | Ubah section sesuai tabel lokasi di bawah. |
| Urutan field | Ubah angka priority. Angka lebih kecil tampil lebih awal dalam section yang sama. |
| Pilihan dropdown | Ubah pasangan nilai dan label di options. |
| Hapus field dari contoh | Hapus satu blok $fields['nama_field'] = [...]; yang tidak diperlukan. |
| Tambah field teks lain | Salin blok nama_perusahaan, lalu ganti key dan labelnya. |
Key seperti nama_perusahaan harus unik, diawali huruf kecil, dan hanya berisi
huruf kecil, angka, atau underscore. Pertahankan key agar data pesanan lama mudah
dibaca. Tipe yang tersedia: text, textarea, email, tel, select, checkbox.
Hook ini mengatur field tambahan; field bawaan seperti nama penerima, alamat,
ongkir, dan pembayaran belum termasuk.
Tambahkan properti section pada definisi field, misalnya 'section' => 'customer'.
Nilai section |
Tempat field muncul | Contoh kebutuhan klien |
|---|---|---|
customer |
Setelah data pembeli. | Nama perusahaan, nomor pelanggan. |
address |
Setelah data alamat pengiriman, hanya ketika alamat diminta. | Nama gedung, patokan alamat. |
notes |
Setelah Catatan pesanan. Ini lokasi default. | Pesan hadiah, instruksi pengemasan. |
before_submit |
Sebelum tombol Buat Pesanan. | Checkbox konfirmasi data pesanan. |
Jika section tidak diisi atau nilainya tidak dikenali, field tetap muncul pada
notes, sehingga kode lama tetap bekerja. priority mengatur urutan di dalam
section, bukan memindahkan field ke section lain.
Untuk field khusus alamat, ganti section pada salah satu field teks menjadi
address, misalnya untuk Nama Gedung. Field tersebut hanya tampil jika checkout
meminta alamat. Ketika alamat tidak diminta (misalnya seluruh produk digital),
field dinonaktifkan, tidak dikirim, tidak diwajibkan, dan nilainya tidak disimpan.
Aturan server mengikuti isi keranjang dan pengaturan toko, bukan nilai kiriman pembeli.
Hook wp_store_checkout_fields menerima array definisi field dan harus
mengembalikan array tersebut. Callback dengan priority lebih akhir bisa mengubah
definisi yang sudah ada atau menghapusnya dengan unset($fields['nama_field']).
Kode contoh juga bisa ditempatkan di functions.php child theme: salin bagian
add_filter(...) saja, tanpa tag <?php dan header plugin. Pilih satu lokasi
pemasangan. Jangan membungkus hook dengan is_page() karena definisi field juga
diperlukan ketika REST API memvalidasi pesanan.
Kedua checkout mengirim objek JSON checkout_fields. Server hanya memproses
field terdaftar, membersihkan teks, dan memeriksa field wajib, email, serta pilihan
dropdown. Data tidak valid ditolak dengan HTTP 400 sebelum pesanan dibuat.
Checkbox disimpan sebagai string 1 atau 0.
Nilai tersimpan dalam metadata _store_order_checkout_fields pada pesanan core
store_order. Jika membuat template sendiri, baca dengan
get_post_meta($order_id, '_store_order_checkout_fields', true), pastikan hasilnya
array, lalu ambil key field yang dibutuhkan. $order_id adalah ID pesanan core,
bukan nomor invoice atau ID seller. Periksa hak akses pesanan dan gunakan
esc_html() saat menampilkan nilai.
Marketplace memakai template dan endpoint sendiri, tetapi menggunakan definisi
field dan penyimpanan core yang sama. Hook controller VD Store
wp_store_before_create_order, wp_store_order_created, dan
wp_store_after_create_order tidak otomatis dipanggil oleh endpoint marketplace.
Filter wp_store_checkout_requires_login dapat dipakai ketika klien hanya
mengizinkan pengguna yang sudah mempunyai akun dan sedang login untuk checkout.
Aturan ini berlaku pada checkout keranjang dan checkout langsung, termasuk saat
Velocity Marketplace aktif. Halaman checkout dan REST API sama-sama dilindungi.
- Buat folder
checkout-wajib-logindiwp-content/plugins/. - Buat file
checkout-wajib-login.phpdi dalam folder tersebut. - Salin seluruh kode berikut, lalu aktifkan Checkout Wajib Login melalui admin WordPress.
<?php
/**
* Plugin Name: Checkout Wajib Login
* Description: Membatasi checkout VD Store dan Velocity Marketplace untuk pengguna login.
* Version: 1.0.0
*/
if (!defined('ABSPATH')) {
exit;
}
add_filter('wp_store_checkout_requires_login', '__return_true');Setelah plugin aktif, tamu yang menekan Beli Sekarang diarahkan ke halaman login dan kembali ke produk sesudah berhasil masuk. Jika tamu membuka halaman checkout secara langsung, halaman menampilkan tombol Masuk / Daftar. Permintaan checkout langsung ke REST API juga ditolak sampai pengguna login.
Pendaftaran akun mengikuti pengaturan WordPress. Aktifkan Keanggotaan: Setiap orang dapat mendaftar pada Pengaturan > Umum jika klien mengizinkan pembeli membuat akun sendiri. Menonaktifkan custom plugin mengembalikan checkout tamu.