I have the following code (view.js
) for a Gutenberg block which uses the Interactivity API that renders posts when clicking a button:
import { store, getContext, getElement } from '@wordpress/interactivity'; store('my-store', { callbacks: { renderContent() { const context = getContext(); const element = getElement(); if (context.posts !== null) { var html = ''; for (var i = 0; i < context.posts.length; i++) { var post = context.posts[i]; html += '<article id="post-' + post.id + '" class="wp-block-infinite-latest-posts__post">'; html += '<h2 class="wp-block-infinite-latest-posts__post-title">' + post.title.rendered + '</h2>'; html += '<div class="wp-block-infinite-latest-posts__post-content">' + post.content.rendered + '</div>'; html += '</article>'; } context.offset = context.offset + context.number; element.ref.innerHTML += html; } }, }, actions: { *getPosts() { const context = getContext() const posts = yield fetch( 'https://' + window.location.hostname + '/wp-json/wp/v2/posts?per_page=' + encodeURIComponent(context.number) + '&offset=' + encodeURIComponent(context.offset) + '&categories=' + encodeURIComponent(context.category) ).then(function (response) { return response.json() }) context.posts = posts; }, } });
This is the render code in PHP:
<?php $block_attributes = get_block_wrapper_attributes() ?> <div <?php echo $block_attributes; ?> data-wp-interactive="my-store" <?php echo wp_interactivity_data_wp_context( array( 'posts' => null, 'number' => $attributes['number'], 'offset' => 0, 'category' => $attributes['category'], ) ); ?> > <div data-wp-watch="callbacks.renderContent"></div> <button data-wp-on--click="actions.getPosts">Load more</button> </div>
The code works, but the user must click the 'Load more' button to display the first n posts. How can I modify my code so that the first n posts are rendered when the page loads? Is there an Interactivity API directive for this?