在WooCommerce中保存并显示产品选择的自定义数据

时间:2019-05-26 19:19:07

标签: wordpress woocommerce

我使用该代码,该代码在产品编辑页面上显示复选框“ Roast Level”。当经理单击此复选框时,单个产品页面上会出现一个选择框,允许客户选择“烤肉等级”。

选择产品并将其添加到购物车时,所选值将显示在购物车本身中。此值还会显示在结帐页面,“谢谢”页面,订单,电子邮件通知以及管理面板中的订单编辑页面上。

代码如下:

// Display Checkbox Field
add_action('woocommerce_product_options_general_product_data', 'roast_custom_field_add');

function roast_custom_field_add() {
    global $post;

    // Checkbox
    woocommerce_wp_checkbox(
            array(
                    'id' => '_roast_checkbox',
                    'label' => __('Roast Level', 'woocommerce'),
                    'description' => __('Enable roast level!', 'woocommerce')
            )
    );
}

// Save Checkbox Field
add_action('woocommerce_process_product_meta', 'roast_custom_field_save');

function roast_custom_field_save($post_id) {
    // Custom Product Checkbox Field
    $roast_checkbox = isset($_POST['_roast_checkbox']) ? 'yes' : 'no';
    update_post_meta($post_id, '_roast_checkbox', esc_attr($roast_checkbox));
}

// Display Select Box
add_action('woocommerce_before_add_to_cart_button', 'add_roast_custom_field', 0);

function add_roast_custom_field() {
    global $product;

    // If is single product page and have the "roast_checkbox" enabled we display the field
    if (is_product() && $product->get_meta('_roast_checkbox') === 'yes') {

            echo '<div>';

            woocommerce_form_field('roast_custom_options', array(
                    'type' => 'select',
                    'class' => array('my-field-class form-row-wide'),
                    'label' => __('Roast Level'),
                    'required' => false,
                    'options' => array(
                            '' => 'Please select',
                            'Blue' => 'Blue',
                            'Rare' => 'Rare',
                            'Medium Rare' => 'Medium Rare',
                            'Medium' => 'Medium',
                            'Medium Well' => 'Medium Well',
                            'Well Done' => 'Well Done'
                    )
            ), '');

            echo '</div>';
    }
}

