تابع wp_get_attachment_metadata در وردپرس
تابع wp_get_attachment_metadata() یکی از ابزارهای اساسی برای دسترسی به اطلاعات فنی فایلهای بارگذاریشده (attachments) در وردپرس است. این تابع معمولاً برای کار با تصاویر استفاده میشود ولی برای فایلهای دیگر مانند ویدئو و صوت هم متادیتا ذخیره میکند. در این مقاله به صورت دقیق عملکرد، ساختار خروجی، مثالهای کاربردی و نکات حرفهای پیرامون استفاده از این تابع را بررسی میکنیم.
وظیفه و خروجی تابع
این تابع آرایهای از متادیتا را برای یک attachment مشخص برمیگرداند. این متادیتا در ستون متا با کلید _wp_attachment_metadata در جدول postmeta ذخیره میشود. نتیجه میتواند شامل موارد زیر باشد:
- نام فایل و مسیر نسبی
- عرض و ارتفاع تصویر
- آرایه sizes که هر اندازه (thumbnail, medium, large, …) و مسیر/ابعاد آن را دارد
- image_meta شامل EXIF/خلاصهای از دادههای دوربین
نمونه ساختار خروجی
| کلید | توضیح |
|---|---|
| file | مسیر نسبی فایل از پوشه uploads |
| width / height | ابعاد تصویر اصلی |
| sizes | آرایه شامل ورژنهای مختلف سایز با file, width, height |
| image_meta | اطلاعات EXIF/دوربین (در صورت موجود) |
مثال پایه — خواندن متادیتا
/**
* Get attachment metadata and print it for debugging
*/$attachment_id = 123; // شناسه پیوست
$meta = wp_get_attachment_metadata( $attachment_id );
if ( ! $meta ) {
// No metadata found
return;
}
echo '<pre>';
print_r( $meta );
echo '</pre>';این کد متادیتا را برای id مشخص میگیرد و با print_r نمایش میدهد. اگر مقدار false یا خالی باشد یعنی متادیتا برای آن attachment ذخیره نشده است یا فایل مورد نظر وجود ندارد.
مثال کاربردی — گرفتن آدرس همه سایزهای تصویر و ساخت srcset
/**
* Build srcset attribute from attachment metadata
*/function build_srcset_from_meta( $attachment_id ) {
$meta = wp_get_attachment_metadata( $attachment_id );
if ( ! $meta || empty( $meta['sizes'] ) ) {
return '';
}
$upload_dir = wp_get_upload_dir();
$base_url = trailingslashit( $upload_dir['baseurl'] ) . dirname( $meta['file'] ) . '/';
$srcset_items = array();
foreach ( $meta['sizes'] as $size ) {
$url = $base_url . $size['file'];
$width = isset( $size['width'] ) ? $size['width'] : '';
if ( $width ) {
$srcset_items[] = esc_url( $url ) . ' ' . intval( $width ) . 'w';
}
}
return implode( ', ', $srcset_items );
}این تابع برای یک attachment مشخص آرایه sizes را بررسی میکند، آدرس هر نسخه را میسازد و یک مقدار srcset استاندارد تولید میکند که میتوان در تگ <img> قرار داد.
نکات عملی و بهترین شیوهها
- چک کنید مقدار
wp_get_attachment_metadata()ممکن استfalseیا آرایه خالی باشد؛ همیشه بررسی کنید قبل از کار با آن. - متادیتا روی پایگاهداده ذخیره میشود؛ اگر نیاز به تغییر دارید از
wp_update_attachment_metadata()استفاده کنید. - برای تولید مجدد اندازهها از
wp_generate_attachment_metadata()استفاده کنید و سپس باwp_update_attachment_metadata()ذخیره کنید. - برای بهینهسازی عملکرد در حلقههای بزرگ، متادیتا را کش کنید یا از WP_Query با
meta_queryمناسب استفاده کنید تا تعداد فراخوانیها کاهش یابد.
تولید مجدد متادیتا (مثال پیشرفته)
/**
* Regenerate metadata if missing and update attachment
*/function regenerate_attachment_meta_if_missing( $attachment_id ) {
$meta = wp_get_attachment_metadata( $attachment_id );
if ( $meta && ! empty( $meta['sizes'] ) ) {
return $meta; // already has sizes
}
$file = get_attached_file( $attachment_id ); // مسیر کامل فایل
if ( ! file_exists( $file ) ) {
return false;
}
// Generate metadata and update DB
$generated = wp_generate_attachment_metadata( $attachment_id, $file );
if ( ! is_wp_error( $generated ) ) {
wp_update_attachment_metadata( $attachment_id, $generated );
}
return $generated;
}این تابع بررسی میکند که آیا متادیتا وجود دارد یا نه؛ در صورت نبودن یا ناقص بودن، از فایل موجود در uploads استفاده کرده و متا را بازتولید میکند. سپس آن را در پایگاهداده ذخیره مینماید.
نمونه کاربرد: خواندن اطلاعات EXIF دوربین
$meta = wp_get_attachment_metadata( $attachment_id );
if ( ! empty( $meta['image_meta'] ) ) {
$camera = isset( $meta['image_meta']['camera'] ) ? $meta['image_meta']['camera'] : '';
$aperture = isset( $meta['image_meta']['aperture'] ) ? $meta['image_meta']['aperture'] : '';
// نمایش به صورت امن
echo esc_html( $camera ) . ' - ' . esc_html( $aperture );
}در این مثال مقادیر EXIF مانند دوربین یا دیافراگم از بخش image_meta خوانده میشوند. توجه داشته باشید که همیشه دادهها را با تابعهای امنسازی خروجی مانند esc_html یا esc_attr نمایش دهید.
نکات امنیتی و عملکرد
- خواندن متادیتا برای هزاران تصویر میتواند هزینهبر باشد؛ از کشینگ (Object Cache یا Transients) استفاده کنید.
- هرگز مستقیماً روی فایلهای uploads بدون بررسی مجوز کار نکنید؛ از توابع وردپرس برای مسیرها و عملیات فایل بهره ببرید.
- اگر برچسبها یا دادههای حساس در EXIF وجود دارند، برای حریم خصوصی کاربران پاکسازی را در نظر بگیرید.
جمعبندی و کاربردهای واقعی
تابع wp_get_attachment_metadata یک منبع معتبر برای دریافت اطلاعات ساختاری فایلهای پیوست در وردپرس است. با استفاده از آن میتوانید:
- نسخههای مختلف تصویر را لیست و آدرسدهی کنید
- مقدار srcset تولید کنید و تصاویر ریسپانسیو بسازید
- اطلاعات EXIF را بخوانید و در گالریها یا پستها نمایش دهید
- در صورت نیاز متادیتا را بازتولید و اصلاح کنید
با رعایت نکات عملکردی و امنیتی میتوانید از این تابع در توسعه قالبها و افزونهها به طور مؤثر و بهینه استفاده کنید.
آیا این مطلب برای شما مفید بود ؟




