Files
wordpress-theme-aksrt/templates/parts/submit/editor-main.php
T
kate522andClaude Opus 5 5afa7ab9df fix(submit): show body placeholder on first load and restore caret on blank clicks
两个前台投稿编辑器的缺陷,根因都在占位符的实现方式:

1. 首次加载不显示占位符,输入一个再删掉才出现。
   旧实现往正文插了一个 data-mce-bogus 占位段落,而 TinyMCE 在
   setContent(studio 初始化时必调)与清理 bogus 元素时会把它移除。

2. 光标在块级结构里时,点击正文空白处无法落回正文。
   占位段落占着首行、且 pointer-events:none,点击落不到可编辑元素上;
   正文以表格 / 代码块这类结构块结尾时也没有可承载光标的段落。

改为 front-submit-editor-basics.js(替换 front-submit-placeholder.js):
- 占位符改成 body 属性 + content CSS 的 ::before,正文 DOM 不含占位节点;
- 点击空白处(事件目标是 body)且光标不在普通文本里时,补一个可编辑尾段
  并把光标放进去;
- 两份 content CSS 让 html/body 撑满编辑区,studio 的 syncEditorHeight
  以编辑器声明高度为下限,空正文时 iframe 不会缩成一行。

新增 tests/widget-system/submit-placeholder-behavior.test.cjs(jsdom 跑真实插件)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-11-09 20:38:02 +08:00

148 lines
6.1 KiB
PHP

