如果订单中的产品属于 WooCommerce 中的某个类别,如何自动创建帐户

2023-12-03

我有一家 WooCommerce 商店,顾客以客人身份结账。我现在想出售一些虚拟产品,在这种情况下我想自动创建一个帐户。

所以我有两个工作代码片段。

  • 用于检查购物车中的产品是否属于特定类别(在线)
  • 一种是从客人结账时自动创建帐户。

但我不知道如何将这两者结合起来,以便它们一起工作。或者这是一个更好的解决方案?有任何想法吗?

这是我开始使用的两个代码片段,然后尝试将其合并为一个函数。

Source: 使用 WooCommerce 检查购物车项目中的产品类别

add_action('woocommerce_before_cart', 'action_before_cart');
function action_before_cart() {
    $categories   = array('online');
    $has_category = false;

    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // Check for product categories
        if ( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
            $has_category = true;
            break;
        }
    }

    // Testing output (display a notice)
    if ( $has_category ) { 
        wc_print_notice( sprintf( 'Product category "%s" is in cart!', reset($categories)), 'notice' );
    }
}

Source: 在 Woocommerce 中以编程方式发送重置密码电子邮件通知

function wc_register_guests( $order_id ) {
  // get all the order data
  $order = new WC_Order($order_id);
  
  //get the user email from the order
  $order_email = $order->billing_email;
    
  // check if there are any users with the billing email as user or email
  $email = email_exists( $order_email );  
  $user = username_exists( $order_email );
  
  // if the UID is null, then it's a guest checkout
  if( $user == false && $email == false ){
    
    // random password with 12 chars
    $random_password = wp_generate_password();
    
    // create new user with email as username & newly created pw
    $user_id = wp_create_user( $order_email, $random_password, $order_email );
    
    //WC guest customer identification
    update_user_meta( $user_id, 'guest', 'yes' );
 
    //user's billing data
    update_user_meta( $user_id, 'billing_address_1', $order->billing_address_1 );
    update_user_meta( $user_id, 'billing_address_2', $order->billing_address_2 );
    update_user_meta( $user_id, 'billing_city', $order->billing_city );
    update_user_meta( $user_id, 'billing_company', $order->billing_company );
    update_user_meta( $user_id, 'billing_country', $order->billing_country );
    update_user_meta( $user_id, 'billing_email', $order->billing_email );
    update_user_meta( $user_id, 'billing_first_name', $order->billing_first_name );
    update_user_meta( $user_id, 'billing_last_name', $order->billing_last_name );
    update_user_meta( $user_id, 'billing_phone', $order->billing_phone );
    update_user_meta( $user_id, 'billing_postcode', $order->billing_postcode );
    update_user_meta( $user_id, 'billing_state', $order->billing_state );
 
    // user's shipping data
    update_user_meta( $user_id, 'shipping_address_1', $order->shipping_address_1 );
    update_user_meta( $user_id, 'shipping_address_2', $order->shipping_address_2 );
    update_user_meta( $user_id, 'shipping_city', $order->shipping_city );
    update_user_meta( $user_id, 'shipping_company', $order->shipping_company );
    update_user_meta( $user_id, 'shipping_country', $order->shipping_country );
    update_user_meta( $user_id, 'shipping_first_name', $order->shipping_first_name );
    update_user_meta( $user_id, 'shipping_last_name', $order->shipping_last_name );
    update_user_meta( $user_id, 'shipping_method', $order->shipping_method );
    update_user_meta( $user_id, 'shipping_postcode', $order->shipping_postcode );
    update_user_meta( $user_id, 'shipping_state', $order->shipping_state );
    
    // link past orders to this newly created customer
    wc_update_new_customer_past_orders( $user_id );
  }
  
}
 
//add this newly created function to the thank you page
add_action( 'woocommerce_thankyou', 'wc_register_guests', 10, 1 ); 

我不会自动创建帐户。我会确保只要没有帐户就无法下订单。 (如果购物车中存在该特定产品)。

WooCommerce 中已提供帐户的创建和相关操作(例如电子邮件等)。

否则,您将不得不为其编写额外的代码,并且您很快就会发现总是缺少一些选项(例如发送带有用户密码的电子邮件),需要您编写更多的额外代码。简而言之,尽可能保持简单。


But 因为您的问题是关于您自己创建帐户,您可以使用以下代码来完成此操作

  • 通过代码中添加的注释标签进行解释
  • wp_insert_user()- 将用户插入数据库
