Support » Fixing WordPress » Latest Posts block

  • Resolved florianwilhelm

    (@florianwilhelm)


    Hi,

    I am just discovering the new editor and I am pleased to find the possibility to add a Latest Posts block in my pages (Widgets > Latest Post). It is a great feature that would allow me to drop Latest Posts plug-ins!

    Problem: it only shows the Post title.
    Does someone know how I could also show the Post Thumbnail and Excerpt? It is not possible from the editing interface (at least from what I see), but it is probably something possible through php files.

    Thank you and happy holidays to y’all,
    Florian

Viewing 8 replies - 1 through 8 (of 8 total)
  • florianwilhelm

    (@florianwilhelm)

    Hi,
    I found the file to edit:
    In wordpress folder, wp-includes/blocks/latest-posts.php

    I had success putting the post thumbnail but when I try to have the post excerpt, it shows the current page excerpt instead of the post’s.

    I edited only a small part of the code (line 39):

    		$list_items_markup .= sprintf(
    			'<li>
    			<a href="%2$s">%1$s%3$s</a><p>%4$s</p>',
    			get_the_post_thumbnail( $post_id ),
    			esc_url( get_permalink( $post_id ) ),
    			esc_html( $title ), 
    			get_the_excerpt( $post_id )
    		);

    Here is the complete code (edited by me):

    <?php
    /**
     * Server-side rendering of the <code>core/latest-posts</code> block.
     *
     * @package WordPress
     */
    
    /**
     * Renders the <code>core/latest-posts</code> block on server.
     *
     * @param array $attributes The block attributes.
     *
     * @return string Returns the post content with latest posts added.
     */
    function render_block_core_latest_posts( $attributes ) {
    	$args = array(
    		'numberposts' => $attributes['postsToShow'],
    		'post_status' => 'publish',
    		'order'       => $attributes['order'],
    		'orderby'     => $attributes['orderBy'],
    	);
    
    	if ( isset( $attributes['categories'] ) ) {
    		$args['category'] = $attributes['categories'];
    	}
    
    	$recent_posts = wp_get_recent_posts( $args );
    
    	$list_items_markup = '';
    
    	foreach ( $recent_posts as $post ) {
    		$post_id = $post['ID'];
    
    		$title = get_the_title( $post_id );
    		if ( ! $title ) {
    			$title = __( '(Untitled)' );
    		}
    				
    		$list_items_markup .= sprintf(
    			'<li>
    			<a href="%2$s">%1$s%3$s</a><p>%4$s</p>',
    			get_the_post_thumbnail( $post_id ),
    			esc_url( get_permalink( $post_id ) ),
    			esc_html( $title ), 
    			get_the_excerpt( $post_id )
    		);
    				
    		if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) {
    			$list_items_markup .= sprintf(
    				'<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>',
    				esc_attr( get_the_date( 'c', $post_id ) ),
    				esc_html( get_the_date( '', $post_id ) )
    			);
    		}
    		$list_items_markup .= "</li>\n";
    	}
    
    	$class = 'wp-block-latest-posts';
    	if ( isset( $attributes['align'] ) ) {
    		$class .= ' align' . $attributes['align'];
    	}
    
    	if ( isset( $attributes['postLayout'] ) && 'grid' === $attributes['postLayout'] ) {
    		$class .= ' is-grid';
    	}
    
    	if ( isset( $attributes['columns'] ) && 'grid' === $attributes['postLayout'] ) {
    		$class .= ' columns-' . $attributes['columns'];
    	}
    
    	if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) {
    		$class .= ' has-dates';
    	}
    
    	if ( isset( $attributes['className'] ) ) {
    		$class .= ' ' . $attributes['className'];
    	}
    
    	$block_content = sprintf(
    		'<ul class="%1$s">%2$s</ul>',
    		esc_attr( $class ),
    		$list_items_markup
    	);
    
    	return $block_content;
    }
    
    /**
     * Registers the <code>core/latest-posts</code> block on server.
     */
    function register_block_core_latest_posts() {
    	register_block_type(
    		'core/latest-posts',
    		array(
    			'attributes'      => array(
    				'categories'      => array(
    					'type' => 'string',
    				),
    				'className'       => array(
    					'type' => 'string',
    				),
    				'postsToShow'     => array(
    					'type'    => 'number',
    					'default' => 5,
    				),
    				'displayPostDate' => array(
    					'type'    => 'boolean',
    					'default' => false,
    				),
    				'postLayout'      => array(
    					'type'    => 'string',
    					'default' => 'list',
    				),
    				'columns'         => array(
    					'type'    => 'number',
    					'default' => 3,
    				),
    				'align'           => array(
    					'type' => 'string',
    				),
    				'order'           => array(
    					'type'    => 'string',
    					'default' => 'desc',
    				),
    				'orderBy'         => array(
    					'type'    => 'string',
    					'default' => 'date',
    				),
    			),
    			'render_callback' => 'render_block_core_latest_posts',
    		)
    	);
    }
    
    add_action( 'init', 'register_block_core_latest_posts' );
    

    As I said, thumbnail is working well, so I don’t really get why the excerpt doesn’t.
    Much appreciation to any help,
    Florian

    florianwilhelm

    (@florianwilhelm)

    Hi,

    Removing get_ from get_the_excerpt doesn’t change anything for me, it still displays the current page excerpt instead of the $post_id one.

    I think it comes from the fact it doesn’t get $post_id as a valid argument, and the default value get_the_excerpt() and the_excerpt() are the global post (the current page/post).
    My knowledges in PhP are not so good, which makes it hard for me to identify clearly the problem.

    florianwilhelm

    (@florianwilhelm)

    By the way, I tried adding manualy an excerpt to my post with <!–more–> just to be sure it was not a conflict caused by the lack of excerpt in my post, but it doesn’t change anything to my Latest Posts block.

    florianwilhelm

    (@florianwilhelm)

    Hi,

    I solved my problem using the following piece of code:

    foreach ( $recent_posts as $post ) {
    		$post_id = $post['ID'];
    
    		$title = get_the_title( $post_id );
    		if ( ! $title ) {
    			$title = __( '(Untitled)' );
    		}
    		
    		$post_url = get_permalink( $post_id );
    		
    		$text = get_post( $post_id );
    		$text = $text->post_content;
    		$text = wp_trim_words( $text, 25, '... <a href="'.$post_url.'">read&nbsp;more</a>' );
    		$excerpt = $text;
    				
    		$list_items_markup .= sprintf(
    			'<li>
    			<a href="%2$s">%1$s%3$s</a><p>%4$s</p>',
    			get_the_post_thumbnail( $post_id ),
    			esc_url( get_permalink( $post_id ) ),
    			esc_html( $title ), 
    			$excerpt
    		);

    It shows the target post 25 first words and I put a link on the read more to access said post. It might not be the best way to do this but it works, which makes it the best way for me 😀

    Hope it might help if someone has the same issue.
    Have a nice day,
    Florian

    • This reply was modified 3 months ago by  florianwilhelm. Reason: solved

    Hi Florian, thanks for your post and the solutions.
    I want to accomplish the same thing, But what happens when wordpress makes an update and you do the automatic update? Your change will be overridden with the new wp-include/blocks php right? Is there a way to make this local to the theme?

    As it goes to wp-include, i don’t think you can include it to a theme or whatever.
    My take on this at the moment is just to keep it in mind each time I have a wp update, which of course is not the best :/

    Right… thanks for replying.

Viewing 8 replies - 1 through 8 (of 8 total)
  • You must be logged in to reply to this topic.