我使用代码片段添加了一个估计交付日期小部件.我想要它显示不同产品的不同发货和交货日期.我可以在WooCommerce产品编辑器上添加自定义域,以便 Select 天数吗?

以下是代码:

add_action( 'woocommerce_after_add_to_cart_form', 
'delivery_status_widget', 40 );
function delivery_status_widget() {
?>
<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();

        // 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() + 2);
        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() + 6);
        deliveryDate = deliveryDate.toLocaleDateString("en-US", { month: 'short', day: 'numeric' });
        document.getElementById("delivery-date").innerHTML = deliveryDate;
    });
</script>
<?php
}

我try 使用此代码添加自定义字段,它添加了以下字段:

function add_custom_fields() {
woocommerce_wp_text_input(
    array(
        'id'          => '_shipping_days',
        'label'       => 'Shipping Days',
        'desc_tip'    => true,
        'description' => 'Enter the number of days required for 
shipping',
        'wrapper_class' => 'form-row form-row-first',
    )
);

woocommerce_wp_text_input(
    array(
        'id'          => '_delivery_days',
        'label'       => 'Delivery Days',
        'desc_tip'    => true,
        'description' => 'Enter the number of days required for 
delivery',
        'wrapper_class' => 'form-row form-row-last',
    )
);
}
add_action( 'woocommerce_product_options_general_product_data', 
'add_custom_fields' );


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

update_post_meta( $post_id, '_shipping_days', $shipping_days );
update_post_meta( $post_id, '_delivery_days', $delivery_days );
}
add_action( 'woocommerce_process_product_meta', 'save_custom_fields' );

我为上面的定制字段try 了这个脚本(但它根本没有显示发货和交付日期,它是空的):

jQuery(document).ready(function($) {
var today = new Date();

// 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() + parseInt(woocommerce_admin_meta_boxes.get_meta_value('_shipping_days')));
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() + parseInt(woocommerce_admin_meta_boxes.get_meta_value('_delivery_days')));
deliveryDate = deliveryDate.toLocaleDateString("en-US", { month: 'short', day: 'numeric' });
document.getElementById("delivery-date").innerHTML = deliveryDate;
});

推荐答案

我已经重新查看了您的所有代码,并删除了不必要的最后一个函数.在第一个函数中,您现在将获得两个产品的自定义字段值,以动态地自动填充您的发货小部件:

add_action( 'woocommerce_after_add_to_cart_form', 'delivery_status_widget', 40 );
function delivery_status_widget() {
    global $product;
    ?>
    <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>
    <?php
        // Get the product "shipping""custom fields values"
        $shipval = $product->get_meta('_shipping_days');
        $delival = $product->get_meta('_delivery_days'); 
    ?>
    <script>
    jQuery(document).ready(function($) {
        var today       = new Date(),
            shipVal     = <?php echo $shipval ? intval( $shipval ) : 2; ?>, // (Default value is "2")
            deliVal     = <?php echo $delival ? intval( $delival ) : 6; ?>; // (Default value is "6")

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

        // Shipped
        var shipDate = new Date(today);
        shipDate.setDate(today.getDate() + shipVal);
        shipDate = shipDate.toLocaleDateString("en-US", { month: 'short', day: 'numeric' });
        $("#ship-date").text(shipDate);

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

add_action( 'woocommerce_product_options_general_product_data', 'add_shipping_custom_fields' );
function add_shipping_custom_fields() {
    
    echo '<div class="options_group product_shipping_custom_fields">';
    
    woocommerce_wp_text_input(
        array(
            'id'          => '_shipping_days',
            'label'       => 'Shipping Days',
            'desc_tip'    => true,
            'description' => 'Enter the number of days required for shipping',
        )
    );

    woocommerce_wp_text_input(
        array(
            'id'          => '_delivery_days',
            'label'       => 'Delivery Days',
            'desc_tip'    => true,
            'description' => 'Enter the number of days required for delivery',
        )
    );
    
    echo '</div>';
}

add_action( 'woocommerce_admin_process_product_object', 'save_shipping_custom_fields' );
function save_shipping_custom_fields( $product ) {
    if ( isset($_POST['_shipping_days']) ) {
        $product->update_meta_data( '_shipping_days', sanitize_text_field( $_POST['_shipping_days'] ) );
    }
    if ( isset($_POST['_delivery_days']) ) {
        $product->update_meta_data( '_delivery_days', sanitize_text_field( $_POST['_delivery_days'] ) );
    }
}

代码放在活动子主题(或活动主题)的函数.php文件中.经过测试,效果良好.

enter image description here

Javascript相关问答推荐

使用expressjs加载Nuxt版本=3.9.0(自定义服务器)

有没有方法在Angular中的bowser选项卡之间移动HTML?

在Chart.js 4.4.2中移动到不同大小的容器时,图表不会调整大小

通过实现regex逻辑自定义数据表搜索

fs. writeFile()vs fs.writeFile()vs fs.appendFile()

我可以使用CSS有效地实现最大宽度=100%和最大高度=100%,而无需父母有明确的/固定的宽度和高度,替代方法吗?

如何在RTK上设置轮询,每24小时

Google Apps脚本中的discord邀请API响应的日期解析问题

我开始使用/url?q=使用Cheerio

在观察框架中搜索CSV数据

在拖放时阻止文件打开

如何将Cookie从服务器发送到用户浏览器

为什么我的导航条打开状态没有在窗口addeventlistener(Reaction Js)中更新?

Chart.js-显示值应该在其中的引用区域

从逗号和破折号分隔的给定字符串中查找所有有效的星期几

如果没有页面重新加载Angular ,innerHTML属性绑定不会更新

无法设置RazorPay订阅API项目价格

Socket.IO在刷新页面时执行函数两次

与在编剧中具有动态价值的定位器交互

react 路由DOM有条件地呈现元素