まず、WordPressの管理画面から、以下の2つのACFフィールドを作成します。
ユーザーがPDFをアップロードするためのフィールドです。
ファイルファイルID
このフィールドは、PHPコードによって自動生成された画像IDを保存するために使います。ユーザーに見せる必要はないので、非表示設定を行います。
pdf_thumbnail画像次に、PDFがアップロードされた際に表紙画像を自動で生成し、pdf_thumbnailフィールドに保存するPHPコードを、あなたのテーマの**functions.php**ファイルに追記します。
このコードは、PDFを処理するためにImagickというPHP拡張機能を利用します。お使いのサーバーにImagickがインストールされているか、事前に確認しておきましょう。
function convert_pdf_to_image_on_save($post_id) {
// あなたの「PDFアップロード用フィールド」のフィールド名を指定します
$pdf_field_name = 'your_pdf_field_name'; // ここを置き換えてください
$pdf_id = get_field($pdf_field_name, $post_id, false);
// PDFがアップロードされ、かつImagickが利用可能か確認
if ($pdf_id && class_exists('Imagick')) {
$pdf_path = get_attached_file($pdf_id);
if ($pdf_path) {
try {
// PDFの1ページ目(表紙)を画像に変換
$imagick = new Imagick();
$imagick->setResolution(300, 300);
$imagick->readImage($pdf_path . '[0]');
$imagick->setImageFormat('jpeg');
// 一時ファイルに画像を保存
$temp_image_path = sys_get_temp_dir() . '/' . basename($pdf_path, '.pdf') . '.jpg';
$imagick->writeImage($temp_image_path);
// WordPressのメディアライブラリに画像をアップロードし、IDを取得
$file = array(
'name' => basename($temp_image_path),
'tmp_name' => $temp_image_path
);
$attachment_id = media_handle_sideload($file, $post_id);
if (!is_wp_error($attachment_id)) {
// `pdf_thumbnail`フィールドに画像のIDを保存
update_field('pdf_thumbnail', $attachment_id, $post_id);
}
// 一時ファイルを削除
unlink($temp_image_path);
} catch (ImagickException $e) {
// エラーが発生した場合の処理
error_log("PDF to Image conversion failed: " . $e->getMessage());
}
}
}
}
add_action('acf/save_post', 'convert_pdf_to_image_on_save', 20);最後に、Elementor Proのループテンプレートでpdf_thumbnailフィールドを動的に表示します。
pdf_thumbnailを選択します。これで、PDFをアップロードして投稿を保存するだけで、自動的に生成された表紙画像がElementorのループに表示されるようになります。
この方法を設定すれば、PDFの表紙画像を手動で作成・アップロードする手間がなくなります。特に、PDFを頻繁に更新・追加するサイトでは、この自動化が大きな時間短縮につながります。
もし途中でうまくいかない場合は、functions.phpのコードに記述ミスがないか、またはサーバー環境がImagickに対応しているかをご確認ください。