اذهب إلى المحتوى

يشرح هذا المقال أحد أهم المواضيع المرتبطة بتطوير ووردبريس وهو حلقة ووردبريس WordPress loop وتُدعى أيضًا "The loop"، لذلك يُعَد المحتوى مهمًا جدًا، كما أنه يُمثل دليلًا عمليًا لفهم ووردبريس، حيث تُعَد الحلقة ركنًا أساسيًا في تطوير قوالب ووردبريس، ولهذا يجب التعرف عليها، ولحسن الحظ فهي ليست معقدةً. يهدف المقال هنا إلى توضيح مبدأ عمل الحلقات في ووردبريس ثم الانتقال إلى الشيفرة البرمجية وآلية عملها.

تعريف الحلقة ببساطة

في هذا القسم لن يُستعان بالبرمجة لشرح عمل الحلقة، بل سيُشرح مبدأ عملها والفكرة منها.

حلقة ووردبريس موجودة في ملفات القالب

تتكون قوالب ووردبريس من ملفات قوالب PHP، وتُحدد هيكلية قوالب ووردبريس ملفات القالب المرتبطة مع كل صفحة، حيث يرتبط ملف page.php مثلًا مع طلبٍ لصفحة "من نحن About"، وhome.php مع طلب الصفحة الرئيسية للموقع، بينما يُستخدم ملف index.php احتياطيًا في حال لم يُفعّل الجزء الأعلى من هذه الهرمية.

يجب الغوص في محتوى ملف القالب بعد تحديد أي ملفٍ نريد العمل عليه لإيجاد الحلقة.

الحلقة هي المسؤولة عن معالجة المنشورات في ووردبريس

حلقة ووردبريس هي الآلية التي يتعامل فيها ووردبريس مع أي منشورٍ أو مجموعة منشورات، حيث تستطيع ضمن الحلقة تحديد كيفية عرض كل منشور لتُطبّق الحلقة البنية المطلوبة على كل منشور ضمن المجموعة، فعلى سبيل المثال تتضمن صفحة المدونة حلقة ووردبريس التي تعالج العديد من المقالات، ثم تُعيد استخدام بنية المنشور التي حددتها على جميع هذه المقالات، ولكن إذا وُجد مقال واحد فقط أو طلب المستخدم الوصول لصفحة "من نحن About"؛ فعندها سوف يستخدم ووردبريس مبدأ الحلقة ذاته ولكن لعرض منشورٍ واحدٍ فقط سواءً كان مقالًا أو صفحة.

حلقة ووردبريس هي أساس التخصيص في ملفات القالب في ووردبريس

تُعَد الحلقة المحرك النابض لأي ملف قالب، فهي قابلة للتخصيص وتتغير حسب الملف، ويُعَد تغيير محتوى الحلقة هو الطريقة الرئيسية لتغيير وظيفة ملفات القالب، فقد تريد لصفحة المدونة لديك مثلًأ (والتي يُتحكم بها من قِبل ملف home.php للقالب المُستخدم) عرض مقتطفاتٍ من فقرةٍ واحدةٍ من مقالات المدونة بدلًا من عرض كامل المحتوى، ولتحقيق ذلك سوف تُستخدم الدالة the_excerpt()‎ داخل حلقة الملف home.php، وبنفس الوقت ربما نريد لصفحات مقالات المدونة والتي يُتحكم بها من قِبل ملف single.php عرض محتوى المقال كاملًا وليس فقط المقتطف، لذا علينا استخدام الدالة the_content()‎ داخل حلقة الملف single.php بدلًا من الدالة the_excerpt()‎.

يتمحور تطوير قوالب ووردبريس حول معرفة هذه التفاصيل والفرق بينها.

مثال على استخدام حلقة ووردبريس

تجد في الصورة المُبينة في الأسفل محتوى ملف single.php للقالب الشهير Twenty Fifteen، حيث تشغُل الحلقة مجال السطور (15 وحتى 43)، ولكن أُخفي محتواها كي لا نشغل ذهننا به الآن (أي السطور من 18 إلى 39 مخفية)، مع ملاحظة كيف أن ملف single.php مكونٌ تقريبًا ْمن الحلقة فقط، وبالتالي فهي التي تسمح لملف القالب بعرض محتواه.

001_wordpress_loop_single_php.png

بعد رؤية توظيف الحلقة ضمن ملفٍ حقيقي، لنبدأ عملية التشريح الوظيفي لها في أي قالب.

النسخة البسيطة من الحلقة

