diff --git a/src/Admin/Native/PostListEnhance.php b/src/Admin/Native/PostListEnhance.php index ca27ec36..9f3fc707 100644 --- a/src/Admin/Native/PostListEnhance.php +++ b/src/Admin/Native/PostListEnhance.php @@ -38,7 +38,6 @@ class PostListEnhance { public function init(): void { add_filter('manage_post_posts_columns', [$this, 'register_columns']); add_action('manage_post_posts_custom_column', [$this, 'render_column'], 10, 2); - add_filter('manage_edit-post_sortable_columns', [$this, 'register_sortable_columns']); add_action('restrict_manage_posts', [$this, 'render_type_filter']); add_action('pre_get_posts', [$this, 'apply_query_args'], 99); @@ -108,19 +107,6 @@ class PostListEnhance { return $new_columns; } - /** - * @param array $columns - * @return array - */ - public function register_sortable_columns($columns) { - if (!is_array($columns)) { - return $columns; - } - $columns[self::COLUMN_STATS] = 'views'; - $columns[self::COLUMN_SALES] = 'sales_volume'; - return $columns; - } - /** * @param string $column * @param int $post_id @@ -305,7 +291,9 @@ class PostListEnhance { return; } - echo wp_kses_post($this->edit_boxes_html()); + // 表单控件(select/input/fieldset)不在 wp_kses_post 的文章白名单里, + // 会被剥成纯文本,因此这里直接输出;字段值均已 esc_attr/esc_html 转义。 + echo $this->edit_boxes_html(); } private function edit_boxes_html(): string { diff --git a/tests/widget-system/admin-stats-column-contract.test.cjs b/tests/widget-system/admin-stats-column-contract.test.cjs index 36c6388a..6c4b4c90 100644 --- a/tests/widget-system/admin-stats-column-contract.test.cjs +++ b/tests/widget-system/admin-stats-column-contract.test.cjs @@ -24,9 +24,12 @@ test('admin post list has the sales data column with a sortable header', () => { assert.match(list, /'aksrt_sales'/) assert.match(list, /orderby.*sales_volume/) - // 排序列必须在表头注册,并把 sales_volume 映射回真实存储键。 - assert.match(list, /manage_edit-post_sortable_columns/) - assert.match(list, /sales_volume/) + // 排序靠表头 label 里的链接 + pre_get_posts 落地,不注册 sortable_columns: + // 注册后 WordPress 会套自己的排序指示器与 ,与 label 里的 嵌套, + // 箭头会被解析到文字前面。 + assert.doesNotMatch(list, /manage_edit-post_sortable_columns/) + assert.match(list, /pre_get_posts/) + assert.match(list, /'sales_volume'/) assert.match(list, /RESOURCE_SALES_VOLUME_KEY/) }) diff --git a/tests/widget-system/post-list-quick-edit-contract.test.cjs b/tests/widget-system/post-list-quick-edit-contract.test.cjs index ac9fcd98..d2fd2545 100644 --- a/tests/widget-system/post-list-quick-edit-contract.test.cjs +++ b/tests/widget-system/post-list-quick-edit-contract.test.cjs @@ -44,6 +44,18 @@ test('quick-edit inputs are namespaced under aksrt_bulk_edit', () => { assert.match(list, /\[operation\]/) assert.match(list, /\[val\]/) }) + +test('quick-edit markup is emitted without kses stripping the controls', () => { + // select/option/input/fieldset/legend 不在 wp_kses_post 的文章白名单里, + // 一旦用它包上面板,所有控件会被剥成纯文本(表现为「新增的操作都不可用」)。 + // 字段值均已在生成时 esc_attr/esc_html 转义,这里必须原样输出。 + assert.doesNotMatch(list, /wp_kses_post\(\$this->edit_boxes_html\(\)\)/) + // 面板必须真的产生表单控件,而不是纯文本。 + assert.match(list, /