Advanced Custom Fieldsでループ処理が途中までしか表示されない

WordPressでカスタムフィールドを扱うとき、多くの開発者がAdvanced Custom Fields(ACF)を利用します。しかし、大量のデータを一度に取得しようとすると、一部のデータが表示されないという問題に直面することがあります。

今回、私たちはその一例に遭遇しました。ACFを利用して15個のPDFファイルを表示し、それぞれのダウンロードリンクを作成しようとしたところ、11個目以降のファイルが表示できないという問題が発生しました。以下にその時のコードを示します。

<?php for ($i=1; $i<=15; $i++) :  ?>
    <?php if(get_field('addgroup'.$i)['title'] && get_field('addgroup'.$i)['file']['url']): ?>
    <div class="column column-2pc37">
        <div class="column__item">
            <a href="<?php echo get_field('addgroup'.$i)['file']['url']; ?>" download = "<?php echo get_field('addgroup'.$i)['title']; ?>.pdf">
                <div class="ep-btn es-TpaddingS es-BpaddingS es-RpaddingM es-LpaddingM es-Fbig es-bold es-borderSolidS bgc-white brc-DLblue ftc-DLblue es-BTarrow">
                    <?php echo get_field('addgroup'.$i)['title']; ?>
                </div>
            </a>
        </div>
        <div class="column__item"></div>
    </div>
    <hr>
    <?php endif; ?>
<?php endfor; ?>

このコードでは、ACFの get_field() 関数を使って各ファイルのデータを取得しています。しかし、11個目以降のファイルは表示されず、問題が発生しています。

原因と解決策

この問題の原因は、ACFの get_field() 関数が内部で行っている処理にあります。この関数は内部でかなりの処理を行っており、サーバーのリソースや設定に影響される可能性があります。一度に大量のデータを取得しようとすると、リソースが使い果たされて一部のデータが取得できなくなる場合があります。

この問題を解決するために、WordPressの get_post_meta() 関数を使ってデータを直接取得する方法を試みました。この関数を使用することで、ACFの get_field() が行う処理をスキップでき、リソースの消費を抑えることができます。

以下に、改善したコードを示します。

<?php
for ($i = 1; $i <= 15; $i++) {
    $group_field = get_post_meta(get_the_ID(), 'addgroup' . $i, true);
    if ($group_field) {
        $title = $group_field['title'];
        $file_id = $group_field['file'];
        $file_url = wp_get_attachment_url($file_id);
        if ($title && $file_url) { ?>
            <div class="column column-2pc37">
                <div class="column__item">
                    <a href="<?php echo $file_url; ?>" download="<?php echo $title; ?>.pdf">
                        <div class="ep-btn es-TpaddingS es-BpaddingS es-RpaddingM es-LpaddingM es-Fbig es-bold es-borderSolidS bgc-white brc-DLblue ftc-DLblue es-BTarrow">
                            <?php echo $title; ?>
                        </div>
                    </a>
                </div>
                <div class="column__item"></div>
            </div>
            <hr>
        <?php }
    }
} ?>

このように、 get_post_meta() を使用してデータを直接取得することで、全てのリンクが正常に表示されるようになりました。ACFを使って大量のデータを扱う際には、このような方法を試してみると良いでしょう。

Conoha Wing

爆速で表示されるこのブログのサーバーはConoha Wingです。
詳細は下記!!

おすすめの記事