feat: release B2B Trade theme 2.1.0

This commit is contained in:
WorkBuddy
2026-07-24 22:25:29 +08:00
parent 13a35c7ec7
commit 4f070d4677
64 changed files with 1769 additions and 1762 deletions
+314 -36
View File
@@ -74,82 +74,360 @@ function fragrance_trade_filter_cases_archive( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Public archive filtering is read-only.
if ( $query->is_post_type_archive( 'case' ) && ! empty( $_GET['case_type'] ) ) {
$query->set( 'case_type', sanitize_text_field( wp_unslash( $_GET['case_type'] ) ) );
}
}
add_action( 'pre_get_posts', 'fragrance_trade_filter_cases_archive' );
/** One-time setup on theme activation: migrate products and create pages. */
function fragrance_trade_setup_site_on_activation() {
if ( get_option( 'fragrance_trade_setup_done' ) ) {
return;
/** Return the default service records created for a fresh installation. */
function fragrance_trade_service_seeds() {
return array(
'b2b_product_1' => array(
'title' => __( '隐形车衣(TPU 保护膜)', 'fragrance-trade' ),
'content' => __( '透明保护膜覆盖车漆表面,可帮助降低日常轻微划痕、飞石和污渍对漆面的影响。具体性能取决于所选产品系列。', 'fragrance-trade' ),
'excerpt' => __( '车漆保护 · 透明外观 · 日常养护', 'fragrance-trade' ),
),
'b2b_product_2' => array(
'title' => __( '彩色改色膜', 'fragrance-trade' ),
'content' => __( '通过不同颜色和表面质感改变车辆外观,可根据车型、原车颜色和日常使用场景选择亮面、哑光等效果。', 'fragrance-trade' ),
'excerpt' => __( '颜色选择 · 表面质感 · 外观焕新', 'fragrance-trade' ),
),
'b2b_product_3' => array(
'title' => __( '隔热防爆膜', 'fragrance-trade' ),
'content' => __( '用于车窗隔热与紫外线防护,可结合透光需求、隐私需求和法规要求选择适合的产品参数。', 'fragrance-trade' ),
'excerpt' => __( '隔热需求 · 紫外线防护 · 车窗适用', 'fragrance-trade' ),
),
'b2b_product_4' => array(
'title' => __( '陶瓷隔热膜', 'fragrance-trade' ),
'content' => __( '陶瓷类隔热膜适合关注隔热表现和车内电子信号使用的车主,实际参数与适用位置以具体产品说明为准。', 'fragrance-trade' ),
'excerpt' => __( '陶瓷膜料 · 信号兼容 · 隔热方案', 'fragrance-trade' ),
),
'b2b_product_5' => array(
'title' => __( '天窗冰甲', 'fragrance-trade' ),
'content' => __( '面向全景天窗的隔热保护项目,需要结合天窗结构、玻璃状况和所选膜料确认是否适合施工。', 'fragrance-trade' ),
'excerpt' => __( '全景天窗 · 隔热需求 · 安装评估', 'fragrance-trade' ),
),
'b2b_product_6' => array(
'title' => __( '前挡专用膜', 'fragrance-trade' ),
'content' => __( '前挡膜重点平衡透光视野、隔热需求和夜间驾驶体验,选购时应核对产品参数及当地法规要求。', 'fragrance-trade' ),
'excerpt' => __( '前挡适用 · 透光视野 · 隔热需求', 'fragrance-trade' ),
),
'b2b_product_7' => array(
'title' => __( '个性定制彩绘膜', 'fragrance-trade' ),
'content' => __( '可根据参考图和车辆尺寸沟通定制外观方案,制作前确认图案、颜色、覆盖范围与交付效果。', 'fragrance-trade' ),
'excerpt' => __( '图案沟通 · 方案确认 · 定制施工', 'fragrance-trade' ),
),
);
}
/** Hashes of the previous untouched seed copy, used to avoid overwriting edited services. */
function fragrance_trade_legacy_service_hashes() {
return array(
'b2b_product_1' => array( 'content' => '4ceefcf5b0d6835b2043eb974862641c4605408b249c47142a1384f8c6aba5a0', 'excerpt' => '474adc2b0a9cb84519f25b32f2aebaf66b7530c582d33a63fc428a70063982dd' ),
'b2b_product_2' => array( 'content' => 'c587d08672a5a73bd9d675a1aaa105b1dec46331a099649474a4669097c41707', 'excerpt' => 'edbbf896ccab06c5cbc79922f2130c190cb4dcd9720d427abd861c5d866d9de2' ),
'b2b_product_3' => array( 'content' => '49a236ff415f92de3c0a789ee42a7ea1083c60779f4dab3d80a162e9fbc534f7', 'excerpt' => '3be7e723aa8cfe1b5ce753e1ede8ceb5eb7122242a8bfde5dc6870e26291111e' ),
'b2b_product_4' => array( 'content' => '96db23ecaebbe16a7fd90254f098d9d652367ea200fe658792a7097082017d56', 'excerpt' => '3e59947da9a09130aeb65c0695c4b0ca1b78737e2cc320184a05ab0b4ca18424' ),
'b2b_product_5' => array( 'content' => '36d83bd3a439f92cdd89c4fb1e863e748d843733a9865b4740e9466c9ba0c916', 'excerpt' => '7e1985099340d070b75b2caa292cb877850bd7e7ed74a14d181dc98780d09666' ),
'b2b_product_6' => array( 'content' => 'caf3a595cc58b69861d66dbb92a04cfdddbe6ebfe7ef10a47e00e5cbbc112ea1', 'excerpt' => '1f1fb96587343da8d3fd938ec47f8f7abfb0a57c52a447c7b84997973ce57999' ),
'b2b_product_7' => array( 'content' => 'b1fda0e7a0c7b3445c61ac1ee1e53c7e27c0612c2e8706901f4a1c07d26959a0', 'excerpt' => '0815c3e0d55c9c491ecfa80d264f2c18e5112ab87e3366bc3bd7ca89c76a951c' ),
);
}
/** Find an existing seed by marker so a failed setup can be retried safely. */
function fragrance_trade_find_seeded_service( $seed_key ) {
$ids = get_posts(
array(
'post_type' => 'service',
'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ),
'posts_per_page' => 1,
'fields' => 'ids',
'meta_key' => '_fragrance_seed_key',
'meta_value' => $seed_key,
'no_found_rows' => true,
)
);
return $ids ? (int) $ids[0] : 0;
}
/** Locate an untouched service created by an older theme version and add its seed marker. */
function fragrance_trade_find_legacy_seed_service( $seed_key, $seed, $legacy_hashes ) {
$posts = get_posts(
array(
'post_type' => 'service',
'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ),
'title' => $seed['title'],
'posts_per_page' => 5,
'no_found_rows' => true,
)
);
foreach ( $posts as $post ) {
if (
hash_equals( $legacy_hashes['content'], hash( 'sha256', $post->post_content ) )
&& hash_equals( $legacy_hashes['excerpt'], hash( 'sha256', $post->post_excerpt ) )
) {
update_post_meta( $post->ID, '_fragrance_seed_key', $seed_key );
return (int) $post->ID;
}
}
return 0;
}
/** Update only untouched seed copy; preserve every service that an administrator edited. */
function fragrance_trade_migrate_seed_service_copy( &$errors ) {
$changed = false;
$legacy_hashes = fragrance_trade_legacy_service_hashes();
foreach ( fragrance_trade_service_seeds() as $seed_key => $seed ) {
$post_id = fragrance_trade_find_seeded_service( $seed_key );
if ( ! $post_id && isset( $legacy_hashes[ $seed_key ] ) ) {
$post_id = fragrance_trade_find_legacy_seed_service( $seed_key, $seed, $legacy_hashes[ $seed_key ] );
}
if ( ! $post_id || ! isset( $legacy_hashes[ $seed_key ] ) ) {
continue;
}
$post = get_post( $post_id );
$update = array( 'ID' => $post_id );
if ( hash_equals( $legacy_hashes[ $seed_key ]['content'], hash( 'sha256', $post->post_content ) ) ) {
$update['post_content'] = $seed['content'];
}
if ( hash_equals( $legacy_hashes[ $seed_key ]['excerpt'], hash( 'sha256', $post->post_excerpt ) ) ) {
$update['post_excerpt'] = $seed['excerpt'];
}
if ( 1 === count( $update ) ) {
continue;
}
$updated = wp_update_post( $update, true );
if ( is_wp_error( $updated ) ) {
$errors[] = sprintf(
/* translators: 1: service title, 2: error message. */
__( '无法更新服务“%1$s”的默认文案:%2$s', 'fragrance-trade' ),
$seed['title'],
$updated->get_error_message()
);
continue;
}
$changed = true;
}
$product_fallbacks = array(
'products/placeholder-01.svg',
'products/placeholder-02.svg',
'products/placeholder-03.svg',
'products/placeholder-04.svg',
'products/placeholder-05.svg',
'products/placeholder-06.svg',
'products/placeholder-07.svg',
);
for ( $index = 1; $index <= count( $product_fallbacks ); $index++ ) {
$title = fragrance_trade_get_mod( 'b2b_product_' . $index . '_title' );
return $changed;
}
/** Create seed services while preserving legacy Customizer product values. */
function fragrance_trade_create_seed_services( &$errors ) {
if ( get_option( 'fragrance_trade_setup_done' ) ) {
return false;
}
$changed = false;
foreach ( fragrance_trade_service_seeds() as $seed_key => $seed ) {
if ( fragrance_trade_find_seeded_service( $seed_key ) ) {
continue;
}
$title = get_theme_mod( $seed_key . '_title', $seed['title'] );
if ( ! $title ) {
continue;
}
$post_id = wp_insert_post(
array(
'post_type' => 'service',
'post_title' => $title,
'post_content' => fragrance_trade_get_mod( 'b2b_product_' . $index . '_text' ),
'post_excerpt' => fragrance_trade_get_mod( 'b2b_product_' . $index . '_specs' ),
'post_content' => get_theme_mod( $seed_key . '_text', $seed['content'] ),
'post_excerpt' => get_theme_mod( $seed_key . '_specs', $seed['excerpt'] ),
'post_status' => 'publish',
)
),
true
);
if ( $post_id && ! is_wp_error( $post_id ) ) {
$image = fragrance_trade_get_mod( 'b2b_product_' . $index . '_image', '' );
if ( $image ) {
update_post_meta( $post_id, '_service_image', $image );
}
if ( is_wp_error( $post_id ) ) {
$errors[] = sprintf(
/* translators: 1: service title, 2: error message. */
__( '无法创建服务“%1$s”:%2$s', 'fragrance-trade' ),
$title,
$post_id->get_error_message()
);
continue;
}
update_post_meta( $post_id, '_fragrance_seed_key', $seed_key );
$image = get_theme_mod( $seed_key . '_image', '' );
if ( $image ) {
update_post_meta( $post_id, '_service_image', $image );
}
$changed = true;
}
return $changed;
}
/** Find a conventional page, including the renamed slug WordPress uses in Trash. */
function fragrance_trade_find_required_page( $slug ) {
$pages = get_posts(
array(
'post_type' => 'page',
'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ),
'post_name__in' => array( $slug, $slug . '__trashed' ),
'posts_per_page' => 1,
'orderby' => 'post_name__in',
'no_found_rows' => true,
)
);
return $pages ? $pages[0] : null;
}
/** Create or repair the required pages without changing existing content or status. */
function fragrance_trade_create_required_pages( &$errors ) {
$pages = array(
'home' => array( 'post_title' => __( '首页', 'fragrance-trade' ), 'template' => '' ),
'about' => array( 'post_title' => __( '关于门店', 'fragrance-trade' ), 'template' => 'page-about.php' ),
'faq' => array( 'post_title' => __( '常见问题', 'fragrance-trade' ), 'template' => 'page-faq.php' ),
'contact' => array( 'post_title' => __( '预约/联系', 'fragrance-trade' ), 'template' => 'page-contact.php' ),
'contact' => array( 'post_title' => __( '联系我们', 'fragrance-trade' ), 'template' => 'page-contact.php' ),
);
$created = array();
$result = array( 'changed' => false, 'pages' => array() );
foreach ( $pages as $slug => $data ) {
$existing = get_page_by_path( $slug );
if ( $existing ) {
$created[ $slug ] = $existing->ID;
$page = fragrance_trade_find_required_page( $slug );
if ( $page ) {
if ( $data['template'] && get_page_template_slug( $page->ID ) !== $data['template'] ) {
$updated = wp_update_post(
array(
'ID' => $page->ID,
'page_template' => $data['template'],
),
true
);
if ( is_wp_error( $updated ) ) {
$errors[] = sprintf(
/* translators: 1: page title, 2: error message. */
__( '无法更新页面“%1$s”的模板:%2$s', 'fragrance-trade' ),
$page->post_title,
$updated->get_error_message()
);
} else {
$result['changed'] = true;
}
}
if ( 'publish' !== $page->post_status ) {
// Preserve user-owned draft and trash states; the admin notice below explains the impact.
} else {
$result['pages'][ $slug ] = $page->ID;
}
continue;
}
$id = wp_insert_post(
$page_id = wp_insert_post(
array(
'post_type' => 'page',
'post_name' => $slug,
'post_title' => $data['post_title'],
'post_status' => 'publish',
'page_template' => $data['template'],
)
),
true
);
if ( $id && ! is_wp_error( $id ) ) {
$created[ $slug ] = $id;
if ( is_wp_error( $page_id ) ) {
$errors[] = sprintf(
/* translators: 1: page title, 2: error message. */
__( '无法创建页面“%1$s”:%2$s', 'fragrance-trade' ),
$data['post_title'],
$page_id->get_error_message()
);
continue;
}
$result['changed'] = true;
$result['pages'][ $slug ] = $page_id;
}
if ( ! empty( $created['home'] ) ) {
update_option( 'page_on_front', $created['home'] );
return $result;
}
/** Versioned and retryable site setup. */
function fragrance_trade_maybe_setup_site() {
$target_version = 3;
if ( (int) get_option( 'fragrance_trade_schema_version', 0 ) >= $target_version ) {
return;
}
$errors = array();
$seed_changed = fragrance_trade_create_seed_services( $errors );
$copy_changed = fragrance_trade_migrate_seed_service_copy( $errors );
$page_result = fragrance_trade_create_required_pages( $errors );
if ( ! empty( $page_result['pages']['home'] ) ) {
update_option( 'page_on_front', $page_result['pages']['home'] );
update_option( 'show_on_front', 'page' );
}
if ( $seed_changed || $copy_changed || $page_result['changed'] ) {
flush_rewrite_rules();
}
flush_rewrite_rules();
if ( $errors ) {
update_option( 'fragrance_trade_setup_errors', array_values( array_unique( $errors ) ), false );
return;
}
delete_option( 'fragrance_trade_setup_errors' );
update_option( 'fragrance_trade_setup_done', 1 );
update_option( 'fragrance_trade_schema_version', $target_version );
}
add_action( 'after_switch_theme', 'fragrance_trade_setup_site_on_activation' );
add_action( 'after_switch_theme', 'fragrance_trade_maybe_setup_site' );
add_action( 'admin_init', 'fragrance_trade_maybe_setup_site' );
/** Show actionable setup failures until they are resolved. */
function fragrance_trade_setup_errors_notice() {
if ( ! current_user_can( 'switch_themes' ) ) {
return;
}
$errors = get_option( 'fragrance_trade_setup_errors', array() );
if ( ! $errors || ! is_array( $errors ) ) {
return;
}
?>
<div class="notice notice-error">
<p><strong><?php esc_html_e( 'B2B Trade 主题初始化未完成', 'fragrance-trade' ); ?></strong></p>
<ul>
<?php foreach ( $errors as $error ) : ?>
<li><?php echo esc_html( $error ); ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php
}
add_action( 'admin_notices', 'fragrance_trade_setup_errors_notice' );
/** Warn when a conventional page exists but is not published. */
function fragrance_trade_page_status_notice() {
if ( ! current_user_can( 'edit_pages' ) ) {
return;
}
$unpublished = array();
foreach ( array( 'home', 'about', 'faq', 'contact' ) as $slug ) {
$page = fragrance_trade_find_required_page( $slug );
if ( $page && 'publish' !== $page->post_status ) {
$unpublished[] = $page->post_title;
}
}
if ( ! $unpublished ) {
return;
}
?>
<div class="notice notice-warning">
<p>
<strong><?php esc_html_e( 'B2B Trade 约定页面尚未发布', 'fragrance-trade' ); ?></strong>
<?php
printf(
/* translators: %s: comma-separated page titles. */
esc_html__( '主题保留了这些页面的当前状态,不会自动发布或恢复它们:%s。请确认状态后再用于前台导航。', 'fragrance-trade' ),
esc_html( implode( '、', $unpublished ) )
);
?>
</p>
</div>
<?php
}
add_action( 'admin_notices', 'fragrance_trade_page_status_notice' );
+2 -2
View File
@@ -85,7 +85,7 @@ function fragrance_trade_customize_register( $wp_customize ) {
array( 'b2b_documents_text', 'fragrance_b2b_documents', __( '板块简介', 'fragrance-trade' ), 'textarea' ),
array( 'b2b_show_faq', 'fragrance_b2b_faq', __( '显示常见问题', 'fragrance-trade' ), 'checkbox' ),
array( 'b2b_faq_title', 'fragrance_b2b_faq', __( '常见问题标题', 'fragrance-trade' ), 'text' ),
array( 'inquiry_email', 'fragrance_contact_social', __( '预约收件邮箱', 'fragrance-trade' ), 'email' ),
array( 'inquiry_email', 'fragrance_contact_social', __( '联系邮箱', 'fragrance-trade' ), 'email' ),
array( 'whatsapp', 'fragrance_contact_social', __( 'WhatsApp 号码(含国家代码)', 'fragrance-trade' ), 'text' ),
array( 'facebook_url', 'fragrance_contact_social', __( 'Facebook 链接', 'fragrance-trade' ), 'url' ),
array( 'twitter_url', 'fragrance_contact_social', __( 'X / Twitter 链接', 'fragrance-trade' ), 'url' ),
@@ -95,7 +95,7 @@ function fragrance_trade_customize_register( $wp_customize ) {
array( 'store_address', 'fragrance_contact_social', __( '门店地址', 'fragrance-trade' ), 'textarea' ),
array( 'store_phone', 'fragrance_contact_social', __( '联系电话', 'fragrance-trade' ), 'text' ),
array( 'store_hours', 'fragrance_contact_social', __( '营业时间', 'fragrance-trade' ), 'text' ),
array( 'store_map_url', 'fragrance_contact_social', __( '百度/高德地图嵌入链接', 'fragrance-trade' ), 'url' ),
array( 'store_map_url', 'fragrance_contact_social', __( '地图导航链接', 'fragrance-trade' ), 'url' ),
array( 'footer_text', 'fragrance_contact_social', __( '页脚定位文案', 'fragrance-trade' ), 'text' ),
);
+53 -143
View File
@@ -11,165 +11,73 @@ if ( ! defined( 'ABSPATH' ) ) {
/** Return all theme defaults. */
function fragrance_trade_defaults() {
return array(
'b2b_hero_eyebrow' => __( '汽车贴膜 · 专业施工', 'fragrance-trade' ),
'b2b_hero_title' => __( '专业汽车贴膜门店,为您提供一站式贴膜服务', 'fragrance-trade' ),
'b2b_hero_text' => __( '从选膜咨询、色彩定制到专业施工和售后保障,我们帮您呵护爱车每一寸车漆。', 'fragrance-trade' ),
'b2b_hero_primary_label' => __( '立即预约', 'fragrance-trade' ),
static $defaults = null;
if ( null !== $defaults ) {
return $defaults;
}
$defaults = array(
'b2b_hero_eyebrow' => __( '需求沟通 · 方案确认 · 施工交付', 'fragrance-trade' ),
'b2b_hero_title' => __( '根据车型与使用场景,选择更合适的汽车贴膜方案', 'fragrance-trade' ),
'b2b_hero_text' => __( '隐形车衣、改色膜、隔热膜等项目,从需求沟通、膜料确认到施工交付,把选择和注意事项先讲清楚。', 'fragrance-trade' ),
'b2b_hero_primary_label' => __( '联系门店', 'fragrance-trade' ),
'b2b_hero_primary_url' => '/contact/',
'b2b_hero_secondary_label' => __( '了解服务项目', 'fragrance-trade' ),
'b2b_hero_secondary_url' => '/services/',
'b2b_trust_title' => __( '从选膜到施工的专业服务团队', 'fragrance-trade' ),
'b2b_metric_1_value' => __( '正品膜料', 'fragrance-trade' ),
'b2b_metric_1_label' => __( '品牌授权 · 质保可查', 'fragrance-trade' ),
'b2b_metric_2_value' => __( '一站式', 'fragrance-trade' ),
'b2b_metric_2_label' => __( '从选膜到施工交付', 'fragrance-trade' ),
'b2b_metric_3_value' => __( '逐车质检', 'fragrance-trade' ),
'b2b_metric_3_label' => __( '交付前品质复检', 'fragrance-trade' ),
'b2b_metric_4_value' => __( '售后无忧', 'fragrance-trade' ),
'b2b_metric_4_label' => __( '施工质保与维护指导', 'fragrance-trade' ),
'b2b_services_title' => __( '围绕您的车型与需求定制的贴膜服务', 'fragrance-trade' ),
'b2b_services_text' => __( '根据您的车型、预算和用车场景,选择最适合的贴膜方案。', 'fragrance-trade' ),
'b2b_service_1_title' => __( '隐形车衣施工', 'fragrance-trade' ),
'b2b_service_1_text' => __( 'TPU 材质全车或局部施工,自修复抗划伤,保护原厂车漆。', 'fragrance-trade' ),
'b2b_service_2_title' => __( '改色膜施工', 'fragrance-trade' ),
'b2b_service_2_text' => __( '丰富色彩与表面效果可选,专业无痕施工,不伤原车漆。', 'fragrance-trade' ),
'b2b_service_3_title' => __( '隔热膜施工', 'fragrance-trade' ),
'b2b_service_3_text' => __( '前挡、侧窗、天窗全覆盖,高效隔热阻紫外线,提升驾乘舒适度。', 'fragrance-trade' ),
'b2b_service_4_title' => __( '定制彩绘施工', 'fragrance-trade' ),
'b2b_service_4_text' => __( '支持个性化图案设计与施工,满足改装车友和商业用车外观需求。', 'fragrance-trade' ),
'b2b_products_title' => __( '门店可选膜料参考', 'fragrance-trade' ),
'b2b_products_text' => __( '以下为本店施工经验验证的主流膜料。施工效果因车型和颜色而异,欢迎到店看样。', 'fragrance-trade' ),
'b2b_product_1_title' => __( '隐形车衣(TPU 保护膜)', 'fragrance-trade' ),
'b2b_product_1_text' => __( '高透明度 TPU 材质,具备自修复功能,有效保护车漆免受石子划伤和紫外线损伤。', 'fragrance-trade' ),
'b2b_product_1_specs' => __( 'TPU 材质 · 自修复 · 高透光 · 抗黄变', 'fragrance-trade' ),
'b2b_product_1_image' => '',
'b2b_product_2_title' => __( '彩色改色膜', 'fragrance-trade' ),
'b2b_product_2_text' => __( '丰富色彩选择,高分子 PVC 材质,贴合度高,可实现哑光、亮面、珠光等多种表面效果。', 'fragrance-trade' ),
'b2b_product_2_specs' => __( 'PVC 材质 · 多色可选 · 哑光/亮面 · 高贴合', 'fragrance-trade' ),
'b2b_product_2_image' => '',
'b2b_product_3_title' => __( '隔热防爆膜', 'fragrance-trade' ),
'b2b_product_3_text' => __( '高效隔热阻紫外线,提升车内舒适度,多层金属镀膜工艺确保清晰视野与安全性。', 'fragrance-trade' ),
'b2b_product_3_specs' => __( '多层金属 · 隔热阻紫 · 高透光 · 防爆', 'fragrance-trade' ),
'b2b_product_3_image' => '',
'b2b_product_4_title' => __( '陶瓷隔热膜', 'fragrance-trade' ),
'b2b_product_4_text' => __( '纳米陶瓷技术,不屏蔽信号,隔热性能卓越,适合高端车型及电子设备密集车辆。', 'fragrance-trade' ),
'b2b_product_4_specs' => __( '纳米陶瓷 · 不挡信号 · 超强隔热 · 持久耐用', 'fragrance-trade' ),
'b2b_product_4_image' => '',
'b2b_product_5_title' => __( '天窗冰甲', 'fragrance-trade' ),
'b2b_product_5_text' => __( '专为全景天窗设计,高隔热率搭配防爆功能,降低车内温度同时提升安全性。', 'fragrance-trade' ),
'b2b_product_5_specs' => __( '天窗专用 · 高隔热 · 防爆 · 降噪', 'fragrance-trade' ),
'b2b_product_5_image' => '',
'b2b_product_6_title' => __( '前挡专用膜', 'fragrance-trade' ),
'b2b_product_6_text' => __( '前挡风玻璃专用配方,高透光率符合国家标准,兼顾隔热性能与驾驶视野。', 'fragrance-trade' ),
'b2b_product_6_specs' => __( '前挡专用 · 高透光 · 符合国标 · 隔热', 'fragrance-trade' ),
'b2b_product_6_image' => '',
'b2b_product_7_title' => __( '个性定制彩绘膜', 'fragrance-trade' ),
'b2b_product_7_text' => __( '支持图案定制设计,适用于个性化改装和商业用车外观需求。', 'fragrance-trade' ),
'b2b_product_7_specs' => __( '图案定制 · 个性化设计 · 专业施工 · 持久耐用', 'fragrance-trade' ),
'b2b_product_7_image' => '',
'b2b_custom_title' => __( '定制您想要的每一处细节', 'fragrance-trade' ),
'b2b_custom_text' => __( '根据车型、预算和个人喜好,灵活调整贴膜方案的关键要素。', 'fragrance-trade' ),
'b2b_custom_1_title' => __( '膜料选型', 'fragrance-trade' ),
'b2b_custom_2_title' => __( '颜色定制', 'fragrance-trade' ),
'b2b_custom_3_title' => __( '厚度规格', 'fragrance-trade' ),
'b2b_custom_4_title' => __( '施工范围', 'fragrance-trade' ),
'b2b_custom_5_title' => __( '表面工艺', 'fragrance-trade' ),
'b2b_custom_6_title' => __( '图案定制', 'fragrance-trade' ),
'b2b_custom_7_title' => __( '交车时间', 'fragrance-trade' ),
'b2b_custom_8_title' => __( '售后质保', 'fragrance-trade' ),
'b2b_factory_eyebrow' => __( '门店环境', 'fragrance-trade' ),
'b2b_factory_title' => __( '专业的施工环境', 'fragrance-trade' ),
'b2b_factory_text' => __( '标准无尘施工车间,专业技师团队,每台车均按流程规范操作。', 'fragrance-trade' ),
'b2b_factory_point_1' => __( '标准无尘施工车间', 'fragrance-trade' ),
'b2b_factory_point_2' => __( '施工前样板确认制度', 'fragrance-trade' ),
'b2b_factory_point_3' => __( '膜料与辅材规范管理', 'fragrance-trade' ),
'b2b_factory_point_4' => __( '施工进度实时沟通', 'fragrance-trade' ),
'b2b_trust_title' => __( '每一步都讲清楚,再开始施工', 'fragrance-trade' ),
'b2b_metric_1_value' => __( '方案透明', 'fragrance-trade' ),
'b2b_metric_1_label' => __( '项目、膜料与费用先确认', 'fragrance-trade' ),
'b2b_metric_2_value' => __( '按车建议', 'fragrance-trade' ),
'b2b_metric_2_label' => __( '结合车型与使用场景', 'fragrance-trade' ),
'b2b_metric_3_value' => __( '过程沟通', 'fragrance-trade' ),
'b2b_metric_3_label' => __( '关键节点及时同步', 'fragrance-trade' ),
'b2b_metric_4_value' => __( '交付说明', 'fragrance-trade' ),
'b2b_metric_4_label' => __( '检查结果与护理事项讲清楚', 'fragrance-trade' ),
'b2b_factory_eyebrow' => __( '施工现场', 'fragrance-trade' ),
'b2b_factory_title' => __( '看得见的施工过程', 'fragrance-trade' ),
'b2b_factory_text' => __( '施工前确认项目与车辆情况,施工中保持沟通,交付时说明检查结果和日常护理事项。', 'fragrance-trade' ),
'b2b_factory_point_1' => __( '接车前检查车辆情况', 'fragrance-trade' ),
'b2b_factory_point_2' => __( '施工方案与费用先确认', 'fragrance-trade' ),
'b2b_factory_point_3' => __( '膜料与辅材分类管理', 'fragrance-trade' ),
'b2b_factory_point_4' => __( '交付检查与护理说明', 'fragrance-trade' ),
'b2b_factory_image_1' => '',
'b2b_factory_image_2' => '',
'b2b_factory_image_3' => '',
'b2b_factory_image_4' => '',
'b2b_show_video' => true,
'b2b_video_title' => __( '汽车贴膜施工流程', 'fragrance-trade' ),
'b2b_video_text' => __( '了解从接车检查、裁膜施工到交付的完整流程。', 'fragrance-trade' ),
'b2b_video_title' => __( '了解汽车贴膜施工步骤', 'fragrance-trade' ),
'b2b_video_text' => __( '查看接车检查、车辆清洁、裁膜施工、复检交付等主要环节。', 'fragrance-trade' ),
'b2b_video_url' => '',
'b2b_video_image' => '',
'b2b_quality_title' => __( '每个施工环节的品质管控', 'fragrance-trade' ),
'b2b_quality_text' => __( '严格遵循标准施工流程,每道工序均有检查确认。', 'fragrance-trade' ),
'b2b_quality_1_title' => __( '车辆检查', 'fragrance-trade' ),
'b2b_quality_1_text' => __( '施工前对车身漆面、玻璃和饰件进行全面检查记录。', 'fragrance-trade' ),
'b2b_quality_2_title' => __( '样板确认', 'fragrance-trade' ),
'b2b_quality_2_text' => __( '以小面积样板确认颜色、质感和贴合效果。', 'fragrance-trade' ),
'b2b_quality_3_title' => __( '施工过程检验', 'fragrance-trade' ),
'b2b_quality_3_text' => __( '监控裁膜精度、贴合平整度和边角处理。', 'fragrance-trade' ),
'b2b_quality_4_title' => __( '色差检测', 'fragrance-trade' ),
'b2b_quality_4_text' => __( '对比确认施工效果与样板颜色的一致性。', 'fragrance-trade' ),
'b2b_quality_5_title' => __( '成品外观检验', 'fragrance-trade' ),
'b2b_quality_5_text' => __( '检查膜面瑕疵、气泡、边角贴合和整体效果。', 'fragrance-trade' ),
'b2b_quality_6_title' => __( '交付前复查', 'fragrance-trade' ),
'b2b_quality_6_text' => __( '交车前复核全车施工效果并拍照存档。', 'fragrance-trade' ),
'b2b_process_title' => __( '清晰的服务流程', 'fragrance-trade' ),
'b2b_process_text' => __( '每个阶段都有明确的沟通与确认,确保您对施工效果心中有数。', 'fragrance-trade' ),
'b2b_process_1_title' => __( '预约咨询', 'fragrance-trade' ),
'b2b_process_1_text' => __( '告知车型、需求和预算,获取初步方案建议。', 'fragrance-trade' ),
'b2b_process_2_title' => __( '需求评估', 'fragrance-trade' ),
'b2b_process_2_text' => __( '到店看样、确认施工范围和预估工时。', 'fragrance-trade' ),
'b2b_process_3_title' => __( '选择膜料与方案', 'fragrance-trade' ),
'b2b_process_3_text' => __( '确定膜料品牌、颜色、部位和施工方案。', 'fragrance-trade' ),
'b2b_process_4_title' => __( '样板确认', 'fragrance-trade' ),
'b2b_process_4_text' => __( '以小面积施工确认效果,确保符合预期。', 'fragrance-trade' ),
'b2b_process_5_title' => __( '方案锁定', 'fragrance-trade' ),
'b2b_process_5_text' => __( '锁定确认的方案、膜料规格和施工排期。', 'fragrance-trade' ),
'b2b_process_6_title' => __( '预约施工', 'fragrance-trade' ),
'b2b_process_6_text' => __( '确认施工日期、交车时间和费用。', 'fragrance-trade' ),
'b2b_process_7_title' => __( '施工与质检', 'fragrance-trade' ),
'b2b_process_7_text' => __( '按标准流程施工,关键节点拍照同步。', 'fragrance-trade' ),
'b2b_process_8_title' => __( '交车与售后', 'fragrance-trade' ),
'b2b_process_8_text' => __( '验收交车,提供质保卡和维护指南。', 'fragrance-trade' ),
'b2b_show_projects' => true,
'b2b_projects_title' => __( '施工案例类型', 'fragrance-trade' ),
'b2b_projects_text' => __( '以下为不同车主选择贴膜服务的常见场景,帮助您了解适合的方案。', 'fragrance-trade' ),
'b2b_project_1_title' => __( '新车提车贴膜', 'fragrance-trade' ),
'b2b_project_1_meta' => __( '提车即保护', 'fragrance-trade' ),
'b2b_project_1_text' => __( '新车落地即施工,在车漆最佳状态下提供全面保护。', 'fragrance-trade' ),
'b2b_project_2_title' => __( '老车改色焕新', 'fragrance-trade' ),
'b2b_project_2_meta' => __( '换个颜色换种心情', 'fragrance-trade' ),
'b2b_project_2_text' => __( '根据个人喜好和流行趋势,为爱车换上全新外观。', 'fragrance-trade' ),
'b2b_project_3_title' => __( '商业车队定制', 'fragrance-trade' ),
'b2b_project_3_meta' => __( '统一形象 · 专业施工', 'fragrance-trade' ),
'b2b_project_3_text' => __( '为商业车队提供统一外观设计和批量施工服务。', 'fragrance-trade' ),
'b2b_show_documents' => true,
'b2b_documents_title' => __( '服务保障与文档', 'fragrance-trade' ),
'b2b_documents_text' => __( '施工完成后您将收到以下文件,确保权益有据可查。', 'fragrance-trade' ),
'b2b_document_1_title' => __( '施工方案确认', 'fragrance-trade' ),
'b2b_document_1_text' => __( '已确认的膜料品牌、规格、施工部位和费用清单。', 'fragrance-trade' ),
'b2b_document_2_title' => __( '施工记录存档', 'fragrance-trade' ),
'b2b_document_2_text' => __( '施工过程关键节点拍照记录,交付前进行最终检查。', 'fragrance-trade' ),
'b2b_document_3_title' => __( '膜料质保卡', 'fragrance-trade' ),
'b2b_document_3_text' => __( '膜料品牌官方质保凭证,包含质保期限和范围说明。', 'fragrance-trade' ),
'b2b_document_4_title' => __( '维护保养指南', 'fragrance-trade' ),
'b2b_document_4_text' => __( '施工后的日常护理建议、注意事项和复检周期说明。', 'fragrance-trade' ),
'b2b_documents_title' => __( '交付信息更清楚', 'fragrance-trade' ),
'b2b_documents_text' => __( '实际提供的文件因项目和膜料而异,下单前可向门店确认。', 'fragrance-trade' ),
'b2b_document_1_title' => __( '项目与费用确认', 'fragrance-trade' ),
'b2b_document_1_text' => __( '记录施工部位、所选膜料、费用和预计工期。', 'fragrance-trade' ),
'b2b_document_2_title' => __( '车辆检查记录', 'fragrance-trade' ),
'b2b_document_2_text' => __( '记录施工前车辆情况和交付检查结果。', 'fragrance-trade' ),
'b2b_document_3_title' => __( '产品与质保凭证', 'fragrance-trade' ),
'b2b_document_3_text' => __( '如项目适用,提供对应品牌或产品的凭证与质保说明。', 'fragrance-trade' ),
'b2b_document_4_title' => __( '日常护理建议', 'fragrance-trade' ),
'b2b_document_4_text' => __( '说明洗车、清洁、检查等日常注意事项。', 'fragrance-trade' ),
'b2b_show_faq' => true,
'b2b_faq_title' => __( '常见问题', 'fragrance-trade' ),
'b2b_faq_1_question' => __( '施工需要多长时间?', 'fragrance-trade' ),
'b2b_faq_1_answer' => __( '全车隐形车衣约 1-2 天,改色膜约 2-3 天,隔热膜约半天。具体以到店评估为准。', 'fragrance-trade' ),
'b2b_faq_2_question' => __( '有哪些颜色和膜料可选', 'fragrance-trade' ),
'b2b_faq_2_answer' => __( '我们提供多种品牌和颜色的膜料,欢迎到店看实物色卡样板,选择最适合您爱车的方案。', 'fragrance-trade' ),
'b2b_faq_1_question' => __( '通常需要多长时间?', 'fragrance-trade' ),
'b2b_faq_1_answer' => __( '工期取决于车型、施工部位、膜料和当日排期。隐形车衣与改色膜通常需要留车,隔热膜所需时间相对较短,具体以门店确认结果为准。', 'fragrance-trade' ),
'b2b_faq_2_question' => __( '怎样选择膜料和颜色', 'fragrance-trade' ),
'b2b_faq_2_answer' => __( '可以结合预算、车辆用途、停车环境和外观偏好进行选择。建议到店看实物色卡样板,并确认不同光线下的效果。', 'fragrance-trade' ),
'b2b_faq_3_question' => __( '可以按我的参考图样施工吗?', 'fragrance-trade' ),
'b2b_faq_3_answer' => __( '可以带上您的参考图样,我们的技师会评估可行性和施工方案。', 'fragrance-trade' ),
'b2b_faq_3_answer' => __( '可以带上参考图,由门店结合车型曲面、膜料效果和施工条件评估。成品会受材质与光线影响,不能仅以屏幕图片作为最终颜色依据。', 'fragrance-trade' ),
'b2b_faq_4_question' => __( '贴膜后多久可以洗车?', 'fragrance-trade' ),
'b2b_faq_4_answer' => __( '建议施工后 7 天内避免高压水枪洗车,让膜料充分贴合。具体以交车时告知的维护指南为准。', 'fragrance-trade' ),
'b2b_faq_4_answer' => __( '不同膜料和施工环境所需的稳定时间不同。交车时请确认首次洗车时间,并避免过早使用高压水枪冲洗膜边。', 'fragrance-trade' ),
'b2b_faq_5_question' => __( '膜料和颜色可以定制搭配吗?', 'fragrance-trade' ),
'b2b_faq_5_answer' => __( '可以。不同部位可选择不同膜料,我们会根据您的需求推荐最优搭配方案。', 'fragrance-trade' ),
'b2b_faq_5_answer' => __( '可以讨论分区搭配,但需要同时考虑颜色协调、膜料厚度、收边位置和后续维护,再确认是否适合施工。', 'fragrance-trade' ),
'b2b_faq_6_question' => __( '施工前可以先看样板效果吗?', 'fragrance-trade' ),
'b2b_faq_6_answer' => __( '可以。我们会先做小面积施工样板供您确认颜色、质感和贴合效果,满意后再全面施工。', 'fragrance-trade' ),
'b2b_faq_7_question' => __( '预约需要提供哪些信息?', 'fragrance-trade' ),
'b2b_faq_7_answer' => __( '请提供车型、想做的项目或膜种,以及期望的施工时间,我们会尽快与您确认方案和排期。', 'fragrance-trade' ),
'b2b_faq_8_question' => __( '施工后质保多久', 'fragrance-trade' ),
'b2b_faq_8_answer' => __( '质保期限因膜料品牌和类型而异,一般在 3-10 年不等。施工完成后会提供品牌官方质保卡。', 'fragrance-trade' ),
'b2b_rfq_title' => __( '在线预约咨询', 'fragrance-trade' ),
'b2b_rfq_text' => __( '填写基本信息,我们的服务顾问将为您提供方案建议和施工排期。', 'fragrance-trade' ),
'b2b_rfq_button_label' => __( '提交预约', 'fragrance-trade' ),
'b2b_faq_6_answer' => __( '可以先查看色卡和现有样板。是否能进行小面积试贴,取决于所选膜料和车辆部位,请在施工前与门店确认。', 'fragrance-trade' ),
'b2b_faq_7_question' => __( '咨询时需要提供哪些信息?', 'fragrance-trade' ),
'b2b_faq_7_answer' => __( '建议准备车型与年份、想做的项目、外观偏好、预算范围和期望用车时间,便于门店更快判断可选方案。', 'fragrance-trade' ),
'b2b_faq_8_question' => __( '质保范围和期限怎么确认', 'fragrance-trade' ),
'b2b_faq_8_answer' => __( '质保范围和期限由所选品牌、产品系列与施工项目决定。下单前请确认适用条件、起止时间和所需凭证,并以最终书面说明为准。', 'fragrance-trade' ),
'inquiry_email' => '',
'whatsapp' => '',
'facebook_url' => '',
@@ -181,6 +89,8 @@ function fragrance_trade_defaults() {
'store_phone' => '',
'store_hours' => '',
'store_map_url' => '',
'footer_text' => __( '为车主提供专业汽车贴膜施工与养护服务。', 'fragrance-trade' ),
'footer_text' => __( '专注汽车贴膜方案沟通、施工交付与日常护理说明。', 'fragrance-trade' ),
);
return $defaults;
}
+39 -16
View File
@@ -15,6 +15,14 @@ function fragrance_trade_get_mod( $key, $fallback = null ) {
return get_theme_mod( $key, $default );
}
function fragrance_trade_resolve_url( $url ) {
$url = trim( (string) $url );
if ( str_starts_with( $url, '/' ) && ! str_starts_with( $url, '//' ) ) {
return home_url( $url );
}
return $url;
}
function fragrance_trade_asset_uri( $relative_path ) {
return trailingslashit( get_template_directory_uri() ) . 'assets/' . ltrim( $relative_path, '/' );
}
@@ -45,32 +53,47 @@ function fragrance_trade_get_inquiry_url( $project = '' ) {
if ( $number ) {
return add_query_arg( 'text', $message, 'https://wa.me/' . $number );
}
return 'mailto:' . antispambot( fragrance_trade_inquiry_email() ) . '?subject=' . rawurlencode( __( '汽车贴膜预约咨询', 'fragrance-trade' ) ) . '&body=' . rawurlencode( $message );
return 'mailto:' . antispambot( fragrance_trade_inquiry_email() ) . '?subject=' . rawurlencode( __( '汽车贴膜服务咨询', 'fragrance-trade' ) ) . '&body=' . rawurlencode( $message );
}
function fragrance_trade_get_notice() {
if ( empty( $_GET['fragrance_notice'] ) ) {
return '';
}
return sanitize_key( wp_unslash( $_GET['fragrance_notice'] ) );
}
function fragrance_trade_notice_message( $code ) {
$messages = array(
'success' => __( '感谢您的提交,预约需求已发送。', 'fragrance-trade' ),
'invalid' => __( '请检查必填项后重新提交。', 'fragrance-trade' ),
'rate_limited' => __( '请稍候片刻再重新提交。', 'fragrance-trade' ),
'mail_failed' => __( '发送失败,请通过邮件或 WhatsApp 联系我们。', 'fragrance-trade' ),
function fragrance_trade_primary_menu_fallback() {
$links = array(
array( 'label' => __( '首页', 'fragrance-trade' ), 'url' => home_url( '/' ) ),
array( 'label' => __( '服务项目', 'fragrance-trade' ), 'url' => get_post_type_archive_link( 'service' ) ?: home_url( '/services/' ) ),
array( 'label' => __( '案例作品', 'fragrance-trade' ), 'url' => get_post_type_archive_link( 'case' ) ?: home_url( '/cases/' ) ),
array( 'label' => __( '关于门店', 'fragrance-trade' ), 'url' => home_url( '/about/' ) ),
array( 'label' => __( '常见问题', 'fragrance-trade' ), 'url' => home_url( '/faq/' ) ),
array( 'label' => __( '联系我们', 'fragrance-trade' ), 'url' => home_url( '/contact/' ) ),
);
return isset( $messages[ $code ] ) ? $messages[ $code ] : '';
echo '<ul class="navbar-nav justify-content-end flex-grow-1 gap-xl-4 pe-xl-3">';
foreach ( $links as $link ) {
printf(
'<li class="nav-item"><a class="nav-link" href="%s">%s</a></li>',
esc_url( $link['url'] ),
esc_html( $link['label'] )
);
}
echo '</ul>';
}
add_action(
'admin_notices',
function () {
if ( ! current_user_can( 'edit_theme_options' ) ) {
return;
}
$locations = get_nav_menu_locations();
$menu_id = isset( $locations['primary'] ) ? $locations['primary'] : 0;
if ( ! $menu_id ) {
printf(
'<div class="notice notice-warning is-dismissible"><p><strong>%s</strong> %s <a href="%s">%s</a></p></div>',
esc_html__( '尚未分配主导航菜单', 'fragrance-trade' ),
esc_html__( '前台暂时显示主题默认导航。请创建正式菜单并分配到“主导航”。', 'fragrance-trade' ),
esc_url( admin_url( 'nav-menus.php' ) ),
esc_html__( '配置菜单', 'fragrance-trade' )
);
return;
}
$items = wp_get_nav_menu_items( $menu_id );
@@ -79,7 +102,7 @@ add_action(
printf(
'<div class="notice notice-warning is-dismissible"><p><strong>%s</strong> %s <a href="%s">%s</a></p></div>',
esc_html__( '主导航菜单项过少', 'fragrance-trade' ),
esc_html__( '手机端和桌面端导航目前只显示一个菜单项。请前往后台添加:首页、服务项目、案例作品、关于门店、常见问题、预约联系。', 'fragrance-trade' ),
esc_html__( '手机端和桌面端导航目前只显示一个菜单项。请前往后台添加:首页、服务项目、案例作品、关于门店、常见问题、联系我们。', 'fragrance-trade' ),
esc_url( admin_url( 'nav-menus.php' ) ),
esc_html__( '编辑菜单', 'fragrance-trade' )
);
-95
View File
@@ -1,95 +0,0 @@
<?php
/**
* Secure RFQ form handler (deprecated).
*
* @package Fragrance_Trade
* @deprecated 2.1.0 Contact page no longer has a form. This handler remains
* registered but is never triggered. Kept as a security reference
* implementation (nonce + honeypot + rate-limit + header injection
* guard) in case a booking form is re-introduced.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
function fragrance_trade_post_value( $key ) {
if ( ! isset( $_POST[ $key ] ) || ! is_scalar( $_POST[ $key ] ) ) {
return '';
}
return (string) wp_unslash( $_POST[ $key ] );
}
function fragrance_trade_limit_text( $value, $length ) {
return function_exists( 'mb_substr' ) ? mb_substr( $value, 0, $length ) : substr( $value, 0, $length );
}
function fragrance_trade_form_redirect_url() {
$fallback = home_url( '/' );
$referer = wp_get_referer();
return wp_validate_redirect( $referer ? $referer : $fallback, $fallback );
}
function fragrance_trade_redirect_notice( $notice ) {
$url = remove_query_arg( 'fragrance_notice', fragrance_trade_form_redirect_url() );
$url = add_query_arg( 'fragrance_notice', sanitize_key( $notice ), $url );
wp_safe_redirect( $url . '#rfq' );
exit;
}
function fragrance_trade_is_rate_limited( $action ) {
$address = isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ) : 'unknown';
$key = 'fragrance_' . sanitize_key( $action ) . '_' . substr( hash( 'sha256', $address . wp_salt( 'nonce' ) ), 0, 32 );
if ( get_transient( $key ) ) {
return true;
}
set_transient( $key, 1, MINUTE_IN_SECONDS );
return false;
}
function fragrance_trade_honeypot_filled() {
return '' !== trim( fragrance_trade_post_value( 'fragrance_website' ) );
}
function fragrance_trade_handle_rfq() {
check_admin_referer( 'fragrance_rfq', 'fragrance_rfq_nonce' );
if ( fragrance_trade_honeypot_filled() ) {
fragrance_trade_redirect_notice( 'invalid' );
}
if ( fragrance_trade_is_rate_limited( 'rfq' ) ) {
fragrance_trade_redirect_notice( 'rate_limited' );
}
$fields = array(
'name' => fragrance_trade_limit_text( sanitize_text_field( fragrance_trade_post_value( 'name' ) ), 100 ),
'email' => fragrance_trade_limit_text( sanitize_email( fragrance_trade_post_value( 'email' ) ), 190 ),
'company' => fragrance_trade_limit_text( sanitize_text_field( fragrance_trade_post_value( 'company' ) ), 150 ),
'whatsapp' => fragrance_trade_limit_text( sanitize_text_field( fragrance_trade_post_value( 'whatsapp' ) ), 100 ),
'product_type' => fragrance_trade_limit_text( sanitize_text_field( fragrance_trade_post_value( 'product_type' ) ), 150 ),
'message' => fragrance_trade_limit_text( sanitize_textarea_field( fragrance_trade_post_value( 'message' ) ), 2000 ),
);
if ( ! $fields['name'] || ! is_email( $fields['email'] ) || ! $fields['product_type'] || ! $fields['message'] ) {
fragrance_trade_redirect_notice( 'invalid' );
}
$labels = array(
'name' => __( '姓名', 'fragrance-trade' ), 'email' => __( '邮箱', 'fragrance-trade' ),
'company' => __( '车型 / 车牌', 'fragrance-trade' ), 'whatsapp' => __( 'WhatsApp 或电话', 'fragrance-trade' ),
'product_type' => __( '想做的项目 / 膜种', 'fragrance-trade' ), 'message' => __( '简要需求描述', 'fragrance-trade' ),
);
$body_lines = array();
foreach ( $labels as $key => $label ) {
$body_lines[] = $label . ': ' . ( $fields[ $key ] ? $fields[ $key ] : __( '未提供', 'fragrance-trade' ) );
}
$site_name = wp_specialchars_decode( get_bloginfo( 'name' ), ENT_QUOTES );
$safe_name = str_replace( array( "\r", "\n" ), ' ', $fields['name'] );
$safe_email = str_replace( array( "\r", "\n" ), '', $fields['email'] );
$context = $fields['company'] ? $fields['company'] : $fields['product_type'];
$subject = sprintf( '[%s] %s - %s', $site_name, __( '汽车贴膜预约', 'fragrance-trade' ), $context );
$headers = array( 'Content-Type: text/plain; charset=UTF-8', 'Reply-To: ' . $safe_name . ' <' . $safe_email . '>' );
$sent = wp_mail( fragrance_trade_inquiry_email(), $subject, implode( "\n\n", $body_lines ), $headers );
fragrance_trade_redirect_notice( $sent ? 'success' : 'mail_failed' );
}
add_action( 'admin_post_fragrance_rfq', 'fragrance_trade_handle_rfq' );
add_action( 'admin_post_nopriv_fragrance_rfq', 'fragrance_trade_handle_rfq' );
+4 -36
View File
@@ -66,43 +66,11 @@ function fragrance_trade_asset_version( $relative_path, $fallback ) {
function fragrance_trade_enqueue_assets() {
$version = wp_get_theme()->get( 'Version' );
wp_enqueue_style( 'fragrance-bootstrap', 'https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.0-alpha3/css/bootstrap.min.css', array(), '5.3.0-alpha3' );
wp_enqueue_style( 'fragrance-fonts', 'https://fonts.loli.net/css2?family=Josefin+Sans:wght@200;300;400;500;600;700&family=Jost:wght@200;300;400;500&family=Noto+Sans+SC:wght@300;400;500;700&display=swap', array(), null );
wp_enqueue_style( 'fragrance-normalize', get_template_directory_uri() . '/assets/css/normalize.css', array(), fragrance_trade_asset_version( 'assets/css/normalize.css', $version ) );
wp_enqueue_style( 'fragrance-vendor', get_template_directory_uri() . '/assets/css/vendor.css', array(), fragrance_trade_asset_version( 'assets/css/vendor.css', $version ) );
wp_enqueue_style( 'fragrance-base', get_stylesheet_uri(), array( 'fragrance-bootstrap', 'fragrance-vendor' ), fragrance_trade_asset_version( 'style.css', $version ) );
wp_enqueue_style( 'fragrance-bootstrap', get_template_directory_uri() . '/assets/vendor/bootstrap/bootstrap.min.css', array(), fragrance_trade_asset_version( 'assets/vendor/bootstrap/bootstrap.min.css', '5.3.8' ) );
wp_enqueue_style( 'fragrance-base', get_stylesheet_uri(), array( 'fragrance-bootstrap' ), fragrance_trade_asset_version( 'style.css', $version ) );
wp_enqueue_style( 'fragrance-theme', get_template_directory_uri() . '/assets/css/theme.css', array( 'fragrance-base' ), fragrance_trade_asset_version( 'assets/css/theme.css', $version ) );
wp_enqueue_script( 'fragrance-bootstrap', 'https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.0-alpha3/js/bootstrap.bundle.min.js', array(), '5.3.0-alpha3', true );
wp_enqueue_script( 'fragrance-plugins', get_template_directory_uri() . '/assets/js/plugins.js', array( 'jquery' ), fragrance_trade_asset_version( 'assets/js/plugins.js', $version ), true );
wp_enqueue_script( 'fragrance-theme', get_template_directory_uri() . '/assets/js/theme.js', array( 'jquery', 'fragrance-bootstrap', 'fragrance-plugins' ), fragrance_trade_asset_version( 'assets/js/theme.js', $version ), true );
wp_enqueue_script( 'fragrance-bootstrap', get_template_directory_uri() . '/assets/vendor/bootstrap/bootstrap.bundle.min.js', array(), fragrance_trade_asset_version( 'assets/vendor/bootstrap/bootstrap.bundle.min.js', '5.3.8' ), true );
wp_enqueue_script( 'fragrance-theme', get_template_directory_uri() . '/assets/js/theme.js', array( 'fragrance-bootstrap' ), fragrance_trade_asset_version( 'assets/js/theme.js', $version ), true );
}
add_action( 'wp_enqueue_scripts', 'fragrance_trade_enqueue_assets' );
/**
* SRI integrity hashes for CDN-hosted resources.
*
* Computed 2026-07-24 from cdn.bootcdn.net.
* Verify/update via: curl -sL <url> | openssl dgst -sha384 -binary | openssl base64 -A
*/
function fragrance_trade_style_sri( $html, $handle ) {
$sri = array(
'fragrance-bootstrap' => 'sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ',
);
if ( isset( $sri[ $handle ] ) ) {
$html = str_replace( '/>', ' integrity="' . esc_attr( $sri[ $handle ] ) . '" crossorigin="anonymous" />', $html );
}
return $html;
}
add_filter( 'style_loader_tag', 'fragrance_trade_style_sri', 10, 2 );
function fragrance_trade_script_sri( $html, $handle ) {
$sri = array(
'fragrance-bootstrap' => 'sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe',
);
if ( isset( $sri[ $handle ] ) ) {
$html = str_replace( '></script>', ' integrity="' . esc_attr( $sri[ $handle ] ) . '" crossorigin="anonymous"></script>', $html );
}
return $html;
}
add_filter( 'script_loader_tag', 'fragrance_trade_script_sri', 10, 2 );