*/ public static function get_meta(int $post_id): array { $saved = get_post_meta($post_id, self::META_KEY, true); $defaults = DomainModel::default_post_meta(); $meta = array_merge($defaults, is_array($saved) ? array_intersect_key($saved, $defaults) : []); $meta['views'] = max(0, (int) get_post_meta($post_id, DomainModel::POST_VIEW_COUNT_KEY, true)); $meta['like'] = max(0, (int) get_post_meta($post_id, '_aksrt_like_count', true)); $meta['featured_video_episode'] = self::sanitize_video_episodes($meta['featured_video_episode'] ?? []); return $meta; } public static function get_meta_value(int $post_id, string $key, $default = '') { $meta = self::get_meta($post_id); return array_key_exists($key, $meta) ? $meta[$key] : $default; } /** * @param mixed $raw Raw episode rows. * @return array */ public static function sanitize_video_episodes($raw): array { if (!is_array($raw)) { return []; } $episodes = []; foreach ($raw as $row) { if (!is_array($row)) { continue; } $url = esc_url_raw((string) ($row['url'] ?? '')); if ($url === '') { continue; } $episodes[] = [ 'title' => sanitize_text_field((string) ($row['title'] ?? '')), 'url' => $url, ]; } return array_slice($episodes, 0, 50); } public function register_meta_boxes(): void { add_meta_box('post_main', __('文章扩展', 'aksrt'), [$this, 'render_meta_box'], 'post', 'side', 'high'); $settings = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_post_filter_settings() : []; if (!empty($settings['custom_filter'])) { add_meta_box( 'aksrt_custom_filter_meta', __('高级自定义筛选', 'aksrt'), [$this, 'render_custom_filter_meta_box'], 'post', 'side', 'default' ); } } public function enqueue_assets(string $hook): void { if (!in_array($hook, ['post.php', 'post-new.php'], true)) { return; } $screen = function_exists('get_current_screen') ? get_current_screen() : null; if (!$screen || $screen->post_type !== 'post') { return; } wp_enqueue_media(); $css = AKSRT_DIR . '/assets/css/admin/post-extension.css'; $js = AKSRT_DIR . '/assets/js/admin-post-extension.js'; if (is_file($css)) { wp_enqueue_style('aksrt-post-extension', AKSRT_URI . '/assets/css/admin/post-extension.css', [], (string) filemtime($css)); } if (is_file($js)) { wp_enqueue_script('aksrt-post-extension', AKSRT_URI . '/assets/js/admin-post-extension.js', ['jquery'], (string) filemtime($js), true); } } public function render_meta_box(\WP_Post $post): void { $meta = self::get_meta($post->ID); $settings = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_all() : []; $show_image = !array_key_exists('post_article_image_cover', $settings) || !empty($settings['post_article_image_cover']); $show_slide = !array_key_exists('list_thumb_slides_s', $settings) || !empty($settings['list_thumb_slides_s']) || !empty($settings['post_article_slide_cover']); $show_video = !array_key_exists('list_thumb_video_s', $settings) || !empty($settings['list_thumb_video_s']) || !empty($settings['post_article_video_cover']); wp_nonce_field('aksrt_post_extension_save', 'aksrt_post_extension_nonce'); ?>
render_upload_field( 'thumbnail_url', __('外链特色图像', 'aksrt'), (string) $meta['thumbnail_url'], 'image', __('支持直接输入链接用作特色图像', 'aksrt') . '
' . __('此处设置仅在未设置 WordPress 特色图片时有效', 'aksrt') . '' ); if ($show_image) { $this->render_upload_field('cover_image', __('封面图', 'aksrt'), (string) $meta['cover_image'], 'image', __('在文章页顶部显示封面图', 'aksrt')); } ?>

特色图像及封面图)', 'aksrt'); ?>

render_upload_field('featured_video', __('特色视频', 'aksrt'), (string) $meta['featured_video'], 'video', __('为该文章显示视频封面(优先级 > 幻灯片封面)', 'aksrt'), __('选择视频或填写视频地址', 'aksrt')); ?>

$episode) : ?> render_episode_row((int) $index, (array) $episode); ?>
render_text_field('subtitle', __('副标题', 'aksrt'), (string) $meta['subtitle']); ?> render_number_field('views', __('阅读量', 'aksrt'), (int) $meta['views']); ?> render_number_field('like', __('点赞数', 'aksrt'), (int) $meta['like']); ?>
__('跟随主题', 'aksrt'), 'no_sidebar' => __('无侧边栏', 'aksrt'), 'sidebar_left' => __('侧边栏靠左', 'aksrt'), 'sidebar_right' => __('侧边栏靠右', 'aksrt'), ]; foreach ($layouts as $value => $label) : ?>