function wc_register_guests( $order_id ) {
    // Determines whether the current visitor is a logged in user.
    if( is_user_logged_in() ) return;
    
    // Get $order object
    $order = wc_get_order( $order_id );
    
    // Get the user email from the order
    $order_email = $order->billing_email;

    // Check if there are any users with the billing email as user or email
    $email = email_exists( $order_email );  
    $user = username_exists( $order_email );

    // If the UID is null, then it's a guest checkout (new user)
    if( $user == false && $email == false ) {
        // Check on category ( multiple categories can be entered, separated by a comma )
        $categories = array( 'online', 'categorie-1' );

        // Flag
        $has_category = false;
        
        // Loop through order items
        foreach ( $order->get_items() as $item_key => $item ) {
            if ( has_term( $categories, 'product_cat', $item['product_id'] ) ) {
                $has_category = true;
                break;
            }
        }
        
        // True
        if ( $has_category ) {
            // Random password with 12 chars
            $random_password = wp_generate_password();
            
            // Firstname
            $first_name = $order->get_billing_first_name();
            
            // Lastname
            $last_name = $order->get_billing_last_name();
            
            // Role
            $role = 'customer';

            // Create new user with email as username, newly created password and userrole          
            $user_id = wp_insert_user(
                array(
                    'user_email' => $order_email,
                    'user_login' => $order_email,
                    'user_pass'  => $random_password,
                    'first_name' => $first_name,
                    'last_name'  => $last_name,
                    'role'       => $role,
                )
            );

            // (Optional) WC guest customer identification
            update_user_meta( $user_id, 'guest', 'yes' );

            // User's billing data
            update_user_meta( $user_id, 'billing_address_1', $order->billing_address_1 );
            update_user_meta( $user_id, 'billing_address_2', $order->billing_address_2 );
            update_user_meta( $user_id, 'billing_city', $order->billing_city );
            update_user_meta( $user_id, 'billing_company', $order->billing_company );
            update_user_meta( $user_id, 'billing_country', $order->billing_country );
            update_user_meta( $user_id, 'billing_email', $order->billing_email );
            update_user_meta( $user_id, 'billing_first_name', $order->billing_first_name );
            update_user_meta( $user_id, 'billing_last_name', $order->billing_last_name );
            update_user_meta( $user_id, 'billing_phone', $order->billing_phone );
            update_user_meta( $user_id, 'billing_postcode', $order->billing_postcode );
            update_user_meta( $user_id, 'billing_state', $order->billing_state );

            // User's shipping data
            update_user_meta( $user_id, 'shipping_address_1', $order->shipping_address_1 );
            update_user_meta( $user_id, 'shipping_address_2', $order->shipping_address_2 );
            update_user_meta( $user_id, 'shipping_city', $order->shipping_city );
            update_user_meta( $user_id, 'shipping_company', $order->shipping_company );
            update_user_meta( $user_id, 'shipping_country', $order->shipping_country );
            update_user_meta( $user_id, 'shipping_first_name', $order->shipping_first_name );
            update_user_meta( $user_id, 'shipping_last_name', $order->shipping_last_name );
            update_user_meta( $user_id, 'shipping_method', $order->shipping_method );
            update_user_meta( $user_id, 'shipping_postcode', $order->shipping_postcode );
            update_user_meta( $user_id, 'shipping_state', $order->shipping_state );

            // Link past orders to this newly created customer
            wc_update_new_customer_past_orders( $user_id );
        }
    }  
}
add_action( 'woocommerce_thankyou', 'wc_register_guests', 10, 1 ); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果订单中的产品属于 WooCommerce 中的某个类别,如何自动创建帐户 的相关文章

  • 如何使 WordPress 中的自定义模板充当受密码保护的页面?

    我正在使用自定义模板构建一个页面 问题是 我需要此页面受密码保护 或者至少可供登录用户访问 但即使我在 WordPress 管理的新页面部分中将其设置为此类 私人 密码保护 它也不会显示菜单项和内容 如果是私有的 或者它会立即显示页面内容
  • WordPress Symfony 共存

    我们有一个在 Symfony 上运行的网站 它是由比我更有能力的人开发的 不过 我对 WordPress 非常熟悉 并将在该网站上安装一个博客 目前 该网站的根运行在 Symfony 上 但我希望 WordPress 能够接管 而不必触及
  • Woocommerce 预订中每人和每件商品的动态结账自定义字段

    对于预订网站 我正在尝试创建一个功能 可以根据人数添加与会者列表 感谢 LoicTheAztec 我已经获得了单次预订的代码 那部分工作正常 我还需要相同的功能来进行多次预订 我怎样才能实现这个目标 这是代码 Add a new check
  • 如何在 Woocommerce 2.5.2 中显示“wordpress 页面中的类别产品下拉菜单”

    我想显示某个类别中产品的下拉菜单
  • WordPress 管理栏未显示在网站前端

    请问有人可以帮我解决这个问题吗 WordPress 管理栏未显示在我网站的前端 公共可见页面 上 它显示我何时在后端登录 即仪表板 用户设置正常 设置为在查看站点时显示管理栏 我尝试停用 然后重新激活 已安装的插件 但仍然没有显示 只是背景
  • 在 Woocommerce 的单个产品页面上显示特定的自定义产品属性

    我找到了以下代码 https isabelcastillo com woocommerce product attributes functions在产品详细信息页面上显示所有自定义属性 具有我需要的特定条形设计 代码的工作方式就像一个魅力
  • Woocommerce 中的 Ajaxify 标头购物车项目计数

    我正在为 WordPress 创建一个自定义 woocommerce 集成主题 我在顶部有一个 blob 显示购物车中的商品总数 我想使用 Jquery 更新此 blob 无需重新加载页面 我能够通过获取购物车中的当前数量来增加商品数量bl
  • 带有 .htaccess 的漂亮网址?

    我刚刚创建了一个新的 WordPress 页面模板 在其中运行一些 php mysql 脚本 我想对其子页面应用 mod 重写 例如我生成了以下链接 http www quotist com quotes by authors html l
  • 替代 header("Content-type: text/xml");

    是否存在与以下内容等效的内容 header Content type text xml 我将 Google 地图与 Wordpress 一起使用 但收到 标头已发送 错误 我已经检查了所有文件并删除了所有空白 但错误仍然出现 所以只是想知道
  • 如何为 WordPress 创建子插件

    实际上我已经更改了 WordPress Store Locator 中的一些代码 我希望在插件更新时保留它 所以我想为此创建一个子插件 关于我如何管理它有什么想法吗 这因插件而异 有时甚至是不可能的 其他时候插件有文档可以轻松扩展它们 例如
  • WordPress WooCommerce - 使用 WC_Cart 类将可变产品添加到购物车

    我正在尝试将可变产品添加到 WordPress 插件 WooCommerce 的购物车中 到目前为止 我已经能够添加单一 简单的产品 woocommerce gt cart gt add to cart product id quantit
  • Woocommerce 获取产品

    我使用以下代码从我的 WordPress 网站中的 WooCommerce 获取产品类别列表
  • 任何插件安装失败 - 无法复制文件错误

    每次我安装一个新的 WordPress 插件时 它都会说无法复制文件和文件地址 有谁知道为什么会这样 我遇到了同样的问题 但就我而言 我是使用 FTP 进行更新 我通过将主机名设置为 localhost 而不是使用 IP 来修复此问题 这是
  • Wordpress - 排除某个类别出现在菜单或侧边栏小部件中

    是否有一个简单的解决方案 例如插件 来排除菜单或侧边栏中出现的类别 我创建了一个名为 视频 的帖子类别 它显示 YouTube 视频 自然 但后来我意识到它们显示在我的 最近帖子 侧边栏中 我正在寻找一种简单的方法来排除它们 任何想法将不胜
  • Woocommerce,基于短代码的产品列表上的排序下拉列表

    在我们的商店里 我们有许多标准的 WP 页面 在这些页面上 我们使用标准 Woocommerce 短代码展示了约 40 种产品 例如 product category category boots per page 20 columns 4
  • 如何使用额外标记输出 wp_list_categories

    我目前正在使用下面的脚本在无序列表中输出我的所有 WordPress 类别 如何获得带有额外标记的输出 ul ul 例如 ul li Category 1 rsaquo li li Category 2 rsaquo li ul 代替 ul
  • 在 WordPress 中获取作者角色

    我正在开发我的第一个 WP 网站 需要在其帖子旁边显示作者的角色 类似于 吉米 管理员 查看可用的作者元数据 http codex wordpress org Function Reference the author meta http
  • 按类别 ID 获取产品

    我正在为 woocommerce 编写一个定价表插件 用户插入带有 woocommerce 产品类别 ID 的短代码 更新页面后 用户可以看到一个包含产品名称和价格列表的表格 我怎样才能获得带有类别ID的产品列表 在下面的代码中 pid是用
  • meta_query,如何使用关系 OR 和 AND 进行搜索?

    已解决 请参阅下面的答案 我有一个名为的自定义帖子类型BOOKS 它有几个自定义字段 名称为 TITLE AUTHOR GENRE RATING 我该如何修复我的meta query下面的代码以便仅books在自定义字段中包含搜索词 tit
  • 自定义帖子类型的 WordPress 自定义字段

    过去有几个人出现过这个问题 但他们的问题的解决方案对我来说不起作用 我已经尝试了很多 在 WordPress 中 我创建了 3 种自定义帖子类型 1 代表 视频 新闻 和 音乐 每个内容都发布到自己的页面 我想添加自定义字段 这样我就可以为

随机推荐