feat(topics): restore topic taxonomy workflow

This commit is contained in:
kate522 committed 2026-11-10 22:31:11 +08:00
1 parent f3dd1ec3b1
commit a254cbd3e9
59 files changed
+771 -192

No files matched your search

+48
View File
@@ -0,0 +1,48 @@
<?php
define('ABSPATH', __DIR__);
class WP_Term {
public function __construct(
public int $term_id,
public int $parent,
public string $name
) {}
}
function absint($value): int { return abs((int) $value); }
function esc_attr($value): string { return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); }
function esc_html($value): string { return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); }
function get_terms(array $args): array {
if ($args['taxonomy'] !== 'topics') return [];
return [new WP_Term(1, 0, 'Parent'), new WP_Term(2, 1, 'Child'), new WP_Term(3, 1, 'Sibling'), new WP_Term(4, 0, 'Other')];
}
function get_term_children(int $id, string $taxonomy): array {
return $taxonomy === 'topics' && $id === 1 ? [2, 3] : [];
}
function term_exists(int $id, string $taxonomy): bool {
return $taxonomy === 'topics' && in_array($id, [1, 2, 3, 4], true);
}
require dirname(__DIR__, 2) . '/src/Core/SubmitTopics.php';
require dirname(__DIR__, 2) . '/templates/parts/submit/term-checks.php';
$root = ['allow_topics' => true, 'allowed_topic_ids' => [1]];
$child = ['allow_topics' => true, 'allowed_topic_ids' => [2]];
$disabled = ['allow_topics' => false, 'allowed_topic_ids' => []];
$tree = static fn(array $settings): array => array_map(
static fn(array $node): array => ['id' => $node['term']->term_id, 'depth' => $node['depth']],
\Jio\Core\SubmitTopics::tree($settings)
);
ob_start();
jio_submit_render_term_checks([new WP_Term(2, 1, 'Child')], [], 'topics');
$orphan_html = ob_get_clean();
echo json_encode([
'root_tree' => $tree($root),
'child_tree' => $tree($child),
'disabled_tree' => $tree($disabled),
'filtered' => \Jio\Core\SubmitTopics::filter_ids([2, 4, 999, 2], $child),
'disabled_filtered' => \Jio\Core\SubmitTopics::filter_ids([2], $disabled),
'orphan_html' => $orphan_html,
], JSON_THROW_ON_ERROR);
+22
View File
@@ -0,0 +1,22 @@
const assert = require('node:assert/strict');
const { execFileSync } = require('node:child_process');
const path = require('node:path');
const test = require('node:test');
const result = JSON.parse(execFileSync('php', [path.join(__dirname, 'topics-harness.php')], { encoding: 'utf8' }));
test('topic whitelist includes descendants and preserves a selected child without its parent', () => {
assert.deepEqual(result.root_tree, [
{ id: 1, depth: 0 },
{ id: 2, depth: 1 },
{ id: 3, depth: 1 },
]);
assert.deepEqual(result.child_tree, [{ id: 2, depth: 0 }]);
assert.match(result.orphan_html, /name="topics\[\]" value="2"/);
});
test('topic submissions accept only existing terms within the configured whitelist', () => {
assert.deepEqual(result.filtered, [2]);
assert.deepEqual(result.disabled_tree, []);
assert.deepEqual(result.disabled_filtered, []);
});