I have a question around displaying posts and custom posts in Gutenberg blocks using Advanced Custom Fields. I want to query all posts of a post type, but split the loop as I need different layouts for individual posts. I want to display the posts in a grid that has different rows and column heights (see image below) and not use external css for this, as I'm working with TailwindCSS. For this I would normally use a function that splits the loop, as described here: https://vanrossum.dev/20-splitting-the-wordpress-loop
//functions.php
function posts_from_loop( $amount, $callback ) {
global $wp_query;
$count = 0;
while ( ( $count < $amount ) && ( $wp_query->current_post 1 < $wp_query->post_count ) ) {
$wp_query->the_post();
$callback();
$count ;
}
}
and use it like the following:
//home.php
<div >
<?php
posts_from_loop( 2, function() {
get_template_part( 'partials/post-w50' );
});
?>
</div>
<div >
<?php
posts_from_loop( 3, function() {
get_template_part( 'partials/post-w33' );
});
?>
</div>
<?php while ( have_posts() ) {
the_post();
?>
<?php get_template_part( 'partials/post-w100' ); ?>
<?php } ?>
However, the function does not work inside a Gutenberg block and also not with custom post types. I tried to set it up like the following
//block.php
<?php
$args = array(
'post_type' => 'posts',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'ASC',
);
$loop = new WP_Query($args);
?>
<?php if ($loop->have_posts()) : ?>
<div >
<?php
posts_from_loop(1, function () { ?>
<?php get_template_part('template-parts/partials/post', "featured"); ?>
<?php }); ?>
</div>
<div >
<?php
posts_from_loop(4, function () {
get_template_part('template-parts/partials/post', 'color');
});
?>
<?php while (have_posts()) {
the_post();
?>
<?php get_template_part('template-parts/partials/post', "image"); ?>
<?php } ?>
</div>
<?php endif ?>
Would be nice, if someone could help me with
- Splitting the wordpress loop inside gutenberg blocks efficiently without a counter
- Splitting the wordpress loop with custom post types and acf
Post-Grid that I want to display with splitting the loop
CodePudding user response:
The function posts_from_loop
is acting on the global
query, you have a custom one. The quickest fix would be to pass the custom query in as an optional parameter, falling back to the global if not provided (for BC with any code that is already using the function).
function posts_from_loop( $amount, $callback, $query = null ) {
if(!$query) {
global $wp_query;
$query = $wp_query;
}
$count = 0;
while ( ( $count < $amount ) && ( $query->current_post 1 < $query->post_count ) ) {
$query->the_post();
$callback();
$count ;
}
}
posts_from_loop(
4,
function () {
get_template_part('template-parts/partials/post', 'color');
},
$loop
)