PHP Wordpress日历跳过2月

时间:2015-01-30 19:48:10

标签: php jquery

将高级自定义字段与Date Time Piker的附加组件一起使用,我使用年,日,时间(上午和下午)的信息填充日历。

在日历列表页面上,我有一个查询,由于某种原因,它会跳过2月并重复3月两次。

以下是代码:

<?php
                $today = date('Ymd h:i:s a', time() - 60 * 60 * 24);

                    #start from current month. Change 2 to however months ahead you want
                    for ($x=0; $x<=6; $x++) {

                        $date = new DateTime("$x months");
                        $date->modify("-" . ($date->format('j')-1) . " days");
                        #echo $date->format('j, m Y');  
                        $month =  $date->format('m');
                        $year =  $date->format('Y');    
                        #echo 'Month= '.$month .' Year= '.$year.' <br>'; #debug

                        $rows = $wpdb->get_results($wpdb->prepare( 
                            "
                            SELECT * 
                            FROM wp_postmeta
                            WHERE meta_key LIKE %s
                                AND meta_value LIKE %s
                                ORDER BY meta_value ASC
                            ",
                            'show_date_time_%_show_date', // meta_name: $ParentName_$RowNumber_$ChildName
                            #''.$year.''.$month.'%' // meta_value: 20131031 for example
                            ''.$year.''.$month.'%' // meta_value: 20131031 for example
                        ));

                        // loop through the results
                        if( $rows ) {
                            echo '<div class="month">';
                            echo '<h2>'.$date->format('F').' '.$date->format('Y').'</h2>';
                            echo '<ul>';
                            foreach( $rows as $row ) {
                                // for each result, find the 'repeater row number' and use it to load the sub field!
                                preg_match('_([0-9]+)_', $row->meta_key, $matches);
                                $meta_key = 'show_date_time_' . $matches[0] . '_show_date'; // $matches[0] contains the row number!

                                // today or later
                                $showDate = $row->meta_value;
                                $do_current = ($showDate > $today); 
                                if ( $do_current || $continue ) :

                                    $show_title = get_the_title( $row->post_id );
                                    $machine_name = preg_replace('@[^a-z0-9-]+@','-', strtolower($show_title)); 


                                    $post_type = get_post_type($row->post_id);
                                    if( $post_type === 'pre-post-show' ){
                                        // echo 'pre-post-show matching';
                                        $postID = $row->post_id;
                                        $posts = get_field('pre_post_related_show', $postID);

                                        if( $posts ){ 

                                            foreach( $posts as $post): // variable must be called $post (IMPORTANT)
                                                setup_postdata($post); 
                                                $related_show = get_the_title($post->ID);
                                                $related_show_machine = preg_replace('@[^a-z0-9-]+@','-', strtolower($related_show));
                                            endforeach;

                                            wp_reset_postdata(); // IMPORTANT - reset the $post object so the rest of the page works correctly
                                        }

                                    }// post type define
                                ?>

有关为何会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:0)

嗯,它看起来有点棘手。在此stackoverflow post中,您将找到对此“奇怪”行为的完整解释。总结一下:

  1. +1 month将月份数(原来为1)增加1。这使得日期2015-02-31。
  2. 第二个月(二月)在2015年仅有28天,因此PHP会自动更正这一点,只需继续计算从2月1日起的天数。然后你在3月3日结束。
  3. 这就是为什么你第二次看到第3个月的原因。怎么解决这个问题?好吧,在帖子中我告诉你有一些解决这个“问题”的方法。如果您有php 5.3或更高版本,我建议:

    $date = new DateTime();// Now.
    for ($x=0; $x<=6; $x++) {
        ($x) ? $date->modify( 'first day of next month' ) : NULL;// It should give you next month from $x=0 onwards. Output: 01,02,03,04,05,06,07
        ....// Your code comes here
    

    希望它有所帮助。

    <强>更新

    有很多关于日期和PHP的文档。 DateTime类对于处理日期非常方便。检查其modify方法以更改日期。最后,看看不同的日期和时间supported formats。特别是relative formats,如果您有兴趣使用“+7天”等字符串修改日期。

    最后,请查看wpdb文档。类wpdb允许您与wp中的数据库进行交互。您需要学习一些SQL才能进行查询。互联网上有数百个页面(更不用说书籍)可以帮助你学习。

    例如,如果您想要检索接下来7天内的所有帖子,您可以执行以下操作:

    $now_date = (new DateTime())->format("Y-m-d");
    $next_seven_days = (new DateTime("+7 day"))->format("Y-m-d");
    $query = "SELECT * FROM wp_posts WHERE post_date >= '$now_date' AND post_date < '$next_seven_days'";
    $rows = $wpdb->get_results( $query, OBJECT );
    

    注意:由于没有来自用户/访问者的输入,也无法影响查询,为简单起见,我不打算使用prepare。无论如何,我必须说系统地使用它是一种好习惯。