سنلقي نظرةً هنا على الشيفرة البرمجية PHP للحلقة وبنيتها الأساسية، حيث يُمكن كتابة شيفرة الحلقة بطريقتين وكلتاهما تؤديان الوظيفة ذاتها.

<?php
/* Environment: We're inside a theme template file in the WordPress template hierarchy */

if ( have_posts() ) { // (1)
    while ( have_posts() ) { // (2)
        the_post();  // (3)

       // (Loop contents will go here)  (4)

    } // end while  (5)
} // end if  (6)

أو

<?php
/* Environment: We're inside a theme template file in the WordPress template hierarchy */

if ( have_posts() ) : // (1)
    while ( have_posts() ) :  // (2)
        the_post();   // (3)

       // (Loop contents will go here)  (4)

    endwhile; // (5)
endif;  // (6)

لا داعي للارتباك بفكرة وجود طريقتين لكتابة الحلقة، فما هي إلا خياراتٌ مختلفةٌ توفرها لغة البرمجة PHP ولها المعنى ذاته. وستُسخدم الطريقة الثانية في الأقسام الآتية من المقال.

كيفية عمل الحلقة في ووردبريس

سيشرح هذا القسم الطريقة الثانية لاستخدام الحلقة سطرًا سطرًا (المثال الذي يتضمن endwhile)، ولا بد من ملاحظة أن حلقة ووردبريس هي فعلًا حلقة بالمفهوم البرمجي، فهي تتكرر على مجموعةٍ من منشورات ووردبريس، ولا تتوقف إلا عند انتهاء هذه المنشورات.

