Показывать текущие сообщения Wordpress между настраиваемыми полями даты начала и окончания

Поэтому я пытаюсь показать только текущие события, которые попадают между настраиваемыми полями даты начала (st_date) и даты окончания (end_date). В настоящее время это не работает вообще для текущих событий.

Мое текущее время при установке Wordpress соответствует моему часовому поясу (восточному) на -5.

Я попытался изменить формат даты на своем сайте Wordpress, чтобы он соответствовал Y-m-d, но, поскольку отображаются предстоящие и предыдущие события, это, очевидно, мне не помогло.

Это серверное время, от которого он отрабатывает? На данный момент, 31 декабря, отображается событие с датой начала 30 декабря, но не событие, которое я создал с датой начала 31 декабря.

Вот мой текущий код. Есть идеи, что нужно изменить? Спасибо за любую помощь!

    //FILER FOR SEPARATING UPCOMING, CURRENT AND PAST EVENTS
function event_where($where)
{
    global $wpdb,$wp_query;
    $current_term = $wp_query->get_queried_object();
    if((is_archive() || is_tag()) && ($current_term->taxonomy==CUSTOM_CATEGORY_TYPE1 || $current_term->taxonomy==CUSTOM_TAG_TYPE1))
    {
        if($current_term->taxonomy == CUSTOM_CATEGORY_TYPE1 || $current_term->taxonomy == CUSTOM_TAG_TYPE1)
        {
            if(@$_REQUEST['etype']=='')
            {
                $_REQUEST['etype']='current';
            }
            if(@$_REQUEST['etype']=='current')
            {
                $today = date('Y-m-d G:i:s');
                $where .= "  AND ($wpdb->posts.ID in (select $wpdb->postmeta.post_id from $wpdb->postmeta where $wpdb->postmeta.meta_key='st_date' and date_format($wpdb->postmeta.meta_value,'%Y-%m-%d %G:%i:%s') <='".$today."')) AND ($wpdb->posts.ID in (select $wpdb->postmeta.post_id from $wpdb->postmeta where $wpdb->postmeta.meta_key='end_date' and date_format($wpdb->postmeta.meta_value,'%Y-%m-%d %G:%i:%s') > '".$today."')) ";
            }
            elseif($_REQUEST['etype']=='upcoming')
            {
                $today = date('Y-m-d G:i:s');
                $where .= " AND ($wpdb->posts.ID in (select $wpdb->postmeta.post_id from $wpdb->postmeta where $wpdb->postmeta.meta_key='st_date' and date_format($wpdb->postmeta.meta_value,'%Y-%m-%d %G:%i:%s') >'".$today."' and $wpdb->posts.post_status = 'publish')) ";
            }
            elseif($_REQUEST['etype']=='past')
            {
                $today = date('Y-m-d G:i:s');
                $where .= " AND ($wpdb->posts.ID in (select $wpdb->postmeta.post_id from $wpdb->postmeta where $wpdb->postmeta.meta_key='end_date' and date_format($wpdb->postmeta.meta_value,'%Y-%m-%d %G:%i:%s') < '".$today."')) ";
            }
        }elseif(is_day() || is_month() || is_year())
        {
            $where = str_replace("'post'","'".CUSTOM_POST_TYPE1."'",$where); 
        }
    }
    return $where;
}

person user1940117    schedule 31.12.2012    source источник


Ответы (1)


Несколько вещей, которые я могу придумать, чтобы проверить:

Если вас беспокоит неправильный часовой пояс, вы всегда можете указать MySQL дату и время. Вы бы изменили утверждение следующим образом:

$today = date('Y-m-d G:i:s');
$where = "AND date_format($wpdb->postmeta.meta_value,'%Y-%m-%d %G:%i:%s') <='" . $today . "'))";

к чему-то вроде этого:

$where = "AND date_format($wpdb->postmeta.meta_value,'%Y-%m-%d %G:%i:%s') <= NOW() ))";

NOW() — это команда, чтобы указать текущую дату и время сервера.

Когда вы вводите даты начала и окончания в настраиваемые поля, вы используете дату или дату и время? Если вы не используете время, такая дата, как «2012-12-31», будет интерпретироваться как «2012-12-31 00:00:00». Это может вызвать проблемы, особенно с датой окончания. Рассмотрите возможность добавления дня (или 86 400 секунд) к дате окончания в этом случае.

Если вы подозреваете, что у вас проблемы с интерпретацией дат, в MySQL есть эквивалент PHP-команды strtotime(): STR_TO_DATE. Вы можете взять удобочитаемую строку и преобразовать ее в нужный формат.

При использовании $wpdb для запросов вы можете попробовать вывести $wpdb->last_query, чтобы точно увидеть, когда полный SQL отправляется в MySQL. Попробуйте запустить это в своем любимом клиенте MySQL и посмотрите, какие результаты вы получите.

person sirbeagle    schedule 31.12.2012