
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を使って大量のデータを扱う際には、このような方法を試してみると良いでしょう。