使用 php 日期数组的日期选择器中没有禁用日期
No disabled dates in datepicker using php array of dates
我正在尝试从自定义 post 类型的 wordpress 中的日期字段中获取日期,然后将日期传输到数组中。
然后将该数组转换为 js 对象。
该 js 对象在带有 beforeShowDay 的日期选择器中使用,但它不起作用。
我得到了日期选择器,但没有日期不可用。
如果我这样做:
print_r($dates);
在 php 部分我得到:
数组 ([0] => 20200829 [1] => 20200821 )
这是我的代码:
$dates = [];
$args = array('post_type' => 'cus_booking');
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
the_excerpt();
the_field('start_date');
array_push($dates,get_field('start_date'));
endwhile;
?>
<input type="text" id="datepicker">
<script>
<?php
$js_array = json_encode($dates);
echo "var javascript_array = ". $js_array . ";\n";
?>
jQuery(document).ready(function($) {
$("#datepicker").datepicker({
beforeShowDay: function(date){
var string = jQuery.datepicker.formatDate('yy-mm-dd', date);
return [ javascript_array.indexOf(string) == -1 ]
}
}
);
});
</script>
<?php
wp_reset_postdata();
?>
您从 WP-Query 返回的日期看起来像“20200829”,但在您的日期选择器代码中,您试图将它们与 'yy-mm-dd'
格式的日期进行比较,即它们看起来像“2020-08-29”。这些是不同的格式,因此它们永远不会匹配。
您可以:
- 更改日期选择器比较中的日期格式以匹配
WP_Query
日期,方法是使用 yymmdd
格式,如下所示:
var date_to_check = jQuery.datepicker.formatDate('yymmdd', date);
- 从
WP_Query
重新格式化你的日期...通常我不建议这样做,但更常见的是日期有日期分隔符,如果你需要在你的其他地方使用这些日期代码,您可以从一开始就根据需要格式化它们。
在这种情况下,您可以在 PHP 中重新格式化它们,如下所示:
foreach ($dates as $d){
$date = DateTime::createFromFormat('Ymd', $d);
$formatted_dates[] = $date->format('Y-m-d');
}
并且您可以像以前一样在日期选择器中使用它,例如:
<?php echo "var dates_to_disable = ". json_encode($formatted_dates) . ";\n"; ?>
jQuery(document).ready(function($) {
$("#datepicker").datepicker({
beforeShowDay: function(date){
var date_to_check = jQuery.datepicker.formatDate('yy-mm-dd', date);
return [ dates_to_disable.indexOf(date_to_check) == -1 ];
}
});
});
我在回答中包含此选项的主要原因是要强调 PHP 和 jQuery 日期选择器具有不同的格式化日期字符串的方式.
因此,例如在上面的代码中,要使日期看起来像“2020-08-29”:
- PHP 使用格式
Y-m-d
(参见 PHP datetime formats)
- 日期选择器使用格式
yy-mm-dd
(参见 dateformats for datepicker)
我正在尝试从自定义 post 类型的 wordpress 中的日期字段中获取日期,然后将日期传输到数组中。 然后将该数组转换为 js 对象。 该 js 对象在带有 beforeShowDay 的日期选择器中使用,但它不起作用。 我得到了日期选择器,但没有日期不可用。
如果我这样做:
print_r($dates);
在 php 部分我得到: 数组 ([0] => 20200829 [1] => 20200821 )
这是我的代码:
$dates = [];
$args = array('post_type' => 'cus_booking');
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
the_excerpt();
the_field('start_date');
array_push($dates,get_field('start_date'));
endwhile;
?>
<input type="text" id="datepicker">
<script>
<?php
$js_array = json_encode($dates);
echo "var javascript_array = ". $js_array . ";\n";
?>
jQuery(document).ready(function($) {
$("#datepicker").datepicker({
beforeShowDay: function(date){
var string = jQuery.datepicker.formatDate('yy-mm-dd', date);
return [ javascript_array.indexOf(string) == -1 ]
}
}
);
});
</script>
<?php
wp_reset_postdata();
?>
您从 WP-Query 返回的日期看起来像“20200829”,但在您的日期选择器代码中,您试图将它们与 'yy-mm-dd'
格式的日期进行比较,即它们看起来像“2020-08-29”。这些是不同的格式,因此它们永远不会匹配。
您可以:
- 更改日期选择器比较中的日期格式以匹配
WP_Query
日期,方法是使用yymmdd
格式,如下所示:
var date_to_check = jQuery.datepicker.formatDate('yymmdd', date);
- 从
WP_Query
重新格式化你的日期...通常我不建议这样做,但更常见的是日期有日期分隔符,如果你需要在你的其他地方使用这些日期代码,您可以从一开始就根据需要格式化它们。
在这种情况下,您可以在 PHP 中重新格式化它们,如下所示:
foreach ($dates as $d){
$date = DateTime::createFromFormat('Ymd', $d);
$formatted_dates[] = $date->format('Y-m-d');
}
并且您可以像以前一样在日期选择器中使用它,例如:
<?php echo "var dates_to_disable = ". json_encode($formatted_dates) . ";\n"; ?>
jQuery(document).ready(function($) {
$("#datepicker").datepicker({
beforeShowDay: function(date){
var date_to_check = jQuery.datepicker.formatDate('yy-mm-dd', date);
return [ dates_to_disable.indexOf(date_to_check) == -1 ];
}
});
});
我在回答中包含此选项的主要原因是要强调 PHP 和 jQuery 日期选择器具有不同的格式化日期字符串的方式.
因此,例如在上面的代码中,要使日期看起来像“2020-08-29”:
- PHP 使用格式
Y-m-d
(参见 PHP datetime formats) - 日期选择器使用格式
yy-mm-dd
(参见 dateformats for datepicker)