البحث في الموقع
المحتوى عن 'المنشورات'.
-
هناك نوعان من النصوص المرتبطة بمنشورات ووردبريس، حيث يتضمن النوع الأول مقتطفًا والثاني لا يتضمن، ويُضاف المُقتطف ضمن حقلٍ خاصٍ به أو يُولده ووردبريس باستخدام الجزء الأول من المحتوى. سيُركز هذا المقال على المنشورات التي لا تمتلك مقتطفًا وكيفية التحكم بطول هذا المُقتطف، حيث يُفضل ملء المُقتطف بكلماتك الخاصة دائمًا للتحكم به كليًا، وهذا مُمكن باستخدام حقل المقتطف ضمن محرّر ووردبريس التقليدي. الحاجة إلى مقتطف بطول ثابت من المحارف تعرض العديد من الصفحات الرئيسية للمواقع الإلكترونية قائمةً بالمنشورات، حيث يظهر لكل منشورٍ العنوان والمقتطف الخاص به، وغالبًا تكون هذه القائمة على شكل شبكة، بحيث يُشكّل كل منشور جزءًا من صف، وهنا تكون مساحة كل منشورٍ مُحددةً بعرض وارتفاع معين، ولذلك يجب أن يكون طول المقتطف واحدًا لجميع المنشورات لتكون متحاذيةً أفقيًا وعموديًا. يمتلك ووردبريس دالةً مفيدةً هي the_excerpt() تعرض مُقتطفًا للمنشور، حيث تعمل هذه الدالة بذكاء، فهي تتأكد أولًا مما إذا كان المنشور يتضمن مقتطفًا لعرضه، وفي حال عدم تضمنه فستستخرجُ أول بضع كلماتٍ من محتوى المنشور لتحل محل المُقتطف، والطول الافتراضي للمُقتطف هو 55 كلمة، ويُمكن تغيير هذا الطول باستخدام مُرشح excerpt_length. يمكن من الناحية النظرية استخدام الدالة the_excerpt() لتحديد طول المٌقتطف، ولكن تبين بعد التجربة أنها غير كافية لأنّ الكلمات وحدة قياسٍ غير دقيقة، فهي تتفاوت بالطول ولا بد من دقةٍ أكبر في تحديد الطول، ولذلك يجب استخدام المحارف كما تُدعى في لغة البرمجة أو الحروف في لغتنا العربية لتعيين طول المقتطف. يشرح هذا المقال دالةً تستخدم محتوى المنشور (وليس المُقتطف) من أجل استخراج العدد المرغوب من المحارف، حيث سيتناول جميع أجزاء هذه الدالة بما فيها من مكونات، مع الانتباه إلى أنّ عملية استخراج المحارف ليست عملية تعدادٍ للمحارف فقط، إذ يُمكن أن يتضمن محتوى المنشور عناصر أخرى ضمنه مثل وسوم HTML أو صورًا أو أكوادًا قصيرة، ويجب الأخذ بالحسبان عند عدّ المحارف تلك المحارف المكتوبة بشيفرة مغايرة لشيفرة ASCII مثل ترميز UTF-8. إزالة الوسوم والأكواد القصيرة الأسطر والفراغات يجب إزالة جميع وسوم HTML بالخطوة الأولى، وهذا سوف يؤدي إلى إزالة وسم img ووسم التعليق، لذلك سوف تكون التعليمة الأولى في الدالة هي: $content = strip_tags($content); أصبح المحتوى الآن خاليًا من وسوم HTML، ولكن ما تزال هناك الكثير من العناصر التي لا نحتاجها ضمن المُقتطف، مثل الأكواد القصيرة لأن وظيفة المٌقتطف هي عرض نص فقط ولا حاجة للأكواد القصيرة ضمنه حتى لو كان مضمونها نصًا، حيث لن يكون لها معنًى إلا عند تحليلها والأفضل التخلص منها. لن نحتاج إلى كتابة دالةٍ جديدة لفعل ذلك لأن ووردبريس يمتلك دالة strip_shortcodes() وظيفتها إزالة الأكواد القصيرة. أيضًا أصبح لدينا الآن محتوىً بدون وسومٍ أو أكوادٍ قصيرة، لكن يُحتمل ظهور فراغاتٍ وأسطر لا حاجة لها، حيث نريد أن يظهر المُقتطف على أنه مقطعٌ واحدٌ مستمر، ولذلك سنستخدم تعبيرًا نمطيًا للبحث عن الفراغات والأسطر وغيرها واستبدالها بفراغٍ واحد. عد المحارف والحفاظ على كلمة كاملة لقد حصلنا الآن على نصٍ بدون أي عناصر أخرى، وبقي علينا أمران هما استخراج عدد المحارف المطلوب والانتباه إلى أنّ الكلمة الأخيرة من المقتطف غير مقسومة. يمكن عدّ المحارف باستخدام إحدى الدالتين strpos() أوsubstr()، لكن عند تجربتهما على موقعٍ لا يستخدم ترميز ASCII، فقد حصل شيئان، وأولهما عدم الحصول على نفس عدد المحارف الممرر للدالة، والثاني ظهور أحرفٍ غريبةٍ بعض المرات في نهاية المُقتطف. وبعد البحث اكتشفنا وجود دالةٍ متعددة البايت مكافئةٍ لكل دالة str في PHP وتُستخدم لمعالجة جميع محارف UTF-8، حيث أن طول محارف UTF-8 أكبر من 1 بايت، لذلك كانت دالة strpos() تَعُد المحارف بالاعتماد على الطول وهو 1 بايت، ونتج عن ذلك أخطاء عند عَدّ محارف بترميز UTF-8 ليظهر عددٌ أقل من المطلوب، وكان هذا أيضًا السبب وراء ظهور محارفٍ غير معروفة في نهاية المقتطف. تعتمد substr() على طول المحارف لعدّها، والطول المعتمد لديها هو 1 بايت أيضًا، وعند وصولها بالعد لمنتصف محرفٍ معين (طول المحرف 2 بايت في ترميز UTF-8)، فسوف تعرض محرفًا غير معروف، ولذلك يجب استخدام mb_strpos() بدلًا من strpos()، وmb_substr() بدلًا من substr(). تتمثل الخطوة الآن في ترتيب المقتطف بصورةٍ أنيقة بحيث لا تُقتطع أية كلمة من المنتصف، حيث لن يكون عدد المحارف الذي يُمرر مثل معاملٍ في أغلب الأحيان دقيقًا، لكننا نريد أن نبقى قريبين منه قدر الإمكان، لذا سنتحقق أي الحالتين أقرب، وهما القطع قبل أو بعد الكلمة الأخيرة التي نحن في منتصفها. سنستخدم mb_strrpos لإيجاد الفراغ الأخير قبل نهاية المحرف وmb_strpos لإيجاد الفراغ التالي بعد نهاية المحرف، ثم نقيس المسافة بين هذين الفراغين من نهاية المحرف ونعيد المقتطف إلى أقرب فراغ. الدالة الكاملة تسمح الشيفرة البرمجية التالية بالحفاظ على آخر كلمة من المقتطف دون اقتطاعها مهما كان عدد المحارف المطلوب استخراجه من المحتوى. /** * Get a limited part of the content - sans html tags and shortcodes - * according to the amount written in $limit. Make sure words aren't cut in the middle * @param int $limit - number of characters * @return string - the shortened content */ function wpshout_the_short_content($limit) { $content = get_the_content(); /* sometimes there are <p> tags that separate the words, and when the tags are removed, * words from adjoining paragraphs stick together. * so replace the end <p> tags with space, to ensure unstickinees of words */ $content = strip_tags($content); $content = strip_shortcodes($content); $content = trim(preg_replace('/\s+/', ' ', $content)); $ret = $content; /* if the limit is more than the length, this will be returned */ if (mb_strlen($content) >= $limit) { $ret = mb_substr($content, 0, $limit); // make sure not to cut the words in the middle: // 1. first check if the substring already ends with a space if (mb_substr($ret, -1) !== ' ') { // 2. If it doesn't, find the last space before the end of the string $space_pos_in_substr = mb_strrpos($ret, ' '); // 3. then find the next space after the end of the string(using the original string) $space_pos_in_content = mb_strpos($content, ' ', $limit); // 4. now compare the distance of each space position from the limit if ($space_pos_in_content != false && $space_pos_in_content - $limit <= $limit - $space_pos_in_substr) { /* if the closest space is in the original string, take the substring from there*/ $ret = mb_substr($content, 0, $space_pos_in_content); } else { // else take the substring from the original string, but with the earlier (space) position $ret = mb_substr($content, 0, $space_pos_in_substr); } } } return $ret . '...'; } تحديث المنشور بالمقتطف المولد يمكن تحديث مُقتطف المنشور ضمن قاعدة البيانات إذا كنا لا تريد للشيفرة البرمجية أن تُولّد المُقتطف في كل مرةٍ يُعرض فيها المنشور، وبالتالي فعندما تعمل الدالة has_excerpt() على منشورٍ معين، فسوف تُعيد نتيجةً إيجابيةً وتأخذ المُقتطف مباشرةً من قاعدة البيانات دون المرور بكل ما سبق. ويجب هنا أن يحدث استدعاء للدالّة wp_update_post() في نهاية الدالة wpshout_the_short_content()، وذلك من أجل تحديث المنشور والتي تحتاج لمُعرّف المنشور ID والمُقتطف. function wpshout_update_post_excerpt($new_excerpt){ $post = array( 'ID' => get_the_ID(), 'post_excerpt' => $new_excerpt, ); wp_update_post($post); } أفضل طريقةٍ لاستدعاء هذه الدالة هي من خلال ربطها مع مُرشح wp_trim_excerpt يولِّد مُقتطفًا من محتوى منشور ووردبريس عن طريق اختصاره إلى 55 كلمة وإضافة "[…]"، وقبل الإنتهاء نستدعي مرشح wp_trim_excerpt للسماح بترشيح النتائج وتوليد سلوك مقتطفٍ خاصٍ بنا. function wpshout_excerpt( $text ) { if( is_admin() ) { return $text; } if (! has_excerpt() ) { $text = wpshout_the_short_content(200); } wpshout_update_post_excerpt($text); return $text; } add_filter( 'wp_trim_excerpt', 'wpshout_excerpt' ); الخلاصة شرح هذا المقال كيفية توليد مُقتطف لمنشور برمجيًا وتحديد طول هذا المُقتطف باستخدام عدد المحارف دون قطع الكلمة الأخيرة إلى قسمين. ترجمة -وبتصرّف- للمقال How to Create an Excerpt From a Post Without an Excerpt and Limit It by Character Count لصاحبه Lea Cohen. اقرأ أيضًا فهم الحلقة وطريقة ووردبريس في عرض المنشورات إنشاء أنواع منشورات مخصصة Custom Post Types في ووردبريس تعديل ملف wp-config.php لضبط إعدادات ووردبريس إدارة الإضافات في ووردبريس
-
يشرح هذا المقال أحد أهم المواضيع المرتبطة بتطوير ووردبريس وهو حلقة ووردبريس 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 مكونٌ تقريبًا ْمن الحلقة فقط، وبالتالي فهي التي تسمح لملف القالب بعرض محتواه. بعد رؤية توظيف الحلقة ضمن ملفٍ حقيقي، لنبدأ عملية التشريح الوظيفي لها في أي قالب. النسخة البسيطة من الحلقة سنلقي نظرةً هنا على الشيفرة البرمجية 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)، ولا بد من ملاحظة أن حلقة ووردبريس هي فعلًا حلقة بالمفهوم البرمجي، فهي تتكرر على مجموعةٍ من منشورات ووردبريس، ولا تتوقف إلا عند انتهاء هذه المنشورات. تعمل الحلقة وفقًا للخطوات التالية المُرقمة ضمن الشيفرة: تسأل الحلقة بيئة ووردبريس الرئيسية عما إذا كانت هناك أي منشوراتٍ لمعالجتها من خلال دالةٍ تُدعى have_posts()، حيث تُعيد هذه الدالة إما true في حال وُجد منشورات جاهزةٍ للمعالجة أو false في حال عدم وجود منشورات؛ وإذا كانت النتيجة المُعادة من قِبل الدالة have_posts() ضمن عبارة if هي true، فسوف تعمل أجزاء الحلقة؛ أما إذا كانت false، فسوف يتجاوز معالج PHP الحلقة لأنها لا تحتوي على شيء. سوف تُنفّذ تعليمة (()while ( have_posts عند تحقق شرط عبارة if، والذي يعني وجود منشورات يجب معالجتها ضمن الحلقة، وفعليًا هذا هو السطر الذي تبدأ عنده الحلقة، وهو عبارةٌ عن حلقة while في لغة PHP تُعيد تنفيذ التعليمات داخلها طالما أن شرطها مُحقق، أي وبمعنىً آخر "طالما توجد منشورات لمعالجتها ادخل الحلقة"، وبالتالي ستُنفذ الحلقة الشيفرة البرمجية الموجودة داخلها مرةً لكل منشور وتستمر هذه العملية حتى تنتهي المنشورات وتنتقل الصفحة لتنفيذ تعليمات PHP التي تلي الحلقة في نفس ملف القالب. نحن الآن داخل حلقة while المُشار إليها بالفقرة السابقة وتدل تعليمة the_post() على أنه "طالما لدينا منشورٌ للعمل عليه، فيجب أن نُضيف المنشور الحالي للرتل"، حيث تعمل هذه الدالة على إضافة المنشور للرتل أي أنها تُجهّز المنشور التالي لتُطبّق عليه عمليات ووردبريس المتوفرة ضمن الحلقة، ويجب أن تكون هذه الدالة موجودةً ضمن الحلقة. كتابة محتوى الحلقة، حيث يُعَد هذا القسم الجزء الرئيسي للحلقة وهنا نستطيع الإبداع وكتابة الشيفرة البرمجية التي سوف تُطبق على كل منشور، وهو فارغٌ الآن لأنه القسم الذي علينا كتابته بأنفسنا، وسنتوسع في شرح هذا القسم في الفقرات القادمة من هذا المقال. نهاية الحلقة من خلال كتابة تعليمة endwhile; وهذه هي طريقة PHP للقول "انتهينا من حلقة while" وكل التعليمات المتواجدة بين while() : وendwhile; هي تعليماتٌ تابعةٌ للحلقة while، وأي شيءٍ بعدها هو خارج هذه الحلقة وسوف يُنفذ لمرةٍ واحدة بعد الانتهاء من تنفيذ حلقة while. نهاية الشرط من خلال تعليمة 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. اقرأ أيضًا إنشاء أنواع منشورات مخصصة Custom Post Types في ووردبريس إنشاء أنواع التصنيفات Taxonomies والحقول Fields في ووردبريس خمس طرق لإنشاء استعلامات مخصصة في ووردبريس تطوير ووردبريس للمبتدئين تعلم PHP تعلم البرمجة