<?php
/**
* Main column: cover + title + editor + status.
*
* @var array $ctx
* @package Jio
*/
defined('ABSPATH') || exit;
$settings = $ctx['settings'];
$edit_post = $ctx['edit_post'];
$is_can_new = !empty($ctx['is_can_new']);
?>
<div class="jio-widget-box full-widget-sm editor-main-box" style="min-height:60vh;">
<?php
$featured_path = get_template_directory() . '/templates/parts/submit/featured.php';
if (file_exists($featured_path)) {
include $featured_path;
}
?>
<div class="relative newposts-title">
<textarea
name="post_title"
id="submit-title"
class="line-form-input input-lg new-title"
tabindex="1"
rows="1"
maxlength="<?php echo esc_attr((string) ((int) ($settings['title_max'] ?? 30) * 4)); ?>"
placeholder="<?php echo esc_attr((string) ($settings['title_placeholder'] ?? __('请输入标题', 'jio'))); ?>"
data-auto-height
data-max-height="<?php echo wp_is_mobile() ? '110' : '78'; ?>"
><?php echo esc_textarea((string) $ctx['current_title']); ?></textarea>
<i class="line-form-line"></i>
</div>
<?php if (!$is_can_new) : ?>
<div class="flex jc newposts-nocan" style="min-height:50vh;">
<div class="text-center"><div><i class="fa fas fa-lock"></i></div>
<p><?php esc_html_e('无法发布', 'jio'); ?></p>
<p class="muted-color"><?php esc_html_e('你当前没有前台投稿权限,请联系管理员开通。', 'jio'); ?></p></div>
</div>
<?php else : ?>
<div class="newposts-editor">
<?php
$toolbar1 = ['formatselect', 'bold', 'italic', 'bullist', 'numlist', 'alignleft', 'aligncenter', 'alignright', 'link'];
if (!empty($ctx['can_upload_img'])) {
$toolbar1[] = 'jio_image';
}
$toolbar1[] = 'jio_video';
if (!empty($ctx['can_upload_file'])) {
$toolbar1[] = 'jio_file';
}
if (!empty($ctx['can_hide'])) {
$toolbar1[] = 'jio_hide';
}
$toolbar1 = implode(',', array_merge($toolbar1, ['jio_quote', 'jio_precode', 'fullscreen', 'wp_adv']));
// jio_editor_basics 通过 external_plugins 注册:WordPress 会丢弃
// 名字已出现在 plugins 列表里的外部插件,写在这里反而加载不到。
$plugins = 'paste,link,lists,fullscreen,wordpress,wplink,charmap,colorpicker,textcolor';
$editor_plugin_path = get_template_directory() . '/assets/js/front-submit-editor.js';
$editor_plugin_url = get_template_directory_uri() . '/assets/js/front-submit-editor.js';
if (file_exists($editor_plugin_path)) {
$editor_plugin_url = add_query_arg('ver', (string) filemtime($editor_plugin_path), $editor_plugin_url);
}
$editor_basics_plugin_path = get_template_directory() . '/assets/js/front-submit-editor-basics.js';
$editor_basics_plugin_url = get_template_directory_uri() . '/assets/js/front-submit-editor-basics.js';
if (file_exists($editor_basics_plugin_path)) {
$editor_basics_plugin_url = add_query_arg('ver', (string) filemtime($editor_basics_plugin_path), $editor_basics_plugin_url);
}
$editor_css_path = get_template_directory() . '/assets/css/frontend/pages/submit-editor.css';
$editor_css_url = get_template_directory_uri() . '/assets/css/frontend/pages/submit-editor.css';
if (file_exists($editor_css_path)) {
$editor_css_url = add_query_arg('ver', (string) filemtime($editor_css_path), $editor_css_url);
}
$external_plugins = static function (array $external, string $editor_id) use ($editor_plugin_url, $editor_basics_plugin_url): array {
if ($editor_id === 'post_content') {
$external['jio_editor_tools'] = $editor_plugin_url;
$external['jio_editor_basics'] = $editor_basics_plugin_url;
}
return $external;
};
$editor_content_css = static function (string $styles) use ($editor_css_url): string {
return $styles . ($styles !== '' ? ',' : '') . $editor_css_url;
};
add_filter('mce_external_plugins', $external_plugins, 10, 2);
add_filter('mce_css', $editor_content_css);
$editor_settings = [
'textarea_name' => 'post_content',
'textarea_rows' => 20,
'editor_height' => wp_is_mobile() ? 460 : 470,
'media_buttons' => false,
'default_editor' => 'tinymce',
'quicktags' => false,
'teeny' => false,
'tinymce' => [
'toolbar1' => $toolbar1,
'toolbar2' => 'fontsizeselect,forecolor,removeformat,undo,redo,wp_help',
'plugins' => $plugins,
'placeholder' => (string) ($settings['content_placeholder'] ?? ''),
],
];
wp_editor((string) $ctx['current_content'], 'post_content', $editor_settings);
remove_filter('mce_external_plugins', $external_plugins, 10);
remove_filter('mce_css', $editor_content_css, 10);
?>
</div>
<?php endif; ?>
<div class="flex ac jsb mt10">
<span class="view-btn jio-submit-view-btn">
<?php if ($edit_post) : ?>
<a class="but c-blue" target="_blank" href="<?php echo esc_url(get_permalink($edit_post)); ?>">
<i class="fa fas fa-file-alt"></i> <?php esc_html_e('预览文章', 'jio'); ?>
</a>
<?php if (current_user_can('manage_options')) : ?>
<a class="but c-yellow" href="<?php echo esc_url(get_edit_post_link($edit_post)); ?>">
<?php esc_html_e('后台编辑', 'jio'); ?>
</a>
<?php endif; ?>
<?php elseif (!empty($ctx['draft_count']) && $ctx['user_id'] > 0) : ?>
<?php
$draft_url = function_exists('jio_get_user_center_url')
? add_query_arg('post_status', 'draft', jio_get_user_center_url('posts'))
: '';
?>
<?php if ($draft_url !== '') : ?>
<a class="but" target="_blank" href="<?php echo esc_url($draft_url); ?>">
<?php
printf(
/* translators: %d: draft count */
esc_html__('您已有 %d 篇草稿 点击查看', 'jio'),
(int) $ctx['draft_count']
);
?>
<i class="fa fas fa-angle-right"></i>
</a>
<?php endif; ?>
<?php endif; ?>
</span>
<span class="modified-time jio-submit-modified-time">
<?php if (!empty($ctx['post_modified'])) : ?>
<span class="badg"><?php echo esc_html(sprintf(__('最后保存:%s', 'jio'), $ctx['post_modified'])); ?></span>
<?php endif; ?>
</span>
</div>
</div>