只要你想定制WooCommerce的标准功能或结账页面,避免不了在function.php(子主题)中保存一个或多个WooCommerce的片段代码。以下是我们对WooCommerce片段的概述,其中一些片段我们也在网站上使用。顺便说一下,大部分的片段都来自于目前的WooCommerce文档。

测试使用 兼容性

  • WordPress版本6.0x
  • WooCommerce版本6.7x
  • PHP 版本8.1x

你可以将这些片段复制到你启用的WordPress主题中,或者为这个网站创建一个特定站点的插件。function.php

请注意。在对 functions.php 进行任何修改之前,请对文件进行备份。不要通过WordPress编辑器来改变该文件。如果出了问题,你将不再有机会访问你的网站。通过FTP访问直接在你的虚拟主机上添加你的内容。

1.WooCommerce将客户在订购后重新引导到他们自己的感谢页面

你可能想在订购后将你的客户重定向到他们自己的感谢页面。你可以通过以下WooCommerce片段来实现这一目标。

/** 通过创建一个重定向来定制WooCommerce感谢页面
*@来源:tychesoftwares.com/how-to-customize-the-woocommerce-thank-you-page/
*/
add_action( 'template_redirect', 'woo_custom_redirect_after_purchase' );
function woo_custom_redirect_after_purchase() {
  global $wp;
  if ( is_checkout() && !empty( $wp->query_vars['order-received'] ) ) {
    wp_redirect( 'https://www.deine-website.de/neu-danke-seite/' );
    exit;
  }
}

2.改变一行中显示的产品数量

默认情况下,WooCommerce在一排显示四个产品。你可以很容易地改变这显示。

/**
* 将每行的产品数量改为3个 
*/
add_filter( 'loop_shop_columns', 'loop_columns', 999 );
function loop_columns() {
  return 3; // 3个产品
}

3.改变类似产品的数量

你可以自己决定你的主题显示多少个 “相关产品”。这有时非常实用。

/**
* 相关产品产出数量的变化
* @来源 woocommerce.com/document/change-number-of-related-products-output/
*/

function woo_related_products_limit() {
  global $product;
  $args['posts_per_page'] = 6;
  return $args;
}
add_filter( 'woocommerce_output_related_products_args', 'jk_related_products_args', 20 );
function jk_related_products_args( $args ) {
  $args['posts_per_page'] = 4; // 4个相关产品
  $args['columns'] = 2; // 排成2列
  return $args;
}

4.确定在一个页面上应该显示多少个产品

在某些情况下,如果必须一次检索太多的产品,可能会使WordPress数据库超载。然后游客可能会看到 “重定向过多” 的错误,这取决于服务器配置。一个简单的解决方案是减少每页的产品数量,这可以通过以下WooCommerce片段来实现。

/* 改变产品页面的数量
 * @来源: wordpress.org/support/topic/change-number-of-products-per-page-2/
 */
add_filter( 'loop_shop_per_page', 'wc_redefine_products_per_page', 9999 );
function wc_redefine_products_per_page( $per_page ) {
  $per_page = 9; // 9个产品在一个页面上
  return $per_page;
}

5.如果显示免费送货,则隐藏其他送货方式

你是否为你的客户提供产品的免费送货服务?那么你应该使用这个代码,因为WooCommerce在结账区显示所有的运输方式。

/**
 * 在有免费运输的情况下,隐藏运输费。
 * @来源: woocommerce.com/document/hide-other-shipping-methods-when-free-shipping-is-available/
 *
 * @param array $rates Array of rates found for the package.
 * @return array
 */
function my_hide_shipping_when_free_is_available( $rates ) {
	$free = array();
	foreach ( $rates as $rate_id => $rate ) {
		if ( 'free_shipping' === $rate->method_id ) {
			$free[ $rate_id ] = $rate;
			break;
		}
	}
	return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100 );

6.WordPress性能:只在商店页面加载WooCommerce的CSS和JavaScript文件

WooCommerce在你网站的每一个页面上加载它的文件,包括主页、页面和帖子。首先,这没有意义,其次它使你的网站更慢。它确保WooCommerce文件只在需要的地方被加载。在任何情况下,必须对非商店页面的功能进行广泛的测试,特别是如果你在所有的页面上都包含一个购物车。

