You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress/WooCommerce指定商品仅售乌克兰+WPML兼容自定义报错

WooCommerce 境内专属商品结账限制解决方案

以下是可直接添加到主题functions.php的代码片段,已添加详细注释,满足你的需求:

// 检测购物车中是否包含仅乌克兰境内销售的商品
function has_only_ukraine_products_in_cart() {
    // 购物车为空时直接返回false
    if ( WC()->cart->is_empty() ) {
        return false;
    }

    // 遍历购物车所有商品
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        // 获取商品自定义字段值(需在产品编辑页添加键为only_ukraine_sale的字段,值设为yes)
        $only_ukraine = get_post_meta( $product->get_id(), 'only_ukraine_sale', true );
        
        // 找到符合条件的商品则返回true
        if ( $only_ukraine === 'yes' ) {
            return true;
        }
    }

    return false;
}

// 限制结账页账单国家仅显示乌克兰(当购物车含境内专属商品时)
function restrict_billing_country_to_ukraine( $countries ) {
    // 仅在结账页且满足条件时生效
    if ( is_checkout() && has_only_ukraine_products_in_cart() ) {
        // 仅保留乌克兰选项(国家代码UA对应乌克兰)
        return array( 'UA' => $countries['UA'] );
    }

    // 其他情况返回原国家列表
    return $countries;
}
add_filter( 'woocommerce_countries', 'restrict_billing_country_to_ukraine', 10, 1 );

// 获取购物车中所有境内专属商品的名称
function get_only_ukraine_product_names() {
    $product_names = array();

    if ( WC()->cart->is_empty() ) {
        return $product_names;
    }

    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        $only_ukraine = get_post_meta( $product->get_id(), 'only_ukraine_sale', true );
        
        if ( $only_ukraine === 'yes' ) {
            // 收集商品名称
            $product_names[] = $product->get_name();
        }
    }

    // 转为逗号分隔的字符串
    return implode( ', ', $product_names );
}

// 在结账页账单国家字段下方显示可翻译的提示信息
function display_only_ukraine_product_notice() {
    // 仅在结账页且满足条件时显示
    if ( is_checkout() && has_only_ukraine_products_in_cart() ) {
        $product_names = get_only_ukraine_product_names();
        // 使用WPML兼容的翻译函数,替换占位符为商品名称
        // 注意:将textdomain替换为你的主题/插件的文本域(比如主题的文本域可在style.css中找到)
        $notice = sprintf( __( '抱歉,%s无法配送至乌克兰境外', 'textdomain' ), $product_names );
        
        // 输出WooCommerce风格的提示信息
        echo '<div class="woocommerce-error" role="alert">' . esc_html( $notice ) . '</div>';
    }
}
add_action( 'woocommerce_before_checkout_billing_form', 'display_only_ukraine_product_notice', 15 );

使用说明:

  1. 添加代码:登录WordPress后台,进入「外观 > 主题文件编辑器」,找到当前主题的functions.php,将上述代码粘贴到文件末尾;或通过FTP访问主题目录,编辑functions.php文件。
  2. 标记商品:编辑仅乌克兰境内销售的商品,在「自定义字段」区域添加字段:
    • 键:only_ukraine_sale
    • 值:yes
      (若看不到自定义字段,点击右上角「选项」,勾选「自定义字段」即可显示)
  3. WPML翻译:进入WPML的「字符串翻译」界面,查找textdomain对应的字符串,即可进行多语言翻译(记得把代码中的textdomain替换为你主题的实际文本域,可在主题根目录的style.css文件中找到)

内容的提问来源于stack exchange,提问作者Andrii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 13:35:59