在购物车,结帐,订单等各处显示产品自定义元值

时间:2019-02-18 19:52:42

标签: woocommerce

试图向woocommerce产品的YITH Pre-For Woocommerce免费插件添加“库存日期”功能。

在LoicTheAztec的代码之后,我有以下代码为所有产品添加了日期元。

YITH插件添加了“ _ywpo_preorder”元数据(yith meta,文本:预购产品)。

下面的代码添加“ _preorder_date”元数据(代码元数据,日期:日,月名称,年)。

该代码的问题是,对于标有预购且已设置日期的产品: (yith meta)仅在结帐和管理订单中被(code meta)取代。

否则,根据需要,两个元数据都可以正确显示在商店循环,单个产品,购物车,收到的订单页面和订单电子邮件中。

预购商品标题 预购产品(Yith Meta) 可用:2019年3月25日(代码元)

为什么仅在结帐和(管理员)订单上,YITH元数据丢失了,只剩下日期元数据。 非常感谢您提供帮助,以使这两个meta都可以附加到整个系统中的预购产品中。

/* Add AVAILABLE DATE feature to YITH pre-order FREE plugin */

// create the custom field on product admin tab

add_action( 'woocommerce_product_options_general_product_data', 'create_preorder_product_custom_field' );
function create_preorder_product_custom_field() {
    global $post;
    echo '<div class="options_group">';
    woocommerce_wp_text_input( array(
        'id'            => '_preorder_date',
        'type'          => 'date',
        'label'         => __('Available Date', 'woocommerce' ),
        'placeholder'   =>  '',
    ) );
 echo '</div>';
}

// save the data value from this custom field

add_action( 'woocommerce_process_product_meta', 'save_preorder_custom_field' );
function save_preorder_custom_field( $post_id ) {
    global $post;
    $product_meta_yith = get_post_meta( $post->ID, '_ywpo_preorder',true );
    $wc_text_field = $_POST['_preorder_date'];

    if ( ( $product_meta_yith['meta_value']) === 'y' ) {    
        if ( $wc_text_field ) {
            update_post_meta( $post_id, '_preorder_date', esc_attr( $wc_text_field ) );
        }
    }
    else {
        update_post_meta( $post_id, '_preorder_date', '' ); // If pre-order not checked, clear date.
    }
}

// Store custom field in Cart

add_filter( 'woocommerce_add_cart_item_data', 'store_preorder_custom_field', 10, 2 );
function store_preorder_custom_field( $cart_item_data, $product_id ) {

    $preorder_item = get_post_meta( $product_id , '_preorder_date', true );

    if( !empty($preorder_item) ) {
        $cart_item_data[ '_preorder_date' ] = $preorder_item;
    }
    return $cart_item_data;
}

// Render meta on cart and checkout
add_filter( 'woocommerce_get_item_data', 'rendering_meta_field_on_cart_and_checkout', 10, 2 );
function rendering_meta_field_on_cart_and_checkout( $cart_data, $cart_item ) {
    $custom_items = array();
    // Woo 2.4.2 updates
    if( !empty( $cart_data ) ) {
        $custom_items = $cart_data;
    }

    if( isset( $cart_item['_preorder_date'] ) ) {

        $custom_items[] = array( "name" => __( "Available", "woocommerce" ), "value" => date (("d F Y"), strtotime($cart_item['_preorder_date']) ) );
    }


    return $custom_items;
}

// Add the information in the order as meta data

add_action('woocommerce_add_order_item_meta','add_date_to_order_item_meta', 1, 3 );
function add_date_to_order_item_meta( $item_id, $values, $cart_item_key ) {

    // Retrieving the product id for the order $item_id
    $product_id = wc_get_order_item_meta( $item_id, '_product_id', true );

    // Getting the meta value for this product Id
    $preorder = get_post_meta( $product_id, '_preorder_date', true );

    // Add the meta data to the order
    if ($preorder) {
        $preorder_uk = date("d F Y", strtotime($preorder));
        wc_add_order_item_meta($item_id, 'Available', $preorder_uk, true);
    }
}

// Display AVAILABLE DATE on single product

add_filter( 'woocommerce_get_availability', 'custom_get_availability', 1, 2);
function custom_get_availability( $availability, $_product ) {
  global $post, $product;
  $stock = $product->get_total_stock();

  $product_meta_yith = get_post_meta( $post->ID, '_ywpo_preorder',true );
  $product_meta_date = get_post_meta( $post->ID, '_preorder_date',true );
  $product_meta_date_uk = date("d F Y", strtotime($product_meta_date));


    if ( ( $product_meta_yith['meta_value']) === 'y' ) {
        if ( $_product->is_in_stock() ) { 

            $availability['availability'] = __($stock . ' Left FOR PRE-ORDER', 'woocommerce');

            if  ($product_meta_date) {
                echo 'Available: ' . $product_meta_date_uk;
            }
        }
    }
  return $availability;
}

// Display AVAILABLE DATE on shop loop

add_action( 'woocommerce_before_shop_loop_item_title' , 'fwuk_display_preorder_arrive_date_shop' );
function fwuk_display_preorder_arrive_date_shop ($product) {

  global $post, $product;

  $product_meta_date = get_post_meta( $post->ID, '_preorder_date',true );
  $product_meta_date_uk = date("d F Y", strtotime($product_meta_date));

    if  ($product->is_in_stock()) {
        if  ($product_meta_date) {
                echo '<div class="fwuk-out-of-stock">Available<br />' . $product_meta_date_uk . '</div>';
        }
    }
}

0 个答案:

没有答案