منذ ولادته سنة 2003، لم يتوقف ووردبريس عن النمو و كسب المهتميين والمعجبين مما جعله يصل إلى المرتبة الأولى كأحسن نظام لإدارة المحتوى في العالم، حسب رأيي أرى أنّ هذا التألق يعود بالأساس إلى سلاسته، بساطته، سهولته في الاستعمال و خصوصًا للمجتمع الذي يحيط به، والذي يوفر الدعم والشروحات, إنشاء القوالب والإضافات إنطلاقا بالوظائف السلسة التي يوفرها لنا هذا النظام الرائع!
فمن أهم الوظائف المستعملة من خلال المطورين هي أنواع المقالات (post types) نعم إنّها الوظيفة الرائعة التي ستكون موضوعنا لهذا اليوم.
ما هي أنواع المقالات؟
أنواع المقالات هي عناصر يوفرها لنا ووردبريس لكي نتمكن من تصنيف و ادارة محتوى موقعنا بسهولة، فهنالك أنواع مقالات تاتي افتراضيًا في ووردبريس هي:
- المقالات (post): هو النوع الافتراضي لنشر المقالات في الموقع.
- الصفحات (page): هو النوع الافتراضي لنشر الصفحات في الموقع.
- المرفقات (attachment): من خلال هذا النوع يمكن إدراج الصور ووصلات الفيديو بالإضافة إلى الملفات العامة ووسائط الصوت الخ…، وتسمى بالوسائط في لوحة تحكم ووردبريس.
- المراجعات (revision): يختص هذا النوع بحفظ نسخ قديمة للمواضيع سوءًا أكانت تلقائية أو على هيئة مسوّدة.
- القوائم (nav_menu_item): هي القوائم التي يمكننا إنشاؤها ليستطيع المستخدم التصفح بسلاسة والوصول إلى المحتوى بشكل سريع ويعتبر هذا النوع مُصنّف ضمن المقالات.
لكن هل تعلم أنّه يمكنك إنشاء أنواع مقالات أخرى ومخصصة لتتوافق مع إحتياجاتك؟ نعم، فووردبريس يوفر لنا هذه الخاصية منذ النسخة 2.9 عبر وظيفة register_post_type(). كيف ذلك؟ هذا ما سنتطرق إليه بالتفصيل في هذه المقالة.
عندما تُنهي قراءة هذه المقالة بتركيز فإنّك ستتعلم شيئين مهمين جدًا وهما:
- أنواع المقالات المخصصة (custom post types).
- أنواع التصنيفات المخصصة (custom taxonomies).
إنشاء أنواع مقالات مخصصة
أولاً وقبل البدأ في الشرح أريد أن أشير إلى شيء مهم جدًا، وهو أنك إذا كنت تعمل على قالب خاص فمن الطبيعي إضافة الأكواد إلى ملف الوظائف functions.php
أو إنشاء ملف آخر وتكوين عملية الإتصال بواسطة الوظيفة require_once أو include_once، ولكن إذا كنت تعمل على قالب تعمل على تطويره جهة أخرى ويتمّ تحديثه بإستمرار، فالأفضل هو إنشاء إضافة مخصصة ( Plugin ) وإضافة الأكواد إليها.
جاهز ؟ – فلنبدأ !
function saidweb_post_type() {
$args = array();
register_post_type( 'products', $args );
}
add_action( 'init', 'saidweb_post_type' );
ما الذي فعلناه هنا؟ إنّنا قمنا بإنشاء وظيفة جديدة بمسمى saidweb_post_type
، وفي داخلها انشانا المُتغير $args
ووضعنا قيمته مصفوفة فارغة, بعدها قمنا بتسجيل نوع مقالات مخصص جديد عبر الوظيفة register_post_type
أسميناه product واعطيناه الإعداد $args
، ثم قمنا بإضافة الوظيفة saidweb_post_type
إلى الخطاف init
بواسطة وظيفة الحدث add_action
.
هذا أبسيط مثال لإضافة نوع مقال مخصص، ولن يظهر حتى في لوحة تحكم المدير, لماذا؟ لأن المتغيير $args
عبارة عن مصفوفة في الأصل فارغة.
لكي نقوم بضبط نوع المقالات المخصص الجديد حسب رغبتنا يجب علينا ان نضيف بعض الإعدادات إلى المتغير $args
، وهذه هي الإعدادات الأكثر إستعمالاً وهي قابلة للتغير.
/*
******************************************
My super Custom Post Type
******************************************
*/
function saidweb_post_type() {
$labels = array(
'name' => _x( 'Products', 'post type general name', 'saidweb' ),
'singular_name' => _x( 'Product', 'post type singular name', 'saidweb'),
'parent_item_colon' => __( 'Parent Product:', 'saidweb' ),
'menu_name' => __( 'Products', 'saidweb' ),
'add_new' => __( 'Add New', 'saidweb' ),
'add_new_item' => __( 'Add New Product', 'saidweb' ),
'edit_item' => __( 'Edit Product', 'saidweb' ),
'new_item' => __( 'New Product', 'saidweb' ),
'all_items' => __( 'All Products', 'saidweb' ),
'view_item' => __( 'View Product', 'saidweb' ),
'search_items' => __( 'Search Products', 'saidweb' ),
'not_found' => __( 'No products found', 'saidweb' ),
'not_found_in_trash' => __( 'No products found in the Trash', 'saidweb' ),
);
$args = array(
'label' => __( 'products', 'saidweb' ),
'labels' => $labels,
'description' => __( 'Description of my super products', 'saidweb' ),
'public' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-cart',
'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'custom-fields', 'post-formats', ),
'has_archive' => true,
);
register_post_type( 'products', $args );
}
add_action( 'init', 'saidweb_post_type' );
ما الذي أضفناه وماذا سيحدث؟ لا تقلق سأشرح لك ذلك، فما فعلناه هنا هو نفس الشيء الذي فعلناه في المثال السابق,، والفرق هو أنّ في هذه المرة المتغير $args
أصبح مصفوفة مليئة بالإعدادات اللازمة، في الأول قمنا بإنشاء المتغيير $labels
وقمنا بتخزين تسميات عناصر نوع المقالات المخصص فيه بوسطة المصفوفة، وهذا فقط لتبسيط الكود و تسهيل قراءته، وبعدها قمنا بإنشاء المتغير $args
الذي سيشمل كل الإعدادات.
- labels: هذا العنصر قمنا بإعطائه كقيمة المتغير
$labels
الذي هو بالتالي عبارة عن مصفوفة. - description: هنا يتم وضع وصف لنوع المقال المخصص.
- public: هذا الخيار يشمل عدد كبير من الإعدادت و كلها تتعلق بالرؤية أو الظهور.
- menu_position: هنا يتم تحديد المرتبة التي سيظهر بها في لوحة التحكم، فكلما كان الرقم أكبر كلما كانت المرتبة أقل.
- menu_icon: هنا نقوم بوضع أيقونة مخصصة بإستعمال أحد أيقونات Dashicons و هي الأيقونات الخطية المعتمدة رسميًا في لوحة تحكم ووردبريس.
- supports: هنا يتم تحديث الوظائف الإفتراضية الموجود في ووردبريس، والتي نريد أن يدعمها هذا النوع من المقالات ففي الكود الذي وضعنها أمرناه بدعم العنوان، محرر المقالات، المقتطف، تحديد الكاتب، التعليقات، المراجعات، بنية المقالة، والحقول المخصصة.
has_archive
: هنا إذا قمنا بجعل القيمة true فإنّه سيتم إنشاء تركيبة جديدة والتي يمكن من خلالها الحصول على أرشيف للمقالات المخصصة, هكذا مثلاsaidelbakkali.com/products
.
هل بدر لذهنك تساؤلاً يتضمن تكرار كلمة saidweb
بعد أسماء العناصر ؟ ببساطة إنّ تلك الكلمة هي التي تمثل نص النطاق (text domain) الذي يستعمل في ترجمة النصوص إلى لغات مختلفة حيث أنّه يمكنك تغيير الكلمة حسب رغبتك، وكذلك يمكنك حذفها وكتابة النصوص باللغة التي ستستعملها مباشرةً, على سبيل المثال : إذا أردت أن تستعمل اللغة العربية مباشرةً وأن تكون غير قابلة للترجمة المخصصة فإنّ الكود سيصبح بهذا الشكل:
/*
******************************************
My super Custom Post Type
******************************************
*/
function saidweb_post_type() {
$labels = array(
'name' => 'المنتوجات',
'singular_name' => 'منتوج',
'parent_item_colon' => 'المنتوج الأب:',
'menu_name' => 'المنتوجات',
'add_new' => 'إضافة جديد',
'add_new_item' => 'إضافة منتوج جديد',
'edit_item' => 'تحرير المنتوج',
'new_item' => 'منتوج جديد',
'all_items' => 'جميع المنتوجات',
'view_item' => 'مشاهدة المنتوج',
'search_items' => 'البحث عن منتوج',
'not_found' => 'لا توجد منتوجات',
'not_found_in_trash' => 'لا توجد منتوجات في سلة المهملات',
);
$args = array(
'label' => 'منتوجات',
'labels' => $labels,
'description' => 'وصف المنتوجات',
'public' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-cart',
'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'custom-fields', 'post-formats', ),
'has_archive' => true,
);
register_post_type( 'products', $args );
}
add_action( 'init', 'saidweb_post_type' );
بعد حفظ التغييرات التي وضعتها في ملف functions.php
أو الإضافة التي قمت بإنشاؤها من أجل ذلك، فإنّه سيظهر لك عنصر جديد ضمن قائمة لوحة التحكم للوردبريس بالإسم الذي خصصته لنوع مقالاتك.
الآن، وبعد حصولنا على ما أردناه، لدينا تساؤلاً في كيفية عرض هذا النوع الجديد من التدوينات في الموقع؟ إنّ أفضل طريقة لعمل ذلك هي إنشاء قالب صفحة مخصص ثم نسخ محتوى ملف index.php
داخله، وبعدها تغيير حلقة التحميل ( Loop ) بشيءُّ مخصص على سبيل المثال:
// WP_Query arguments.
$args = array(
'post_type' => array( 'products' ),
'post_status' => array( 'publish' ),
'nopaging' => false,
'posts_per_page' => '10',
'order' => 'DESC',
'orderby' => 'date',
);
// The Query.
$query = new WP_Query( $args );
// The Loop.
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
the_title( '<h2>', '</h2>' );
the_content();
}
} else {
esc_html_e( 'Nothing found!', 'sb' );
}
// Restore original Post Data.
wp_reset_postdata();
إنشاء أنواع التصنيفات المخصصة
ووردبريس إفتراضيًا يوفرُ لنا ترتيبًا لمقالاتنا على نوعين : تصنيفات، ووسوم، والفرق بين التصنيفات و الوسوم – هو أنّ التصنيفات تدعم التسلسل الهرمي ويُعنى بذلط أنّه يمكنك إنشاء تصنيف فرعي لتصنيف آخر و هكذا …، بينما الوسوم لا تدعم هذه الخاصية.
يمكننا إستعمال التصنيفات الإفتراضية لوردبريس في أنواع المقالات المخصصة و ذلك بإضافة الإعداد taxonomies
إلى المصفوفة $args
هكذا:
'taxonomies' => array( 'category', 'post_tag' ),
لكن ألا تظن أنّه من الأفضل إنشاء أنواع تصنيفات مخصصة لكل نوع مقالات مخصص؟ أنا أعتقد أنّ هذه هي الطريقة الأحسن؛ لأنّنا عن طريقها يمكننا إنشاء تصنيفات تتوافع مع متطلباتنا و إحتياجاتنا.
function saidweb_custom_category() {
$args = array();
register_taxonomy( 'product_category', 'products' $args );
}
add_action( 'init', 'saidweb_custom_category', 0 );
العملية تُعتبر مشابهة لأنواع المقالات المخصصة ففي الأول قمنا بإنشاء وظيفة أسميناها saidweb_custom_category
ووضعنا داخلها المتغير $args
ثم قمنا بتسجيل نوع التصنيفات المخصص عبر الوظيفة register_taxonomy()
والتي بدورها تاخد ثلات إعدادات:
- product_category: هو اسم أو المعرف الذي أعطيناه لنوع التصنيفات المخصص.
- product: هو اسم أو معرف نوع المقالات المخصص الذي سينتمي له نوع التصنيفات المخصص.
- $args: هو المتغير الذي خزنًا فيه كل إعدادات نوع التصنيفات المخصص.
بعدها قمنا بإضافة الوظيفة saidweb_custom_category
إلى الخطاف init
بواسطة وظيفة الحدث add_action
.
الكود النهائي سيكون هكذا:
/*
******************************************
My super Custom Taxonomy
******************************************
*/
function products_categories() {
$labels = array(
'name' => _x( 'Product Categories', 'Taxonomy General Name', 'saidweb' ),
'singular_name' => _x( 'Product Category', 'Taxonomy Singular Name', 'saidweb' ),
'menu_name' => __( 'Product Categories', 'saidweb' ),
'all_items' => __( 'All categories', 'saidweb' ),
'parent_item' => __( 'Parent category', 'saidweb' ),
'parent_item_colon' => __( 'Parent category:', 'saidweb' ),
'new_item_name' => __( 'New Product Category Name', 'saidweb' ),
'add_new_item' => __( 'Add New Product Category', 'saidweb' ),
'edit_item' => __( 'Edit Product Category', 'saidweb' ),
'update_item' => __( 'Update category', 'saidweb' ),
'separate_items_with_commas' => __( 'Separate Product Category with commas', 'saidweb' ),
'search_items' => __( 'Search Product Categories', 'saidweb' ),
'add_or_remove_items' => __( 'Add or remove Product Category', 'saidweb' ),
'choose_from_most_used' => __( 'Choose from the most used Product Category', 'saidweb' ),
'not_found' => __( 'Not Found', 'saidweb' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
);
register_taxonomy( 'product_category', array( 'products' ), $args );
}
// Hook into the 'init' action
add_action( 'init', 'products_categories', 0 );
أظن أنّ الكود السابق أصبح سهلاً ومفهومًا؛ وذلك لأنّنا شاهدنا مثله في من قبل ضمن مثال أنواع المقالات المخصصة، وللمعلومية اعداد labels
يأخد قيمة المصفوفة الأولى التي تشمل تسميات التصنيف، و hierarchical
إذا قمنا بجعلها true
فستدعم التسلسل الهرمي مثل التصنيفات الإفتراضية – أمّا إذا جعلناها false
فستكون مثل الوسوم أي لا تدعم التسلسل الهرمي.
هل تتذكر ما قلناها سابقًا حول ترجمة العبارات ؟، إذا كنت تتذكر ذلك حقًا، فإنّ النتيجة النهائية ستصبح هكذا :
حلول أخرى لإنشاء أنواع المقالات المخصصة
طبعا, إذا لم تكن من محبي كتابة الأكواد, فلا عليك هناك من فكر فيك من قبل و انشأ لك أدوات تسهل عليك العمل.
إضافة Custom Post Type UI: هذه الإضافة توفر لك وسيلة سهلة الإستعمال لإنشاء و إدارة أنواع المقالات و التصنيفات المخصصة.
إضافة Types: هذه الإضافة هي عبارة عن ثلاتة في واحد, هي من أفضل الإضافات التي جربتها حتى الآن, توفر لك فرصة إنشاء أنواع مقالات مخصصة, تصنيفات مخصصة و حقول مخصصة. أنصحك بتجربتها.
موقع WP Hasty: هذا الموقع يمنحك مجموعة من التطبيقات لتوليد أكواد تعمل على ووردبريس, لن أقوم بذكر كل ما يمكنك القام به فيه لأنها أشياء كثيرة, أدخل و شاهد بنفسك لن تخسر شيء.
هنا نكون قد وصلنا إلى نهاية موضوع اليوم, صراحة كنت أريد التكلم أيضا عن العلب المخصصة (Meta Box) لكن هذا سيجعل المقالة طويلة جدا, في النهاية قررت تركه إلى تدوينة أخرى إن شاء الله.
أتمنى أن تكون قد إستفدت من الموضع و ان أكون قد أوفيت بما يعد به العنوان.
آه!! لا تنسى المشاركة لكي يستفيد شخص آخر مثلك.
راااااائع تبارك الله عليك هادشي الي بغينا اخي سعيد الى الامام
الله يبارك فيك أخي, إن شاء الله سنتابع في كتابة مقالات كثيرة من هذا النوع.
مقالة رائعة ومفهومة وبسيطة شكرا لك
العفو, شكرا لك أنت على المرور و يسعدني أن الموضوع قد لقى إعجابك.
ممتاز شرحك شكرا لك واصل فنحن نستمتع ونستفيد من دروسك
العفو أخي, شكرا لك على المرور! يسعدني إنك تستفيد من المواضيع التي أنشرها, فمرادنا هو أن يستفيد أكبير عدد ممكن من الأشخاص.
شكرا لك مقاله رائعة
وموقع مفيد جدا .
واتمني أن يكون هناك شرح أيضا لل Meta Box …. وإذا كان ممكن شرح فديو
وكذلك كيفية استخدام المقالات المخصصة في loop
العفو أخي، سيكون هناك شرح لكل ما ذكرته قريبا إن شاء الله … ﻷن هذا هو هدفنا اﻷساسي في هذا الموقع و هو شرح اﻷشياء بأبسط الطرق و ذلك ﻹيصالها إلى أكبر عدد من المهتمين.
السلام عليكم ورحمة الله، الله يوفق يا أخ العرب، واصل ما شاء الله عليك رائع
في الصراحة أنا في أمس الحاجة لمثل هذه الشرحات، الله يرحم الوالدين
و عليكم السلام و رحمة الله، الله يرحم والدينا جميعا و الله يقدرنا على إعطاء أفضل و أكبر قدر ممكن من الشرحات.
بالتوفيق أخي.
شكرا لك على كل هذا الكم من المعلومات
و لكن لدى استفسار
اريد الكود المسؤل عن حركه الصور البارزة فى هذا الموقع
او كيفيه انشاء مثل هذه الحركات
العفو أخي، هناك إضافات jQuery كثيرة لعمل Carousel بهذا ذلك الشكل، واحدة من أهم اﻹضافات هي Owl Carouse
تحياتي
شرح مميز و unique أخ سعيد
تحياتى ليك من مصر ولمجهودك المثمر والمحتوى الثرى والسلس .
شكرا لك، يسعدني أن محتوى موقعي لقى إعجابك 😃