What’s wrong with my relationship loop?

I’m having a problem with a relationship loop with Advanced Custom Fields in WordPress.

The first post is shown perfect, but it should execute one more post, but it doesn’t.

Read More

Can anyone see what’s wrong with my code?

<?php $posts = get_field('produkter'); if( $posts ): ?>
<?php foreach( $posts as $post): ?>
<?php setup_postdata($post); ?>

<div class="produkt">
<?php the_title(); ?>
<?php the_content(); ?>

<?php $posts = get_field('fil'); if( $posts ): ?>

<div id="filer">
<div id="topsection" class="laddahem"><div class="topborder"></div>
<h2>Ladda hem</h2>
</div><!-- #top -->

<div class="filhuvud">
    <div class="filtyp">Filtyp</div>
    <div class="fildatum">Datum</div>
    <div class="filstorlek">Filstorlek</div>
</div><!-- .filhuvud -->

<div class="filholder">

<?php foreach( $posts as $post): ?>
<?php setup_postdata($post); ?>

<?php $attachment_id = get_field('filen');
$url = wp_get_attachment_url( $attachment_id );
$title = get_the_title( $attachment_id );

// hämta filstorleken
$filesize = filesize( get_attached_file( $attachment_id ) );
$filesize = size_format($filesize, 1);

$filetype = strtolower(pathinfo($url, PATHINFO_EXTENSION)); ?>

<div class="fil <?php echo $filetype; ?>">
    <div class="filtyp"><a target="_blank" href="<?php echo $url; ?>" ><?php the_title(); ?></a></div>
    <div class="fildatum"><?php the_time('Y-m-d'); ?></div>
    <div class="filstorlek"><?php echo $filesize; ?></div>
</div><!-- .fil -->

<?php endforeach; ?>
<?php wp_reset_postdata(); ?>

</div><!-- .filholder -->

</div><!-- #filer --> 

<?php endif; ?>

</div><!-- .produkt -->

<?php endforeach; ?>
<?php wp_reset_postdata(); ?>
<?php endif; ?>

Related posts

Leave a Reply

2 comments

  1. Your issue is that you’re overwriting the $posts variable within the loop, after you’ve defined it outside of the loop.

    The solution is to rename your second $posts variable to something else, so that your overarching loops look like this:

      <?php $posts = get_field('produkter'); ?>
    
      <?php if( $posts ): ?>
        <?php foreach( $posts as $post): ?>
    
    
          <?php $files = get_field('fil'); //RENAMED THIS VARIABLE?>
          <?php if( $files ): ?>
    
             <?php foreach( $files as $file): ?>
    
                   <?php //Main body of markup and other fun stuff ?>
    
             <?php endforeach; //end $files foreach ?>
    
          <?php endif; //end $files if ?>
    
         <?php endforeach; //end $posts foreach ?>
      <?php endif; //end $posts if ?>
    
  2. The solution was to change the other foreach loop to this:

    <?php $files = get_field('fil'); if( $files ): ?>
    <?php foreach( $files as $post): ?>
    <?php setup_postdata($post); ?>
    

    That made it work exactly how I wanted it.