تابع get_post در وردپرس
تابع get_post() یکی از توابع پایهای وردپرس برای واکشی اطلاعات یک پست (یا هر نوع پست تایپ) از دیتابیس است. این تابع یک شیء از کلاس WP_Post یا آرایهای از فیلدهای پست را برمیگرداند و برای زمانی که نیاز به دسترسی مستقیم به فیلدهای پست خارج از حلقه (The Loop) دارید، بسیار مفید است.
تعریف و امضای تابع
| پارامتر | نوع | توضیح |
|---|---|---|
| post | int|WP_Post|null | آیدی پست، شیء WP_Post یا null برای پست جاری |
| output | OBJECT|ARRAY_A|ARRAY_N | فرمت خروجی: شیء، آرایه انجمنی یا آرایه عددی |
| filter | string | نحوه فیلتر شدن خروجی (مثلاً ‘raw’ یا ‘display’) |
مقدار بازگشتی
get_post() در حالت معمول شیء WP_Post بازمیگرداند یا اگر پست وجود نداشته باشد مقدار null. اگر output را به ARRAY_A یا ARRAY_N تنظیم کنید، آرایهای از فیلدهای پست دریافت خواهید کرد.
نمونههای کاربردی و بهترین روشها
۱. گرفتن پست بر اساس آیدی و نمایش عنوان و محتوا
$post = get_post( 42 );
if ( $post ) {
echo esc_html( $post->post_title );
echo apply_filters( 'the_content', $post->post_content );
}در این مثال ابتدا پست با آیدی 42 گرفته میشود. سپس برای نمایش عنوان از esc_html استفاده شده تا خروجی امن باشد و برای محتوا از فیلتر the_content استفاده شده تا مشابه نمایش در قالب، فیلترها و embedها روی محتوا اعمال شوند.
۲. دریافت پست به صورت آرایه و چک کردن فیلدها
$post_array = get_post( 42, ARRAY_A );
if ( $post_array ) {
echo esc_html( $post_array['post_title'] );
}اگر بخواهید با آرایه کار کنید میتوانید output را به ARRAY_A بدهید. توجه داشته باشید آرایه شامل همان کلیدهای دیتابیس مانند post_title، post_content و post_type است.
۳. استفاده از setup_postdata برای دسترسی به توابع قالب
$my_post = get_post( 42 );
if ( $my_post ) {
global $post;
$backup = $post;
$post = $my_post;
setup_postdata( $post );
// حالا میتوان توابع قالب مثل the_title() را صدا زد
the_title();
the_content();
wp_reset_postdata();
$post = $backup;
}اگر میخواهید از توابع قالبی که به متغیر سراسری $post وابستهاند استفاده کنید، ابتدا پست را به $post اختصاص داده، setup_postdata را فراخوانی و در پایان wp_reset_postdata را اجرا کنید تا وضعیت قبلی بازگردد.
۴. استفاده با get_post_meta برای دریافت فیلدهای سفارشی
$post = get_post( $id );
if ( $post ) {
$subtitle = get_post_meta( $post->ID, 'subtitle', true );
echo esc_html( $subtitle );
}برای گرفتن متا یا فیلدهای سفارشی از get_post_meta استفاده کنید. توجه داشته باشید که get_post فقط ساختار پست را برمیگرداند و متاها باید جداگانه خوانده شوند.
نکات امنیتی و بهینهسازی
- پاکسازی خروجی: همواره قبل از چاپ فیلدها از توابعی مانند esc_html، esc_attr یا wp_kses_post استفاده کنید.
- فرمت محتوا: برای نمایش محتوا از apply_filters(‘the_content’, …) استفاده کنید تا shortcodes، embeds و autop اعمال شوند.
- Caching و تعداد درخواستها: اگر تعداد زیادی پست نیاز دارید، از WP_Query یا get_posts با پارامتر مناسب استفاده کنید تا یک پرسوجو انجام شود و از فراخوانی مکرر get_post جلوگیری شود.
- عملیات درون حلقه: در داخل حلقه پیشفرض (the loop) معمولاً نیازی به get_post ندارید، زیرا $post و توابع قالبی در دسترس هستند.
مقایسه get_post با WP_Query
get_post برای واکشی یک پست خاص یا زمانی که یک شناسه دارید مناسب است. اما اگر قصد دارید مجموعهای از پستها را با شرطهای مختلف بگیرید یا صفحهبندی انجام دهید، WP_Query یا get_posts انتخاب بهتری هستند؛ زیرا در یک فراخوانی میتوانید چندین پست را بگیرید و کنترل بیشتری روی کوئری دارید.
مثال پیشرفته: گرفتن پست والد و نمایش خواهر و برادرها
$post = get_post( $id );
if ( $post && $post->post_parent ) {
$siblings = get_posts( array(
'post_type' => $post->post_type,
'post_parent' => $post->post_parent,
'post_status' => 'publish',
'exclude' => $post->ID,
) );
foreach ( $siblings as $s ) {
echo '<a href="' . esc_url( get_permalink( $s ) ) . '">' . esc_html( $s->post_title ) . '</a><br>';
}
}در این مثال ابتدا پست فعلی گرفته میشود، سپس اگر پست دارای والد باشد، با یک get_posts لیست خواهر و برادرها (سایبلینگها) گرفته شده و نمایش داده میشود. این روش به سادگی ارتباط بین پستها در ساختار سلسله مراتبی را نشان میدهد.
نکات تخصصی و خطاهای رایج
- فراموش کردن بررسی مقدار بازگشتی: همیشه قبل از استفاده از خواص شیء، بررسی کنید که get_post مقدار null برنگردانده باشد.
- تداخل با فیلترها: پارامتر filter را تنها زمانی تغییر دهید که از تأثیر روی خروجی آگاه هستید. معمولاً ‘raw’ مناسب است و فیلترهای قالبی را حذف میکند.
- بازیابی اطلاعات بزرگ: اگر فقط به یک فیلد مانند post_title نیاز دارید، بهتر است با یک کوئری اختصاصی یا استفاده از چهارنُلها (transients) از بار اضافی جلوگیری کنید.
بهینهسازی مثال — استفاده از WP_Query برای چند پست
// بد: حلقهای از get_post که برای هر آیدی یک کوئری جدا اجرا میکند
$ids = array(1,2,3,4);
foreach ( $ids as $id ) {
$p = get_post( $id ); // هر بار پرسوجوی جدا
echo esc_html( $p->post_title );
}
// خوب: یک کوئری یکجا
$query = new WP_Query( array( 'post__in' => $ids, 'orderby' => 'post__in' ) );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
the_title();
}
wp_reset_postdata();
}در این بهینهسازی با یک WP_Query واحد همه پستها گرفته میشوند که از اجرای چندین پرسوجو جلوگیری میکند و به عملکرد سایت کمک میکند.
جمعبندی
get_post() یک ابزار ساده اما قدرتمند برای دسترسی به دادههای پست در وردپرس است. با درک خروجیها (شیء یا آرایه)، نحوه اعمال فیلترها، و تعامل صحیح با متغیر سراسری $post و توابع قالبی میتوانید از آن در سناریوهای متنوع استفاده کنید. در عین حال همواره به نکات امنیتی و بهینهسازی توجه کنید تا عملکرد و امنیت سایت حفظ شود.
آیا این مطلب برای شما مفید بود ؟




