كل ما تحتاج لمعرفته حول دالة get_template_part () في WordPress
نشرت: 2020-10-22قرأت ذات مرة أن أفضل طريقة لتعلم البرمجة هي قراءة الكود الذي كتبه الآخرون. بعد كل شيء ، من المحتمل أن تقوم معظم الوقت الذي تقضيه كمطور بمراجعة وتلميع وإصلاح الكود الذي كتبته أنت أو مطور آخر في الماضي. هذا هو بالضبط سبب إعجابي بالبرامج المجانية ومفتوحة المصدر كثيرًا: فهي تمنحنا الوصول إلى الكود المصدري للأدوات الرائعة وتجعل من الممكن التعلم منها.
إذا كنت مهتمًا بعالم WordPress (وأتخيل أنك كذلك ، لأنك هنا) ، فإن الكود المصدري لـ WordPress Core أو Gutenberg's هما طريقتان جيدتان جدًا لتصبح محترفًا في WordPress والتعرف على تطوير الواجهة الخلفية والواجهة الأمامية.
منذ الإصدار الأول لـ Gutenberg ، كنا نشارك كل ما تعلمناه عن تطوير الواجهة الأمامية حتى الآن. وهكذا ، على سبيل المثال ، قمنا بعمل سلسلة من المنشورات حيث علمنا لك أساسيات React ، ورأينا كيفية إعادة استخدام المكونات ، وشرحنا كيفية توسيع Gutenberg ، وناقشنا أخبار JavaScript لكتابة كود مصدر أفضل ، على سبيل المثال لا الحصر. لقد كتبنا.
حسنًا ، سنقوم اليوم بتغيير التروس والتركيز على WordPress Core مرة أخرى. لماذا ا؟ لا أعرف ، ربما لأن الإعلان عن موضوع Twenty-One التالي الذي تم طرحه قبل أيام قليلة هو العذر المثالي للقيام بذلك؟ فلنتحدث عن أحد أهم العناصر عند إنشاء السمات في WordPress: دالة get_template_part .

ثيمات WordPress
بادئ ذي بدء ، دعونا نراجع كيف تعمل قوالب WordPress ، أليس كذلك؟ بشكل أساسي ، السمة عبارة عن مجموعة من الملفات التي تحدد بنية HTML وأنماط CSS التي سيستخدمها موقعنا.
إذا كنت تفكر في الهيكل العظمي لأي صفحة ويب ، فسترى أن نفس النمط يتكرر دائمًا:
- نبدأ بفتح علامات
htmlوhead. هذا هو المكان الذي نضيف فيه البرامج النصية والأنماط والعلامات الوصفية وما إلى ذلك. - ثم نغلق علامة
headونفتح علامةbody، والتي ستحتوي على المحتوى المرئي لموقعنا على الويب.- عادةً ما يتضمن نص الصفحة رأسًا به شعار الويب وقائمة وما إلى ذلك.
- ثم يأتي المحتوى نفسه ، والذي يمكن أن يكون صفحة أو مقالة مدونة أو قائمة منشورات أو نتيجة بحث وما إلى ذلك.
- أخيرًا ، ينتهي عادةً بتذييل.
- أخيرًا ، بمجرد عرض الصفحة بأكملها ، نغلق جميع العلامات وننتهي.
لذا ، نعم ، يبدو أن كل صفحة ويب تتبع بنية متشابهة إلى حد ما: هناك جزء مشترك (أي رأس ، قائمة ، تذييل ...) ومنطقة خاصة بالمحتوى (منشور مدونة ، مجموعة النتائج التي حصلنا عليها بعد البحث ، منتج WooCommerce ، إلخ).
نظرًا لأن المبرمجين لا يحبون تكرار الكود ونحن (بشكل عام) أشخاص منظمون ، فإن قوالب WordPress تتبع بنية ملف منقوشة للغاية. في هذا المنشور الذي كتبته قبل بضعة أشهر ، لديك شرح جيد للملفات المختلفة في موضوع ما ، لكن ضع في اعتبارك أن هناك:
- ورقة الأنماط:
style.css، - ملف
header.php"لفتح" صفحة الويب (أي إخراج علامةhead، وفي العادةbodyالأول من النص المشترك بين جميع الصفحات) ، - ملف
footer.phpآخر "يغلق" الصفحة (أي يضيف التذييل ويغلق علامةhtml) ، - الكثير من الملفات الإضافية لأنواع المحتوى المختلفة التي نريد عرضها.
ما هي وظيفة get_template_part وما الغرض منها؟
أول شيء تفعله عندما تصادف ميزة جديدة هو عكس ما تفعله عندما يطلب منك والدك مساعدته في برمجة منظف Roomba الجديد: اقرأ الوثائق. لذلك دعونا نفعل ذلك من خلال وظيفتنا من خلال النظر إلى الدستور الغذائي:
يوفر
get_template_partآلية بسيطة للقوالب الفرعية لزيادة التحميل على أقسام التعليمات البرمجية القابلة لإعادة الاستخدام في السمة.يتضمن جزء القالب المحدد لموضوع ما أو إذا تم تحديد اسم ، فسيتم تضمين جزء متخصص. إذا كان الموضوع لا يحتوي على ملف {slug} .php فلن يتم تضمين أي قالب.
يتم تضمين النموذج باستخدام يتطلب ، وليس يتطلب مرة واحدة ، لذلك يمكنك تضمين جزء القالب نفسه عدة مرات.
بالنسبة لمعامل اسم $ ، إذا كان الملف يسمى "{slug} -special.php" ، فحدد "خاص".
ملاحظة: فشل get_template_part () بصمت
get_template_partdocs في WordPress.org
يرى؟ في أقل من دقيقة حصلنا على جميع المعلومات التي نحتاجها. نحن نعلم الآن أن هذه الوظيفة تُستخدم لإنشاء "أجزاء قابلة لإعادة الاستخدام" في سمة (وبالتالي تجنب تكرار الكود) وهي تفعل ذلك بطريقة يمكن للموضوع الفرعي أن يتكيف معها. لدينا أيضًا معلومات حول معلماتها ، وإجراءاتها الداخلية (تستخدم وظيفة require PHP) ، وما يمكن أن نتوقعه منها ("تفشل بصمت").

