Move all domain folders from src/AKSRT/{Domain} to src/{Domain}; remap
Composer PSR-4 "AKSRT\\": "src/"; update audit script + README + ADR
paths; remove dead tools/build-psr4-map.php (scanned deleted inc/classes).
206 lines
8.9 KiB
PHP
206 lines
8.9 KiB
PHP
<?php
|
|
/**
|
|
* @package AKSRT
|
|
*/
|
|
|
|
namespace AKSRT\Core;
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
/**
|
|
* Front-end pay meta save for article submit.
|
|
*/
|
|
trait FrontSubmitPay {
|
|
|
|
/**
|
|
* @param array<string, mixed> $data
|
|
* @param array<string, mixed> $settings
|
|
* @return array{success:bool,message?:string}
|
|
*/
|
|
private function save_pay_meta(int $post_id, array $data, int $user_id, array $settings): array {
|
|
if (!$this->user_can_cap('new_post_pay', $user_id)) {
|
|
return ['success' => true];
|
|
}
|
|
|
|
// Only touch pay meta when the form sent pay fields.
|
|
$has_pay_payload = isset($data['aksrt_pay']) || isset($data['pay_enabled']) || isset($data['zibpay_s']) || isset($data['pay_type']);
|
|
if (!$has_pay_payload) {
|
|
return ['success' => true];
|
|
}
|
|
|
|
$raw = is_array($data['aksrt_pay'] ?? null) ? $data['aksrt_pay'] : [];
|
|
$enabled = !empty($data['pay_enabled']) || !empty($data['zibpay_s']);
|
|
|
|
$existing = function_exists('aksrt_get_pay_meta') ? aksrt_get_pay_meta($post_id) : DomainModel::default_pay_meta();
|
|
$meta = is_array($existing) ? $existing : DomainModel::default_pay_meta();
|
|
|
|
if (!$enabled) {
|
|
$meta['pay_type'] = DomainModel::PAY_TYPE_NO;
|
|
$this->write_pay_meta($post_id, $meta);
|
|
return ['success' => true];
|
|
}
|
|
|
|
$pay_modo = sanitize_key((string) ($raw['pay_modo'] ?? $data['pay_modo'] ?? '0'));
|
|
$pay_modo = $pay_modo === 'points' ? 'points' : '0';
|
|
|
|
$pay_type = sanitize_key((string) ($raw['pay_type'] ?? $data['pay_type'] ?? DomainModel::PAY_TYPE_READING));
|
|
if ($pay_type === '1' || $pay_type === 'reading' || $pay_type === 'payshow') {
|
|
$pay_type = DomainModel::PAY_TYPE_READING;
|
|
} elseif ($pay_type === '2' || $pay_type === 'download') {
|
|
$pay_type = DomainModel::PAY_TYPE_DOWNLOAD;
|
|
} else {
|
|
$pay_type = DomainModel::normalize_pay_type($pay_type);
|
|
if ($pay_type === DomainModel::PAY_TYPE_NO) {
|
|
$pay_type = DomainModel::PAY_TYPE_READING;
|
|
}
|
|
}
|
|
|
|
$downloads = $this->normalize_front_downloads($raw['downloads'] ?? $data['pay_download'] ?? []);
|
|
if (!empty($downloads) && $this->user_can_cap('new_post_pay_download', $user_id)) {
|
|
$pay_type = DomainModel::PAY_TYPE_DOWNLOAD;
|
|
$meta['downloads'] = $downloads;
|
|
} elseif ($pay_type === DomainModel::PAY_TYPE_DOWNLOAD && !$this->user_can_cap('new_post_pay_download', $user_id)) {
|
|
$pay_type = DomainModel::PAY_TYPE_READING;
|
|
$meta['downloads'] = [];
|
|
}
|
|
|
|
$meta['pay_type'] = $pay_type;
|
|
$meta['pay_modo'] = $pay_modo;
|
|
|
|
$min = (float) ($settings['pay_price_min'] ?? 0);
|
|
$max = (float) ($settings['pay_price_max'] ?? 0);
|
|
$allow_free = !empty($settings['pay_free_s']);
|
|
$vip_manual = !empty($settings['pay_vip_price_s']);
|
|
$vip1_disc = (int) ($settings['pay_vip_1_discount'] ?? 100);
|
|
$vip2_disc = (int) ($settings['pay_vip_2_discount'] ?? 100);
|
|
|
|
if ($pay_modo === 'points') {
|
|
$points = isset($raw['points_price']) ? (int) $raw['points_price'] : (int) ($data['points_price'] ?? 0);
|
|
if ($points < 0) {
|
|
return ['success' => false, 'message' => __('请设置正确的积分价格', 'aksrt')];
|
|
}
|
|
if (!$allow_free && $points <= 0) {
|
|
return ['success' => false, 'message' => __('请设置付费内容的积分价格', 'aksrt')];
|
|
}
|
|
if ($min > 0 && $points < $min) {
|
|
return ['success' => false, 'message' => sprintf(__('积分价格不能低于:%s', 'aksrt'), (string) $min)];
|
|
}
|
|
if ($max > 0 && $points > $max) {
|
|
return ['success' => false, 'message' => sprintf(__('积分价格不能高于:%s', 'aksrt'), (string) $max)];
|
|
}
|
|
|
|
if ($vip_manual) {
|
|
$vip1 = isset($raw['vip1_points']) ? (int) $raw['vip1_points'] : (int) ($raw['vip_1_points'] ?? 0);
|
|
$vip2 = isset($raw['vip2_points']) ? (int) $raw['vip2_points'] : (int) ($raw['vip_2_points'] ?? 0);
|
|
} else {
|
|
$vip1 = (int) floor($points * $vip1_disc / 100);
|
|
$vip2 = (int) floor($points * $vip2_disc / 100);
|
|
}
|
|
$vip1 = max(0, min($points, $vip1));
|
|
$vip2 = max(0, min($vip1, $vip2));
|
|
|
|
$meta['points_price'] = $points;
|
|
$meta['price'] = 0.0;
|
|
$meta['vip1_points'] = $vip1;
|
|
$meta['vip2_points'] = $vip2;
|
|
$meta['vip1_price'] = 0.0;
|
|
$meta['vip2_price'] = 0.0;
|
|
} else {
|
|
$price = isset($raw['price']) ? (float) $raw['price'] : (float) ($raw['pay_price'] ?? $data['pay_price'] ?? 0);
|
|
$price = round($price, 2);
|
|
if ($price < 0) {
|
|
return ['success' => false, 'message' => __('请设置正确的价格', 'aksrt')];
|
|
}
|
|
if (!$allow_free && $price <= 0) {
|
|
return ['success' => false, 'message' => __('请设置付费内容的价格', 'aksrt')];
|
|
}
|
|
if ($min > 0 && $price < $min) {
|
|
return ['success' => false, 'message' => sprintf(__('价格不能低于:%s', 'aksrt'), (string) $min)];
|
|
}
|
|
if ($max > 0 && $price > $max) {
|
|
return ['success' => false, 'message' => sprintf(__('价格不能高于:%s', 'aksrt'), (string) $max)];
|
|
}
|
|
|
|
if ($vip_manual) {
|
|
$vip1 = isset($raw['vip1_price']) ? (float) $raw['vip1_price'] : (float) ($raw['vip_1_price'] ?? 0);
|
|
$vip2 = isset($raw['vip2_price']) ? (float) $raw['vip2_price'] : (float) ($raw['vip_2_price'] ?? 0);
|
|
$vip1 = round($vip1, 2);
|
|
$vip2 = round($vip2, 2);
|
|
if ($vip1 > $price) {
|
|
return ['success' => false, 'message' => __('会员价不能高于普通价', 'aksrt')];
|
|
}
|
|
if ($vip2 > $vip1) {
|
|
return ['success' => false, 'message' => __('更高等级会员价不能高于较低等级会员价', 'aksrt')];
|
|
}
|
|
} else {
|
|
$vip1 = round($price * $vip1_disc / 100, 2);
|
|
$vip2 = round($price * $vip2_disc / 100, 2);
|
|
}
|
|
$vip1 = max(0, min($price, $vip1));
|
|
$vip2 = max(0, min($vip1, $vip2));
|
|
|
|
$meta['price'] = $price;
|
|
$meta['points_price'] = 0;
|
|
$meta['vip1_price'] = $vip1;
|
|
$meta['vip2_price'] = $vip2;
|
|
$meta['vip1_points'] = 0;
|
|
$meta['vip2_points'] = 0;
|
|
}
|
|
|
|
$pay_limit = (int) ($raw['pay_limit'] ?? $data['pay_limit'] ?? 0);
|
|
$meta['pay_limit'] = in_array($pay_limit, [0, 1, 2], true) ? $pay_limit : 0;
|
|
$meta['require_login'] = !empty($raw['require_login']) || !empty($data['require_login']);
|
|
$meta['coupon_s'] = !empty($raw['coupon_s']) || !empty($data['coupon_s']);
|
|
if (isset($raw['coupon_desc']) || isset($data['coupon_desc'])) {
|
|
$meta['coupon_desc'] = sanitize_textarea_field((string) ($raw['coupon_desc'] ?? $data['coupon_desc'] ?? ''));
|
|
}
|
|
|
|
$this->write_pay_meta($post_id, $meta);
|
|
return ['success' => true];
|
|
}
|
|
|
|
/**
|
|
* @param mixed $raw
|
|
* @return array<int, array<string, string>>
|
|
*/
|
|
private function normalize_front_downloads($raw): array {
|
|
if (!is_array($raw)) {
|
|
return [];
|
|
}
|
|
$out = [];
|
|
foreach ($raw as $row) {
|
|
if (!is_array($row)) {
|
|
continue;
|
|
}
|
|
// Accept zibll-ish keys + AKSRT keys.
|
|
$url = (string) ($row['url'] ?? $row['link'] ?? '');
|
|
$url = esc_url_raw(trim($url));
|
|
if ($url === '') {
|
|
continue;
|
|
}
|
|
$out[] = [
|
|
'label' => sanitize_text_field((string) ($row['label'] ?? $row['name'] ?? '')),
|
|
'url' => $url,
|
|
'type' => 'external',
|
|
'extract_code' => sanitize_text_field((string) ($row['extract_code'] ?? $row['copy_val'] ?? $row['more'] ?? '')),
|
|
];
|
|
}
|
|
return DomainModel::sanitize_downloads($out);
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $meta
|
|
*/
|
|
private function write_pay_meta(int $post_id, array $meta): void {
|
|
$meta = DomainModel::sanitize_pay_meta($meta);
|
|
update_post_meta($post_id, DomainModel::PAY_META_KEY, $meta);
|
|
update_post_meta($post_id, DomainModel::PAY_TYPE_KEY, (string) ($meta['pay_type'] ?? DomainModel::PAY_TYPE_NO));
|
|
update_post_meta($post_id, DomainModel::PAY_PRICE_KEY, (float) ($meta['price'] ?? 0));
|
|
update_post_meta(
|
|
$post_id,
|
|
DomainModel::RESOURCE_MARKER_KEY,
|
|
DomainModel::is_resource_pay_type((string) ($meta['pay_type'] ?? 'no')) ? 1 : 0
|
|
);
|
|
}
|
|
}
|