Need a function for changing saved post_date or post_date_gmt to relative time in wordpress

I am working on a plugin and want to change the default post date to something like ‘posted one min ago’ OR ‘posted 1 hour ago’, OR ‘posted on month ago’.

Related posts

Leave a Reply

2 comments

  1. Straight from my framework as human_time_diff() involves caching.

    /**
     * Time since an entry was posted
     * 
     * Adapted from binary bonsai
     * @link    http://binarybonsai.com/code/timesince.txt 
     * @license unknown - original source unavailable
     * 
     * @todo check human_time_diff(); as a replacement 
     * @link http://codex.wordpress.org/Function_Reference/human_time_diff
     * Note: Rarst said there's caching involved with this fn.
     * 
     * @param   (integer) $older_date
     * @param   (integer) $newer_date
     */
    function get_time_since( $older_date, $newer_date = false )
    {
        // array of time period chunks
        $chunks = array(
             array( 60 * 60 * 24 * 365 , 'year' )
            ,array( 60 * 60 * 24 * 30 , 'month' )
            ,array( 60 * 60 * 24 * 7, 'week' )
            ,array( 60 * 60 * 24 , 'day' )
            ,array( 60 * 60 , 'hour' )
            ,array( 60 , 'min' )
        );
    
        // $newer_date will equal false if we want to know the time elapsed between a date and the current time
        // $newer_date will have a value if we want to work out time elapsed between two known dates
        if ( $newer_date == false )
        {
            $newer_date = time() + ( 60 * 60 * get_option( 'gmt_offset' ) );
        }
        else 
        {
            $newer_date = $newer_date;
        }
    
        // difference in seconds
        $since = $newer_date - $older_date;
    
        // we only want to output two chunks of time here, eg:
        // x years, xx months
        // x days, xx hours
        // so there's only two bits of calculation below:
    
        // step one: the first chunk
        for ( $i = 0, $j = count( $chunks ); $i < $j; $i++ )
        {
            $seconds = $chunks[$i][0];
            $name = $chunks[$i][1];
    
            // finding the biggest chunk (if the chunk fits, break)
            if ( ( $count = floor( $since / $seconds ) ) != 0 )
            {
                break;
            }
        }
    
        // set output var
        if ( $count == true )
        { 
            $output = "1 {$name2}";
        }
        else 
        {
            $output = "{$count} {$name}s";
        }
    
        // step two: the second chunk
        if ( $i + 1 < $j )
        {
            $seconds2 = $chunks[$i + 1][0];
            $name2 = $chunks[$i + 1][1];
    
            if ( ( $count2 = floor( ( $since - ( $seconds * $count ) ) / $seconds2 ) ) != 0 )
            {
                // add to output var
                if ( $count2 == true )
                {
                    $output .= ", 1 {$name2}";
                }
                else 
                {
                    $output .= ", {$count} {$name2}s";
                }
            }
        }
    
        return $output;
    }