最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

Build table using Advanced Custom Fields

matteradmin54PV0评论

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.

Articles related to this article

Post a comment

comment list (0)

  1. No comments so far