تعمل الحلقة وفقًا للخطوات التالية المُرقمة ضمن الشيفرة:

  1. تسأل الحلقة بيئة ووردبريس الرئيسية عما إذا كانت هناك أي منشوراتٍ لمعالجتها من خلال دالةٍ تُدعى have_posts()‎، حيث تُعيد هذه الدالة إما true في حال وُجد منشورات جاهزةٍ للمعالجة أو false في حال عدم وجود منشورات؛ وإذا كانت النتيجة المُعادة من قِبل الدالة have_posts()‎ ضمن عبارة if هي true، فسوف تعمل أجزاء الحلقة؛ أما إذا كانت false، فسوف يتجاوز معالج PHP الحلقة لأنها لا تحتوي على شيء.

  2. سوف تُنفّذ تعليمة (()while ( have_posts عند تحقق شرط عبارة if، والذي يعني وجود منشورات يجب معالجتها ضمن الحلقة، وفعليًا هذا هو السطر الذي تبدأ عنده الحلقة، وهو عبارةٌ عن حلقة while في لغة PHP تُعيد تنفيذ التعليمات داخلها طالما أن شرطها مُحقق، أي وبمعنىً آخر "طالما توجد منشورات لمعالجتها ادخل الحلقة"، وبالتالي ستُنفذ الحلقة الشيفرة البرمجية الموجودة داخلها مرةً لكل منشور وتستمر هذه العملية حتى تنتهي المنشورات وتنتقل الصفحة لتنفيذ تعليمات PHP التي تلي الحلقة في نفس ملف القالب.

  3. نحن الآن داخل حلقة while المُشار إليها بالفقرة السابقة وتدل تعليمة the_post()‎ على أنه "طالما لدينا منشورٌ للعمل عليه، فيجب أن نُضيف المنشور الحالي للرتل"، حيث تعمل هذه الدالة على إضافة المنشور للرتل أي أنها تُجهّز المنشور التالي لتُطبّق عليه عمليات ووردبريس المتوفرة ضمن الحلقة، ويجب أن تكون هذه الدالة موجودةً ضمن الحلقة.

  4. كتابة محتوى الحلقة، حيث يُعَد هذا القسم الجزء الرئيسي للحلقة وهنا نستطيع الإبداع وكتابة الشيفرة البرمجية التي سوف تُطبق على كل منشور، وهو فارغٌ الآن لأنه القسم الذي علينا كتابته بأنفسنا، وسنتوسع في شرح هذا القسم في الفقرات القادمة من هذا المقال.

  5. نهاية الحلقة من خلال كتابة تعليمة endwhile;‎ وهذه هي طريقة PHP للقول "انتهينا من حلقة while" وكل التعليمات المتواجدة بين while() :‎ وendwhile;‎ هي تعليماتٌ تابعةٌ للحلقة while، وأي شيءٍ بعدها هو خارج هذه الحلقة وسوف يُنفذ لمرةٍ واحدة بعد الانتهاء من تنفيذ حلقة while.

  6. نهاية الشرط من خلال تعليمة endif;‎، وهذه هي طريقة PHP للقول "انتهينا من عبارة if التي كنا داخلها"، حيث تُنفذ جميع التعليمات المتواجدة بين if():‎ وendif;‎لمرةٍ واحدة (طالما أنها ليست داخل حلقة) عند تحقق شرط عبارة if، ولن تتأثر أي تعليماتٍ بعدها بالشرط الخاص بها، وسوف تُنفذ مهما كانت نتيجة الشرط.

مثال على عمل حلقة

سنطلّع الآن على مثالٍ لحلقةٍ تُنفّذ وظيفةً ما، حيث أصبح من الأسهل فهم ما يجري بعد الاطلاع على أجزاء الحلقة وعملها.

<?php 
/* Environment: We're inside a theme template file in the WordPress template hierarchy */

if ( have_posts() ) :
    while ( have_posts() ) :
        the_post(); ?>

        <article class="full-article">
            <h2><?php the_title(); ?></h2>
            <?php the_excerpt(); ?>
        </article>

    <?php endwhile;
endif;

خرج هذه الحلقة في قوالب ووردبريس

تُنشئ هذه الحلقة من أجل كل منشورٍ ضمن المجموعة وسمًا <article>، حيث تعرض داخله العنوان أولًا ثم مُقتطفًا قصيرًا (افتراضيًا أول 55 كلمة يتبعها الرمز [...]) للمنشور الحالي.

سوف تعرض الحلقة السابقة المُخرج التالي بعد استخدام عدة منشوراتٍ من ضمن الموقع الذي نجربها عليه.

<article class="full-article">
    <h2>What Your Minimum Viable Product Should Be Measuring</h2>
    <p>In our last article we introduced you to the idea of the Minimum Viable Product (MVP), and covered some of the internal challenges that often arise when you prepare to share a beta version of your idea. An MVP isn't just a quick, cheap version of your product that you're releasing because it's easy. On […]</p>
</article>


<article class="full-article">
    <h2>Starting Small: Creating a Minimum Viable Product</h2>
    <p>A common mistake entrepreneurs make is to start with a very specific idea and grind as hard as possible to make it work. This might work out great—but as many entrepreneurs learn, it's far too easy to rush through, or entirely overlook, the process of refining our initial ideas into something people truly want. Not […]</p>
</article>


<article class="full-article">
    <h2>How to Plan a Successful Web Project</h2>
    <p>It's too easy to plan out a web project in terms of technologies rather than solutions. Too many web projects don't meet their goals. The project could be the wrong solution for the right goal, the right solution for the wrong goal—or, perhaps worst of all, a shiny solution for no goal. The problem is […]</p>
</article>

// (And so on for many more articles)

أنماط علينا ملاحظتها في الحلقة

يجب الانتباه لأمرين اثنين في المثال السابق: كيفية الانتقال بين وسوم HTML والصيغ المُستخدمة في PHP، ولا بد من الإنتباه إلى أن أي شيءٍ ليس ضمن <‎?php ?‎> فهو وسم HTML فقط، وفي مثالنا السابق هذه الوسوم كانت <h2> و<article>، حيث تُطبع هذه الوسوم مبُاشرةً في المتصفح في كل مرةٍ تمر فيها الحلقة على منشورٍ جديد. الجزء الحقيقي والعميق المُتعلقان بووردبريس، وهما وسما PHP المُستخدمان: الوسم الأول هو the_title()‎ والذي يطبع عنوان المقال الحالي في كل مرةٍ يُستخدم فيها ضمن الحلقة؛ أما الوسم الثاني فهو the_excerpt()‎ ويطبع مُقتطفًا من نفس المقال.

نستطيع إنشاء قالبٍ واستخدام ملفٍ واحدٍ ضمنه وهو index.php، وكذا استخدام الحلقة السابقة ضمنه لتعرض الصفحة الرئيسية للموقع عناوين ومقتطفات أحدث المنشورات ضمنه (سواءٌ كان مقالًا أو صفحةً).

الخلاصة

يساعد هذا المقال في توضيح مفهومٍ رئيسيٍ في ووردبريس وهو الحلقة، والتي تكون أكثر تعقيدًا في معظم القوالب المُستخدمة في ووردبريس ولكن يمكن البدء بالأمثلة الموجودة هنا.

ترجمة -وبتصرّف- للمقال Understanding The Loop: WordPress’s Way of Showing Posts لصاحبه David Hayes.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...