Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从WooCommerce中的自定义字段在添加到购物车时更新用户元_Php_Wordpress_Woocommerce_Cart_Product - Fatal编程技术网

Php 从WooCommerce中的自定义字段在添加到购物车时更新用户元

Php 从WooCommerce中的自定义字段在添加到购物车时更新用户元,php,wordpress,woocommerce,cart,product,Php,Wordpress,Woocommerce,Cart,Product,我在属于特定类别的单个产品页面上显示一个复选框。在将产品添加到购物车之前,用户必须选中此复选框。我想在选中一个自定义用户元字段并让用户将产品添加到购物车后,使用该复选框的值更新该字段 以下是一个简短的示例: //function to update user meta on add_to_cart if checkbox is checked function checked_meta_add_to_cart(){ //if checkbox is checked if(isse

我在属于特定类别的单个产品页面上显示一个复选框。在将产品添加到购物车之前,用户必须选中此复选框。我想在选中一个自定义用户元字段并让用户将产品添加到购物车后,使用该复选框的值更新该字段

以下是一个简短的示例:

//function to update user meta on add_to_cart if checkbox is checked
function checked_meta_add_to_cart(){
    //if checkbox is checked
    if(isset($_POST['myCheckbox'])){
        //get user id
        $user_id = get_current_user_id();
        //update custom meta field for current user
        update_user_meta( $user_id, 'myMetaField', $_POST['myCheckbox']);

    }
}
//function to display checkbox
function custom_single_checkbox(){
    if(is_user_logged_in() && is_product()){
        global $post;
        //get the current user id
        $user_id = get_current_user_id();
        //get the custom meta field to test if it's been filled already
        $metaField = get_user_meta( $user_id, 'myMetaField', true );
        //get array of the product's categories
        $terms = wp_get_post_terms( $post->ID, 'product_cat' );
        //form an array of category slugs
        foreach ( $terms as $term ) $categories[] = $term->slug;

        // if the product has the specified category and our custom user meta field hasn't been filled
        if ( in_array( 'my-category-slug', $categories ) && $metaField != 'yes') {
            //show our checkbox, note value is "yes" like we checked for above
            echo '<input type="checkbox" id="myCheckbox" name="myCheckbox" value="yes"></input>';
            //add action to update user meta once add to cart is clicked 
            add_action('woocommerce_add_to_cart', 'checked_meta_add_to_cart');

        }
    }
}
add_action('woocommerce_after_add_to_cart_form', 'custom_single_checkbox', 25);
//如果选中复选框,则在添加到购物车时更新用户元的函数
功能已选中\u元\u添加到\u购物车(){
//如果选中复选框
如果(isset($_POST['myCheckbox'])){
//获取用户id
$user\u id=get\u current\u user\u id();
//更新当前用户的自定义元字段
更新_user_meta($user_id,'myMetaField',$_POST['myCheckbox']);
}
}
//用于显示复选框的函数
函数自定义\u单个\u复选框(){
如果(用户是否登录()&&产品是否登录()){
全球$员额;
//获取当前用户id
$user\u id=get\u current\u user\u id();
//获取自定义元字段以测试它是否已被填充
$metaField=get_user_meta($user_id,'myMetaField',true);
//获取产品类别的数组
$terms=wp_get_post_terms($post->ID,'product_cat');
//形成一个类别段塞数组
foreach($terms as$term)$categories[]=$term->slug;
//如果产品具有指定的类别,并且我们的自定义用户元字段尚未填充
if(在数组中('my category slug',$categories)&$metaField!='yes'){
//显示我们的复选框,注意值是“是”,就像我们在上面选中的一样
回声';
//单击“添加到购物车”后,添加更新用户元的操作
添加操作('woocommerce'u add'u to'u cart'、'checked'u meta'u add'u to'u cart');
}
}
}
添加操作(“添加到购物车表单后的woocommerce”和“自定义单个复选框”,25);

显示复选框可以正常工作,但用户元字段在添加到购物车过程后不会更新。起初,我认为这是因为我在向购物车表单添加表单之后使用了
woocommerce\u来显示复选框。但是,在尝试了add\u to\u cart\u表单中的其他钩子之后,它仍然不会更新元字段

以下是使其工作的正确方法,简化一点代码并更改挂钩:

//function to display checkbox
add_action('woocommerce_after_add_to_cart_button', 'custom_single_checkbox', 25);
function custom_single_checkbox(){
    if(is_user_logged_in() && is_product()){
        global $product;

        //get the custom meta field to test if it's been filled already
        $metaField = get_user_meta( get_current_user_id(), 'myMetaField', true );

        // if the product has the specified category and our custom user meta field hasn't been filled
        if( has_term( 'my-category-slug', 'product_cat', get_the_id() ) && $metaField != 'yes' ) {
            //show our checkbox, note value is "yes" like we checked for above
            echo '<input type="checkbox" id="myCheckbox" name="myCheckbox" value="yes"></input>';
        }
    }
}

// Update user metadata on add to cart
add_filter( 'woocommerce_add_cart_item_data', 'checked_on_add_to_cart', 10, 2 );
function checked_on_add_to_cart( $cart_item_data, $product_id ){
    if( isset($_POST['myCheckbox']) && is_user_logged_in() )
        update_user_meta( get_current_user_id(), 'myMetaField', esc_attr($_POST['myCheckbox']) );

    return $cart_item_data;
}
//用于显示复选框的函数
添加操作(“添加到购物车按钮后的woocommerce”按钮、“自定义单个复选框”,25);
函数自定义\u单个\u复选框(){
如果(用户是否登录()&&产品是否登录()){
全球$产品;
//获取自定义元字段以测试它是否已被填充
$metaField=get_user_meta(get_current_user_id(),'myMetaField',true);
//如果产品具有指定的类别,并且我们的自定义用户元字段尚未填充
如果(有术语('mycategory slug','product'u cat',获取\u id())&&&$metaField!='yes'){
//显示我们的复选框,注意值是“是”,就像我们在上面选中的一样
回声';
}
}
}
//在添加到购物车时更新用户元数据
添加过滤器('woocommerce\u add\u cart\u item\u data','checked\u on\u add\u to\u cart',10,2);
功能已在添加到购物车时检查($cart\u item\u data,$product\u id){
if(设置($\u POST['myCheckbox'])和&is\u user\u logged\u in()
更新用户元数据(获取当前用户id(),'myMetaField',esc_attr($\u POST['myCheckbox']);
返回$cart\u item\u数据;
}
代码进入活动子主题(或活动主题)的function.php文件。测试和工作

WordPress条件函数接受术语ID、术语段塞或术语名称(或值数组)


你是个救命恩人,Loic!