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
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.
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 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