Wordpress / WooCommerce wp_localize_script 将 php 变量日期添加到 javascript

Posted

技术标签:

【中文标题】Wordpress / WooCommerce wp_localize_script 将 php 变量日期添加到 javascript【英文标题】:Wordpress / WooCommerce wp_localize_script to add php variable date to javascript 【发布时间】:2022-01-14 10:35:15 【问题描述】:

我正在尝试将 WooCommerce 中的优惠券到期信息添加到倒计时 javascript 文件中。在我的 WooCommerce 子主题 functions.php 文件中,我创建了一个变量来获取优惠券到期日期:

$expiry_date = date('Y-m-d H:i:s', strtotime($coupon->expiry_date));

如果我回显它,它正在打印正确的日期echo $expiry_date;

我正在尝试使用以下 javascript 倒数计时器根据此到期日期创建倒数计时器:

// JavaScript Document
// https://www.w3schools.com/howto/howto_js_countdown.asp
// Set the date we're counting down to
var countDownDate = new Date("Jan 5, 2022 15:37:25").getTime();

// Update the count down every 1 second
var x = setInterval(function() 

  // Get today's date and time
  var now = new Date().getTime();
    
  // Find the distance between now and the count down date
  var distance = countDownDate - now;
    
  // Time calculations for days, hours, minutes and seconds
  var days = Math.floor(distance / (1000 * 60 * 60 * 24));
  var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
  var seconds = Math.floor((distance % (1000 * 60)) / 1000);
    
  // Output the result in an element with id="demo"
  document.getElementById("demo").innerhtml = days + "d " + hours + "h "
  + minutes + "m " + seconds + "s ";
    
  // If the count down is over, write some text 
  if (distance < 0) 
    clearInterval(x);
    document.getElementById("demo").innerHTML = "EXPIRED";
  
, 1000);

我已将此脚本保存在我的子主题中,注册并入队,并尝试通过 Wordpress wp_localize_script 方法传递 $expiry_date php 变量

function coupon_countdown_timer ()
    if ( is_cart()) 

        wp_register_script( 'coupon_countdown_timer', get_stylesheet_directory_uri() .'/js/countdown_timer/coupon_expiry.js', array( 'jquery' ), true );
        
        wp_localize_script( 'coupon_countdown_timer', 'my_script_vars', array( 'expiry' => $expiry_date ));
        
        wp_enqueue_script( 'coupon_countdown_timer' );
        
    

add_action('wp_enqueue_scripts', 'coupon_countdown_timer'); 

我现在应该可以使用wp_localize_script 中的my_script_varsexpiry 添加到我的javascript 文件中。但我不确定什么是正确的格式。我尝试过的每件事都返回空白、“EXPIRED”或 NaN 错误。

我已尝试通过这些方式将 php 信息添加到 javascript 文件中,但没有任何效果?

  var expiring = my_script_vars.expiry;
  var countDownDate = new Date(expiring).getTime();

var countDownDate = new Date(my_script_vars.expiry).getTime();

如果我对日期进行硬编码,它可以正常工作。

  var countDownDate = new Date("2021-12-10 00:00:00").getTime();

如果我将所有倒数计时器javascript直接添加到functions.php并以这种方式调用它,那么它也可以正常工作。

var expiry = "<?php echo $expiry_date ?>";
var countDownDate = new Date(expiry).getTime();

但是如果我尝试将 javascript 排入队列,我就无法让它工作。任何想法如何正确格式化?

【问题讨论】:

请添加完整代码,说明您如何通过优惠券到期日期来本地化脚本。 @Bhautik 我正在打印 html 以在购物车页面上输出到期时间&lt;p id="demo"&gt;&lt;/p&gt; 脚本应该选择它以显示倒数计时器。 document.getElementById("demo").innerHTML = days + "d " + hours + "h " + minutes + "m " + seconds + "s "; 但我无法让它工作。我想我没有正确添加来自wp_localize_script 的变量。 我的意思是$expiry_date 来自哪里?请在您的问题中添加完整的代码。 @Bhautik 哦,好的,我知道了,我会发布我正在使用的功能: 【参考方案1】:

好的,我能够得到这个工作,如果其他人遇到这个问题,这可能是一个解决方案。首先,我创建了一个获取优惠券到期日期的新函数。

// Get the coupon expiry date and format
function woo_coupon_expiry_date () 
    
    $applied_coupons = WC()->cart->get_applied_coupons();
    
    foreach( $applied_coupons as $all_coupons ) 
        
        $coupon = new WC_Coupon( $all_coupons );
        $expiry_date = date('Y/m/d H:i:s', strtotime($coupon->expiry_date)); // change hyphens to slashes in date format for compatibility with Safari and ios      
    
    return ($expiry_date);  

然后我在另一个与wp_enqueue_scripts挂钩的函数中调用了这个函数

// Enqueue Scripts and localise for use with Javascript countdown timer
function coupon_countdown_timer ()

    wp_register_script( 'coupon_countdown_timer_js', plugins_url('/js/coupon_expiry.js', __FILE__), array( 'jquery' ), true );
    
    $coupon_expiry = woo_coupon_expiry_date ();
    
    wp_localize_script( 'coupon_countdown_timer_js', 'php_data', array( 'expiry' => $coupon_expiry ));
    
    wp_enqueue_script( 'coupon_countdown_timer_js' );
        

add_action('wp_enqueue_scripts', 'coupon_countdown_timer');

然后我可以通过这种方式在 javascript 倒计时脚本中调用 php 变量 $expiry_date

  var expiring_date = php_data.expiry; 

  var countDownDate = new Date(expiring_date).getTime(); 

【讨论】:

以上是关于Wordpress / WooCommerce wp_localize_script 将 php 变量日期添加到 javascript的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce / Wordpress 将按钮添加到页面

PayPal 与 Woocommerce 集成的应用程序 ID

从哪里开始开发 WordPress / WooCommerce 主题? [关闭]

wordpress中的WooCommerce购物车结帐页面中的国家列表里面怎么修改

从 WordPress 获取 WooCommerce 产品类别

CVE-2019-9168:WordPress WooCommerce XSS漏洞