richardsweeney
  • 0
Новичок

Дата значения пользовательского поля преобразуется в проблемы с отметкой времени unix

  • 0

По какой-то причине у меня возникают трудности с преобразованием значения даты, хранящегося в метаполе, в отметку времени unix (и обратно). Если я сохраню дату в виде строки, все будет работать нормально, но если я преобразую ее в отметку времени, используя strtotime ее, значение не будет сохранено.

Мой рабочий код выглядит так:

<?php

add_action( 'add_meta_boxes', 'rs_add_date' );
function rs_add_date() {
    add_meta_box( 'rs_add_date', 'Date', 'rs_add_date_create_meta_box', 'concerts', 'normal', 'high' );
}
function rs_add_date_create_meta_box( $post ) {
    $date = get_post_meta($post->ID, 'rs_date', true);
    echo 'Choose a date for the event';
    wp_nonce_field( plugin_basename(__FILE__), 'rs_date_nonce');
?>
    <p>Date (dd/mm/yyyy) <input type="text" name="rs-date" id="rs-date" value="<?php echo $date; ?>"></p>
<?php
}


// Save the new meta

add_action('save_post', 'rs_date_save_meta');
function rs_date_save_meta( $post_id ) {

    if(!wp_verify_nonce( $_POST['rs_date_nonce'], plugin_basename(__FILE__) ) )
        return;
    if(!current_user_can('edit_posts') )
        return;
    $date = $_POST['rs-date'];
    update_post_meta($post_id, 'rs_date', $date);
}
?>

Но если я изменю его на следующее, это не сработает:

<?php
add_action( 'add_meta_boxes', 'rs_add_date' );
function rs_add_date() {
    add_meta_box( 'rs_add_date', 'Date', 'rs_add_date_create_meta_box', 'concerts', 'normal', 'high' );
}
function rs_add_date_create_meta_box( $post ) {
    $date = get_post_meta($post->ID, 'rs_date', true);
    $date = time("d/m/Y", $date);
    echo 'Choose a date for the event';
    wp_nonce_field( plugin_basename(__FILE__), 'rs_date_nonce');
?>
    <p>Date (dd/mm/yyyy) <input type="text" name="rs-date" id="rs-date" value="<?php echo $date; ?>"></p>
<?php
}


// Save the new meta

add_action('save_post', 'rs_date_save_meta');
function rs_date_save_meta( $post_id ) {

    if(!wp_verify_nonce( $_POST['rs_date_nonce'], plugin_basename(__FILE__) ) )
        return;
    if(!current_user_can('edit_posts') )
        return;
    $date = $_POST['rs-date'];
    $date = strtotime($date);
    update_post_meta($post_id, 'rs_date', $date);
}
?>

Вот голову ломаю! Ваше здоровье

Share
  1. Глядя на http://www.php.net/manual/en/datetime.formats.date.php, я не думаю, что strtotime правильно преобразует DD/MM/YYYY во время.

    Однако это может быть ММ/ДД/ГГГГ или ГГГГ/ММ/ДД.

    Попробуйте использовать формат даты ГГГГ/ММ/ДД.

    Или, если это вам не нравится, вы можете использовать тот же формат даты, но вам придется при сохранении разделить дату и преобразовать ее в метку даты unix другим способом. Вы можете использовать:

    $date = "dd/mm/yyyy";
    $date = explode("/", $date);
    $date = mktime(0, 0, 0, (int)$date[1], (int)$date[0], (int)$date[2]);
    
    • 0
    • ура за это — вы абсолютно правы. РТФМ, кажется!

      • 0
    • @Richard — Нет проблем, я много раз сталкивался с одной и той же проблемой. Я действительно ненавижу то, что PHP решил дать формату США преобладание над форматом даты в Великобритании, но опять же, в США больше населения 🙁 Но вы можете понять, почему strtotime() не может проверить формат даты в Великобритании. Возьмем дату 02/01/2011. Великобритания и США видят это как разные даты, но нет способа определить, имеете ли вы в виду формат даты в Великобритании или США.Что было бы неплохо, так это функция, в которой вы можете подавать введенный формат даты: strtotimeformat("01/01/2011", "d/m/Y", time());

      • 0
    • Согласитесь, кажется настоящей оплошностью тот факт, что формат даты в Великобритании (и Ирландии!!) не был принят во внимание при создании функции strtotime. Спасибо еще раз за помощь!

      • 0

Оставить ответ

You must login to add an answer.