feat(navigation): hard-switch to Zibll navigation and Font Awesome 5

This commit is contained in:
2026-08-18 20:46:21 +08:00
parent 3c3ddac8be
commit a0b84977a2
630 changed files with 101647 additions and 11293 deletions
+8 -30
View File
@@ -22,7 +22,7 @@ class PageDisplayController extends ControllerBase {
}
public function register_routes(): void {
// Banners (generic CRUD — hero, banner kinds)
// Homepage content-stream banners.
register_rest_route(self::API_NAMESPACE, '/banners', [
'methods' => 'GET',
'callback' => [$this, 'rest_get_banners'],
@@ -40,42 +40,23 @@ class PageDisplayController extends ControllerBase {
]);
}
private function normalize_banner_kind($kind): string {
return in_array($kind, ['hero', 'banner'], true) ? $kind : 'hero';
}
private function get_banner_kind_query(string $kind): array {
if ('banner' === $kind) {
return [
[
'key' => '_aksrt_kind',
'value' => 'banner',
],
];
}
private function get_banner_kind_query(): array {
return [
'relation' => 'OR',
[
'key' => '_aksrt_kind',
'value' => 'hero',
],
[
'key' => '_aksrt_kind',
'compare' => 'NOT EXISTS',
'value' => 'banner',
],
];
}
public function rest_get_banners(\WP_REST_Request $request): \WP_REST_Response {
$kind = $this->normalize_banner_kind($request->get_param('kind') ?: 'hero');
$args = [
'post_type' => 'aksrt_banner',
'posts_per_page' => 100,
'post_status' => 'any',
'orderby' => 'menu_order',
'order' => 'ASC',
'meta_query' => $this->get_banner_kind_query($kind),
'meta_query' => $this->get_banner_kind_query(),
];
$posts = get_posts($args);
$banners = array_map(function ($post) {
@@ -95,7 +76,6 @@ class PageDisplayController extends ControllerBase {
'enabled' => get_post_meta($post->ID, '_enabled', true) !== '0',
'show_text' => get_post_meta($post->ID, '_show_text', true) !== '0',
'show_meta' => get_post_meta($post->ID, '_show_meta', true) === '1',
'kind' => get_post_meta($post->ID, '_aksrt_kind', true) ?: 'hero',
'sort_order' => $post->menu_order,
'text_size_pc' => get_post_meta($post->ID, '_text_size_pc', true) ?: '',
'text_size_m' => get_post_meta($post->ID, '_text_size_m', true) ?: '',
@@ -108,11 +88,10 @@ class PageDisplayController extends ControllerBase {
public function rest_create_banner(\WP_REST_Request $request): \WP_REST_Response {
$params = $this->get_json_params($request);
$kind = $this->normalize_banner_kind($params['kind'] ?? 'hero');
$title = sanitize_text_field($params['title'] ?? '');
$post_id = wp_insert_post([
// Title is optional in admin UI; keep a non-empty WP title for list readability.
'post_title' => '' !== $title ? $title : ('banner' === $kind ? 'Banner Slide' : 'Hero Slide'),
'post_title' => '' !== $title ? $title : 'Banner Slide',
'post_type' => 'aksrt_banner',
'post_status' => 'publish',
'menu_order' => (int) ($params['sort_order'] ?? 0),
@@ -133,7 +112,7 @@ class PageDisplayController extends ControllerBase {
update_post_meta($post_id, '_enabled', !array_key_exists('enabled', $params) || !empty($params['enabled']) ? '1' : '0');
update_post_meta($post_id, '_show_text', !array_key_exists('show_text', $params) || !empty($params['show_text']) ? '1' : '0');
update_post_meta($post_id, '_show_meta', !empty($params['show_meta']) ? '1' : '0');
update_post_meta($post_id, '_aksrt_kind', $kind);
update_post_meta($post_id, '_aksrt_kind', 'banner');
update_post_meta($post_id, '_text_size_pc', sanitize_text_field($params['text_size_pc'] ?? ''));
update_post_meta($post_id, '_text_size_m', sanitize_text_field($params['text_size_m'] ?? ''));
update_post_meta($post_id, '_text_parallax', !empty($params['text_parallax']) ? '1' : '0');
@@ -146,7 +125,7 @@ class PageDisplayController extends ControllerBase {
public function rest_handle_banner_item(\WP_REST_Request $request): \WP_REST_Response {
$id = absint($request['id']);
if (!$id || get_post_type($id) !== 'aksrt_banner') {
if (!$id || get_post_type($id) !== 'aksrt_banner' || 'banner' !== get_post_meta($id, '_aksrt_kind', true)) {
return new \WP_REST_Response(['code' => 'not_found', 'message' => __('幻灯片不存在', 'aksrt')], 404);
}
@@ -156,7 +135,6 @@ class PageDisplayController extends ControllerBase {
}
$params = $this->get_json_params($request);
$kind = $this->normalize_banner_kind($params['kind'] ?? get_post_meta($id, '_aksrt_kind', true) ?: 'hero');
// Optional title: empty is allowed (UI shows “未命名”); do not 422.
$title = sanitize_text_field($params['title'] ?? '');
@@ -165,7 +143,7 @@ class PageDisplayController extends ControllerBase {
'post_title' => $title,
]);
update_post_meta($id, '_aksrt_kind', $kind);
update_post_meta($id, '_aksrt_kind', 'banner');
update_post_meta($id, '_subtitle', sanitize_text_field($params['subtitle'] ?? ''));
update_post_meta($id, '_description', sanitize_textarea_field($params['description'] ?? ''));
update_post_meta($id, '_image_url', esc_url_raw($params['image_url'] ?? ''));