Last updated posts shortcode in functions.php

All we need is an easy explanation of the problem, so here it is.

I’m searching to create a shortcode inside function.php child theme, to show last updated posts with thumbnail.
I have this code that works into page template:

    <ol class="list-numbered">
    <?php
    // Show recently modified posts
    $recently_updated_posts = new WP_Query( array(
        'post_type'      => 'post',
        'posts_per_page' => '13',
        'orderby'        => 'modified',
        'no_found_rows'  => 'true' // speed up query when we don't need pagination
    ) );
    if ( $recently_updated_posts->have_posts() ) :
        while( $recently_updated_posts->have_posts() ) : $recently_updated_posts->the_post(); ?>
            <li><a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?>
<?php
$size = 'thumbnail'; 
 $attachments = get_children( array(
        'post_parent' => get_the_ID(),
        'post_status' => 'inherit',
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'order' => 'ASC',
        'orderby' => 'menu_order ID',
        'numberposts' => 1)
    );
    foreach ( $attachments as $thumb_id => $attachment ) {
        echo wp_get_attachment_image($thumb_id, $size);
    }
?>
</a></li>
        <?php endwhile; ?>
        <?php wp_reset_postdata(); ?>
    <?php endif; ?>
</ol>

But I would insert into functions.php file and call the shortcode.
Do you have some ideas?
Thanks in advance.

How to solve :

I know you bored from this bug, So we are here to help you! Take a deep breath and look at the explanation of your problem. We have many solutions to this problem, But we recommend you to use the first method because it is tested & true method that will 100% work for you.

Method 1

You can do this like bellow

// register shortcode
add_shortcode('last-modified', 'last_mofied_shortcode_callback'); 

function last_mofied_shortcode_callback() { 
    $output = '<ol class="list-numbered">';

    $recently_updated_posts = new WP_Query( array(
        'post_type'      => 'post',
        'posts_per_page' => '13',
        'orderby'        => 'modified',
        'no_found_rows'  => 'true' // speed up query when we don't need pagination
    ) );
    if ( $recently_updated_posts->have_posts() ) :
        while( $recently_updated_posts->have_posts() ) : $recently_updated_posts->the_post();
            $output .= '<li><a href="'.get_the_permalink().'" rel="bookmark" title="'.get_the_title().'">'.get_the_title();

            $size = 'thumbnail'; 
            $attachments = get_children( array(
                    'post_parent' => get_the_ID(),
                    'post_status' => 'inherit',
                    'post_type' => 'attachment',
                    'post_mime_type' => 'image',
                    'order' => 'ASC',
                    'orderby' => 'menu_order ID',
                    'numberposts' => 1));
            foreach ( $attachments as $thumb_id => $attachment ) {
                $output .= wp_get_attachment_image($thumb_id, $size);
            }

            $output .= '</a></li>';
        endwhile;
        wp_reset_postdata();
    endif;
    return $output;
}

And now you can use [last-modified] shortcode anywhere within content. if you want to use in php files then just use it like echo do_shortcode('[last-modified]');

Read more about add_shortcode() here

Method 2

This code works well.
I added category_name in $recently_updated_posts to show recently updated post for each category, and it works too.
When I try to add get_category_link() and get_the_category() returns "Array" instead the category links and the category name.
Where do I wrong?
Thanks in advance.

Note: Use and implement method 1 because this method fully tested our system.
Thank you 🙂

Leave a Reply