post_type !== 'post') { return; } wp_enqueue_media(); $css = AKSRT_DIR . '/assets/css/admin/pay-meta-box.css'; $js = AKSRT_DIR . '/assets/js/admin-pay-meta-box.js'; if (is_file($css)) { wp_enqueue_style('aksrt-pay-meta-box', AKSRT_URI . '/assets/css/admin/pay-meta-box.css', [], (string) filemtime($css)); } if (is_file($js)) { wp_enqueue_script('aksrt-pay-meta-box', AKSRT_URI . '/assets/js/admin-pay-meta-box.js', [], (string) filemtime($js), true); } } public function render(\WP_Post $post): void { wp_nonce_field('aksrt_pay_meta_save', 'aksrt_pay_meta_nonce'); $meta = function_exists('aksrt_get_pay_meta') ? aksrt_get_pay_meta($post) : DomainModel::default_pay_meta(); $gallery_ids = []; foreach ((array) ($meta['gallery'] ?? []) as $url) { $id = attachment_url_to_postid((string) $url); if ($id > 0) { $gallery_ids[] = $id; } } ?>
radio('pay_type', __('付费模式', 'aksrt'), (string) ($meta['pay_type'] ?? 'no'), aksrt_get_pay_types()); ?>
radio('pay_limit', __('购买权限', 'aksrt'), (string) ($meta['pay_limit'] ?? 0), [ '0' => __('所有人可购买', 'aksrt'), '1' => __('VIP1 及以上会员可购买', 'aksrt'), '2' => __('仅 VIP2 可购买', 'aksrt'), ], __('设置会员专享资源时,请同时配置对应的会员价格。', 'aksrt')); $this->radio('pay_modo', __('支付类型', 'aksrt'), (string) ($meta['pay_modo'] ?? '0'), [ '0' => __('普通商品(金钱购买)', 'aksrt'), 'points' => __('积分商品(积分购买,依赖于用户积分功能)', 'aksrt'), ]); ?>

number('points_price', __('积分售价', 'aksrt'), (string) ($meta['points_price'] ?? 0), '1', __('积分', 'aksrt')); ?> number('vip1_points', __('VIP1 积分售价', 'aksrt'), (string) ($meta['vip1_points'] ?? 0), '1', __('积分', 'aksrt'), __('填 0 则为 VIP1 免费', 'aksrt')); ?> number('vip2_points', __('VIP2 积分售价', 'aksrt'), (string) ($meta['vip2_points'] ?? 0), '1', __('积分', 'aksrt'), __('会员价格不能高于售价,填 0 则为 VIP2 免费。', 'aksrt')); ?>
number('price', __('执行价', 'aksrt'), (string) ($meta['price'] ?? '0.00'), '0.01', '', __('填 0 则为免费', 'aksrt')); ?> number('original_price', __('原价', 'aksrt'), (string) ($meta['original_price'] ?? '0.00'), '0.01', '', __('显示在执行价格前面,并划掉。', 'aksrt')); ?> textarea('promotion_tag', __('促销标签', 'aksrt'), (string) ($meta['promotion_tag'] ?? ''), 1); ?> number('vip1_price', __('VIP1 价格', 'aksrt'), (string) ($meta['vip1_price'] ?? '0.00'), '0.01', '', __('填 0 则为 VIP1 免费', 'aksrt')); ?> number('vip2_price', __('VIP2 价格', 'aksrt'), (string) ($meta['vip2_price'] ?? '0.00'), '0.01', '', __('会员价格不能高于执行价,填 0 则为 VIP2 免费。', 'aksrt')); ?>
number('pay_count', __('销量浮动', 'aksrt'), (string) ($meta['pay_count'] ?? 0), '1', '', __('为真实销量增加或减少的数量。', 'aksrt'), false); ?>
number('gallery_show', __('免费查看', 'aksrt'), (string) ($meta['gallery_show'] ?? 1), '1', __('张', 'aksrt'), __('不能大于付费图片数量,否则无效。', 'aksrt')); ?>
upload('video_url', __('视频资源', 'aksrt'), (string) ($meta['video_url'] ?? ''), 'video', __('输入视频地址或选择、上传本地视频。', 'aksrt')); ?> upload('video_pic', __('视频封面(可选)', 'aksrt'), (string) ($meta['video_pic'] ?? ''), 'image'); ?> text('video_title', __('本集标题', 'aksrt'), (string) ($meta['video_title'] ?? ''), __('如需添加剧集则需填写此处', 'aksrt'), __('第1集', 'aksrt')); ?> group('video_episode', __('更多剧集', 'aksrt'), (array) ($meta['video_episode'] ?? []), 'video_row', __('添加剧集', 'aksrt'), __('为付费视频添加更多剧集。', 'aksrt')); ?> number('video_scale_height', __('固定长宽比例', 'aksrt'), (string) ($meta['video_scale_height'] ?? 0), '5', '%', __('为 0 则不固定长宽比例。', 'aksrt')); ?>
group('downloads', __('资源下载', 'aksrt'), (array) ($meta['downloads'] ?? []), 'download_row', __('添加资源', 'aksrt')); ?> group('attributes', __('资源属性', 'aksrt'), (array) ($meta['attributes'] ?? []), 'attribute_row', __('添加属性', 'aksrt')); ?> text('demo_url', __('演示地址', 'aksrt'), (string) ($meta['demo_url'] ?? ''), '', 'https://', 'url'); ?>
text('pay_title', __('商品标题', 'aksrt'), (string) ($meta['pay_title'] ?? ''), __('可选,如需单独显示付费内容标题请填写。', 'aksrt')); ?> textarea('pay_doc', __('商品简介', 'aksrt'), (string) ($meta['pay_doc'] ?? ''), 1, __('可选,如需单独显示付费内容介绍请填写。', 'aksrt')); ?> textarea('pay_details', __('更多详情', 'aksrt'), (string) ($meta['pay_details'] ?? ''), 3, __('显示在付费内容卡片下方,支持安全 HTML。', 'aksrt')); ?> textarea('pay_extra_hide', __('额外隐藏内容', 'aksrt'), (string) ($meta['pay_extra_hide'] ?? ''), 3, __('付费后显示的额外隐藏内容,支持安全 HTML。', 'aksrt')); ?>
[hidecontent type="payshow"] [/hidecontent]
$options */ private function radio(string $id, string $title, string $value, array $options, string $description = ''): void { ?>
$label) : ?>

step="" name="aksrt_pay[]" value="">

> $rows */ private function group(string $id, string $title, array $rows, string $renderer, string $button, string $description = ''): void { ?>

$row) { $this->{$renderer}((int) $index, (array) $row); } ?>
post_type !== 'post' || (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) || wp_is_post_revision($post_id) || !current_user_can('edit_post', $post_id)) { return; } if (empty($_POST['aksrt_pay_meta_nonce']) || !wp_verify_nonce(sanitize_text_field(wp_unslash((string) $_POST['aksrt_pay_meta_nonce'])), 'aksrt_pay_meta_save')) { return; } $raw = isset($_POST['aksrt_pay']) && is_array($_POST['aksrt_pay']) ? wp_unslash($_POST['aksrt_pay']) : []; $gallery = []; $ids = array_values(array_filter(array_map('absint', preg_split('/[\s,]+/', (string) ($raw['gallery_ids'] ?? '')) ?: []))); foreach (array_slice($ids, 0, 100) as $attachment_id) { $url = wp_get_attachment_image_url($attachment_id, 'full'); if ($url) { $gallery[] = $url; } } $meta = DomainModel::sanitize_pay_meta([ 'pay_type' => $raw['pay_type'] ?? 'no', 'pay_limit' => $raw['pay_limit'] ?? 0, 'pay_modo' => $raw['pay_modo'] ?? '0', 'order_expired_s' => !empty($raw['order_expired_s']), 'order_expired_time' => $raw['order_expired_time'] ?? 0, 'order_expired_unit' => $raw['order_expired_unit'] ?? 'day', 'price' => (string) ($raw['price'] ?? '0'), 'points_price' => $raw['points_price'] ?? 0, 'original_price' => (string) ($raw['original_price'] ?? '0'), 'promotion_tag' => (string) ($raw['promotion_tag'] ?? ''), 'vip1_price' => (string) ($raw['vip1_price'] ?? '0'), 'vip2_price' => (string) ($raw['vip2_price'] ?? '0'), 'vip1_points' => $raw['vip1_points'] ?? 0, 'vip2_points' => $raw['vip2_points'] ?? 0, 'pay_count' => $raw['pay_count'] ?? 0, 'gallery' => $gallery, 'gallery_show' => $raw['gallery_show'] ?? 1, 'video_url' => (string) ($raw['video_url'] ?? ''), 'video_pic' => (string) ($raw['video_pic'] ?? ''), 'video_title' => (string) ($raw['video_title'] ?? ''), 'video_episode' => $raw['video_episode'] ?? [], 'video_scale_height' => $raw['video_scale_height'] ?? 0, 'downloads' => $raw['downloads'] ?? [], 'attributes' => $raw['attributes'] ?? [], 'demo_url' => (string) ($raw['demo_url'] ?? ''), 'pay_title' => (string) ($raw['pay_title'] ?? ''), 'pay_doc' => (string) ($raw['pay_doc'] ?? ''), 'pay_details' => (string) ($raw['pay_details'] ?? ''), 'pay_extra_hide' => (string) ($raw['pay_extra_hide'] ?? ''), ]); update_post_meta($post_id, DomainModel::PAY_META_KEY, $meta); update_post_meta($post_id, DomainModel::PAY_TYPE_KEY, (string) $meta['pay_type']); update_post_meta($post_id, DomainModel::PAY_PRICE_KEY, $meta['pay_modo'] === 'points' ? (int) $meta['points_price'] : (string) $meta['price']); update_post_meta($post_id, '_aksrt_pay_modo', (string) $meta['pay_modo']); update_post_meta($post_id, '_aksrt_pay_limit', (int) $meta['pay_limit']); update_post_meta($post_id, DomainModel::RESOURCE_MARKER_KEY, DomainModel::is_resource_pay_type((string) $meta['pay_type']) ? 1 : 0); } }