>
>

>

0 表示限量,售完即止。', 'aksrt'); ?>

>
post_type !== 'post') return; if (empty($_POST['aksrt_pay_meta_nonce']) || !wp_verify_nonce((string) $_POST['aksrt_pay_meta_nonce'], 'aksrt_pay_meta_save')) { return; } if (!current_user_can('edit_post', $post_id)) return; // 付费类型 $allowed_types = array_keys(aksrt_get_pay_types()); $pay_type = sanitize_key((string) ($_POST['aksrt_pay_type'] ?? 'no')); if (!in_array($pay_type, $allowed_types, true)) { $pay_type = 'no'; } // 价格字段 $pay_modo = sanitize_key((string) ($_POST['aksrt_pay_modo'] ?? '0')); if ($pay_modo !== 'points') { $pay_modo = '0'; } $price = trim((string) wp_unslash($_POST['aksrt_pay_price'] ?? '0')); $points_price = max(0, (int) ($_POST['aksrt_pay_points_price'] ?? 0)); $original_price = trim((string) wp_unslash($_POST['aksrt_pay_original_price'] ?? '0')); $vip1_price = trim((string) wp_unslash($_POST['aksrt_pay_vip1_price'] ?? '0')); $vip2_price = trim((string) wp_unslash($_POST['aksrt_pay_vip2_price'] ?? '0')); $vip1_points = max(0, (int) ($_POST['aksrt_pay_vip1_points'] ?? 0)); $vip2_points = max(0, (int) ($_POST['aksrt_pay_vip2_points'] ?? 0)); $pay_limit = (int) ($_POST['aksrt_pay_limit'] ?? 0); if (!in_array($pay_limit, [0, 1, 2], true)) { $pay_limit = 0; } // 资源信息 $version = sanitize_text_field((string) ($_POST['aksrt_pay_version'] ?? '')); $size = sanitize_text_field((string) ($_POST['aksrt_pay_size'] ?? '')); $compat = sanitize_text_field((string) ($_POST['aksrt_pay_compat'] ?? '')); $license = sanitize_text_field((string) ($_POST['aksrt_pay_license'] ?? '')); $demo_url = esc_url_raw((string) ($_POST['aksrt_pay_demo_url'] ?? '')); $video_url = esc_url_raw((string) ($_POST['aksrt_pay_video_url'] ?? '')); // 布尔字段 $require_login = !empty($_POST['aksrt_pay_require_login']); $require_captcha = !empty($_POST['aksrt_pay_require_captcha']); // JSON 字段 $downloads = $this->parse_json_array($_POST['aksrt_pay_downloads'] ?? ''); $attributes = $this->parse_json_array($_POST['aksrt_pay_attributes'] ?? ''); $gallery = $this->parse_json_array($_POST['aksrt_pay_gallery'] ?? ''); // 清洗下载源 if ($downloads !== null && class_exists('AKSRT\\Core\\Setup') && method_exists('AKSRT\\Core\\Setup', 'sanitize_downloads_meta')) { $downloads = Setup::sanitize_downloads_meta($downloads); } // 保存统一元数据 $pay_meta = DomainModel::sanitize_pay_meta([ 'pay_type' => $pay_type, 'pay_modo' => $pay_modo, 'price' => $price, 'points_price' => $points_price, 'original_price' => $original_price, 'vip1_price' => $vip1_price, 'vip2_price' => $vip2_price, 'vip1_points' => $vip1_points, 'vip2_points' => $vip2_points, 'pay_limit' => $pay_limit, 'version' => $version, 'size' => $size, 'compat' => $compat, 'license' => $license, 'demo_url' => $demo_url, 'video_url' => $video_url, 'downloads' => $downloads ?? [], 'attributes' => $attributes ?? [], 'gallery' => $gallery ?? [], 'require_login' => $require_login, 'require_captcha' => $require_captcha, // §3.8 电商增强字段 'virtual_sales' => $_POST['aksrt_pay_virtual_sales'] ?? 0, 'stock' => $_POST['aksrt_pay_stock'] ?? -1, 'purchase_limit' => $_POST['aksrt_pay_purchase_limit'] ?? 0, 'card_keys' => isset($_POST['aksrt_pay_card_keys']) ? array_filter(array_map('trim', explode("\n", (string) $_POST['aksrt_pay_card_keys']))) : [], 'free_preview' => $_POST['aksrt_pay_free_preview'] ?? '', 'show_sales' => !empty($_POST['aksrt_pay_show_sales']), 'download_limit_over_price' => trim((string) wp_unslash($_POST['aksrt_pay_limit_over_price'] ?? '0')), 'coupon_s' => !empty($_POST['aksrt_pay_coupon_s']), 'coupon_desc' => (string) ($_POST['aksrt_pay_coupon_desc'] ?? ''), 'pay_rebate_discount' => trim((string) wp_unslash($_POST['aksrt_pay_rebate_discount'] ?? '0')), ]); update_post_meta($post_id, DomainModel::PAY_META_KEY, $pay_meta); // 同步标量字段用于查询(模仿 legacy 的 aksrtpay_type 同步) update_post_meta($post_id, DomainModel::PAY_TYPE_KEY, (string) $pay_meta['pay_type']); $query_price = ($pay_meta['pay_modo'] === 'points') ? (int) $pay_meta['points_price'] : (string) $pay_meta['price']; update_post_meta($post_id, DomainModel::PAY_PRICE_KEY, $query_price); update_post_meta($post_id, '_aksrt_pay_modo', (string) $pay_meta['pay_modo']); update_post_meta($post_id, '_aksrt_pay_limit', (int) $pay_meta['pay_limit']); // 清理旧的 _aksrt_is_resource 标记 update_post_meta( $post_id, DomainModel::RESOURCE_MARKER_KEY, DomainModel::is_resource_pay_type((string) $pay_meta['pay_type']) ? 1 : 0 ); } /** * 安全解析 JSON 数组。 */ private function parse_json_array(string $raw): ?array { $raw = trim($raw); if ($raw === '') return []; $decoded = json_decode($raw, true); return is_array($decoded) ? $decoded : null; } }