feat: release news and store experience updates

This commit is contained in:
Codex
2026-07-26 11:09:11 +08:00
parent 2b37713791
commit c63bef311c
100 changed files with 2519 additions and 105 deletions
+385
View File
@@ -0,0 +1,385 @@
<?php
/**
* Optional one-click importer for the bundled KDX service products.
*
* @package Fragrance_Trade
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/** Return every post status that may contain an existing optional seed. */
function fragrance_trade_seed_post_statuses() {
return array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' );
}
/** Return the product service records available to the optional importer. */
function fragrance_trade_product_service_seeds() {
return array(
'kdx-dunjia' => array(
'title' => __( 'KDX 盾甲隐形车衣', 'fragrance-trade' ),
'slug' => 'kdx-dunjia-paint-protection-film',
'image' => 'kdx-dunjia.jpg',
'cover' => 'covers/kdx-dunjia-cover.jpg',
'excerpt' => __( '7.5mil 厚度 · 7 年质保 · 光泽度 150', 'fragrance-trade' ),
'summary' => __( '盾甲是一款兼顾车漆保护、亮面效果与日常养护的隐形车衣产品,适合关注基础防护与光泽表现的用车场景。', 'fragrance-trade' ),
'specs' => array(
__( '产品厚度', 'fragrance-trade' ) => '7.5mil',
__( '质保年限', 'fragrance-trade' ) => __( '7 年', 'fragrance-trade' ),
__( '光泽度', 'fragrance-trade' ) => '150',
__( '拉伸强度', 'fragrance-trade' ) => '18MPa',
__( '断裂伸长率', 'fragrance-trade' ) => '380%',
__( '耐有机溶剂性', 'fragrance-trade' ) => __( '通过', 'fragrance-trade' ),
__( '水接触角', 'fragrance-trade' ) => '102°',
__( '耐粘污性', 'fragrance-trade' ) => __( '良好', 'fragrance-trade' ),
__( '热修复', 'fragrance-trade' ) => __( '60 秒', 'fragrance-trade' ),
),
),
'kdx-kaijia-plus' => array(
'title' => __( 'KDX 铠甲 Plus 隐形车衣', 'fragrance-trade' ),
'slug' => 'kdx-kaijia-plus-paint-protection-film',
'image' => 'kdx-kaijia-plus.jpg',
'cover' => 'covers/kdx-kaijia-plus-cover.jpg',
'excerpt' => __( '8.5mil 厚度 · 8 年质保 · 断裂伸长率 460%', 'fragrance-trade' ),
'summary' => __( '铠甲 Plus 采用更高的标称厚度和断裂伸长率,适合希望进一步提升车漆覆盖防护与膜面韧性的用车需求。', 'fragrance-trade' ),
'specs' => array(
__( '产品厚度', 'fragrance-trade' ) => '8.5mil',
__( '质保年限', 'fragrance-trade' ) => __( '8 年', 'fragrance-trade' ),
__( '光泽度', 'fragrance-trade' ) => '150',
__( '拉伸强度', 'fragrance-trade' ) => '23MPa',
__( '断裂伸长率', 'fragrance-trade' ) => '460%',
__( '耐有机溶剂性', 'fragrance-trade' ) => __( '通过', 'fragrance-trade' ),
__( '水接触角', 'fragrance-trade' ) => '73°',
__( '耐粘污性', 'fragrance-trade' ) => __( '良好', 'fragrance-trade' ),
__( '热修复', 'fragrance-trade' ) => __( '60 秒', 'fragrance-trade' ),
),
),
'kdx-kaijia' => array(
'title' => __( 'KDX 铠甲隐形车衣', 'fragrance-trade' ),
'slug' => 'kdx-kaijia-paint-protection-film',
'image' => 'kdx-kaijia.jpg',
'cover' => 'covers/kdx-kaijia-cover.jpg',
'excerpt' => __( '7.5mil 厚度 · 7 年质保 · 拉伸强度 25MPa', 'fragrance-trade' ),
'summary' => __( '铠甲隐形车衣侧重膜面韧性、亮面效果与基础耐粘污表现,并提供雾度、可见光透射比和剥离力等补充参数。', 'fragrance-trade' ),
'specs' => array(
__( '产品厚度', 'fragrance-trade' ) => '7.5mil',
__( '质保年限', 'fragrance-trade' ) => __( '7 年', 'fragrance-trade' ),
__( '光泽度', 'fragrance-trade' ) => '150',
__( '拉伸强度', 'fragrance-trade' ) => '25MPa',
__( '断裂伸长率', 'fragrance-trade' ) => '430%',
__( '耐有机溶剂性', 'fragrance-trade' ) => __( '通过', 'fragrance-trade' ),
__( '水接触角', 'fragrance-trade' ) => '73°',
__( '耐粘污性', 'fragrance-trade' ) => __( '三星', 'fragrance-trade' ),
__( '热修复', 'fragrance-trade' ) => __( '60 秒', 'fragrance-trade' ),
__( '雾度', 'fragrance-trade' ) => '0.3%',
__( '可见光透射比', 'fragrance-trade' ) => '90%',
__( '180°剥离力(30 分钟)', 'fragrance-trade' ) => '1400gf/inch',
__( '180°剥离力(2 小时)', 'fragrance-trade' ) => '1800gf/inch',
__( '涂层断裂伸长率', 'fragrance-trade' ) => '160%',
),
),
'kdx-dunjia-plus' => array(
'title' => __( 'KDX 盾甲 Plus 隐形车衣', 'fragrance-trade' ),
'slug' => 'kdx-dunjia-plus-paint-protection-film',
'image' => 'kdx-dunjia-plus.jpg',
'cover' => 'covers/kdx-dunjia-plus-cover.jpg',
'excerpt' => __( '8.5mil 厚度 · 8 年质保 · 水接触角 102°', 'fragrance-trade' ),
'summary' => __( '盾甲 Plus 在盾甲产品方向上提升标称厚度与质保年限,兼顾膜面亮度、水接触角和日常车漆保护需求。', 'fragrance-trade' ),
'specs' => array(
__( '产品厚度', 'fragrance-trade' ) => '8.5mil',
__( '质保年限', 'fragrance-trade' ) => __( '8 年', 'fragrance-trade' ),
__( '光泽度', 'fragrance-trade' ) => '150',
__( '拉伸强度', 'fragrance-trade' ) => '21MPa',
__( '断裂伸长率', 'fragrance-trade' ) => '400%',
__( '耐有机溶剂性', 'fragrance-trade' ) => __( '通过', 'fragrance-trade' ),
__( '水接触角', 'fragrance-trade' ) => '102°',
__( '耐粘污性', 'fragrance-trade' ) => __( '良好', 'fragrance-trade' ),
__( '热修复', 'fragrance-trade' ) => __( '60 秒', 'fragrance-trade' ),
),
),
'kdx-jinjia-pro' => array(
'title' => __( 'KDX 金甲 PRO 隐形车衣', 'fragrance-trade' ),
'slug' => 'kdx-jinjia-pro-paint-protection-film',
'image' => 'kdx-jinjia-pro.jpg',
'cover' => 'covers/kdx-jinjia-pro-cover.jpg',
'excerpt' => __( '7.5mil 厚度 · 8 年质保 · 光泽度 153', 'fragrance-trade' ),
'summary' => __( '金甲 PRO 侧重高光泽、耐粘污表现与较长质保周期,适合关注亮面质感和日常清洁便利性的车漆保护方案。', 'fragrance-trade' ),
'specs' => array(
__( '产品厚度', 'fragrance-trade' ) => '7.5mil',
__( '质保年限', 'fragrance-trade' ) => __( '8 年', 'fragrance-trade' ),
__( '光泽度', 'fragrance-trade' ) => '153',
__( '拉伸强度', 'fragrance-trade' ) => '18MPa',
__( '断裂伸长率', 'fragrance-trade' ) => '350%',
__( '耐有机溶剂性', 'fragrance-trade' ) => __( '通过', 'fragrance-trade' ),
__( '水接触角', 'fragrance-trade' ) => '95°',
__( '耐粘污性', 'fragrance-trade' ) => __( '优秀', 'fragrance-trade' ),
__( '热修复', 'fragrance-trade' ) => __( '90 秒', 'fragrance-trade' ),
),
),
);
}
/** Find a product service previously created by this importer. */
function fragrance_trade_find_product_service_seed( $seed_key ) {
$ids = get_posts(
array(
'post_type' => 'service',
'post_status' => fragrance_trade_seed_post_statuses(),
'posts_per_page' => 1,
'fields' => 'ids',
'meta_key' => '_fragrance_product_seed_key',
'meta_value' => $seed_key,
'no_found_rows' => true,
)
);
return $ids ? (int) $ids[0] : 0;
}
/** Find a service with the conventional product slug. */
function fragrance_trade_find_product_service_slug( $slug ) {
$posts = get_posts(
array(
'post_type' => 'service',
'post_status' => fragrance_trade_seed_post_statuses(),
'name' => $slug,
'posts_per_page' => 1,
'no_found_rows' => true,
)
);
return $posts ? (int) $posts[0]->ID : 0;
}
/** Find a bundled product image already copied into the media library. */
function fragrance_trade_find_product_service_attachment( $seed_key ) {
$ids = get_posts(
array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'posts_per_page' => 1,
'fields' => 'ids',
'meta_key' => '_fragrance_product_seed_image',
'meta_value' => $seed_key,
'no_found_rows' => true,
)
);
return $ids ? (int) $ids[0] : 0;
}
/**
* Copy one bundled service image into the WordPress media library.
*
* @param int $service_id Parent service post ID.
* @param string $seed_key Stable service seed key.
* @param array $seed Service seed record.
* @return int|WP_Error
*/
function fragrance_trade_import_product_service_image( $service_id, $seed_key, $seed ) {
$existing = fragrance_trade_find_product_service_attachment( $seed_key );
if ( $existing ) {
if ( (int) wp_get_post_parent_id( $existing ) !== (int) $service_id ) {
wp_update_post(
array(
'ID' => $existing,
'post_parent' => $service_id,
)
);
}
return $existing;
}
$source_file = get_template_directory() . '/assets/images/services/' . $seed['image'];
if ( ! is_readable( $source_file ) ) {
return new WP_Error(
'fragrance_product_seed_image_missing',
sprintf(
/* translators: %s: service title. */
__( '服务“%s”的初始化图片不存在。', 'fragrance-trade' ),
$seed['title']
)
);
}
$image_bytes = file_get_contents( $source_file );
if ( false === $image_bytes ) {
return new WP_Error(
'fragrance_product_seed_image_unreadable',
sprintf(
/* translators: %s: service title. */
__( '无法读取服务“%s”的初始化图片。', 'fragrance-trade' ),
$seed['title']
)
);
}
$upload = wp_upload_bits( $seed['image'], null, $image_bytes );
unset( $image_bytes );
if ( ! empty( $upload['error'] ) ) {
return new WP_Error( 'fragrance_product_seed_upload_failed', $upload['error'] );
}
$attachment_id = wp_insert_attachment(
array(
'post_mime_type' => 'image/jpeg',
'post_title' => sprintf(
/* translators: %s: service title. */
__( '%s产品参数图', 'fragrance-trade' ),
$seed['title']
),
'post_status' => 'inherit',
),
$upload['file'],
$service_id,
true
);
if ( is_wp_error( $attachment_id ) ) {
wp_delete_file( $upload['file'] );
return $attachment_id;
}
require_once ABSPATH . 'wp-admin/includes/image.php';
$metadata = wp_generate_attachment_metadata( $attachment_id, $upload['file'] );
if ( $metadata ) {
wp_update_attachment_metadata( $attachment_id, $metadata );
}
update_post_meta( $attachment_id, '_fragrance_product_seed_image', $seed_key );
update_post_meta(
$attachment_id,
'_wp_attachment_image_alt',
sprintf(
/* translators: %s: service title. */
__( '%s产品参数与车型示意图', 'fragrance-trade' ),
$seed['title']
)
);
return (int) $attachment_id;
}
/** Build block-editor content for a product service. */
function fragrance_trade_build_product_service_content( $seed ) {
$items = '';
foreach ( $seed['specs'] as $label => $value ) {
$items .= sprintf(
'<li><strong>%1$s</strong>%2$s</li>',
esc_html( $label ),
esc_html( $value )
);
}
return sprintf(
'<!-- wp:paragraph --><p>%1$s</p><!-- /wp:paragraph -->' .
'<!-- wp:heading --><h2 class="wp-block-heading">%2$s</h2><!-- /wp:heading -->' .
'<!-- wp:list --><ul class="wp-block-list">%3$s</ul><!-- /wp:list -->' .
'<!-- wp:paragraph --><p><em>%4$s</em></p><!-- /wp:paragraph -->',
esc_html( $seed['summary'] ),
esc_html__( '产品参数', 'fragrance-trade' ),
$items,
esc_html__( '以上参数根据所提供的产品资料整理。实际产品版本、施工范围、价格、质保条件与交付标准请以门店最终确认及正式质保文件为准。', 'fragrance-trade' )
);
}
/**
* Import every bundled product service without overwriting existing content.
*
* @return array{created:int,existing:int,errors:string[]}
*/
function fragrance_trade_import_product_service_seeds() {
$result = array(
'created' => 0,
'existing' => 0,
'errors' => array(),
);
foreach ( fragrance_trade_product_service_seeds() as $seed_key => $seed ) {
$service_id = fragrance_trade_find_product_service_seed( $seed_key );
if ( $service_id && 'publish' === get_post_status( $service_id ) ) {
update_post_meta( $service_id, '_fragrance_service_cover_file', $seed['cover'] );
++$result['existing'];
continue;
}
if (
$service_id
&& (
'draft' !== get_post_status( $service_id )
|| 'importing' !== get_post_meta( $service_id, '_fragrance_product_seed_state', true )
)
) {
update_post_meta( $service_id, '_fragrance_service_cover_file', $seed['cover'] );
++$result['existing'];
continue;
}
if ( ! $service_id ) {
if ( fragrance_trade_find_product_service_slug( $seed['slug'] ) ) {
++$result['existing'];
continue;
}
$service_id = wp_insert_post(
array(
'post_type' => 'service',
'post_name' => $seed['slug'],
'post_title' => $seed['title'],
'post_excerpt' => $seed['excerpt'],
'post_status' => 'draft',
),
true
);
if ( is_wp_error( $service_id ) ) {
$result['errors'][] = sprintf(
/* translators: 1: service title, 2: error message. */
__( '无法创建服务“%1$s”:%2$s', 'fragrance-trade' ),
$seed['title'],
$service_id->get_error_message()
);
continue;
}
update_post_meta( $service_id, '_fragrance_product_seed_key', $seed_key );
update_post_meta( $service_id, '_fragrance_product_seed_state', 'importing' );
update_post_meta( $service_id, '_fragrance_service_cover_file', $seed['cover'] );
}
$attachment_id = fragrance_trade_import_product_service_image( $service_id, $seed_key, $seed );
if ( is_wp_error( $attachment_id ) ) {
$result['errors'][] = $attachment_id->get_error_message();
continue;
}
set_post_thumbnail( $service_id, $attachment_id );
$updated = wp_update_post(
array(
'ID' => $service_id,
'post_title' => $seed['title'],
'post_name' => $seed['slug'],
'post_excerpt' => $seed['excerpt'],
'post_content' => fragrance_trade_build_product_service_content( $seed ),
'post_status' => 'publish',
),
true
);
if ( is_wp_error( $updated ) ) {
$result['errors'][] = sprintf(
/* translators: 1: service title, 2: error message. */
__( '无法发布服务“%1$s”:%2$s', 'fragrance-trade' ),
$seed['title'],
$updated->get_error_message()
);
continue;
}
delete_post_meta( $service_id, '_fragrance_product_seed_state' );
update_post_meta( $service_id, '_fragrance_service_cover_file', $seed['cover'] );
++$result['created'];
}
$result['errors'] = array_values( array_unique( $result['errors'] ) );
return $result;
}