Php 仅在WooCommerce中允许客人结帐购买特定产品

Php 仅在WooCommerce中允许客人结帐购买特定产品,php,wordpress,woocommerce,checkout,user-registration,Php,Wordpress,Woocommerce,Checkout,User Registration,以下代码将自定义字段添加到管理产品设置中,以在产品级别管理来宾签出: // Display Guest Checkout Field add_action( 'woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields' ); function woo_add_custom_general_fields() { global $woocommerce, $post; e

以下代码将自定义字段添加到管理产品设置中,以在产品级别管理来宾签出:

// Display Guest Checkout Field

add_action( 'woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields' );
function woo_add_custom_general_fields() {
    global $woocommerce, $post;
  
    echo '<div class="options_group">';
  
    // Checkbox
    woocommerce_wp_checkbox( array( 
        'id'            => '_allow_guest_checkout', 
        'wrapper_class' => 'show_if_simple', 
        'label'         => __('Checkout', 'woocommerce' ), 
        'description'   => __('Allow Guest Checkout', 'woocommerce' ) 
    ) );

  
    echo '</div>';
}

// Save Guest Checkout Field
add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save' );
function woo_add_custom_general_fields_save( $post_id ){
    $woocommerce_checkbox = isset( $_POST['_allow_guest_checkout'] ) ? 'yes' : 'no';
    update_post_meta( $post_id, '_allow_guest_checkout', $woocommerce_checkbox );
}

// Enable Guest Checkout on Certain products
add_filter( 'pre_option_woocommerce_enable_guest_checkout', 'enable_guest_checkout_based_on_product' );
function enable_guest_checkout_based_on_product( $value ) {
    if ( WC()->cart ) {
        $cart = WC()->cart->get_cart();
        foreach ( $cart as $item ) {
            if ( get_post_meta( $item['product_id'], '_allow_guest_checkout', true ) == 'yes' ) {
                $value = "yes";
            } else {
                $value = "no";
                break;
            }
        }
    }
    return $value;
}

//显示来宾签出字段
添加操作(“woocommerce\u product\u options\u general\u product\u data”、“woo\u add\u custom\u general\u fields”);
函数woo_添加_自定义_常规_字段(){
全球$woocmerce,$post;
回声';
//复选框
woocommerce_wp_复选框(数组(
'id'=>'\u允许\u客人\u结帐',
'wrapper\u class'=>'show\u if\u simple',
“标签”=>“‘结帐’、‘woocommerce’”,
'description'=>\('allowguestcheckout','woocommerce')
) );
回声';
}
//保存来宾签出字段
添加操作('woo商业\流程\产品\元','woo \添加\自定义\常规\字段\保存');
函数woo\u添加\自定义\常规\字段\保存($post\u id){
$woocommerce\u checkbox=isset($\u POST['''u allow\u guest\u checkout'])?“是”:“否”;
更新发布元($post\u id,''u allow\u guest\u checkout',$woocommerce\u checkbox);
}
//在某些产品上启用来宾签出
添加过滤器('pre_option_woodcommerce_enable_guest_checkout'、'enable_guest_checkout_based_on_product');
基于产品的功能启用客户结账($value){
如果(WC()->cart){
$cart=WC()->cart->get_cart();
foreach($cart作为$item){
if(get_post_meta($item['product_id'],'u allow_guest_checkout',true)='yes'){
$value=“是”;
}否则{
$value=“否”;
打破
}
}
}
返回$value;
}
但实际上它不起作用。我做错了什么?我怎样才能修好它


我尝试允许客人购买特定产品。管理员自定义字段显示和保存自定义字段值正在工作(前两个功能),但登录/注册从未出现在签出页面上,即使购物车中有不允许客人结账的产品。

过滤器挂钩
基于产品启用客人结账
不再存在,已被另一个稍有不同的挂钩取代

因此,您的代码将是:

add_filter('woocommerce_checkout_registration_required','change_tax_class_user_role',900);
功能更改\u税务\u类别\u用户\u角色($registration\u required){
如果(!WC()->购物车->为空(){
$registration\u required=false;//正在初始化(默认情况下允许来宾签出)
//循环浏览购物车项目
foreach(WC()->cart->get_cart()作为$item){
//检查购物车中是否有任何项目没有“允许客人结账”选项
如果(获取帖子元($item['product\u id'],'u allow\u guest\u checkout',true)!='yes'){
返回true;//找到:强制签出用户注册并退出
}
}
}
返回$registration_(需要时);
}
代码进入活动子主题(或活动主题)的functions.php文件。它应该有效


相关延续:

此代码阻止通过登录页面,但我需要将此代码用于其他功能。现在,我如何才能使标有“\u允许\u客人\u结帐”的产品通过此代码@LoicTheAztec`添加操作('template_redirect'、'checkout_redirect_non_logged_to_login_access');函数签出\重定向\非\登录\访问(){if(is \签出()&&!is \用户\登录\登录()){wp \重定向(get \ permalink(get \选项('woocommerce \ myaccount \ page \ id'));exit;}}`@MusaBaltac\请提出一个新问题,完成后通知我……我问了另一个问题@LoicTheAztec