feat: 收口 1:1 剩余欠账(论坛壳/圈子/501/私信默认/资源死码)

- 论坛 board/topic/plate/tag/plate-cat 接入 content-wrap/content-layout 主站流壳
- 公共主页 plate 圈子 tab 接关注/管理版块真实数据并计数
- forum-topic 渲染封面/付费扩展位 meta(§7.3)
- 后台删除消息/背景图/评论图 REST 从 501 补齐为真实实现
- 私信 private_s 缺省 true(完整 1:1,不再兼容默认关)
- 清理 aksrt_get_resource_meta 不可达旧实现;挂载 AKSRT_AI 配置门控实例
- 登录 modal 启用 colorful-header;订单页粉边 focus 软化;侧栏次级入口视觉弱化

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-12 13:06:47 +08:00
co-authored by Claude Fable 5
parent 0941c7d23f
commit fb68b3f8c6
16 changed files with 313 additions and 82 deletions
@@ -577,7 +577,26 @@ class AKSRT_Admin_User_Controller extends AKSRT_Admin_Controller_Base {
}
public function rest_delete_notification_item(WP_REST_Request $request): WP_REST_Response {
return $this->success(['message' => __('当前版本暂未提供后台删除单条消息能力', 'aksrt')]);
$user_id = get_current_user_id();
if ($user_id <= 0) {
return $this->error(__('请先登录', 'aksrt'), 401);
}
$params = $this->get_json_params($request);
$id = sanitize_text_field((string) ($params['id'] ?? $request->get_param('id') ?? ''));
if ($id === '') {
return $this->error(__('参数错误', 'aksrt'), 400);
}
if (function_exists('aksrt_delete_user_notification')) {
aksrt_delete_user_notification($user_id, $id);
} elseif (class_exists('AKSRT_Message')) {
AKSRT_Message::get_instance()->mark_read($user_id, $id);
}
return $this->success([
'message' => __('消息已删除', 'aksrt'),
'unread' => function_exists('aksrt_get_user_unread_notification_count')
? aksrt_get_user_unread_notification_count($user_id)
: 0,
]);
}
public function rest_run_notification_cleanup(WP_REST_Request $request): WP_REST_Response {
@@ -638,11 +657,65 @@ class AKSRT_Admin_User_Controller extends AKSRT_Admin_Controller_Base {
}
public function rest_upload_user_background(WP_REST_Request $request): WP_REST_Response {
return $this->error(__('当前版本暂未提供后台 REST 背景图上传,请使用标准媒体上传流程。', 'aksrt'), 501);
$user_id = get_current_user_id();
if ($user_id <= 0) {
return $this->error(__('请先登录', 'aksrt'), 401);
}
if (empty($_FILES['background']) && empty($_FILES['file'])) {
return $this->error(__('请选择要上传的图片', 'aksrt'), 400);
}
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/media.php';
require_once ABSPATH . 'wp-admin/includes/image.php';
$file_key = !empty($_FILES['background']) ? 'background' : 'file';
$attachment_id = media_handle_upload($file_key, 0);
if (is_wp_error($attachment_id)) {
return $this->error($attachment_id->get_error_message(), 400);
}
$url = wp_get_attachment_url((int) $attachment_id);
if (!$url) {
return $this->error(__('上传失败', 'aksrt'), 500);
}
update_user_meta($user_id, 'aksrt_background_image', esc_url_raw($url));
update_user_meta($user_id, 'aksrt_background_attachment_id', (int) $attachment_id);
return $this->success([
'message' => __('背景图已更新', 'aksrt'),
'data' => [
'url' => $url,
'attachment_id' => (int) $attachment_id,
],
]);
}
public function rest_upload_comment_image(WP_REST_Request $request): WP_REST_Response {
return $this->error(__('当前版本暂未提供后台 REST 评论图片上传,请使用标准媒体上传流程。', 'aksrt'), 501);
$user_id = get_current_user_id();
if ($user_id <= 0) {
return $this->error(__('请先登录', 'aksrt'), 401);
}
if (empty($_FILES['image']) && empty($_FILES['file'])) {
return $this->error(__('请选择要上传的图片', 'aksrt'), 400);
}
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/media.php';
require_once ABSPATH . 'wp-admin/includes/image.php';
$file_key = !empty($_FILES['image']) ? 'image' : 'file';
$attachment_id = media_handle_upload($file_key, 0);
if (is_wp_error($attachment_id)) {
return $this->error($attachment_id->get_error_message(), 400);
}
$url = wp_get_attachment_url((int) $attachment_id);
if (!$url) {
return $this->error(__('上传失败', 'aksrt'), 500);
}
return $this->success([
'message' => __('图片上传成功', 'aksrt'),
'data' => [
'url' => $url,
'attachment_id' => (int) $attachment_id,
],
]);
}
public function rest_get_credits_me(WP_REST_Request $request): WP_REST_Response {