Yoast Estimated Reading Time feature globally

Hi Support

I’d like to insert globally Yoast Estimated Reading Time feature into every POST.

Yoast support suggest me to use the following code snippet and add it to our theme’s single.php file to output the Estimated Reading Time in the individual blog posts.

<?php echo (string) YoastSEO()->meta->for_current_page()->estimated_reading_time_minutes, " minutes"; ?>

Please could you suggest me where add it?

I’d like to add it near to others POST INFOs

Thank You

Hi Daniele,

Thank you for reaching out to us. Yes, this would be possible using custom development. However, as this would represent a customization of the theme rather than a problem with the native controls of the theme, it is beyond the scope of support.

With that being said I’ll point you in the right direction to get you started. Depending on the stack you’re using, you will need to go find the function for this in the stack specific functions file. You can find these at the following path in X (I’m assuming you’re using X):

/framework/functions/frontend

Once you are here, open up the file corresponding to the Stack you are using. For example, if you are using the Integrity Stack, you will need to open integrity.php .

To continue on with the Integrity example, you would then need to find the x_integrity_entry_meta() function. Next, copy this entire function into the functions.php file of your child theme.

This function renders the post meta and here you can add Yoast Estimated Reading Time feature globally for all posts. As an example , I’ll share the code with your so you can paste this in your child theme’s functions.php file:

if ( ! function_exists( 'x_integrity_entry_meta' ) ) :
  function x_integrity_entry_meta() {

    //
    // Author.
    //

    $author = sprintf( '<span><i class="x-icon-pencil" data-x-icon-s="&#xf303;"></i> %s</span>',
      get_the_author()
    );


    //
    // Date.
    //

    $date = sprintf( '<span><time class="entry-date" datetime="%1$s"><i class="x-icon-calendar" data-x-icon-s="&#xf073;"></i> %2$s</time></span>',
      esc_attr( get_the_date( 'c' ) ),
      esc_html( get_the_date() )
    );


    //
    // Categories.
    //

    if ( get_post_type() == 'x-portfolio' ) {
      if ( has_term( '', 'portfolio-category', NULL ) ) {
        $categories        = get_the_terms( get_the_ID(), 'portfolio-category' );
        $separator         = ', ';
        $categories_output = '';
        foreach ( $categories as $category ) {
          $categories_output .= '<a href="'
                              . get_term_link( $category->slug, 'portfolio-category' )
                              . '" title="'
                              . esc_attr( sprintf( __( "View all posts in: &ldquo;%s&rdquo;", '__x__' ), $category->name ) )
                              . '"><i class="x-icon-bookmark" data-x-icon-s="&#xf02e;"></i> '
                              . $category->name
                              . '</a>'
                              . $separator;
        }

        $categories_list = sprintf( '<span>%s</span>',
          trim( $categories_output, $separator )
        );
      } else {
        $categories_list = '';
      }
    } else {
      $categories        = get_the_category();
      $separator         = ', ';
      $categories_output = '';
      foreach ( $categories as $category ) {
        $categories_output .= '<a href="'
                            . get_category_link( $category->term_id )
                            . '" title="'
                            . esc_attr( sprintf( __( "View all posts in: &ldquo;%s&rdquo;", '__x__' ), $category->name ) )
                            . '"><i class="x-icon-bookmark" data-x-icon-s="&#xf02e;"></i> '
                            . $category->name
                            . '</a>'
                            . $separator;
      }

      $categories_list = sprintf( '<span>%s</span>',
        trim( $categories_output, $separator )
      );
    }


    //
    // Comments link.
    //

    if ( comments_open() ) {

      $title  = apply_filters( 'x_entry_meta_comments_title', get_the_title() );
      $link   = apply_filters( 'x_entry_meta_comments_link', get_comments_link() );
      $number = apply_filters( 'x_entry_meta_comments_number', get_comments_number() );

	    $text = ( 0 == $number ) ? __( 'Leave a Comment', '__x__' ) : sprintf( _n( '%s Comment', '%s Comments', $number, '__x__' ), $number );

$comments = sprintf( '<span><a href="%1$s" title="%2$s" class="meta-comments"><i class="x-icon-comments" data-x-icon-s="&#xf086;"></i> %3$s</a></span>',
        esc_url( $link ),
        esc_attr( sprintf( __( 'Leave a comment on: &ldquo;%s&rdquo;', '__x__' ), $title ) ),
        $text
      );

    } else {

      $comments = '';

    }
	
	// Yoast snippet
	
	$yoast = sprintf( '<span><i class="x-icon-clock" data-x-icon-s="&#xf017;"></i> %s</span>',
      (string) YoastSEO()->meta->for_current_page()->estimated_reading_time_minutes. " minutes"
    );


    //
    // Output.
    //

    if ( x_does_not_need_entry_meta() ) {
      return;
    } else {
      printf( '<p class="p-meta">%1$s%2$s%3$s%4$s%5$s</p>',
        $author,
        $date,
        $categories_list,
        $comments,
		$yoast
      );
    }

  }
endif;

In the above code you’ll find this piece of code:

// Yoast snippet
	
	$yoast = sprintf( '<span><i class="x-icon-clock" data-x-icon-s="&#xf017;"></i> %s</span>',
      (string) YoastSEO()->meta->for_current_page()->estimated_reading_time_minutes. " minutes"
    );

You can change this as you need, I’ve already added this for you so you can get started.

Please note that the code provided above serves as a guide only and is to help you in getting started so implementing it and maintaining the code will be out of our support scope and for further maintenance for new possible versions of the theme that may cause the customization to break, you will need to hire a developer.

Thank you for understanding!

Dear Nabeel

Thank You very much for your HELP

I use PRO Theme, is the solution the same for PRO?

Thank again

Hi Daniele,

You’re welcome and Yes, the solution coming from my colleague will work in both X and Pro.

Thank you.

Thank You Nabeel and Marc_a
Your solution works fine in single Post page:


where it report correct reading time

but it doesn’t work into global BLOG page:


where it report always ZERO reading time

Please, could you help me in order to find a solution?

Thank You

It would seem that the Yoast code only works on Single templates, not loops. You can hide that info on the blog index by changing the code to this:

// Yoast snippet
$yoast = is_single() ? sprintf( '<span><i class="x-icon-clock" data-x-icon-s="&#xf017;"></i> %s</span>',
  (string) YoastSEO()->meta->for_current_page()->estimated_reading_time_minutes. " minutes"
) : '';

You could also ask Yoast if there’s a variation that works inside a loop which might help get closer to a customization that works in both places.

I would like to thank you for your always precious and kind support.

I would also like to update you that I have found the solution with a small code update you suggested that solves my problem.

(string) YoastSEO()->meta->for_post( get_the_ID() )->estimated_reading_time_minutes

Thank you again

Hi Daniele,

We’re glad that your able to find an alternative solution to your issue. If you have any other concerns regarding our theme features, feel free to reach us.

Thank you.

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.