ID, '_aksrt_cf_' . $key, true); echo '
' . esc_html($name) . ''; foreach ($vals as $value) { $value_key = sanitize_key((string) ($value['key'] ?? '')); $value_name = sanitize_text_field((string) ($value['name'] ?? $value_key)); if ($value_key === '') { continue; } printf('', esc_attr($key), esc_attr($value_key), checked(in_array($value_key, array_map('strval', $current), true), true, false), esc_html($value_name)); } echo '
'; } } public function save_meta_box(int $post_id, \WP_Post $post): void { if ($post->post_type !== 'post' || (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) || wp_is_post_revision($post_id) || !current_user_can('edit_post', $post_id)) { return; } if (isset($_POST['aksrt_post_extension_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash((string) $_POST['aksrt_post_extension_nonce'])), 'aksrt_post_extension_save')) { $raw = isset($_POST['aksrt_post_extension']) && is_array($_POST['aksrt_post_extension']) ? wp_unslash($_POST['aksrt_post_extension']) : []; $layout = sanitize_key((string) ($raw['show_layout'] ?? 'false')); if (!in_array($layout, ['false', 'no_sidebar', 'sidebar_left', 'sidebar_right'], true)) { $layout = 'false'; } $slide_ids = array_values(array_filter(array_map('absint', preg_split('/[\s,]+/', (string) ($raw['featured_slide'] ?? '')) ?: []))); $meta = [ 'thumbnail_url' => esc_url_raw((string) ($raw['thumbnail_url'] ?? '')), 'cover_image' => esc_url_raw((string) ($raw['cover_image'] ?? '')), 'featured_slide' => implode(',', array_slice($slide_ids, 0, 50)), 'featured_video' => esc_url_raw((string) ($raw['featured_video'] ?? '')), 'featured_video_title' => sanitize_text_field((string) ($raw['featured_video_title'] ?? '')), 'featured_video_episode' => self::sanitize_video_episodes($raw['featured_video_episode'] ?? []), 'subtitle' => sanitize_text_field((string) ($raw['subtitle'] ?? '')), 'show_layout' => $layout, 'no_article-navs' => !empty($raw['no_article-navs']), 'article_maxheight_xz' => !empty($raw['article_maxheight_xz']), ]; update_post_meta($post_id, self::META_KEY, $meta); update_post_meta($post_id, DomainModel::POST_VIEW_COUNT_KEY, max(0, (int) ($raw['views'] ?? 0))); update_post_meta($post_id, '_aksrt_like_count', max(0, (int) ($raw['like'] ?? 0))); } if (isset($_POST['aksrt_custom_filter_nonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash((string) $_POST['aksrt_custom_filter_nonce'])), 'aksrt_custom_filter_save')) { $settings = \AKSRT\Settings\Settings::get_post_filter_settings(); $dimensions = is_array($settings['custom_filter'] ?? null) ? $settings['custom_filter'] : []; $submitted = isset($_POST['aksrt_custom_filter']) && is_array($_POST['aksrt_custom_filter']) ? wp_unslash($_POST['aksrt_custom_filter']) : []; foreach ($dimensions as $dimension) { $key = sanitize_key((string) ($dimension['key'] ?? '')); if ($key === '') { continue; } $allowed = array_values(array_filter(array_map(static fn($value): string => sanitize_key((string) ($value['key'] ?? '')), (array) ($dimension['vals'] ?? [])))); $values = array_values(array_intersect($allowed, array_map('sanitize_key', (array) ($submitted[$key] ?? [])))); if ($values) { update_post_meta($post_id, '_aksrt_cf_' . $key, $values); } else { delete_post_meta($post_id, '_aksrt_cf_' . $key); } } } } }