WordPress как на ладони

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

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

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

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

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

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

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

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

ioas 2.1 год назад

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

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

0
ioas
2.1 год назад
  • 1
    Kama9656

    Тут наверное проще всего вычислить метку времени когда работник начал работу. Например если на сегодня он проработал 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.1 год назад

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

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

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

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

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

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

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

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

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

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

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

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

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

    Kama 2.1 год назад

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

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

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

    ioas 2.1 год назад

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

    ioas 2.1 год назад

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

    ioas 2.1 год назад

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

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

    Получилось

    ioas 2.1 год назад

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

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

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

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

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

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

    ioas 2.1 год назад

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

    Kama 2.1 год назад

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

    ioas 2.1 год назад

    да.

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