تابع get_post_type در وردپرس
تابع get_post_type() یکی از توابع ساده اما حیاتی در توسعه قالب و افزونههای وردپرس است. این تابع نوع (post type) یک نوشته یا آیتم را برمیگرداند؛ مثل post، page، attachment یا هر Custom Post Type که ثبت شده باشد. در ادامه به شرح پارامترها، مثالهای عملی، نکات عملکردی و روشهای بهینهسازی میپردازیم.
فرم کلی و مقدار بازگشتی
امضای تابع بهصورت زیر است:
get_post_type( $post = null )توضیح: این تابع یا رشتهای شامل نام نوع محتوا (مثلاً “post” یا “product”) برمیگرداند و در صورت نامعتبر بودن ورودی false بازمیگردد.
پارامترها
- $post (اختیاری): میتواند شناسه نوشته (ID)، آبجکت WP_Post یا اگر مقدار null باشد از
global $postاستفاده میکند.
مثال پایه در داخل لوپ (The Loop)
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
$type = get_post_type(); // از global $post استفاده میکند
echo "<h2>نوع نوشته: " . esc_html( $type ) . "</h2>";
}
}توضیح: در این نمونه، پس از فراخوانی the_post()، تابع get_post_type() نوع نوشته جاری را برمیگرداند. سپس با esc_html() برای امنیت خروجی چاپ میشود.
استفاده با شناسه یا آبجکت نوشته
$post_id = 42;
$type = get_post_type( $post_id );
$post_obj = get_post( $post_id );
$type2 = get_post_type( $post_obj );توضیح: اینجا نشان دادهایم که میتوان بهطور صریح شناسه یا آبجکت را به تابع داد تا وابستگی به global $post حذف شود؛ مخصوصاً در جاهایی که خارج از لوپ هستید یا در توابع کمکی استفاده میکنید مفید است.
نمونه کاربردی: لود کردن تمپلیت متفاوت بر اساس نوع نوشته
$type = get_post_type( $post );
if ( 'product' === $type ) {
get_template_part( 'template-parts/single', 'product' );
} elseif ( 'portfolio' === $type ) {
get_template_part( 'template-parts/single', 'portfolio' );
} else {
get_template_part( 'template-parts/single', 'default' );
}توضیح: این الگو نشان میدهد چگونه براساس نوع نوشته فایل قالب مناسب را بارگذاری کنیم. استفاده از مقایسه سخت (===) توصیه میشود تا از مشکلات نوع داده جلوگیری شود.
مثال پیشرفته: ثبت شرط برای افزودن کلاس CSS در آرایه بدنه
add_filter( 'body_class', function( $classes ) {
if ( is_singular() ) {
$type = get_post_type();
$classes[] = 'single-' . $type;
}
return $classes;
} );توضیح: در این فیلتر، برای هر صفحه تک نوشته، یک کلاس CSS مطابق با نوع نوشته به آرایه کلاسهای بدنه اضافه میشود. میتوان از این کلاس برای استایلدهی اختصاصی استفاده کرد.
نکات و ترفندهای حرفهای
- عدم ایجاد پرسوجوی اضافی: اگر آبجکت WP_Post در دسترس دارید، حتماً آن را به تابع پاس دهید تا از فراخوانیهای اضافی دیتابیس جلوگیری شود.
- مقایسه ایمن: از مقایسه با === استفاده کنید تا مشکلات تبدیل نوع (type juggling) پیش نیاید.
- پیشفرض مناسب: گاهی بهتر است مقدار پیشفرض تعیین کنید:
$type = get_post_type( $post ) ?: 'post'; - تفاوت با get_post_type_object(): این تابع فقط نام نوع را برمیگرداند؛ برای دریافت مشخصات کامل نوع نوشته از جمله قابلیتها و برچسبها از
get_post_type_object()استفاده کنید.
مقایسه کوتاه توابع مرتبط
| تابع | کاربرد |
|---|---|
| get_post_type() | بازگرداندن نام نوع نوشته (string) یا false |
| get_post_type_object() | بازگرداندن آبجکت تنظیمات نوع نوشته (WP_Post_Type) |
| get_post_types() | دریافت لیست انواع نوشته ثبتشده |
موارد کاربرد واقعی (Use Cases)
- نمایش فیلدهای متا یا بلوکهای متفاوت در قالبهای تک نوشته بر اساس نوع نوشته.
- اجرای منطق متفاوت در hooks و filters برای انواع نوشته مشخص (مثلاً ارسال اعلان تنها برای محصولات).
- سفارشیسازی خروجی RSS یا JSON بر اساس نوع نوشته.
- ساخت query داینامیک:
'post_type' => get_post_type( $post ).
خطاها و نکات رایج
- اگر خارج از لوپ و بدون پاس دادن شناسه/آبجکت از تابع استفاده کنید، مقدار false بازمیگردد.
- برای بررسی وجود یک Custom Post Type قبل از استفاده، میتوانید از
post_type_exists()کمک بگیرید. - بازگشت نوع revision یا attachment در برخی شرایط طبیعی است؛ برای جلوگیری از بروز اشتباهات، انواعی که نمیخواهید را فیلتر کنید.
بهینهسازی و عملکرد
تابع get_post_type() خودش سنگین نیست، اما استفاده نادرست (مثل فراخوانی داخل حلقه زیاد یا بدون پاس دادن آبجکت) میتواند به درخواستهای اضافی DB منجر شود. بهترین عملها:
- در حلقهها، فقط یکبار نوع را بخوانید و نتیجه را در متغیر نگهدارید.
- اگر مجموعهای از IDها دارید، از توابعی مثل
get_posts()با انتخاب فیلدهای لازم استفاده کنید تا تعداد فراخوانیها کاهش یابد.
نمونه: بهبود کد برای جلوگیری از فراخوانیهای مکرر
// بد (هر بار در حلقه فراخوانی میشود)
while ( have_posts() ) {
the_post();
if ( get_post_type() === 'product' ) {
// عملیات
}
}
// خوب (یکبار خوانده میشود)
while ( have_posts() ) {
the_post();
$ptype = get_post_type();
if ( 'product' === $ptype ) {
// عملیات
}
}توضیح: در نسخه «خوب»، نوع نوشته فقط یکبار خوانده و در متغیر ذخیره میشود که از فراخوانیهای اضافی جلوگیری میکند و خوانایی کد را افزایش میدهد.
جمعبندی
تابع get_post_type() ابزار ساده اما بسیار کاربردی برای شناسایی نوع محتوای جاری در وردپرس است. با آگاهی از نحوه استفاده صحیح، پاس دادن آبجکتها، و ترکیب آن با توابع دیگر مثل get_post_type_object() و post_type_exists() میتوانید منطق پیچیده و قابل اطمینانی در قالبها و افزونهها ایجاد کنید. رعایت نکات عملکردی و امنیتی (مثل استفاده از esc_* برای خروجی) به کیفیت پروژههای وردپرس شما کمک شایانی خواهد کرد.
آیا این مطلب برای شما مفید بود ؟




