التعامل مع Custom Post Types

(أنواع منشورات مخصصة) في ووردبريس

1. مقدمة: يعني إيه Custom Post Types؟

ووردبريس بيجي بواجهة جاهزة للكتابة زي المقالات (Posts) والصفحات (Pages)، بس ساعات بيكون عندك محتوى مختلف محتاج تنسقه وتعرضه بشكل مختلف، زي:

  • منتجات في متجر
  • مشاريع أعمال (Portfolio)
  • فيديوهات
  • مراجعات كتب
  • أي نوع محتوى خاص بيك

الأنواع دي بنسميها Custom Post Types أو “أنواع منشورات مخصصة”.

2. ليه نستخدم أنواع منشورات مخصصة؟

  • عشان تنظم المحتوى بشكل أفضل
  • عشان تخلي كل نوع محتوى له صفحة أرشيف خاصة وشكل عرض مختلف
  • عشان تضيف وظائف وحقول خاصة لنوع المحتوى ده
  • عشان تحسن تجربة المستخدم وتبسط إدارة المحتوى

3. الفرق بين المنشورات العادية وأنواع المنشورات المخصصة

الخاصيةمنشورات (Posts)صفحات (Pages)منشورات مخصصة (Custom Post Types)
نوع المحتوىمقالات، أخبارصفحات ثابتةأي نوع محتوى تخصصه بنفسك
الأرشيفنعملاحسب إعدادات النوع
التصنيفاتيدعم تصنيفاتلاممكن تدعم تصنيفات ووسوم
القوالبقالب المقالاتقالب الصفحاتتقدر تعمل قوالب خاصة

4. إزاي تنشئ نوع منشور جديد يدويًا في ملف functions.php

هنا بنستخدم الدالة register_post_type() داخل دالة مربوطة بـ init:

function abozaid_register_custom_post_type() {
    $labels = array(
        'name'               => __('منتجات', 'abozaid'),
        'singular_name'      => __('منتج', 'abozaid'),
        'add_new'            => __('أضف منتج جديد', 'abozaid'),
        'add_new_item'       => __('أضف منتج جديد', 'abozaid'),
        'edit_item'          => __('تعديل المنتج', 'abozaid'),
        'new_item'           => __('منتج جديد', 'abozaid'),
        'view_item'          => __('عرض المنتج', 'abozaid'),
        'search_items'       => __('بحث في المنتجات', 'abozaid'),
        'not_found'          => __('مافيش منتجات', 'abozaid'),
        'not_found_in_trash' => __('مافيش منتجات في سلة المهملات', 'abozaid'),
        'menu_name'          => __('المنتجات', 'abozaid'),
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'has_archive'        => true,
        'menu_icon'          => 'dashicons-cart',
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
        'rewrite'            => array('slug' => 'products'),
        'show_in_rest'       => true, // لتفعيل محرر Gutenberg
    );

    register_post_type('product', $args);
}
add_action('init', 'abozaid_register_custom_post_type');

5. شرح أهم الوسائط (Arguments) في register_post_type

  • labels: النصوص اللي بتظهر في لوحة التحكم
  • public: هل النوع ظاهر في الموقع ولوحة التحكم
  • has_archive: هل له صفحة أرشيف خاصة
  • menu_icon: أيقونة في لوحة التحكم
  • supports: الحقول اللي يدعمها النوع (العنوان، المحرر، الصور البارزة…)
  • rewrite: ضبط رابط الصنف
  • show_in_rest: تفعيل دعم محرر جوتنبرج (مهم جداً لو تستخدم المحرر الجديد)

6. إضافة دعم تكستوص، صورة بارزة، تصنيفات، وحقول مخصصة

لو عايز النوع الجديد يدعم التصنيفات أو الوسوم، لازم تضيف دوال تسجيل لها:

function abozaid_register_taxonomies() {
    register_taxonomy(
        'product_category', 
        'product', 
        array(
            'label' => __('تصنيفات المنتجات', 'abozaid'),
            'hierarchical' => true,
            'show_in_rest' => true,
        )
    );
}
add_action('init', 'abozaid_register_taxonomies');

وبكده تقدر تستخدم تصنيفات للمنتجات زي التصنيفات العادية.

7. طريقة عرض منشورات النوع المخصص في القالب

  • صفحة الأرشيف: لو عندك has_archive مفعلة، تقدر تعمل ملف قالب اسمه archive-product.php (لو اسم النوع هو product) لعرض كل المنشورات.
  • صفحة المفرد (Single): تعمل ملف single-product.php لعرض تفاصيل المنتج الواحد.

8. إنشاء ملفات قالب خاصة بالنوع المخصص

مثال بسيط لملف archive-product.php:

<?php get_header(); ?>

<h1>منتجاتنا</h1>

<?php if ( have_posts() ) : ?>
    <div class="products-list">
        <?php while ( have_posts() ) : the_post(); ?>
            <article id="post-<?php the_ID(); ?>">
                <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                <?php if ( has_post_thumbnail() ) {
                    the_post_thumbnail('medium');
                } ?>
                <p><?php the_excerpt(); ?></p>
            </article>
        <?php endwhile; ?>
    </div>
<?php else : ?>
    <p>مافيش منتجات متاحة دلوقتي.</p>
<?php endif; ?>

<?php get_footer(); ?>

9. مثال عملي كامل: إنشاء نوع منشور “منتجات”

1. تسجيل النوع في functions.php

(الكود اللي فوق في النقطة 4)

2. تسجيل تصنيف المنتجات (اختياري)

(الكود اللي فوق في النقطة 6)

3. إنشاء ملفات القالب:

  • archive-product.php
  • single-product.php

4. إضافة منتجات من لوحة التحكم وتجربتها

10. نصائح مهمة عند التعامل مع أنواع المنشورات المخصصة

  • اختار أسماء واضحة ومختصرة
  • فكر في الحقول اللي هتحتاجها (ممكن تستخدم Advanced Custom Fields أو أدوات أخرى)
  • دايمًا فعّل show_in_rest لو هتستخدم محرر جوتنبرج
  • خلي رابط النوع بسيط وواضح
  • صمم ملفات القالب بشكل متناسق مع شكل موقعك

11. استخدام إضافات لتسهيل إنشاء Custom Post Types

لو مش حابب تبرمج الكود، في إضافات ممتازة زي:

  • Custom Post Type UI
  • Pods
  • Toolset

دي بتسهل عليك إنشاء النوع بدون كود، وتديرهم من لوحة التحكم.

12. مراجعة سريعة

  • الأنواع المخصصة بتنظم المحتوى بشكل أفضل
  • تسجيل النوع بيتم باستخدام register_post_type
  • لازم تسجل التصنيفات لو عايزها مرتبطة بالنوع
  • ملفات القالب زي archive-{post_type}.php و single-{post_type}.php مهمة لعرض المحتوى
  • في إضافات بتسهل العملية لو مش محترف في الكود

13. أسئلة شائعة

س: هل الأنواع المخصصة بتأثر على سرعة الموقع؟
ج: لا، طالما الكود منظم ومفيش استعلامات غير ضرورية.

س: هل لازم أعمل ملفات قالب منفصلة لكل نوع؟
ج: مش لازم، بس لو عايز شكل مميز لكل نوع، ده الأفضل.

س: هل أقدر أعدل على لوحة التحكم بتاعت النوع المخصص؟
ج: أيوه، تقدر تضيف حقول مخصصة وأعمدة جديدة.