예제 #1
0
/**
 * The format of the outputted date string (jalali equivalent of php date() function)
 * @global array $jdate_month_name
 * @global array $ztjalali_option
 * @param string $format for example 'Y-m-d H:i:s'
 * @param timestamp $timestamp [optional]
 * @param bool $timezone [optional]
 * @param bool $fanum [optional]<br/>convert number to persian ?<br/>
 *      default : get from plugin option
 * @return string
 * @since 5.0.0
 */
function jdate($format, $timestamp = NULL, $timezone = false, $fanum = NULL)
{
    global $jdate_month_name, $ztjalali_option;
    static $jdate_month_days = array(0, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
    static $jdate_week_name = array('شنبه', 'یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنج شنبه', 'جمعه');
    if (!$timestamp) {
        $timestamp = time();
    } elseif (!is_numeric($timestamp)) {
        $timestamp = strtotime($timestamp);
    } elseif (!is_integer($timestamp)) {
        $timestamp = intval($timestamp);
    }
    /* =================================================================== */
    if ($timezone === 'local' or $timezone === FALSE) {
        //do noting
    } elseif ($timezone === TRUE) {
        $fanum = FALSE;
        // support jdate older version
    } elseif ($timezone === 'current') {
        $time_zone = 'Asia/Tehran';
        function_exists('get_option') and $time_zone = get_option('timezone_string');
        $dtz = new DateTimeZone($time_zone);
        $time_obj = new DateTime('now', $dtz);
        $deff_time = $dtz->getOffset($time_obj);
        $timestamp += $deff_time;
    } elseif (is_numeric($time_zone)) {
        $timestamp += (int) $time_zone;
    } elseif (is_string($time_zone)) {
        $dtz = new DateTimeZone($time_zone);
        $time_obj = new DateTime('now', $dtz);
        $deff_time = $dtz->getOffset($time_obj);
        $timestamp += $deff_time;
    }
    /* =================================================================== */
    if ($fanum === NULL and !empty($ztjalali_option['change_jdate_number_to_persian']) and $ztjalali_option['change_jdate_number_to_persian']) {
        $fanum = TRUE;
    }
    /* =================================================================== */
    # Create need date parametrs
    list($gYear, $gMonth, $gDay, $gWeek) = explode('-', date('Y-m-d-w', $timestamp));
    list($pYear, $pMonth, $pDay) = gregorian_to_jalali($gYear, $gMonth, $gDay);
    $pWeek = $gWeek + 1;
    if ($pWeek >= 7) {
        $pWeek = 0;
    }
    if ($format == '\\') {
        $format = '//';
    }
    $lenghFormat = strlen($format);
    $i = 0;
    $result = '';
    while ($i < $lenghFormat) {
        $par = $format[$i];
        if ($par == '\\') {
            $result .= $format[++$i];
            $i++;
            continue;
        }
        switch ($par) {
            # Day
            case 'd':
                $result .= $pDay < 10 ? '0' . $pDay : $pDay;
                break;
            case 'D':
                $result .= substr($jdate_week_name[$pWeek], 0, 2);
                break;
            case 'j':
                $result .= $pDay;
                break;
            case 'l':
                $result .= $jdate_week_name[$pWeek];
                break;
            case 'N':
                $result .= $pWeek + 1;
                break;
            case 'w':
                $result .= $pWeek;
                break;
            case 'z':
                $result .= jday_of_year($pMonth, $pDay);
                break;
            case 'S':
                $result .= 'ام';
                break;
                # Week
            # Week
            case 'W':
                $result .= ceil(jday_of_year($pMonth, $pDay) / 7);
                break;
                # Month
            # Month
            case 'F':
                $result .= $jdate_month_name[$pMonth];
                break;
            case 'm':
                $result .= $pMonth < 10 ? '0' . $pMonth : $pMonth;
                break;
            case 'M':
                $result .= substr($jdate_month_name[$pMonth], 0, 6);
                break;
            case 'n':
                $result .= $pMonth;
                break;
            case 't':
                $result .= jday_of_month($pYear, $pMonth);
                break;
                # Years
            # Years
            case 'L':
                $result .= (int) is_jalali_leap_year($pYear);
                break;
            case 'Y':
            case 'o':
                $result .= $pYear;
                break;
            case 'y':
                $result .= substr($pYear, 2);
                break;
                # Time
            # Time
            case 'a':
            case 'A':
                if (date('a', $timestamp) == 'am') {
                    $result .= $par == 'a' ? 'ق.ظ' : 'قبل از ظهر';
                } else {
                    $result .= $par == 'a' ? 'ب.ظ' : 'بعد از ظهر';
                }
                break;
            case 'B':
            case 'g':
            case 'G':
            case 'h':
            case 'H':
            case 's':
            case 'u':
            case 'i':
                # Timezone
            # Timezone
            case 'e':
            case 'I':
            case 'O':
            case 'P':
            case 'T':
            case 'Z':
                $result .= date($par, $timestamp);
                break;
                # Full Date/Time
            # Full Date/Time
            case 'c':
                $result .= $pYear . '-' . $pMonth . '-' . $pDay . ' ' . date('H:i:s P', $timestamp);
                break;
            case 'r':
                $result .= substr($jdate_week_name[$pWeek], 0, 2) . '، ' . $pDay . ' ' . substr($jdate_month_name[$pMonth], 0, 6) . ' ' . $pYear . ' ' . date('H::i:s P', $timestamp);
                break;
            case 'U':
                $result .= $timestamp;
                break;
            default:
                $result .= $par;
        }
        $i++;
    }
    if ($fanum) {
        return ztjalali_persian_num($result);
    }
    return $result;
}
/**
 * pre get posts filter handler
 * @param object $post
 * @see wp-includes\query.php 2353
 */
function ztjalali_pre_get_posts_filter_fn($query)
{
    global $wpdb;
    $query_vars = $query->query;
    $year = $monthnum = $day = "";
    if (isset($query_vars['m']) and !empty($query_vars['m'])) {
        $year = (int) substr($query_vars['m'], 0, 4);
        if ($year < 1700) {
            $monthnum = (int) substr($query_vars['m'], 4, 2);
            if (empty($monthnum)) {
                $start_date = jalali_to_gregorian($year, 1, 1);
                $end_date = jalali_to_gregorian($year, 12, jday_of_month($year, 12));
            } else {
                $day = (int) substr($query_vars['m'], 6, 2);
                if (empty($day)) {
                    $start_date = jalali_to_gregorian($year, $monthnum, 1);
                    $end_date = jalali_to_gregorian($year, $monthnum, jday_of_month($year, $monthnum));
                } else {
                    $end_date = $start_date = jalali_to_gregorian($year, $monthnum, $day);
                }
            }
            $date_query = array(array('after' => array('year' => $start_date[0], 'month' => $start_date[1], 'day' => $start_date[2]), 'before' => array('year' => $end_date[0], 'month' => $end_date[1], 'day' => $end_date[2]), 'inclusive' => TRUE));
            $query->set('date_query', $date_query);
            $query->set('m', '');
        }
        return $query;
    }
    /* ------------------------------------------------------ */
    if (isset($query_vars['year'])) {
        $year = $query_vars['year'];
    }
    if (isset($query_vars['monthnum'])) {
        $monthnum = $query_vars['monthnum'];
    }
    if (isset($query_vars['day'])) {
        $day = $query_vars['day'];
    }
    if ($year > 1700) {
        return $query;
    }
    if (isset($query_vars['name'])) {
        $post_date = $wpdb->get_var($wpdb->prepare("select post_date from {$wpdb->posts} where post_name=%s order by ID", $query_vars['name']));
        $Date = explode('-', date('Y-m-d', strtotime($post_date)));
        $jDate = gregorian_to_jalali($Date[0], $Date[1], $Date[2]);
        if ($year == $jDate[0]) {
            $query->set('year', $Date[0]);
        }
        if ($monthnum == $jDate[1]) {
            $query->set('monthnum', $Date[1]);
        }
        if ($day == $jDate[2]) {
            $query->set('day', $Date[2]);
        }
        return $query;
    }
    if (isset($query_vars['post_id'])) {
        $post_date = $wpdb->get_var($wpdb->prepare("select post_date from {$wpdb->posts} where ID=%d", $query_vars['post_id']));
        $cDate = getdate(strtotime($post_date));
        if (!empty($year)) {
            $query->set('year', $cDate['year']);
        }
        if (!empty($monthnum)) {
            $query->set('monthnum', $cDate['mon']);
        }
        if (!empty($day)) {
            $query->set('day', $cDate['mday']);
        }
        return $query;
    }
    if (!empty($year) and !empty($monthnum) and !empty($day)) {
        $post_date = jalali_to_gregorian($year, $monthnum, $day);
        $query->set('year', $post_date[0]);
        $query->set('monthnum', $post_date[1]);
        $query->set('day', $post_date[2]);
        return $query;
    }
    if (!empty($year) and !empty($monthnum)) {
        $start_date = jalali_to_gregorian($year, $monthnum, 1);
        $end_date = jalali_to_gregorian($year, $monthnum, jday_of_month($year, $monthnum));
        $date_query = array(array('after' => array('year' => $start_date[0], 'month' => $start_date[1], 'day' => $start_date[2]), 'before' => array('year' => $end_date[0], 'month' => $end_date[1], 'day' => $end_date[2]), 'inclusive' => TRUE));
        $query->set('date_query', $date_query);
        $query->set('year', '');
        $query->set('monthnum', '');
        //        $post_date = jalali_to_gregorian($year, $monthnum, 15);
        //        $query->set('year', $post_date[0]);
        //        $query->set('monthnum', $post_date[1]);
        return $query;
    }
    if (!empty($year)) {
        $start_date = jalali_to_gregorian($year, 1, 1);
        if (is_jalali_leap_year($year)) {
            $end_date = jalali_to_gregorian($year, 12, 30);
        } else {
            $end_date = jalali_to_gregorian($year, 12, 29);
        }
        $date_query = array(array('after' => array('year' => $start_date[0], 'month' => $start_date[1], 'day' => $start_date[2]), 'before' => array('year' => $end_date[0], 'month' => $end_date[1], 'day' => $end_date[2]), 'inclusive' => TRUE));
        $query->set('date_query', $date_query);
        $query->set('year', '');
        return $query;
    }
    return $query;
}