WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Вычесть дату из текущей даты и вывести результат в записи wordpress.

Мне надо в админке, у определенных записей, постоянно править дату.

Записей более 200 шт. по количеству работников на предприятии. Это поле называется Общий стаж. Нужно заходить в каждую и менять дату.

Например:
На странице Работника есть параметр его Общий стаж: 17 лет 6 мес.

Через определенное время, нужно заходить в админку и постоянно править этот стаж, прибавляя нужное количество лет и месяцев.

Очень хочу, чтобы wp сам считал и выводил дату в правильном формате. Помогите решить проблему. Сам решение не нашел.

Заметки к вопросу:
Kama 2 года назад

По какой логике нужно добавлять, просто по прошествии времени?

ioas 2 года назад

Логика такая
текущая дата - дата начала трудовой деятельности = Общий стаж
Формат отображения на странице такой: X лет X мес.

В результате когда заходишь на страницу записи, должен увидеть правильное значение общего стажа на текущий день от начала трудовой деятельности.

0
ioas
2 года назад
  • 1
    Kama9621

    Тут наверное проще всего вычислить метку времени когда работник начал работу. Например если на сегодня он проработал 10 лет - это 10 * 3600 * 24 * 365 = 315360000 в секундах. То значит он начал работать в такую метку времени: time() - 315360000.

    Сохраняем это число, например в метаполе worker_experience_start_time:

    $exp_start_time = time() - 315360000;
    
    update_post_meta( $post_id, 'worker_experience_start_time', $exp_start_time );

    Таким образом у нас есть метка времени когда работник начал трудовую деятельность!

    Теперь на выводе нужно просто посчитать и вывести в нужном формате. Напишем фунцию:

    function get_exp_human( $start_time ){
    
    	$diff = time() - $start_time;
    
    	$years = floor( $diff / YEAR_IN_SECONDS );
    	$month = floor( ($diff % YEAR_IN_SECONDS) / MONTH_IN_SECONDS );
    	$days  = floor( (($diff % YEAR_IN_SECONDS) % MONTH_IN_SECONDS) / DAY_IN_SECONDS );
    
    	$res = array_filter( [
    		$years ? num_decline( $years, 'год,года,лет' ) : 0,
    		$month ? "$month мес." : 0,
    		$days  ? num_decline( $days, 'день,дня,дней' ) : 0,
    	] );
    
    	return implode( ' ', $res );
    }
    
    /**
     * Склонение слова после числа.
     *
     *     // Примеры вызова:
     *     num_decline( $num, 'книга,книги,книг' )
     *     num_decline( $num, 'book,books' )
     *     num_decline( $num, [ 'книга','книги','книг' ] )
     *     num_decline( $num, [ 'book','books' ] )
     *
     * @param int|string   $number       Число после которого будет слово. Можно указать число в HTML тегах.
     * @param string|array $titles       Варианты склонения или первое слово для кратного 1.
     * @param bool         $show_number  Указываем тут 00, когда не нужно выводить само число.
     *
     * @return string Например: 1 книга, 2 книги, 10 книг.
     *
     * @version 3.1
     */
    function num_decline( $number, $titles, $show_number = true ){
    
    	if( is_string( $titles ) ){
    		$titles = preg_split( '/, */', $titles );
    	}
    
    	// когда указано 2 элемента
    	if( empty( $titles[2] ) ){
    		$titles[2] = $titles[1];
    	}
    
    	$cases = [ 2, 0, 1, 1, 1, 2 ];
    
    	$intnum = abs( (int) strip_tags( $number ) );
    
    	$title_index = ( $intnum % 100 > 4 && $intnum % 100 < 20 )
    		? 2
    		: $cases[ min( $intnum % 10, 5 ) ];
    
    	return ( $show_number ? "$number " : '' ) . $titles[ $title_index ];
    }

    Используем так:

    $exp_start_time = get_post_meta( $post_id, 'worker_experience_start_time' );
    
    echo get_exp_human( $exp_start_time );

    Для теста укажем время вручную - 5 лет 6 мес и 5 дней:

    $exp_start_time = time() - ( 5 * YEAR_IN_SECONDS + 6 * MONTH_IN_SECONDS + 5 * DAY_IN_SECONDS );
    
    echo get_exp_human( $exp_start_time ); // 5 лет 6 мес. 5 дней 
    ioas 2 года назад

    Спасибо большое за ответ.

    После ознакомления и прочтения вашего ответа, увидел, что я не смог объяснить.

    Переменную "начало трудовой деятельности" находить не нужно, она изначально известна.

    И она не будет целой, как в примере 10 лет.
    А будет к примеру 53 года 10 мес.
    Начало трудовой деятельности будет равняться 25 июня 1968 года.

    1. Признаюсь, что мне не совсем понятно, где прописать этот код, а именно:

    function get_exp_human( $start_time ){...} надо прописать в function.php?

    1. Карточку работника у меня сделана на кастомных полях, при помощи плагина ACF.
      Как можно это прикрутить так, чтобы это работало динамически?
    2. Можно ли переменную "Начало трудовой деятельности" ввести в произвольном поле, а результат будет выведен уже на сайте.
    Kama 2 года назад

    Как я вижу тут все сложно с программированием и нужно пошагам все рассказывать. Время на это у меня нет, ну раз уж взялся, то давайте попробуем разобраться.

    Во первых в каком конкретно виде хранится текущее значение в поле "начало трудовой деятельности". Как строка вида 53 года 10 мес?

    1) ACF это теже самые метаполя, о которых я писал выше.
    2) Конечно можно об это же и реч.

    ioas 2 года назад
    1. добавил function get_exp_human( $start_time ){...} в function.php
    2. на шаблон страницы, где выводятся параметры Работника в том числе и общий стаж
      добавил следующее (красной стрелочкой обозначено, что я добавил):

    Теперь для всех работников выводится один и тот же стаж работы 52 года 4 мес. 7 дней.

    Остается реализовать переменную "Начало трудовой деятельности" ввести в произвольном поле, чтобы результат выводился свой для каждого работника.

    Kama 2 года назад

    Походу в поле стаж строка хранится - парсить надо. Ты это поле заполняешь руками, прям пишешь 53 года 10 мес. да?

    Тут наверное лучше создать аналогичное поле, только в виде даты, которая будет хранить UNIX метку времени. В ACF такое есть. Затем конвертнуть текущие данные в это поле и использовать его уже, а текущее поле просто удалить.

    Попробуй сча создать поле datatime, указать там дату и использовать его значение на выводе.

    ioas 2 года назад

    Ты это поле заполняешь руками, прям пишешь 53 года 10 мес.? Совершенно верно, руками. Это текстовое поле

    ioas 2 года назад

    Да с программированием худо. Мысль я понял, попробую сделать.

    ioas 2 года назад

    Сделал поле в плагине в виде даты.

    в шаблоне страницы прописал:

    Получилось

    ioas 2 года назад

    52 года 4 мес это он считает от 26 декабря 1969 года
    От куда берется эта дата?
    Видимо здесь формируется эта дата:

    $diff = time() - $start_time;
    Kama 2 года назад

    В get_exp_human() тебе нужно указать число, дата начала труд.деятельности в виде UNIX метки времени.

    Попробуй так:

    $exp_start_time = strtotime( get_field( 'datatime' ) );
    
    echo get_exp_human( $exp_start_time );

    И назови поле как-то понятнее, а не datatime.

    ioas 2 года назад

    Конечно поле будет иметь другое имя.
    Я не могу сообразить, почему у всех записей отображается одно число - 52 года 4 мес. У двоих я установил дату начала труд.деятельности. У них точно должно быть разные значения. Но ничего не меняется. Расчет не происходит.

    Kama 2 года назад

    strtotime() использовал для получаемого значения, перед тем как передать его в функцию?

    ioas 1.9 года назад

    да.

    <?php $exp_start_time  = strtotime(get_field('Начало трудовой деятельности')); ?>
    <b>Общий стаж: </b><?php  echo get_exp_human($exp_start_time);  ?><br> 
    
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация