ProPeler
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
var
/
www
/
html
/
wp-content
/
themes
/
bayisihat-jurnal
/
inc
/
Filename :
shop.php
back
Copy
<?php if (!defined('ABSPATH')) exit; /* ============ Bayi Sihat — Shop (tripwire ebook) with pluggable gateway ============ Default gateway = 'dummy' (demo: instant success, no real charge). Swap to a real gateway later by setting option bs_payment_gateway. */ function bs_shop_cfg(){ return array( 'product' => 'Ebook: Panduan Kehamilan Lengkap', 'price' => (float) get_option('bs_ebook_price', 19), 'compare' => (float) get_option('bs_ebook_compare', 49), 'currency' => 'RM', 'gateway' => get_option('bs_payment_gateway', 'dummy'), 'file' => 'ebook-panduan-kehamilan-bayisihat-v1.pdf', // in uploads/bs-private/ ); } function bs_private_dir(){ $up = wp_upload_dir(); return trailingslashit($up['basedir']) . 'bs-private/'; } /* Free lead-magnet: per-subscriber ebook download URL (token generated on first ask). */ function bs_sub_ebook_url($sid){ if (!$sid) return ''; $tok = get_post_meta($sid, 'bs_sub_token', true); if (!$tok) { $tok = wp_generate_password(28, false, false); update_post_meta($sid, 'bs_sub_token', $tok); } return add_query_arg(array('action' => 'bs_download', 't' => $tok), admin_url('admin-ajax.php')); } /* ---------- Order storage ---------- */ add_action('init', function(){ register_post_type('bs_order', array( 'labels' => array('name'=>'Pesanan Ebook','singular_name'=>'Pesanan','menu_name'=>'Pesanan Ebook'), 'public' => false, 'show_ui' => true, 'show_in_menu' => true, 'menu_icon' => 'dashicons-cart', 'supports' => array('title'), 'capability_type' => 'post', 'map_meta_cap' => true, )); }); /* ---------- Helper: add buyer to subscriber list (warm lead) ---------- */ function bs_shop_add_subscriber($email, $src){ if (!is_email($email)) return; $existing = get_posts(array('post_type'=>'bs_subscriber','title'=>$email,'post_status'=>'any','numberposts'=>1,'fields'=>'ids')); if (!empty($existing)) { update_post_meta($existing[0], 'bs_'.str_replace('-','_',$src), current_time('mysql')); return; } $id = wp_insert_post(array('post_type'=>'bs_subscriber','post_title'=>$email,'post_status'=>'publish'), true); if (is_wp_error($id)) return; update_post_meta($id, 'bs_sub_date', current_time('mysql')); update_post_meta($id, 'bs_sub_src', $src); } /* ---------- Checkout (AJAX) ---------- */ function bs_checkout_handler(){ if (!check_ajax_referer('bs_checkout', 'nonce', false)) { wp_send_json_error(array('msg' => 'Sesi tamat — sila muat semula halaman.')); } if (!empty($_POST['website'])) { // honeypot wp_send_json_error(array('msg' => 'Ralat pengesahan. Cuba lagi.')); } $name = sanitize_text_field(wp_unslash($_POST['name'] ?? '')); $email = sanitize_email(wp_unslash($_POST['email'] ?? '')); if (mb_strlen($name) < 2) wp_send_json_error(array('msg' => 'Sila masukkan nama anda.')); if (!is_email($email)) wp_send_json_error(array('msg' => 'Sila masukkan alamat e-mel yang sah.')); $ip = isset($_SERVER['REMOTE_ADDR']) ? sanitize_text_field($_SERVER['REMOTE_ADDR']) : ''; $tkey = 'bs_ord_' . md5($ip); if (get_transient($tkey)) wp_send_json_error(array('msg' => 'Terlalu pantas — sila cuba sebentar lagi.')); set_transient($tkey, 1, 10); $cfg = bs_shop_cfg(); $token = wp_generate_password(28, false, false); $oid = wp_insert_post(array( 'post_type' => 'bs_order', 'post_title' => $email . ' — ' . $cfg['product'], 'post_status' => 'publish', ), true); if (is_wp_error($oid)) wp_send_json_error(array('msg' => 'Maaf, ada masalah teknikal. Cuba lagi sebentar.')); update_post_meta($oid, 'bs_ord_name', $name); update_post_meta($oid, 'bs_ord_email', $email); update_post_meta($oid, 'bs_ord_price', $cfg['price']); update_post_meta($oid, 'bs_ord_gateway', $cfg['gateway']); update_post_meta($oid, 'bs_ord_token', $token); update_post_meta($oid, 'bs_ord_date', current_time('mysql')); update_post_meta($oid, 'bs_ord_ip', $ip); $dl = add_query_arg(array('action' => 'bs_download', 't' => $token), admin_url('admin-ajax.php')); if ($cfg['gateway'] === 'dummy') { update_post_meta($oid, 'bs_ord_status', 'paid-demo'); bs_shop_add_subscriber($email, 'ebook-buyer'); wp_send_json_success(array( 'paid' => true, 'download' => $dl, 'msg' => 'Pembayaran demo berjaya! Ebook anda sedia dimuat turun.', )); } // Real gateway path (not active yet) — would return a redirect URL here. update_post_meta($oid, 'bs_ord_status', 'pending'); wp_send_json_error(array('msg' => 'Gateway pembayaran belum diaktifkan. Sila cuba sebentar lagi.')); } add_action('wp_ajax_nopriv_bs_checkout', 'bs_checkout_handler'); add_action('wp_ajax_bs_checkout', 'bs_checkout_handler'); /* ---------- Secure download (AJAX, token-gated) ---------- */ function bs_download_die($code, $msg){ // admin-ajax context: wp_die() defaults to HTTP 200, so send status + body manually. status_header($code); nocache_headers(); header('Content-Type: text/plain; charset=utf-8'); echo $msg; exit; } function bs_download_handler(){ $token = isset($_GET['t']) ? sanitize_text_field(wp_unslash($_GET['t'])) : ''; if (strlen($token) < 20) bs_download_die(403, 'Pautan muat turun tidak sah.'); // 1) Paid buyer (bs_order) $track = 0; $trackkey = ''; $orders = get_posts(array( 'post_type'=>'bs_order','post_status'=>'publish','numberposts'=>1,'fields'=>'ids', 'meta_query'=>array(array('key'=>'bs_ord_token','value'=>$token)), )); if (!empty($orders)) { if (get_post_meta($orders[0], 'bs_ord_status', true) === 'pending') bs_download_die(402, 'Pesanan ini belum dibayar.'); $track = $orders[0]; $trackkey = 'bs_ord_downloads'; } else { // 2) Free lead-magnet subscriber (bs_subscriber) $subs = get_posts(array( 'post_type'=>'bs_subscriber','post_status'=>'publish','numberposts'=>1,'fields'=>'ids', 'meta_query'=>array(array('key'=>'bs_sub_token','value'=>$token)), )); if (empty($subs)) bs_download_die(403, 'Pautan muat turun tidak sah atau telah tamat.'); $track = $subs[0]; $trackkey = 'bs_sub_downloads'; } $cfg = bs_shop_cfg(); $file = bs_private_dir() . $cfg['file']; if (!file_exists($file) || !is_readable($file)) bs_download_die(404, 'Fail tidak ditemui. Hubungi kami di hello@bayisihat.com.'); $n = (int) get_post_meta($track, $trackkey, true); update_post_meta($track, $trackkey, $n + 1); nocache_headers(); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename="Panduan-Kehamilan-Lengkap-BayiSihat.pdf"'); header('Content-Length: ' . filesize($file)); header('X-Robots-Tag: noindex, nofollow'); while (ob_get_level()) ob_end_clean(); readfile($file); exit; } add_action('wp_ajax_nopriv_bs_download', 'bs_download_handler'); add_action('wp_ajax_bs_download', 'bs_download_handler'); /* ---------- Keep the demo checkout out of the index ---------- */ add_action('wp_head', function(){ if (is_page_template('tpl-checkout.php')) echo '<meta name="robots" content="noindex, nofollow">' . "\n"; }, 1); add_filter('wp_sitemaps_posts_query_args', function($args, $post_type){ if ($post_type === 'page') { $p = get_page_by_path('checkout'); if ($p) { $ex = isset($args['post__not_in']) ? $args['post__not_in'] : array(); $ex[] = $p->ID; $args['post__not_in'] = $ex; } } return $args; }, 10, 2); /* ---------- Admin: order count + CSV export ---------- */ add_action('admin_post_bs_export_orders', function(){ if (!current_user_can('manage_options') || !wp_verify_nonce($_GET['_wpnonce'] ?? '', 'bs_export_ord')) wp_die('Tidak dibenarkan'); $orders = get_posts(array('post_type'=>'bs_order','numberposts'=>-1,'post_status'=>'publish')); header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=bayisihat-orders-' . wp_date('Ymd') . '.csv'); $out = fopen('php://output', 'w'); fputcsv($out, array('nama','email','harga','gateway','status','tarikh','muat_turun')); foreach ($orders as $o) { fputcsv($out, array( get_post_meta($o->ID,'bs_ord_name',true), get_post_meta($o->ID,'bs_ord_email',true), get_post_meta($o->ID,'bs_ord_price',true), get_post_meta($o->ID,'bs_ord_gateway',true), get_post_meta($o->ID,'bs_ord_status',true), get_post_meta($o->ID,'bs_ord_date',true), (int) get_post_meta($o->ID,'bs_ord_downloads',true), )); } fclose($out); exit; }); add_action('admin_notices', function(){ $screen = function_exists('get_current_screen') ? get_current_screen() : null; if (!$screen || $screen->post_type !== 'bs_order') return; $count = wp_count_posts('bs_order')->publish; $url = wp_nonce_url(admin_url('admin-post.php?action=bs_export_orders'), 'bs_export_ord'); $gw = esc_html(get_option('bs_payment_gateway','dummy')); echo '<div class="notice notice-info"><p><strong>' . intval($count) . ' pesanan.</strong> Gateway aktif: <code>' . $gw . '</code>. <a href="' . esc_url($url) . '" class="button">Muat turun CSV</a></p></div>'; });