/**
* 优化WooCommerce脚本
* 移除非WooCommerce页面的WooCommerce样式和脚本.
* @来源 brad-holmes.co.uk/5-most-used-woocomerce-snippets/
*/  
if (!function_exists( 'woo_manage_woocommerce_styles' ) ) :
function manage_woocommerce_styles() {
    //first check that woo exists to prevent fatal errors
    if ( function_exists( 'is_woocommerce' ) ) {
        //dequeue scripts and styles
        if ( ! is_woocommerce() && ! is_cart() && ! is_checkout() && ! is_account_page() ) {          
            wp_dequeue_style( 'woocommerce-layout' );
            wp_dequeue_style( 'woocommerce-smallscreen' )
            wp_dequeue_style( 'woocommerce-general' );
            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-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( 'fancybox' );
            wp_dequeue_script( 'jqueryui' );
        }
    }
}
add_action( 'wp_enqueue_scripts', 'manage_woocommerce_styles', 99 );
endif;

7.WooCommerce结账:让电话号码成为可选输入项

在结账时,电话号码被默认设置为一个强制性的字段。一些客户可能不喜欢这样。因此,下面的片段确保这些信息是可选的。

if (!function_exists( 'phone_no_pflicht' ) ) :
/**
 * 让电话号码成为一个可选的条目
 * @hooked woocommerce_billing_fields()
 * @return filter
 */
function phone_no_pflicht( $address_fields ) {
  
    $address_fields['billing_phone']['required'] = false;
    return $address_fields;
}
add_filter( 'woocommerce_billing_fields', 'phone_no_pflicht', 10, 1 );
endif;

另外,你也可以用这个WooCommerce片段使电话框完全消失。

/* 下面的代码删除了WooCommerce结账电话字段 */
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
function custom_override_checkout_fields( $fields ) {
  unset($fields['billing']['billing_phone']);
  return $fields;
}

8.限制购物车中的产品数量

特别是像 “网络资源” 虚拟产品或订阅产品,将可购买的产品数量限制为 “1” 是有意义的。这可以通过以下WooCommerce片段来完成。

/**
* @代码段 WooCommerce Max 1 Product @ Cart
* @作者 Rodolfo Melogli
* @兼容 Woo 4.6
*/
add_filter( 'woocommerce_add_to_cart_validation', 'bbloomer_only_one_in_cart', 99, 2 );
function bbloomer_only_one_in_cart( $passed, $added_product_id ) {
  wc_empty_cart();
  return $passed;
}

9.移除产品视图上的产品标签

这些标签可以单独或一起移除,这有时为界面显示友好。

if (!function_exists( 'remove_product_tabs' ) ) :
/**
 * 我们从描述中删除产品标签
 * 
@hooked woocommerce_product_tabs()
 */
function remove_product_tabs( $tabs ) {
    unset( $tabs['description'] );      	// 删除描述标签
    unset( $tabs['reviews'] ); 		// 删除评论标签
    unset( $tabs['additional_information'] );  // 移除附加信息标签
    return $tabs;
}
add_filter( 'woocommerce_product_tabs', 'remove_product_tabs', 98 );
endif;

10.在主题中显示用户账户的链接

如果用户没有登录,该链接显示 “登录/注册”,并使用登录/注册页面。如果用户已经登录,该链接会显示 “我的账户”,并将他们直接带到他们的用户账户。

/* 如果用户已经登录,显示 "我的账户"。
 * @来源:   silicondales.com/tutorials/woocommerce/display-woocommerce-account-page-link-logged-users-login-register-link-not-logged/
 */
<?php if ( is_user_logged_in() ) { ?>
 	<a href="<?php echo get_permalink( get_option('woocommerce_myaccount_page_id') ); ?>" title="<?php _e('My Account','woocommerce'); ?>"><?php _e('My Account','woocommerce'); ?></a>
 <?php } 
 else { ?>
 	<a href="<?php echo get_permalink( get_option('woocommerce_myaccount_page_id') ); ?>" title="<?php _e('Login / Register','woocommerce'); ?>"><?php _e('Login / Register','woocommerce'); ?></a>
<?php } ?>

归类于: