如何在非WooCommerce页面移除其样式与脚本?
问题描述
想要在非WooCommerce页面移除WooCommerce加载的脚本与样式,自行在functions.php中编写了代码但未生效。排查后发现,WooCommerce注册脚本时使用的add_action未设置优先级(默认优先级为10),相关代码如下:
add_action( 'wp_enqueue_scripts', array( __CLASS__, 'load_scripts' ) );
尝试的代码:
/** * Manage WooCommerce styles and scripts. */ function grd_woocommerce_script_cleaner() { // Remove the generator tag remove_action( 'wp_head', array( $GLOBALS['woocommerce'], 'generator' ) ); // Unless we're in the store, remove all the cruft! if ( ! is_woocommerce() && ! is_cart() && ! is_checkout() ) { wp_dequeue_style( 'woocommerce_frontend_styles' ); wp_dequeue_style( 'woocommerce-general'); wp_dequeue_style( 'woocommerce-layout' ); wp_dequeue_style( 'woocommerce-smallscreen' ); wp_dequeue_style( 'woocommerce_fancybox_styles' ); wp_dequeue_style( 'woocommerce_chosen_styles' ); wp_dequeue_style( 'woocommerce_prettyPhoto_css' ); wp_dequeue_script( 'selectWoo' ); wp_deregister_script( 'selectWoo' ); wp_dequeue_script( 'wc-add-payment-method' ); wp_dequeue_script( 'wc-lost-password' ); wp_dequeue_script( 'wc_price_slider' ); wp_dequeue_script( 'wc-single-product' ); wp_dequeue_script( 'wc-add-to-cart' ); wp_dequeue_script( 'wc-cart-fragments' ); wp_dequeue_script( 'wc-credit-card-form' ); wp_dequeue_script( 'wc-checkout' ); wp_dequeue_script( 'wc-add-to-cart-variation' ); wp_dequeue_script( 'wc-single-product' ); wp_dequeue_script( 'wc-cart' ); wp_dequeue_script( 'wc-chosen' ); wp_dequeue_script( 'woocommerce' ); wp_dequeue_script( 'prettyPhoto' ); wp_dequeue_script( 'prettyPhoto-init' ); wp_dequeue_script( 'jquery-blockui' ); wp_dequeue_script( 'jquery-placeholder' ); wp_dequeue_script( 'jquery-payment' ); wp_dequeue_script( 'fancybox' ); wp_dequeue_script( 'jqueryui' ); } } add_action( 'wp_enqueue_scripts', 'grd_woocommerce_script_cleaner', 999 );
解决方案
问题核心是执行时机不对——虽然你设置了999的优先级,但部分WooCommerce资源可能在wp_enqueue_scripts钩子后仍会加载,且逐个dequeue的方式不够彻底。更可靠的做法是先移除WooCommerce默认的资源加载动作,再仅在需要的页面重新启用:
/** * 仅在WooCommerce相关页面加载脚本与样式 */ function grd_conditionally_load_woocommerce_assets() { // 移除WooCommerce默认的脚本加载动作 remove_action( 'wp_enqueue_scripts', array( WC_Frontend_Scripts::class, 'load_scripts' ) ); // 仅在WooCommerce页面重新加载资源 if ( is_woocommerce() || is_cart() || is_checkout() || is_account_page() ) { add_action( 'wp_enqueue_scripts', array( WC_Frontend_Scripts::class, 'load_scripts' ) ); } // 移除generator标签 remove_action( 'wp_head', array( $GLOBALS['woocommerce'], 'generator' ) ); } // 优先级设为9,确保在WooCommerce注册动作之前执行 add_action( 'wp_enqueue_scripts', 'grd_conditionally_load_woocommerce_assets', 9 );
补充说明
- 优先级设为9:WooCommerce默认用优先级10注册
load_scripts,我们需要在它之前执行remove_action才能生效。 - 新增
is_account_page():覆盖「我的账户」页面,避免该页面样式或脚本丢失。 - 这种方式比逐个dequeue更高效,能彻底阻止WooCommerce在非目标页面加载任何不必要的资源。
内容的提问来源于stack exchange,提问作者Sandeep Kumar
相关产品推荐
相关产品推荐

