386 lines
14 KiB
PHP
386 lines
14 KiB
PHP
<?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;
|
||
}
|