لسوء الحظ ، هناك بعض الأشياء التي لا تزال غير واضحة ، مثل هذه الملفات {slug}.php و {slug}-special.php التي يذكرها. ما هم؟ ماذا تحتوي؟ ماذا يعملون؟ العديد من الأسئلة الصعبة للإجابة عليها من خلال النظر في الوثائق فقط ، لذلك حان الوقت للانتقال إلى الأمثلة.
كيفية إنشاء قوالب جزئية في موضوعنا
دعنا نلقي نظرة على قالب Twenty-One لمعرفة ما إذا كان يستخدم هذه "القوالب الجزئية" ، وإذا كان الأمر كذلك ، كيف تبدو وما يجب عليك فعله لتطبيقها في قالبك الخاص.

إذا قرأت منشوري حول التسلسل الهرمي لملف WordPress ، فستعرف أن “ index.php هو القالب الافتراضي لموضوعنا. يتم استخدامه لعرض أي محتوى على موقعنا ، طالما أن المحتوى المذكور لا يحتوي على نموذج محدد مصمم له ". نظرًا لأن هذا نموذج افتراضي ، أعتقد أنه من الجيد البدء فيه. هذا هو محتوى index.php في موضوع Twenty-One:
get_header(); if ( have_posts() ) { // Load posts loop. while ( have_posts() ) { the_post(); get_template_part( 'template-parts/content/content' ); } // Previous/next page navigation. twenty_twenty_one_the_posts_navigation(); } else { // If no content, include the "No posts found" template. get_template_part( 'template-parts/content/content-none' ); } get_footer();كما ترى ، لدينا جميع الأجزاء التي سبق أن علقنا عليها:
- يتضمن الرأس باستخدام
get_header. - يجعل المحتوى نفسه.
- يغلق الصفحة بـ
get_footer.
الشيء المثير للاهتمام هنا ، من الواضح ، هو منطقة "المحتوى" في index.php . على وجه التحديد ، نرى أن لدينا عنصر تحكم صغير لمعرفة ما إذا كنا نرى أي محتوى صالح أم لا (وظيفة have_posts في WordPress Loop) ، واعتمادًا على ما إذا كان لدينا أم لا ، نقوم بتحميل نموذج جزئي ( …/content ) أو آخر ( …/content-none ).
إذا ألقينا الآن نظرة على نموذج content.php الجزئي ، فسنرى ما يلي تقريبًا:
<article <?php post_class(); ?>> <header class="entry-header alignwide"> … the_title( … ); … </header> <div class="entry-content"> <?php the_content( … ); wp_link_pages( … ); ?> </div> <footer class="entry-footer default-max-width"> <?php twenty_twenty_one_entry_meta_footer(); ?> </footer> … </article> بسيط جدًا ، أليس كذلك؟ كل ما لدينا هو نموذج صغير مصمم لعرض محتوى WordPress عام مثل ، على سبيل المثال ، منشور مدونة. لاحظ أن هيكل HTML الناتج ليس أكثر من علامة article بعنوان ومحتوى وتذييل ، وكلها تستخدم علامات قالب WordPress لسحب المحتوى الفعلي.
لماذا تكون واجهة برمجة تطبيقات WordPress رائعة
حتى إذا لم تكن تعلم أن كل هذه الوظائف موجودة ( get_header أو get_footer أو نجمة اليوم: get_template_part ) ، فأنا متأكد من أنك كنت ستنظم الكود الخاص بك باتباع نهج مماثل. بعد كل شيء ، يبدو من المنطقي تمامًا إنشاء نموذج للرأس ، وآخر للتذييل ، وآخر للمحتوى ... ثم الحصول على ملف خاص أو شيء يلصقها معًا ، أليس كذلك؟
إذا اتبعت مثل هذا النهج ، فأنا أراهن أن ملف index.php الخاص بك سيبدو كما يلي:
require_once 'header.php'; if ( have_posts() ) { // Load posts loop. while ( have_posts() ) { the_post(); require 'template-parts/content.php'; } // Previous/next page navigation. twenty_twenty_one_the_posts_navigation(); } else { // If no content, include the "No posts found" template. require 'template-parts/content-none.php'; } require_once 'footer.php'; وهو مشابه جدًا لذلك الذي لدينا في موضوع Twenty-One. لذا ، في هذه المرحلة ، قد تسأل نفسك: ما الذي يمكنني الحصول عليه باستخدام وظائف WordPress محددة؟ أليس الأمر نفسه لاستخدام PHP بشكل مباشر ، لا سيما بالنظر require أنه وفقًا لوثائق WordPress ، هذا هو بالضبط ما تستخدمه هذه الوظائف المساعدة؟
حسنًا ، السبب الرئيسي مذكور بالفعل في الوثائق نفسها: إنه يجعل من السهل إنشاء قالب فرعي. وبالتالي ، إذا كنت تقوم بإنشاء get_template_part ، فسيقوم WordPress بالبحث عن القالب في الطفل ، وإذا لم يكن كذلك ، فسيستخدم القالب الأصلي.
لكن هذا ليس كل شيء! عادةً ما تكون وظائف WordPress مليئة بالفلاتر والإجراءات التي تتيح لك تكييف النتيجة النهائية. على سبيل المثال ، إذا نظرنا إلى الوظيفة الداخلية get_template_part في ملف wp-includes/general-template.php :
function get_template_part( … ) { do_action( "get_template_part_{$slug}", … ); … do_action( 'get_template_part', … ); if ( ! locate_template( … ) ) { return false; } } سنرى أن لدينا بعض الإجراءات التي يمكن للمكونات الإضافية والقمة نفسها الاستفادة منها. وإذا واصلنا سحب الخيط ، فسنكون قادرين على رؤية كيفية تحديد WordPress لموقع ( locate_template ) وتحميل القالب الذي سينتهي به الأمر باستخدام:
function locate_template( $template_names, … ) { $located = ''; foreach ( $template_names as $name ) { if ( file_exists( STYLESHEETPATH . "/$name" ) ) { $located = …; // in child theme break; } else if ( file_exists( STYLESHEETPATH . "/$name" ) ) { $located = …; // in parent theme break; } else { … } } if ( $located ) { load_template( $located, $require_once, $args ); } return $located; }آمل أن يكون منشور اليوم قد ساعدك في فهم كيفية عمل سمات WordPress بشكل أفضل. آمل أيضًا أن أوضح لك كيفية التعرف على WordPress من خلال قراءة وثائقه وتصفح كود المصدر الخاص به. وإذا أعجبك ، شاركه مع أصدقائك واترك لنا تعليقًا.
صورة مميزة لجوشوا سورتينو على Unsplash.
