Build table using Advanced Custom Fields

admin2025-06-07  28

I have a table that populates data pulled from ACF. It basically adds a PDF of a report if there's one available. I think I got that part figured out, but my code is awfully complicated and I'll like to simplify it with a switch statement or something similar. Also, how do I get the table to display a value of 'x' when there's no PDF file available? It's currently removing the cell and I don't want it to do that. Thanks in advance.

<table class="float-left table">
    <thead>
    <tr>
        <th scope="col">Company</th>
        <th scope="col">Annual Report</th>
        <th scope="col">Interim Statement</th>
        <th scope="col">Prospectus</th>
    </tr>
    </thead>
    <tbody>
    <?php if( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post(); ?>

        <?php if( have_rows( 'recent_documents') ): ?>
            <tr>
                <th>
                    <a href="<?php the_permalink(); ?>">
                        <?php the_title(); ?>
                    </a>
                </th>


                <?php while( have_rows( 'recent_documents') ): the_row(); ?>

                    <?php if ( have_rows( 'new_document') ): ?>

                        <?php while ( have_rows( 'new_document') ): the_row(); ?>

                            <?php if (strpos(get_sub_field( 'report_type'), "Annual") !==false): ?>
                                <td><a href="<?php the_sub_field('file'); ?>" target="_blank"><i class="fas fa-file-pdf"></i>annual</a>
                                </td>
                            <?php endif; ?>

                            <?php if (strpos(get_sub_field( 'report_type'), "Interim") !==false): ?>
                                <td><a href="<?php the_sub_field('file'); ?>" target="_blank"><i class="fas fa-file-pdf"></i>interim</a>
                                </td>
                            <?php endif; ?>

                            <?php if (strpos(get_sub_field( 'report_type'), "Prospectus") !==false): ?>
                                <td><a href="<?php the_sub_field('file'); ?>" target="_blank"><i class="fas fa-file-pdf"></i>Prospectus</a>
                                </td>
                            <?php endif; ?>
                        <?php endwhile; ?>


                    <?php endif; ?>

                <?php endwhile; ?>


            </tr>
        <?php endif; ?>

    <?php endwhile; endif; wp_reset_postdata(); ?>
    </tbody>
</table>

I have a table that populates data pulled from ACF. It basically adds a PDF of a report if there's one available. I think I got that part figured out, but my code is awfully complicated and I'll like to simplify it with a switch statement or something similar. Also, how do I get the table to display a value of 'x' when there's no PDF file available? It's currently removing the cell and I don't want it to do that. Thanks in advance.

<table class="float-left table">
    <thead>
    <tr>
        <th scope="col">Company</th>
        <th scope="col">Annual Report</th>
        <th scope="col">Interim Statement</th>
        <th scope="col">Prospectus</th>
    </tr>
    </thead>
    <tbody>
    <?php if( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post(); ?>

        <?php if( have_rows( 'recent_documents') ): ?>
            <tr>
                <th>
                    <a href="<?php the_permalink(); ?>">
                        <?php the_title(); ?>
                    </a>
                </th>


                <?php while( have_rows( 'recent_documents') ): the_row(); ?>

                    <?php if ( have_rows( 'new_document') ): ?>

                        <?php while ( have_rows( 'new_document') ): the_row(); ?>

                            <?php if (strpos(get_sub_field( 'report_type'), "Annual") !==false): ?>
                                <td><a href="<?php the_sub_field('file'); ?>" target="_blank"><i class="fas fa-file-pdf"></i>annual</a>
                                </td>
                            <?php endif; ?>

                            <?php if (strpos(get_sub_field( 'report_type'), "Interim") !==false): ?>
                                <td><a href="<?php the_sub_field('file'); ?>" target="_blank"><i class="fas fa-file-pdf"></i>interim</a>
                                </td>
                            <?php endif; ?>

                            <?php if (strpos(get_sub_field( 'report_type'), "Prospectus") !==false): ?>
                                <td><a href="<?php the_sub_field('file'); ?>" target="_blank"><i class="fas fa-file-pdf"></i>Prospectus</a>
                                </td>
                            <?php endif; ?>
                        <?php endwhile; ?>


                    <?php endif; ?>

                <?php endwhile; ?>


            </tr>
        <?php endif; ?>

    <?php endwhile; endif; wp_reset_postdata(); ?>
    </tbody>
</table>
Share Improve this question edited Oct 16, 2018 at 10:56 djboris 7585 silver badges10 bronze badges asked Oct 16, 2018 at 6:18 fridayikonfridayikon 34 bronze badges 1
  • 1 If you just fetch the contents of recent_documents, you’ll see that it’s a big multidimensional array with all of your data. I find that much easier to output directly rather than using all the have_rows nonsense. – Milo Commented Oct 16, 2018 at 14:55
Add a comment  | 

1 Answer 1

Reset to default 0

As I am new here too, I can't comment and ask for clarification or give some suggestions, so I'll do that here.

Why do you have nested repeaters recent_documents and new_document? It appears that recent_documents always has only single row, otherwise there would be a mess. But anyway, working with what you have, you could do something like this:

<table class="float-left table">
    <thead>
    <tr>
        <th scope="col">Company</th>
        <th scope="col">Annual Report</th>
        <th scope="col">Interim Statement</th>
        <th scope="col">Prospectus</th>
    </tr>
    </thead>
    <tbody>
    <?php if( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post(); ?>

        <?php if( have_rows( 'recent_documents') ): ?>
            <tr>
                <th>
                    <a href="<?php the_permalink(); ?>">
                        <?php the_title(); ?>
                    </a>
                </th>

                <?php
                // We get the inner repeater (if it exists)
                $documents = get_field( 'recent_documents' );

                // Create our 'dictionary' array
                $report_types = array( 'Annual', 'Interim', 'Prospectus' );

                // Loop through it. This will always create three cells, even if there are no documents.
                foreach ( $report_types as $key => $report_type ) : ?>
                    <td>
                        <?php
                        $new_document = ! empty( $documents[$key]['new_document'] ) ? $documents[$key]['new_document'][0] : false;

                        if ( ! $new_document 
                             || strpos( $new_document['report_type'], $report_type ) === false 
                             || empty( $new_document['file'] ) ) 
                        {
                            echo 'x';
                            continue;
                        }                        
                        echo '<a href="' . $new_document['file'] . '" target="_blank"><i class="fas fa-file-pdf"></i>' . $report_type . '</a>';
                        ?>
                    </td>
                <?php endforeach; ?>

            </tr>
        <?php endif; ?>

    <?php endwhile; endif; wp_reset_postdata(); ?>
    </tbody>
</table>

Let me know if this doesn't do what you wanted.

Please be aware that new_documents have to go in this particular order: Annual, Interim, Prospectus, otherwise it would skip documents even if they exist.

转载请注明原文地址:http://conceptsofalgorithm.com/Algorithm/1749256368a317660.html

最新回复(0)