refactor: 死代码清理 + CDN SRI 加固 + 面包屑组件 + 代码规范文档

- 删除 7 个死模板文件 (products/services/quality/process/projects/customization/rfq)
- 删除 13 个旧图片素材 (jpg/png/webp)
- 新增 CDN SRI 完整性校验 (Bootstrap CSS/JS)
- 新增面包屑导航模板组件
- 新增代码清理方案与代码审查标准文档
- 更新 README.md
This commit is contained in:
2026-07-24 17:48:00 +08:00
parent 8a2890f8b4
commit 43272d25eb
39 changed files with 848 additions and 332 deletions
+50 -7
View File
@@ -28,6 +28,28 @@ function fragrance_trade_setup() {
}
add_action( 'after_setup_theme', 'fragrance_trade_setup' );
/**
* Add Bootstrap 5 nav-item / nav-link classes to primary menu.
*
* Without these classes the offcanvas mobile menu items may not render
* properly because Bootstrap's offcanvas CSS relies on them for display.
*/
function fragrance_trade_nav_menu_css_class( $classes, $item, $args ) {
if ( 'primary' === $args->theme_location ) {
$classes[] = 'nav-item';
}
return $classes;
}
add_filter( 'nav_menu_css_class', 'fragrance_trade_nav_menu_css_class', 10, 3 );
function fragrance_trade_nav_menu_link_attributes( $atts, $item, $args ) {
if ( 'primary' === $args->theme_location ) {
$atts['class'] = isset( $atts['class'] ) ? $atts['class'] . ' nav-link' : 'nav-link';
}
return $atts;
}
add_filter( 'nav_menu_link_attributes', 'fragrance_trade_nav_menu_link_attributes', 10, 3 );
/**
* Return a cache-busting version for a local theme asset.
*
@@ -54,12 +76,33 @@ function fragrance_trade_enqueue_assets() {
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_localize_script(
'fragrance-theme',
'fragranceTrade',
array(
'motionQuery' => '(prefers-reduced-motion: reduce)',
)
);
}
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 );