You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce动态配送日期小工具:自定义字段适配问题求助

解决WooCommerce商品前端无法获取自定义字段计算配送日期的问题

问题原因

你之前的JS代码错误使用了woocommerce_admin_meta_boxes.get_meta_value——这个对象和方法仅在WooCommerce后台商品编辑页面可用,前端商品详情页根本不存在该变量,导致无法获取自定义字段值,parseInt()会得到NaN,日期计算失效,最终显示为空。


解决方案

需要在PHP的delivery_status_widget函数中先获取当前商品的自定义字段值,再传递给前端JS,同时处理字段为空的默认值情况。

修改后的完整delivery_status_widget代码

add_action( 'woocommerce_after_add_to_cart_form', 'delivery_status_widget', 40 );
function delivery_status_widget() {
    global $product;
    
    // 获取当前商品自定义字段值,为空则设置默认天数
    $shipping_days = get_post_meta( $product->get_id(), '_shipping_days', true );
    $shipping_days = empty($shipping_days) ? 2 : intval($shipping_days);
    
    $delivery_days = get_post_meta( $product->get_id(), '_delivery_days', true );
    $delivery_days = empty($delivery_days) ? 6 : intval($delivery_days);
?>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.14.0/css/all.css">
<style>
    .delivery-status-widget {
        display: flex;
        flex-direction: row;
        justify-content: space-evenly;
        align-items: center;
        font-size: 13px; 
        margin-bottom: 10px;
        line-height: 15px;
        padding: 14px 10px;
        color: #121212;
        background-color: white;
        border: 1px dotted black;
        color: #121212;
        border-radius: 6px;
    }
    .delivery-status-widget .status {
        display: flex;
        flex-direction: column;
        align-items: center;
        margin: 0 15px;
    }
    .delivery-status-widget .status-icon {
        font-size: 24px;
        margin-bottom: 5px;
        color: #121212!important;
    }
    .delivery-status-widget .status-text {
        font-weight: bold;
        margin-bottom: 5px;
    }
    .delivery-status-widget .status-date {
        font-size: 12px;
        color: gray;
    }
</style>

<div class="delivery-status-widget">
    <div class="status">
        <i class="fas fa-shopping-bag status-icon" style="color: gray;"></i>
        <div class="status-text">Ordered</div>
        <div class="status-date" id="order-date"></div>
    </div>
    <div class="status">
        <i class="fas fa-angle-double-right"></i>
    </div>
    <div class="status">
        <i class="fas fa-shipping-fast status-icon" style="color: grey;"></i>
        <div class="status-text">Shipped</div>
        <div class="status-date" id="ship-date"></div>
    </div>
    <div class="status">
        <i class="fas fa-angle-double-right"></i>
    </div>
    <div class="status">
        <i class="fas fa-box-open status-icon" style="color: grey;"></i>
        <div class="status-text">Delivered</div>
        <div class="status-date" id="delivery-date"></div>
    </div>
</div>

<script>
    jQuery(document).ready(function($) {
        var today = new Date();
        // 接收PHP传递的天数
        var shippingDays = <?php echo $shipping_days; ?>;
        var deliveryDays = <?php echo $delivery_days; ?>;

        // Ordered
        var orderedDate = today.toLocaleDateString("en-US", { month: 'short', day: 'numeric' });
        document.getElementById("order-date").innerHTML = orderedDate;

        // Shipped
        var shipDate = new Date(today);
        shipDate.setDate(today.getDate() + shippingDays);
        shipDate = shipDate.toLocaleDateString("en-US", { month: 'short', day: 'numeric' });
        document.getElementById("ship-date").innerHTML = shipDate;

        // Delivered
        var deliveryDate = new Date(today);
        deliveryDate.setDate(today.getDate() + deliveryDays);
        deliveryDate = deliveryDate.toLocaleDateString("en-US", { month: 'short', day: 'numeric' });
        document.getElementById("delivery-date").innerHTML = deliveryDate;
    });
</script>
<?php
}

可选优化:自定义字段保存代码升级

原代码使用的woocommerce_process_product_meta钩子已被弃用,建议替换为最新的woocommerce_admin_process_product_object钩子,修改后的保存代码:

function save_custom_fields( $product ) {
    $shipping_days = isset( $_POST['_shipping_days'] ) ? sanitize_text_field( $_POST['_shipping_days'] ) : '';
    $delivery_days = isset( $_POST['_delivery_days'] ) ? sanitize_text_field( $_POST['_delivery_days'] ) : '';

    $product->update_meta_data( '_shipping_days', $shipping_days );
    $product->update_meta_data( '_delivery_days', $delivery_days );
}
add_action( 'woocommerce_admin_process_product_object', 'save_custom_fields' );

内容的提问来源于stack exchange,提问作者chirag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:07:36