- 删除 AksrtFrontend registry/rehydrate 双路架构及 build/public.js 拼包入口,
前台唯一初始路径为 PHP 本地栈(jQuery 1.9.1 → Bootstrap 3.4.1)
→ loader_js(_win/aksrtData 唯一注入)→ tbquire(['main']) → runtime/main.min.js
- window.auto_fun = debounce(z_auto_fun, 100) 为唯一重扫入口;所有模块改为
执行一次 + off/on('auto_fun.aksrt-*') 命名空间重扫,data/class 标记幂等
- 局部更新协议统一:HTML 注入 → post_ajax.ed → auto_fun();
远程 modal → loaded.bs.modal → auto_fun();JSON 成功 → zib_ajax.success
- 灯箱恢复 Miniimgbox/imgbox 唯一 owner(imgbox-container、a[data-imgbox]、
imgbox_data),删除 AksrtLightbox/data-aksrt-lightbox 第二实现及 CSS/overlay,
_win.imgbox* 重新接上 post-display 设置
- 死代码清理:runtime 下 11 组被自有实现替代的旧模块副本、无消费 vendored 库、
顶层 grade.min.js、revenue.js、无调用方的 aksrt_get_win_runtime_config(),
以及 loader 中 16 条死 mapping
- PHP 入队改为本地栈 + loader_js,routed/widget/submit 依赖统一换绑;
用户卡片发布按钮恢复 nav_user_newposts_btn 设置门控
- 测试对齐:新增 frontend-lifecycle-contract,重写 navigation/lazyload/toast/
auth-source/comment/page-display/post-visual 等断言为目标架构契约
验证:node --test widget-system+navigation 223 通过 0 失败;
构建脚本重建 main/imgbox min 与 CSS bundles;改动 PHP php -l、JS node --check
全部通过;git diff --check 干净;credits 重入 harness 通过。
248 lines
9.8 KiB
PHP
248 lines
9.8 KiB
PHP
<?php
|
|
/**
|
|
* Template Name: AKSRT - 写文章/投稿
|
|
* Template Post Type: page
|
|
*
|
|
* Front-end article submission page matching the reference newposts layout.
|
|
* 注意:page-newposts.php 是「最新文章」列表,不是投稿。
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
$ctx = include get_template_directory() . '/templates/parts/submit/context.php';
|
|
if (!is_array($ctx)) {
|
|
$ctx = [];
|
|
}
|
|
|
|
// Feature disabled → soft 404.
|
|
if (empty($ctx['enabled'])) {
|
|
global $wp_query;
|
|
$wp_query->set_404();
|
|
status_header(404);
|
|
nocache_headers();
|
|
include get_query_template('404');
|
|
return;
|
|
}
|
|
|
|
// Guest without guest mode → login.
|
|
if (!empty($ctx['is_guest']) && empty($ctx['settings']['guest_enabled'])) {
|
|
$login = function_exists('aksrt_get_login_url') ? aksrt_get_login_url(get_permalink()) : wp_login_url(get_permalink());
|
|
wp_safe_redirect($login);
|
|
exit;
|
|
}
|
|
|
|
// Invalid edit id → strip.
|
|
if (!empty($_GET['edit']) && empty($ctx['edit_post'])) {
|
|
wp_safe_redirect(remove_query_arg('edit'));
|
|
exit;
|
|
}
|
|
|
|
// wp_editor() is rendered after get_header(); queue its runtime before wp_head.
|
|
wp_enqueue_editor();
|
|
|
|
// Assets.
|
|
$css = get_template_directory() . '/assets/css/frontend/pages/submit.css';
|
|
if (file_exists($css)) {
|
|
wp_enqueue_style(
|
|
'aksrt-submit',
|
|
get_template_directory_uri() . '/assets/css/frontend/pages/submit.css',
|
|
['aksrt-public'],
|
|
(string) filemtime($css)
|
|
);
|
|
}
|
|
$js = get_template_directory() . '/assets/js/front-submit.js';
|
|
if (file_exists($js)) {
|
|
$pay_download_js = get_template_directory() . '/assets/js/front-submit-pay-download.js';
|
|
wp_enqueue_script(
|
|
'aksrt-front-submit-pay-download',
|
|
get_template_directory_uri() . '/assets/js/front-submit-pay-download.js',
|
|
[],
|
|
(string) filemtime($pay_download_js),
|
|
true
|
|
);
|
|
wp_enqueue_script(
|
|
'aksrt-front-submit',
|
|
get_template_directory_uri() . '/assets/js/front-submit.js',
|
|
['loader_js', 'aksrt-front-submit-pay-download'],
|
|
(string) filemtime($js),
|
|
true
|
|
);
|
|
$mini = get_template_directory() . '/assets/js/mini-upload.js';
|
|
if (file_exists($mini)) {
|
|
wp_enqueue_script(
|
|
'aksrt-mini-upload',
|
|
get_template_directory_uri() . '/assets/js/mini-upload.js',
|
|
[],
|
|
(string) filemtime($mini),
|
|
true
|
|
);
|
|
}
|
|
$submit_image_max_size = \AKSRT\Core\FrontSubmit::upload_limit_bytes('image');
|
|
$submit_video_max_size = \AKSRT\Core\FrontSubmit::upload_limit_bytes('video');
|
|
$resource_max_size = \AKSRT\Core\FrontSubmit::upload_limit_bytes('resource');
|
|
|
|
wp_localize_script('aksrt-front-submit', 'aksrtSubmitData', [
|
|
'ajaxUrl' => admin_url('admin-ajax.php'),
|
|
'nonce' => wp_create_nonce('aksrt_submit'),
|
|
'restUrl' => esc_url_raw(rest_url('aksrt/v1')),
|
|
'restNonce' => wp_create_nonce('wp_rest'),
|
|
'leaveWarning' => !empty($ctx['settings']['leave_warning']),
|
|
'ai' => [
|
|
'available' => !empty($ctx['ai_available']),
|
|
'summary' => !empty($ctx['ai_available']),
|
|
'tags' => !empty($ctx['ai_available']),
|
|
],
|
|
'editor' => [
|
|
'canUploadImage' => !empty($ctx['can_upload_img']),
|
|
'canUploadVideo' => !empty($ctx['can_upload_video']),
|
|
'canEmbedVideo' => !empty($ctx['can_iframe']),
|
|
'canUploadFile' => !empty($ctx['can_upload_file']),
|
|
'canHide' => !empty($ctx['can_hide']),
|
|
'canPay' => !empty($ctx['can_pay']),
|
|
],
|
|
'uploads' => [
|
|
'image' => !empty($ctx['can_upload_img']) ? [
|
|
'url' => esc_url_raw(rest_url('aksrt/v1/front-submit/upload/image')),
|
|
'maxSize' => $submit_image_max_size,
|
|
] : null,
|
|
'video' => !empty($ctx['can_upload_video']) ? [
|
|
'url' => esc_url_raw(rest_url('aksrt/v1/front-submit/upload/video')),
|
|
'maxSize' => $submit_video_max_size,
|
|
] : null,
|
|
'resource' => !empty($ctx['can_upload_file']) ? [
|
|
'url' => esc_url_raw(rest_url('aksrt/v1/front-submit/upload/resource')),
|
|
'maxSize' => $resource_max_size,
|
|
] : null,
|
|
],
|
|
'i18n' => [
|
|
'confirmLeave' => __('你有未保存的更改,确定要离开吗?', 'aksrt'),
|
|
'saving' => __('保存中...', 'aksrt'),
|
|
'saved' => __('草稿已保存', 'aksrt'),
|
|
'submitting' => __('提交中...', 'aksrt'),
|
|
'submitted' => __('投稿已提交', 'aksrt'),
|
|
'error' => __('操作失败,请重试', 'aksrt'),
|
|
'confirmDelete' => __('确定要删除这个草稿吗?', 'aksrt'),
|
|
'aiGenerating' => __('生成中…', 'aksrt'),
|
|
'aiFailed' => __('AI 生成失败', 'aksrt'),
|
|
'needContent' => __('请先填写正文内容', 'aksrt'),
|
|
'aiFilled' => __('已填入,可继续编辑', 'aksrt'),
|
|
'deleting' => __('正在删除草稿…', 'aksrt'),
|
|
'deleted' => __('草稿已删除', 'aksrt'),
|
|
'uploading' => __('正在上传…', 'aksrt'),
|
|
'uploaded' => __('上传成功', 'aksrt'),
|
|
'fileTooLarge' => __('文件大小超过限制', 'aksrt'),
|
|
'lastSaved' => __('最后保存:', 'aksrt'),
|
|
'preview' => __('预览文章', 'aksrt'),
|
|
'pickImage' => __('选择图片', 'aksrt'),
|
|
'pickVideo' => __('选择视频封面图', 'aksrt'),
|
|
'videoUrl' => __('请输入视频地址', 'aksrt'),
|
|
'close' => __('关闭', 'aksrt'),
|
|
'insertImage' => __('插入图片', 'aksrt'),
|
|
'uploadImage' => __('上传图片', 'aksrt'),
|
|
'externalImage' => __('外链图片', 'aksrt'),
|
|
'insertVideo' => __('插入视频', 'aksrt'),
|
|
'uploadVideo' => __('上传视频', 'aksrt'),
|
|
'externalVideo' => __('外链视频', 'aksrt'),
|
|
'embedVideo' => __('嵌入视频', 'aksrt'),
|
|
'selectVideo' => __('选择或拖入视频', 'aksrt'),
|
|
'videoUploadHint' => __('上传完成后自动插入正文', 'aksrt'),
|
|
'externalVideoHint' => __('请填写视频文件地址:', 'aksrt'),
|
|
'embedVideoHint' => __('请输入嵌入地址或者直接粘贴 iframe 嵌入代码:', 'aksrt'),
|
|
'confirmEmbed' => __('确认嵌入', 'aksrt'),
|
|
'insertFile' => __('上传附件', 'aksrt'),
|
|
'uploadFile' => __('上传附件', 'aksrt'),
|
|
'externalFile' => __('输入地址', 'aksrt'),
|
|
'selectFile' => __('选择或拖入附件', 'aksrt'),
|
|
'fileUploadHint' => __('上传完成后自动插入正文', 'aksrt'),
|
|
'externalFileHint' => __('请填写附件地址:', 'aksrt'),
|
|
'selectImages' => __('选择或拖入图片', 'aksrt'),
|
|
'imageUploadHint' => __('可批量选择,上传完成后自动插入正文', 'aksrt'),
|
|
'selectedFiles' => __('已选择 %d 个文件', 'aksrt'),
|
|
'confirmUpload' => __('确认上传', 'aksrt'),
|
|
'externalImageHint' => __('每行填写一个图片地址:', 'aksrt'),
|
|
'confirmInsert' => __('确认插入', 'aksrt'),
|
|
'invalidMediaUrl' => __('请填写有效地址', 'aksrt'),
|
|
'invalidVideoUrl' => __('请填写有效的视频嵌入地址', 'aksrt'),
|
|
'invalidFile' => __('请选择有效文件', 'aksrt'),
|
|
'uploadUnavailable' => __('当前账号不能上传此类文件', 'aksrt'),
|
|
'download' => __('下载', 'aksrt'),
|
|
'quote' => __('引言', 'aksrt'),
|
|
'quoteGray' => __('灰色引言', 'aksrt'),
|
|
'quoteRed' => __('红色引言', 'aksrt'),
|
|
'quoteBlue' => __('蓝色引言', 'aksrt'),
|
|
'quoteGreen' => __('绿色引言', 'aksrt'),
|
|
'edit' => __('编辑', 'aksrt'),
|
|
'insert' => __('插入', 'aksrt'),
|
|
'highlightCode' => __('高亮代码', 'aksrt'),
|
|
'selectLanguage' => __('选择语言', 'aksrt'),
|
|
'codeGeneric' => __('通用高亮', 'aksrt'),
|
|
'codeTheme' => __('主题', 'aksrt'),
|
|
'codeFollowGlobal' => __('跟随全局设置', 'aksrt'),
|
|
'codeLabel' => __('代码:', 'aksrt'),
|
|
'hiddenContent' => __('隐藏内容', 'aksrt'),
|
|
'hiddenPlaceholder' => __('隐藏内容', 'aksrt'),
|
|
'replyVisible' => __('回复可见', 'aksrt'),
|
|
'loginVisible' => __('登录可见', 'aksrt'),
|
|
'vipVisible' => __('VIP 可见', 'aksrt'),
|
|
'payVisible' => __('付费可见', 'aksrt'),
|
|
'addResource' => __('添加资源', 'aksrt'),
|
|
'editResource' => __('编辑资源', 'aksrt'),
|
|
'downloadUrl' => __('下载地址', 'aksrt'),
|
|
'enterDownloadUrl' => __('请输入资源下载地址', 'aksrt'),
|
|
'pasteLinkHint' => __('支持直接粘贴网盘分享链接,并自动识别提取码', 'aksrt'),
|
|
'resourceNote' => __('资源备注', 'aksrt'),
|
|
'enterResourceNote' => __('请输入资源备注', 'aksrt'),
|
|
'resourceNoteHint' => __('例如提取码、解压密码等', 'aksrt'),
|
|
'clickCopy' => __('点击复制', 'aksrt'),
|
|
'copyName' => __('复制名称', 'aksrt'),
|
|
'copyContent' => __('复制内容', 'aksrt'),
|
|
'copyHint' => __('填写后,用户可点击资源备注复制内容', 'aksrt'),
|
|
'customButton' => __('自定义按钮', 'aksrt'),
|
|
'customButtonPlaceholder' => __('自定义下载按钮名称', 'aksrt'),
|
|
'selectButtonStyle' => __('选择按钮样式', 'aksrt'),
|
|
'extractCode' => __('提取码', 'aksrt'),
|
|
'extractCodeColon' => __('提取码:', 'aksrt'),
|
|
'confirm' => __('确认', 'aksrt'),
|
|
],
|
|
]);
|
|
}
|
|
|
|
get_header();
|
|
?>
|
|
<main id="main-content" role="main" class="container" tabindex="-1">
|
|
<form id="aksrt-submit-form" data-aksrt-submit-form data-dirty="false">
|
|
<div class="content-wrap newposts-wrap">
|
|
<div class="content-layout">
|
|
<?php
|
|
$main = get_template_directory() . '/templates/parts/submit/editor-main.php';
|
|
if (file_exists($main)) {
|
|
include $main;
|
|
}
|
|
?>
|
|
</div>
|
|
</div>
|
|
<div class="sidebar show-sidebar">
|
|
<?php \AKSRT\WidgetSystem\WidgetAreas::render('newposts_sidebar_top'); ?>
|
|
<?php
|
|
$terms = get_template_directory() . '/templates/parts/submit/sidebar-terms.php';
|
|
if (file_exists($terms)) {
|
|
include $terms;
|
|
}
|
|
$pay = get_template_directory() . '/templates/parts/submit/sidebar-pay.php';
|
|
if (file_exists($pay)) {
|
|
include $pay;
|
|
}
|
|
$actions = get_template_directory() . '/templates/parts/submit/sidebar-submit.php';
|
|
if (file_exists($actions)) {
|
|
include $actions;
|
|
}
|
|
?>
|
|
<?php \AKSRT\WidgetSystem\WidgetAreas::render('newposts_sidebar_bottom'); ?>
|
|
</div>
|
|
</form>
|
|
</main>
|
|
<?php
|
|
get_footer();
|