// Add as custom cart item data
add_filter('woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 10, 3);

function add_custom_cart_item_data($cart_item_data, $product_id, $variation_id) {
    if (isset($_POST['roast_custom_options'])) {
            $cart_item_data['roast_option'] = wc_clean($_POST['roast_custom_options']);
    }
    return $cart_item_data;
}

// Add custom fields values under cart item name in cart
add_filter('woocommerce_cart_item_name', 'roast_custom_field', 10, 3);

function roast_custom_field($item_name, $cart_item, $cart_item_key) {
    if (!is_cart())
            return $item_name;

    if (isset($cart_item['roast_option'])) {
            $item_name. = '<br /><div class="my-custom-class"><strong>'.__("Roast Level", "woocommerce").
            ':</strong> '.$cart_item['roast_option'].
            '</div>';
    }
    return $item_name;
}

// Display roast custom fields values under item name in checkout
add_filter('woocommerce_checkout_cart_item_quantity', 'roast_custom_checkout_cart_item_name', 10, 3);

function roast_custom_checkout_cart_item_name($item_qty, $cart_item, $cart_item_key) {
    if (isset($cart_item['roast_option'])) {
            $item_qty. = '<br /><div class="my-custom-class"><strong>'.__("Roast Level", "woocommerce").
            ':</strong> '.$cart_item['roast_option'].
            '</div>';
    }
    return $item_qty;
}


// Save chosen slelect field value to each order item as custom meta data and display it everywhere
add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_product_fitting_color', 10, 4);

function save_order_item_product_fitting_color($item, $cart_item_key, $values, $order) {
    if (isset($values['_roast_option'])) {
            $key = __('Roast Level', 'woocommerce');
            $value = $values['_roast_option'];
            $item->update_meta_data($key, $value);
    }
}

此代码在Storefront主题中效果很好,但是由于某些原因,在我在Themeforest上购买的主题中,它不起作用。开发人员无法帮助,他们说我需要联系编写此代码的人。这就是为什么...

我还使用在店面和购买的主题中可用的代码。这里是-Show custom fields on the order editing page in WooCommerce ,那些。在这两个主题中效果都很好。

据我了解,这是由于语法“ echo”引起的。该语法以“ Roast Level”的形式显示,因此显示为该形式。在购物车或结帐页面上显示所选数据时,此语法不是。


更新

这是没有“ echo”才能运行的代码:

// Add custom fields values under cart item name in cart
add_filter('woocommerce_cart_item_name', 'roast_custom_field', 10, 3);

function roast_custom_field($item_name, $cart_item, $cart_item_key) {
    if (!is_cart())
            return $item_name;

    if (isset($cart_item['roast_option'])) {
            $item_name. = '<br /><div class="my-custom-class"><strong>'.__("Roast Level", "woocommerce").
        ':</strong> '.$cart_item['roast_option'].
        '</div>';
    }
    return $item_name;
}

// Display roast custom fields values under item name in checkout
add_filter('woocommerce_checkout_cart_item_quantity', 'roast_custom_checkout_cart_item_name', 10, 3);

function roast_custom_checkout_cart_item_name($item_qty, $cart_item, $cart_item_key) {
    if (isset($cart_item['roast_option'])) {
            $item_qty. = '<br /><div class="my-custom-class"><strong>'.__("Roast Level", "woocommerce").
        ':</strong> '.$cart_item['roast_option'].
        '</div>';
    }
    return $item_qty;
}


// Save chosen slelect field value to each order item as custom meta data and display it everywhere
add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_product_fitting_color', 10, 4);

function save_order_item_product_fitting_color($item, $cart_item_key, $values, $order) {
    if (isset($values['_roast_option'])) {
            $key = __('Roast Level', 'woocommerce');
            $value = $values['_roast_option'];
            $item->update_meta_data($key, $value);
    }
}

我要求更改代码,使其语法为“ echo”,以便使用“ echo”输出所选数据。我会很高兴您的帮助!

1 个答案:

答案 0 :(得分:0)

以下代码应正常工作

// Display Checkbox Field
add_action('woocommerce_product_options_general_product_data', 'roast_custom_field_add');

function roast_custom_field_add() {
    global $post;

    // Checkbox
    woocommerce_wp_checkbox(
            array(
                    'id' => '_roast_checkbox',
                    'label' => __('Roast Level', 'woocommerce'),
                    'description' => __('Enable roast level!', 'woocommerce')
            )
    );
}

// Save Checkbox Field
add_action('woocommerce_process_product_meta', 'roast_custom_field_save');

function roast_custom_field_save($post_id) {
    // Custom Product Checkbox Field
    $roast_checkbox = isset($_POST['_roast_checkbox']) ? 'yes' : 'no';
    update_post_meta($post_id, '_roast_checkbox', esc_attr($roast_checkbox));
}

// Display Select Box
add_action('woocommerce_before_add_to_cart_button', 'add_roast_custom_field', 0);

function add_roast_custom_field() {
    global $product;

    // If is single product page and have the "roast_checkbox" enabled we display the field
    if (is_product() && $product->get_meta('_roast_checkbox') === 'yes') {

            echo '<div style="display:block !important;">';

            $selct_list = woocommerce_form_field('roast_custom_options', array(
                    'type' => 'select',
                    'class' => array('my-field-class form-row-wide'),
                    'label' => __('Roast Level'),
                    'required' => false,
                    'return' => true,
                    'options' => array(
                            '' => 'Please select',
                            'Blue' => 'Blue',
                            'Rare' => 'Rare',
                            'Medium Rare' => 'Medium Rare',
                            'Medium' => 'Medium',
                            'Medium Well' => 'Medium Well',
                            'Well Done' => 'Well Done'
                    )
            ), '');

            echo $selct_list;

            echo '</div>';
    }
}

// Add as custom cart item data
add_filter('woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 10, 3);

function add_custom_cart_item_data($cart_item_data, $product_id, $variation_id) {
    if (isset($_POST['roast_custom_options'])) {
            $cart_item_data['roast_option'] = wc_clean($_POST['roast_custom_options']);
    }
    return $cart_item_data;
}

// Add custom fields values under cart item name in cart
add_filter('woocommerce_cart_item_name', 'roast_custom_field', 10, 3);

function roast_custom_field($item_name, $cart_item, $cart_item_key) {
    if (!is_cart())
            return $item_name;

    if (isset($cart_item['roast_option'])) {
            $item_name ='';
            $item_name .= '<br /><div class="my-custom-class"><strong>'.__("Roast Level", "woocommerce").':</strong> '.$cart_item['roast_option'].'</div>';
    }
    return $item_name;
}

// Display roast custom fields values under item name in checkout
add_filter('woocommerce_checkout_cart_item_quantity', 'roast_custom_checkout_cart_item_name', 10, 3);

function roast_custom_checkout_cart_item_name($item_qty, $cart_item, $cart_item_key) {
    if (isset($cart_item['roast_option'])) {
            $item_qty ='';
            $item_qty .= '<br /><div class="my-custom-class"><strong>'.__("Roast Level", "woocommerce").':</strong> '.$cart_item['roast_option'].'</div>';
    }
    return $item_qty;
}


// Save chosen slelect field value to each order item as custom meta data and display it everywhere
add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_product_fitting_color', 10, 4);

function save_order_item_product_fitting_color($item, $cart_item_key, $values, $order) {

    if (isset($values['roast_option'])) {

            $key = __('Roast Level', 'woocommerce');
            $value = $values['roast_option'];
            $item->update_meta_data($key, $value,$item->get_id());
    }
}