<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x628;&#x631;&#x645;&#x62C;&#x629; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/page/4/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x628;&#x631;&#x645;&#x62C;&#x629; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</description><language>ar</language><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x645;&#x644;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x638;&#x627;&#x626;&#x641; (functions) &#x641;&#x64A; &#x642;&#x627;&#x644;&#x628; underscores &#x644;&#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D8%B8%D8%A7%D8%A6%D9%81-functions-%D9%81%D9%8A-%D9%82%D8%A7%D9%84%D8%A8-underscores-%D9%84%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r167/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/_underscore.png.e6e757c2fce763ff6de13c3fdf77154c.png" /></p>

<p>في <a href="https://academy.hsoub.com/programming/php/wordpress/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D9%82%D9%88%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A5%D8%B7%D8%A7%D8%B1-underscores-r86/">الدرس السابق من هذه السلسلة</a>، تعرفنا على بعض مميزات قالب <strong><span style="font-family:courier new,courier,monospace;">s_</span></strong> وإستعرضنا مجلدات القالب وبعض الملفات الأساسية، وفي هذا الدرس سنكمل الإطلاع على الملفات الأساسية وسنحاول شرح مهمة بعض الشيفرات والدوال البرمجية بالإضافة الى الإشارة الى بعض الممارسات الجيدة في تطوير قوالب ووردبريس والتي يمكن أن نتعلمها من قالب underscores.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_09/_underscore.png.ce2de11a60aa691c3b1b293b7eeb84e1.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="4798" src="https://academy.hsoub.com/uploads/monthly_2015_09/_underscore.thumb.png.083a27773f148e8312bdb5110bdfe7d2.png" class="ipsImage ipsImage_thumbnailed" alt="_underscore.thumb.png.083a27773f148e8312"></a></p><h2>ملفات الوظائف والأحداث والمفلترات</h2><p>نقصد بهذه الملفات ملف <code>functions.php</code> والملفات التي يتم تضمينها من خلاله، حيث تحتوي هذه الملفات في قالب underscores على بعض الشيفرات المهمة التي يتكرر استخدامها في كل قالب ووردبريس تقريبا (أحيانا مع تعديلات بسيطة عليها) وبالطبع يمكنك إضافة المزيد من الشيفرات أو التخلي عن بعضها على حسب القالب الذي تقوم بتطويره.</p><h3>ملف functions.php</h3><h4>الدالة <code>hsb_setup</code></h4><p>كما تلاحظ فإن أول الدوال الموجودة في ملف <code>functions.php</code> دالة تأخذ الاسم اللطيف للقالب متبوعا بكلمة setup وبالمناسبة هذه من الممارسات المهمة جدا في تطوير قوالب وإضافات ووردبريس أي أن تقوم ببدء تسمية الدوال الخاصة بالقالب بكلمة مميزة (عادة الاسم اللطيف للقالب) حتى لا تختلط مع اسم أحد الدوال الموجودة في ووردبريس أو أي من الإضافات في الموقع. في حالتنا هنا سنستخدم hsb كاسم لطيف للقالب وهو اختصار لكلمة Hsoub بالتالي فإن اسم الدالة سيكون كالاتي</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">function hsb_setup()</pre><p>قبل أن ندخل في شرح مهمة هذه الدالة قد تكون لاحظت السطر البرمجي السابق لها (تجاهل التعليقات البرمجية) والذي هو عبارة عن عبارة شرطية if statement تأخذ الصورة</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">if ( ! function_exists( 'hsb_setup' ) ) : </pre><p>ويتم إنهاء هذه العبارة الشرطية بعد قوس إغلاق الدالة مباشرة، وهذه أيضا من الممارسات الجيدة حيث أنه بهذه الطريقة يتم التأكد أولا من وجود تعريف الدالة في مكان أخر وفي حالة وجودها يتم تجاهل هذا التعريف وهذا بالطبع يتيح لك إعادة تعريف الدالة من خلال القالب الأبن أو الإضافات وهذا يزيد من دعم القالب لخاصية <a rel="external nofollow" href="https://codex.wordpress.org/Child_Themes">القالب الإبن.</a><br>الان لنعود لمهمة هذه الدالة ويمكن أن نقول أنها مسؤولة من ثلاثة أمور:</p><ul><li>تحميل دعم القالب للترجمة من خلال استخدام الدالة <code><a rel="external nofollow" href="https://codex.wordpress.org/Function_Reference/load_theme_textdomain">load_theme_textdomain</a>.</code></li><li>تسجيل قوائم القالب والتي ستظهر للمستخدم عند إنشائه قائمة جديدة في مكان مواضع القالب ويتم تسجيلها من خلال الدالة <a rel="external nofollow" href="https://codex.wordpress.org/Function_Reference/register_nav_menus"><code>register_nav_menus</code></a>، ويأتي قالب underscores مسجلا لقائمة واحدة فقط وهي القائمة الرئيسية، ويمكنك بالطبع إضافة المزيد على حسب عدد القوائم في قالبك.</li><li>تعريف خصائص ووردبريس التي يدعمها القالب، أو ببساطة إضافة خصائص القالب من خلال الدالة <a rel="external nofollow" href="https://codex.wordpress.org/Function_Reference/add_theme_support"><code>add_theme_support</code></a> ومنها على سبيل المثال الصورة البارزة وخصائص أخرى يمكنك الإطلاع عليها في صفحة توثيق الدالة.</li></ul><p>كما تلاحظ يتم إضافة هذه الدالة الى الحدث <a rel="external nofollow" href="https://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme"><code>after_setup_theme</code></a> وهو الحدث المناسب معها، وهذه ميزة أخرى يمنحك لها قالب underscores وهي التعرف على الأحداث المناسبة لمختلف الوظائف التي تحتاجها في القالب.</p><h4>الدالة <code>hsb_widgets_init</code></h4><p>هذه الدالة مسؤولة عن تسجيل مواضع الودجات في القالب، فمثلا قد يحتوي القالب على موضوع واحد وهو موضع الشريط الجانبي الأيسر وقد يحتوي بالإضافة الى ذلك الى مواضع للودجات في الفوتر أو غيره مثلا، وكل هذه المواضع يتم تسجيلها داخل هذه الدالة من خلال الدالة <a rel="external nofollow" href="https://codex.wordpress.org/Function_Reference/register_sidebar"><code>register_sidebar</code></a>، وبعد ذلك يتم إضافة هذه الدالة الى الحدث <a rel="external nofollow" href="https://codex.wordpress.org/Plugin_API/Action_Reference/widgets_init"><code>widgets_init</code></a>.</p><h4>الدالة <code>hsb_scripts</code></h4><p>وتستخدم هذه الدالة لصف ملفات CSS وملفات الجافا اسكربت ويمكنك معرفة المزيد عن هذا الامر <a href="https://academy.hsoub.com/programming/php/wordpress/%D8%B5%D9%81%D9%91-%D9%88%D8%AA%D8%B3%D8%AC%D9%8A%D9%84-%D9%85%D9%84%D9%81%D8%A7%D8%AA-javascript-%D9%88-css-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r79/">من خلال هذا المقال</a>.</p><p>كما تلاحظ في نهاية هذا الملف يتم تضمين خمسة ملفات تحتوي على بعض الوظائف ومقسمة على حسب مهامها وهي ما سنتطلع علي تفاصيله في الفقرات القادمة</p><h3>ملف <code>custom-header.php</code></h3><p>يوفر لك ميزة ووردبريس تمكين المستخدم من صورة ترويسة القالب من لوحة التحكم وتجدها تحت قائمة المظهر في حالة كان القالب يدعمها، وقالب s_ يأتي افتراضيا داعم لهذه الخاصية حيث يمكنك استدعاء صورة الترويسة التي اختارها المستخدم لعرضها في أي مكان في القالب من خلال هذه الشيفرة (الموجودة في التعليقات أعلى هذا الملف)</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">&lt;?php if ( get_header_image() ) : ?&gt;  
  &lt;a href="&lt;?php echo esc_url( home_url( '/' ) ); ?&gt;" rel="home"&gt;  
    &lt;img src="&lt;?php header_image(); ?&gt;" width="&lt;?php echo esc_attr( get_custom_header()-&gt;width ); ?&gt;" height="&lt;?php echo esc_attr( get_custom_header()-&gt;height ); ?&gt;" alt=""&gt;  
  &lt;/a&gt;  
&lt;?php endif; // End header image check. ?&gt; </pre><p>ويحتوي هذا الملف على الدوال اللازمة لجعل القالب يدعم الترويسة وقد يفيدك الاطلاع على هذه الدوال وطريقة عملها لتطبيق هذه الميزة كما يمكنك تعديل بعض القيم الافتراضية في حالة أردت ذلك بالإضافة لإضافة التنسيق الخاص بصورة الترويسة وكذلك عنوان ووصف المدونة.</p><h3>ملف <code>template-tags.php</code></h3><p><a rel="external nofollow" href="https://codex.wordpress.org/Template_Tags">وسوم القالب Template Tags</a> أو يمكن تسميتها بدوال القالب هي مجموعة من الدوال يوفرها ووردبريس لمطوري القوالب ويتم إستخدامها عادة في ملفات القالب لعرض معلومات الموقع والمقالات مثل عنوان المقال و إسم المقال وكاتب المقال ورابط الموقع وغيرها من البيانات التي تحتاج عادة لعرضها في القالب وهذه الدوال تتيح لك عرض مثل البيانات فقط بكتابة إسم الدالة، فبدلا عن الإتصال بقاعدة البيانات وجلب البيانات التي تريدها فإن الدالة (وسم القالب) تقوم بهذه العمليات نيابة عنك وترجع لك المحتويات.</p><p>هذا الملف يوفر لك مجموعة إضافية من دوال القالب التي تعرض بعض البيانات التي تحتاجها عادة في القالب، وبدلا من كتابة الشيفرة البرمجية لجلب هذه البيانات بداخل ملفات القالب يتم كتابتها في هذه الدوال وتستطيع مناداة هذه الدوال في ملفات القالب وبالتالي تحافظ على شيفرة برمجية نظيفة ومقروءة في ملفات القالب بالإضافة لإمكانية جلب البيانات في اكثر من ملف فقط بإستدعاء هذه الدالة.<br>من الدوال الموجودة في هذا الملف</p><ul><li>الدالة <code>the_posts_navigation</code> وتستخدم لعرض صفحة المقالات السابقة وصفحة المقالات التالية في صفحة الأرشيف (صفحة عرض المقالات، وصفحة التصنيف وغيرها من الصفحات التي تعرض مجموعة من المقالات).</li><li>الدالة <code>the_post_navigation</code> وتستخدم لعرض المقال السابق والتالي للمقال الحالي (في صفحة المقال الحالي).</li><li>الدالة <code>hsb_posted_on</code> تستخدم لعرض تاريخ وكاتب المقال.</li><li>الدالة <code>the_archive_title</code> تستخدم لعرض عنوان الأرشيف إعتمادا على نوعه فمثلا تعرض عنوان التصنيف بصورة مختلفة عن عنوان الوسم وغيرها من الأرشيفات.</li><li>الدالة <code>the_archive_description</code> لعرض وصف الأرشيف.</li><li>الدالة <code>hsb_categorized_blog</code> للتأكد من أن الموقع يحتوي على أكثر من تصنيف للمقالات حيث ترجع <code>true</code> في هذه الحالة.</li><li>الدالة <code>hsb_category_transient_flusher</code> وتستخدم لمسح الtransient الخاص بالتصنيف والذي يستخدم عادة لزيادة سرعة الموقع.</li></ul><p>بالطبع يمكنك إضافة المزيد من الدوال في هذا الملف وتذكر أنه أنسب الأماكن لكتابة الدوال التي تحتاج لإستخدامها في ملفات القالب لعرض بيانات معينة، فمثلا يمكنك إنشاء دالة لعرض عدد مشاهدات المقال وسيكون هذا الملف هو الأنسب لكتابتها.</p><h3>ملف <code>extras.php</code></h3><p>هذا الملف مشابه للسابق ويختلف عنه أن الدوال في هذا الملف لا يتم إستخدامها عادة في ملفات القالب بل تقوم بعمل مهام لا تعتمد على ملفات القالب، وعموما يمكن أن نقول أن الدوال في هذا الملف هي عادة الدوال التي يتم إضافتها الى مفلترات Filters أو أحداث Actions معينة وليست الدوال التي يتم إستداعائها داخل القالب.</p><p>من الدوال في هذا الملفK، الدالة <code>hsb_body_classes</code> والتي تستخدم للتعديل على المتغير الذي يحتوي على CSS Classes الخاص بوسم <code>body</code> للموقع من خلال مفلتره <a rel="external nofollow" href="https://codex.wordpress.org/Plugin_API/Filter_Reference/body_class"><code>body_class</code></a>، وهي في هنا تضيف الClass المسمى <code>group-blog</code> في حالة كانت المدونة تحتوي على أكثر من كاتب.</p><p>الدالة <span style="font-family:courier new,courier,monospace;">hsb_wp_title</span> والتي تقوم بالتعديل على إسم الموقع (الذي يظهر في وسم title بداخل وسم head في الموقع) من خلال فلتره <span style="font-family:courier new,courier,monospace;">wptitle</span> ويتم التعديل على حسب الصفحة المعروضة (حيث يختلف عنوان الموقع في الصفحة الرئيسية من العنوان في صفحة عرض المقال).</p><p>الدالة hsb_render_title وهي المسؤولة عن عرض عنوان الموقع داخل وسم head وذلك من خلال إضافتها للحدث <a rel="external nofollow" href="https://codex.wordpress.org/Plugin_API/Action_Reference/wp_head">wphead</a>. وكما هو الحال بنسبة لملف <span style="font-family:courier new,courier,monospace;">template-tags.php</span> يمكنك إضافة المزيد من الدوال لهذا الملف كما تريد.</p><h3>ملف <code>jetpack.php</code></h3><p>يستخدم هذا الملف لإضافة توافقية القالب مع إضافة <a rel="external nofollow" href="https://wordpress.org/plugins/jetpack/">Jetpack</a> المشهورة وبالتحديد مع خاصية Infinite Scroll التي توفرها هذه الإضافة حيث وذلك من خلال دالتين الأولى وهي <code>hsb_jetpack_setup</code> تقوم بإخبار ووردبريس أن الموقع متوافق مع خاصية <code>infinite-scroll</code> بإستخدام الدالة <a rel="external nofollow" href="https://codex.wordpress.org/Function_Reference/add_theme_support"><code>add_theme_support</code></a>، والدالة الثانية هي <code>hsb_infinite_scroll_render</code> وهي المسؤولة عن طريقة عرض المقالات التي سيتم تحميلها من خلال هذه الخاصية.</p><h3>ملف <code>customizer.php</code></h3><p>هذا الملف يستخدم لإضافة دعم القالب للمخصص Theme Customizer في تعديل إسم ووصف الموقع بحيث تظهر مباشرة في العرض الحي Live Preview بعد التعديل عندما يتم التعديل على المخصص وهذه هي الطريقة التي يعمل بها المخصص، وسنتناول طريقة عمل المخصص وكيفية جعل القالب داعم له وكيفية إضافة بعض الخيارات في المخصص في سلسلة مقالات اخرى إن شاء الله.</p><p><strong>خاتمة</strong><br>بهذا المقال نكون قد أكملنا الحديث عن ما يتعلق بالوظائف العامة Functions التي يوفرها القالب وطريقة ترتيبها وتوزيعها بين الملفات، وتبقى لنا الكلام عن ملفات القالب المسؤولة من عرض محتوى الموقع للمستخدم وطريقة تنسيقه وترتيبها وهو ما سنتكم عنه في المقال القادم إن شاء الله.</p>
]]></description><guid isPermaLink="false">167</guid><pubDate>Tue, 15 Sep 2015 21:00:32 +0000</pubDate></item><item><title>&#x625;&#x636;&#x627;&#x641;&#x629; &#x62E;&#x637;&#x648;&#x637; &#x645;&#x62E;&#x635;&#x635;&#x629; &#x625;&#x644;&#x649; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Font-Face@ &#x648;CSS3</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%AE%D8%B7%D9%88%D8%B7-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D8%A5%D9%84%D9%89-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-font-face-%D9%88css3-r163/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/font-face-wp.png.ef96b121ea40741ca5d2594d6fa01460.png" /></p>

<p>إذا كنت تُصمّم قالبًا جديدًا لووردبريس أو تعدّل قالبًا جاهزًا، فإن الخطوط المُخصّصة ستجدّد منظر قالبك. في حين تأتي متصفحات الإنترنت بخطوط جاهزة افتراضية، وهي التي تستدعيها في ملف <span style="font-family:courier new,courier,monospace;">style.css</span>، استخدام نفس الخطوط التي يستخدمها الآخرين يبدو مملًا بعض الشيء.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_09/font-face-wp.png.4cd6ddbce98f571c2b5c9f3e6272e2ea.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="4579" src="https://academy.hsoub.com/uploads/monthly_2015_09/font-face-wp.thumb.png.1bf8f5f5c3dfa3518ff6da7af4d0ea56.png" class="ipsImage ipsImage_thumbnailed" alt="font-face-wp.thumb.png.1bf8f5f5c3dfa3518"></a><br>لحسن الحظ، بإمكانك إضافة الخط الذي تختاره بسهولة عن طريق قاعدة font-face@ في CSS3. كل ما تحتاجه هو رفع الخط إلى خادوم الويب الخاص بك، ثم إضافته إلى قالبك عن طريق بضعة سطور من CSS.</p><h2>العثور على خط</h2><p>هناك أماكن عديدة للعثور على خطوط ويب جيدة مجانًا مثل <a rel="external nofollow" href="http://www.fontsquirrel.com/">FontSquirrel</a> أو <a rel="external nofollow" href="https://edgewebfonts.adobe.com/">Adobe Edge Web Fonts</a>. فقط تأكد من اختيارك لخط ذي رخصة تلائم احتياجاتك. حيث أن الخطوط المجانية ليست جميعها متاحة للاستخدام التجاري، ولكن يمكنك شراء خطوط بمقابل مادّي للاستخدام التجاري من أماكن عديدة مثل <a rel="external nofollow" href="https://typekit.com/">Typekit</a>.<br>هناك نوعان رئيسيان من الخطوط في اللغة الإنجليزية: serif و sans-serif. تمتلك خطوط serif منحنيات في أطرافها بينما لا تمتلكها خطوط sans-serif.<br>عندما يقع اختيارك على الخط الجديد، ستحتاج لتحميل ملفه. ضع في اعتبارك أن هناك أنواع مختلفة من ملفات الخطوط وليست كلها متوافقة مع أغلب متصفحات الإنترنت.</p><p><strong>إليك مُلخّصا سريعًا عن الأنواع المختلفة للخطوط وصيغ ملفاتها:</strong></p><ul><li><strong>(TrueType Font (TTF</strong>: متوافق مع إنترنت اكسبلور 9.0 وما يليها، وكروم بداية من الإصدارة 4.0، فيرفكس من الإصدارة 3.5، سافاري من الإصدارة 3.1 وأوبرا من الإصدارة 10.0.</li><li><strong>(OpenType Font (OTF</strong>: له نفس التوافقيات لخط TrueType.</li><li><strong>(Web Open Font Format (WOFF</strong>: يدعمه إنترنت إكسبلورر من الإصدارة 9.0 وما يليها، كروم بداية من الإصدارة 5.0، فيرفكس من الإصدارة 3.6، سافاري من الإصدارة 5.1 وأوبرا من الإصدارة 11.1.</li><li><strong>(Web Open Font Format 2.0 (WOFF2</strong>: مدعوم فقط في كروم من الإصدارة 36.0، فيرفكس من الإصدارة 35.0، وأوبرا من الإصدارة 26.0.</li><li><strong>(Embedded Open Type Font (EOT</strong>: متاح خصيصًا لإنترنت إكسبلورر 6.0 وما يليه.</li></ul><p>صيغة Web Open Font Format هي الصيغة المفضلة نظرًا لأن الخطوط تٌضغط فيها لتستهلك مساحة أقل من الاتّصال المتاح لك وتحتوي على بيانات وصفية إضافية. ولكن للأسف فإنها ليست دائمًا متاحة للتحميل. فإذا وجدت صعوبة بالعثور على هذه الصيغة، يمكنك استخدام صيغ TrueType وOpenType المتاحة بشكل أكبر للتحميل كما أنها اختيارجيد أيضًا.</p><h2>رفع خطوطك على خادوم الويب</h2><p>حين تجد الخط الذي تريد استخدامه وتتبع إرشادات مصدر الخط لتحميل الملف، فقد حان الوقت إذن لرفعه إلى خادوم الويب الخاص بك. وقبل أن تفعل ذلك، تذكر أن تحتفظ بنسخة احتياطية من موقعك بالكامل قبل إجراء أي تعديلات.</p><p>من المستحسن إضافة الخط إلى المجلد الذي يحوي قالبك، والذي يمكن أن تجده في المسار:</p><p style="text-align: center;"><strong> wp-content &gt; themes &gt; your-theme </strong></p><p>حيث <code>your-theme</code> هو اسم قالبك. يمكنك أيضًا إذا أردت إضافة مجلد <code>Fonts</code> ليحتوي خطوطك حتى تنظم حاجياتك، خاصة إذا كنت تخطط لإضافة أكثر من خط واحد.</p><p>فك ضغط الملف المضغوط وارفع المحتويات إلى مجلد القالب الخاص بك عن طريق لوحة التحكم. عبر النّقر على زر File Manager تحت Files في الصفحة الرئيسية للوحة التحكم. وغالبًا ستظهر لك نافذة منبثقة، فحينها ستختار مكان موقعك وبعدها تضغط زر الذهاب <strong>Go</strong>. انتقل إلى مجلد القالب الخاص بك واضغط زر الرفع <strong>Upload</strong> في أعلى الصفحة.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/upload-file-cPanel-700x295.png.649d492b753aaeba5323c698f6af53f7.png"><img data-fileid="4558" class="ipsImage ipsImage_thumbnailed" alt="upload-file-cPanel-700x295.thumb.png.787" src="https://academy.hsoub.com/uploads/monthly_2015_09/upload-file-cPanel-700x295.thumb.png.787d1974ff9d13b2079caa2e166d254f.png"></a></p><p>يمكنك ترك صلاحيات الملف 644 ولن تواجه مشاكل غالبا. ولكن إذا واجهتك مشكلة صلاحية، فجرب حذف الملفات ثم إعادة رفعها مجددا بصلاحيات مختلفة.</p><p>اضغط على زر اختيار الملف <strong>Choose file</strong> في صفحة رفع الملفات واختر ملفات الخط من حاسوبك. عندما تفتحها، فإن عملية الرفع ستبدأ تلقائيًا دون ضغط زر إضافي على هذه الصفحة.<br>لا يهم المكان الذي تضع فيه ملف الخطوط، بل ستحتاج لتتذكر مساره. وستجده مكتوبًا في صفحة رفع الملفات بالبنط العريض بعد جملة Select files to upload to.</p><h2>إضافة خطوطك إلى القالب</h2><p>لإظهار خطوطك المرفوعة في قالبك، ستحتاج لاستدعائها في ملف <code>style.css</code> الخاص بالقالب، حيث يمكنك العثور عليه في:</p><p style="text-align: center;"><strong>wp-content &gt; themes &gt; yourtheme</strong></p><p>في لوحة التحكم، اختر الملف ثم اضغط زر التعديل في أعلى الصفحة. إذا لم تكن قد منعت النوافذ المنبثقة مسبقًا، ستظهر لك نافذة منبثقة، في هذه الحالة اضغط على <strong>Go</strong> في الأسفل. انسخ النص البرمجي بالأسفل إلى الملف، ويفضل لصقه في الجزء المُخصّص لاستدعاء الخطوط. تأكد أن هناك سطرًا فاصلًا بين كل جزء من أجزاءئ النّص البرمجي في الملف.</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">@font-face { 
    font-family: FontName; 
    src: url(public_html/your-site/wp-content/themes/your-theme/fonts/FontName-Regular.ttf); font-weight: normal; 
}</pre><p>لا تنس استبدال FontName باسم الخط الذي اخترته، وعدّل في الشيفرة البرمجية لتغيير مسار ملفات الخطوط إلى المسار الصحيح. أضف نفس شيفرة CSS مجددًا لتعريف النمط السميك، المائل، والعناوين الرئيسية للخطوط وما شابه، وتأكد من تغيير اسم الخط ومسار الملف بشكل صحيح. وفي النهاية، حدّد كيفية استخدام خطك ببعض النصوص الإضافية من CSS مثل المثال بالأسفل:</p><pre data-pbcklang="css" data-pbcktabsize="4" class="css ipsCode prettyprint">p { font-family: FontName; } </pre><p>في هذا المثال، كل نصوص الفقرات (الموسومة بوسم <span style="font-family:courier new,courier,monospace;">p</span>) ستستخدم الخط الجديد. حين تنتهي من تعديل النص البرمجي إلى اختياراتك الخاصة وتحفظ الملف، سيظهر الخط الجديد على موقعك.</p><h2>خاتمة</h2><p>مع هذه التعليمات، يجب أن تكون قادرًا على إضافة خطوط جديدة إلى القالب الخاص بك دون أي مشاكل. ومع ذلك، هناك العديد من الإضافات التي يمكنها مساعدتك على إضافة خطوط دون الحاجة إلى أي برمجة إذا أردت حلًا أسهل.</p><p>لمزيد من المعلومات عن استخدام الخطوط في ووردبريس، اقرأ الدليل التالي: <a rel="external nofollow" href="http://codex.wordpress.org/Playing_With_Fonts">اللعب بالخطوط</a>.</p><p>ترجمة -وبتصرف- للمقال: <a rel="external nofollow" href="https://premium.wpmudev.org/blog/custom-fonts-css/">Adding Custom Fonts to WordPress with @Font-Face and CSS3</a> لصاحبه: Jenni McKinnon.</p>
]]></description><guid isPermaLink="false">163</guid><pubDate>Mon, 07 Sep 2015 20:06:12 +0000</pubDate></item><item><title>&#x643;&#x644; &#x634;&#x64A;&#x621; &#x64A;&#x62C;&#x628; &#x623;&#x646; &#x62A;&#x639;&#x631;&#x641;&#x647; &#x62D;&#x648;&#x644; &#x627;&#x644;&#x62D;&#x642;&#x648;&#x644; &#x627;&#x644;&#x645;&#x62E;&#x635;&#x635;&#x629; &#x641;&#x64A; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D9%83%D9%84-%D8%B4%D9%8A%D8%A1-%D9%8A%D8%AC%D8%A8-%D8%A3%D9%86-%D8%AA%D8%B9%D8%B1%D9%81%D9%87-%D8%AD%D9%88%D9%84-%D8%A7%D9%84%D8%AD%D9%82%D9%88%D9%84-%D8%A7%D9%84%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%81%D9%8A-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r159/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_09/custom-fields-wordpress.png.28412d785a177a44477ec30552fd16ce.png" /></p>

<p>ووردبريس هو منصة رائعة لإدارة المحتوى. إذا كنت تملك أيّ محتوى يأتي في شكل وحدات شبيهة بالمقالات (أو ما شابهها مثل منتجات) فلا أجد سببا يدفعك لعدم استخدام ووردبريس. قد يكون التعاون باستخدام سكربت <a rel="external nofollow" href="https://www.mediawiki.org/wiki/MediaWiki">ميديا ويكي</a> سهل أيضا، واستخدام <a rel="external nofollow" href="https://www.drupal.org/">دروبال</a> مع أنظمة الشركات يعد أمرا سهلا وشائعا، لكن ووردبريس له مكانته أيضا في هذا المجال، وهو في رأيي، يوفر تجربة تحرير أفضل.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_09/custom-fields-wordpress.png.ca3321c33861a68a0cf7dab42528e944.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="4470" src="https://academy.hsoub.com/uploads/monthly_2015_09/custom-fields-wordpress.thumb.png.c490662a0d128eca1757f8c58681a204.png" class="ipsImage ipsImage_thumbnailed" alt="custom-fields-wordpress.thumb.png.c49066"></a></p><p>أحد الطرق لجعل المحتوى في ووردبريس يعمل بشكل أفضل هو إضافة معلومات إضافية له (metadata). قد يكون الأمر على شكل تصنيفات خاصة (taxonomies) أو على شكل بيانات تستخدم لهدف واحد (custom fields).</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/custom_fields_image_1.png.1b47d47ff9ed6e30b8d09b7a6739a144.png"><img data-fileid="4448" class="ipsImage ipsImage_thumbnailed" alt="custom_fields_image_1.thumb.png.aa78cf0a" src="https://academy.hsoub.com/uploads/monthly_2015_09/custom_fields_image_1.thumb.png.aa78cf0aea55e64def52662a6055ec6b.png"></a></p><h2>ماهو الحقل المخصص في ووردبريس؟</h2><p>إذا أردت أن تستخدم معلومات محددة متغيرة لكل مقال ما (أو شيء شبيه بمقال كمنتج)، هنا تستطيع استخدام <a href="https://academy.hsoub.com/programming/php/wordpress/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%AA%D9%91%D8%B5%D9%86%D9%8A%D9%81%D8%A7%D8%AA-taxonomies-%D9%88%D8%A7%D9%84%D8%AD%D9%82%D9%88%D9%84-fields-%D9%81%D9%8A-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r101/">الحقول المخصصة في ووردبريس</a>. "الحقول المخصصة" لها تسميتان مختلفتان في ووردبريس، غالبا ما يطلق عليها خصائص المنشور أو المعلومات الجانبية (post metadata) أو <code>post_meta</code> وعادة ما يطلق عليها باسم الحقول المخصصة، وهذه الترجمة الرسمية التي يستخدمها فريق ترجمة ووردبريس العربي.</p><p>نحن نضيف الحقول المخصصة عندما نريد أن نخزن خصائص إضافية لمنشور ما. منشورات ووردبريس تأتي بالعديد من الخصائص الإضافية بشكل مسبق: تاريخ النشر، كاتب الموضوع، آخر وقت تّم التعديل عليهم. لكنك قد تريد المزيد، مثلا تريد أن تضيف عنوانا ثانويا للمنشور، أو تريد أن تضيف ملخص المنشور تصميم منفرد.</p><p>ووردبريس يقوم بتخزين هذه المعلومات في قاعدة البيانات، وباستخدام دوال معينة نقوم بتحديدها وتخزينها واسترجاعها. الحقول المخصصة تنفرد عن خيارات الموقع <code>site_settings</code> حيث أنّ لهم علاقة بالمنشور وليس بالموقع ولكن كلاهما يعملان بنظام عنوان وقيمة <code>key/value pair</code> يتم استخارجهم من قاعدة البيانات عبر دوال محددة، لذا إن كانت لك تجربة بنظام خيارات الموقع <code>Settings <abbr title="واجهة برمجية | Application Programming Interface">API</abbr></code> فلن تواجه مشكلة في فهم الحقول المخصصة.</p><h2>كيف أضيف الحقول المخصصة لمنشور؟</h2><p>هناك العديد من الطرق التي تستطيع استخدامها لإضافة الحقول المخصصة، الواجهة الافتراضية للتعامل مع الحقول الخاصة في ووردبريس قديمة ولم يتم تحديثها منذ مدة، ورغم أنها تخدم الهدف إلا أنها بعيدة عن المثالية. الجزء المضاف في الأسفل "ما بعد الأساسيات" سيدخل في التفاصيل حول خيارات أخرى تستطيع اللجوء لها من أجل التحكم في الحقول الخاصة، لكن سنقوم الآن بفهم الواجهة الأصلية فحسب، لأنها ستكون موجودة دوما في كل المواقع.</p><p>في شاشة التعديل على منشور ستجد صندوق "خصائص إضافية"، وستقوم أنت بتعديل الحقول المخصصة فيه.</p><p>لا داعي لنمر على كامل معلومات تكوين الصندوق، ستقوم ببساطة باختيار الاسم (أو تضيف واحدا جديدا في حال لم تقم بالأمر من قبل). من ثم تقوم بإضافة القيمة، إضغط على الزر ولقد قمت بإضافة الحقل إلى منشورك، محفوظا مع بقية عناصرك.</p><h2>إظهار الحقول المخصصة في منشوراتك</h2><p>لتستخدم الحقول الخاصة في منشوراتك أمامك عدة دوال، وتسمياتهم تختلف حسب طريقة تكلم الناس عنهم، الدوال الأساسية هي كالتالي:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/custom_fields_image_2.png.063ca380075ec72a33e694af53599cdd.png"><img data-fileid="4449" class="ipsImage ipsImage_thumbnailed" alt="custom_fields_image_2.thumb.png.c0dcb00e" src="https://academy.hsoub.com/uploads/monthly_2015_09/custom_fields_image_2.thumb.png.c0dcb00eb6a3c8ba282e5c2414a95d21.png"></a></p><ul><li><code><strong>()the_meta</strong>: </code>مثل كل دوال ووردبريس التي تبدأ بـ <span style="font-family:courier new,courier,monospace;">_<code>the</code></span> فدالة<span style="font-family:courier new,courier,monospace;"> ()</span><code><span style="font-family:courier new,courier,monospace;">the_meta</span> </code>الهدف منها طبع المعلومات (<code>echo</code>) حتى لا تقوم بالأمر يدويا. تستطيع استخدامها عندما لا تريد أن تغير أيّ شيء بالمعلومات التي تريد طباعتها. لكنها تبدو لي غبر مفيدة لأنها لا تتيح لك أيّ تحكم بهيكلة المعلومات التي تحصل عليها، كما أنها تقوم بطبع كل المعلومات للصفحة.</li><li><code><strong><span style="font-family:courier new,courier,monospace;">()get_post_meta</span></strong>: </code>هي الدالة التي أستخدمها أنا طوال الوقت، المتغير الأول (parameter) الذي تحتاجه هو معرف (ID) المنشور، المتغير الثاني هو اسم الحقل الذي تريد جلبه، والثالث هو Boolean في حال كنت تريد القيمة على شكل string أو array مصفوفة (true من أجل string وfalse ل array).</li><li><code><strong><span style="font-family:courier new,courier,monospace;">()get_post_custom</span></strong>: </code>عمل بشكل شبيه جدا لـ <span style="font-family:courier new,courier,monospace;">()</span><code><span style="font-family:courier new,courier,monospace;">get_post_meta</span> </code>لكنها تختلف في التسمية، الفرق أنك تقوم بتمرير ID المنشور له فحسب (بشكل اختياري أيضا) وسيقوم بإرجال كل القيم المخصصة للمنشور على شكل array.</li></ul><h2>ما بعد الأساسيات: كيفية تحسين واجهة الحقول المخصصة</h2><p>أحد نقاط ضعف ووردبريس من ناحية الحقول المخصصة هو الصندوق الذي تستخدمه للتعديل عليها، فكما أسلفنا الذكر، الصندوق ليس مفيدا لتلك الدرجة، لذا أنت تملك الفرصة لتحسين التجربة لمستخدميك وزبائنك.</p><h3>الدوال التي تحتاجها للتعامل مع الحقول الخاصة</h3><p>حتى الآن، فقد تعلمنا كيف نسترجع الحقول الخاصة فحسب، مهمة أخرى ستقوم بها عند التطوير هي تعديل أو حذف المعلومات. من أجل هذه المهمة يقدم ووردبريس 3 دوال بسيطة للقيام بالأمر وهي:</p><ul><li><p><code><a rel="external nofollow" href="https://codex.wordpress.org/Function_Reference/add_post_meta">()add_post_meta</a></code> : هي الطريقة التي تستخدمها لإنشاء الحقل لأول مرة، تقوم بتمرير ID المنشور لها واسم الحقل المخصص (<code>meta_key</code>) والقيمة التي تريدها، وبشكل اختياري تستطيع تحديد أن يجعل ووردبريس تلك القيمة فريدة من نوعها.</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint" style="text-align: left;">addpostmeta($postid, $metakey, $meta_value, $unique = false)
</pre></li><li><p><a rel="external nofollow" href="https://codex.wordpress.org/Function_Reference/update_post_meta">()update_post_meta</a> : يمكن أيضا استخدام هذه الدالة لإنشاء حقل مخصص جديد، لذا هي تملك القدرة لتحل مكان <span style="font-family:courier new,courier,monospace;">()</span><code>add_post_meta </code>في حال لم تكن واثقا أن الحقل جديد أو لا فتستطيع استعمالها، أول ثلاث خيارات هم نفس خيارات <span style="font-family:courier new,courier,monospace;">()</span><code>add_post_meta </code>والخيار الأخير هو القيمة السابقة، وهو أمر لم استخدمه من قبل حقا ولكن قد يكون مفيدا في حال كنت تملك الكثير من القيم لاسم واحد (key).</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint" style="text-align: left;">updatepostmeta($postid, $metakey, $metavalue, $prevvalue='')
</pre></li><li><p><a rel="external nofollow" href="https://codex.wordpress.org/Function_Reference/delete_post_meta">()delete_post_meta</a> : هي كما تتوقع تماما، وخياراتها مثل البقية تماما، عدى أن الخيار الأخير (قيمة الحقل) هي قيمة اختيارية تستطيع أن لا تحددها.</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint" style="text-align: left;">deletepostmeta( $postid, $metakey, $meta_value = '' )
</pre></li></ul><p>شرح كيفية استخدام هذه الدوال داخل لوحة التحكم هو خارج نطاق المقال، لكنك تستطيع استعمالها <a rel="external nofollow" href="https://codex.wordpress.org/Function_Reference/add_meta_box">عبر إنشاء صندوق جديد</a>، واستخدام الدوال اللازمة وحفظ المعلومات أثناء حفظ المنشور.</p><h3>استخدام إضافات مصممة لتحسين تجربة الحقول الخاصة</h3><p>هناك العديد من الإضافات الرائعة التي تقوم بتحسين واجهة الحقول الخاصة، أشهرها في نظري هي <a rel="external nofollow" href="https://wordpress.org/plugins/pods/">Pods</a> و <a rel="external nofollow" href="https://wordpress.org/plugins/advanced-custom-fields/">Advanced Custom Fields</a>. تقوم هذه الإضافات باستخدام custom post type لإنشاء حقول جديد تعمل بمثابة حقل مخصص.</p><h3>أداة أبسط وأقوى</h3><p>الطريقة التي استخدمها عادة والتي تختلف عن البقية هي إضافة <a rel="external nofollow" href="https://github.com/WebDevStudios/CMB2">CMB2</a> فهي تتيح لك تحكم عبر الشفرة البرمجية (عكس الإضافات الأخرى التي تتطلب منك إنشاء الحقول عبر واجهة). استخدام هذه الطريقة للبناء بدل الطريقة التقليدية الذي يوفرها ووردبريس هو أمر مختلف تماما وتجربة رائعة.</p><p>لن تحتاج لكتابة دوال كبيرة لبناء صناديق لحقول مخصصة ثم محاولة حفظها فهي تقوم بكل شيء بشكل أوتوماتيكي. كل ما عليك القيام به هو وضع الملفات في قالبك أو إضافتك أو تنصيب الإضافة والعمل مع دوالها من قالبك، لشرح أكبر لها اقرأ <a rel="external nofollow" href="https://github.com/WebDevStudios/CMB2/wiki/Basic-Usage">التوثيق المرفق لها</a>.<br>يجدر الذكر أنّ الإضافة مترجمة للعربية بنسبة 93% (بتاريخ هذا اليوم) ويعتبر هذا دعما ممتازا للعربية لذا الشكر لكل من ساهم في ترجمتها (تستطيع الانضمام لهم عبر موقع <a rel="external nofollow" href="https://www.transifex.com/wp-translations/teams/8416/ar/">Transifex</a>).</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_09/custom_fields_image_3.png.c5771631d4f8c97cb405ec218298d7b3.png"><img data-fileid="4450" class="ipsImage ipsImage_thumbnailed" alt="custom_fields_image_3.thumb.png.2175a880" src="https://academy.hsoub.com/uploads/monthly_2015_09/custom_fields_image_3.thumb.png.2175a880a1aea99c68a4a7ad0656bf98.png"></a></p><h2>قوة الحقول المخصصة في ووردبريس</h2><p>كما أسلفنا الذكر، الحقول المخصصة تعتبر جزءا مهما في تطوير استخدامك لووردبريس. استخدام الأمور المبنية في ووردبريس لنشر المحتوى أمر جيد، ولكن الحقول المخصصة هي ما تسمح لإضافات مثل WooCommerce و Easy Digital Downloads بإضافات مميزات قوية لووردبريس.</p><p>ترجمة -وبتصرف- للمقال: <a rel="external nofollow" href="http://wpshout.com/everything-wordpress-custom-fields/">Everything You Should Know about WordPress Custom Fields</a> لصاحبه: DAVID HAYES.</p>
]]></description><guid isPermaLink="false">159</guid><pubDate>Thu, 03 Sep 2015 22:08:35 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x627;&#x644;&#x648;&#x633;&#x648;&#x645; &#x627;&#x644;&#x634;&#x631;&#x637;&#x64A;&#x629; &#x641;&#x64A; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%B3%D9%88%D9%85-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r150/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-conditional-tags.png.604cbd2513fd4f95c4d3f293d0414245.png" /></p>

<p>واحد من أكثر الأشياء المفيدة في ووردبريس ما يسمى بالوسوم الشرطية (Conditional Tags)، حيث ستمكنك من البرمجة بسهولة وفهم الكود الذي تكتبه كأنك تقرأ نص باللغة الإنجليزية.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-conditional-tags.png.ad5d8e728ec73bcdd6804d85119ec41f.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="4127" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-conditional-tags.thumb.png.4175da703294ad3723963a865917cea9.png" class="ipsImage ipsImage_thumbnailed" alt="wordpress-conditional-tags.thumb.png.417"></a></p><p>سنقوم في هذا الدرس بدراسة طريقة عمل الوسوم الشرطية مع إيضاح بعض النقاط الخفية والمبهمة مع قائمة بأكثر الوسوم الشرطية المفيدة وسنختم ببعض الأمثلة إن شاء الله.</p><h2>كيف تعمل الوسوم الشرطية</h2><p>الوسوم الشرطية هي دوال خاصة بووردبريس تقوم بإرجاع قيمة صح أو خطأ (boolean) إعتمادا على معطيات مختلفة. </p><p>يوجد حوالي 50 وسما شرطيا في ووردبريس، ولذلك سنقوم باختيار أكثرها استعمالا وأكثرها جديرة بالاهتمام وإلا سوف تسبب لنا الكثير من التعقيد.</p><h3>مفيدة</h3><ul><li><strong><span style="font-family:courier new,courier,monospace;">()is_single</span></strong> سيتم إرجاع قيمة صحيحة إذا كانت الصفحة الحالية متكونة من تدوينة واحدة فقط من أي نوع ماعدا التدوينة مع المرفقات. ويتم ذلك عن طريق تمرير رقم التدوينة أو عنوانها كمعامل (parameter).</li><li><strong><span style="font-family:courier new,courier,monospace;">()is_page</span></strong> سيتم إرجاع قيمة صحيحة إذا كانت الصفحة معروضة (غير مخفية).</li><li><strong><span style="font-family:courier new,courier,monospace;">()is_singular</span></strong><em> مشابهة لـ<span style="font-family:courier new,courier,monospace;"> ()is_</span></em><span style="font-family:courier new,courier,monospace;">single</span>، لكنها تعود بقيمة صحيحة إذا تم عرض تدوينة تحتوي على مرفقات، وهي مشابهة لـ <span style="font-family:courier new,courier,monospace;">()is_</span><em><span style="font-family:courier new,courier,monospace;">single()</span> || <span style="font-family:courier new,courier,monospace;">is_</span></em><span style="font-family:courier new,courier,monospace;">page()</span> || <span style="font-family:courier new,courier,monospace;">is_attachment</span> حيث أن || تعني "أو".</li><li><strong><span style="font-family:courier new,courier,monospace;">()is_archive</span></strong> سيتم إرجاع قيمة صحيحة إذا كانت الصفحة الحالية عبارة عن أرشيف مهما كان نوعها.</li><li><strong><span style="font-family:courier new,courier,monospace;">()is_<em>main_</em>query</span></strong> سيتم إرجاع قيمة صحيحة إذا كان الاستعلام الحالي هو الاستعلام الرئيسي لهذه الصفحة.</li></ul><h3>مبهمة ومخادعة</h3><ul><li><strong><span style="font-family:courier new,courier,monospace;">()is_admin</span></strong> سيتم إرجاع قيمة صحيحة إذا كُنت في منطقة الإدارة من موقع ووردبريس، بعض الأشخاص يعتقد أن هذا الوسم لمعرفة هل المستخدم الحالي من المدراء أم لا، وهذا الأمر خاطئ.</li><li><strong><span style="font-family:courier new,courier,monospace;">()is_dynamic_sidebar</span></strong> سيتم إرجاع قيمة صحيحة إذا كان الشريط الجانبي الحالي (ويدجت أو مناطق) لديه أية ودجات مفعلة.</li><li><strong><span style="font-family:courier new,courier,monospace;">()is_home </span></strong>هذا الوسم مربك قليلا، سوف تعتقد للوهلة الأولى أنه لمعرفة هل أنت في الصفحة الرئيسية أم لا مثل <a rel="external nofollow" href="http://www.example.com">http://www.example.com</a>. لكن هذا ليس صحيح لأن هذا الوسم لمعرفة هل أنت في صفحة الرئيسية للتدوينات أم لا لأنه في بعض الأحيان قد تكون الصفحة الرئيسية للموقع ليس هي نفسها للتدوينات.</li><li><strong><span style="font-family:courier new,courier,monospace;">()is_front_page</span></strong> سيتم إرجاع قيمة صحيحة إذا كانت الصفحة التي أنت فيها هي الصفحة الرئيسية سواء أن كانت هي نفسها للتدوينات أو صفحة تابعة للمدونة.</li></ul><p>قمنا بعرض جزء فقط من الوسوم الشرطية، إذا أردت المزيد يمكنك زيارة <a rel="external nofollow" href="https://codex.wordpress.org/Conditional_Tags">القائمة الكاملة</a>.</p><h2>بعض الإستخدامات للوسوم الشرطية في ووردبريس</h2><p>هنالك الكثير من الإستخدامات للوسوم الشرطية وسنقوم الآن باستعراض أشهرها وأكثرها استعمالا.</p><h3>استخدام الوسوم الشرطية في القوالب</h3><p>تستخدم الوسوم الشرطية بكثرة في تطوير القوالب، ففي بعض الأحيان هنالك عنصر يظهر في كل الصفحات لكن هنالك حالات أو صفحات لا تريد أن يظهر بها.</p><p>على سبيل المثال، لنقل أنك لا تريد أن يظهر التاريخ على الصفحات لكنك تريده أي يظهر على جميع التدوينات، فيمكنك القيام بهذا عن طريق هذه الشِفرة:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">/* الوسط: داخل ملف single.php */
&lt;?php if ( ! is_page() ): ?&gt;
    &lt;span class="meta-date"&gt;
        &lt;?php the_date(); ?&gt;
    &lt;/span&gt;
&lt;?php endif; ?&gt;</pre><h3>ملاحظة حول الوسوم الشرطية والقالب الهرمي</h3><p>إن القالب الهرمي مشابه بالأساس لـشجرة القرار التي يمكنك بناؤها باستعمال الوسوم الشرطية. ويمكنك أيضا وضع كامل القالب في <span style="font-family:courier new,courier,monospace;">index.php </span>واستخدام هذه الوسوم لعمل ما يعمله القالب الهرمي.</p><p>في الحقيقة فعل هذا الأمر ليست فكرة فريدة وجيدة، لكن معرفة أن هذا ممكن ومحاولة استعمال الوسوم الشرطية والقالب الهرمي سوف يساعدك على فهم الإثنين معا حسب رأيي. ولفهم هذا الأمر أكثر أنظر لهذا المخطط:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-conditional-tags-graph.jpg.2fc18e640cc1c735abd1f4cc5021954d.jpg"><img data-fileid="4126" class="ipsImage ipsImage_thumbnailed" alt="wordpress-conditional-tags-graph.thumb.j" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-conditional-tags-graph.thumb.jpg.160ca57e3b8148219c7a0ab81c68db36.jpg"></a></p><h3>إدراج ورقة أنماط خاصة أو ملفات جافا سكريبت</h3><p>في بعض الأحيان سوف تحتاج إلى صنع صفحة مخصصة في موقعك بها الكثير من التأثيرات و الخصائص، ولتحقيق هذا سوف تحتاج إلى الكثير من التأثيرات والسكريبات والتي يجب أن تكون في صفحة واحدة فقط لأن تحميل كل هذه التأثيرات والسكريبات في جميع صفحات الموقع سوف يزيد من حجمه ويجعله أبطأ، ويمكن القيام بذلك عن طريق الوسوم الشرطية كما في المثال:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">add_action( 'wp_enqueue_scripts', 'wpshout_special_page' );
function wpshout_special_page() {
    if ( is_page( 'special-page' ) ) {
        wp_enqueue_script( 
            'special_js', 
            get_stylesheet_directory_uri().'/special.js'
        );
        wp_enqueue_style( 
            'special_css', 
            get_stylesheet_directory_uri().'/special.css'
        );
    }
}</pre><p>هنا قمنا بعمل إدراج بشكل عادي، لكننا قمنا بربط عملية الإدراج بشرط: إذا لم تكن الصفحة الحالية "صفحتنا الخاصة"، التأثيرات وأوراق الأنماط و السكريبتات لن يتم تحميلها.</p><p>لاحظ أن <span style="font-family:courier new,courier,monospace;">()is_page</span> ستقوم باختبارين:</p><ul><li>الأول للتأكد من أن المشاركة من نوع صفحة.</li><li>والثاني هل لصفحة <span style="font-family:courier new,courier,monospace;">special-page</span> اسم للطيف، معناها هل هي slug ؟ ويقصد بها أن الرابط يحتوي على عنوان الصفحة <a rel="external nofollow" href="http://wordpress.org/development/2006/06/wordpress-203/">مثلا في هذا الرابط</a>، سيكون slug هو <span style="font-family:courier new,courier,monospace;">wordpress-203</span>. ولاختبار هذا قمنا بتمرير '<span style="font-family:courier new,courier,monospace;">special-page</span>' إلى <span style="font-family:courier new,courier,monospace;">()is_page</span> كمعامل.</li></ul><p>إن التأكد من هذين الشرطين يجعلنا نرفض وضع السكريبتات وأوراق الأنماط سوى لصفحة واحدة مخصصة.</p><p><span style="font-family:courier new,courier,monospace;">()is_admin</span> يمكن استخدامه أيضا فهو حالة أخرى حيث تحتاج الإضافات للقيام بعمليات اختبار مماثلة.</p><h2>ملاحظة عن الوسوم الشرطية والحالة العامة</h2><p>الوسوم الشرطية تستطيع الوصول إلى الحالة العامة (Global State) لووردبريس (طريقة عمل الأشياء في الخلفية) وهذه الحالة يجب أن يتم وضعها قبل أن تستطيع استخدامها، لكن لا يمكنك الاعتماد كليا على استعمال الوسوم الشرطية حتى تتأكد أن عملية المصنع الخاصة بووردبريس قد فعّلت الإجراء (action) المسمى <span style="font-family:courier new,courier,monospace;">posts_selection</span>. (<a rel="external nofollow" href="https://codex.wordpress.org/PluginAPI/ActionReference#ActionsRunDuringaTypicalRequest">هنا لائحة الكاملة بالإجراءات المفعلة من قبل ووردبريس وترتيبها</a>).</p><p>هذا يعني أن بعض الإجراءات التي يتم استخدامها عادة لا يمكن استخدامها بالتوازي مع الوسوم الشرطية، ومن أشهر هذه الإجراءات: <span style="font-family:courier new,courier,monospace;">setup_theme</span>، <span style="font-family:courier new,courier,monospace;">init</span>، <span style="font-family:courier new,courier,monospace;">register_sidebar</span> و <span style="font-family:courier new,courier,monospace;">pre_get_posts</span>. ومع ذلك، حوالي نصف الخُطّافات (hooks) وجميع القوالب تعمل جيدا بعد أن يتم تحميل الوسوم الخاصة بالقوالب، وسوف تكون مفيدة جدا هناك.</p><p>في أغلب الوقت لن تكون هذه مشكلة لك، لكنه من الجيدة أن تعرف ما يمكنك فعله وما لا يمكنك، فهذا الأمر لن يزعجك سوى لمرة واحدة في كل 50 مرة تستخدم فيها الوسوم الشرطية.</p><h2>الوسوم الشرطية: تعلمها، استخدمها، وأحبها</h2><p>إن الدوال الشرطية لووردبريس واضحة للغاية و مفيدة جدا و تستعمل في كل مكان، وآمل أن تستخدمها وأن تكون مفيدة لك في جميع الحالات عندما تحتاجها و تتحدث مع نفسك مثل : "نعم، أريد فعل هذا لكن ليس في هذه الحالة ..." أو "لكن أريدها فقط أن تظهر عندما ..." وغيرها، وسوف تبرز لك قوة ووردبريس كما هي.</p><p>ترجمة وبتصرف للمقال: <a rel="external nofollow" href="http://wpshout.com/wordpresss-conditional-tags/">WordPress’s Conditional Tags</a> لصاحبه David Hayes.</p>
]]></description><guid isPermaLink="false">150</guid><pubDate>Wed, 26 Aug 2015 20:55:36 +0000</pubDate></item><item><title>&#x62C;&#x639;&#x644; &#x625;&#x636;&#x627;&#x641;&#x627;&#x62A; &#x648;&#x642;&#x648;&#x627;&#x644;&#x628; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633; &#x62C;&#x627;&#x647;&#x632;&#x629; &#x644;&#x644;&#x62A;&#x631;&#x62C;&#x645;&#x629;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%AC%D8%B9%D9%84-%D8%A5%D8%B6%D8%A7%D9%81%D8%A7%D8%AA-%D9%88%D9%82%D9%88%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%AC%D8%A7%D9%87%D8%B2%D8%A9-%D9%84%D9%84%D8%AA%D8%B1%D8%AC%D9%85%D8%A9-r148/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/i18n-ready-wp-plugins_(1).png.c5b1af1c16fe3fb9978996f6f275a085.png" /></p>

<p><span style="line-height: 22.3999996185303px;">كل يوم ينمو ووردبريس ويتطور أكثر فأكثر وفي جميع الدول العالم الناطقة باللغة الإنجليزية وغيرها، وأغلب البرمجة في ووردبريس تتم باللغة الإنجليزية بالإضافة إلى أغلب الإضافات والقوالب تكتب بسلاسل نصية باللغة الإنجليزية على الرغم من أن أكثر من نصف مستخدميه لغتهم الأصلية ليست الإنجليزية.</span></p><p>هذا المقال، تعزيز للمقال الموجود مسبقا على أكاديمية حسوب، حول <a href="https://academy.hsoub.com/programming/php/wordpress/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B7%D9%88%D8%B1-%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A5%D8%B6%D8%A7%D9%81%D8%A7%D8%AA-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%84%D9%84%D8%AA%D8%B1%D8%AC%D9%85%D8%A9-r105/">دليل المطور لتهيئة إضافات ووردبريس للترجمة</a>.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/i18n-ready-wp-plugins_(1).png.0d1b98adc6295ee828ec56502c02cbe1.png"><img data-fileid="4047" class="ipsImage ipsImage_thumbnailed" alt="i18n-ready-wp-plugins_(1).thumb.png.69d1" src="https://academy.hsoub.com/uploads/monthly_2015_08/i18n-ready-wp-plugins_(1).thumb.png.69d119444f9e9802b2c866933c2e46cc.png"></a></p><p>وهذا هو السبب الذي جعلنا نشهد على المدى العقد الماضي المزيد من المناقشات لدعم التدويل التي ستجعل ووردبريس يدعم جميع اللغات الأخرى، وهذا سيكون ضروريا لو كنت تعمل على إضافات أو قوالب عالمية الانتشار.</p><p>يجب علينا القيام بثلاثة خطوات حتى نتمكن من ترجمة السلاسل النصية لعناصر الواجهة:</p><ol><li>اختر، صرّح، و استخدم "مجال النص".</li><li>استخدم وظائف مناسبة لسلاسلك النصية ومجال النص المختار.</li><li>سيسمح لك هذا بإنشاء ملفات الترجمة.</li></ol><p>بفضل ملفات الترجمة هذه، ستسمح للناس بترجمة قوالبك و إضافاتك.</p><h2>ما هو "مجال النص" ؟</h2><p>مجال النص هو "ترجمة مساحة الأسماء"  (translation namespace) لإضافاتك أو ثيماتك وهي طريقة لوردبريس لفصل قائمة من "السلاسل النصية لترجمتها" من بقية السلاسل النصية.<br>وتكمن أهمية مجال النص في أن بعض السلاسل النصية قد تعني معاني كثيرة في الإضافات والقوالب، فمثلا كلمة "!Let’s go" قد تعني "Create a membership account" في سياق وقد تعني "Start the survey" في سياق آخر.</p><p>لذلك بعد تعريف مجال النص، واستخدامه مع "gettext" أو مع دوال الترجمة التي سوف نقوم بشرحها فيما بعد. (إن مشروع <a rel="external nofollow" href="http://www.gnu.org/software/gettext/">gettext</a> جزء أساسي من طريقة عمل نظام الترجمة في الووردبريس)<br>إذا أردت أن تضع مجال النص في إضافتك أو في قالبك في الجزء العلوي للتعليقات الموجود في ملف <span style="font-family:courier new,courier,monospace;">style.css</span> للقوالب أو في ملف PHP الرئيسي لإضافتك. فسيكون مشابهًا لهذا بالنسبة للقوالب:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">&lt;?php
/*
Plugin Name: Pretend Plugin
[Other comment-block information goes here]
Text Domain: wpshout
*/</pre><p>أما للقوالب فسيكون مشابهًا لهذا:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">/*
Theme Name: Pretend Theme
[Other comment-block information goes here]
Text Domain: wpshout
*/</pre><h2>دوال Gettext: أبقِ ()__ و ()e_ و ()x_ و ()n_ صحيحة</h2><p>لجعل النصوص الخاصة بك قابلة للترجمة، تحتاج إلى تمرير دالة سوف تقوم باستبدال "!Let’s go" مع ترجمتها باللغة الإسبانية أو العربية أو الفرنسية أو غيرها، ولتسهيل هذا الأمر، يقوم ووردبريس بإعطاء أسماء قصيرة جدا للدوال التي تقوم بهذه الوظيفة.</p><h3>الدالة ()__</h3><p>أعتقد أن هذه الدالة هي الدالة الأهم، فلقد حصلت على أكثر اسم مبهم وغريب. لكن هدفها الرئيسي هو السماح لجميع السلاسل النصية بأن تترجم إلى لغة أخرى إذا كان يجب ذلك. وتُستخدم هذه الدالة مع معاملين الأول للسلسلة النصية والثاني لمجال النص، على سبيل المثال:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">echo __(
    'WPShout is a great WordPress site!',
    'wpshout'
);</pre><h3>الطباعة الذاتية بواسطة () e_</h3><p>الدالة الأولى ستقوم بإرجاع نص فقط ويجب عليك طباعة (عرض) النص بنفسك، فإذا كان هذا يزعجك فيمكنك استخدام <span style="font-family:courier new,courier,monospace;">()e_</span> فهي مثل <span style="font-family:courier new,courier,monospace;">()__ echo</span> . ستقوم هذه الدالة باختصار كتابة بعض الأحرف، لكنها لن تقوم بأي شيئ آخر، وهذا مثال تطبيقي على استخدام هذه الدالة:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">_e(
    'WPShout is a great WordPress site!',
    'wpshout'
);</pre><p>والآن سنبدأ بالتعامل مع الجوانب الدقيقة للترجمة.</p><h3>توفير نص للشرح بواسطة ()x_</h3><p>في بعض الأحيان كلمة أو جملة تكون مبهمة وصعبة الترجمة فقد تعني العديد من المعاني، فمثلا كلمة "post" قد تعني اسما مثل "مشاركة" أو "تدوينة" وقد تعني فعلا مثل "نشر" (to post - to publish).<br>على عكس الدالتين السابقتين، يمكنك بواسطة <span style="font-family:courier new,courier,monospace;">()x_</span> وضع نص لشرح الكلمة أو الجملة مثل المثال التالي:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">_x(
   'Post',
   'verb, as in "to publish"',
   'wpshout'
);</pre><p>النص الأوسط لن يظهر للمستخدم، لكنه سيظهر للمترجم حتى يفهم النص. (يذكر أنه توجد دالة <span style="font-family:courier new,courier,monospace;">()ex_</span> و التي تجمع ما بين <span style="font-family:courier new,courier,monospace;">e_</span> و <span style="font-family:courier new,courier,monospace;">x_</span>).</p><h3>الجمع بواسطة ()n_</h3><p>من المشاكل التي قد تواجهها في الترجمة هو الجمع. ففي اللغة الإنجليزية، "I have 1 Comment" (أنا أملك 1 تعليق) أو "I have 3 Comments" (أنا أملك 3 تعليقات)، لأجل معالجة مشكلة جمع كلمة تعليق، ووردبريس يوفر لك دالة <span style="font-family:courier new,courier,monospace;">()n_</span> التي ستقوم بمعالجة الفرق بين الإثنين.<br>في العادة، عندما تستخدم دالة <span style="font-family:courier new,courier,monospace;">()n_</span> سوف تحتاج إلى استدعاء دالة الكتابة <span style="font-family:courier new,courier,monospace;">()printf</span>. (أو <span style="font-family:courier new,courier,monospace;">sprintf</span> التي تقوم بإرجاع سلسلة نصية على عكس <span style="font-family:courier new,courier,monospace;">printf</span> التي تقوم بطباعة النص).<br>وهذه الدوال ستقوم باستبدال قيمة في سلسلة نصية مع قيمة تم تمريرها لهم. لتفهم أكثر أنظر للكود أدناه:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">printf(
    _n(
        'One comment',
        '%s comments',
        $comments,
        'wpshout'
    ),
    $comments
);</pre><p>ستلاحظ أننا استخدمنا قيمة عددية مسندة إلى متغير <span style="font-family:courier new,courier,monospace;">comments$</span> مرتين. نفترض أن <span style="font-family:courier new,courier,monospace;">comments$</span> تمتلك قيمة "3". في المرة الأولى استخدمنا <span style="font-family:courier new,courier,monospace;">comments$</span> مع <span style="font-family:courier new,courier,monospace;">n__</span> لتحديد هل سنستخدم الجمع أو لا، وبما أن 3 أكبر من 1 سوف يختار " s% comments" بدلا من "One comment".<br>أما في المرة الثانية فاستخدمناها مع <span style="font-family:courier new,courier,monospace;">printf</span> لوضع الرقم في السلسلة النصية، عن طريق استبدال s% بـ 3 والتي هي قيمة المتغير <span style="font-family:courier new,courier,monospace;">comments$</span>، لتكون الجملة الكاملة المطبوعة هي "3 comments".</p><h3>دوال Gettext أخرى</h3><p>سوف نقوم بشرح جميع الدوال المهمة والأساسية، وهذا لا يعني أنه لا توجد دوال أخرى جديرة بالاهتمام:</p><ul><li><strong>()__esc_attr:</strong> هذه الدالة تقوم بنفس وظيفة <span style="font-family:courier new,courier,monospace;">()__</span> لكنها سوف تراعي <span style="font-family:courier new,courier,monospace;">()esc_attr</span> (سمة الخروج للـ HTML) لدواعي السلامة. (يوجد أيضا دالة <span style="font-family:courier new,courier,monospace;">()esc_attr_e</span> و دالة <span style="font-family:courier new,courier,monospace;">()esc_attr_x</span>).</li><li><strong>()__esc_html:</strong> نفس الشيء مع هذه الدالة، ففي سبيل السلامة يمكنك الجمع بين سمة الخروج للـ HTML وبين ترجمتك. (و بالطبع توجد دالة <span style="font-family:courier new,courier,monospace;">()esc_html_e</span> و دالة <span style="font-family:courier new,courier,monospace;">()esc_html_x</span>).</li><li><strong> ()n_noop_ : </strong>هذه الدالة تقوم بنفس وظيفة دالة <span style="font-family:courier new,courier,monospace;">()n_</span> لكن بدون عمليات.</li></ul><h2>تسليم الترجمة إلى جافا سكريبت عن طريق دالة ()wp_localize_script</h2><p>بسبب أن الترجمات في الووردبريس يتم التعامل معها عن طريق PHP، سوف تحتاج إلى تمرير السلاسل النصية لاستخدمها مع الجافا سكريبت، ويمكنك فعل هذا عن طريق دالة <span style="font-family:courier new,courier,monospace;">()wp_localize_script</span>. هذه الدالة مفيدة للغاية وتستخدم كثيرا خارج الترجمة، لأنها تمكنك من تمرير أية قيمة أو متغير من PHP إلى جافا سكريبت. لكن الاستخدام الأساسي لها للترجمة ولذلك سميت باسمها.<br>وهذا هو مثال لطريقة استخدام هذه الدالة:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">wp_localize_script(
    'wpshout-js',
    'strings',
    array(
        'hello' =&gt; __( 'Hello!', 'wpshout' );
    )
);</pre><p>وللوصول إلى هذه القيم عن طريق ووردبريس، فستقوم بشيء مثل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">alert(strings.hello);</pre><p>تمتلك دالة <span style="font-family:courier new,courier,monospace;">()wp_localize_script</span> ثلاثة معاملات:</p><ol><li><strong>المعرّف (handle)</strong> الذي استخدمناه في <span style="font-family:courier new,courier,monospace;">()wp_enqueue_script</span> (أو <span style="font-family:courier new,courier,monospace;">()wp_register_script</span>) للجافا سكريبت التي نقوم بترجمتها.</li><li><strong>اسم كائن جافا سكريبت</strong> الذي نريد أن ترتبط به ترجمتنا.</li><li><strong>مصفوفة (array) </strong>مترابطة للترجمات، مع مؤشر index أو اسم خاص كمفتاح و قيمة كسلسلة نصية ابتدائية لاستخدمها.</li></ol><p>يتم التعامل مع الترجمة نفسها عن طريق نفس دوال PHP التي شرحناها في الجزء السابق من الدرس.</p><h2>ما هي ملفات POT ،PO و MO ؟</h2><p>حتى الأن كنا نتحدث عن البرمجة باستخدام PHP، لكن هنالك جزء ثاني لا يعتمد على الـ PHP، وهذا الجزء هو الذي يقوم بإنشاء ملفات الترجمة.</p><p>يعتبر هذا الجزء صعبا بالنسبة لي، فببطء يقوم نظام ووردبريس ببناء حلول أكثر قوة و أكثر إفادة للتعامل مع العمل الحالي للترجمة (أنظر إلى <a rel="external nofollow" href="http://glotpress.org/">GlotPress</a> ،<a rel="external nofollow" href="https://translate.wordpress.org/languages">translate.wordpress.org</a> و <a rel="external nofollow" href="https://make.wordpress.org/polyglots/">the Polyglot Make blog</a>) لكن يبقى هذا الجزء صعبا للمستخدم ذا الخبرة المتوسطة، على الرغم من أننا سنقوم بشرح أساسياته لكننا لن نخوض في التفاصيل، بالنسبة لي اعتدت على استخدام <a rel="external nofollow" href="http://poedit.net/">Poedit</a> كمحرر للترجمة.</p><p>مهما كانت الطريقة الذي اعتدت بها أن تقوم بإنشاء وتعديل و قراءة ملفات الترجمة، يوجد ثلاثة أنواع أساسية من ملفات الترجمة:</p><ul><li>ملفات <strong>pot.</strong>: الملفات الرئيسية للإضافات والقوالب، والتي قامت بجمع جميع السلاسل النصية من الدوال <span style="font-family:courier new,courier,monospace;">()s__</span> وغيرها.</li><li>ملفات <strong>po.</strong>: هذه الملفات عبارة عن نص ترجمة السلاسل النصية الإنجليزية إلى اللغة المستهدفة، نادرا ما سوف تقوم بتعديل واحدة مباشرة (لأن الصيغة بها الكثير من الكلمات والرموز المبهمة والغريبة) لكن يمكنك فتحها باستخدام محرر نصوص والقيام بتعديلات سريعة للترجمة.</li><li>ملفات <strong>mo.</strong>: الترجمة النهائية من اللغة الإنجليزية إلى اللغة المستهدفة، وهذه الملفات عبارة عن ملفات ثنائية (binary files) تستخدم وتقرأ عن طريق ووردبريس، لذلك عندما تقوم بفتحها مع محرر النصوص لن تستطيع معالجتها، لذا إذا أردت القيام بذلك يجب عليك العودة إلى ملفات PO و التعديل عليها و إعادة إنشاء ملفات MO.</li></ul><p>كما أخبرتك سابقا، هذا هو الجزء الأصعب بالنسبة لي، لكن إذا كان إضافتك أو قالبك في مستودعات WordPress.org، سوف تجد ملفات <span style="font-family:courier new,courier,monospace;">pot.</span> جاهزة بالنسبة لك وسيفهم مترجميك كيف يهتمون بالباقي.<br>إذا أردت المزيد من التفاصيل أو الأدوات، قم بزيارة صفحة <a rel="external nofollow" href="https://codex.wordpress.org/Translating_WordPress">Translating WordPress</a>.</p><h2>ماذا تعلمنا حول تدويل كود ووردبريس</h2><p>لقد قمنا في هذا الدرس بتغطية الأجزاء الثلاثة الرئيسية لجعل كود ووردبريس الخاص بك جاهزا للترجمة: اختر مجال النص، استخدم دوال gettext ومن ثم أحصل على ملف POT لصنع ملفات الترجمة PO و MO. الخطوات سهلة و قابلة للتنفيذ، ولها تأثير كبير للناطقين بغير اللغة الإنجليزية، أو أولئك الذين يحسون براحة أكبر عند استخدامهم لغة أخرى تعلموها مؤخرا.</p><p>ترجمة -وبتصرف- للمقال <a style="line-height: 1.6;" rel="external nofollow" href="http://wpshout.com/making-plugins-and-themes-translation-ready/">Making plugins and themes translation ready</a> لصاحبه: David Hayes.</p>
]]></description><guid isPermaLink="false">148</guid><pubDate>Mon, 24 Aug 2015 21:30:00 +0000</pubDate></item><item><title>&#x623;&#x62E;&#x637;&#x627;&#x621; &#x633;&#x628;&#x628;&#x647;&#x627; &#x627;&#x644;&#x627;&#x639;&#x62A;&#x645;&#x627;&#x62F; &#x627;&#x644;&#x632;&#x627;&#x626;&#x62F; &#x639;&#x644;&#x649; &#x627;&#x644;&#x646;&#x641;&#x633; &#x64A;&#x62C;&#x628; &#x62A;&#x62C;&#x646;&#x628;&#x647;&#x627; &#x641;&#x64A; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%B3%D8%A8%D8%A8%D9%87%D8%A7-%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D8%AF-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%86%D9%81%D8%B3-%D9%8A%D8%AC%D8%A8-%D8%AA%D8%AC%D9%86%D8%A8%D9%87%D8%A7-%D9%81%D9%8A-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r147/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-dyi_(1).png.a90f9546e43ec48a70428545aa39f2f2.png" /></p>

<p>يجذب ووردبريس بسبب قوته، وشهرته، وتوثيقه الكثير من طاقة “افعل ذلك بنفسك”، فبشكل عام هذا يبدو رائع، فهذه شهادة على أن الناس لديها آمال عالية في ووردبريس، وهذه طريقة ممتازة لتعلمه، لكن للأسف، فإن جهود “افعل ذلك بنفسك” غالبا ما تكون خاطئة. كمطور، غالبا ما أجد أن هذه جهود الفردية تسقط بالكامل، أو أجد نفسي أفسد الموقع عندما يكون تقريبا يعمل جيدا لكن يبدوا غريبا و هنالك بعض الميزات الرئيسية تنقصه. </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-dyi_(1).png.617ed80143060a9ec556e0d6c7b89e53.png"><img data-fileid="3953" class="ipsImage ipsImage_thumbnailed" alt="wordpress-dyi_(1).thumb.png.9f33c4bab27a" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-dyi_(1).thumb.png.9f33c4bab27a6a38e14f8404cad81bbe.png"></a></p><p>سوف نتحدث هنا عن أولى و أسوء الأخطاء التي قد يرتكبها شخص جديد إلى عالم ووردبريس، لقد رأينا هذه الأخطاء مرات عديدة، ولقد ارتكبنا بعضها سابقا.</p><h2 id="1-محاولة-بناء-موقعك-من-الثيم-الافتراضي">1- محاولة بناء موقعك من الثيم الافتراضي</h2><div id="wmd-preview-section-50"><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/default-theme.png.6f334fb022f34f3947356d60b656d4c1.png"><img data-fileid="3939" class="ipsImage ipsImage_thumbnailed" alt="default-theme.thumb.png.61f0529f9dc73264" src="https://academy.hsoub.com/uploads/monthly_2015_08/default-theme.thumb.png.61f0529f9dc73264da9d24200391640d.png"></a></p><p>إذا كنت جديدا في ووردبريس، فإنه من السهل بناء موقعك عن طريق: </p><ol><li>تثبيت الووردبريس. </li><li>تخصيص الووردبريس ليظهر كما تريد.</li></ol><p>ربما ستكون لديك معرفة بقوالب ووردبريس، لكن سوف تقوم إما بوضع إحدى القوالب الافتراضية المجانية أو انك ستقوم باستخدام قالب بوتستراب (bootstrap) الذي يقوم بتجريد شكل ووردبريس إلى أساسياته، وسرعان ما ستجد نفسك تقوم بتعديلات على ملفات المصدرية للثيم، فتقوم بحذف أجزاء و إضافة أجزاء أخرى.</p><p><strong>سبب المشكلة</strong>: إن المواقع المبنية على قوالب غير ملائمة تكون في العادة قبيحة جدا، و وضعها في موقعك سيجعله سيئا، لأنك ستقوم بتجاهل العديد من أبرز المميزات المفيدة للووردبريس. <br>ربما تحتاج إلى معرفة: قوة ومرونة ثيمات الووردبريس، خاصة المدفوعة منها، وإن إيجاد ثيم مدفوع قريب من احتياجاتك وتخصيصاتك هو الخيار الصحيح. قم بالبحث عن بعض قوائم الثيمات، ستجد أنه يوجد الآلاف منها، لذلك اجعل بحثك أكثر تحديدا، فمثلا قم بالبحث عن “ثيمات مجلات مسطحة للوردبريس” إذا كنت تبحث عن تصميم مسطح وأنت تقوم بتشغيل موقع مجلة، أو قم بالبحث عن موقع تحبه يعمل على الووردبريس واعرف أي ثيم يستخدم. <br>لا تستخدم قالب “Twenty Fourteen” أو أول ثيم يبدوا جميل وتبدأ ببناء موقعك.</p></div><div id="wmd-preview-section-51"><h2 id="2-إفساد-ملفات-الثيمات-أو-تكديسها-بوسوم-html">2- إفساد ملفات القوالب أو تكديسها بوسوم HTML</h2><div id="wmd-preview-section-51"><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/header-menu.png.48b0ec2004c75780f30f08eb4bd6f3f9.png"><img data-fileid="3940" class="ipsImage ipsImage_thumbnailed" alt="header-menu.thumb.png.4864377529ae72745d" src="https://academy.hsoub.com/uploads/monthly_2015_08/header-menu.thumb.png.4864377529ae72745d2e59a52eb35278.png"></a></p><p>في أغلب الأوقات يحدث هذا بسبب الإحباط، عندما لا تعرف كيف تقوم بجعل السلايدر يعمل على صفحتك الرئيسية في الوقت الذي يعمل فيه على صفحة HTML الثابتة. فلماذا لا تقوم بقطع جزء من القالب الذي يتعامل مع السلايدر ولصق السلايدر من موقع HTML (مع جافاسكربت) مباشرة في ملف <span style="font-family:courier new,courier,monospace;">home.php</span>؟ </p><p><strong>سبب المشكلة</strong>: هذا الأمر يجعل ووردبريس ثابت بدل من ديناميكي، وهذه علامة على أنك لا تعرف ما الذي تقوم بفعله، وهذا معناه في الغالب أنه سيكون هنالك مشاكل قريبا، لأنك ستقوم بإفساد وتغيير شِفرة ووردبريس وستزيد من صعوبة العمل عليها لاحقا.</p><p>ربما تحتاج إلى معرفة: دوال ووردبريس، التي هي الطريقة الصحيحة (والديناميكية) للقيام بأغلب الأشياء التي تريد القيام بها بنفسك، فعلى سبيل المثال، يمكنك التعامل مع السلايدر على أنه شِفرة قصيرة (shortcode) عن طريق دالة <span style="font-family:courier new,courier,monospace;">()do_shortcode</span>. وإن وضع السلايدر بالطريقة الصحيحة يسمح لك بتعديل محتويات السلايدر من داخل منطقة إدارة ووردبريس في موقعك.</p></div><div id="wmd-preview-section-52"><h2 id="3-إعادة-بناء-الوظائف-يدويا-بدل-التعامل-معها-عن-طريق-الإضافات">3- إعادة بناء الوظائف يدويا بدل التعامل معها عن طريق الإضافات</h2><div id="wmd-preview-section-52"><p>خاصة عندما تكون جديدا في ووردبريس، فإنه من السهل القيام بأشياء اليدوية عن طريق الإضافات، والمثال الكلاسيكي على ذلك هو القيام بلصق شِفرة التتبع الخاصة بـجوجل أناليتكس (Google Analytics) مباشرة في ملف <span style="font-family:courier new,courier,monospace;">header.php</span> بدل إستخدام <a rel="external nofollow" href="http://wordpress.org/plugins/google-analyticator/">Google Analyticator</a> أو أية إضافة مماثلة، وإن القيام بهذه الطريقة يعني أن جوجل أناليتكس لن تتكامل مع موقعك في الوقت الذي يجعل فيه Analyticator الأمر أسهل بالإضافة إلى أن إلصاق شِفرة جوجل أناليتكس إلى الشِفرة المصدرية للقالب لديه سلبياته التي ذكرناها في النقطة الثانية. </p><p>ومثال آخر على ذلك هو تعديل الأعمدة يدويا داخل التدوينة عن طريق أنماط مضمنة، مثلا (“width: 50%”) بدل استخدام <a rel="external nofollow" href="http://wordpress.org/plugins/column-shortcodes/">Column Shortcodes</a> أو أية إضافة مشابهة.</p><p><strong>سبب المشكلة</strong>: إعادة اختراع العجلة يستغرق وقتا طويلا و يقود في الغالب إلى نتائج أسوء. </p><p>ربما تحتاج إلى معرفة: غريزة البحث عن إضافة قبل أي شيئ آخر، فووردبريس يمتلك الآلاف من الإضافات المجانية، وإذا أردت القيام بشيء يحتاجه أشخاص آخرون (مثل مجموعة جميلة من تصاميم الأزرار المسطحة) قُم بالبحث عنه ولا تستسلم حتى تجده.</p><p><strong>ملاحظة</strong>: هذا لا يعني أنه يجب عليك أن تعتمد على الإضافات في كل شيئ بدل من كتابة سكربتات بسيطة (مثل الفلترات) إذا كنت تعرف كيف تكتبها، هذه النصيحة تستهدف القادمين الجدد لتجنب على سبيل المثال صنع حلول للتجارة الإلكترونية بنفسهم بدلا من إستخدام <a rel="external nofollow" href="http://www.woothemes.com/woocommerce/">WooCommerce</a>.</p></div><div id="wmd-preview-section-53"><h2 id="4-اقتصار-الووردبريس-على-جزء-المدونة-من-الموقع">4- اقتصار ووردبريس على جزء المدونة من الموقع</h2><p>يحدث هذا عندما تبقي موقعك القديم يعمل وتقوم ببناء ووردبريس في “<span style="font-family:courier new,courier,monospace;">blog/</span>” ثم تقوم بنسخ جميع ملفات CSS من الموقع الرئيسي و تضعهم (على الأرجح) في قائمة التصفح الرئيسية لموقعك ككود HTML في ملف <span style="font-family:courier new,courier,monospace;">header.php</span> (تقوم بتكرار خطأ رقم 2 مرة أخرى).</p><p><strong>سبب المشكلة</strong>: إن تكرار تصميم موقعك الرئيسي على ووردبريس هو مضيعة للوقت، فأنت الآن تحافظ على نسختين من ملفات CSS ومن قائمة التصفح الرئيسية وغيرها. وستجد أن العشرات من مميزات الووردبريس لا تعمل سوى على الجزء المدونة في الموقع. </p><p><strong>ربما تحتاج إلى معرفة:</strong> ووردبريس هو نظام إدارة المحتوى، وليس منصة مدونات فالعديد من المواقع التي تضع ووردبريس كمدونة يجب أن تعمل بالكامل على ووردبريس، باستثناء تطبيقات الويب المعقدة، لكن إذا كنت، على سبيل المثال، تقوم بنقل مدونة الشركة إلى ووردبريس، فقُم بنقل بقية الموقع كذلك، وهكذا ستقوم بإدارة نسخة واحدة من كل شيئ وستحصل على مميزات ووردبريس على كامل الموقع.</p></div><div id="wmd-preview-section-54"><h2 id="في-الختام">في الختام …</h2><p>بشكل عام، كل هذه الأخطاء سببها عدم معرفة ماذا يمكن للووردبريس أن يفعله، فهذا الأمر يشبه استئجار طائرة للطيران عبر البلاد، لذلك إذا بدأت بالشعور أن المشروع الذي تقوم به بنفسك بدأ يفشل وبدأت الأخطاء والمشاكل بالظهور، فهذه علامة على ضرورة التريث واتخاذ خطوة للوراء، والبدء بتعلم المزيد عن ووردبريس قبل بدأ العمل بها. </p><p>إذا كنت شخص من نوع يريد أن يفعل كل شيئ بنفسه، فنرجو أن تساعدك هذه النصائح، وإذا كنت تعرف شخص من هذا النوع، فنرجو منك إخباره بهذه النصائح، فهذه النصائح يمكن أن تحدث فرقا بين تجربة أولية جيدة مع ووردبريس وبين إحباط كامل، وكالعادة نريد أن نسمع تعليقاتكم.</p><p>ترجمة -وبتصرف- للمقال: <a rel="external nofollow" href="http://wpshout.com/classic-diy-wordpress-mistakes/">Classic Do-It-Yourself WordPress Mistakes To Avoid</a> لصاحبه Fred Meyer.</p><p>حقوق الصورة البارزة: <a href="http://www.freepik.com/free-vector/mechanic-with-multitasking_766632.htm" rel="external nofollow">Designed by Freepik</a>.</p></div></div></div>
]]></description><guid isPermaLink="false">147</guid><pubDate>Sat, 22 Aug 2015 09:01:00 +0000</pubDate></item><item><title>&#x645;&#x641;&#x62A;&#x627;&#x62D;&#x627;&#x646; &#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x646; &#x644;&#x641;&#x647;&#x645; &#x62F;&#x648;&#x627;&#x644; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D9%85%D9%81%D8%AA%D8%A7%D8%AD%D8%A7%D9%86-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D9%86-%D9%84%D9%81%D9%87%D9%85-%D8%AF%D9%88%D8%A7%D9%84-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r146/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/2-key-wordpress-dev.jpg.82a8ea43c1858f98a90cdd24a772fa46.jpg" /></p>

<div id="wmd-preview-section-11"><p>واحدة من أبرز قوى ووردبريس مكتباته التي تحتوي على المئات من دوال PHP، وهذه الدوال لديها وظائف متعددة من كتابة روابط التدوينات والمشاركات داخل الإضافة إلى استرجاع اسم مستخدم كاتب التدوينة والاستعلام عنه في قاعدة البيانات. فإذا لم تفهمهم، ستكون العناصر الأساسية للووردبريس مثل <span style="font-family:courier new,courier,monospace;">the_post</span> غريبة بالنسبة لك، وسيكون الكود التي تكتبه مليئا بالأخطاء والغرابة. </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/2-key-wordpress-dev.jpg.fcffcc3fc19ae3b27909e7215566cb96.jpg"><img data-fileid="3938" class="ipsImage ipsImage_thumbnailed" alt="2-key-wordpress-dev.thumb.jpg.82ac013d45" src="https://academy.hsoub.com/uploads/monthly_2015_08/2-key-wordpress-dev.thumb.jpg.82ac013d45b6029affcc5ba4ccfc3e7d.jpg"></a><br>وفي نفس الوقت، عند محاولة استعمال المئات من الدوال ذات أسماء غير نظامية يمكن أن يسبب الإرباك لقارئها، لذا سأقوم اليوم بإعطائك مبدأين أساسيين لفهم دوال ووردبريس. هذه المبادئ المنطقية تطبق بشكل واسع (إذا لم يكن عالميا) على مكتبات الدوال، والتي سوف تعطيك نظرة خاطفة على وظيفة دالة ووردبريس معينة.</p></div><div id="wmd-preview-section-12"><h2 id="1-دوال-get-تقوم-بإرجاع-أشياء-و-دوال-the-تطبع-أشياء">1. دوال _get تقوم بإرجاع أشياء و دوال _the تطبع أشياء</h2><p>هذا ملخص بسيط لآلية عمل هذين الدالتين:</p><ol><li>دوال<span style="font-family:courier new,courier,monospace;"> _get</span> تقوم بإرجاع قيمة، مما يسمح لك بالتعامل معها في تعليمات برمجية لاحقة. </li><li>دوال <span style="font-family:courier new,courier,monospace;">_the</span> تقوم بطباعة قيمة في صفحة HTML في المكان الذي تم استدعاؤها فيها.</li></ol><p>ولتوضيح ذلك، لنلق نظرة على الكود المصدري لدالتين، دالة <span style="font-family:courier new,courier,monospace;">()the_ID</span> و دالة <span style="font-family:courier new,courier,monospace;">()get_the_ID</span>:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">function get_the_ID() { 
  post = getpost();
  return !empty(post ) ? $post-&gt;ID : false; 
} 

function the_ID() { 
  echo get_the_ID(); 
}</pre><p>باختصار، إن دالة <span style="font-family:courier new,courier,monospace;">()get_the_ID</span> تقوم بإرجاع مُعرف الرقمي للتدوينة، وأما <span style="font-family:courier new,courier,monospace;">return</span> فهي تعني: قُم بإعطاء القيمة لمن طلبها”، وعندما تحصل على هذه القيمة، يمكنك القيام بأي شيئ بها، مثلا تقوم بضربها في 3، قسمتها على 2، وغيرها حسب البرنامج، (بالمناسبة إذا كنت تتساءل على بقية الشِفرة البرمجية فإن معناها قُم بإرجاع المُعرف، أو قُم بإرجاع <span style="font-family:courier new,courier,monospace;">false</span> إذا لم تجد التدوينة التي يجب أن تحصل على مُعرفها).</p><p>لنفترض أنك ترد تعديل صفحة <span style="font-family:courier new,courier,monospace;">php</span>، لنأخذ ملف <span style="font-family:courier new,courier,monospace;">index.php</span> للقالب على سبيل المثال، وتريد أن تقوم بطباعة عنوان التدوينة في الصفحة، هذه بعض الخيارات لتفعل ذلك:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">&lt;h1&gt;&lt;?php get_the_title(); ?&gt;&lt;/h1&gt; &lt;!-- لن يتم طباعة أي شيئ --&gt;
&lt;h1&gt;&lt;?php the_title(); ?&gt;&lt;/h1&gt; &lt;!-- طباعة عنوان التدوينة داخل عنصر h1 --&gt;
&lt;h1&gt;&lt;?php echo get_the_title(); ?&gt;&lt;/h1&gt; &lt;!-- طباعة عنوان التدوينة داخل عنصر h1 --&gt;
&lt;h1&gt;&lt;?php echo 'My title: ' . get_the_title(); ?&gt;&lt;/h1&gt; &lt;!-- طباعة ": My title" وعنوان التدوينة داخل عنصر h1 --&gt;</pre><p>سيكون مفيدا أن تعرف هذه العلاقة التي تُعقد عبر مكتبة دالة ووردبريس مع استثناء أن <span style="font-family:courier new,courier,monospace;">()the_post</span> تقوم بشيء مهم لكنها لا تطبع أي شيئ.</p></div><div id="wmd-preview-section-13"><h2 id="2-داخل-أو-خارج-الحلقة-التكرارية">2. داخل أو خارج الحلقة التكرارية</h2><p>الحلقة التكرارية هي النواة التقنية الأساسية لووردبريس، بعض الدوال يجب أن يتم استدعاؤها داخل الحلقة التكرارية، وبعضها لا يجب ذلك، فمثلا هذا المثال يوضح لك ما معناه "دالة داخل الحلقة":</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">//خارج الحلقة التكرارية 
if ( have_posts() ) : 
  while ( have_posts() ) : 
    the_post(); 
    // داخل الحلقة التكرارية، محتويات التدوينة تكون هنا 
  endwhile; 
endif; 
// خارج الحلقة التكرارية مرة أخرى</pre><p>للتمييز بين “دالة داخل الحلقة” و “دالة خارج الحلقة”، سنقوم باستخدام التشبيه لتفسير مكان الحلقة داخل الووردبريس:</p><p><strong>لنتخذ ووردبريس كمصنع سيارات!</strong></p><ul><li>ووردبريس هو مصنع السيارات. </li><li>المشاركات والتدوينات هي السيارات. </li><li>الحلقة التكرارية هي خط التجميع في المصنع.</li></ul><p>دعونا نشرح العلاقة بين هذه المصطلحات بمزيد من التفاصيل: </p><ul><li>خط التجميع تدخل داخله أجزاء السيارات خامة لتخرج سيارة كاملة. </li><li>بنفس الطريقة، الحلقات التكرارية هي مواد المشاركات الخامة (محتوى المشاركة والبيانات التعريفية) تدخل لتخرج صفحة HTML جاهزة.</li></ul><p>والآن دعونا نشرح الجزء المهم: </p><p>كل عملية تقوم بتغيير أو تقوم باسترداد معلومات حول السيارات يجب أن تكون في خط التجميع، ويجب أن يتم الإعلان عن أية سيارة ستعمل بطريقة أخرى، فالعمليات التي لا تعمل على السيارات يجب أن لا تكون في خط التجميع. </p><p>وبالمثل، كل دالة تقوم باسترداد أو تغيير أو عرض لخصائص التدوينة أو المشاركة يجب أن تكون إما داخل الحلقة التكرارية أو يجب أن يتم إعطاء معرف التدوينة أو المشاركة للتعامل معها كمعامل (paramter) للدالة. الدوال التي لن تعمل عن التدوينات/المشاركات لا يجب أن تكون داخل الحلقة التكرارية. </p><p>عمليا هذا يعني: </p><ol><li>إن دوال _the وأغلب دوال _get_the تفترض معرفة التدوينة/المشاركة الحالية لذا سيعملون فقط داخل الحلقة التكرارية. </li><li>أما في خارج الحلقة التكرارية، يجب إخبار دوال _get_the على أية تدوينة ستعمل، أي يجب تمرير معرفة التدوينة. </li><li>الدوال التي لا تستخدم لاسترداد أو تغيير أو عرض لخصائص التدوينة/المشاركة يجب أن لا يتم استدعاؤها في الحلقة التكرارية.</li></ol><p><strong>على خط التجميع</strong>: دالة _the_title التي تعمل فقط في الحلقات التكرارية.</p><p>بالنسبة لآلة الطلاء فإنه يجب على الآلة أن تعرف الكثير من المعلومات حول السيارات قبل البدء بطلائه، ولهذا السبب ستجد هذه الآلة في خط التجميع تحصل على معلومات السيارة الحالية بهذه الطريقة و سوف تكون في المكان الصحيح لطلاء السيارة في الوقت المناسب في المصنع. </p><p>آلة الطلاء في هذه الحالة هي دالة _the_title، فهي تعمل فقط داخل الحلقة التكرارية، وهي تقوم بطلاء الموقع الذي صممه المصنع لعمل عنوان التدوينة الحالية. </p><p>لتكون قادرا على الإشارة إلى عنوان تدوينة في موقع ربما يمتلك أكثر من 1000 تدوينة ومشاركة يجب أن نعلم أية تدوينة نريدها بالضبط، والدالة التي تقوم ببساطة بطباعة عنوان التدوينة (بدون خيارات أخرى) لن تؤثر كثيرا خارج سياق الصفحة التي صممت من تلك التدوينة. </p><p>لذلك فالطريقة الوحيدة لتعمل دالة <span style="font-family:courier new,courier,monospace;">()the_title</span> هو وضعها داخل الحلقة التكرارية، مثل الآلة الطلاء التي لا يجب أن تكون في بهو المصنع.</p><p><strong>داخل أو خارج خط التجميع:</strong> <span style="font-family:courier new,courier,monospace;">()get_the_title</span>، دالة داخل أو خارج الحلقة التكرارية.</p><p>دعونا نفترض أنك تريد معرفة لون طلاء لسيارة، وهذا الأمر سيكون ذا أهمية داخل خط التجميع، وفي هذه الحالة سوف تقوم ببناء آلة تقوم بإعطائك لون السيارة التي تمر من أمامها. لكن قد ترغب أيضا بإرسال فريق مراقبة الجودة إلى منطقة الشحن للحصول على لون سيارة معينة، لذلك سوف يحتاج الفريق إلى معرفة أية سيارة سيقومون بتفقدها، وإلا لن يستطيعوا إخبارك بأي شيئ. </p><p>بكلمات أخرى، يمكنك فعل هذا داخل أو خارج خط التجميع، لكن إذا كنت في الخارج، يجب عليك أن تقوم بخطوة إضافية لتحديد أية سيارة أنت مهتم بها. </p><p>فمثلا دالة <span style="font-family:courier new,courier,monospace;">()get_the_title</span> التي تعمل داخل الحلقة التكرارية بدون إدخال معطيات، أو خارج الحلقة مع إدخال مُعرف التدوينة، كما يلي:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">get_the_title(); // يتم استدعاؤها داخل الحلقة التكرارية، تقوم بإعطائك عنوان التدوينة الحالية. 
// استدعاؤها خارج الحلقة لن يفيد. 
get_the_title(‘121’); // داخل أو خارج الحلقة التكرارية، تقوم بإعطائك عنوان التدوينة مع المُعرف 121.</pre><p><strong>خارج خط التجميع:</strong> <span style="font-family:courier new,courier,monospace;">()wp_enqueue_script</span>، دالة خارج الحلقة التكرارية.</p><p>حتى الآن تحدثنا كثيرا حول خط التجميع في المصنع، ومع ذلك، قد يحتوي المصنع أيضا على مستودع ومكتب الاستقبال وقسم الشحن والمكاتب الإدارية وغيرها. ولا أي إدارة من هذه الإدارات تحتاج إلى معرفة أية سيارة يتم العمل عليه الآن، وأنت بالتأكيد لا تريد وضع المكاتب الإدارية مع خط التجميع. </p><p>وهذا هو نفس الحال مع دالة <span style="font-family:courier new,courier,monospace;">()wp_enqueue_script</span> التي لا تفيد داخل الحلقة التكرارية، فهذه الدالة تستعمل لمعرفة أن صفحة ما تم صنعها بواسطة مصدر خاص للووردبريس أو لا. </p><p>ملفات جافاسكريبت ليست جزءً من التدوينة تم صنعه بواسطة الحلقة التكرارية، فهو لا يتفاعل مع التدوينات بنفس الطريقة التي لا يتفاعل فيها مكتب الحسابات مع السيارات، فعندما توجد شحنة سيارات جاهزة، سوف يتأكد هذا القسم من أن الشحنة لديها فاتورة ملتصقة بها، لكنه بالتأكيد لا يعقل أن يتم إلصاق الفاتورة على أرض المصنع. </p><p>لذلك لا تقم باستخدام دالة ()wp_enqueue_script في الحلقة التكرارية، وسيكون أفضل لو وضعتها في ملف functions.php للقالب أو للإضافة.</p></div><div id="wmd-preview-section-14"><h2 id="قم-بالبرمجة">قم بالبرمجة</h2><p>حسنا حاولت تسهيل هذا الأمر عن طريق استعمال جميع معرفتي عن مصانع السيارات، و من الأرجح أنني قمت بتوسيع منطقة التشبيهات داخل دماغي، لكن أرجو أنني علمتكم بعض المفاتيح الرئيسية التي سوف تمكنك من الدخول إلى عالم دوال ووردبريس وأنت مطمئن، وإذا كان لديك أي سؤال أو تعليق، فيسرنا أن نسمعه في التعليقات في الأسفل، وإذا أعجبك هذا المقال، أرجو أن تقوم بمشاركتها مع أصدقاءك.</p><p>ترجمة -وبتصرف- للمقال: <a rel="external nofollow" href="http://wpshout.com/two-key-principles-understanding-wordpress-functions/">Two Key Principles for Understanding WordPress Functions</a> لصاحبه Fred Meyer.</p><p>حقوق الصورة البارزة: <a rel="external nofollow" href="http://www.freepik.com/free-photos-vectors/business">Business vector designed by Freepik</a>.</p></div>
]]></description><guid isPermaLink="false">146</guid><pubDate>Fri, 21 Aug 2015 10:38:00 +0000</pubDate></item><item><title>&#x623;&#x647;&#x645;&#x64A;&#x629; &#x62A;&#x62D;&#x62F;&#x64A;&#x62B;&#x627;&#x62A; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633; &#x644;&#x632;&#x64A;&#x627;&#x62F;&#x629; &#x627;&#x644;&#x623;&#x645;&#x627;&#x646;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%D8%A7%D8%AA-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%84%D8%B2%D9%8A%D8%A7%D8%AF%D8%A9-%D8%A7%D9%84%D8%A3%D9%85%D8%A7%D9%86-r139/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-2.png.05c78da2958530f1e9f8f4f3f71d703c.png" /></p>

<p>
	سنناقش في هذا الدرس أهمّية تحديث كلّ شيءٍ متعلّق بموقع ووردبريس الخاصّ بك إلى آخر الإصدارات المتوفّرة وأهميّة التحديثات بشكلٍ عام، وهو من أهمّ الأمور التي يمكنك القيام بها لزيادة حماية وأمان موقعك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-2.png.86706febbf57a737c4e526c198dc71fb.png" data-fileid="3521" rel=""><img alt="wordpress-guide-to-security-2.thumb.png." class="ipsImage ipsImage_thumbnailed" data-fileid="3521" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-2.thumb.png.6ea30aed8f7c18cd66ddcf8ef76305b0.png"></a>
</p>

<h2>
	لماذا نقوم بالتحديث؟
</h2>

<p>
	السؤال الحقيقي يجب أن يكون "ولما لا"؟ يقوم مطوروا ووردبريس بإرسال التحديثات إلى المستخدمين لسببٍ معيّن في النهاية، حيث أنّ هذه التحديثات تحتوي على إصلاحاتٍ لثغراتٍ خطيرة يمكن أن يستغلها المهاجمون لمهاجمة موقعك، مما يجعل التحديث ضرورة لا مفرّ منها.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			تحديثات سكربت ووردبريس مهمّة بنفس أهمّية تحديثات أنظمة التشغيل والتطبيقات الأخرى، يتم دومًا اكتشاف ثغراتٍ جديدة في البرمجيات كلّ فترة، ويتم مع ذلك إرسال ترقيعاتٍ جديدة لترقيع هذه الثغرات كلّ فترة إلى أجهزة المستخدمين، مما يجعل التطبيق أكثر أمنًا" - Ken Westin الخبير الأمن في Tripwire, Inc.
		</p>
	</div>
</blockquote>

<h2>
	أنواع التحديثات
</h2>

<p>
	قبل أن نتابع، من المهمّ أن نفهم أنواع التحديثات المختلفة المتوفّرة في سكربت ووردبريس. يشير Tony Perez في <a href="http://tonyonsecurity.com/2014/08/17/importance-of-updates-in-website-security/" rel="external nofollow">تدوينة حديثة</a> إلى أنّه هناك 3 أنواع مختلفة من التحديثات: تحديثات الأمان، الترقيعات والإصدارات الرئيسية.
</p>

<p>
	تحديثات الأمان هي بالضبط كما تبدو عليه من اسمها. يتم إصدارها بسرعة وتحتوي فقط على بضع إصلاحاتٍ لثغراتٍ موجودة تم اكتشافها مؤخرًا. تكون هذه التحديثات عادةً على شاكلة أرقام الإصدارات مثل 4.2.1.
</p>

<p>
	تحديثات الترقيعات أكبر قليلًا، لا تحتوي هي الأخرى على مميزاتٍ جديدة، ولكنّها تقوم بتحديث النظام وعادةً ما تتضمن تحديثاتٍ أمنية كذلك، كما أنّه يتم إصدارها بصفة دورية ومن الممكن توقّع وقت صدور الترقيع الجديد.
</p>

<p>
	وأمّا عن التحديثات الرئيسية من الانتقال من الإصدار 3.9 إلى الإصدار 4.0 فهذا تحديثٌ جوهري، يحتوي مميزاتٍ جديدة وإصلاحاتٍ للمشاكل الأمنية المعروفة بالإضافة لأمورٍ أخرى، كما أنّه يتم التدوين عنها في <a href="http://make.wordpress.org/core/" rel="external nofollow">مدونة ووردبريس</a> وفي العديد من المواقع الإخبارية الأخرى، حيث أنّها تحديثات كبيرة ويجب على الجميع معرفتها. قد تقوم هذه التحديثات أحيانًا بتحطيم شكل موقعك بسبب عدم توافقية مع القالب الذي تستخدمه مثلًا، ولكن مع وجود نسخة احتياطية من موقعك، فيجب ألّا تكون مشكلةً بالنسبة لك.
</p>

<h2>
	الفشل بالتحديث يعني مشكلة أعظم
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/002.jpg.67b8ccb9fab46da84bac7b2bf1ac4ae0.jpg" data-fileid="3520" rel=""><img alt="002.thumb.jpg.cc3f123f965923f7e5d67fb5a8" class="ipsImage ipsImage_thumbnailed" data-fileid="3520" src="https://academy.hsoub.com/uploads/monthly_2015_08/002.thumb.jpg.cc3f123f965923f7e5d67fb5a868ffdd.jpg"></a>
</p>

<p>
	كما ذكرنا سابقًا، عدم قيامك / فشلك بتحديث أيّ إضافات أو قوالب ووردبريس مثبّتة على موقعك قد يعرّضك لخطرٍ كبير، وما قد لا تفهمه هو "لماذا"؟
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			بمجرّد أن يتوفّر ترقيعٌ معيّن كتحديث، يتزايد الخطر على المستخدمين الذين لم يقوموا بالتحديث بصورةٍ كبيرة، لأنّ المخترقين سيكونون قادرين على قراءة الشفرة المصدرية للترقيع ومعرفة الثغرة الحقيقية وبالتالي يمكنهم استغلالها ضدّ مواقع ووردبريس التي لم تقم بالتحديث والترقيع. هناك فترة زمنية قصيرة ما بين توفّر الترقيع كتحديث لووردبريس وما بين قيام المُخترقين بالبدء باستغلال هذه الثغرة على مواقع ووردبريس التي لم تقم بالترقيع، وهذا هو الوقت الذي يجب على المستخدمين الانتباه إليه، حيث أنّ مجرّد الانتظار إهمالًا يتركك عرضةً لهجماتٍ أكثر - Ken Westin.
		</p>
	</div>
</blockquote>

<p>
	يمكن قول نفس الأمر بخصوص القوالب والإضافات، صحيحٌ أنّها ليست جزءً من لبّ نواة ووردبريس، ولكنّها أيضًا قد تحتوي على ثغرات تمكّن المخترقين من استغلالها لاختراق موقعك، وأيضًا يتم اكتشاف هذه الثغرات كلّ فترة وتصدر تحديثات لترقيعها كلّ فترة، وعليك تثبيتها بمجرّد توفّرها. بعض السمات والقوالب تكون مبرمجة بصورة سيئة ويكون بها العديد من الثغرات ويجب عليك الانتباه إلى ذلك، كما يجب عليك تثبيت واستخدام القوالب والإضافات التي تستعملها فقط وحذف كلّ شيء لا تستعمله.
</p>

<h2>
	إدارة تحديثات ووردبريس
</h2>

<p>
	أفضل طريقة للتأكّد من أنّ كلّ شيء على موقعك محدّث هو جعل عملية التحقق من وجود تحديثات متوفّرة هي مهمّة روتينية أخرى على جدولك (لو لم تكن تقنيًا، فيجب عليك البحث عن استضافة تقوم تلقائيًا بتحديث جميع القوالب والإضافات والنواة الخاصّة بووردبريس)، يجب عليك التحقق من توفّر التحديثات بنفسك كلّ يوم لتجنّب أي مشاكل أمنية قد تحصل.
</p>

<p>
	منذ الإصدار 3.7 من ووردبريس فإنّ المنصة تسمح بالتحديث التلقائي بسهولة، بمجرّد تفعيل هذا الخيار، فإنّه هذا يعني أنّ نواة موقعك ستقوم بالتحديث تلقائيًا عند توفّر تحديثات جديدة بدون أيّ تدخّل منك. طبعًا لا يمكن فعل نفس الشيء بالنسبة للقوالب والإضافات، حيث يجب عليك القيام بتحديثها يدويًا.
</p>

<h2>
	الخاتمة
</h2>

<p>
	تحديثات ووردبريس مهمّة للغاية، بل ومهمّة جدًا، ومن واجبك الاهتمام بتحديث كلّ شيءٍ موجود على موقعك إلى الإصدارات الأخيرة المتوفّرة، وإلّا فإنك تترك بابك مفتوحًا للمخترقين ليخترقوك، إنّها مسألة وقت.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://managewp.com/wordpress-developers-security-updates" rel="external nofollow">The WordPress Developer’s Guide to Security: Updates</a> لصاحبه: Brenda Barron.
</p>
]]></description><guid isPermaLink="false">139</guid><pubDate>Thu, 20 Aug 2015 07:05:00 +0000</pubDate></item><item><title>&#x62E;&#x645;&#x633; &#x637;&#x631;&#x642; &#x644;&#x625;&#x646;&#x634;&#x627;&#x621; &#x627;&#x633;&#x62A;&#x639;&#x644;&#x627;&#x645;&#x627;&#x62A; &#x645;&#x62E;&#x635;&#x635;&#x629; &#x641;&#x64A; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%AE%D9%85%D8%B3-%D8%B7%D8%B1%D9%82-%D9%84%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%81%D9%8A-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r144/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-custom-queries.png.a412208decd1caa9b293fd65721082b3.png" /></p>

<p>
	يُنفّذ ووردبريس استعلامًا في كل صفحة من صفحات الموقع، ليجلب البيانات من قواعد بيانات (databases) الموقع ومن ثُمّ يعرضها بالطريقة الّتي يحدّدها القالب (theme) المُستخدَم وذلك باستخدام حلقة التكرار (loop)، ويُشار إلى هذا الاستعلام بالاستعلام الرئيسي <strong>main query</strong>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="3923" href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-custom-queries.png.f3e2b2cd70096de9146b3bb932dbe73a.png" rel="external"><img alt="wordpress-custom-queries.png" class="ipsImage ipsImage_thumbnailed" data-fileid="3923" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-custom-queries.thumb.png.9db959925834899dd8208e3133010117.png"></a>
</p>

<p>
	سيَستخدم ووردبريس ملفّ القالب (template) المُلائم وذلك اعتمادًا على نوع الصّفحة الّتي يتمّ عرضها، بمعنى أنّ حلقة (loop) قد تتغيّر بناءً على المُحتوى، ولكنّه سيُنفّذ استعلامًا دائمًا لجلب البيانات من قاعدة البيانات.
</p>

<p>
	يُرغب أحيانًا في تغيير طريقة عمل الاستعلام، فعلى سبيل المثال في الصّفحة الرئيسيّة للمدوّنة قد يُرغب في استثناء منشورات من فئة (category) مُعيّنة، أو قد يُرغب في عرض قائمة بالمنشورات على حسب الصنف بدلًا من الترتيب على حسب التاريخ في صفحة الأرشيف (archive page)، كما من المُحتمل جدًا أنّ يُرغب في إضافة استعلامات إضافيّة إلى صفحات (pages) الموقع، أو إضافة قائمة بالمنشورات الأخيرة (recent posts) أو المنشورات ذات الصِلة بمنشورات أخرى، أو قد يُرغب في إنشاء ملفّ قالب (template) يستبدل الاستعلام الرئيسي (main query) باستعلام مُخصّص وجديد كليًّا.
</p>

<p>
	يجعل سكريبت إدارة المُحتوى ووردبريس من هذه التخصيصات أمرًا ميسّرًا للغاية، وذلك بطرقٍ عدّة، وذلك إما بالتعديل على الاستعلام الرئيسي أو بإنشاء استعلام جديد.
</p>

<p>
	سيتطرّق هذا الدليل إلى الأمور التّالية:
</p>

<ul>
<li>
		متى يُستخدم الاستعلام المُخصّص، ومتى يُخصّص الاستعلام الرئيسي ومتى يتمّ إنشاء استعلام جديد.
	</li>
	<li>
		الطرق الخمس لإنشاء استعلامات مُخصّصة، بما في ذلك الطريقة الّتي لا يجب أنّ تُستخدم ولماذا.
	</li>
</ul>
<h2>
	فهم الأساسيات
</h2>

<p>
	يجب الإلمام ببعض المصطلحات قبل الدخول في التفاصيل وهي ضروريّة لمن لم يُنشئ استعلامات مُخصّصة من قَبل.
</p>

<ul>
<li>
		<strong>الاستعلام</strong> (query) وهو طريقة يَستعين بها ووردبريس لجب البيانات من قاعدة بيانات الموقع، وتتضمّن هذه البيانات المنشورات posts، المرفقات attachments، التعليقات comments، والصّفحات pages، أو أي مُحتوى تمّت إضافته إلى الموقع.
	</li>
	<li>
		<strong>الحلقة</strong> (loop) وهي شيفرة/كود يستخدمها القالب (theme) (أو أحيانًا الإضافة plugin) لتحديد كيفيّة عرض نتائج الاستعلام على الصّفحة، فعلى سبيل المثال قد تُضمِّن الحلقة في الصّفحة الرئيسيّة عنوان كل صفحة (title)، مُلخص كل تدوينة (extract)، ربّما صورة مُميّزة/بارزة، ورابط صفحة المنشور (والّذي يُدعى permalink أو الرابط الثابت).
	</li>
	<li>
		<strong>ملفّات القالب</strong> (template files): وتُستخدم من قِبل القالب (theme) لعرض الصفحات لكل نوع من أنواع المُحتوى، مع العلم أنّ كل قالب (theme) يملك ملفّات قالب (template) تختلف عن الآخر، ولكن يجب على القالب (theme) أنّ يتضمّن ملفّ <span style="font-family:courier new,courier,monospace;">index.php</span> رئيسي، وغالبًا على الملفّ <span style="font-family:courier new,courier,monospace;">page.php</span> للصفحات الثابتة static pages، والملفّ <span style="font-family:courier new,courier,monospace;">single.php</span> للمنشورات المُنفردة single posts، والملفّ <span style="font-family:courier new,courier,monospace;">archive.php</span> لصفحات الأرشيف، وربّما الملفّ <span style="font-family:courier new,courier,monospace;">category.php </span>للتصنيفات، والملفّ <span style="font-family:courier new,courier,monospace;">tag.php </span>للوسوم، وغيره من الملفّات وللمزيد من التفاصيل يُمكن العودة إلى الصّفحة التّالية في <a href="http://codex.wordpress.org/Template_Hierarchy" rel="external nofollow">التوثيق الرسمي</a>.
	</li>
	<li>
		<strong>الوسوم/الدّوال الشرطيّة</strong>: والّتي من المُمكن أنّ تُستخدم في ملفّات القالب (template) أو من قِبل الإضافات plugins لتحديد نوع الصّفحة الّتي يتمّ عرضها، فعلى سبيل المثال الدّالّة/الوسم <span style="font-family:courier new,courier,monospace;">()</span><code><span style="font-family:courier new,courier,monospace;">is_page</span> </code>تُحدّد فيما إذا كانت الصّفحة الّتي يتمّ عرضها ثابتة (static) أم لا، والدّالّة/الوسم <span style="font-family:courier new,courier,monospace;">()<code>is_home</code></span> تُحدّد فيما إذا كانت الصّفحة هي صفحة البداية home page، ويوجد العديد من هذه الوسوم/الدّوال الشرطيّة منها ما يُحدّد فيما إذا كان المُستخدم مُسجّلًا دخوله logged in أم لا، وغيره من هذه الدوال.
	</li>
</ul>
<h2>
	متى يجب استخدام الاستعلام المخصص في ووردبريس
</h2>

<p>
	يوجد نوعان من الاستعلامات المُخصّصة:
</p>

<ul>
<li>
		الاستعلام الرئيسي بعد تعديله.
	</li>
	<li>
		استعلامات جديدة كليًّا لجلب مُحتوى مُختلف/مُحدّد أو محتوى إضافي.
	</li>
</ul>
<h3>
	التعديل على الاستعلام الرئيسي Main Query في ووردبريس
</h3>

<p>
	يُمكن استخدام نسخة مُعدّلة من الاستعلام الرئيسي عند الرغبة في أنّ تَعرض الصّفحة نتائج الاستعلام الرئيسي لذات المحتوى ولكن مع بعض التحسين والتعديل، وفي هذا النوع من الاستعلام ليس الهدف هو إظهار محتوى مُختلف كليًّا، وليس من المُفترض إضافة حلقة تكراريّة (loop) إضافيّة.
</p>

<p>
	<strong>أمثلة للحالات الّتي من المُمكن بها استخدام استعلام مُعدّل</strong>:
</p>

<ul>
<li>
		في الصّفحة الرئيسيّة للمدوّنة، عرض أنواع منشورات مُخصّصة بالإضافة إلى المنشورات.
	</li>
	<li>
		في صفحة أرشيف التصنيفات category، عرض منشورات من نوع مُحدّد فقط.
	</li>
	<li>
		في صفحة أرشيف التصنيفات، ترتيب المنشورات ترتيبًا أبجديًا بدلًا من الترتيب الافتراضي.
	</li>
</ul>
<p>
	يوجد العديد من الحالات الأُخرى، ولكن كما هو واضح فالتعديلات مقتصرة على التعديلات البسيطة للاستعلام.
</p>

<h3>
	كتابة استعلام جديد في ووردبريس
</h3>

<p>
	قد لا يكون التعديل على الاستعلامات كافيًا في بعض الحالات، فعندها يُمكن إنشاء استعلام جديد، ويتمّ بهذا الحصول على مرونة أكبر في بناء الاستعلام، ولكن لا يُحبّذ إنشاء استعلام جديد عندما يكون التعديل على الاستعلام الرئيسي أمرًا كافيًا، حيث يُمكن إنشاء استعلامًا جديدًا عند الحاجة إلى استخدام أكثر من حلقة loop واحدة في الصّفحة أو عند الرغبة في استبدال الاستعلام الرئيسي باستعلام جديد كليًّا.
</p>

<p>
	<strong>أمثلة للحالات الّتي من المُمكن بها إنشاء استعلام جديد عديدة ومُختلفة، ولكن أبرزها</strong>:
</p>

<ul>
<li>
		عند تنفيذ حلقتين two loops في صفحة الأرشيف: إحداهما للمنشور الأوّل والأخرى للمنشورات اللاحقة، بهدف عرض مُحتوى مُختلف للمنشور الأوّل، مثلًا عندما يكون المطلوب أنّ يتضمّن المنشور الأوّل مُلخّص أو صورة مميّزة فقط بدون بقيّة المنشورات، ولكن إن كان المطلوب هو <strong><em>تنسيق</em></strong> المنشور الأوّل بشكل مُختلف فقط، فمن غير المُستحسن استخدام حلقات (loops) متعدّدة في ذلك، بل من المُفترض استخدام <span style="font-family:arial,helvetica,sans-serif;">CSS</span> لاستهداف المنشور الأوّل في التنسيق دون بقيّة المنشورات.
	</li>
	<li>
		في صفحة المنشور المنفردة (single post)، وذلك عند تنفيذ حلقة (loop) إضافيّة لعرض المنشورات الأخيرة (أو المنشورات المُميّزة) وذلك أسفل محتوى المنشور، بغرض تشجيع القارئ لقراءة المزيد.
	</li>
	<li>
		عند إضافة لافتة (banner) مربوطة مع منشور مُميّز منفرد single featured post (أو لجميع المنشورات المُميّزة) في أعلى كل صفحة من صفحات الموقع، كما هو الأمر عند إضافة منشور يُروّج إلى مُنتج جديد، وهذه الطريقة هي أكثر مرونة من إضافة لافتة ثابتة (static banner) بما أنّه من المُمكن تعديل المنشور المُستخدَم بسهولة.
	</li>
	<li>
		عند إنشاء قائمة من الصفحات في نفس القسم (section) من الموقع، وذلك عندما يَملك الموقع بُنية مُعتمدة على صفحات هرميّة/شجريّة، فمن المُستحسن وضعها في الشريط الجانبي sidebar.
	</li>
	<li>
		إنشاء قالب صفحة page template باستعلام مخصّص كليًّا لعرض المنشورات على حسب التصنيف (taxonomy) أو نوع المنشور (أو ربّما حسب المعيارين).
	</li>
	<li>
		في صفحة أرشيف نوع المنشور (post type archive page)، وذلك لعرض المنشورات حسب التصنيف (category) بدلًا من التاريخ.
	</li>
	<li>
		إنشاء لافتة (banner) في الشريط الجانبي sidebar للربط إلى المنشور الأخير مع صورته الرئيسيّة.
	</li>
	<li>
		إنشاء صفحة لعرض المنشورات المُرتبطة فيما بينها وبأكثر من تصنيف، مثلًا عرض المقالات البرمجيّة وللغة روبي (Ruby) مثلًا ولكاتب مُحدّد.
	</li>
	<li>
		إنشاء نوع منشور لمحتوى الشريط الجانبي واستعلام منشورات هذا النوع في الشريط الجانبي، الأمر الّذي يُساعد أصحاب الخلفيّة غير البرمجيّة في إضافة مُحتوى إلى الشريط الجانبي بمرونة أكثر فيما لو تمّ استخدام <a href="https://academy.hsoub.com/code/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D9%86%D9%8A-%D9%88%D8%AF%D8%AC%D8%AA-widget-%D9%84%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3%D8%9F-r99/" rel="">ودجت</a> (widget).
	</li>
</ul>
<p>
	يوجد العديد من السيناريوهات الأخرى، ولكن القائمة السابقة تعطي فكرة عامّة، ولن يتمّ التفصيل في كيفيّة تنفيذ كلٍ منها بل سيتمّ تغطية بعض الأمثلة.
</p>

<h2>
	طرق إنشاء استعلام مخصص Custom Query
</h2>

<p>
	يتوفّر خمس طرق لإنشاء استعلامات مُخصّصة custom queries، ويُمكن أنّ تُقسّم هذه الطرق تبعًا فيما إذا كان سيتمّ التعديل على الاستعلام الرئيسي أو سيتمّ إنشاء استعلام جديد.
</p>

<p>
	<strong>الطرق لتعديل الاستعلام الرئيسي هي:</strong>
</p>

<ul>
<li>
		استعمال الخطّاف الإجرائي <span style="font-family:courier new,courier,monospace;"><code>pre_get_posts</code></span>، والّذي يسمح للمطوّر في التعديل على الاستعلام الرئيسي عن طريق إضافة دالّة إلى ملفّ الدّوال الخاصّ بالقالب (theme) أو بواسطة إضافة (وليس في ملفّات القالب template) ويُمكن دمجه مع تصريح شرطي conditional statement لتأكّد من أنّه يُنفّذ فقط على الصفحات الّتي تعرض أنواع مُحدّدة من المُحتوى.
	</li>
	<li>
		استعمال <span style="font-family:courier new,courier,monospace;">()<code>query_posts</code></span>، مع العلم أنّ وجود هذه الدّالّة ضمن القائمة لتوضيح لماذا <strong><em>لا</em></strong> يجب استخدامها، فالدّالّة <span style="font-family:courier new,courier,monospace;">()<code>query_posts</code></span> هي دالّة غير عمليّة ولا يُمكن الاعتماد عليها في تعديل وتحسين الاستعلام الرئيسي، فبدلًا من تحسين وتعديل الاستعلام الرئيسي فهي تجلب الاستعلام الرئيسي ومن ثُمّ توقفه وتبدأ مرّة أخرى بإعادة تنفيذه مع التغيرات المُدخلة، الأمر الّذي سيؤثّر على أداء الموقع، ومن المُمكن جدًا أنّ لا تعمل كما يجب لدى استخدامها مع <a href="https://academy.hsoub.com/code/php/wordpress/%D8%A7%D9%84%D8%AA%D9%91%D8%B5%D9%81%D9%8A%D8%AD-pagination-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r54/" rel="">التّصفيح pagination</a>.
	</li>
</ul>
<p>
	<strong>تسمح الطرق المتبقية في إنشاء استعلام جديد</strong>:
</p>

<ul>
<li>
		باستخدام الصنف <span style="font-family:courier new,courier,monospace;"><code>WP_Query</code></span>، وهي طريقة مرنة جدًا في إنشاء استعلام جديد، ويُستخدم هذا الصنف (class) عند إنشاء حلقة (loop) ثانية في ملفّ القالب (template file) أو عند إنشاء ملفّ قالب باستعلام مُخصّص كليًّا لاستبدال الحلقة الرئيسية (main loop)، ولكن يجب الحذر في استخدامه، وتأتي الخطورة في عدم تصفير (reset) الاستعلام بعد تنفيذ الحلقة (loop)، والّذي يعني أنّ ووردبريس لن يكون قادرًا على التعرّف بشكلٍ صحيح ما نوع الصّفحة الّتي يتمّ عرضها، ولكن من المُمكن حل هذه المشكلة بسهولة.
	</li>
	<li>
		دالّة/وسم القالب <span style="font-family:courier new,courier,monospace;">()<code>get_posts</code></span>، وتُستخدم في ملفّ القالب (template) (بما في ذلك الشريط الجانبي sidebar وذيل الصّفحة على سبيل المثال) لجلب قائمة المنشورات، ويَستخدم الصنف <span style="font-family:courier new,courier,monospace;"><code>WP_Query</code></span> لعمل ذلك، ويُمكن استخدام مُعامِلات (parameters) معه لتحديد المنشورات المطلوبة.
	</li>
	<li>
		دالّة/وسم القالب <span style="font-family:courier new,courier,monospace;">()<code>get_pages</code></span>، والّتي تعمل بنفس طريقة عمل <span style="font-family:courier new,courier,monospace;">()<code>get_posts</code></span>، ولكن في جلب الصفحات بدلًا من المنشورات.
	</li>
</ul>
<p>
	سيتم التطرّق إلى أهم هذه الطرق بمزيد من التفصيل بعد أنّ تمّ عرضهم بشكل سريع.
</p>

<h3>
	الخطاف الإجرائي pregetposts
</h3>

<p>
	إن الدّالّة <span style="font-family:courier new,courier,monospace;"><code>pre_get_posts</code></span> هي خطّاف إجرائي (action hook)، وبالتالي يُمكن ربط دالّة معها لجعل شيء ما يحدث في الوقت الذي يُنفّذ ووردبريس الإجراء <span style="font-family:courier new,courier,monospace;"><code>pre_get_posts</code></span>، وكما هو واضح، يُنفّذ ووردبريس هذا الإجراء (action) مباشرةً قبل جلب المنشورات من قاعدة البيانات، ولذلك فإن أي دالّة يتمّ ربطّها معها ستؤثّر في كيفيّة جلب ووردبريس لتلك المنشورات.
</p>

<p>
	إن استخدام الدّالّة <span style="font-family:courier new,courier,monospace;"><code>pre_get_posts</code></span> يتطلّب إنشاء دالّة ومن ثُمّ ربطّها مع الإجراء، كما في التّالي:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> my_function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="com">// contents of function go here</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
add_action</span><span class="pun">(</span><span class="pln"> </span><span class="str">'pre_get_posts'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'my_function'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<ul>
<li>
		أوّلًا، تمّ إنشاء الدّالّة وبالاسم <span style="font-family:courier new,courier,monospace;"><code>my_function</code></span> وما ستفعله هذه الدّالّة سيكون داخل الحاصرتين (braces).
	</li>
	<li>
		ثانيًا، تمّ ربط تلك الدّالّة مع الخطّاف <span style="font-family:courier new,courier,monospace;"><code>pre_get_posts</code></span> باستخدام الدّالّة <span style="font-family:courier new,courier,monospace;">()<code>add_action</code></span>، وبدون ذلك لن تعمل الدّالّة.
	</li>
</ul>
<p>
	سيتمّ الحاجة غالبًا بالإضافة إلى ما سبق، إلى تضمين وسم/دالّة شرطيّة داخل الدّالّة المنشأة، فبدونها لن يقوم ووردبريس بتنفيذ الدالة المُنشأة كل مرّة يتمّ فيها جلب المنشورات، بما في ذلك عند التعامل مع المنشورات في الصفحات الإداريّة (admin)، وعليه ستكون الدالة المُنشأة بالشكل التّالي:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> my_function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="pun">!</span><span class="pln">is_admin</span><span class="pun">()</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> $query_</span><span class="pun">&gt;</span><span class="pln">is_main_query</span><span class="pun">()</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// contents of function go here</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
add_action</span><span class="pun">(</span><span class="pln"> </span><span class="str">'pre_get_posts'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'my_function'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	تمّ في الشيفرة السابقة، التأكّد من أنّ الصّفحة ليس صفحة إداريّة (admin) وأيضًا أنّ الاستعلام الّذي يتمّ تنفيذه هو الاستعلام الرئيسي (main query)، ومن المهم التأكّد من أن ووردبريس يُنفّذ الاستعلام الرئيسي تجنبًا للمشاكل المحتملة عند تنفيذ الدّالّة من أجل استعلامات إضافية قد تم إنشاؤها، كما يُمكن إضافة وسوم/دوال شرطيّة إضافيّة هنا كما سيتمّ لاحقًا.
</p>

<h2>
	إدراج أنواع منشورات مخصصة في صفحة المدونة الرئيسية
</h2>

<p>
	يَعرض ووردبريس بشكلٍ افتراضي قائمة بالمنشورات فقط في صفحة البداية (homepage) فإن تمّ إنشاء نوع منشورات مخصصة، فسيفترض ووردبريس أنّ المُراد هو عرضها في مكان آخر وعدم تضمينهم هنا، ولكن أحيانًا قد يُرغب في عرض أكثر من نوع منشور واحد في صفحة البداية (home page) وفي هذه الحالة يجب استخدام الخطّاف <span style="font-family:courier new,courier,monospace;"><code>pre_get_posts</code></span>.
</p>

<p>
	ويتم ذلك عبر إضافة الشيفرة التّالية إلى الملفّ <span style="font-family:courier new,courier,monospace;"><code>functions.php</code></span> الخاصّ بالقالب (theme) أو الإضافة المُنشأة.
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> my_function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> is_home</span><span class="pun">()</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">is_main_query</span><span class="pun">()</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $query</span><span class="pun">-&gt;</span><span class="kwd">set</span><span class="pun">(</span><span class="pln"> </span><span class="str">'post_type'</span><span class="pun">,</span><span class="pln"> array</span><span class="pun">(</span><span class="pln"> </span><span class="str">'post'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'custom_post_type'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $query</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
add_action</span><span class="pun">(</span><span class="pln"> </span><span class="str">'pre_get_posts'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'my_function'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	تتأكّد الشيفرة السابقة من أمرين اثنين، أوّلًا فيما إذا كان الاستعلام هو الاستعلام الرئيسي وثانيًا فيما إذا كانت الصّفحة هي صفحة البداية (باستخدام الدالة <span style="font-family:courier new,courier,monospace;">()<code>is_home</code></span>) بعد ذلك يتمّ تعيين (set) الاستعلام ليتضمّن نوعين من المنشورات: هما<span style="font-family:courier new,courier,monospace;"> 'post' </span>و <span style="font-family:courier new,courier,monospace;">'custom<em>post</em>type'</span>، ليكونا نوع المنشور المُخصّص، مع مُلاحظة وجوب تضمين <span style="font-family:courier new,courier,monospace;">'post' </span>هنا إن كان المرغوب من صفحة البداية أن تَعرض المنشورات أيضًا بالإضافة إلى نوع المنشور المخصّص، وفي حال إضافة <span style="font-family:courier new,courier,monospace;"><code>custom_post_type</code></span> فقط، سيتمّ استبدال السلوك الافتراضي وعرض المنشورات من نوع المنشور المخصّص، وقد يكون هذا المرغوب في بعض الحالات ولكن ليس في المثال الحالي.
</p>

<h2>
	عرض منشورات من نوع المنشور المخصص في صفحة أرشيف التصنيف
</h2>

<p>
	يَفترض هذا المثال أنه عندما تمّ تسجيل نوع المنشورات المُخصّصة، فقد تمّ منحها دعمًا للتصنيفات (categories) وتم إسناد التصنيفات إلى منشورات نوع المنشور المُخصّص، ولتعديل أرشيفات التصنيفات لكي تَعرض منشورات نوع المنشور المُخصّص يُستخدم التّالي:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> my_function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> is_category</span><span class="pun">()</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">is_main_query</span><span class="pun">()</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $query</span><span class="pun">-&gt;</span><span class="kwd">set</span><span class="pun">(</span><span class="pln"> </span><span class="str">'post_type'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'custom_post_type'</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $query</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
add_action</span><span class="pun">(</span><span class="pln"> </span><span class="str">'pre_get_posts'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'my_function'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	تتأكّد الشيفرة السابقة من أنّ الاستعلام المُنفّذ هو الاستعلام الرئيسي والصفحة هي أرشيف التصنيفات وذلك باستخدام الدالة <span style="font-family:courier new,courier,monospace;">()<code>is_category</code></span>، ومن ثُمّ تمّ التعديل على الاستعلام ليجلب منشورات نوع المنشور المُخصّص، وبما أنّه لم يتمّ تضمين <span style="font-family:courier new,courier,monospace;"><code>'post'</code></span> هنا، فإن المنشورات الاعتياديّة لن يتمّ عرضها في أيٍ من أرشيفات التصنيفات، بالإضافة إلى أنّه لن يتمّ الحاجة إلى استخدام مصفوفة بما أنّه تمّ تحديد نوع منشور واحد.
</p>

<p>
	إنّ كان المطلوب هو التحديد بدقة أكبر فيُمكن تحديد نوع مُعيّن من التصنيفات كما في التّالي:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> my_function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> is_category</span><span class="pun">(</span><span class="pln"> </span><span class="str">'category-slug'</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">is_main_query</span><span class="pun">()</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $query</span><span class="pun">-&gt;</span><span class="kwd">set</span><span class="pun">(</span><span class="pln"> </span><span class="str">'post_type'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'custom_post_type'</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $query</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
add_action</span><span class="pun">(</span><span class="pln"> </span><span class="str">'pre_get_posts'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'my_function'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	سيتمّ في الشيفرة السابقة التعديل الاستعلام الرئيسي في صفحة الأرشيف category-slug فقط، حيثُ أنّ category-slug هو الاسم اللطيف (slug) للتصنيف (category).
</p>

<h2>
	تغيير طريقة ترتيب المنشورات
</h2>

<p>
	لن يتعامل المثال الأخير مع ما هي البيانات الّتي يتمّ استعلامُها بل مع كيف يتمّ عرضها/خَرْجُها (output)، فمثلًا في صفحات أرشيف التصنيفات (category archive) وعند عدم الرغبة في ترتيب المنشورات بواسطة التاريخ ولكن بالترتيب الأبجدي، يُمكن استخدام <span style="font-family:courier new,courier,monospace;"><code>pre_get_posts</code> </span>كما في التّالي:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="">
<span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> my_function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> is_category</span><span class="pun">()</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">is_main_query</span><span class="pun">()</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $query</span><span class="pun">-&gt;</span><span class="kwd">set</span><span class="pun">(</span><span class="pln"> </span><span class="str">'orderby'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'title'</span><span class="pun">);</span><span class="pln">
        $query</span><span class="pun">-&gt;</span><span class="kwd">set</span><span class="pun">(</span><span class="pln"> </span><span class="str">'order'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'ASC'</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> $query</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
add_action</span><span class="pun">(</span><span class="pln"> </span><span class="str">'pre_get_posts'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'my_function'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	تمّ في الشيفرة السابقة استعمال المُعامِل <code>orderby</code> والمُعامِل <code>order</code> لتحديد بناءً على ماذا ستُرتّب المنشورات وكيف ستُرتّب وذلك عند عرضها، وللمزيد من المُعامِلات (parameters) الّتي يُمكن استخدامها مع <span style="font-family:courier new,courier,monospace;"><code>pre_get_posts</code></span> يُمكن الرجوع إلى التوثيق الرسميّ للصنف <a href="http://codex.wordpress.org/Class_Reference/WP_Query" rel="external nofollow"><code>WP_Query</code></a> والّذي يستخدم نفس المُعامِلات.
</p>

<h2>
	الصنف WP_Query
</h2>

<p>
	يُعتبر الصنف<span style="font-family:courier new,courier,monospace;"> <code>WP_Query</code></span> الطريقة الأفضل لكتابة استعلام مُخصّص، ويُستخدم عند الرغبة في استبدال الاستعلام الرئيسي (main query) باستعلام جديد أو عند الرغبة في إضافة استعلام جديد بالإضافة إلى الاستعلام الرئيسي.
</p>

<p>
	أجزاء الصنف <span style="font-family:courier new,courier,monospace;"><code>WP_Query</code></span>:
</p>

<ul>
<li>
		المُعطيات (arguments) للاستعلام، وذلك باستخدام المُعامِلات (parameters) بشكل مُشابه إلى الّتي قد تُستخدم مع أجل <span style="font-family:courier new,courier,monospace;"><code>pre_get_posts</code></span>.
	</li>
	<li>
		الاستعلام نفسه.
	</li>
	<li>
		الحلقة (loop).
	</li>
	<li>
		الإنهاء: وذلك بإغلاق وسوم <code>if</code> و <code>while</code>، وتصفير (reset) بيانات المنشور.
	</li>
</ul>
<p>
	ستكون الشيفرة على النحو التّالي:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="">
<span class="pun">&lt;?</span><span class="pln">php
$args </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    </span><span class="com">// arguments for your query</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

</span><span class="com">// the query</span><span class="pln">
$query </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> WP_Query</span><span class="pun">(</span><span class="pln"> $args </span><span class="pun">);</span><span class="pln">

</span><span class="com">// The Loop</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">have_posts</span><span class="pun">()</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln">  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">have_posts</span><span class="pun">()</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">the_post</span><span class="pun">()</span><span class="pln"> </span><span class="pun">:</span><span class="pln">
  </span><span class="com">// contents of the Loop go here</span><span class="pln">

endwhile </span><span class="pun">:</span><span class="pln"> endif</span><span class="pun">;</span><span class="pln">
</span><span class="com">/* Restore original Post Data */</span><span class="pln">
wp_reset_postdata</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	كما هو واضح إن الأمر أكثر تعقيدًا من استخدام <span style="font-family:courier new,courier,monospace;"><code>pre_get_posts</code> </span>وهو أحد الأسباب لتجنّب استخدام الطريقة السابقة عندما يكون المطلوب هو التعديل على الاستعلام الرئيسي، ولكن السبب الرئيسي لتجنّب استخدامها هو أنها ستُجهد سكريبت ووردبريس نفسه، الأمر الّذي قد يؤثّر على أداء الموقع بالمُجمل.
</p>

<p>
	سيتمّ إلقاء نظرة على مثال للتوضيح أكثر، حيثُ سيتمّ إضافة حلقة (loop) ثانية بعد محتوى المنشور في ملفّ القالب (template) المُسمّى <span style="font-family:courier new,courier,monospace;"><code>single.php</code></span>، لعرض قائمة بالمنشورات المُميّزة، حيثُ تمّ تعريف هذه المنشورات المُميّزة باستخدام التصنيف "featured" (مُميّز)، ولكل واحدة من هذه المنشورات سيتمّ عرض الصورة المُميّزة والعنوان (title) مع الروابط الّتي تُحيل إلى المنشور:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="">
<span class="pun">&lt;?</span><span class="pln">php
$args </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    </span><span class="str">'post_type'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'post'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'posts_per_page'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'4'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'post__not_in'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="pln"> $post</span><span class="pun">-&gt;</span><span class="pln">ID </span><span class="pun">)</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

</span><span class="com">// the query</span><span class="pln">
$query </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> WP_Query</span><span class="pun">(</span><span class="pln"> $args </span><span class="pun">);</span><span class="pln">

</span><span class="com">// The Loop</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">have_posts</span><span class="pun">()</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">

 </span><span class="tag">&lt;section</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"recent-posts clear"</span><span class="tag">&gt;</span><span class="pln">
 </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">have_posts</span><span class="pun">()</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">the_post</span><span class="pun">()</span><span class="pln"> </span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     &lt;article id="post-</span><span class="pun">&lt;?</span><span class="pln">php the_ID</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" </span><span class="pun">&lt;?</span><span class="pln">php post_class</span><span class="pun">(</span><span class="pln"> </span><span class="str">'left'</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">&gt;
         &lt;a href="</span><span class="pun">&lt;?</span><span class="pln">php the_permalink</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" title="</span><span class="pun">&lt;?</span><span class="pln">php the_title_attribute</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">"&gt;
             </span><span class="pun">&lt;?</span><span class="pln">php post_thumbnail</span><span class="pun">(</span><span class="pln"> </span><span class="str">'thumbnail'</span><span class="pln"> </span><span class="pun">);?&gt;</span><span class="pln">
         </span><span class="tag">&lt;/a&gt;</span><span class="pln">

         &lt;a href="</span><span class="pun">&lt;?</span><span class="pln">php the_permalink</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" title="</span><span class="pun">&lt;?</span><span class="pln">php the_title_attribute</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">"&gt;
             </span><span class="pun">&lt;?</span><span class="pln">php the_title</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
         </span><span class="tag">&lt;/a&gt;</span><span class="pln">
     </span><span class="tag">&lt;/article&gt;</span><span class="pln">
 </span><span class="pun">&lt;?</span><span class="pln">php endwhile</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">

 </span><span class="tag">&lt;/section&gt;</span><span class="pln">

</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln">
</span><span class="com">/* Restore original Post Data */</span><span class="pln">
wp_reset_postdata</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	تَستخدم الشيفرة السابقة ثلاثة مُعطيات (arguments) لاستعلام البيانات:
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;"><code>'post_type' =&gt; 'post'</code></span> لجلب المنشورات فقط.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><code>'posts_per_page' =&gt; '4'</code></span> لجلب أربعة منشورات فقط.
	</li>
	<li>
		<code><span style="font-family:courier new,courier,monospace;">(post__not_in' =&gt; array($post-&gt;ID'</span> </code>للتأكيد على أنّ المنشور الّذي يُعرض حاليًا غير مُضمّن.
	</li>
</ul>
<p>
	ستُخرج (output) الشيفرة بعدها أربعة منشورات في حلقة (loop) والّتي تَعرض الصورة المُميّزة والعنوان (title) كلٍ محتوى داخل رابط يُحيل إلى صفحة المنشور، ومن المُمكن استخدام CSS للتنسيق، أو توضيعهم جنبًا إلى جنب أو في عرض شبكي (grid) أو حتّى جعل العنوان يتداخل مع الصورة.
</p>

<h2>
	وسم/دالة القالب ()<code>get_posts</code>
</h2>

<p>
	يُمكن اللجوء إلى <span style="font-family:courier new,courier,monospace;"><code>get_posts</code></span> عند عدم الحاجة إلى تلك المرونة الّتي يُقدمها الصنف <span style="font-family:courier new,courier,monospace;"><code>WP_Query</code></span>، وعليه فمن المُمكن الاستفادة منها في تطبيق المثال الأخير، مع العلم أنّ الوسم/الدالة <span style="font-family:courier new,courier,monospace;"><code>get_posts</code></span> ما هي إلا وسم قالب (template tag) يَستخدم الصنف <span style="font-family:courier new,courier,monospace;"><code>WP_Query</code> </span>ويُمكن استخدامه بطريقة مُشابهة إلى <span style="font-family:courier new,courier,monospace;"><code>WP_Query</code></span>.
</p>

<p>
	يُمكن إنشاء قائمة بالمنشورات الأربعة الأخيرة باستخدام <span style="font-family:courier new,courier,monospace;">()<code>get_posts</code></span> كما تمّ مع <span style="font-family:courier new,courier,monospace;"><code>WP_Query</code></span> على النحو التّالي:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="">
<span class="pun">&lt;?</span><span class="pln">php
$args </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    </span><span class="str">'posts_per_page'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'4'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'exclude'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="pln"> $post</span><span class="pun">-&gt;</span><span class="pln">ID </span><span class="pun">)</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

</span><span class="com">// get posts</span><span class="pln">
$posts </span><span class="pun">=</span><span class="pln"> get_posts</span><span class="pun">(</span><span class="pln"> $args </span><span class="pun">);</span><span class="pln">

</span><span class="com">// check if any posts are returned</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $posts </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
    </span><span class="tag">&lt;section</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"recent-posts clear"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$posts </span><span class="kwd">as</span><span class="pln"> $post </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">

 </span><span class="pun">&lt;?</span><span class="pln">php setup_postdata</span><span class="pun">(</span><span class="pln"> $post </span><span class="pun">);</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">

 &lt;article id="post-</span><span class="pun">&lt;?</span><span class="pln">php the_ID</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" </span><span class="pun">&lt;?</span><span class="pln">php post_class</span><span class="pun">(</span><span class="pln"> </span><span class="str">'left'</span><span class="pln"> </span><span class="pun">);</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">&gt;

 &lt;a href="</span><span class="pun">&lt;?</span><span class="pln">php the_permalink</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" title="</span><span class="pun">&lt;?</span><span class="pln">php the_title_attribute</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">"&gt;
 </span><span class="pun">&lt;?</span><span class="pln">php post_thumbnail</span><span class="pun">(</span><span class="pln"> </span><span class="str">'thumbnail'</span><span class="pln"> </span><span class="pun">);?&gt;</span><span class="pln">
 </span><span class="tag">&lt;/a&gt;</span><span class="pln">

 &lt;a href="</span><span class="pun">&lt;?</span><span class="pln">php the_permalink</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" title="</span><span class="pun">&lt;?</span><span class="pln">php the_title_attribute</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">"&gt;
 </span><span class="pun">&lt;?</span><span class="pln">php the_title</span><span class="pun">();</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
 </span><span class="tag">&lt;/a&gt;</span><span class="pln">

 </span><span class="tag">&lt;/article&gt;</span><span class="pln">

 </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">

 </span><span class="tag">&lt;/section&gt;</span><span class="pln">

</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln">
</span><span class="com">/* Restore original Post Data */</span><span class="pln">
wp_reset_postdata</span><span class="pun">();</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	تُشبه الشيفرة السابقة إلى حدٍ كبير جدًا شيفرة مثال الصنف <span style="font-family:courier new,courier,monospace;"><code>WP_Query</code></span> السابقة، ولكن مع اختلاف طفيف:
</p>

<ul>
<li>
		لا يجب على المُعطيات (arguments) أنّ تُضمّن نوع المنشور.
	</li>
	<li>
		تمّ استخدام المُتغيّر <span style="font-family:courier new,courier,monospace;"><code>posts</code><span style="line-height: 22.3999996185303px; text-align: right;">$</span></span> لتخزين خَرْج (output) المصفوفة باستخدام <span style="font-family: 'courier new', courier, monospace; line-height: 22.3999996185303px;">()</span><code style="line-height: 22.3999996185303px;">get_posts</code>.
	</li>
	<li>
		بدلًا من التأكّد فيما إذا كان الاستعلام يملك منشورات، تمّ استخدام <span style="font-family:courier new,courier,monospace;">(</span><code><span style="font-family:courier new,courier,monospace;">if($posts</span> </code>في ذلك.
	</li>
	<li>
		بدلًا من استخدام حلقة (loop) معياريّة (standard)، تمّ استخدام <span style="font-family:courier new,courier,monospace;">(<code>foreach ($posts as $post</code></span>، والّتي ستُكرّر لكل صفّ (row) في المصفوفة.
	</li>
	<li>
		للوصول إلى جميع بيانات المنشور المطلوبة تمّ تضمين <span style="font-family:courier new,courier,monospace;">(<code>setup_postdat($post</code></span>.
	</li>
</ul>
<p>
	بما أنّ الدّالّة <span style="font-family: 'courier new', courier, monospace; line-height: 22.3999996185303px;">()</span><code style="line-height: 22.3999996185303px;">get_posts</code> تستخدم الصنف <code>WP_Query</code>، فلا فرق يُذكر بين الاثنين عامّةً، ولذلك يميل بعض المُطوّرين إلى استخدام الصنف <span style="font-family:courier new,courier,monospace;"><code>WP_Query</code> </span>بما أنّه يُقدّم مرونةً أكبر، مع ذلك يُمكن أنّ تكون الدّالّة <span style="font-family: 'courier new', courier, monospace; line-height: 22.3999996185303px;">()</span><code style="line-height: 22.3999996185303px;">get_posts</code> أكثر نفعًا عند الرغبة من التأكّد إن كان يوجد أي منشورات مع المُعطيات (arguments)، عندها يُمكن خَرْج (output) الشيفرة اعتمادًا على وجود أية منشورات، من دون الضرورة إلى استخدام حلقة (loop).
</p>

<h2>
	دالة/وسم القالب ()<code>get_pages</code>
</h2>

<p>
	تُشبه الدّالّة <span style="font-family:courier new,courier,monospace;">()<code>get_pages</code></span> إلى حدٍ كبيرٍ الدّالّة <span style="font-family:courier new,courier,monospace;">()<code>get_posts</code></span> وهي تستخدم الصنف <span style="font-family:courier new,courier,monospace;"><code>WP_Query</code></span> ولكن في جلب الصفحات الثابتة (static pages) بدلًا من المنشورات، ومن الأمثلة الّتي تُستخدم بها:
</p>

<p>
	إن كان الموقع يملك مجموعة من الصفحات الهامّة ومن النوع top level، وكان الطلوب إضافة قائمة لها في الشريط الجانبي (sidebar) لكي يتمّ تنسيق روابطها وتشجيع الزوار إلى الذهاب إلى هذه الصفحات، فعندها وفي الملفّ <span style="font-family:courier new,courier,monospace;"><code>sidebr.php</code></span> يُمكن إضافة الشيفرة التّالية:
</p>

<pre class="php ipsCode prettyprint prettyprinted" data-pbcklang="php" data-pbcktabsize="">
<span class="pun">&lt;?</span><span class="pln">php
$args </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    </span><span class="str">'parent'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'sort_order'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'ASC'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'sort_column'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'post_title'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

</span><span class="com">// get posts</span><span class="pln">
$pages </span><span class="pun">=</span><span class="pln"> get_pages</span><span class="pun">(</span><span class="pln"> $args </span><span class="pun">);</span><span class="pln">

</span><span class="com">// check if any posts are returned</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $pages </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
 </span><span class="tag">&lt;ul</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"sidebar-pages"</span><span class="tag">&gt;</span><span class="pln">
     </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $pages </span><span class="kwd">as</span><span class="pln"> $page </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
     </span><span class="tag">&lt;li&gt;</span><span class="pln"> 
         &lt;a href="</span><span class="pun">&lt;?</span><span class="pln">php echo get_page_link</span><span class="pun">(</span><span class="pln"> $page</span><span class="pun">-&gt;</span><span class="pln">ID </span><span class="pun">);</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">"&gt;
             </span><span class="pun">&lt;?</span><span class="pln">php echo $page</span><span class="pun">-&gt;</span><span class="pln">post_title</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
         </span><span class="tag">&lt;/a&gt;</span><span class="pln"> 
     </span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
 </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

<p>
	تفاصيل الشيفرة السابقة هي كالتّالي:
</p>

<ul>
<li>
		أوّلًا تمّ تعريف المُعطيات حيثُ أنّ <span style="font-family:courier new,courier,monospace;"><code>parent' =&gt; 0'</code></span> ستُعيد الصفحات الّتي هي بدون صفحة بداية، بينما بقيّة المُعطيات ستُحدّد كيف ستُرتّب هذه الصفحات.
	</li>
	<li>
		تمّ بعد ذلك استخدام<span style="font-family:courier new,courier,monospace;"> ()</span><code><span style="font-family:courier new,courier,monospace;">get_pages</span> </code>وتمرير مصفوفة المُعطيات وتخزينها في المُتغيّر <span style="font-family:courier new,courier,monospace;"><code>pages</code></span><span style="font-family: monospace; line-height: 22.3999996185303px; text-align: right;"><span style="font-family:courier new,courier,monospace;">$</span>.</span>
	</li>
	<li>
		بعد ذلك تمّ التأكّد فيما إذا كان المُتغيّر <span style="font-family:courier new,courier,monospace;"><code>pages</code><span style="line-height: 22.3999996185303px; text-align: right;">$</span></span> يحتوي على أية بيانات وذلك باستخدام <span style="font-family:courier new,courier,monospace;">(</span><code><span style="font-family:courier new,courier,monospace;">if($pages</span>.</code>
	</li>
	<li>
		وفي حال توفّر الصفحات سيتمّ عرضها من خلال عناصر قائمة (list item).
	</li>
	<li>
		وبدلًا من استخدام<span style="font-family:courier new,courier,monospace;"> ()<code>setup_postdata</code> </span>كما تمّ مع <span style="font-family:courier new,courier,monospace;">()<code>get_pages</code></span>، فقد تمّ استخدام المُتغيّر<span style="font-family:courier new,courier,monospace;"> <code>post</code><span style="line-height: 22.3999996185303px; text-align: right;">$</span></span> مُباشرةً وبوسوم قالب (template) مُختلفة والّتي ستُخرج (output) الرابط والعنوان (title)، ومن الضروري استخدامها هنا بسبب عدم استخدام <span style="font-family:courier new,courier,monospace;">()<code>setup_postdata</code></span>.
	</li>
	<li>
		وبسبب عدم استخدام <span style="font-family:courier new,courier,monospace;">()</span><code><span style="font-family:courier new,courier,monospace;">setup_postdata</span> </code>فلا داعي لاستخدام<span style="font-family:courier new,courier,monospace;"> ()<code>wp_reset_postdata</code></span>.
	</li>
</ul>
<p>
	إن طريقة الشيفرة السابقة هي طريقة أكثر عمليّة في خَرْج (output) قائمة من الصفحات من طريقة استخدام الصنف <span style="font-family:courier new,courier,monospace;"><code>WP_Query</code></span> وبكل ما يملكنه من إمكانيات.
</p>

<h2>
	الختام
</h2>

<p>
	إن التعديل على الاستعلام الرئيسي أو كتابة استعلامات جديدة هي مهارة ليجب الاهتمام بها وتطويرها خاصّة إن كان المطلوب هو إنشاء قوالب (themes) مُخصّصة أو إضافات (plugins) أو تطوير مواقع مُعقّدة للعُملاء.
</p>

<p>
	تمّ التطرّق إلى الطرق الخمس في إنشاء استعلامات مُخصّصة، ولكن أربعة منها فقط يُمكن استخدامها:
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;"><code>pre_get_posts</code></span> للتعديل على الاستعلام الرئيسي.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><code>WP_Query</code></span> لإنشاء استعلامات مُخصّصة ومُعقّدة.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;"><code>()get_posts</code></span> و<span style="font-family:courier new,courier,monospace;"> ()<code>get_pages</code></span> وذلك للاستعلامات المُخصّصة والبسيطة في جلب المنشورات والصفحات.
	</li>
</ul>
<p>
	يُمكن الخلط والمزج بين الطرق السابقة وذلك لإنشاء مواقع ووردبريس مُتقدّمة ولعرض البيانات بالكيفيّة المطلوبة.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://premium.wpmudev.org/blog/creating-custom-queries-wordpress/" rel="external nofollow">5Simple Methods for Creating Custom Queries in WordPress</a> لصاحبته Rachel McCollin.
</p>
]]></description><guid isPermaLink="false">144</guid><pubDate>Tue, 18 Aug 2015 22:46:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62D;&#x645;&#x627;&#x64A;&#x629; &#x648;&#x625;&#x636;&#x627;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x646;&#x633;&#x62E; &#x627;&#x644;&#x627;&#x62D;&#x62A;&#x64A;&#x627;&#x637;&#x64A; &#x641;&#x64A; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%A7%D9%84%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%D9%88%D8%A5%D8%B6%D8%A7%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%8A%D8%A7%D8%B7%D9%8A-%D9%81%D9%8A-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r137/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-4.png.f6ef3e4367a8a4546772178eddf511ce.png" /></p>

<div id="wmd-preview-section-8">
	<p>
		تحدثنا في السابق عن بضع <a href="https://academy.hsoub.com/programming/php/wordpress/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%88%D8%AA%D8%B3%D8%AC%D9%8A%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%AF%D8%AE%D9%88%D9%84-%D8%A8%D8%A3%D9%85%D8%A7%D9%86-r132/" rel="">خطوات يمكنك تطبيقها لزيادة أمان وحماية موقعك</a> العامل بسكربت ووردبريس الشهير. صحيحٌ أنّ نواة ووردبريس آمنة للغاية، ولكن يجب عليك تثبيت عدّة إضافات وملحقات إضافية لزيادة مستوى أمان موقعك. سنتحدّث في هذا الدرس عن أهم إضافات الأمان والنسخ الاحتياطي التي يمكنك تثبيتها وتفعيلها على سكربت ووردبريس الشهير.
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-4.png.54ef9c469cfe220cb46c0d32ec49990f.png" data-fileid="3523" rel=""><img alt="wordpress-guide-to-security-4.thumb.png." class="ipsImage ipsImage_thumbnailed" data-fileid="3523" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-4.thumb.png.c7c762e0e1566e028cd2bff72a198302.png"></a>
	</p>
</div>

<div id="wmd-preview-section-9">
	<h2 id="لماذا-قد-أحتاج-إضافة-للحماية">
		لماذا قد أحتاج إضافة للحماية؟
	</h2>

	<p>
		بشكلٍ عام، تقوم إضافات الحماية والأمان بتوفير طبقة إضافية من الحماية ضدّ هجمات Bruteforce والهجمات الأخرى والبرمجيات الخبيثة التي قد تصيب موقعك، يمكنها أيضًا أن توفّر لك عدّة أدوات يمكنك استخدامها لتقليل المخاطر الأمنية المحيطة بك، كما توفّر بعض الأدوات للمراجعات اليدوية الدورية أيضًا. هناك إضافات أخرى للنسخ الاحتياطي تمكّنك من استرجاع موقعك بسرعة في حال ما إذا تمّ اختراقه.
	</p>

	<p>
		لهذا، سنتطرّق الآن إلى أهم الإضافات للحماية والأمان والنسخ الاحتياطي التي يمكنك استخدامها.
	</p>
</div>

<div id="wmd-preview-section-10">
	<h2 id="ithemes-security">
		iThemes Security
	</h2>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/001.png.98fb9e6966a342699656597b5d36dbe4.png" data-fileid="3466" rel=""><img alt="001.thumb.png.9193b64781893ac7c60d0ba41b" class="ipsImage ipsImage_thumbnailed" data-fileid="3466" src="https://academy.hsoub.com/uploads/monthly_2015_08/001.thumb.png.9193b64781893ac7c60d0ba41b62ccef.png"></a>
	</p>

	<p>
		تعتبر هذه الإضافة شهيرةً جدًا عندما يتعلّق الأمر بمجال أمان ووردبريس. كانت هذه الإضافة تدعى بالسابق "WP Security" ولكن تمّ تغيير اسمها. توفّر لك هذه الإضافة عدّة طرق لحماية موقعك. في الواقع، تقوم إضافة <a href="https://wordpress.org/plugins/better-wp-security/" rel="external nofollow">iThemes Security</a> بالعديد من الأمور التي ذكرناها بالدروس السابقة تلقائيًا، مثل تغيير اسم المستخدم الرئيسي ورابط صفحة تسجيل الدخول، إزالة وسم generator والمزيد.
	</p>

	<p>
		كما تعرض عدّة أدوات للحماية مثل فحوصاتٍ دورية لملفّات موقعك للبحث عن الثغرات الأمنية والملفّات الخبيثة إن وجدت، مما يحسّن من أمان موقعك، كما أنّها تقوم بحظر المستخدمين الذين يفشلون بتسجيل الدخول لأكثر من مرّة عن طريق الـIP، وتحظر ربوتات الاختراق الشهيرة، وتفرض على المستخدمين اختيار كلمات مرورٍ قويّة.. والمزيد.
	</p>

	<p>
		توفّر إضافة iThemes Security ميزات التنبيه، حيث يمكنها أن تقوم بتنبيهك عندما يتم إجراء تغييراتٍ ما دون صلاحيات. يمكنها أن تلتقط الروبوتات التي تحاول اختراقك ويمكنها أن ترسل رسالة بريدٍ إلكتروني في حال التقطت أيًّا منها. توفّر الإضافة ميّزة النسخ الاحتياطي كذلك، حيث أنّها قادرة على أخذ نسخة احتياطية من جميع ملفّات موقعك وتدويناتك التي نشرتها، ويمكنها استعادتها في أيّ وقتٍ تريده.
	</p>

	<p>
		هناك إصدارٌ مدفوع من الإضافة كذلك ويوفّر ميّزاتٍ أكثر.
	</p>
</div>

<div id="wmd-preview-section-11">
	<h2 id="all-in-one-wp-security-firewall">
		All in One WP Security &amp; Firewall
	</h2>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/002.png.138e8d8db7e44d316a9fa5b22611cb87.png" data-fileid="3467" rel=""><img alt="002.thumb.png.ccc1ef8fd0bc72545352adbca4" class="ipsImage ipsImage_thumbnailed" data-fileid="3467" src="https://academy.hsoub.com/uploads/monthly_2015_08/002.thumb.png.ccc1ef8fd0bc72545352adbca42791ad.png"></a>
	</p>

	<p>
		خيارٌ آخر متوفّر أمامك هو إضافة <a href="https://wordpress.org/plugins/all-in-one-wp-security-and-firewall/" rel="external nofollow">All in One WP Security &amp; Firewall</a>، تتميز هذه الإضافة بسهولة تثبيتها وإعدادها مما يجعلها خيارًا جيَدًا للمدونين الجدد. تتضمن أيضًا نظام تقييم للحماية يحدد لك مدى أمان موقعك بوضعه الحالي. يمكنك من هناك تفعيل أو تعطيل مميزاتٍ معيّنة للأمان والحماية في موقعك حسبما تريده.
	</p>

	<p>
		تسمح لك هذه الإضافة المجانية كذلك بإعداد العديد من إجراءات الحماية بمجرّد بضع ضغطات، مثل تغيير اسم المستخدم "admin"، التعرّف على المستخدمين الذين يمتلكون أكثر من حساب وتفعيل أداة تقوية كلمات المرور.
	</p>

	<p>
		كما تحتوي الإضافة على ميزة تمنع هجمات Bruteforce على موقعك عبر حظر محاولات تسجيل الدخول الفاشلة لأكثر من مرّة. يمكنك أيضًا فرض تسجيل الخروج على حسابٍ معيّن، تتبع سجل النشاط الخاصّ به والمزيد.
	</p>

	<p>
		تتضمن الإضافة أيضًا مزايا حماية قواعد البيانات والملفّات، بالإضافة إلى إمكانية إنشاء ملفّ <span style="font-family:courier new,courier,monospace;">htaccess.</span> عبرها وعمل النسخ الاحتياطية لملفّ <span style="font-family:courier new,courier,monospace;">wp-config.php.</span>
	</p>

	<p>
		هناك ميزة أخرى مهمّة بهذه الإضافة وهي ميّزة الجدار الناري، حيث تسمح لك بتعديل ملفّ <span style="font-family:courier new,courier,monospace;">htaccess.</span> لتمنع المخترقين حتّى من الوصول إلى الشفرة الخاصّة بموقعك. كما أنّها تحتوي على فاحص ملفّات، الحماية من نسخ النصوص، حماية ضد هجمات السخام (Spam)، تحديثات تلقائية والمزيد.
	</p>
</div>

<div id="wmd-preview-section-12">
	<h2 id="sucuri-security">
		Sucuri Security
	</h2>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/003.png.d28c609c7fa13319603228b796790afa.png" data-fileid="3468" rel=""><img alt="003.thumb.png.d8484144a68699dff4996c3ccd" class="ipsImage ipsImage_thumbnailed" data-fileid="3468" src="https://academy.hsoub.com/uploads/monthly_2015_08/003.thumb.png.d8484144a68699dff4996c3ccdb55231.png"></a>
	</p>

	<p>
		<a href="https://wordpress.org/plugins/sucuri-scanner/" rel="external nofollow">Sucuri Security</a> هي إضافة أخرى شائعة لحماية ووردبريس. تسمح لك ميزة SiteCheck المُضمّنة بالتحقق من حالة موقعك الحالية وفحصه لإيجاد الثغرات الموجودة به بالإضافة للبحث عن البرمجيات الخبيثة إن وجدت. تمكّنك الميزة كذلك من البحث عن جميع أنواع الثغرات، مثل ثغرات حقن قواعد البيانات، محاولات التصيّد الاحتيالي، إعادة التوجيه المشبوهة.. إلخ، كما يمكنها أن تلتقط أكواد جافاسكربت وPHP الخبيثة إن وجدت.
	</p>

	<p>
		تستخدم الإضافة أكثر من واجهة تطبيق برمجية واحدة (<abbr title="واجهة برمجية | Application Programming Interface"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>) لفحص موقعك، أيّ أنّها تستخدم أكثر من قاعدة بيانات للشفرات الضارّة والخبيثة الموجودة على الإنترنت للتأكد من أنّ موقعك لا يحتوي على أحدها، مما يوفّر فحصًا شاملًا لموقعك، تتضمن هذه المصادر الخارجية أسماءً عريقة مثل Norton, McAfee.. إلخ.
	</p>

	<p>
		هناك بعض المزايا الموجودة بالإضافة والتي توفّر الحماية لمسار رفع ملفّات الوسائط الخاصّ بموقعك، حيث تقيّد الوصول إلى مجلّديّ <span style="font-family:courier new,courier,monospace;">wp-content</span> و<span style="font-family:courier new,courier,monospace;">wp-includes</span>، تتحقق من إصدارات PHP ووردبريس وتعطّل محرر الإضافات والقوالب من لوحة التحكم.
	</p>
</div>

<div id="wmd-preview-section-13">
	<h2 id="wordfence-security">
		Wordfence Security
	</h2>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/004.png.53d9c897ec7205f776f138ebb45eb2a4.png" data-fileid="3469" rel=""><img alt="004.thumb.png.96c67e4ea226a175c24c936d21" class="ipsImage ipsImage_thumbnailed" data-fileid="3469" src="https://academy.hsoub.com/uploads/monthly_2015_08/004.thumb.png.96c67e4ea226a175c24c936d21b8afaa.png"></a>
	</p>

	<p>
		تحدّثنا من قبل عن إضافة <a href="https://wordpress.org/plugins/wordfence/" rel="external nofollow">Wordfence Security</a>، وقلنا أنّها من أهم إضافات الحماية لسكربت ووردبريس. بمجرّد تثبيتها على موقعك فإنّها ستقوم بعملية فحصٍ شامل للشفرة المصدرية للتأكّد من أنّها مطابقة للشفرة المصدرية الخامّة المنشورة من موقع ووردبريس الرئيسي، إذا اكتمل الفحص بنجاح، فإنّ الإضافة تقوم بعدها تلقائيا بتفعيل خيارات الحماية لزيادة أمان موقعك.
	</p>

	<p>
		هناك إصدار مدفوع ومجاني من الإضافة، كلاهما يعتمدان على منصّة "Wordfence Cloud"، مما يعني أنّ عملية الفحص وتفعيل الجدار الناري بالواقع تجريان على خواديم الشركة المطوّرة للاستضافة وليس على خادومك مما يقلل من الحمل الموجود عليه.
	</p>

	<p>
		توفّر هذه الإضافة دعمًا لأكثر من موقع ووردبريس في آنٍ واحد، تسجيل الدخول عبر الهاتف المحمول، دعم للإضافات الشهيرة مثل WooCommerce، الاستيثاق الثنائي، فرض كلمات المرور القوية، فحص الملفّات والمزيد. تتضمن الإضافة أيضًا جدارًا ناريًا لحماية موقعك من الروبوتات، البرمجيات الخبيثة وهجمات Bruteforce. بمجرّد تثبيتها فإنك ستكون قادرًا على حظر المهاجمين واتصالات الشبكات المشبوهة، وكلّه في الوقت الحقيقي (Real time).
	</p>
</div>

<div id="wmd-preview-section-14">
	<h2 id="bruteprotect">
		BruteProtect
	</h2>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/005.png.a41cacd8c2597dfbfdd4553f3bb897cc.png" data-fileid="3470" rel=""><img alt="005.thumb.png.5ce91f39dcf661239a9cdd24aa" class="ipsImage ipsImage_thumbnailed" data-fileid="3470" src="https://academy.hsoub.com/uploads/monthly_2015_08/005.thumb.png.5ce91f39dcf661239a9cdd24aa12a321.png"></a>
	</p>

	<p>
		تمّ شراؤها مؤخرًا من قبل شركة Automattic (الشركة المطوّرة لووردبريس)، إضافة <a href="https://bruteprotect.com/" rel="external nofollow">BruteProtect</a> هي أحد الحلول الأمنية التي يمكنك استخدامها لصدّ هجمات Bruteforce بالتحديد. توفّر الإضافة أدواتٍ لمراقبة الهجمات الحالية على موقعك في حال حصولها بالوقت الحقيقي بالإضافة إلى التحديث التلقائي لنواة ووردبريس في موقعك.
	</p>

	<p>
		الإضافة ليست مجهّزة لحمايتك ضد الهجمات الأخرى، بل فقط ضدّ هجمات Bruteforce فلا تعتمد عليها لوحدها.
	</p>
</div>

<div id="wmd-preview-section-15">
	<h2 id="acunetix-wp-security">
		Acunetix WP Security
	</h2>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/006.png.776886fb34758c63eb371095c30352c8.png" data-fileid="3471" rel=""><img alt="006.thumb.png.3a5aa5e30620b313883ca4e2d2" class="ipsImage ipsImage_thumbnailed" data-fileid="3471" src="https://academy.hsoub.com/uploads/monthly_2015_08/006.thumb.png.3a5aa5e30620b313883ca4e2d2ba51f8.png"></a>
	</p>

	<p>
		<a href="https://wordpress.org/plugins/wp-security-scan/" rel="external nofollow">Acunetix WP Security</a> هي إضافةٌ أخرى مجانية لفحص موقعك بسهولةٍ ويسر. تمكّنك من إعداد صلاحيات الملفّات، تأمين قاعدة البيانات، إخفاء إصدار ووردبريس الحالي الذي تستخدمه عن أعين المخترقين، تغيير اسم المستخدم admin والمزيد.
	</p>

	<p>
		تتوافق الإضافة مع مواقع ووردبريس المتعددة (multisite) وعمليات النسخ الاحتياطي، كما تتضمّن أداةً تعمل بالوقت الحقيقي لعرض من يتصفّح موقعك حاليًا وماذا يتصفّحون.
	</p>
</div>

<div id="wmd-preview-section-16">
	<h2 id="bulletproof-security">
		Bulletproof Security
	</h2>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/007.png.ef2aa1da18021254f4ed73c079b7dc84.png" data-fileid="3472" rel=""><img alt="007.thumb.png.9c13aceb3e4709866d0d93efac" class="ipsImage ipsImage_thumbnailed" data-fileid="3472" src="https://academy.hsoub.com/uploads/monthly_2015_08/007.thumb.png.9c13aceb3e4709866d0d93efac0ceaec.png"></a>
	</p>

	<p>
		آخر إضافة ووردبريس سنتحدث عنها هي إضافة <a href="http://wordpress.org/plugins/bulletproof-security/" rel="external nofollow">Bulletproof Security</a>. توفّر هذه الإضافة العديد من المزايا التي توفّرها الإضافات الأخرى مثل ملفّات<span style="font-family:courier new,courier,monospace;"> htaccess.</span> ، حفظ نسخة احتياطية من قاعدة البيانات، سمات مختلفة لواجهة الإضافة والمزيد.
	</p>

	<p>
		يتضمّن الإصدار المدفوع منها المزيد من المميزات مثل التثبيت بنقرة واحدة، الاستعادة التلقائية، جدار ناري يتعامل مع عناوين الـIP للمستخدمين، مسجّل للأخطاء، حامٍ من هجمات Bruteforce، حظر عناوين IP معيّنة والمزيد.
	</p>
</div>

<div id="wmd-preview-section-17">
	<h2 id="أهمية-إضافات-النسخ-الاحتياطي">
		أهمّية إضافات النسخ الاحتياطي
	</h2>

	<p>
		بجانب إضافة قويّة للحماية والأمان، فإنّه يجب عليك استخدام إضافةٍ أخرى لعمليات النسخ الاحتياطي، معظم هذه الإضافات السابق ذكرها يتضمّن الميّزتين بالواقع مما يسهّل عليك الأمر، ولكن لا تنسى بتاتًا استخدام النسخ الاحتياطي.
	</p>

	<p>
		القيام دوريًا بعمل نُسخ احتياطية من موقعك هو أمرٌ مهم لخطّة أمان كاملة، وإلّا فكيف تتوقع أن تقوم باسترجاع موقعك في حال تمّ اختراقه مثلًا؟ هناك العديد من الإضافات الجيّدة للنسخ الاحتياطي مثل <a href="https://vaultpress.com/" rel="external nofollow">VaultPress</a> ،<a href="https://wordpress.org/plugins/wordpress-backup-to-dropbox/" rel="external nofollow">WordPress Backup to Dropbox</a> و <a href="http://ithemes.com/purchase/backupbuddy/" rel="external nofollow">BackupBuddy</a>. تتنوّع هذه الإضافات ما بين المدفوعة والمجانية، ولكنّها مفيدة لضمان عدم فقدان أيّ شيء مهم يتعلّق بموقعك.
	</p>
</div>

<div id="wmd-preview-section-18">
	<h2 id="الخاتمة">
		الخاتمة
	</h2>

	<p>
		صحيحٌ أنّه يمكنك القيام بالعديد من الأمور يدويًا لتحسين حماية ووردبريس، ولكن استخدام الإضافات قد يوفّر عليك الكثير من الوقت ويوفّر لك الكثير من المميزات، خاصةً لو كنتَ تمتلك أكثر من موقع ووردبريس واحد. الإضافات السابق ذكرها يجب أن تؤدّي المهمّة المطلوبة بالنسبة لك ويمكنك تجريبها جميعًا لتصل إلى أفضلٍ واحدةٍ منها بالنسبة لك.
	</p>

	<p>
		في <a href="https://academy.hsoub.com/programming/php/wordpress/%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%D8%A7%D8%AA-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%84%D8%B2%D9%8A%D8%A7%D8%AF%D8%A9-%D8%A7%D9%84%D8%A3%D9%85%D8%A7%D9%86-r139/" rel="">الدرس الأخير</a> من هذه السلسلة سنتحدث عن أهمية تحديث ووردبريس وإضافاته لزيادة أمان موقعك.
	</p>

	<p>
		ترجمة -وبتصرف- للمقال <a href="https://managewp.com/wordpress-security-backup-plugins" rel="external nofollow">The WordPress Developer’s Guide to Security: Security &amp; Backup Plugins</a> لصاحبته Brenda Barron.
	</p>
</div>
]]></description><guid isPermaLink="false">137</guid><pubDate>Fri, 14 Aug 2015 07:06:00 +0000</pubDate></item><item><title>&#x625;&#x62F;&#x627;&#x631;&#x629; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633; &#x648;&#x62A;&#x633;&#x62C;&#x64A;&#x644;&#x627;&#x62A; &#x627;&#x644;&#x62F;&#x62E;&#x648;&#x644; &#x628;&#x623;&#x645;&#x627;&#x646;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%88%D8%AA%D8%B3%D8%AC%D9%8A%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%AF%D8%AE%D9%88%D9%84-%D8%A8%D8%A3%D9%85%D8%A7%D9%86-r132/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-3.png.fd5225593510d1ecfa9e0e24482861d5.png" /></p>

<div id="wmd-preview-section-32">
	<p>
		في الدرس السابق تحدثنا عن <a href="https://academy.hsoub.com/programming/php/wordpress/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%A8%D8%A3%D9%85%D8%A7%D9%86-r130/" rel="">طرق تثبيت ووردبريس لأول مرة بأمان</a>. في هذا الدرس، سنتحدّث عن كيفية تأمين موقع ووردبريس بعد تثبيته، سنتحدّث عن أساليب أفضل للحماية فوق مستوى نصائح "اختر كلمة مرور أكثر تعقيدًا" وسنحاول الغوص قليلًا في موضوع أمان ووردبريس.
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-3.png.4f8d0cc8c9e3de3a3e6785a2a11e8090.png" data-fileid="3522" rel=""><img alt="wordpress-guide-to-security-3.thumb.png." class="ipsImage ipsImage_thumbnailed" data-fileid="3522" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-3.thumb.png.b267a26866188060831cd402025a3b5b.png"></a>
	</p>
</div>

<div id="wmd-preview-section-33">
	<h2 id="تقييد-عمليات-تسجيل-الدخول">
		تقييد عمليات تسجيل الدخول
	</h2>

	<p>
		واحدٌ من أول الأشياء التي يجب عليك فعلها لتأمين موقع ووردبريس الخاصّ بك هو تقييد عدد المرّات التي يمكن لشخصٍ ما أن يحاول تسجيل الدخول بها إلى الموقع. يحاول العديد من المخترقين القيام بهجمات التخمين أو ما يعرف بـ Bruteforce لمحاولة كسر اسم المستخدم / كلمة المرور الخاصّيَن بك، وحتّى لو لم تنجح هذه الهجمات في اختراق موقعك، فإنّه ستقوم باستهلاك جزء كبير من موارد خادومك وستقوم بوضع حملٍ عليه.
	</p>

	<p>
		عبر تقييد عمليات تسجيل الدخول، يمكنك منع المخترقين من محاولة القيام بهجمات Bruteforce. بمجرّد أن يقوم بمحاولة تخمين كلمة المرور مرتين أو ثلاث، فسيتم حظر عنوان الـIP الخاصّ به. يمكنك القيام بهذا الأمر بسهولة عبر تثبيت إصافة <a href="http://wordpress.org/plugins/limit-login-attempts/" rel="external nofollow">Limit Login Attempts</a>، صحيحٌ أنّه لم يتم تحديثها منذ سنتين ولكنّها تمتلك مميزاتٍ رائعة، ولكن ربّما تودّ تجاهلها حاليًا بسبب انقطاع دعمها عن التحديثات الأمنية.
	</p>

	<p>
		عوضًا عن هذا، فإننا ننصح بإضافة <a href="http://wordpress.org/plugins/login-lockdown/" rel="external nofollow">Login Lockdown</a>، تسمح لك هذه الإضافة أيضًا بتقييد عدد مرّات تسجيل الدخول الفاشلة قبل أن يتم حظر عنوان الـIP الخاصّ بالمستخدم الذي يحاول الدخول، كما يمكنك اختيار المدّة التي تريد حظر عنوان الـIP خلالها، ستصبح هجمات Bruteforce أصعب بكثير بعد تثبيت هذه الإضافة وضبطها، لأنّه سيجب على المخترقين استخدام وسيط (Proxy) بعد كلّ 3 محاولات فاشلة لتسجيل الدخول، وسيجب عليهم تغيير ذلك الوسيط آلاف المرّات ليتمكّنوا من تحقيق الهجوم، وهو الأمر الذي لا يتوفّر لديهم غالبًا.
	</p>
</div>

<div id="wmd-preview-section-34">
	<h2 id="حظر-المستخدمين-الذين-يحاولون-تسجيل-الدخول-باسم-admin">
		حظر المستخدمين الذين يحاولون تسجيل الدخول باسم Admin
	</h2>

	<p>
		من المهم ألّا تستخدم اسم "admin" كاسم مدير الموقع على موقعك، ومن المهم أيضًا أن تقوم بحظر كلّ من يحاول الدخول إلى ذلك المستخدم (طالما أنتَ لستَ المدير، والحساب غير موجود، فلماذا تحاول الدخول؟ إذن فأنتَ مُخترِق)، يمكنك القيام بهذا عن طريق إضافة <a href="https://wordpress.org/plugins/wordfence/" rel="external nofollow">Wordfence</a>.
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/001.png.c78f26ad47e5d2af1dc2e112573d5507.png" data-fileid="3411" rel=""><img alt="001.thumb.png.13d37756181d28432127e471b5" class="ipsImage ipsImage_thumbnailed" data-fileid="3411" src="https://academy.hsoub.com/uploads/monthly_2015_07/001.thumb.png.13d37756181d28432127e471b596884b.png"></a>
	</p>

	<p>
		تسمح لك هذه الإضافة بإعداد ميزة الحظر التلقائي هذه، بالطبع، هناك العديد من المميزات الأخرى في هذه الإضافة التي يمكنك استخدامها من أجل الحماية، مثل الاستيثاق الثنائي (two-factor authentication)، حظر الهجمات الشائعة والمزيد.
	</p>
</div>

<div id="wmd-preview-section-35">
	<h2 id="ضبط-صلاحيات-الملفات-الصحيحة">
		ضبط صلاحيات الملفّات الصحيحة
	</h2>

	<p>
		شيءٌ آخر يمكنك فعله هو ضبط صلاحياتٍ مناسبة للملفّات على موقعك. وفقًا لـ WordPress.org، فإنّ استخدام صلاحيات 777 للملفّات / المجلّدات هو أمرٌ خطير للغاية ويسمح للجميع أن يقوموا بتعديل ملفّات موقعك وإضافة أكواد خبيثة أو حتّى حذف الموقع بالكامل. يجب عليك أن تقوم بوضع صلاحيات 600 لملفّ <span style="font-family:courier new,courier,monospace;">wp-config.php</span>، بينما يجب عليك أن تقوم بتعيين ملفّاتك الأخرى إلى وضع صلاحيات 640 أو 644، كما يجب أن تكون المجلّدات الموجودة على موقعك بالصلاحيات 750 أو 755. يمكنك تعلّم المزيد عن الصلاحيات عبر <a href="http://codex.wordpress.org/Changing_File_Permissions" rel="external nofollow">دليل ووردبريس الرسمي لتغيير الصلاحيات</a>.
	</p>
</div>

<div id="wmd-preview-section-36">
	<h2 id="إنشاء-ملف-htaccess">
		إنشاء ملف htaccess.
	</h2>

	<p>
		إذا كنتَ تريد تركيبة روابط دائمة (permalinks) جميلة لموقعك فإنّك ستحتاج ملفّ <span style="font-family:courier new,courier,monospace;">htaccess.</span> عبر إضافة واحدٍ إلى موقعك فإنّك ستقوم بتحسين مستوى الحماية قليلًا، صحيحٌ أنّه ليس حلًا كاملًا ولا يمكنه فعل شيء جوهري لوحده ولكنّه إضافة جيّدة.
	</p>

	<p>
		هناك <a href="http://www.himpfen.com/htaccess-wordpress/" rel="external nofollow">شرح شامل</a> منشور على الويب حول إنشاء ملفّ <span style="font-family:courier new,courier,monospace;">htaccess.</span> ، لن نقوم بشرح تلك العملية بالكامل هنا لأنّ العملية مشروحة بذاك الدليل بشكلٍ شامل. بمجرّد أن تقوم باتّباع ذاك الشرح فإنّه سيصبح بإمكانك منع الوصول إلى ملفّات معيّنة على موقع ووردبريس الخاصّ بك. إذا لم يكن الناس قادرين على الوصول إلى تلك الملفّات التي تريدها فلن يكونوا قادرين على العبث بها. لزيادة صعوبة اختراق موقع ووردبريس الخاصّ بك ستحتاج إلى إضافة بضع سطور من الأكواد لحظر الوصول إلى ملفّات معينة مثل:
	</p>

	<ul>
<li>
			wp-config.php
		</li>
		<li>
			readme.html
		</li>
		<li>
			license.txt
		</li>
		<li>
			wp-includes directory
		</li>
	</ul>
<p>
		يمكنك أيضًا منع الوصول إلى امتدادات معيّنة للملفّات، مثل ملفّات النسخ الاحتياطي، الإعدادات، السجلات المحفوظة على الخادوم.. إلخ. بشكلٍ عام، يجب حظر الوصول إلى أيّ شيء يتعلّق بالتصميم والتطوير والتوثيق الخاصّ بخلفيّة الموقع (back-end).
	</p>

	<p>
		إذا كنتَ تريد حظر الوصول إلى مجلّد إضافة أو قالب معيّن أو مسارٍ آخر على موقعك، فيمكنك حظر المجلّد بأكمله إن أردت. هذه حركة جيّدة للقيام بها في كلّ مجلّد لا يمتلك بداخله ملفّ <span style="font-family:courier new,courier,monospace;">index. </span>حيث أنّ المجلّدات التي لا تحتوي على ملفّات <span style="font-family:courier new,courier,monospace;">index</span> ستقوم بعرض كلّ الملفّات الموجودة بداخل ذاك المجلّد، مما يعطي معلوماتٍ هامّة يمكن استغلالها من طرف المخترقين، لذا يجب عليك إخفاؤها.
	</p>
</div>

<div id="wmd-preview-section-37">
	<h2 id="إخفاء-صفحة-تسجيل-الدخول">
		إخفاء صفحة تسجيل الدخول
	</h2>

	<p>
		هذا تعديلٌ آخر يمكن القيام به عن طريق <span style="font-family:courier new,courier,monospace;">htaccess.</span> ولكن مختلف قليلًا عن التعديلات الأخرى ولذلك سنذكره هنا. يمكنك حظر وصول أيّ شخص إلى صفحة تسجيل الدخول الخاصّة بموقعك ومنح حقّ الوصول فقط إلى عنوان الـIP الخاصّ بك، وطبعًا، يجب أن يكون هناك مستخدمٌ واحد فقط للموقع بأكمله، وبالتالي فتلك ليست طريقة عملية حقًا لاستخدامها.
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/002.png.bc3da9f663ec4b9ef5895f26c83580d3.png" data-fileid="3412" rel=""><img alt="002.thumb.png.c15bf30a54f7d32f8188a8263a" class="ipsImage ipsImage_thumbnailed" data-fileid="3412" src="https://academy.hsoub.com/uploads/monthly_2015_07/002.thumb.png.c15bf30a54f7d32f8188a8263aa60142.png"></a>
	</p>

	<p>
		إذا كنتَ تريد إبقاء خيارٍ مفتوح لإضافة كتّابٍ ومستخدمين آخرين إلى موقعك لاحقًا، فيمكنك استخدام إضافة <a href="https://wordpress.org/plugins/secure-hidden-login/" rel="external nofollow">Secure Hidden Login</a>. تسمح لك هذه الإضافة بإخفاء حقول الإدخال من صفحة تسجيل الدخول الخاصّة بموقعك، ويتم إظهار حقول الإدخال لاسم المستخدم وكلمة المرور فقط عند الضغط على اختصاراتٍ معيّنة على لوحة المفاتيح، فإن حاول أحدهم فتح صفحة تسجيل الدخول، فلن يتمكّن من ذلك دون أن يعرف ما هي اختصارات لوحة المفاتيح التي تقوم بعرض صفحة تسجيل الدخول.
	</p>
</div>

<div id="wmd-preview-section-38">
	<h2 id="إزالة-وسم-generator">
		إزالة وسم Generator
	</h2>

	<p>
		يقوم المخترقون بكلّ شيءٍ قد يمكّنهم من اختراق موقعك، واحدٌ من هذه الأشياء هو سكربتٌ شهير يستخدمه المخترقون لالتقاط المواقع التي تعمل بإصدارات معيّنة من ووردبريس عبر بصمات الأقدام (Footprints)، بصمات الأقدام هي عبارة عن سطور متعددة من الأكواد يمكن استخدامها للتعرّف على هوية موقع ويب ما، لسوء الحظّ فإن ووردبريس يستخدم هذه البصمات مما يجعل مواقع ووردبريس الموجودة على الشبكة قابلة للاكتشاف بسهولة.
	</p>

	<p>
		قد تبدو بصمة القدم الخاصّة بموقع ووردبريس كشيءٍ مثل:
	</p>
</div>

<div id="wmd-preview-section-39">
	<pre class="html ipsCode prettyprint" data-pbcklang="html" data-pbcktabsize="4">
&lt;meta name="generator" content="WordPress 3.8.4" /&gt;</pre>

	<p>
		يمكنك إزالة هذا الوسم إن أردت من الشفرة المصدرية الخاصّة بموقعك، ولكن ما يزال عليك إضافة الشفرة التالية إلى ملفّ <span style="font-family:courier new,courier,monospace;">functions.php</span> الخاصّ بقالبك:
	</p>
</div>

<div id="wmd-preview-section-40">
	<pre class="php ipsCode prettyprint" data-pbcklang="php" data-pbcktabsize="4">
remove_action('wp_head', 'wp_generator');</pre>

	<p>
		بعد هذا، لن يقوم موقع ووردبريس الخاصّ بك بتعريف نفسه على أنّه موقعٌ يعمل بسكربت ووردبريس، مما يصعّب المهمّة على المُخترقِين.
	</p>
</div>

<div id="wmd-preview-section-41">
	<h2 id="تفعيل-الاستيثاق-الثنائي-two-step-authentication">
		تفعيل الاستيثاق الثنائي Two-Step Authentication
	</h2>

	<p>
		شيءٌ آخر يمكنك فعله لتأمين موقعك هو تفعيل الاستيثاق الثنائي أو ما يدعى بـ Two-Step Authentication. عندما تقوم بطلب خطوتين للاستيثاق من مستخدمي موقعك عوضًا عن خطوة واحدة فإنّك تصعّب الأمر جدًا على المُخترقِين.
	</p>

	<p>
		هناك عدّة إضافات موجودة لتفعيل الاستيثاق الثنائي على ووردبريس ومن بينها: 
	</p>

	<ul>
<li>
			<a href="https://getclef.com/" rel="external nofollow">Clef</a>: بمجرّد تثبيت هذه الإضافة، فإنّ كل ما سيجب عليك فعله هو فتح تطبيق Clef على هاتفك المحمول وتركيز كاميرا الهاتف على شاشة الحاسوب الخاصّة بك، بعدها سيتم فتح القفل الموجود على موقعك وتتمكن من الدخول. 
		</li>
		<li>
			<a href="http://wordpress.org/plugins/duo-wordpress/" rel="external nofollow">Duo Two-Factor Authentication</a>: بعد أن تقوم بإدخال كلمة المرور الخاصّة بك في مربّع الإدخال التقليدي، سيجب عليك إكمال خطوةٍ أخرى لإتمام عملية تسجيل الدخول، مثل تأكيد تسجيل الدخول من على هاتفك الذكي عبر رسالة SMS وغيرها من الطرق.
		</li>
	</ul>
</div>

<div id="wmd-preview-section-42">
	<h2 id="الخاتمة">
		الخاتمة
	</h2>

	<p>
		إدارة الحماية على موقع ووردبريس الخاصّ وإعداد عمليات تسجيل الدخول ليتم تقييدها قدر المستطاع هو أمرٌ قد يستغرق منك بعض الوقت، ولكن بمجرّد أن تكتمل هذه الأمور، فإنّ موقعك سيكون أكثر أمانًا لمستخدميه.
	</p>

	<p>
		ترجمة -وبتصرف- للمقال <a href="https://managewp.com/wordpress-security-management-logins" rel="external nofollow">The WordPress Developer’s Guide to Security: Management &amp; Logins</a> لصاحبته Brenda Barron.
	</p>
</div>
]]></description><guid isPermaLink="false">132</guid><pubDate>Thu, 13 Aug 2015 07:08:00 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x635;&#x641;&#x62D;&#x629; &#x645;&#x631;&#x641;&#x642; &#x645;&#x62A;&#x642;&#x62F;&#x645;&#x629; (attachment page) &#x641;&#x64A; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B5%D9%81%D8%AD%D8%A9-%D9%85%D8%B1%D9%81%D9%82-%D9%85%D8%AA%D9%82%D8%AF%D9%85%D8%A9-attachment-page-%D9%81%D9%8A-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r143/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-attachment-page.png.768ecd0e6454ed4a31e72c1bf4ca4c02.png" /></p>

<p>عادة ما تستخدم الصور لزيادة قبول المقالات ووضوحها، ولكن بالرغم من انتشارها الواسع، فقد أُهملت صفحة المرفق للأسف، وصفحة المرفق هي صفحة مخصصة لمرفق بسيط، صورة مثلًا. لا تخصص العديد من القوالب صفحة للمرفق، مما يعني أن موقعك ومستخدميك يفتقدون مصدر مهم للمعلومات، وإضافة جيدة لـ SEO.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-attachment-page.png.cfc1c71eb5666cda6beb4c07f66d3bd6.png"><img data-fileid="3719" class="ipsImage ipsImage_thumbnailed" alt="wordpress-attachment-page.thumb.png.dbcf" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-attachment-page.thumb.png.dbcff812f2027625048412172717d7d2.png"></a></p><p>في هذا المقال سنشرح صفحة المرفق مع كيفية إنشاءها.</p><h2>ما هو المرفق؟</h2><p>في ووردبريس المرفق هو ملف مرفوع على الموقع، قد يكون صورة، ملف مضغوط، فيلم أو ملف PDF. وتُخزن المرفقات في جدول المقالات بقاعدة بيانات الموقع، أي في نفس المكان الذي تُخزن فيه المقالات والصفحات.</p><p>في الواقع، المرفقات هي مقالات من نوع مختلف – وهو "مرفق”. وهذه الطريقة في التخزين صُممت لتسهيل النفاذ والبحث، مثمرة عن تطوير أسهل وتقدم أسرع.</p><h2>ما هي صفحة المرفق؟</h2><p>صفحة المرفق هي صفحة منفردة. مصطلح الصفحة المنفردة هو مصطلح شامل، يتضمن أنواع مختلفة مثل صفحة المقال المفرد وصفحات المقال المنفرد المُخَصّص. وبما أن المرفق عبارة عن مقال، فهو أيضًا له صفحة منفردة، وتدعى صفحة المرفق.</p><p>الصفحة المنفردة الخاصة بك هي صفحة مُخَصّصة لمقالك، وتعرض العنوان، المحتوى، البيانات الوصفية، التعليقات وما شابه. بالمثل، لا بد أن تكون صفحة المرفق مُخَصّصة للمرفق المعروض. أي لو كان المرفق صورة فيجب أن تحتوي الصفحة على العنوان، الصورة، والوصف، وقد تتضمن التعليقات ومعلومات أخرى عن الصورة.</p><h2>كيف تُعرض صفحة المرفق؟</h2><p>تستخدم كل صفحة في موقع ووردبريس ملف للقالب في عرض محتواها. و يمكنك مطالعة <a rel="external nofollow" href="http://codex.wordpress.org/Template_Hierarchy">الهرم التسلسلي للقوالب</a> لتحدد أي ملف يُستخدم في العرض. يُدعى الملف المستخدم لعرض صفحة المرفق في القالب <span style="font-family:courier new,courier,monospace;">attachment.php</span>. قوالب كثيرة تتجاهل هذا الملف، وتستخدم الملف البديل وهو <span style="font-family:courier new,courier,monospace;">single.php</span>.</p><p>هذا في حد ذاته ليس بمشكلة، فكثير من صفحات المقال المنفرد مبنية بشكل يدعم العرض الجيد للمرفقات بدون أي نص برمجي إضافي. بعض الصفحات المنفردة تستخدم جمل الشروط "<span style="font-family:courier new,courier,monospace;">if-else</span>"، التي تحدد كيفية ظهور الصفحة المنفردة في حالة عرض مرفق.</p><p>للأسف، لا يهتم مطوري القوالب بتصميم صفحة المرفق، إذ أنهم عادة ما يكتفون بتصميم صفحة المقالة المنفردة، مما يثمر عن نتائج غير مستحبة:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/create-attachment-page-1.png.8992e8e7ab65f91d5980c9b29c6ce981.png"><img data-fileid="3712" class="ipsImage ipsImage_thumbnailed" alt="create-attachment-page-1.thumb.png.4fbe9" src="https://academy.hsoub.com/uploads/monthly_2015_08/create-attachment-page-1.thumb.png.4fbe97d786b36fe3a38acdf3d8161797.png"></a></p><p>هذا مثال توضيحي لعرض صفحة المرفق في قالب X الغني عن التعريف. كما ترى فإنه لا يوضح أي معلومات عن الصورة ويعرضها كصورة مصغرة، بالرغم من أن الصورة كبيرة جدًا في الواقع. بالإضافة إلى فاصل مزدوج نتيجة لجزء فارغ لعدم وجوده في قسم المعلومات التفصيلية.</p><p>يمكن لمطوري القوالب أداء أفضل من ذلك بتخصيص صفحات المرفق بحيث تعرض روابط إلى الصور التالية والسابقة، ومعلومات تفصيلية متعلقة بالصورة وهكذا دواليك. انظر إلى المثال الموضح من موقعي الخاص الذي يستخدم قالب Twenty Fifteen، القالب الافتراضي لووردبريس.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/create-attachment-page-2.png.c99d7c50d997f742c938192ca7bf949f.png"><img data-fileid="3713" class="ipsImage ipsImage_thumbnailed" alt="create-attachment-page-2.thumb.png.fd944" src="https://academy.hsoub.com/uploads/monthly_2015_08/create-attachment-page-2.thumb.png.fd944401f1d278ae92247b67e5c33a19.png"></a></p><p>ستجد أن الصورة معروضة مع الوصف المناسب أسفلها. وهي معروضة بأكبر مساحة تتناسب مع مقاييس الصفحة والأبعاد الأصلية مذكورة ضمن المعلومات التفصيلية. وهناك أيضًا جزء غير ظاهر في المثال هو استمارة التعليق ورابط إلى المقال الذي نشرت فيه الصورة. هذا أفضل بكثير!</p><h2>كيف أصل إلى صفحة المرفق؟</h2><p>أسهل طريق للوصول إلى صفحة المرفق هو الذهاب إلى قسم الوسائط في لوحة التحكم، ثم اختيار الصورة التي تريدها، وستجد خيار مشاهدة صفحة المرفق "View attachment page” تحت عنوان الصورة.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/create-attachment-page-3(adjusted).png.3ae7122f7f4d12010c5d4980703fb25b.png"><img data-fileid="3714" class="ipsImage ipsImage_thumbnailed" alt="create-attachment-page-3(adjusted).thumb" src="https://academy.hsoub.com/uploads/monthly_2015_08/create-attachment-page-3(adjusted).thumb.png.71ff374094ef8f18803d421293752937.png"></a></p><p>يمكنك أيضًا استنتاج رابط الصفحة بسهولة إذا كنت تعلم رابط المقال المرفق إليه، ويستخدم موقعك روابط دائمة واضحة. فمثلًا إذا كان رابط المقال هو "<a rel="external nofollow" href="http://mywebsite.com/my-post/%E2%80%9D">http://mywebsite.com/my-post/”</a> واسم ملف الصورة شيء مثل "<span style="font-family:courier new,courier,monospace;">my-image.jpg</span>”، فمن المحتمل أن يكون رابط صفحة المرفق للصورة هو "<a rel="external nofollow" href="http://mywebsite.com/my-post/my-image/%E2%80%9D.">http://mywebsite.com/my-post/my-image/”.</a></p><h2>كيف تنشء صفحة مرفق</h2><p>سنستخدم في مثالنا هذا قالب <a rel="external nofollow" href="https://wordpress.org/themes/hueman/">Hu</a><a rel="external nofollow" href="https://wordpress.org/themes/hueman/">e</a><a rel="external nofollow" href="https://wordpress.org/themes/hueman/">man</a> المجاني، قالب رائع لكن ينقصه عرض لطيف لصفحة المرفق.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/create-attachment-page-4.png.13a2c2e310d2dd059c3084ddc5d66f71.png"><img data-fileid="3716" class="ipsImage ipsImage_thumbnailed" alt="create-attachment-page-4.thumb.png.b3fd5" src="https://academy.hsoub.com/uploads/monthly_2015_08/create-attachment-page-4.thumb.png.b3fd5c9f5e671c2a1c9ce9bd351bb0cc.png"></a></p><h3>ملف صفحة المرفقات</h3><p>سنبدأ بإنشاء <a href="https://academy.hsoub.com/code/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%A6-%D9%82%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%81%D8%B1%D8%B9%D9%8A-r107/">قالب فرعي</a> قبل إجراء أي تعديلات. وهذا سيكون صعبًا بعض الشيء لإنك ستحتاج لنسخ ملفات قالبك الحالي كيفما أمكن للتأكد من أن قالبك الجديد مماثل في الرؤية مع القالب الرئيسي.</p><p>وتعتمد صعوبة أو سهولة هذه الخطوة على وضوح النص البرمجي للقالب الخاص بك. حيث توجد قوالب عديدة صعب قراءة نصها البرمجي، مما يؤثر على سهولة عملية التعديل.</p><p>بدايةً، أنشء ملف <span style="font-family:courier new,courier,monospace;">attachment.php</span> في قالبك الفرعي. ويمكنك التأكد من هذه الخطوة بزيارة صفحة المرفق. يجب أن تكون بيضاء، حيث أن الملف نفسه فارغ. ثم انسخ محتويات ملف <span style="font-family:courier new,courier,monospace;">single.php</span> بالكامل من القالب الرئيسي إلى ملف <span style="font-family:courier new,courier,monospace;">attachment.php</span> الجديد. وعندئذ عندما تفتح صفحة المرفق مجددًا فيجب أن تجدها عادت كما كانت سابقًا إذ أنها تستخدم نفس الكود (لا تنس أن ووردبريس يستخدم ملف صفحة المقال المنفرد في حالة عدم وجود ملف صفحة المرفق)، فقط من ملف مختلف.</p><h3>تخصيص صفحة المرفق</h3><p>نريد أن نتجنب التعديلات غير الضرورية في الملف. وستجد بالنظر إلى النص البرمجي أن ما نحتاج إلى تغييره هو ما يقع ضمن عنصر <span style="font-family:courier new,courier,monospace;">post-inner.</span> فقط. وهذا يعني، في النسخة التي نعمل عليها، كل شيء يقع ضمن السطور 12-27 في هذا الملف. وهذا ما صار إليه الآن:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">&lt;h1 class="post-title"&gt;&lt;?php the_title(); ?&gt;&lt;/h1&gt;
&lt;p class="post-byline"&gt;
  &lt;?php _e('by','hueman'); ?&gt; 
  &lt;?php the_author_posts_link(); ?&gt; &amp;middot; 
  &lt;?php the_time(get_option('date_format')); ?&gt;
&lt;/p&gt;

&lt;?php if( get_post_format() ) { 
  get_template_part('inc/post-formats'); 
} ?&gt;

&lt;div class="clear"&gt;&lt;/div&gt;

&lt;div class="entry"&gt;
  &lt;div class="entry-inner"&gt;
    &lt;?php the_content(); ?&gt;
    &lt;?php wp_link_pages(array('before'=&gt;'&lt;div class="post-pages"&gt;'.__('Pages:','hueman'),'after'=&gt;'&lt;/div&gt;')); ?&gt;
  &lt;/div&gt;
  &lt;div class="clear"&gt;&lt;/div&gt;
&lt;/div&gt;&lt;!--/.entry--&gt;</pre><p dir="rtl">والآن سننشء التصميم الذي يُظهر الصورة بالأعلى، يليها العنوان والوصف. دعنا نتخلص من قسم البيانات الوصفية بالإضافة إلى جزء أنواع المقالات إذ لا نحتاجهم.</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">&lt;?php echo wp_get_attachment_image( get_the_ID(), 'large' ); ?&gt;

&lt;h1 class="post-title"&gt;&lt;?php the_title(); ?&gt;&lt;/h1&gt;

&lt;div class="entry"&gt;
  &lt;div class="entry-inner"&gt;
    &lt;?php the_content(); ?&gt;
  &lt;/div&gt;
  &lt;div class="clear"&gt;&lt;/div&gt;
&lt;/div&gt;&lt;!--/.entry--&gt;</pre><p dir="rtl">يوضح النص البرمجي بالأعلى المحتوى المُعدل الذي يقع ما بين وسميّ البداية والنهاية لعنصر <span style="font-family:courier new,courier,monospace;">post-inner.</span> وقد استخدمت وظيفة <span style="font-family:courier new,courier,monospace;">()wp_get_attachment_image</span> لاستحضار الصورة بتوفير رقم ID للمقال الحالي – لا تنس أنه أيضًا رقم ID للصورة حيث أننا في صفحة المرفق – واخترت الحجم الكبير للصورة.</p><p dir="rtl">والآن أصبح لدينا العنوان والوصف بنفس تنسيق القالب الأصلي. وحذفت قسم البيانات الوصفية وترقيم الصفحات للمقال، الآن أصبح أفضل بكثير:</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/create-attachment-page-5.png.2fbea7b0cab7baae6e10c7d1ba59acfc.png"><img data-fileid="3717" class="ipsImage ipsImage_thumbnailed" alt="create-attachment-page-5.thumb.png.73cfe" src="https://academy.hsoub.com/uploads/monthly_2015_08/create-attachment-page-5.thumb.png.73cfefd26cccd6dfe7f52726e8a7612b.png"></a></p><p dir="rtl">يمكننا الاكتفاء بهذا، لكني أريد أن أعرض فكرة لإضافة تفاصيل أكثر إلى الصفحة، دعنا نضيف روابط للأحجام المختلفة من الصورة لتسهيل التحميل. عن طريق وظيفة <span style="font-family:courier new,courier,monospace;">()wp_get_attachment_metadata </span>التي تتيح عرض قائمة لكل أحجام الصورة وتصفحها في حلقة Loop. وهذا مثال لكتابتها:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">&lt;div class="entry"&gt;
  &lt;div class="entry-inner"&gt;
    &lt;?php the_content(); ?&gt;
    &lt;p class='resolutions'&gt; Downloads:
      &lt;?php
        $images = array();
        $image_sizes = get_intermediate_image_sizes();
        array_unshift( $image_sizes, 'full' );
        foreach( $image_sizes as $image_size ) {
          $image = wp_get_attachment_image_src( get_the_ID(), $image_size );
          $name = $image_size . ' (' . $image[1] . 'x' . $image[2] . ')';
          $images[] = '&lt;a href="' . $image[0] . '"&gt;' . $name . '&lt;/a&gt;';
        }
        echo implode( ' | ', $images );
      ?&gt;
    &lt;/p&gt;
  &lt;/div&gt;

  &lt;div class="clear"&gt;&lt;/div&gt;
&lt;/div&gt;&lt;!--/.entry--&gt;</pre><p dir="rtl">ترى أنني عدّلت محتوى جزئية <span style="font-family:courier new,courier,monospace;">entry.</span>، حيث أضفت عنصرًا جديدًا لعرض الأحجام. وفيه استخرجت أحجام الصورة المعرّفة باستخدام <span style="font-family:courier new,courier,monospace;">()get_intermediate_image_sizes</span>. وما تبقى هو مجرد حلقة بسيطة، تدور عبر أحجام الصورة مع استخراج الأبعاد بالإضافة إلى الرابط لكل صورة. وقد استخدمت هذه البيانات لإنشاء بعض الروابط وكتابتها في النهاية.</p><h1>الختام</h1><p dir="rtl">صفحات المرفق رائعة لأنها توفر لك فرصة لتقدم شيئًا قيمًا للقراء: معلومات أكثر عن صورك، خواطرك عنها، وربما روابط التحميل أو حتى معلومات عن الكاميرا والتقنيات التي استُخدمت في إلتقاطها. هذه المعلومات الغنية لها تقييم عالٍ على جوجل إذا استُخدمت بشكل دائم وصحيح. فهي أكثر من مجرد خاصية جذابة.</p><p dir="rtl">إذا لم تمتلك صفحة مرفق بعد، فإني أقترح عليك إتباع هذا المقال وإنشاءها الآن. يمكنك أيضًا تحميل <a rel="external nofollow" href="https://premium.wpmudev.org/blog/wp-content/uploads/2015/03/hueman-child.zip">قالب </a><a rel="external nofollow" href="https://premium.wpmudev.org/blog/wp-content/uploads/2015/03/hueman-child.zip">Hueman </a><a rel="external nofollow" href="https://premium.wpmudev.org/blog/wp-content/uploads/2015/03/hueman-child.zip">الفرعي</a> الذي أنشأته في هذا المقال، بالرغم من أنه سيكون ذا فائدة فقط إذا استخدمت قالب Hueman بالفعل كقالب رئيسي.</p><p dir="rtl">هل وجدت هذا المقال مفيدًا؟ سنسعد بمعرفة آرائكم والرد على استفساراتكم في التعليقات.</p><p dir="rtl">مترجم بتصرف من مقال <a rel="external nofollow" href="https://premium.wpmudev.org/blog/advanced-attachment-page">Creating an Advanced Attachment Page in WordPress</a> لصاحبه <a rel="external nofollow" href="https://premium.wpmudev.org/blog/author/danielpataki/">Daniel Pataki</a>.</p>
]]></description><guid isPermaLink="false">143</guid><pubDate>Tue, 11 Aug 2015 19:29:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x646;&#x634;&#x626; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x644;&#x625;&#x636;&#x627;&#x641;&#x62A;&#x643; &#x641;&#x64A; &#x644;&#x648;&#x62D;&#x629; &#x62A;&#x62D;&#x643;&#x645; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%A6-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%84%D8%A5%D8%B6%D8%A7%D9%81%D8%AA%D9%83-%D9%81%D9%8A-%D9%84%D9%88%D8%AD%D8%A9-%D8%AA%D8%AD%D9%83%D9%85-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r136/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-plugins-admin-pages.png.352026b6dc5d1571620bdbb290de59c6.png" /></p>

<p dir="rtl">صفحات لوحة التحكم هي روح وقلب الإضافات، ويسهل أن تفترض أنها عبارة عن استمارات متقدمة الغرض منها لتجميع البيانات من المستخدم. ولكن في الواقع، إن صفحات لوحة التحكم هي المكان الأفضل للترحيب بالمستخدمين الجدد، توفير المعلومات عن الإضافة، وعرض التفاصيل المطلوبة للدعم والوثائق.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-plugins-admin-pages.png.97c0538ce226472b1d638ac022b4c3cf.png"><img data-fileid="3674" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-plugins-admin-pages.thumb.png.6aac0d50f2500d627d731d98d40cf767.png" alt="wordpress-plugins-admin-pages.thumb.png."></a></p><p dir="rtl">في هذا المقال القصير سنلقي نظرة على كيفية إضافة هذه الصفحات إلى لوحة تحكم ووردبريس. ويمكنك الاستعانة بهذه المعلومات بالإضافة لدروس أخرى لإنشاء صفحات مبوبة، استخدام خاصية الـ Ajax، وهكذا دواليك.</p><h2 dir="rtl">مكونات صفحة لوحة التحكم</h2><p dir="rtl">هناك مكونين أو ثلاثة لصفحة لوحة التحكم، حسب الوظيفة التي تبني عليها:</p><ol dir="rtl"><li>عنصر قائمة – رئيسي أو فرعي.</li><li>محتوى الصفحة.</li><li>برمجة وظيفة الاستمارات – إذا كانت مطلوبة.</li></ol><p dir="rtl">لن نتحدث في هذا المقال عن الاستمارات ووظيفتها، هذا موضوع آخر. إنما سنكتفي الآن بكيفية إنشاء الصفحات نفسها.</p><h2 dir="rtl">القوائم الرئيسية والفرعية</h2><p dir="rtl">هناك نوعين من عناصر القائمة: رئيسي وفرعي. وأرشح لك –كما يقول <a rel="external nofollow" href="http://codex.wordpress.org/Administration_Menus">Wordpress Codex</a>– أن تدرس ما إذا كانت إضافتك تحتاج إلى عنصر قائمة رئيسي فعلًا. حيث توجد العديد من الإضافات التي تضيف عناصر قائمة رئيسية، مما يؤدي إلى إزدحام لوحة التحكم.</p><p dir="rtl">ومثال على ذلك هو إضافة <a rel="external nofollow" href="https://wordpress.org/plugins/wordtwit/">WordTwit</a>، المسئولة عن إنشاء تغريدات بالمحتوى الجديد. وهي إضافة ممتازة، إلا أنها تضيف عنصر قائمة رئيسي دون الحاجة إليه.</p><p dir="rtl" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_08/wordtwit.png.a49086d8d42ae8f78b0e91481941e484.png"><img data-fileid="3465" class="ipsImage ipsImage_thumbnailed" alt="wordtwit.thumb.png.27505ba06692ce8c89d88" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordtwit.thumb.png.27505ba06692ce8c89d88b1a01385be9.png"></a></p><p dir="rtl">هذا غير ضروري على الإطلاق، وكان من الأفضل الاكتفاء بعنصر فرعي في قائمة الإعدادات. بينما بعض الإضافات الأخرى مثل WooCommerce ،bbPress، وغيرها تضيف عناصر القائمة الرئيسية التي لها فائدة بالفعل، هذا يعتمد فقط على كيفية تفاعل المستخدمين مع منتجك. </p><p dir="rtl"><strong>نصيحة عن خبرة:</strong> إذا كان المستخدم يحتاج للتعامل مع إضافتك بشكل يومي أو مستمر فاستخدم عنصر قائمة رئيسي. أما إذا كانت صفحتك في لوحة التحكم لغرض الإعدادات فقط، فسيكون إدراج عنصر فرعي في قائمة الإعدادات كافيًا.</p><h2 dir="rtl">إنشاء صفحة لوحة تحكم رئيسية</h2><p dir="rtl">أولًا نبدأ بإنشاء عنصر قائمة عن طريق الدالة <span style="font-family:courier new,courier,monospace;">()add_menu_page</span>.  وترى هنا مثالًا لها مع الشرح:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">add_action( 'admin_menu', 'my_admin_menu' );

function my_admin_menu() {
    add_menu_page( 'My Top Level Menu Example', 'Top Level Menu', 'manage_options', 'myplugin/myplugin-admin-page.php', 'myplguin_admin_page', 'dashicons-tickets', 6 );

}</pre><p dir="rtl">تأخذ الدالة سبع معطيات:</p><ol dir="rtl"><li><strong>عنوان الصفحة</strong>، الذي يعرّف وسم العنوان ويظهر في عنوان  صفحة الانترنت في متصفح الانترنت وليس على الشاشة. </li><li><strong>العنوان</strong> الذي يظهر في القائمة.</li><li><strong>الصلاحيات المطلوبة</strong> للدخول إلى القائمة، يمكن استخدامه لحصر الصفحة على المدراء، أو المحررين، أو المؤلفين.</li><li>"<strong>الاسم اللطيف</strong>" أو slug للقائمة، وهو الذي يظهر في رابط الصفحة.</li><li><strong>الوظيفة</strong>، التي تتضمن محتوى الصفحة.</li><li><strong>رابط الأيقونة</strong>. ويقبل العديد من الصيغ. فإذا وُضع رابط صورة سوف تستخدم هذه الصورة. بإمكانك استخدام <a rel="external nofollow" href="https://developer.wordpress.org/resource/dashicons/#tickets">Dashicons</a>، المبنية داخل ووردبريس، أو حتى استخدام ملف SVG.</li><li><strong>الترتيب في القائمة</strong>. وبما أن الوظيفة تختص بالمقالات، فقد اخترنا أن نضع عنصر القائمة بعدها مباشرة، أي في السادس. ويمكنك التعرف على ترتيب العناصر من <a rel="external nofollow" href="http://codex.wordpress.org/Function_Reference/add_menu_page">Wordpress Codex</a>.</li></ol><p dir="rtl">والآن الخطوة التالية هي إنشاء محتوى الصفحات. كل ما تحتاجه هو تعريف الدالة التي حددتها في المُعطى الخامس وكتابة بعض المحتوى. وهذا مثال بسيط لتبدأ به:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">function myplguin_admin_page(){
?&gt;
    &lt;div class="wrap"&gt;
        &lt;h2&gt;Welcome To My Plugin&lt;/h2&gt;
    &lt;/div&gt;
&lt;?php
}</pre><h2 dir="rtl">إنشاء صفحة لوحة تحكم فرعية</h2><p dir="rtl">هناك بعض الوظائف التي يمكن استخدامها لإنشاء صفحات فرعية. والدالة العامة <span style="font-family:courier new,courier,monospace;">()add_submenu_page</span> تمكنك من إنشاء صفحات فرعية في أي مكان، ولكن كل الصفحات الرئيسية لها وظائفها الخاصة لإضافة صفحات فرعية إليها:</p><ul dir="rtl"><li>لإضافة صفحات فرعية إلى قسم المقالات استخدم <span style="font-family:courier new,courier,monospace;">add_posts_page.</span></li><li>لإضافة صفحات فرعية إلى قسم الصفحات استخدم <span style="font-family:courier new,courier,monospace;">add_pages_page.</span></li><li>لإضافة صفحات فرعية إلى قسم الوسائط استخدم <span style="font-family:courier new,courier,monospace;">add_media_page.</span></li><li>لإضافة صفحات فرعية إلى قسم الروابط استخدم <span style="font-family:courier new,courier,monospace;">add_links_page.</span></li><li>لإضافة صفحات فرعية إلى قسم التعليقات استخدم <span style="font-family:courier new,courier,monospace;">add_comments_page.</span></li><li>لإضافة صفحات فرعية إلى قسم المظهر استخدم<span style="font-family:courier new,courier,monospace;"> add_theme_page.</span></li><li>لإضافة صفحات فرعية إلى قسم الإضافات استخدم <span style="font-family:courier new,courier,monospace;">add_plugin_page.</span></li><li>لإضافة صفحات فرعية إلى قسم المستخدمين استخدم <span style="font-family:courier new,courier,monospace;">add_users_page.</span></li><li>لإضافة صفحات فرعية إلى قسم الأدوات استخدم <span style="font-family:courier new,courier,monospace;">add_management_page.</span></li><li>لإضافة صفحات فرعية إلى قسم الإعدادات استخدم <span style="font-family:courier new,courier,monospace;">add_options_page.</span></li></ul><p dir="rtl">كل من الوظائف السابقة تتبع نفس الصياغة:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function); </pre><p dir="rtl">والمُعطىات شبيهة بتلك المذكورة في المثال السابق. ربما تود إضافة عنصر فرعي إلى عنصر قائمتك الرئيسي، وفي هذه الحالة لن تكون الوظائف السابقة ذات نفع لك. بل ستستخدم الدالة <span style="font-family:courier new,courier,monospace;">()add_submenu_page</span>، وهنا سنضيف عنصر فرعي إلى قائمتنا الرئيسية التي أعددناها سابقًا:</p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">add_action( 'admin_menu', 'my_admin_menu' );

function my_admin_menu() {
    add_menu_page( 'My Top Level Menu Example', 'Top Level Menu', 'manage_options', 'myplugin/myplugin-admin-page.php', 'myplguin_admin_page', 'dashicons-tickets', 6 );

    add_submenu_page( 'myplugin/myplugin-admin-page.php', 'My Sub Level Menu Example', 'Sub Level Menu', 'manage_options', 'myplugin/myplugin-admin-sub-page.php', 'myplguin_admin_sub_page' );
}</pre><p>كما يمكنك أن ترى هذه الدالة مشابهة للدوال المذكورة سابقًا، باستثناء المُعطى الأول الذي يحدد الاسم اللطيف المستخدم في رابط الصفحة الرئيسية، وهو في حالتنا هذه:</p><p><span style="font-family:courier new,courier,monospace;"> myplugin/myplugin-admin-page.php.</span></p><h2 dir="rtl">الختام</h2><p dir="rtl">كما ترى، فإن إضافة عناصر إلى القائمة وصفحات محتوى سهل للغاية. الصعوبة تبدأ بعد هذه المرحلة، حيث نختار محتوى الصفحات، كيف نرتبه، استخدام CSS وجافاسكريبت لإظهار المحتوى بتنسيق رائع، التأكد من أن الاستمارات آمنة وموثقة وهكذا دواليك، هذا كله سيتم تغطيته في دروس مستقبلية. هدف هذا الدرس هو فهم أساسيات إنشاء قوائم وصفحات لوحة التحكم لكي تلجأ إليها وقت الحاجة. وسنتطرق إلى حالات معينة في استخدام هذه الخصائص قريبًا.</p><p dir="rtl">هل هناك أي شيء تريد إضافته إلى المقالة؟ أو تريد الاستفسار عنه؟ سنسعد بالرد عليكم في التعليقات.</p><p dir="rtl">مترجم بتصرف من مقال <a rel="external nofollow" href="about:blank">A Quick and Easy Guide To Creating WordPress Admin Pages</a> لصاحبه <a rel="external nofollow" href="https://premium.wpmudev.org/blog/author/danielpataki/">Daniel Pataki</a>.</p><p dir="rtl">حقوق الصورة البارزة: <a href="http://www.freepik.com/free-photos-vectors/car" rel="external nofollow">Car vector designed by Freepik</a>.</p>
]]></description><guid isPermaLink="false">136</guid><pubDate>Fri, 07 Aug 2015 09:42:47 +0000</pubDate></item><item><title>&#x62A;&#x62D;&#x645;&#x64A;&#x644; &#x627;&#x644;&#x645;&#x646;&#x634;&#x648;&#x631;&#x627;&#x62A; &#x62F;&#x64A;&#x646;&#x627;&#x645;&#x64A;&#x643;&#x64A;&#x627; &#x641;&#x64A; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x62A;&#x642;&#x646;&#x64A;&#x629; AJAX</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%AA%D8%AD%D9%85%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D9%86%D8%B4%D9%88%D8%B1%D8%A7%D8%AA-%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A%D8%A7-%D9%81%D9%8A-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D9%82%D9%86%D9%8A%D8%A9-ajax-r133/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-ajax.png.90055ee5c341ea5af51b387c77800e69.png" /></p>

<div id="wmd-preview-section-22"><p>أصبحت تقنيّة أجاكس موضة العصر في السنوات الأخيرة وعن جدارة واستحقاق، إن تقنيّة أجاكس، والتي هي بمسماها الكامل Asynchronous JavaScript and XML، هي طريقة لإجراء "محادثة" مع الخادوم، وعرض النتائج بدون إعادة تحميل الصّفحة.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-ajax.png.287564788e48a12e9946822063c92b34.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="3670" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-ajax.thumb.png.0484fb22e6382895e3a131f9c08baeb6.png" class="ipsImage ipsImage_thumbnailed" alt="wordpress-ajax.thumb.png.0484fb22e638289"></a></p><p>يُقدّم هذا الأسلوب للمطورين أمور عدّة:</p><ul><li>تحديث عدّاد الإعجاب (زر أعجبني).</li><li>إضافة عناصر إلى سلّة التسوّق.</li><li>إنشاء نماذج (forms) ديناميكيّة.</li><li>وإليه من هذه الأمور، وكل ذلك بدون إعادة تحميل الصّفحة</li></ul><p>ستتطرّق هذه المقالة إلى كيفيّة تحميل المنشورات (posts) مع تقنيّة أجاكس وباستخدام القالب الافتراضي Twenty Fifteen كمثال وأساس للشرح.</p><p>سيتمّ التطرّق إلى لماذا يجب استخدام أجاكس من خلال مثالٍ مُبسّط، ومن ثُمّ سيتمّ العمل على مثال آخر وتحميل المنشورات باستخدام أجاكس وذلك باستخدام القالب Twenty Fifteen.</p></div><div id="wmd-preview-section-23"><h2 id="لماذا-يجب-استخدام-تقنية-ajax">لماذا يجب استخدام تقنية AJAX؟</h2><p>يَطلب سكريبت ووردبريس المنشورات من قاعدة البيانات عندما يتمّ تحميل الصفحة الأولى للمقالات، ويعرضهم مستخدمًا التوصيف (markup) المحدّد، وبجانب ذلك، سيتم تحميل قوائم التنقّل (navigation menus)، و<a href="https://academy.hsoub.com/code/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D9%86%D9%8A-%D9%88%D8%AF%D8%AC%D8%AA-widget-%D9%84%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3%D8%9F-r99/">الإضافات المُصغّرة ودجت</a> (widgets)، والرسومات، وملفّات جافا سكريبت، والعديد من الأمور الأخرى، وكما توضّح الصورة عدد الطلبات الّتي تمّ تطلبها في الصفحة الواحدة.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/network-requests.png.d9d6920d1234e4a4d858d3e87416092c.png"><img data-fileid="3417" class="ipsImage ipsImage_thumbnailed" alt="network-requests.thumb.png.aeda46b9d718a" src="https://academy.hsoub.com/uploads/monthly_2015_07/network-requests.thumb.png.aeda46b9d718a80b6f81fdae2e02fc7f.png"></a></p><p>يتّضح من الصورة السابقة (المأخوذة من أدوات المطورين الخاصّة بالمُتصفّح كروم) عدد لا بأس به من الأصول الّتي يتمّ تحميلها، وعلى الرغم من أنّه سيتمّ استخدام بعض التقنيات في تحسين الأداء، واستخدام التخبئة (cache) لبعض الأصول (assets) كما هو الأمر مع ملفّات جافا سكريبت، سيبقى عدد الطلبات عددًا لا بأس به.</p><p>وإن تحميل الصّفحة الثّانية من المنشورات سيُحمّل كل ما سبق مرّة أُخرى، حيثُ سيجلب ووردبريس المنشورات ويعرضها باستخدام التوصيف (markup) المحدّد، ويتم تحميل عناصر الصّفحة مرّة أخرى أيضًا، ولذلك يُعتبر هذا الأسلوب مضيعة للموارد في أغلب الحالات، ولا يخدم تجربة المُستخدم أيضًا، فلا أحد يرغب بالانتظار بينما يتمّ استكمال تحميل الصّفحة بطبيعة الحال.</p></div><div id="wmd-preview-section-24"><h2 id="إنشاء-قالب-فرعي-creating-child-theme">إنشاء قالب فرعي Creating Child Theme</h2><p>سيتمّ التعديل على القالب Twenty Fifteen، ولكن قبل ذلك <a href="https://academy.hsoub.com/code/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%A6-%D9%82%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%81%D8%B1%D8%B9%D9%8A-r107/">سيتمّ إنشاء قالب (theme) فرعي</a>، وذلك <a href="https://academy.hsoub.com/code/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D9%8F%D8%AF%D8%AE%D9%84-%D8%AA%D8%B9%D8%AF%D9%8A%D9%84%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%AF%D9%88%D9%86-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%B3-%D8%A8%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D9%8F%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-r103/">للحفاظ على التعديلات</a> في حال تحديث القالب.</p></div><div id="wmd-preview-section-25"><h2 id="البداية-مع-تقنية-ajax">البداية مع تقنية AJAX</h2><p>سيتمّ البدء بمثال مُبسّط يشرح آلية عمل تقنيّة أجاكس، وذلك من خلال روابط <a href="https://academy.hsoub.com/code/php/wordpress/%D8%A7%D9%84%D8%AA%D9%91%D8%B5%D9%81%D9%8A%D8%AD-pagination-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r54/">شريط التصفيح</a> (pagination)، في أسفل الصّفحة بحيثُ عندما يتمّ الضغط على رقم الصّفحة، يتم تحميل الصّفحة ديناميكيًّا، فعندما يتمّ الضغط على أحد هذه الروابط سيتمّ إرسال طلب (request) إلى الخادوم وتنبيه (alert) النتيجة.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/pagination1.png.d1aae424137bb0e9f541537b049fe629.png"><img data-fileid="3419" class="ipsImage ipsImage_thumbnailed" alt="pagination1.thumb.png.aa278a6b7520b4a603" src="https://academy.hsoub.com/uploads/monthly_2015_07/pagination1.thumb.png.aa278a6b7520b4a6032a2cdcdf66dea1.png"></a></p></div><div id="wmd-preview-section-26"><h3 id="صف-ملفات-javascript">صف ملفات JavaScript</h3><p>ستكون الخطوة الأولى هي إنشاء ملفّ جافا سكريبت وصفّه باستخدام ملفّ القالب<span style="font-family:courier new,courier,monospace;"> functions.php</span>.</p><p>تمّ إنشاء المجلّد <span style="font-family:courier new,courier,monospace;">js</span> و الملفّ <span style="font-family:courier new,courier,monospace;">ajax-pagination.js</span> بداخله، ومن ثُمّ إضافة الشيفرة التّالية إلى الملفّ <span style="font-family:courier new,courier,monospace;">functions.php</span>.</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">function my_enqueue_assets() { 
    wp_enqueue_style( 'parent-style', get_template_directory_uri().'/style.css' ); 
    wp_enqueue_script( 'ajax-pagination', get_stylesheet_directory_uri() . '/js/ajax-pagination.js', array( 'jquery' ), '1.0', true ); 
}</pre><p>يُمكن الرجوع إلى المقال <a href="https://academy.hsoub.com/code/php/wordpress/%D8%B5%D9%81%D9%91-%D9%88%D8%AA%D8%B3%D8%AC%D9%8A%D9%84-%D9%85%D9%84%D9%81%D8%A7%D8%AA-javascript-%D9%88-css-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r79/">صفّ وتسجيل ملفات Javascript و CSS في قوالب ووردبريس</a> للمزيد من التفصيل حول صف ملفات جافا سكريبت، ولكن بالمُختصر ما سيتمّ عمله هو إخبار ووردبريس باسم السكريبت (كما في المُعامل الأوّل)، ومكانه (المُعامل الثّاني)، والمُتطلّبات (المُعامل الثّالث)، الإصدار (المعامل الرابع)، والتحميل سيكون في ذيل الصّفحة (المعامل الخامس).</p><p>يجدر الانتباه هنا إلى إنه عند صفّ ملفّ التنسيق، تمّ استخدام<span style="font-family:courier new,courier,monospace;"> ()get_template_directory_uri</span>، وهذه الدالة دائمًا تُشير إلى مسار القالب الرئيسي (parent theme)، وعند صف السكريبت تمّ استخدام <span style="font-family:courier new,courier,monospace;">()get_stylesheet_directory_uri</span>، والّذي يُشير إلى مسار القالب الفرعي (chiled theme).</p><p>بعد أن تمّ تحميل السكريبت في ذيل الصّفحة، يُمكن ببساطة كتابة:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">alert( ‘Script Is Enqueued’ ) </pre><p>داخل الملفّ <span style="font-family:courier new,courier,monospace;">ajax-pagination.js</span>، ومع إعادة تحميل الصّفحة سيتمّ معرفة فيما إذا كان السكريبت يعمل أم لا.</p></div><div id="wmd-preview-section-27"><h3 id="إنشاء-حدث-creating-an-event">إنشاء حدث Creating an Event</h3><p>ستكون الخطوة التّالية هي إنشاء حدث (event) مهمته هي بدء استدعاء (call) أجاكس، وسيكون الحدث في هذه الحالة هو الضغط على رابط مُعيّن، ولاستهداف الرابط يجب معرفة أصناف (classes) العناصر والمعرّفات (IDs) المحيطة به.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/pagination-source1.png.93ce3d1a95fcf557b3953429b240ac18.png"><img data-fileid="3418" class="ipsImage ipsImage_thumbnailed" alt="pagination-source1.thumb.png.69fd9865871" src="https://academy.hsoub.com/uploads/monthly_2015_07/pagination-source1.thumb.png.69fd9865871f0bc8bf125bbf45828a04.png"></a></p><p>يُمكن الوصول إلى الشيفرة السابقة باستخدام أدوات المطورين المُضمّنة ضمن المُتصفّح Chrome.</p><p>توضّح الصورة السابقة كيف أنّ روابط التصفيح تملك الصنف page-numbers، ورابط الصّفحة التّالية يملك الصنف السابق بالإضافة إلى الصنف <span style="font-family:courier new,courier,monospace;">next</span>، وجميعها داخل الوسم <span style="font-family:courier new,courier,monospace;">nav</span> الّذي يملك الصنف<span style="font-family:courier new,courier,monospace;"> nav-links</span>، يوجد أيضًا رابط الصّفحة السابقة، ولكنه لا يظهر في الصورة السابقة، والّذي يحمل الصنف <span style="font-family:courier new,courier,monospace;">prev</span> بالإضافة إلى الصنف<span style="font-family:courier new,courier,monospace;"> page-numbers</span>.</p><p>سيتمّ الآن استهداف أحد الروابط داخل حاوية التصفيح (pagination)، ومن ثم إنشاء تنبيه (alert) وبالرسالة Clicked Link:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">(function($) { 
    $(document).on( 'click', '.nav-links a', function( event ) { 
        event.preventDefault(); alert( 'Clicked Link' ); 
    }) 
})(jQuery);</pre><p>يُلاحظ كيف أنّ كل شيء محتوى داخل دالّة مجهولة (anonymous function)، <a rel="external nofollow" href="http://stackoverflow.com/questions/19610586/javascript-wrapping-code-inside-anonymous-function">وهو ما يُنصح به</a>، بعد ذلك تمّ إنشاء حدث الضغط، ومن ثُمّ منع الوظيفة الافتراضيّة للحدث (تحميل الصّفحة)، ومن ثُمّ عرض رسالة نصيّة باستخدام دالّة التنبيه (alert).</p></div><div id="wmd-preview-section-28"><h3 id="إنشاء-استدعاء-ajax">إنشاء استدعاء AJAX</h3><p>سيتمّ الآن العمل على جلب بيانات ديناميكيّة من الخادوم بدلًا من التعامل مع واجهة الموقع فقط (تنبه نص معدّ مُسبقًا) كما في المثال السابق، ولذلك يجب إتمام بعض الإعداد المُسبق، وذلك للأسباب التّالية:</p><ul><li>يجب إعطاء استدعاء أجاكس رابطًا لاستخدامه هذا أوّلًا.</li><li>ثانيًا، لا يَعلم ملفّ الجافا سكريبت المُنشئ ببيئة العمل الخاصّة بسكريبت ووردبريس.</li></ul><p> لذلك لا يُمكن استخدام دالة على الشكل<span style="font-family:courier new,courier,monospace;"> ()get_stylesheet_directory_uri</span> فيه، ولكن من المُمكن استخدام أسلوب المَوضَعة (localization) لتمرير المُتغيّرات إلى جافا سكريبت، وذلك في الملفّ <span style="font-family:courier new,courier,monospace;">functions.php</span>:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">wp_localize_script( 'ajax-pagination', 'ajaxpagination', array( 'ajaxurl' =&gt; admin_url( 'admin-ajax.php' ) ));</pre><p>إن إضافة الشيفرة السابقة داخل الدالة <span style="font-family:courier new,courier,monospace;">()my_enqueue_assets</span>، سيقوم بتعريف الكائن <span style="font-family:courier new,courier,monospace;">ajaxpagination</span> (المُعامل الثاني)، حيثُ سيَستلم هذا الكائن الـ members الخاصّة به تبعًا إلى المصفوفة المزوّدة كمُعامل ثالث في الدالة <span style="font-family:courier new,courier,monospace;">()wp-localize_script</span>، بمعنى آخر، عندما يتمّ إضافة هذه الشيفرة سيصبح من المُمكن استخدام<span style="font-family:courier new,courier,monospace;"> ajaxpagination.ajaxurl </span>لتعيين الرابط URL إلى <span style="font-family:courier new,courier,monospace;">admin-ajax.php</span>، والّذي سيُستخدم لتولّي استدعاءات أجاكس.</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">&lt;script type='text/javascript'&gt;
/* &lt;![CDATA[ */ var ajaxpagination = {"ajaxurl":"http:\/\/wordpress.local\/wp-admin\/admin-ajax.php"}; /* ]]&gt; */ 
&lt;/script&gt;  </pre><p>أصبح كل شيء جاهزًا لبناء استدعاء أجاكس في ملفّ جافا سكريبت كما هو موضّح في الشيفرة التالية:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">$(document).on( 'click', '.nav-links a', function( event ) { 
    event.preventDefault(); 
    $.ajax({ 
        url: ajaxpagination.ajaxurl, 
        type: 'post', 
        data: { action: 'ajax_pagination' }, 
        success: function(result ) { 
            alert( result ); } 
    }) 
})</pre><p>تمّ استخدام الدالة <span style="font-family:courier new,courier,monospace;">()ajax.$</span>، مع العلم أنّه يوجد دوال خاصّة من أجل post و get، ولكن يُفضّل البعض استخدام هذه الدالة بسبب مرونتها، والّتي يُمكن القراءة عن كافّة مُعاملاتها من خلال <a rel="external nofollow" href="http://api.jquery.com/jquery.ajax/">التوثيق الرسمي لمكتبة jQuery</a>.</p><p>تمّ استخدام المُعامل url لتمرير مسار السكريبت المُراد إرسال البيانات إليه، وهو الملفّ <span style="font-family:courier new,courier,monospace;">admin-ajax.php</span>، والّذي سيكون في المسار <span style="font-family:courier new,courier,monospace;">wp-admin</span>، بعد أن تمّ تعريف ذلك سابقًا في الدالة <span style="font-family:courier new,courier,monospace;">()wp_localize_script</span>.</p><p>يقوم أخيرًا المُعامل success، والّذي هو دالّة، بتنبيه (alert) نتيجة استدعاء أجاكس، وبذلك يكون قد تمّ اختبار هذه الدالة، والّتي سيتمّ التعديل عليها لاحقًا، ولكن الآن سيعمل الرابط إن تمّ الضغط عليه، ولكنه ليس بذو نفعٍ في الوقت الحالي، بما أنّه لم يتمّ إعداد الشيفرة من جهة الخادوم بعد، مع ذلك ستكون النتيجة هي الرقم 0، وهي النتيجة الافتراضيّة عندما لا تكون شيفرة الخادوم قد كتبت.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_07/alert0.png.64427ab297d74aaf5c4b4ff940afb548.png"><img data-fileid="3416" class="ipsImage ipsImage_thumbnailed" alt="alert0.thumb.png.3b99d59b4126fd276aee93c" src="https://academy.hsoub.com/uploads/monthly_2015_07/alert0.thumb.png.3b99d59b4126fd276aee93c9a4ad38cc.png"></a></p><p>يَكمن السبب في ظهور النتيجة السابقة رغم عدم كتابة شيفرة من طرف جهة الخادم إلى وجود شيفرة مكتوبة بالفعل من قِبل ووردبريس، وذلك بالملف <span style="font-family:courier new,courier,monospace;">admin-ajax.php</span> المُستخدم في المثال، والّذي يحتوي في طياته على الدالة <span style="font-family:courier new,courier,monospace;">('die('0</span>.</p><p>سيَخمد السكريبت <span style="font-family:courier new,courier,monospace;">admin-ajax.php</span> ويعود من الدالة (return) بالقيمة 0، في حال عدم تزويد أي إجراء (action)، ولكن إن تمّ تزويد إجراء ولم يتمّ تزويد الخطافات (hooks) المطلوبة من قِبل ووردبريس فلن يحدث شيء، وفي نهاية الملفّ سيتمّ الخمود (die) مرّة أُخرى والعودة بالقيمة 0.</p></div><div id="wmd-preview-section-29"><h3 id="الاتصال-مع-ووردبريس">الاتصال مع ووردبريس</h3><p>يجب تعريف بعضًا من إجراءات ووردبريس للحصول على إجابة ذو معنى من ووردبريس، ويتم ذلك من خلال استخدام نمط محدّد:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">add_action( 'wp_ajax_nopriv_ajax_pagination', 'my_ajax_pagination' ); 
add_action( 'wp_ajax_ajax_pagination', 'my_ajax_pagination' ); 
function my_ajax_pagination() { echo get_bloginfo( 'title' ); 
die(); }</pre><p>تمّ ربط دالّة مع خطافين (hooks)، فالخطافات الّتي تأخذ الشكل<span style="font-family:courier new,courier,monospace;"> [wp_ajax_[action_nam</span> تُنفّذ للمُستخدمين أصحاب العضويّة، والخطافات الّتي تأخذ الشكل <span style="font-family:courier new,courier,monospace;">[wp_ajax_nopiv_[action_name</span> تُنفّذ للمُستخدمين الزوّار، وهذا أمر جيّد لفصل الوظائف عن بعضها بسهولة.</p><p>إن أسماء الإجراءات (actions) الّتي تمّ ذكرها في الأعلى تُشير إلى الإجراء المعرّف في استدعاء أجاكس في ملفّ جافا سكريبت المُنشئ سابقًا (<span style="font-family:courier new,courier,monospace;">action: ajax_pagination</span>)، أي من المُفترض أنّ يتطابقا، أما اسم الدالة فمن الممكن أنّ يكون أي اسم، وتم اختيار الاسم <span style="font-family:courier new,courier,monospace;">my_ajax_pagination</span> للوضوح.</p><p>يُمكن للدالة أنّ تحتوي على أي شيء، فمن المُمكن تسجيل خروج المُستخدمين، جلب بياناتهم، أو نشر منشور، ومهما كان المطلوب عودته (return) إلى جافا سكريبت فمن الضروري استخدام echo، وفي المثال الحالي تمّ استخدام echo مع عنوان المُدوّنة، والّذي يُمكن الوصول إليه عن طريق الدالة <span style="font-family:courier new,courier,monospace;">()get_bloginfo</span>.</p><p>ستكون الخطوة الأخيرة هي استخدام <span style="font-family:courier new,courier,monospace;"><span style="line-height: 22.3999996185303px;">()</span>die</span>، فبعدم تعريفها، فإن الدالة <span style="font-family:courier new,courier,monospace;">(dir(0</span> المعرّفة في نهاية الملف <span style="font-family:courier new,courier,monospace;">admin-ajax.php</span> سيتمّ تنفيذها ليتم طباعة 0 بالإضافة إلى ما سيتمّ طباعته في الدالة الّتي يتمّ كتابتها حاليًّا، والآن إن تمّت تجربة الشيفرة السابقة فمن المفترض رؤية عنوان الموقع.</p></div><div id="wmd-preview-section-30"><h3 id="تلخيص">تلخيص</h3><p>تمّ إلى هنا الوصول إلى نهاية المثال، وقبل الانتقال إلى كيفيّة استعراض المنشورات باستخدام أجاكس، سيتمّ مراجعة الخطوات الضروريّة لإتمام استدعاء أجاكس:</p><ul><li>صف (enqueue) ملفّ جافا سكريبت، إن لم يكن متوفرًّا بالأساس.</li><li>استخدام <span style="font-family:courier new,courier,monospace;"><span style="line-height: 22.3999996185303px;">()</span>wp_localize_script</span> لتمرير URL للملف <span style="font-family:courier new,courier,monospace;">admin-ajax.php</span>.</li><li>إنشاء استدعاء أجاكس في جافا سكريبت.</li><li>ربط دالة باستخدام اسم خطّاف (hook) مناسب.</li><li>كتابة شيفرة الدّالة والّتي ستعود بالبيانات إلى جافا سكريبت.</li></ul></div><div id="wmd-preview-section-31"><h2 id="تحميل-المنشورات-باستخدام-ajax">تحميل المنشورات باستخدام AJAX</h2><p>سيتمّ البدء بكتابة شيفرة جافا سكريبت، والّتي ستكون مبدئيًّا بالشكل التّالي، والتعديل عليها لاحقًا.</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">(function($) { 
    function find_page_number( element ) { 
        element.find('span').remove(); 
        return parseInt( element.html() ); 
    } 
    $(document).on( 'click', '.nav-links a', function( event ) { 
        event.preventDefault(); 
        page = find_page_number( $(this).clone() ); 
        $.ajax({ 
            url: ajaxpagination.ajaxurl, 
            type: 'post', 
            data: { action: 'ajax_pagination', query_vars: ajaxpagination.query_vars, page: page },
            success: function( html ) { 
                $('#main').find( 'article' ).remove(); 
                $('#main nav').remove(); 
                $('#main').append( html ); 
            } 
        }) 
    }) 
})
(jQuery);</pre><p>إن الشيفرة السابقة مُشابهة إلى المثال المُبسّط السابق، مع ملاحظة أنه تمّ إضافة طريقة لمعرفة أي صفحة أراد المُستخدم طلبها، وكل رابط لديه عنصر span بداخله وهو في حالة عدم الظهور، كما تمّ استنساخ (clone) العنصر لكيلا يتمّ التعديل على العنصر الأصلي، ومن ثم حذف العنصر span وتحليل (parse) الباقي كعدد صحيح (integer) باستخدام الدالة parseInt، ليكون الناتج رقم الصّفحة.</p><p>سيكون من الضروري أيضًا معرفة مُعاملات الاستعلام (query parameters) المُستخدمة، وسيكون الأمر سهلًا في الصفحة الرئيسيّة، باستخدام المُعامل paged، وذلك لأنّه يتمّ التعامل مع الاستعلام الافتراضي، إن تمّ البدء على صفحة أرشفة (archive page)، مثل أرشيف التصنيفات (category)، فعندها يجب معرفة اسم الصنف أيضًا.</p><p>سيتمّ تمرير مُتغيّرات الاستعلام باستخدام طريقة الموضعة (localization) المُستخدمة سابقًا، ولكن الآن سيتمّ استخدام <span style="font-family:courier new,courier,monospace;">ajaxpagination.query_vars</span> على الرغم من عدم تعريفها بعد، وأخيرًا وفي success سيتمّ حذف جميع العناصر article من الحاوية الرئيسية، وحذف عنصر التصفيح (pagination) وإلحاق (append) القيمة المُعادة من (return) استدعاء أجاكس المُنشئ إلى الحاوية الرئيسية.</p><p>ستحتوي القيمة المُعادة (return) على المنشورات وعنصر التنقل الجديد، مع ملاحظة تغيير اسم المُعامل من response إلى html ليصبح الاسم معبّرًا أكثر، أخيرًا تمّ استخدام مصفوفة الموضعة لتمرير معاملات الاستعلام الأصليّة.</p><p>يجب على الدالة التّالية أنّ توضع في الدالة <span style="font-family:courier new,courier,monospace;">()my_enqueue_assets</span> لتبديل الموضعة (localization) الّتي تمت سابقًا.</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">global $wp_query; 
wp_localize_script( 'ajax-pagination', 'ajaxpagination', array( 'ajaxurl' =&gt; admin_url( 'admin-ajax.php' ),
'query_vars' =&gt; json_encode( $wp_query-&gt;query ) ));</pre><p>ستكون الدالة <span style="font-family:courier new,courier,monospace;">()my_ajax_pagination</span> في صورتها النهائيّة على الشكل التّالي:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">add_action( 'wp_ajax_nopriv_ajax_pagination', 'my_ajax_pagination' ); 
add_action( 'wp_ajax_ajax_pagination', 'my_ajax_pagination' ); 
function my_ajax_pagination() { 
    $query_vars = json_decode( stripslashes( $_POST['query_vars'] ), true ); 
    $query_vars['paged'] = $_POST['page']; 
    $posts = new WP_Query( $query_vars ); 
    $GLOBALS['wp_query'] = $posts; 
    add_filter( 'editor_max_image_size', 'my_image_size_override' ); 
    if( ! $posts-&gt;have_posts() ) { 
        get_template_part( 'content', 'none' ); 
    } else { 
        while ( $posts-&gt;have_posts() ) { 
            $posts-&gt;the_post(); 
            get_template_part( 'content', get_post_format() ); 
        } 
    } 
    remove_filter( 'editor_max_image_size', 'my_image_size_override' ); 
    the_posts_pagination( 
        array( 'prev_text' =&gt; __( 'Previous page', 'twentyfifteen' ), 
        'next_text' =&gt; __( 'Next page', 'twentyfifteen' ), 
        'before_page_number' =&gt; '&lt;span class="meta-nav screen-reader-text"&gt;' . __( 'Page', 'twentyfifteen' ) . ' &lt;/span&gt;', ) 
     ); 
    die(); 
} 
function my_image_size_override() { return array( 825, 510 ); }</pre><p>إن استخدام المُعاملات المُمرّرة مكّن من بناء استعلام مُخصّص (custom query) وذلك عن طريق استخدام مُتغيّرات الاستعلام الّتي تمّ تمريرها والتأكّد أنّ رقم الصّفحة الّذي تمّ تمريره يستبدل المُعامل paged، ومن ثُمّ تمّ استخدام المصفوفة query_vars لإنشاء الاستعلام الجديد.</p><p>يجب جعل المُتغيّر <span style="font-family:courier new,courier,monospace;">['wp_query']اGLOBALS$</span> مساويًا إلى كائن المنشورات الجديد، والسبب في ذلك هو أنّ الدالة <span style="font-family:courier new,courier,monospace;">()the_posts_pagination</span> تَستخدم هذا المُتغيّر العام (global variable).</p><p>يُلاحظ أنّه تمّ إضافة دالة إلى المُرشح <span style="font-family:courier new,courier,monospace;">editor_max_image_size</span>، ومن ثُمّ وبعد أسطر قليلة تمّ إزالتها، وذلك لمشكلة في سكريبت ووردبريس نفسه، وفي الحقيقة تمّ <a rel="external nofollow" href="https://core.trac.wordpress.org/ticket/31010">تسجيل هذا المُشكلة في مُتتبّع المشاكل الخاصّ بووردبريس</a> حيث أن المشكلة هي كالتالي:</p><p>ستتحمل الصور بشكل مناسب عندما يتم تحميلها في صفحة المنشور، ولكن بدون هذه المُرشحات فإن الصور ستكون ضيقة، أي ستكون 660px عرضًا بدلًا من 825px، والسبب في ذلك هو أنّ الدالة الّتي تحمّل الصور ستستدعي دالة بالاسم <span style="font-family:courier new,courier,monospace;">()image_constrain_size_for_editor</span>، وهذه الدالة تتأكّد من أنّ الصور في محرّر المنشور ليست عريضة بشكل كبير، ولتحديد فيما إذا كان يجب تقلّيص الحجم أم لا، تُستخدم الدالة <span style="font-family:courier new,courier,monospace;">()is_admin</span> في ذلك، وبما أنّ شيفرة المثال تعمل عبر <span style="font-family:courier new,courier,monospace;">admin-ajax.php</span>، والّذي يعتبر admin في نهاية الأمر، سيُقلّص ووردبريس من حجم الصور، معتقدًا أنّه يتمّ استخدامهم في المُحرّر.</p><p>يُمكن استخدام المرشح <span style="font-family:courier new,courier,monospace;">editor_max_image_size</span> لتحديد الحجم الأعظمي للصور في المُحرّر، وبما أنّه المطلوب هو ترك كل شيء على ما هو عليه، باستثناء استدعاء أجاكس، فقد تمّ إضافة المرشح باستخدام القيمة المخصّصة (array( 828, 510  ومن ثُمّ إزالتها مباشرة لتأكّد من أنها لا تسبب مشاكل في أي مكان آخر.</p><p>ستكون الخطوة التّالية استخدام الاستعلام في عرض المنشورات، حيثُ تمّ نسخ الكثير من الملفّ <span style="font-family:courier new,courier,monospace;">index.php</span> في القالب الرئيسي (parent theme)، وفي حال عدم توفّر منشورات سيتمّ استخدام عارضة (template) مُخصّصة لهذا الأمر، وأخيرًا سيتمّ استخدام شكل التصفيح (pagination) كما هو في الملفّ <span style="font-family:courier new,courier,monospace;">index.php</span>.</p></div><div id="wmd-preview-section-32"><h3 id="تجربة-مستخدم-أفضل">تجربة مُستخدِم أفضل</h3><p>يجب التركيز على تجربة المُستخدم دائمًا، حيثُ أنّه عند العمل في بيئة التطوير يبدو التصفّح سريعًا للغاية، ولكن تأخذ الصور وبقيّة الأصول (assets) وقتًا أطول في التحميل في بيئة العمل الحقيقيّة.</p><p>يُفترض إضافة مُحمّل (loader) أو على الأقل نصّ يُشير إلى جريان تحميل المنشورات وذلك في سبيل تحسين تجربة المُستخدم، وبالإضافة إلى ذلك من المُمكن تعطيل أي نقرات (clicks) إضافيّة على عناصر شريط التنقل، وهذا ما سيتمّ في المثال الحالي: إخفاء المنشورات وشريط التنقل مباشرةً بعد عملية الضغط من قبل المُستخدِم ومن ثم عرض رسالة فحواها هو "loading new posts" (جاري تحميل المنشورات)، وعند الحدث success سيتمّ إزالة نص الرسالة وعرض المنشورات، وسيكون استدعاء أجاكس بصيغته النهائيّة على الشكل التّالي:</p><pre data-pbcklang="javascript" data-pbcktabsize="4" class="javascript ipsCode prettyprint">$.ajax({ 
    url: ajaxpagination.ajaxurl, 
    type: 'post', 
    data: { action: 'ajax_pagination', query_vars: ajaxpagination.query_vars, page: page }, 
    beforeSend: function() { 
        $('#main').find( 'article' ).remove(); 
        $('#main nav').remove(); 
        $(document).scrollTop(); 
        $('#main').append( '&lt;div class="page-content" id="loader"&gt;Loading New Posts...&lt;/div&gt;' );
    }, 
    success: function( html ) { $('#main #loader').remove(); $('#main').append( html ); } 
})</pre><p>أصبح هناك دالتين منفصلتين وهما beforeSend و الدالة success، الأولى يتمّ تنفيذها حالما يتمّ الضغط على الرابط، قبل أنّ يُرسل استدعاء أجاكس إلى الخادوم، أما الثانية فيتم تنفيذها حالما يتمّ استقبال البيانات من الخادوم.</p><p>سيتمّ إزالة المقالات وشريط التنقّل قبل إرسال الاستدعاء، ويفيد هذا الأمر في منع المُستخدم من الضغط باستمرار على روابط شريط التنقّل إلى حين انتهاء التحميل، ومن ثُمّ سيتمّ التدرّج إلى أعلى الصّفحة، وإضافة تنبيه يوضّح جريان عملية التحميل لتوضيح الأمور للمُستخدم، وفي الدالّة success تمّ إزالة المُحمّل loader ومن ثُمّ تحميل المُحتوى.</p></div><div id="wmd-preview-section-33"><h2 id="مشاكل-أجاكس">مشاكل أجاكس</h2><p>إن أجاكس تقنيّة متقدّمة وقويّة بلا شك، فبجانب المثال المٌقدّم في هذا الدليل، يُمكن إجراء العديد من الأمور باستخدام استدعاءات أجاكس، ولكن يجب الحذر في بعض المواضع عند تطبيق هذه التقنيّة، سيتمّ التطرّق إلى بعضها:</p><ul><li><strong>الحماية:</strong> تُعبر الحماية من الأمور الأساسيّة والهامّة الّتي يجب التركيز عليها، فعند الرغبة في حذف منشور باستخدام أجاكس يجب التأكد من عزم المُستخدم على ذلك، وأيضًا يجب التأكّد من صلاحياته (باستخدام nonces)، خاصّة بعد العلم أنّ ووردبريس مُجهز بحماية مُضمّنة عند العمل بشكله الافتراضي، ولكن عند تطبيق تقنيّة أجاكس فإن مسألة الحماية تقع على المطوّر.</li><li><strong>أجاكس بدون جافا سكريبت:</strong> تعمد تقنيّة أجاكس على جافا سكريبت، بمعنى آخر عدم توفّر جافا سكريبت يعني عدم توفّر أجاكس، فإن تمّ الاعتماد على أجاكس بشكل كبير في الموقع، فلن يستطيع المستخدمين الذين قاموا بتعطيل جافا سكريبت على متصفحاتهم من استخدام الموقع، على الرغم من أن جافا سكريبت أصبحت متوفّرة دائمًا، ولكن لا يخلو الأمر من هذه الحالات، وعليه من الجيّد ضمان عمل التطبيق في حال عدم توفّرها.</li><li><strong>تجربة المُستخدم:</strong> تُهمل تجربة المُستخدم غالبًا، وما يقدّمه أجاكس بالتأكيد أمر في غاية الأهميّة، ولكن الأهم هو موقع يعمل كما هو مفروضٌ له أنّ يَعمل، فالمُستخدمين معتادين على تحميل الصّفحة من جديد عند الضغط على الروابط، لذا من مهمّة المُطوّر جعل كل شيء واضح بالنسبة لهم، وعلى المُستخدمين معرفة ما الذي يحدث ولماذا، بمعنى آخر يجب استخدام أجاكس لتحسين الموقع، وعدم الإفراط في الاستخدام لكيلا ينقلب السحر على الساحر.</li></ul></div><div id="wmd-preview-section-34"><h2 id="تلخيص-1">تلخيص</h2><p>كما هو مُلاحظ إن تطبيق تقنيّة أجاكس يتطلّب القليل من التحضير والتدريب، ولكن مع التكرار ستصبح الأمور سهلة وميسرة، وربّما قراءة هذا الدرس قد استغرقت بعض الوقت، وسيستغرق تطبيق المثال أيضًا وقتًا أطول وخاصّة في المرّة الأولى، ولكن مع المُمارسة ستغدو الأمور أوضح والتطبيق أسرع.</p><p>ترجمة –وبتصرّف- للمقال <a rel="external nofollow" href="https://premium.wpmudev.org/blog/load-posts-ajax/">Loading WordPress Posts Dynamically With AJAX</a> لصاحبه Daniel Pataki.</p></div>
]]></description><guid isPermaLink="false">133</guid><pubDate>Thu, 06 Aug 2015 22:34:38 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633; &#x628;&#x623;&#x645;&#x627;&#x646;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%A8%D8%A3%D9%85%D8%A7%D9%86-r130/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-1.png.6384a4586671784608b3e9e3e7b0d026.png" /></p>

<div id="wmd-preview-section-15">
	<p>
		من المهم لمطورّي ووردبريس أن يكونوا على اطّلاعٍ على تقنيات الحماية والأمان عند تطوير مواقع تعمل بسكربت ووردبريس أو تصميم قوالب جاهزة له، سنبدأ <a href="https://academy.hsoub.com/search/?tags=%D8%AF%D9%84%D9%8A%D9%84+%D9%85%D8%B7%D9%88%D8%B1+%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3+%D8%A5%D9%84%D9%89+%D8%A7%D9%84%D8%A3%D9%85%D8%A7%D9%86" rel="">سلسلة من 4 دروس</a> حول هذا الموضوع وسيكون درسنا اليوم عن "التثبيت".
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileid="3518" href="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-1.png.6a04d984974afacda74b2faf1750c8ac.png" rel=""><img alt="wordpress-guide-to-security-1.thumb.png." class="ipsImage ipsImage_thumbnailed" data-fileid="3518" src="https://academy.hsoub.com/uploads/monthly_2015_08/wordpress-guide-to-security-1.thumb.png.2af492746157fb7a7524f6923cf0d0f2.png"></a>
	</p>

	<p>
		هناك عدّة أمور مهمّة لتأخذها بعين الاعتبار لضمان أمانٍ أعلى لموقعك ومن بينها:
	</p>
</div>

<div id="wmd-preview-section-16">
	<h2 id="اختيار-الاستضافة-المناسبة">
		اختيار الاستضافة المناسبة
	</h2>

	<p>
		يبدأ موقع ووردبريس المؤمّن بشكلٍ مثالي من اختيار استضافة مناسبة لموقعك، فمن دون استضافة آمنة وجيّدة السمعة عالميًا، فإنّ جهودك في مجال تأمين موقعك العامِل بووردبريس قد تذهب أدراج الرياح. على الجانب التقني، بِما أنّ ووردبريس يستخدم PHP وMySQL، فإنّ أيّ استضافة تعمل بنظام لينكس ستكون مناسبة، ولكن من المنصوح أن تبتعد عن استضافة GoDaddy و Yahoo! ومثيلاتها حيث أنّ هذه الاستضافات مصممة لتكون بسيطة للغاية مما يجعلها مُقيّدة في بعض الأحيان، وهو ما يعني أنّه غير مجهّزة لأيّ شيء أكثر من موقع ووردبريس عادي بسيط.
	</p>

	<p>
		إذا كنتَ تريد القيام بتعديل بعض الإعدادات على الخادوم لتحسين إعدادات الأمان، فإنّ القيام بهذا قد يكون صعبًا على تلك الاستضافات المقيّدة.
	</p>

	<blockquote class="ipsQuote" data-cite="اقتباس" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix">
			<p>
				الشيء الأساسي الذي يجب أن تكون قلقًا حوله في أيّ استضافة مشتركة هو أن تضمّن أنّ شركة الاستضافة قامت بضبط صلاحيات Unix بشكلٍ صحيح، فأنت لا تريد من الآخرين امتلاك صلاحياتٍ للوصول إلى خادومك، والعكس صحيح. بعدها، يمكنك القيام بعدّة أمور لتحسين أمان موقعك مثل استخدام جدارٍ ناري لحماية تطبيق الويب الخاصّ بك، استخدام شهادات <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>، فحوصات الموقع الدورية والمزيد.
			</p>

			<p>
				- Marcus Hildum مدير فريق الأمان في DreamHost.
			</p>
		</div>
	</blockquote>

	<p>
		ينصح معظم خبراء الحماية باستخدام استضافاتٍ توفّر خواديمًا افتراضية خاصّة (VPS). وهو ما يستخدمه Tony Perez المدير التنفيذي لـSucuri:
	</p>

	<blockquote class="ipsQuote" data-cite="اقتباس" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix">
			<p>
				أستخدمُ الجدار الناريّ لصدّ الهجمات قبل حصولها على خادومي، يقوم هذا الأمر بحلّ عدة مشاكل كبيرة في الواقع، مثل منع ثغرات التطبيقات الشهيرة وتوفير موارد الخادوم.
			</p>
		</div>
	</blockquote>

	<p>
		يستخدم Tony العديد من الأدوات على خادومه للحماية والأمان، هذه الأدوات تريه من يقوم بتسجيل الدخول إلى خادومه، من يقوم بالتعديل على المواضيع.. وهكذا، كما أنّ هذه الأدوات تقوم بعرض WHOIS، الـDNS ونشاط البرمجيات الخبيثة إن كانت موجودة، كلّ واحدٍ من هذه الأدوات مصمم ليراقب جزءًا معيّنا من جزئيات الحماية على الخادوم، بالإضافة إلى أمورٍ قد لا تخطر على بال المستخدمين العاديين. ينصح Tony باستخدام إضافة <a href="http://wordpress.org/plugins/sucuri-scanner/" rel="external nofollow">Sucuri Scanner</a> لفحص مواقع الووردبريس للتأكّد من حمايتها، كما ينوّه إلى أنّه هناك العديد من الإضافات الأخرى التي يمكنك البحث عنها من على <a href="https://wordpress.org/plugins/" rel="external nofollow">مخزن إضافات ووردبريس</a>.
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileid="3365" href="https://academy.hsoub.com/uploads/monthly_2015_07/001.png.d1800d7f3d1b503ec1ef84b8f1862f07.png" rel=""><img alt="001.thumb.png.9dea478d0fe9d56cf3516d0047" class="ipsImage ipsImage_thumbnailed" data-fileid="3365" src="https://academy.hsoub.com/uploads/monthly_2015_07/001.thumb.png.9dea478d0fe9d56cf3516d0047840489.png"></a>
	</p>
</div>

<div id="wmd-preview-section-17">
	<h2 id="مشكلة-سكربتات-التثبيت-بنقرة-واحدة">
		مشكلة سكربتات التثبيت بنقرة واحدة
	</h2>

	<p>
		توفّر العديد من شركات الاستضافة الآن القيام بعملية تثبيت ووردبريس "بنقرة واحدة"، وهو ما يسمح للمستخدمين العاديين أن يمتلكوا موقع ووردبريس بسرعة أكثر من السابق، ولكن بالطبّع، السرعة لها تكلفة.
	</p>

	<blockquote class="ipsQuote" data-cite="اقتباس" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix">
			<p>
				تقريبًا، تقوم جميع هذه السكربتات بإنشاء مواقع ووردبريس مع اسم المستخدم "admin"، وهو ما يجعل الموقع عرضةً مباشرةً لهجمات التخمين أو Bruteforce، كما وأنّه عادةً تستخدم بادئة الجداول "<span style="font-family:courier new,courier,monospace;">wp_</span>" في قاعدة البيانات الخاصّة بالموقع، وبما أنّ هذه الأمور مذكورةً في معظم صفحات التوثيق الخاصّة بهذه السكربتات، فإنّ المخترقين يعرفونها بالفعل. يعتمد المهاجمون بشكلٍ كبير على أسماء الجداول الشهيرة مثل <span style="font-family:courier new,courier,monospace;">wp_users</span> مما يوفّر عليهم الكثير من الوقت في توقّع مكان تخزين بيانات الموقع
			</p>

			<p>
				- Mike Murphy مالك Erion Media.
			</p>
		</div>
	</blockquote>

	<p>
		يمكنك في الواقع تغيير هذه البيانات بسهولة إن أردت -وهو ما سنتحدّث عنه لاحقًا- ولكن المشكلة هنا هي في الافتراضات التي يظنّها الناس عن عمليات التثبيت بنقرة واحدة بسبب شركات الاستضافة، فهم يظنون أنّها آمنة ومحميّة، لسوء الحظّ، فهي ليست كذلك، مما يجعل طريق التثبيت اليدوي أفضل بكثيرٍ للحماية.
	</p>
</div>

<div id="wmd-preview-section-18">
	<h2 id="كيفية-تثبيت-ووردبريس">
		كيفية تثبيت ووردبريس
	</h2>

	<p>
		إذا كنتَ لا تستخدم عملية التثبيت بنقرة واحدة، فإنّ القيام بتثبيت ووردبريس بالطريقة اليدوية على خادومك يجب أن يستغرق حوالي 10 دقائق. ستحتاج إلى فهم أساسيات عمل بروتوكول نقل الملفّات FTP وقواعد البيانات. هناك عدّة دروس على الويب حول هذا الموضوع من البداية إلى النهاية، ولكننا لن نذكر تفاصيلها الآن في هذا المقال.
	</p>

	<p>
		بمجرّد أن تقوم برفع كلّ ملفّاتك إلى موقعك وبمجرّد أن تقوم بإعداد قاعدة البيانات، سيتم توجيهك إلى إعداد اسم المستخدم وكلمة المرور الخاصّيَن بووردبريس، من المستحسن أن تقوم باختيار اسم مستخدمٍ معقّد ومن الصعب أن يتم تخمينه من قبل المخترقين لحمايةٍ أعلى.
	</p>

	<p>
		نفس الشيء بالنسبة لكلمة المرور الخاصّة بك، اجعلها معقّدة قدر الإمكان وأضف إليها الأرقام والرموز والأحرف الكبيرة، لا تتركها بسيطة فتصبح عُرضةً لهجمات التخمين بسهولة، كلّما كانت كلمة المرور أكثر تعقيدًا وطولًا، كلّما صعب تخمينها وكسرها.
	</p>
</div>

<div id="wmd-preview-section-19">
	<h2 id="تغيير-اسم-المستخدم-admin">
		تغيير اسم المستخدم "Admin"
	</h2>

	<p>
		تحدّثنا بالفعل عن أهميّة تجنّب اسم المستخدم "admin" ولماذا يجب عليك أن تختارَ اسمًا معقدًا، ولكن لنفرض أنّك قمتَ بالفعل بتثبيت موقع ووردبريس جديد منذ فترة واستخدمت اسم المستخدم "admin" فيه، فستحتاج تغييره يدويًا من phpMyAdmin.
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileid="3366" href="https://academy.hsoub.com/uploads/monthly_2015_07/002.png.9fd3eb7e03e9c4ffbdfa4bb07eaef6cf.png" rel=""><img alt="002.thumb.png.c92883b7848a422730b8abc2f9" class="ipsImage ipsImage_thumbnailed" data-fileid="3366" src="https://academy.hsoub.com/uploads/monthly_2015_07/002.thumb.png.c92883b7848a422730b8abc2f9852404.png"></a>
	</p>

	<p>
		افتراضيًا، لا يسمح لك ووردبريس بتغيير اسم المستخدم، ولكن يمكنك إنشاء مستخدمٍ جديد إن أردت وإعطاؤه صلاحياتٍ إدارية كاملة وحذف المستخدم "admin" وإسناد الصفحات والمقالات التي أنشئتها بالمستخدم القديم إلى المستخدم الجديد، ولكن إذا كنتَ تمتلك الكثير من الصفحات والمقالات فربّما تريد القيام بالأمر يدويًا.
	</p>

	<p>
		للقيام بذلك، قم بالدخول إلى لوحة cPanel الخاصّة بك (على افتراض أنّك تمتلك واحدة!) ثمّ ابحث عن phpMyAdmin وقم بفتحها، بعد هذا، ابحث عن قاعدة البيانات الخاصّة بموقعك وابحث عن جدول <span style="font-family:courier new,courier,monospace;">wp_users</span> ضمنها. ابحث عن المستخدم "admin" واصغط على زر "Edit" أو تحرير بجانبه لتعديل اسم المستخدم، قم بتبديل الاسم واحفظه. بعد هذا، سيتم تلقائيًا تغيير اسم المستخدم في جميع أنحاء موقعك إلى الاسم الجديد ولن تحتاج إلى حذف شيء.
	</p>
</div>

<div id="wmd-preview-section-20">
	<h2 id="الخاتمة">
		الخاتمة
	</h2>

	<p>
		في معظم الأحيان، يعتقد الناس أنّ أمان ووردبريس هو مسألة يمكن حلّها عبر إضافة ووردبريس، صحيحٌ أنّ هذا جزءٌ مهم من المعادلة ولكنّه ليس كلّ شيء، حيث أنّك تحتاج تأمين كلّ شيء منذ البداية.
	</p>

	<p>
		في <a href="https://academy.hsoub.com/programming/php/wordpress/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%88%D8%AA%D8%B3%D8%AC%D9%8A%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%AF%D8%AE%D9%88%D9%84-%D8%A8%D8%A3%D9%85%D8%A7%D9%86-r132/" rel="">الدرس القادم</a> سنتطرق إلى كيفية تأمين ووردبريس بعد تثبيته عبر تأمين تسجيل الدخول إلى المنصة.
	</p>

	<p>
		ترجمة -وبتصرف- للمقال <a href="https://managewp.com/wordpress-security-installation" rel="external nofollow">The WordPress Developer’s Guide to Security: Installation</a> لصاحبته Brenda Barron.
	</p>
</div>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">130</guid><pubDate>Mon, 03 Aug 2015 11:41:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x638;&#x647;&#x631; &#x627;&#x644;&#x62A;&#x646;&#x628;&#x64A;&#x647;&#x627;&#x62A; &#x641;&#x64A; &#x644;&#x648;&#x62D;&#x629; &#x62A;&#x62D;&#x643;&#x645; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D8%B8%D9%87%D8%B1-%D8%A7%D9%84%D8%AA%D9%86%D8%A8%D9%8A%D9%87%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%88%D8%AD%D8%A9-%D8%AA%D8%AD%D9%83%D9%85-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r129/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_07/wordpress-admin-notification.png.18b64b6da96a12510521635a29faaf36.png" /></p>

<p>أحيانًا قد يحتاج قالب أو إضافة إلى إظهار إشعارات/تنبيهات للمُستخدمين عبر لوحة تحكُّم ووردبريس. تنفيذ هذا الأمر بسيط جدًّا حيثُ أنَّهُ يتمّ باستخدام خُطَّاف admin_notices والذي يقوم باظهار صُندوق رسائل في أعلى الشَّاشة.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_07/wordpress-admin-notification.png.d1f84dc9f0d042b1b26edd67db90acd2.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="3344" src="https://academy.hsoub.com/uploads/monthly_2015_07/wordpress-admin-notification.thumb.png.7f95754dc3e28de813e23c9b68ebb738.png" class="ipsImage ipsImage_thumbnailed" alt="wordpress-admin-notification.thumb.png.7"></a></p><p style="text-align: center;"> </p><h2>عرض إشعار قياسي</h2><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">function my_admin_notice(){
    echo '&lt;div class="updated"&gt;
       &lt;p&gt;I am a little yellow notice.&lt;/p&gt;
    &lt;/div&gt;';
}
add_action('admin_notices', 'my_admin_notice');</pre><p>حيثُ أنَّه قد تمَّ إضافة الصّنف"updated" إلى الوسم div فسيظهر الإشعار باللَّون الأصفر. أمَّا في حالة تغيير الصّنف إلى "error" فإنَّ الإشعار يظهر أحمرًا.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" style="line-height: 22.3999996185303px; text-align: center;" href="https://academy.hsoub.com/uploads/monthly_2015_07/002_example_(1).png.968449472229b4eab52c48872fbba7d8.png"><img data-fileid="3343" class="ipsImage ipsImage_thumbnailed" alt="002_example_(1).thumb.png.abd96652bb2541" src="https://academy.hsoub.com/uploads/monthly_2015_07/002_example_(1).thumb.png.abd96652bb25410b9211969086ca4ff5.png"></a></p><h2>كيفيَّة عمل إشعار قابل للإغلاق</h2><p>من المُمكن -مع القليل من العمل الإضافي- عرض الإشعار وإبقائه حتَّى يقوم المُستخدم بالضغط على زرٍّ لإغلاقه. تُعتبر تلك الطَّريقة مُفيدة للتأكُّد من أنَّ المُستخدم قد قام برؤية الإشعار وكذلك لن يُضايقه وجود الإشعار طوال الوقت.</p><p>المثال التَّالي تمَّ استخراجه من إضافة <a rel="external nofollow" href="http://wordpress.org/extend/plugins/addthis/">AddThis</a>. يُستخدم أيضًا شيء مُشابه في <a rel="external nofollow" href="https://github.com/devinsays/options-framework-plugin">Options Framework.</a>.</p><p>إذا قام المُستخدم بالضَّغط لإخفاء الإشعار فسيتمّ حفظ تفضيله في بيانات user meta.</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">/* Display a notice that can be dismissed */

add_action('admin_notices', 'example_admin_notice');

function example_admin_notice() {
    global $current_user ;
        $user_id = $current_user-&gt;ID;
        /* Check that the user hasn't already clicked to ignore the message */
    if ( ! get_user_meta($user_id, 'example_ignore_notice') ) {
        echo '&lt;div class="updated"&gt;&lt;p&gt;'; 
        printf(__('This is an annoying nag message.  Why do people make these? | &lt;a href="%1$s"&gt;Hide Notice&lt;/a&gt;'), '?example_nag_ignore=0');
        echo "&lt;/p&gt;&lt;/div&gt;";
    }
}

add_action('admin_init', 'example_nag_ignore');

function example_nag_ignore() {
    global $current_user;
        $user_id = $current_user-&gt;ID;
        /* If user clicks to ignore the notice, add that to their user meta */
        if ( isset($_GET['example_nag_ignore']) &amp;&amp; '0' == $_GET['example_nag_ignore'] ) {
             add_user_meta($user_id, 'example_ignore_notice', 'true', true);
    }
}</pre><h2>عرض الإشعارات في صفحات تحكُّم مُعيَّنة</h2><p>أحيانًا قد نحتاج إلى تحديد ظهور الإشعار ليكون في صفحاتٍ مُعيَّنة قد يحتاج المُستخدم لرؤية الإشعار بها. يُمكنكَ تنفيذ هذا باستخدام المُتغيِّر العام $pagenow.<br>على سبيل المثال، سيظهر الإشعار التالي في صفحة الإضافات فقط:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">function my_admin_notice(){
    global $pagenow;
    if ( $pagenow == 'plugins.php' ) {
         echo '&lt;div class="updated"&gt;
             &lt;p&gt;This notice only appears on the plugins page.&lt;/p&gt;
         &lt;/div&gt;';
    }
}
add_action('admin_notices', 'my_admin_notice');</pre><h2>التحقُّق من دور المُستخدم قبل عرض الإشعار</h2><p>يجب عرض الإشعارات للمُستخدمين المعنيين بالأمر فقط. على سبيل المثال، لا فائدة من عرض إشعار عن تعديل خيارات القالب لمُستخدم لا يملك صلاحية التَّعديل على خيارات القالب.<br>إليكَ طريقة للتّحقق من الأدوار الشائعة:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">if ( current_user_can( 'install_plugins' ) )
if ( current_user_can( 'manage_options' ) )
if ( current_user_can( 'edit_theme_options' ) )</pre><h2>آداب الإشعار</h2><p>أحيانًا تُصبح الإشعارات مُزعجة، لهذا عليكَ الحذر عند استخدامها. أبقِ النَّصَّ قصيرًا وحاول ألَّا تعرض أكثر من إشعار. عليك استخدام هذه الميزة باعتدال.</p><h2>مصادر أخرى</h2><ul><li><a rel="external nofollow" href="http://theme.it/how-to-display-an-admin-notice-for-required-theme-plugins">http://theme.it/how-to-display-an-admin-notice-for-required-theme-plugins</a></li><li><a rel="external nofollow" href="http://codex.wordpress.org/Plugin_API/Action_Reference/admin_notices">http://codex.wordpress.org/Plugin_API/Action_Reference/admin_notices</a></li></ul><p>ترجمة -وبتصرّف- للمقال: <a rel="external nofollow" href="http://wptheming.com/2011/08/admin-notices-in-wordpress/">Admin Notices in WordPress</a>.</p>
]]></description><guid isPermaLink="false">129</guid><pubDate>Thu, 23 Jul 2015 11:13:00 +0000</pubDate></item><item><title>&#x645;&#x62B;&#x627;&#x644; &#x639;&#x645;&#x644;&#x64A; &#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x625;&#x636;&#x627;&#x641;&#x629; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;- &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x62B;&#x651;&#x627;&#x646;&#x64A;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D9%85%D8%AB%D8%A7%D9%84-%D8%B9%D9%85%D9%84%D9%8A-%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D9%91%D8%A7%D9%86%D9%8A-r113/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/wodpres-plugins-example-2.png.36d5907b59d211d22c0e5dee4c8c2a27.png" /></p>

<div id="wmd-preview-section-52"><p id="مثال-عملي-لبرمجة-إضافة-ووردبريس-الجزء-الثاني">في الدرس السابق من <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84%20%D8%A5%D9%84%D9%89%20%D8%A8%D8%B1%D9%85%D8%AC%D8%A9%20%D8%A5%D8%B6%D8%A7%D9%81%D8%A7%D8%AA%20%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3">هذه السلسلة</a> بدأنا <a href="https://academy.hsoub.com/code/php/wordpress/%D9%85%D8%AB%D8%A7%D9%84-%D8%B9%D9%85%D9%84%D9%8A-%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%91%D9%84-r102/">بتطوير إضافة عداد المشاهدات</a> حيث قمنا بإضافة عدد المشاهدات لكل مقال ومتابعته كما قمنا بتوفير شيفرة مختصرة Shortcode لعرض عدد مشاهدات أي مقال، وتبقى لنا أن <a href="https://academy.hsoub.com/code/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D9%86%D9%8A-%D9%88%D8%AF%D8%AC%D8%AA-widget-%D9%84%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3%D8%9F-r99/">نبرمج ويدجت</a> لعرض المقالات الأكثر مشاهدة وهذا ما سنقوم به في هذا الدرس بالإضافة لبعض الإقتراحات لتطوير الإضافة في نسخها القادمة ونختم هذا الدرس والذي هو الأخير في <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+%D8%A8%D8%B1%D9%85%D8%AC%D8%A9+%D8%A5%D8%B6%D8%A7%D9%81%D8%A7%D8%AA+%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3">هذه السلسلة</a> باستعرض بعض الأدوات المفيدة لمطوري إضافات ووردبريس.</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_06/wodpres-plugins-example-2.png.587f2aca11d04aecacc1f16cc08f0ddf.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="3121" src="https://academy.hsoub.com/uploads/monthly_2015_06/wodpres-plugins-example-2.thumb.png.101e31396ac4701d2214fe2043693c7e.png" class="ipsImage ipsImage_thumbnailed" alt="wodpres-plugins-example-2.thumb.png.101e"></a></p></div><div id="wmd-preview-section-53"><h2 id="برمجة-ويدجت-المقالات-الأكثر-مشاهدة">برمجة ويدجت المقالات الأكثر مشاهدة</h2><p>لبرمجة ودجت جديد في ووردبريس تقوم ببساطة بإنشاء صنف class جديد يرث الصنف الأساسي للويدجات الذي يوفره ووردبريس حيث تعتمد هذه الجزئية على البرمجة الكائنية ولكن لا تقلق إن كان هذا المصطلح لم يمر عليك من قبل فإن التطبيق لا يحتاج منا سوى كتابة أربعة دوال: </p><ul><li>الأولى هي الدالة الأساسية للويدجت والتي نعرف فيها اسم ووصف الودجت. </li><li>والثانية لعرض خيارات الويدجت في لوحة تحكم ووردبريس (في القائمة المظهر – الودجات) .</li><li>والثالثة لحفظ خيارات الويدجت عندما يقوم المستخدم بتعديلها.</li><li>والرابعة هي ما سيتم عرضه في واجهة الموقع (الشريط الجانبي) عند إستخدام الويدجت. </li></ul><p>وإذا أردت أن تتعمق أكثر في برمجة الويدجات يمكنك مراجعة مقال <a href="https://academy.hsoub.com/code/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D9%86%D9%8A-%D9%88%D8%AF%D8%AC%D8%AA-widget-%D9%84%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3%D8%9F-r99/">كيف تبني ودجت لووردبريس</a>.</p></div><div id="wmd-preview-section-54"><h3 id="ملف-widgetphp">ملف widget.php</h3><p>بالطبع سنكتب جميع الشيفرات المتعلقة ببرمجة الويدجت في هذا الملف، ولنبدأ بكتابة صنف الودجت وفيه الدوال الأربعة السابقة بدون تفصيل كالآتي:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">class HA_Views_Widget extends WP_Widget { 
    // البيانات الأساسية للودجت (مثل اسم ووصف الودجت)
    public function __construct() { 

    } 

    // عرض خيارات الويدجت في لوحة تحكم ووردبريس 
    public function form( $instance ) { 

    }

    // لحفظ خيارات الويدجت عندما يقوم المستخدم بتعديلها 
    public function update( $new_instance, $old_instance ) { 

    }

    // ما سيتم عرضه في واجهة الموقع (المقالات الأكثر مشاهدة)
    public function widget($args, $instance ) { 

    } 

}</pre><p>الأن سنقوم بإعلام ووردبريس أنه لدينا ودجت جديد من خلال تسجيله كالآتي:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">// تسجيل الويدجت من خلال إضافة الدالة أدناه للحدث widget_init
add_action( 'widgets_init', 'ha_widget_init' ); 
function ha_widget() { 
  register_widget( 'HA_Views_Widget' ); 
}</pre><p>لاحظ أن الدالة<span style="font-family:courier new,courier,monospace;"> ()register_widget</span> تستقبل مُعاملًا واحدًا وهو اسم صنف الودجت الذي نود تسجيله وهو في حالتنا هذه <span style="font-family:courier new,courier,monospace;">HA_Views_Widget</span> كما اخترناه في الأعلى.</p><p>بعد ذلك لنقم بكتابة تفاصيل الدوال التي عرفناها أعلاه.</p></div><div id="wmd-preview-section-55"><h4 id="الدالة-construct"><strong>الدالة <span style="font-family:courier new,courier,monospace;">construct</span></strong></h4><p>في هذه الدالة نقوم ببناء الودجت من خلال تمرير البيانات الأساسية للودجت وهي الاسم والوصف بالإضافة للمعرف وكذلك اسم صنف CSS الذي سيقوم ووردبريس بإضافة للودجت، ويتم ذلك بهذه الطريقة:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">$widget_details = array( 'classname' =&gt; 'ha_views_widget', 'description' =&gt; 'ودجت لعرض المقالات الأكثر مشاهدة' ); 
parent::__construct( 'ha_views_widget', 'المقالات الأكثر مشاهدة', $widget_details );</pre><p>الان ستجد أن الودجت ظهرت في لوحة تحكم ووردبريس بالاسم والوصف اعلاه.</p></div><div id="wmd-preview-section-56"><h4 id="الدالة-form"><strong>الدالة <span style="font-family:courier new,courier,monospace;">form</span></strong></h4><p>نود أن نضيف للمستخدم خيار لاختيار عدد المقالات الأكثر مشاهدة التي يود عرضها في واجهة الموقع وخيار آخر لاختيار عنوان الودجت الذي سيظهر أعلى المقالات، وهذا ما ستقوم به هذه الدالة فهي المسؤولة عن إنشاء النموذج form الذي سيظهر للمستخدم في لوحة التحكم، وهذه هي الصورة النّهائية لها:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">public function form( $instance ) { 
    $instance = wp_parse_args( (array) $instance, array( 'title' =&gt; '', 'count' =&gt; '' ) );
    $title = strip_tags($instance['title']);
    $count = $instance['count'];
?&gt;
    &lt;p&gt;&lt;label for="&lt;?php echo $this-&gt;get_field_id('title'); ?&gt;"&gt;&lt;?php _e('العنوان:'); ?&gt;&lt;/label&gt;
    &lt;input class="widefat" id="&lt;?php echo $this-&gt;get_field_id('title'); ?&gt;" name="&lt;?php echo $this-&gt;get_field_name('title'); ?&gt;" type="text" value="&lt;?php echo esc_attr($title); ?&gt;" /&gt;&lt;/p&gt;
    &lt;p&gt;&lt;label for="&lt;?php echo $this-&gt;get_field_id('count'); ?&gt;"&gt;&lt;?php _e('عدد المقالات:'); ?&gt;&lt;/label&gt;
    &lt;input class="widefat" id="&lt;?php echo $this-&gt;get_field_id('count'); ?&gt;" name="&lt;?php echo $this-&gt;get_field_name('count'); ?&gt;" type="text" value="&lt;?php echo $count; ?&gt;" /&gt;&lt;/p&gt;
&lt;?php
}</pre></div><div id="wmd-preview-section-57"><h4 id="الدالة-update"><strong>الدّالة <span style="font-family:courier new,courier,monospace;">update</span></strong></h4><p>هذه الدالة مهمتها بسيطة جدا وهي حفظ خيارات المستخدم عندما يقوم بتعديلها من خلال الضغط على زر الحفظ، وهي ببساطة تقوم بإرجاع القيم الجديدة للخيارات بالصورة التالية:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">public function update( $new_instance, $old_instance ) { 
    return $new_instance; 
}</pre></div><div id="wmd-preview-section-58"><h4 id="الدالة-widget"><strong>الدالة <span style="font-family:courier new,courier,monospace;">widget</span></strong></h4><p>سنقوم من خلال هذه الدالة بعرض اكثر المقالات مشاهدة وذلك من خلال استخدام حلقة ووردبريس لجلب المقالات وذلك باستخدام صنف <span style="font-family:courier new,courier,monospace;">WP_Query </span>والذي يمكننا من تحديد المقالات التي نود جلبها وفي حالتنا هذه نود جلب أعلى المقالات مشاهدة اعتمادًا على قيمة الميتا <span style="font-family:courier new,courier,monospace;">post_meta</span> التي استخدمناها سابقا لحفظ عدد المقالات، أي أننا نود جلب المقالات مرتبة على حسب قيمة الميتا <span style="font-family:courier new,courier,monospace;">ha_post_views_count</span> ولحسن الحظ يوفر صنف <span style="font-family:courier new,courier,monospace;">WP_Query</span> طريقة سهلة لإنشاء مثل هذا الاستعلام. <br>وهذه هي صورة الاستعلام:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">$count = ( ! empty( $instance['count'] ) ) ? $instance['count'] :  5 ;
$query_args = array(
        'meta_key'       =&gt; 'ha_post_views_count',
        'orderby'        =&gt; 'meta_value_num',
        'posts_per_page' =&gt; $count
        )
$query = new WP_Query($query_args);</pre><p>حيث أننا باختيار قيمة <span style="font-family:courier new,courier,monospace;">orderby</span> لتكون على حسب <span style="font-family:courier new,courier,monospace;">meta_value_num</span> أي على حسب قيمة الميتا وهي قيمة عددية، وكذلك قمنا باختيار عدد المقالات المعروض ليساوي<span style="font-family:courier new,courier,monospace;"> count$ </span>وهي القيمة التي سيدخلها المستخدم والتي نستطيع التوصل إليها من خلال المتغير <span style="font-family:courier new,courier,monospace;">instance$</span> الذي يتم تمريره للدالة والذي من خلاله يمكنك الوصول للبيانات التي قام المستخدم بإدخالها في لوحة التحكم. في حالة لم يقم المستخدم باختيار عدد المقالات المعروضة سيتم عرض 5 مقالات. <br>الآن لم يتبقَ لنا سوى إنشاء الحلقة وعرض عناوين وروابط المقالات وكذلك عنوان الودجت لتصبح الصورة النهائية لهذه الدالة كالاتي:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">public function widget($args, $instance ) { 

$title = ( ! empty( $instance['title'] ) ) ? $instance['title'] :  'المقالات الأكثر مشاهدة' ;
$count = ( ! empty( $instance['count'] ) ) ? $instance['count'] :  5 ;

$query_args = array(
            'meta_key'       =&gt; 'ha_post_views_count',
            'orderby'        =&gt; 'meta_value_num',
            'posts_per_page' =&gt; $count
            );
    $query = new WP_Query($query_args);

    if($query-&gt;have_posts()):
?&gt;
    &lt;?php echo $args['before_widget']; ?&gt;
    &lt;?php if ( $title ) {
        echo $args['before_title'] . $title . $args['after_title'];
    } ?&gt;
    &lt;ul&gt;
    &lt;?php while ( $query-&gt;have_posts() ) : $query-&gt;the_post(); ?&gt;
        &lt;li&gt;
            &lt;a href="&lt;?php the_permalink(); ?&gt;"&gt;&lt;?php get_the_title() ? the_title() : the_ID(); ?&gt;&lt;/a&gt;
        &lt;/li&gt;
    &lt;?php endwhile; ?&gt;
    &lt;/ul&gt;
    &lt;?php echo $args['after_widget']; ?&gt;
&lt;?php
    wp_reset_postdata();
    endif;
}</pre><p>وبهذا نكون قد أكملنا برمجة الودجت ولا تنس إضافة بعض التنسيقات للودجت في ملف <span style="font-family:courier new,courier,monospace;">widget.css</span> والذي قمنا بصفه سابقا.</p></div><div id="wmd-preview-section-59"><h2 id="اقتراحات-لتطوير-الإضافة">اقتراحات لتطوير الإضافة</h2><p>كانت هذه النسخة الأولى من الإضافة بالتالي تحتوي على المميزات الأساسية ويمكنك إضافة المزيد من المميزات في النسخ القادمة وسنقترح عليك بعض التطوير لتتدرب عليها، وهي:</p><ul><li>إضافة خيار في الشيفرة المختصرة shortcode لإدخال معرف المقال الذي تود عرض عدد مشاهداته، فربما يود المستخدم عرض عدد مشاهدات مقال ما داخل مقال آخر.</li><li>إضافة المزيد من الخيارات للودجت مثل اختيار المدة الزمنية للمقالات المعروضة، مثلا أشهر المقالات خلال هذا الأسبوع.</li><li>التعديل على ما يعرضه الويدجت وكذلك تنسيقه، كأن تعرض مثلا صور بارزة للمقالات الأكثر مشاهدة.</li></ul><p>يمكنك تحميل أو نسخ الإضافة من <a rel="external nofollow" href="https://github.com/adilelsaeed/ha-views-plugin">هذا الرابط</a>.</p></div><div id="wmd-preview-section-60"><h2 id="أدوات-مفيدة-لمطوري-إضافات-ووردبريس">أدوات مفيدة لمطوري إضافات ووردبريس</h2><p>هنالك بعض المصادر والمواقع والأدوات التي توفر لك كثيرًا من الجهد والوقت عند برمجة إضافات ووردبريس خصوصا مع شهرة ووردبريس فهذا يعني أن هنالك العديد من الأسئلة التي قد تخطر ببالك قد تم الإجابة عنها مسبقا وبعض الأشياء التي تود برمجتها ربما سبقك بها بعض المطورين وقاموا بإتاحتها لمجتمع المطورين ولا ننسى المصادر الرائعة التي لا غنى لك عنها في كثير من الأحيان، وإليك بعض هذه الأدوات.</p></div><div id="wmd-preview-section-61"><h3 id="مكتبات-وفئات-classes-جاهزة">مكتبات وفئات Classes جاهزة</h3></div><div id="wmd-preview-section-62"><h4 id="1-wordpress-plugin-boilerplate"><a rel="external nofollow" href="http://wppb.io/">1- WordPress Plugin Boilerplate</a></h4><p>وهي عبارة عن نموذج جاهز أو أساس يمكنك استخدامه لبناء إضافتك، وما يميزها أنه تم بناءها من قبل المطور المشهور <a rel="external nofollow" href="https://twitter.com/tommcfarlin">Tom McFarlin</a> كما أنه تم بنائها بأسلوب برمجة الكائنات Object Oriented Programming بالتّالي تعتبر بالفعل أساسًا جيّدًا لإضافة قابلة للتطوير. فوق ذلك هنالك <a rel="external nofollow" href="http://wppb.me/">مولد</a> يمكنك استخدامه لإنشاء ملفات إضافتك بالاعتماد على هذا النموذج.</p></div><div id="wmd-preview-section-63"><h4 id="2-cmb2"><a rel="external nofollow" href="https://github.com/WebDevStudios/CMB2">2- CMB2</a></h4><p>وهذه عبارة عن مكتبة جاهزة للتعامل مع الحقول المُخصصة Custom fields لأنواع المقالات المختلفة Post Types وكذلك الحقول والبيانات الخاصة بالمستخدمين User Meta كما يمكنك استخدامها لإنشاء صفحات الخيارات Options Page ويمكنك دمجها في مشروعك بسهولة. تدعم هذه المكتبة عددًا كبيرًا جدًا من الحقول المتقدمة ويمكنك إضافة أنواع جديدة بسهولة حيث توفر مجموعة كبيرة من <a href="https://academy.hsoub.com/code/php/wordpress/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A5%D8%B6%D8%A7%D9%81%D8%A7%D8%AA-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%A7%D9%84%D8%AE%D9%8F%D8%B7%D9%91%D8%A7%D9%81%D8%A7%D8%AA-hooks-r40/">الخطافات Hooks</a> التي تسهل من عملية التعديل عليها وزيادة مميزاتها بدون لمس الشيفرات الأساسية. ولا ننسى أن نذكر أن هذه المكتبة والنسخة الأولى منها CMB لقيت قبول ورواج كبير بين مطوري ووردبريس.</p></div><div id="wmd-preview-section-64"><h4 id="3-settings-api-class"><a rel="external nofollow" href="https://github.com/tareq1988/wordpress-settings-api-class">3- Settings <abbr title="واجهة برمجية | Application Programming Interface">API</abbr> Class</a></h4><p>في بعض الأحيان يكون التعامل مع Settings <abbr title="واجهة برمجية | Application Programming Interface">API</abbr> بطيئًا وربما مُتعبًا بعض الشّيء، في مثل هذه الحالات يمكنك استخدام هذه الصّنف الجاهز التي تُسهّل التّعامل مع هذه الواجهة البرمجية، خصوصا إذا لم ترد أن تُثقل مشروعك بمكتبات كبيرة.</p></div><div id="wmd-preview-section-65"><h3 id="إضافات-للمطورين">إضافات للمطورين</h3></div><div id="wmd-preview-section-66"><h4 id="1-إضافة-developer"><a rel="external nofollow" href="https://wordpress.org/plugins/developer/">1- إضافة Developer</a></h4><p>هذه الإضافة تساعدك في عملية التطوير وبعد تنصيب الإضافة تعرض عليك اختيار ما تقوم بتطويره (إضافة، قالب) وبعدها تعرض عليك مجموعة من الإضافات التي تعمل معها لتنصيبها كما موضح في الصورة:</p><p style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_06/developer.JPG.29507aee95fffc44f52c82001c294845.JPG" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="3122" src="https://academy.hsoub.com/uploads/monthly_2015_06/developer.thumb.JPG.703f9e5bde814c54f384f07c9191742a.JPG" class="ipsImage ipsImage_thumbnailed" alt="developer.thumb.JPG.703f9e5bde814c54f384"></a></p><p>وإليك بعض أهم هذه الإضافات:</p><ul><li>Debug Bar وكما يظهر من اسمها حيث تعرض قائمة لعمل Debug للاستعلامات Query والـ Cache ومجموعة أخرى من المعلومات المفيدة لعمل Debug.</li><li>Rewrite Rules Inspector وهي عبارة عن أداة لتحليل قواعد إعادة كتابة الروابط links rewrite rules.</li><li>log Viewer توفر لك طريقة سهلة لعرض ملفات Log عن طريق لوحة تحكم ووردبريس مباشرة.</li></ul></div><div id="wmd-preview-section-67"><h4 id="2-إضافة-query-monitor"><a rel="external nofollow" href="https://wordpress.org/plugins/query-monitor/">2- إضافة Query Monitor</a></h4><p>تقوم هذه الإضافة بعرض معلومات متعلقة باستعلامات قاعدة البيانات مثل الأداء Performance للاستعلامات وكذلك الخطافات Hooks وغيرها من المعلومات المفيدة التي تساعدك في تتبع الأخطاء وزيادة كفاءة وسرعة استعلامات قاعدة البيانات.</p></div><div id="wmd-preview-section-68"><h3 id="مواقع-ومصادر">مواقع ومصادر</h3></div><div id="wmd-preview-section-69"><h4 id="1-التوثيق-الرسمي-لووردبريس-wordpress-codex"><a rel="external nofollow" href="http://codex.wordpress.org/">1- التّوثيق الرّسمي لووردبريس WordPress Codex</a></h4><p>ببساطة إذا أردت احتراف برمجة ووردبريس فليكن هذا مصدرك الأول. يحتوي على توثيق للدوال والأصناف والخطافات التي يوفرها ووردبريس كما يحتوي على بعض المصادر والمراجع بل وحتى على كُتب للمطورين.</p></div><div id="wmd-preview-section-70"><h4 id="2-القسم-الخاص-بووردبريس-في-موقع-stackexchange"><a rel="external nofollow" href="http://wordpress.stackexchange.com/">2- القسم الخاص بووردبريس في موقع StackExchange</a></h4><p>في كثير من الأحيان تقابلك بعض المشاكل التي قد لا تجد لها إجابة في المصادر المعروفة وعندها ربما تحتاج الى طرح هذه المشكلة على المختصين وهذا الموقع من أنسب المواقع لطرح الأسئلة المتعلقة بووردبريس.</p></div><div id="wmd-preview-section-71"><h4 id="3-مجموعة-advanced-wordpress-على-فيس-بوك"><a rel="external nofollow" href="https://www.facebook.com/groups/advancedwp/">3- مجموعة Advanced WordPress على فيس بوك</a></h4><p>نعم هذه مجموعة على فيس بوك لكنها مختلفة نوعا ما فهي تجمع مجموعة كبيرة من محترفي ووردبريس ومطوري بعض الإضافات الشهيرة مثل <a rel="external nofollow" href="https://twitter.com/yoast">Joost de Valk</a> مطور إضافة WordPress SEO by Yoast المشهورة.</p></div><div id="wmd-preview-section-72"><h4 id="4-رابطة-مطوري-ووردبريس-باللغة-العربية"><a rel="external nofollow" href="https://www.facebook.com/groups/dev.wordpress/">4- رابطة مطوري ووردبريس (باللغة العربية)</a></h4><p>على غرار المجموعة السابقة هذه مجموعة أخرى تجمع عدد كبير من مستخدمي ومطوري ووردبريس العرب، بالتالي هي مكان جيد لتبادل الأفكار والآراء وحتى الأسئلة.</p></div><div id="wmd-preview-section-73"><h4 id="5-موقع-managewporg"><a rel="external nofollow" href="http://managewp.org/">5- موقع ManageWP.org</a></h4><p>هذا الموقع يبقيك على إطلاع دائم على آخر المقالات المتعلقة بووردبريس من مختلف المواقع، حيث يمكن للأعضاء مشاركة المواضيع المتعلقة بووردبريس وتقييمها، لذلك يستحسن أن يكون هذا الموقع في مفضلتك للعودة إليه بصورة يومية.</p></div><div id="wmd-preview-section-74"><h4 id="6-موقع-wpsnipp"><a rel="external nofollow" href="http://wpsnipp.com/">6- موقع wpsnipp</a></h4><p>مجموعة من الشيفرات الجاهزة لعمل أشياء مختلفة ربما تفيدك.</p></div><div id="wmd-preview-section-75"><h4 id="7-موقع-wp-snippets"><a rel="external nofollow" href="http://wp-snippets.com/">7- موقع WP-Snippets</a></h4><p>شبيه بالموقع السابق.</p></div>
]]></description><guid isPermaLink="false">113</guid><pubDate>Tue, 30 Jun 2015 04:40:43 +0000</pubDate></item><item><title>&#x623;&#x641;&#x636;&#x644; &#x637;&#x631;&#x64A;&#x642;&#x629; &#x644;&#x644;&#x62A;&#x651;&#x639;&#x62F;&#x64A;&#x644; &#x639;&#x644;&#x649; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633; &#x648;&#x625;&#x636;&#x627;&#x641;&#x629; &#x646;&#x635; &#x628;&#x631;&#x645;&#x62C;&#x64A; &#x625;&#x644;&#x64A;&#x647;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%A3%D9%81%D8%B6%D9%84-%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D9%84%D9%84%D8%AA%D9%91%D8%B9%D8%AF%D9%8A%D9%84-%D8%B9%D9%84%D9%89-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%88%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D9%86%D8%B5-%D8%A8%D8%B1%D9%85%D8%AC%D9%8A-%D8%A5%D9%84%D9%8A%D9%87-r109/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/wp-code.jpg.0c172f1bf597aa82d07f406d8ea8517b.jpg" /></p>
<p dir="rtl">
	يقوم النّاس بتنصيب مواقع ووردبريس كل يوم. بعضهم يستخدمه كما هو دون تغيير. ببساطة، ينصبون ووردبريس، يهيؤونه، ويستخدمون قالبًا دون أي تعديل فيه. ويبدؤون بالتدوين وهذا كل شيء. والبعض الآخر يفضل تخصيص الأشياء قليلًا. وبينما يمكنك تحقيق الكثير عن طريق استخدام قالب التصميم المناسب واختيار إضافات معينة، ربما يأتي عليك وقت تحتاج فيه للدخول إلى النص البرمجي بنفسك وإضافة بعض السطور.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/wp-code.jpg.798e65f7eba2a9da38440a443fd7bd59.jpg" data-fileid="3111" data-fileext="jpg" rel=""><img alt="wp-code.thumb.jpg.e08b59584d756ba8f76b58" class="ipsImage ipsImage_thumbnailed" data-fileid="3111" src="https://academy.hsoub.com/uploads/monthly_2015_06/wp-code.thumb.jpg.e08b59584d756ba8f76b58e6b31a8738.jpg"></a>
</p>

<p dir="rtl">
	ولكن كيف تفعل ذلك؟ هذا هو السؤال الذي سنستكشف إجابته اليوم.
</p>

<h2 dir="rtl">
	الأمر نسبي
</h2>

<p dir="rtl">
	نعم، هاتان الكلمان هي الإجابة القصيرة لذلك السؤال.
</p>

<p dir="rtl">
	لكن هكذا لن تكون المقالة مثيرة للاهتمام، أليس كذلك؟ أفضل طريقة لإضافة نص برمجي مٌخصَّص لووردبريس يعتمد على عدد من العوامل. ولهذا اخترت تقديم خياراتك بصيغة "إذا كان / فافعل".
</p>

<h2 dir="rtl">
	إذا استخدمت قالبًا صُمِّمَ من قِبل شخص آخر
</h2>

<p dir="rtl">
	فيجب ألّا تضيف نصًا برمجيًا مٌخصَّصًا إلى ملفات ذلك القالب، يقول إريك بويلو (صاحب وكالة برمجية):
</p>

<blockquote class="ipsQuote" data-cite="اقتباس" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p dir="rtl">
			<span style="line-height: 22.3999996185303px;">"حين تجري تحديثات لووردبريس، أو للإضافة، أو للقالب، فأي تعديلات أدخلتها ستحذف تمامًا" </span>
		</p>
	</div>
</blockquote>

<p dir="rtl">
	هذا يبدو مضيعة هائلة للوقت، أليس كذلك؟ إذًا، إذا كان لا يمكنك تعديل الشيفرة مباشرة في ملفات قالب التصميم، فماذا تفعل؟
</p>

<h3 dir="rtl">
	1. أنشئ قالبًا فرعيًا
</h3>

<p dir="rtl">
	وفقًا لبراندون هوارد (مالك لشركة تطوير قوالب ووردبريس)، إنشاء قالب فرعي يسمح لك بإضافة نص برمجي إلى ملف <span style="font-family:courier new,courier,monospace;">functions.php</span> دون القلق من خسارة التعديلات حين تجري تحديثات نظام ووردبريس أو القالب.
</p>

<p dir="rtl">
	بالإضافة إلى ذلك، فإن القوالب الفرعية تساعدك على "استخدام <a href="https://academy.hsoub.com/code/php/wordpress/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A5%D8%B6%D8%A7%D9%81%D8%A7%D8%AA-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%A7%D9%84%D8%AE%D9%8F%D8%B7%D9%91%D8%A7%D9%81%D8%A7%D8%AA-hooks-r40/" rel="">الخطافات hooks الخاصة بووردبريس والقوالب</a> لإضافة النص البرمجي الخاص بك". وبالتالي لن تواجه خطر إعادة الكتابة على تعديلاتك مجددًا.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/add-custom-code-1_(1).png.53dfbc09019cad9cf6b7cd7f23da649c.png" data-fileid="3017" data-fileext="png" rel=""><img alt="add-custom-code-1_(1).thumb.png.c85663bb" class="ipsImage ipsImage_thumbnailed" data-fileid="3017" src="https://academy.hsoub.com/uploads/monthly_2015_06/add-custom-code-1_(1).thumb.png.c85663bb65c4f59c375c747bbab7e20b.png"></a>
</p>

<p dir="rtl">
	إذا لم تمتلك فكرة جيدة عما يكون القالب الفرعي، دعني أشرح لك. إنه بشكل أساسي عبارة عن قالب فرعي للقالب الرئيسي المُنَصّب. ويمكن إنشاؤه بسهولة. إذ كل ما تحتاج فعله هو الولوج إلى موقعك عن طريق FTP وإنشاء مجلد (قد يكون اسم themename-child مناسبًا) ثم أنشء ملف<span style="font-family:courier new,courier,monospace;"> style.css</span> في ذلك المجلد. هذا الملف سيسحب المعلومات من ملف CSS التابع للقالب الرئيسي. ثم ستحتاج لتفعيل القالب الفرعي في لوحة التحكم.
</p>

<p dir="rtl">
	لن أخوض في تفاصيل كيفية فعل ذلك، إذ كتبنا بالفعل مقالًا حول <a href="https://academy.hsoub.com/code/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%A6-%D9%82%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%81%D8%B1%D8%B9%D9%8A-r107/" rel="">كيف تنشئ القالب الفرعي الخاص بك</a> بشكل متعمق سابقًا، لذا يمكنك قراءته إذا قررت أن هذه هي الطريقة التي تريد إضافة النص البرمجي المُخَصَّص بها. بالطبع، هذا الخيار لا يصلح في جميع الحالات.
</p>

<h3 dir="rtl">
	2. استخدم إضافة
</h3>

<p dir="rtl">
	إذا لم تكن مرتاحًا في التّعامل مع الواجهة الخلفية (backend) لووردبريس لكن ما زلت تريد إدخال تعديلات برمجية مٌخصَّصة، يمكنك استخدام إضافة تساعدك على وضع النص البرمجي في أماكن مناسبة على موقعك. وفقًا لسكوت تشاو من مدونة The Blog Starter، استخدام إضافة "سيٌخفِّض بشكل كبير من احتمالية حذف شيء بالخطأ". ولا حاجة لذكر أن مشكلة "تحديث الموقع وخسارة جميع التعديلات" لن تحدث إطلاقًا هنا.
</p>

<p dir="rtl">
	يُرشّح تشاو إضافتين خصيصًا. الأولى هي <a href="http://wordpress.org/extend/plugins/insert-headers-and-footers/" rel="external nofollow">Insert Headers and Footers</a>. هذه الإضافة تساعدك على إدخال النص البرمجي في ترويسة أو ذيل موقعك. وهذا مناسب للأشخاص الذين يريدون إضافة شيء مثل Google Analytics.
</p>

<p dir="rtl">
	الإضافة الثانية التي يرشحها هي <a href="http://wordpress.org/extend/plugins/global-content-blocks/" rel="external nofollow">Global Content Blocks</a>. هذه الإضافة تساعدك على إدخال الشيفرة ضمن المقالات وحفظها كمقتطفات نص برمجي للاستخدام لاحقًا.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/add-custom-code-2_(1).jpg.72606694a5534b73f79d61475dcd03a8.jpg" data-fileid="3018" data-fileext="jpg" rel=""><img alt="add-custom-code-2_(1).thumb.jpg.c609c56d" class="ipsImage ipsImage_thumbnailed" data-fileid="3018" src="https://academy.hsoub.com/uploads/monthly_2015_06/add-custom-code-2_(1).thumb.jpg.c609c56d1dabd8a1044d8bfdc2b1c37c.jpg"></a>
</p>

<p dir="rtl">
	رشحت <a href="http://nataliachriss.com/" rel="external nofollow">ناتاليا كريس</a>، مطورة أخرى تحدثت معها،  إضافة أخرى تدعى <a href="http://wordpress.org/plugins/q2w3-inc-manager/" rel="external nofollow">Code Insert Manager</a> وهي ممتازة لإضافة نصوص برمجية لخدمات مثل Google Analytics, Aweber وGetResponse.
</p>

<p dir="rtl">
	لكن مجددًا، قد لا تجد إضافة تستطيع تحقيق تلك المهمة التي تريد فعلها. في هذه الحالة يمكنك..
</p>

<h3 dir="rtl">
	3. برمجة إضافة
</h3>

<p dir="rtl">
	عندما تريد إعادة تصميم موقع ما مع المحافظة على نفس وظائفه السّابقة – أو ببساطة تريد إضافة نص برمجي إلى موقعك – يمكنك <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+%D8%A8%D8%B1%D9%85%D8%AC%D8%A9+%D8%A5%D8%B6%D8%A7%D9%81%D8%A7%D8%AA+%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3" rel="">برمجة إضافة</a> لتنفيذ ذلك.
</p>

<p dir="rtl">
	يقول أدم سميث، مدير قسم التقنية فيMarketing Mojo:
</p>

<blockquote class="ipsQuote" data-cite="اقتباس" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p dir="rtl">
			<span style="line-height: 22.3999996185303px;">“ألجأ إلى برمجة إضافة جديدة للموقع لإدخال النص البرمجي المٌخصَّص بدلًا من إدخاله في ملف functions.php التابع للقالب. هذا يفصل وظائف ووردبريس عن التصميم" </span>
		</p>
	</div>
</blockquote>

<p dir="rtl">
	موضحًا أن هذا ينطبق غالبًا في حالة استخدام قالب مُصَمَّم من قبل شخص آخر أكثر من إذا كنت من صمّمه من الصفر.
</p>

<p dir="rtl">
	عادة ما يصمم سميث الإضافة المٌخصَّصة بحيث تتضمن أنواع المقالات المٌخصَّصة، الاختصارات النصية، تعديلات على إدارة ووردبريس، وتعديلات أخرى يراها مطلوبة.
</p>

<p dir="rtl">
	وينتهج هوارد أسلوبًا مماثلًا، حيث يقول:
</p>

<blockquote class="ipsQuote" data-cite="اقتباس" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p dir="rtl">
			<span style="line-height: 22.3999996185303px;">"هناك حالات عديدة نبني فيها إضافات مٌخصَّصة بحوالي 10-20 سطرًا برمجيّا ببساطة لأننا نريد إضافة خاصية صغيرة، وهذا مهم للإبقاء على الخاصية حتى لو تغير القالب.”</span>
		</p>
	</div>
</blockquote>

<h2 dir="rtl">
	إذا أنشأت قالبك الخاص
</h2>

<p dir="rtl">
	تحدثنا حتى الآن عما نفعله إذا أردت إضافة نص برمجي مٌخصَّص إلى قالب حملته مجانًا أو بمقابل مادي من على متجر قوالب. ولكن ماذا لو كان القالب من صنعك؟ ما هي أفضل الممارسات لهذه الحالة؟
</p>

<p dir="rtl">
	يذكر بويلو في حالة ما إذا كنت قد <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+%D8%AA%D8%B7%D9%88%D9%8A%D8%B1+%D9%82%D9%88%D8%A7%D9%84%D8%A8+%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3" rel="">أنشأت قالبك من الصفر</a>، "فيجب أن تدخل الشيفرة مباشرة في القالب"، هذا يشكل تأثيرًا إيجابيًا على تطوير سرعة الموقع وكفاءته. فقط التعديل على ملف <span style="font-family:courier new,courier,monospace;">functions.php</span> التابع للقالب حين تحتاج لإجراء تغييرات سيكون كافيًا.
</p>

<h3 dir="rtl">
	إنشاء إضافة (نعم، مجددًا)
</h3>

<p dir="rtl">
	نعم، تنطبق هذه الطريقة على كلا الحالتين سواء أكنت تستخدم قالب مُصَمَّمًا من قبل أشخاص آخرين أو صمّمته بنفسك.
</p>

<p dir="rtl">
	هناك بعض المزايا لإنشاء إضافة لتلحقها بقالبك الخاص. ليس فقط سهولة تفعيل وإيقاف وظائف معينة للموقع حين تقرر أنك لا تحتاجها، بل أيضًا تعطيك الفرصة للتوسع إلى <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+%D8%A8%D8%B1%D9%85%D8%AC%D8%A9+%D8%A5%D8%B6%D8%A7%D9%81%D8%A7%D8%AA+%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3" rel="">تطوير الإضافات</a>. يقول بويلو:
</p>

<blockquote class="ipsQuote" data-cite="اقتباس" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p dir="rtl">
			<span style="line-height: 22.3999996185303px;">"إذا اعتقدت أن النص البرمجي الذي استخدمته في الإضافة سيفيد مطورين آخرين فيمكنك حينئذ التفكير في إنشاء إضافة جديدة تحت اسمك وإدراجها على موقع ووردبريس لمساعدة الآخرين".</span>
		</p>
	</div>
</blockquote>

<h2 dir="rtl">
	حسنًا، ما هو أفضل حل؟
</h2>

<p dir="rtl">
	من جديد، الأمر نسبي. اتفق كل المطورين الذين تحدثت معهم على ذلك. وهذا لا ينفي أن هناك بضع قواعد مجربة وصحيحة. حين تحتاج لإضافة نص برمجي مٌخصَّص إلى موقع ووردبريس، فيجب عليك أن:
</p>

<ul dir="rtl">
	<li>
		تستخدم قالبًا فرعيًا عند <a href="https://www.wpar.net/how-to-edit-wordpress-theme/" rel="external">التعديل على خصائص قالب</a> مُصَمَّم من قبل شخص آخر، أو
	</li>
	<li>
		تستخدم إضافة لإضافة سطور النص البرمجي إلى موقعك، أو
	</li>
	<li>
		تُبرمج إضافات للحصول على مجال أوسع من إضافة الخصائص.
	</li>
</ul>

<p dir="rtl">
	هذه الخطة ستساعدك على إنشاء مواقع مُخصَّصة تبقى كما تريد لها أن تكون، بغض النظر عن أي تحديث جديد.
</p>

<h1 dir="rtl">
	خاتمة
</h1>

<p dir="rtl">
	إن قرأت كامل المقال بتمعّن فستدرك بشكل أفضل كيفية إضافة نصوص برمجية مُخصَّصة إلى موقع ووردبريس الخاص بك وما هي أفضل طريقة بناءً للقيام بذلك اعتمادًا على حالتك الخاصّة.
</p>

<p dir="rtl">
	هل سبق لك أن واجهت نفس الوضع؟ هل وجدتَ طريقة مختلفة وأكثر كفاءة؟  شاركنا بها
</p>

<p dir="rtl">
	ترجمة -وبتصرف- للمقال <a href="https://managewp.com/wordpress-custom-code" rel="external nofollow">What's The Best Way To Add Custom Code To WordPress؟</a> لكاتبته Brenda Barron.
</p>

<p dir="rtl">
	حقوق الصور محفوظة لـ: +<a href="http://tutsplus.com/" rel="external nofollow">Tuts</a>
</p>
]]></description><guid isPermaLink="false">109</guid><pubDate>Mon, 29 Jun 2015 17:37:00 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Ajax &#x645;&#x639; PHP  &#x641;&#x64A; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-ajax-%D9%85%D8%B9-php-%D9%81%D9%8A-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r110/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/1_(1).png.e70f18222eb00f85f6c3e1b322ea503e.png" /></p>

<p>تمنح تقنيّة Ajax مواقع الويب إمكانيّةَ تحميل محتوى إلى عناصر مختلفة ضمن الصّفحة دون الحاجة لإنعاش Refresh الصّفحة. قد لا تبدو - للوهلة الأولى - ميزةً مؤثّرة، إلّا أنّها تمكّن من فعل الكثير من الأمور.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/1_(1).png.2224e900fe3162f6c50f28ceaaf94e7c.png"><img data-fileid="3065" class="ipsImage ipsImage_thumbnailed" alt="1_(1).thumb.png.4c9b087b4c4268c99c075dbf" src="https://academy.hsoub.com/uploads/monthly_2015_06/1_(1).thumb.png.4c9b087b4c4268c99c075dbfe11a7c48.png"></a></p><p>تستخدم الكثير من الإجراءات مثل التّصويت، إبداء الإعجاب، التّعليقات على Disqus والتّغريدات على تويتر؛ وإجراءات أخرى كثيرة Ajax للحصول على تجربة مستخدم User experience لا مثيل لها.</p><p>ذاع صيت Ajax سنة 2005 عندما استخدمته Google في ميزة اقتراحات البحث، الّتي تُظهر اقتراحات أثناء الكتابة على محرّك بحث Google. لم تكن هذه الميزة لترى النّور لولا وجود تقنيّة Ajax.</p><p>سنعرض في هذا المقال لكيفيّة استخدام Ajax في ووردبريس. سيكون الأمر أكثر تعقيدًا قليلًا ممّا تعوّدت عليه، إلّا أنّ الأمور ستجري على ما يُرام إن كان لديك فهم جيّد CSS، HTML وPHP؛ إضافةً لفهم لأساسيّات Javascript.</p><h2 id="كيف-يعمل-ajax">كيف يعمل Ajax</h2><p>ليس Ajax في الواقع سوى Javascript. تأتي كلمة Ajax اختصارًا لAsynchronous Javascript And XML (أي: Javascript وXML لا تزامنيّان). تهدف تقنيّة Ajax إلى أن تكون جسرًا بين موقع الويب والخادوم، وهو ما يعني أنّك ستسخدمها بالتّزامن مع Javascript، CSS، HTML وربّما PHP أيضًا؛ الأمر الّذي قد يعقّد الأمور قليلًا.</p><p>يعدّ الكائن <code>XMLHttpRequest</code> الّذي يتبادل البيانات مع الخادوم الأساس الّذي تقوم عليه تقنيّة Ajax. يشبه عمل Ajax عمومًا إرسال استمارة في صفحة ويب. في ما يلي الخطوات الأساسيّة:</p><ul><li>تحدّد البيانات الّتي تريد إرسالها</li><li>تضبُط نداء Ajax</li><li>تستخدم كائن <code>XMLHttpRequest</code> لإرسال البيانات إلى الخادوم</li><li>تحصُل على إجابة من الخادوم. يُمكن استخدام ردّ الخادوم ضمن شفرة Javascript.</li></ul><p>يكثُر استخدام Ajax عبر دوالّ التّغليف Wrapper functions في <a href="https://academy.hsoub.com/code/javascript/jquery/">jQuery</a>، لذا سنركّز على هذه الطّريقة في هذا المقال.</p><h2 id="أول-نداء-ajax">أوّل نداء Ajax</h2><p>سنحتاج قبل البدء في كتابة شفرة Ajax إلى قالب يُمكن التّعديل عليه، قالب فرعيّ أو إضافة. أنصح باستخدام إضافة. إنشاء إضافة سهل: أنشئ مجلَّدًا فرعيًّا ضمن <code>wp-content/plugins</code> (اخترتُ اسم <code>ajax-text</code>). أنشئ ملفّ PHP ضمن المجلَّد وأعطِه نفس اسم المجلَّد (<code>ajax-text.php</code>) وألصِق الشفرة التّاليّة في الملفّ:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">&lt;?php
/**
* Plugin Name: Ajax Test
* Plugin URI: &lt;a href="http://danielpataki.com"&gt;http://danielpataki.com&lt;/a&gt;
* Description: This is a plugin that allows us to test Ajax functionality in WordPress
* Version: 1.0.0
* Author: Daniel Pataki
* Author URI: &lt;a href="http://danielpataki.com"&gt;http://danielpataki.com&lt;/a&gt;
* License: GPL2
*/</pre><p> </p><p>ستظهر الإضافة، بعد حفظ الملفّ، في ركن الإضافات في لوحة التّحكّم بووردبريس. فعّلها. للمزيد حول تطوير إضافات ووردبريس راجع دليل <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+%D8%A8%D8%B1%D9%85%D8%AC%D8%A9+%D8%A5%D8%B6%D8%A7%D9%81%D8%A7%D8%AA+%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3">مدخل إلى برمجة إضافات ووردبريس</a>.</p><h3 id="صف-enqueueing-ملف-javascript">1- صفّ Enqueueing ملفّ Javascript</h3><p>سنحتاج لماستخدام ملفّ JavaScript في الإضافة، لذا سنصُفّ الملفّ. نستخدم الشّفرة التّاليّة لهذا الغرض:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">add_action( 'wp_enqueue_scripts', 'ajax_test_enqueue_scripts' );
function ajax_test_enqueue_scripts() {
  wp_enqueue_script( 'test', plugins_url( '/test.js', __FILE__ ), array('jquery'), '1.0', true );
}</pre><p>تُضيف الشّفرة أعلاه ملفّ <code>test.js</code> إلى الموقع. أخبرنا ووردبريس أنّ jQuery اعتماديّة يجب تحميلها في التّذييل Footer.</p><p>الخطوة التّاليّة هي إنشاء نداء Ajax بسيط داخل ملفّ Javascript.</p><h3 id="إنشاء-نداء-ajax">2- إنشاء نداء Ajax</h3><p>يحوي نداء Ajax على العديد من المعطيات، سنتعرّف على الأساسيّة منها.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">jQuery(document).ready( function($) {

  $.ajax({
    url: "http://yourwebsite.com",
    success: function( data ) {
      alert('يبلُغ عدد عناصر div في الصّفحة الرّئيسيّة لديك:' + $(data).find('div').length);
    }
  })

})</pre><p>كلّ ما فعلناه هو استخدام دالّة <code>()ajax.$</code> وتحديد بعض الخيّارات. يحدّد المُعطى <code>url</code> لنداء Ajax أين يجب أن يُرسل الطّلب الّذي تستقبل الدّالةُ الموجودة في المعطى <code>success</code> الإجابةَ عليه.</p><p>يجب أن يُحيل المُعطى <code>url</code> إلى رابط الصّفحة الرّئيسيّة لموقعك. ستظهر لك، إذا نفّذت الخطوات بطريقة صحيحة، نافذةٌ منبثقة بعدد عناصر <code>div</code> الموجودة في الصّفحة الرئيسيّة فورَ إنعاش الصّفحة (ﻷخذ التّغييرات على الإضافة في الحسبان).</p><div class="figure" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/558e1f17d70a6_01___div.png.a74988e98b6f6a7cced4f13bddd4d3d2.png"><img data-fileid="3025" class="ipsImage ipsImage_thumbnailed" alt="558e1f17d9bdc_01___div.thumb.png.b2d0668" src="https://academy.hsoub.com/uploads/monthly_2015_06/558e1f17d9bdc_01___div.thumb.png.b2d0668b87d2ac45f776c712ff540a80.png"></a></div><p>لا يبدو المظهر أنيقًا؛ إلّا أنّ ما فعلناه في الواقع هو تحميل صفحة مختلفة تمامًا دون إعادة تحميل تلك الّتي نوجد فيها.</p><h2 id="مثال-كامل-لاستخدام-ajax-في-ووردبريس">مثال كامل لاستخدام Ajax في ووردبريس</h2><p>يوفّر ووردبريس دعمًا أكبر للمساعدة في استخدام نداءات Ajax ويقدّم آليّة معياريّة لتأديّتها. سنُبدِل عنوان <code>url</code> بآخر أكثر ديناميكيّة وننشئ طريقةً أفضل للتّخاطب مع الخادوم. سنعرض في المثال التّالي كيفيّةَ إضافة ميزة “أعجبني هذا المقال” إلى موقعنا.</p><p>أنشأتُ إضافةً جديدة لهذا الغرض باسم “post-love”، يمكن الملفّ المضغوط للإضافة في آخر الدّرس.</p><p>ملحوظة: يجب تعطيل وحذف الإضافة السّابقة <code>ajax-text</code> حتى يمكن للإضافة الجديدة <code>post-love</code> العمل بطريقة صحيحة.</p><h3 id="تخزين-وعرض-البيانات">1- تخزين وعرض البيانات</h3><p>سنستخدم <a href="https://academy.hsoub.com/code/php/wordpress/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%85%D9%86%D8%B4%D9%88%D8%B1%D8%A7%D8%AA-%D9%85%D9%8F%D8%AE%D8%B5%D9%91%D8%B5%D8%A9-custom-post-types-%D9%81%D9%8A-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r100/#3-">حقلًا مُخصَّصًا</a> Custom field لحفظ عدد الإعجابات الّتي تلقّاها المنشور. سنسمّي هذا الحقل <code>post_love</code> وسنعرض قيمته تحت كلّ مقال في صفحة منفردة Single page. في ما يلي كيفيّة ذلك (ملفّ <code>content-filter.php</code>):</p><p> </p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">add_filter( 'the_content', 'post_love_display', 99 );
function post_love_display( $content ) {
  $love_text = '';
  if ( is_single() ) {
    $love = get_post_meta( get_the_ID(), 'post_love', true );
    $love = ( empty( $love ) ) ? 0 : $love;
    $love_text = '&lt;p class="love-received"&gt;&lt;a class="love-button" href="#" data-id="' . get_the_ID() . '"&gt;أبدِ(ي) إعجابك&lt;/a&gt;&lt;span id="love-count"&gt;' . $love . '&lt;/span&gt;&lt;/p&gt;';
  }
  return $content . $love_text;
}</pre><p> </p><p>يمكننا عبر استخدام <code>content-filter.php</code> عرض أيّ شيء نُريده أسفل محتوى المقال مباشرةً. نستخدم دالّة <code>()is_singl</code> للتّأكّد من أنّ الإعجابات تظهر على الصّفحات المنفردة. نحصُل على عدد الإعجابات من الحقل المخصَّص <code>post_love</code> ونتأكّد من أنّ العدد يساوي صفرًا إن لم توجد إعجابات حتى اللّحظة.</p><p>استخدمنا HTML لعرض رابط لإبداء الإعجاب وعدد الإعجابات. نحصُل على معرّف المقال عبر الدّالّة <code>()get_the_ID</code> ونمرّره لدالّة <code>get_post_meta</code> الّتي نحصُل من خلالها على قيمة الحقل المخصَّص <code>post_love</code>؛ ثمّ في اﻷخير نُرجِع المحتوى متبوعًا بالنّص الّذي أنشأناه للتّو.</p><p>نستخدم CSS لإضافة بعض التّحسينات على طريقة العرض عبر صفّ ملفّ CSSكان تفهم جيّدًا  على النّحو التّاليّ:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">add_action( 'wp_enqueue_scripts', 'post_love_assets' );
function post_love_assets() {
  if( is_single() ) {
    wp_enqueue_style( 'love', plugins_url( '/love.css', __FILE__ ) );
  }</pre><p>لاحظ استخدام الشّرط <code>()is_single</code> قبل تحميل ملفّ CSS، يعود السّبب في ذلك إلى أنّه لا معنى لتحميل النّمط في صفحات غير منفردة، حيثُ إنّه لا يُستخدَم إلّا فيها؛ الأمر الّذي يُساعد في التّقليل من تأثير الإضافة على زمن تحميل الموقع.</p><p>أنشئ ملفّ <code>love.css</code> في مجلَّد الإضافة وضمّن فيه النّمط التّالي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">.entry-content .love-button {
  background: #f14864;
  color: #fff;
  padding:11px 22px;
  display:inline-block;
  border:0px;
  text-decoration: none;
  box-shadow: 0px 6px #d2234c;
  position:relative;
}

.entry-content .love-button:hover{
  top:3px;
  box-shadow: 0px 3px #d2234c;
}

.entry-content .love-button:active{
  top:6px;
  box-shadow: none;
}


#love-count {
  background: #eee;
  box-shadow: 0px 6px #ddd;
  color: #666;
  padding:11px 22px;
  display:inline-block;
}</pre><p>تظهر النّتيجة بعد إكمال الخطوات السّابقة على هيئة زرّ بتأثير ثلاثيّ الأبعاد يوجد أمامه عدّاد.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/558e1f1932265_02__.png.6a3568f24043197716decbec73eb30a5.png"><img data-fileid="3026" class="ipsImage ipsImage_thumbnailed" alt="558e1f1935caa_02__.thumb.png.799c612148a" src="https://academy.hsoub.com/uploads/monthly_2015_06/558e1f1935caa_02__.thumb.png.799c612148a85889b15ae13766ba8b58.png"></a></p><p>2- نداء Ajax</p><p>الخطوة التّاليّة هي تجميع نداء Ajax. يستدعي ذلك كتابة السكربت وصَفَّه. سنناقش، قبل البدْء في كتابة السّكربت، معطَى <code>url</code> الموجود في نداء Ajax. في المثال السّابق (<code>ajax-text</code>) كتبنا عنوان الموقع مباشرةً ضمن الشّفرة البرمجيّة، وهي طريقة غير صحيحة أثناء إنشاء الإضافات؛ فكلّ موقع لديه عنوانه الخاصّ.</p><p><strong>ملحوظة</strong>: سنحذف الشّفرة التّاليّة ونعيد كتابتها من جديد مع إضافة نداء Ajax:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">add_action( 'wp_enqueue_scripts', 'post_love_assets' );
function post_love_assets() {
  if( is_single() ) {
    wp_enqueue_style( 'love', plugins_url( '/love.css', __FILE__ ) );
}</pre><p>يوفّر ووردبريس ملفًّا موّحدًا للاستخدام (<code>wp-admin/admin-ajax.php</code>) ووسائلَ للحصول على مسار الملفّ كامِلًا. يستدعي الملفّ بعض الحيّل أثناء صفّه، نعرض لها في الشّفرة التّاليّة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">add_action( 'wp_enqueue_scripts', 'ajax_test_enqueue_scripts' );
function ajax_test_enqueue_scripts() {
  if( is_single() ) {
    wp_enqueue_style( 'love', plugins_url( '/love.css', __FILE__ ) );
  }
  wp_enqueue_script( 'love', plugins_url( '/love.js', __FILE__ ), array('jquery'), '1.0', true );
  wp_localize_script( 'love', 'postlove', array(
    'ajax_url' =&gt; admin_url( 'admin-ajax.php' )
  ));
}</pre><p>تُسجّل الشّفرة أعلاه ملفّ Javascript بالطّريقة المُعتادة، ثمّ تمرّر سلسلة محارف String إلى السّكربت عبر الدّالّة <code>()wp_localize_script</code> (تُستخدَم هذه الدّالّة عادةً <a href="https://academy.hsoub.com/code/php/wordpress/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B7%D9%88%D9%91%D8%B1-%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A5%D8%B6%D8%A7%D9%81%D8%A7%D8%AA-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%84%D9%84%D8%AA%D9%91%D8%B1%D8%AC%D9%85%D8%A9-r105/#%D8%AA%D8%B1%D8%AC%D9%85%D8%A9-javascript">لترجمة سلاسل المحارف الموجودة في Javascript</a>). يُمكنك إضافة سلاسل محارف إلى المصفوفة Array بحسب حاجتك.</p><p>يمكننا الآن استخدام المتغيّر <code>postlove.ajax_url</code> في ملفّ <code>love.js</code> للحصول على مسار <code>admin-ajax.php</code>، على النّحو التّاليّ:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">jQuery( document ).on( 'click', '.love-button', function() {
  var post_id = jQuery(this).data('id');
  jQuery.ajax({
    url : postlove.ajax_url,
    type : 'post',
    data : {
      action : 'post_love_add_love',
      post_id : post_id
    },
    success : function( response ) {
    alert(response)
  }
  });
})</pre><p>ليست هذه النّسخةَ النّهائيّة، لكنّنا وضعنا أساس التّخاطب مع الخادوم. ننفّذ دالّة في كلّ مرة يُضغَط فيها على الزّرّ <code>أبد(ي) إعجابك</code>، ثمّ نأخذ معرّف المقال ونخزّنه في المتغيّر <code>post_id</code>. يُنشئ سكربت <code>love.js</code> نداء Ajax يأخذ في معطى <code>url</code> قيمةَ المتغيّر <code>postlove.ajax_url</code>. بالنّسبة لمعطى <code>type</code> فقد أعطيناه القيمة <code>post</code> أيّ أنّ التّخاطب مع الخادوم سيكون عبر طلبات Post وهي ما يعني أنّنا سنستخدِم المتغيّر <code>POST_$</code>، من جانب الخادوم، للحصول على البيانات.</p><p>توجد في قسم <code>data</code> كلّ المعطيات الّتي تودّ إرسالها. نحتاج لإرسال معرّف المقال (<code>post_id</code>) لنعرِف المقال الّذي أبدى الزّائر إعجابه به. يطلُب ووردبريس تحديد إجراء Action عند استخدام الملفّ <code>admin-ajax.php</code>. حدّدنا الإجراء <code>post_love_add_love</code>.</p><p>أخيرًا نعرض النّتيجة في نافذة منبثقة.</p><p>إذا جربّت التّعديلات الجديدة وضغط على زرّ إبداء الإعجاب فستظهر رسالة منبثقة تحوي عدد مرّات إبداء الإعجاب (<code>0</code>).</p><div class="figure" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/558e1f1abeff1_03__.png.354f23c4dd6c68c40efeb31811e31712.png"><img data-fileid="3027" class="ipsImage ipsImage_thumbnailed" alt="558e1f1aca114_03__.thumb.png.711454391c8" src="https://academy.hsoub.com/uploads/monthly_2015_06/558e1f1aca114_03__.thumb.png.711454391c8e1d66b1908249ad181dd9.png"></a></div><p>لم نعرّف خطّافًا Hook للإجراء <code>post_love_add_love</code> في الشّفرة أعلاه وهو ما يؤدّي ب<code>admin-ajax</code> إلى إرجاع القيمة <code>0</code>. سنعرّف في الفقرة المواليّة الخطّاف النّاقص.</p><h3 id="المعالجة-من-جانب-الخادوم">3- المعالجة من جانب الخادوم</h3><p>وصلنا في هذه المرحلة إلى إرسال بيانات إلى الخادوم دون أن نخبره مالّذي يجب عليه فعله بها. يجب، عند الضّغط على الزّرّ، زيّادة عدد الإعجابات ب<code>1</code> وإرجاع القيمة الجديدة. سنحتاج لإنشاء خطّافَين لهذا الغرض.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">add_action( 'wp_ajax_nopriv_post_love_add_love', 'post_love_add_love' );
add_action( 'wp_ajax_post_love_add_love', 'post_love_add_love' );
function post_love_add_love() {
}</pre><p>يُنفَّذ الخطّاف الأوّل بالنّسبة للزّوّار الضّيوف، والثّاني لمُسجَّلي الدّخول. بالمناسبة، هذه طريقة جيّدة للتّحكّم في الوصول. الاتّفاق هو كالتّالي:</p><p>هل تتذكّر كيف عرّفنا معطى الإجراء في نداء Ajax؟ نحتاج إلى إلحاق هذا المعطى ب<code>_wp_ajax</code> و/أو <code>_wp_ajax_nopriv</code>. بالنّسبة للدّالّة يُمكن استخدام أيّ تسميّة، استخدمنا نفس سلسلة المحارف الموجودة في اسم الإجراء للحفاظ على التّجانس. نُضيف الآن وظيفة الزّيّادة بالتّدرّج Incrementing</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">add_action( 'wp_ajax_nopriv_post_love_add_love', 'post_love_add_love' );
add_action( 'wp_ajax_post_love_add_love', 'post_love_add_love' );
function post_love_add_love() {
  $love = get_post_meta( $_POST['post_id'], 'post_love', true );
  $love++;
  update_post_meta( $_POST['post_id'], 'post_love', $love );
  echo $love;
  die();
}</pre><p>نعثُر على القيمة الحاليّة، نزيدها بواحد ثمّ نخزّن القيمة الجديدة ونعرضها. يجب تنفيذ <code>()die</code> في نهاية الدّالّة وإلّا فإنّ ملفّ <code>admin-ajax.php</code> سينفّذ <code>(0)die</code> الخاصّة به ممّا ينتج عنه عرض <code>0</code> إضافيّ في الإجابة.</p><p>تظهرعند الضّغط على زر إبداء الإعجاب الآن نافذة منبثقة بها عددُ الإعجابات، وعند إنعاش الصّفحة يظهر العدد إلى جانب الزّرّ المذكور.</p><div class="figure" style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/558e1f1c6d05f_04___.png.7528053d2b8fe197b2b1e8b5916a4a0d.png"><img data-fileid="3028" class="ipsImage ipsImage_thumbnailed" alt="558e1f1c77c27_04___.thumb.png.81125e2c51" src="https://academy.hsoub.com/uploads/monthly_2015_06/558e1f1c77c27_04___.thumb.png.81125e2c51e60631d0b5a7ea88d7bb14.png"></a></div><p>لم يتبقّ لنا سوى جعل العدد يتغيّر دون الحاجة لإنعاش الصّفحة. تتكفّل شفرة Javascript التّاليّة بهذه المهمّة:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">jQuery( document ).on( 'click', '.love-button', function() {
  var post_id = jQuery(this).data('id');
  jQuery.ajax({
    url : postlove.ajax_url,
    type : 'post',
    data : {
      action : 'post_love_add_love',
      post_id : post_id
    },
    success : function( response ) {
      jQuery('#love-count').html( response );
    }
  });
})</pre><p>يؤدّي الضّغط على الزّرّ الآن إلى زيّادة عدد الإعجابات دون الحاجة لإنعاش الصّفحة.</p><h3 id="لمسات-أخيرة">4- لمسات أخيرة</h3><p>ربّما لاحظت أنّنا أضفنا في زرّ الإعجاب رابطًا إلى <code>#</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">&lt;a class="love-button" href="#" data-id="' . get_the_ID() . '"&gt;أبدِ(ي) إعجابك&lt;/a&gt;</pre><p>يعود السّبب في ذلك إلى أخذ الحالة الّتي يكون Javascript فيها غير مفعَّل لدى الزّائر. في هذه الحالة يؤدّي الضّغط على الزّرّ إلى إعادة تنزيل الصّفحة. إلّا أنّ استخدام <code>#</code> وحده ضمن وسم Tag الرّابط يجعل هذا الأخير غير صالح Invalid. فلنعالج هذا الأمر.</p><p><strong>ملحوظة</strong>: يُستخدَم ماسك المكان Placeholder <code>#</code> في خاصيّة <code>href</code> ضمن وسم <code>&lt;a&gt;</code> للدّلالة على أنّ الرّابط يُحيل إلى عنصر من الصّفحة يُعطَى معرّفه بعد ماسك المكان (مثلًا:<code>"a href="#id5</code>). استخدام <code>#</code> لوحده يعني أنّ الرّابط يُحيل إلى معرّف غير موجود في الصّفحة. في المحصّلة يُحيل الرّابط إلى الصّفحة لكنّه يبقى غير صالح دلاليًّا Semantic.</p><p>سنعدّل على الشّفرة بحيث يُحيل الرّابط إلى نداء Ajax، مثلًا: <code><a rel="external nofollow" href="http://yourwebsite.com/wp-admin/admin-ajax.php?action=post_love_add_love&amp;post_id=23">http://yourwebsite.com/wp-admin/admin-ajax.php?action=post_love_add_love&amp;post_id=23</a></code> بالنّسبة للزّوّار الّذين يفعّلون Ajax.</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">add_filter( 'the_content', 'post_love_display', 99 );
function post_love_display( $content ) {
  $love_text = '';
  if ( is_single() ) {
    $love = get_post_meta( get_the_ID(), 'post_love', true );
    $love = ( empty( $love ) ) ? 0 : $love;
    $love_text = '&lt;p class="love-received"&gt;&lt;a class="love-button" href="' . admin_url( 'admin-ajax.php?action=post_love_add_love&amp;post_id=' . get_the_ID() ) . '" data-id="' . get_the_ID() . '"&gt;give love&lt;/a&gt;&lt;span id="love-count"&gt;' . $love . '&lt;/span&gt;&lt;/p&gt;';
  }
  return $content . $love_text;
}</pre><p>إذا كان Javascript مفعَّلًا في المتصفّح فيجب تعطيل إمكانيّة تتبّع رابط URL. لذا نُضيف <code>return false</code> إلى الدّالّة في حدث <code>click</code> كما يلي:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">jQuery( document ).on( 'click', '.love-button', function() {
  var post_id = jQuery(this).data('id');
  jQuery.ajax({
    url : postlove.ajax_url,
    type : 'post',
    data : {
      action : 'post_love_add_love',
      post_id : post_id
    },
    success : function( response ) {
      jQuery('#love-count').html( response );
    }
  });
  // نُرجع القيمة false هنا
  return false; 
})</pre><p>الخطوة الأخيرة هيّ التّفريق بين عمليّات Ajax والعمليّات الأخرى ضمن دالّة <code>()post_love_add_love</code>. عند استخدام Ajax نعرض القيمة الجديدة، ثمّ يتوقّف السكربت. إن لم يُستخدَم Ajax (يعني هذا أنّ الزّائر سيُوجَّه إلى <code>admin-ajax</code>) فكلّ ما نفعله هو إعادة توجيه المتصفّح إلى المقال بعد تنفيذ السّكربت.</p><p>في ما يلي النّسخة النّهائيّة لدالّة <code>()post_love_add_love</code>:</p><pre data-pbcklang="" data-pbcktabsize="" class="ipsCode prettyprint">function post_love_add_love() {
  $love = get_post_meta( $_REQUEST['post_id'], 'post_love', true );
  $love++;
  update_post_meta( $_REQUEST['post_id'], 'post_love', $love );
  if ( defined( 'DOING_AJAX' ) &amp;&amp; DOING_AJAX ) {
    echo $love;
    die();
  }
  else {
    wp_redirect( get_permalink( $_REQUEST['post_id'] ) );
    exit();
  }
}</pre><p>أبدلنا المتغيّر <code>POST_$</code> ب<code>REQUEST_$</code> إذ أنّ الزوّارّ بAjax مفعَّل سيستخدمون طلب <code>POST</code> في ما يستخدم بقيّة الزّوّار طلب <code>GET</code>. يمكّن متغيّر <code>REQUEST_$</code> من الحصول على البيانات في الحالتيْن.</p><h2>جوانب إضافية تجب مراعاتها عند استخدام Ajax</h2><p><span style="line-height: 22.3999996185303px;">Ajax ليس صعبًا، إلّا أنّه يوجد الكثير من الأمور السّهلة الّتي تجب عليك معرفتها. في ما يلي أهمّ جانبيْن ينبغي عليك الاهتمام بهما.</span></p><h3 id="الأمان">1- الأمان</h3><p>يُمكن أن تؤدّي قلّة الحذر أثناء استخدام Ajax إلى مشاكل أمنيّة عديدة. لا تتحقّق الإضافة التّي أنشأناها أعلاه من الضّغطات المتعدّدة الّتي يُمكن أن تؤدّي - فضلًا عن تشويه النّتائج - إلى زيّادة الحمل على الخادوم، خصوصًا إن واصل الكثيرون الضّغط على الزّرّ في نفس الوقت. علاوةً على ذلك فإنّ تغيير العدّاد لا يحتاج للضّغط على الزّر؛ مجرّد الدّخول إلى الرّابط (مثلًا <code><a rel="external nofollow" href="http://yourwebsite.com/wp-admin/admin-ajax.php?action=post_love_add_love&amp;post_id=23">http://yourwebsite.com/wp-admin/admin-ajax.php?action=post_love_add_love&amp;post_id=23</a></code>) يفي بالمهمّة.</p><p>خذ في الحسبان أنّ بعض الإضافات تسمح بحذف المقالات من الواجهة اﻷماميّة دون الحاجة للدّخول إلى لوحة التّحكّم؛ ماذا لو وُجِد رابط تؤدّي زيّارته إلى نفس التّأثير؟ ليست وضعيّة مثاليّة.</p><p>استخدام الأرقام الخاصّة Nonces هو إحدى وسائل تأمين الاستمارات والرّوابط ضدّ المحاولات الخبيثة.</p><h3 id="تجربة-المستخدم">2- تجربة المستخدم</h3><p>يعود انتشار استخدام Ajax إلى أنّ المستخدم يحصُل على تفاعليّة أكبر مع التّقليل من وقت التّحميل. يعني هذا أيضًا أنّه يجب عليك العمل جاهدًا للتّأكّد من أنّ استخدامك لAjax يرفع حقًا من نوعيّة تجربة المستخدم: يجب أن يعرف الزّائر دائمًا مالّذي يحدُث ولماذا. لو كانت إضافة <code>post-love</code> موجَّهةً للنّشر ﻷضفتُ أيقونة لحالة التّحميل تعطّل زرّ الإعجاب عند الضّغط عليه، ثمّ بعد نجاح العمليّة يعود الزّرّ لحالته الطّبيعيّة. تُمكن إضافة هذه الميزة عن طريق معطى <code>beforeSend</code> ضمن دالّة <code>()ajax.$.</code> يُتيح <span style="font-family: monospace; line-height: 22.3999996185303px;">beforeSend</span> إمكانيّة تنفيذ بعض التّعليمات قبل إرسال البيانات إلى الخادوم.</p><p>إضافة إشارة مرئيّة أثناء تغيّر عدد الإعجابات فكرة جيّدة؛ إن لم يكن المستخدم يعرف مالّذي ينتظره عند الّضغط على الزّر فربّما لا يُلاحظ تغيّر عدد الإعجابات.</p><p>في المقابل، لا تبالِغ باستخدام التّأثيرات المرئيّة أثناء التّعامل مع نداءات Ajax، كما حصل للكثيرين مع انتشار هذه التّقنيّة فجعلوا كلّ شيء يتحرّك وينشط في كلّ اتّجاه. لا تضف تأثيرات تلفت النّظر إلّا إذا كان لذلك معنى، ولا تجعل المستخدم ينتظر حتّى نهاية التّحريكة Animation؛ وإلّا فإنّ جودة تجربة المستخدم ستنقُص ولن تزيد.</p><h2 id="خاتمة">خاتمة</h2><p>تعدّ تقنيّة Ajax من الأدوات القويّة المتاحة للمطوّرين من أجل إضافة التّفاعليّة والتّقليل من الضّغط على الخادوم. لن يُمكن إحصاء الميزات الممكن تقديمها باستخدام Ajax: عرض التّعليقات دون الحاجة لإعادة تنزيل الصّفحة، التّمرير اللّامتناهيّ Infinite scrolling للمقالات، التّحميل الخامل Lazy-loading للصوّر، وغيرها الكثير.</p><p>سيجعل Ajax تطبيقك أفضل بكثير شرطَ الانتباه إلى تفاصيل تجربة المستخدم وعدم استخدامه لغير ضرورة.</p><p>رابط تنزيل إضافة `post-love` في صورتها النّهائيّة. <a class="ipsAttachLink" href="https://academy.hsoub.com/applications/core/interface/file/attachment.php?id=3029">post-love.zip</a></p><p>ترجمة بتصرّف لمقال <a rel="external nofollow" href="https://premium.wpmudev.org/blog/using-ajax-with-wordpress/">Using AJAX With PHP on Your WordPress Site Without a Plugin</a> لكاتبه <a rel="external nofollow" href="https://premium.wpmudev.org/blog/author/danielpataki/">Daniel Pataki</a>.</p>
]]></description><guid isPermaLink="false">110</guid><pubDate>Mon, 29 Jun 2015 12:02:31 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x646;&#x634;&#x626; &#x642;&#x627;&#x644;&#x628; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633; &#x641;&#x631;&#x639;&#x64A;</title><link>https://academy.hsoub.com/programming/php/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%A6-%D9%82%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D9%81%D8%B1%D8%B9%D9%8A-r107/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_06/wp_child_theme.png.889cfd248147a573a6d5bf6ffa2f2651.png" /></p>

<div id="wmd-preview-section-41"><p id="كيفية-إنشاء-قالب-ووردبريس-فرعي">مِمَّا لا شكَّ فيه أنَّ هُناك قوالب ووردبريس رائعة المظهر ولكن هُناك العديد من الأمثلة على أشياءٍ بسيطة قد نُريد تغييرها في القالب. كلونٍ هُنا، حجم خطٍ هُناك ورُبَّما استدعاء للإجراء على الأزرار. <br>تتمحور المُشكلة في أنَّ تعديل القالب حتَّى ولو كانَ تعديلًا بسيطًا يمنعُكَ من تحديثه إلى نُسخة جديدة في المُستقبل، هذا ببساطة راجع إلى أنَّه إذا قُمتَ بتحديثه فسيؤدِّي هذا إلى فُقدان كُلّ التغييرات التي أُحدِثَت عليه. </p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2015_06/wp_child_theme.png.36f76128dd34afa8c5d456c646574b0e.png"><img data-fileid="3009" class="ipsImage ipsImage_thumbnailed" alt="wp_child_theme.thumb.png.f88cd52ba4c7b50" src="https://academy.hsoub.com/uploads/monthly_2015_06/wp_child_theme.thumb.png.f88cd52ba4c7b50e44796db79d62fe57.png"></a></p><p>تُقدِّم القوالب الفرعيَّة حلًّا لهذه المُشكلة عن طريق السَّماح لكَ باستخدام وظائف القالب المُختار إلى جانب إمكانيَّة التَّحديث دون الخوف من فُقدان تلكَ التَّعديلات. <br>سنُقدِّم من خلال هذا الدرس توضيحًا للفائدة من استخدام قالب ووردبريس فرعي وكيفيَّة إنشائه.</p></div><div id="wmd-preview-section-42"><h2 id="كيفية-عمل-قوالب-ووردبريس-الفرعية-والفائدة-من-استخدامها">كيفيَّة عمل قوالب ووردبريس الفرعيَّة والفائدة من استخدامها</h2><p>القوالب الفرعيَّة هي قوالب مُنفصلة تعتمد على قالب أساسي في تأدية مُعظم وظائفها. إذا كُنتَ تستخدم قالب فرعي، فإنَّ ووردبريس سيقوم أوَّلًا بالتحقُّق من قالبك الفرعي ليتأكَّد من ما إذا كانت هُناك تأدية وظيفيَّة مُحدَّدة به. إذا لم يجد ووردبريس أيَّة تأدية وظيفية مُحدَّدة فسوف يستخدم القالب الأساسي مُباشرةً. تُعتبر هذه ميزة رائعة حيثُ أنَّها تُتيح لكَ التَّعديل على ما تُريد تعديله فقط. <br>يجب استخدام القوالب الفرعيَّة إن كُنتَ تنوي تعديل ولو مُجرَّد حرف واحد في قالبك. هُناك سببين أساسيَّين للاستخدام، هما: التَّحديثات والتَّنظيم.</p></div><div id="wmd-preview-section-43"><h3 id="1-التحديثات">1. التَّحديثات</h3><p>إذا قُمتَ بتعديل قالب بدون استخدام قالب فرعي فسيكون لديكَ خيارين بعد عمليَّة التَّعديل: قد تختار عدم تحديث قالبك في المُستقبل، أو تحديثه وخسارة كُلّ التغييرات المُضافة إلى القالب. <br>رُبَّما يعملُ الخيار الثَّاني فنيًّا ولكنَّه أمرٌ غير مُقترح. حتَّى لو كان من السَّهل نسخ ولصق تعديلاتك، ما هي الفائدة من تضييع دقيقتين من وقتك على مُهمَّة قد تُعرِّضك للخطأ في كُلِّ تحديث؟ <br>مُجرَّد التَّفكير في عدم تحديث القالب ليست فكرة جيِّدة. تُعتبر القوالب الغير مُحدَّثة من أكثر القوالب تعرُّضًا للاختراق. يجب عليكَ دائمًا الإبقاء -بدون استثناء- على كلٍّ من: ووردبريس، قالبك والإضافات مُحدَّثين بما يتناسب مع الوقت الحالي.</p></div><div id="wmd-preview-section-44"><h3 id="2-التنظيم">2. التَّنظيم</h3><p>عندما تُضيف شفرات لقالب موجود فإنَّك بهذا تُضيف إلى قاعدة شفرات قد تحتوي على الآلاف والآلاف من الأسطر. سيواجه المُطوِّرون ممن يعملون على موقعك (بالاضافة إليكَ بالتَّأكيد) أوقاتًا صعبة في تعقُّب التَّغييرات. نتيجة واحدة على الأقل لهذا الأمر هي تكاليف تطوير زائدة. <br>حيثُ أنَّ القوالب الفرعيَّة تعود من جديد إلى القالب الأساسي -إلَّا إذا تمَّ تحديد ما هو غير ذلك- فإنَّ قالبك الفرعي هو عبارة عن مجموعة من التَّغييرات في قالبك الأساسي. يُمكن أن ينتج عن هذا تغييرات شاملة في حين أنَّ القالب الفرعي قد يحتوي على مُجرَّد مائة سطر من الشَّفرات.</p></div><div id="wmd-preview-section-45"><h2 id="إنشاء-قالب-فرعي">إنشاء قالب فرعي</h2><p>يُعتبر إنشاء قالب فرعي أمرٌ بسيطٌ للغاية لدرجة أنَّه بامكانك تنفيذ هذا بمُجرَّد نسخ ولصق المثال الموجود بالأدنى. <br>لإنشاء قالب فرعي لقالب عليكَ اتَّباع الخطوات التالية:</p><ol><li>أنشئ مُجلَّد قالب في تثبيت ووردبريس.</li><li>أنشئ ملفّ نمط يحتوي على معلومات عن قالبك الفرعي.</li><li>قُم بإيقاف تفعيل أنماط القالب الأساسي.</li></ol><p>يُمكنكَ تفعيل القالب الفرعي بمُجرَّد الانتهاء من تنفيذ هذه الخطوات وسيبدو موقعك تمامًا مثلما كان من قبل، الفرق الوحيد هو أنّ الموقع سيستخدم القالب الفرعي في عمله. <br>دعونا الآن ندرس الخطوات أعلاه بالتَّفصيل. سأنشئ على سبيل المثال قالب فرعي للقالب الافتراضي Twenty Fourteen. </p><p>أوَّلًا، توجَّه إلى مُجلَّد القالب وقُم بانشاء ملفًّا لقالبك الجديد. يُمكنكَ تسميته بالاسم الذي تُريد. من أجل التَّوضيح سنُسمِّي القالب twentyfourteen-child. </p><p>الخطوة الثَّانية هي إنشاء ملفّ نمط. يجب تسمية هذا الملفّ <span style="font-family:courier new,courier,monospace;">style.css</span> قُم بنسخ ولصق الشفرات التالية إلى الملف الذي أنشأته لتوِّك:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">/*
Theme Name: Twenty Fourteen Child
Theme URI: http://yourwebsite.com/twentyfourteen-child/
Description: My first child theme, based on Twenty Fourteen
Author: Daniel Pataki
Author URI: http://danielpataki.com
Template: twentyfourteen
Version: 1.0.0
Tags: black, green, white, light, dark, two-columns, three-columns, left-sidebar, right-sidebar, fixed-layout, responsive-layout, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready, accessibility-ready, responsive-layout, infinite-scroll, post-slider, design, food, journal, magazine, news, photography, portfolio, clean, contemporary, dark, elegant, modern, professional, sophisticated
Text Domain: twenty-fourteen-child
*/</pre><p>العُنصرين الأساسيَّين في هذه الشَّفرة هي السُّطور البادئة بـ "<span style="font-family:courier new,courier,monospace;">Theme Name</span>" و"<span style="font-family:courier new,courier,monospace;">Template</span>". يُخبر اسم القالب Theme Name ووردبريس عن اسم قالبك ويُعرَضُ هذا في مُنتقي القالب. أمَّا Template فيُحدِّد لووردبريس أيُّ القوالب يجب اعتباره القالب الأساسي. ما تبقى يصف نفسه بنفسه باستثناء نطاق النَّصّ <span style="font-family:courier new,courier,monospace;">text domain</span> والوسوم <span style="font-family:courier new,courier,monospace;">tags</span>. يُستخدم نطاق النَّصَّ لترجمة المقاطع. يجب أن يكون نطاق النَّصّ مُميّزٌ لقالبك ويجب استخدامه متى قُمتَ باستخدام دوال التَّرجمة. لمعلوماتٍ أكثر راجع <a rel="external nofollow" href="http://codex.wordpress.org/I18n_for_WordPress_Developers">I18n لمُطوِّري ووردبريس</a>. قسم الوسوم هو قائمة من الوسوم التي تُستَخدم بواسطة مُستودع قالب ووردبريس. على سبيل المثال قد قُمتُ بالنَّظر في ملف <span style="font-family:courier new,courier,monospace;">style.css</span> الخاصّ بالقالب الأساسي وببساطة قُمتُ بنسخ ولصق الوسوم من هُناك. <br>إلى هذه النُّقطة فإنَّ قالبك الفرعي يعمل بشكلٍ جيِّد. إذا قُمتَ بتفعيله ثُمَّ إعادة تحديث الصَّفحة ستجد كُلّ مُحتواك بها ولكن لن تحتوي على أيّ تنسيق. ذكرتُ سابقًا أنَّ ووردبريس يبحثُ عن التأديَّات الوظيفيَّة في القالب الفرعي وإذا لم يجدها فإنَّه يعود مُجدَّدًا إلى القالب الأساسي. <br>في حالتنا هذه فإن لدينا بالفعل ملف نمط ولذلك فإنَّ ووردبريس قد فهم أنَّه غير مسموح بتحميل ملفّ القالب الأساسي. وبُناءً عليه فإنَّنا سنحتاج إلى إدراج ملفّ نمط القالب الأساسي لكي نتأكَّد من أنَّنا قد قُمنا بتحميله. يُمكن عمل هذا في ملفّ القالب <span style="font-family:courier new,courier,monospace;">function.php </span>دعونا نُنشيء الآن هذا الملفّ وننسخ الشفرات التالية به:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">add_action( 'wp_enqueue_scripts', 'enqueue_parent_styles' );
function enqueue_parent_styles() {
    wp_enqueue_style( 'parent-style', get_template_directory_uri().'/style.css' );
}</pre><p>إذا لم تكُن لديك أيَّة فكرة عن PHP وكُلّ ما تُريده هو تغيير بعض الأنماط فقط فلا تهتمّ كثيرًا لمعرفة سبب عمل هذا. يُمكنكَ الآن التوجُّه ببساطة إلى ملف النَّمط والبدء بعمل التَّغييرات التي تُريد. إذا كان لديكَ فضول لمعرفة المزيد عن الإدراج يُمكنكَ الاطِّلاع على <a href="https://academy.hsoub.com/code/php/wordpress/%D8%B5%D9%81%D9%91-%D9%88%D8%AA%D8%B3%D8%AC%D9%8A%D9%84-%D9%85%D9%84%D9%81%D8%A7%D8%AA-javascript-%D9%88-css-%D9%81%D9%8A-%D9%82%D9%88%D8%A7%D9%84%D8%A8-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r79/">صفّ وتسجيل ملفات Javascript و CSS في قوالب ووردبريس</a>.</p></div><div id="wmd-preview-section-46"><h2 id="تقنية-القوالب-الفرعية">تقنية القوالب الفرعيَّة</h2><p>إذًا كيف يعمل القالب الفرعي؟ تعملُ القوالب الفرعية في مستوى الملف. عند استخدام ملف خلال عملية تحميل قالب فيتمّ التحقُّق من ما إذا كان هذا الملفّ موجود في القالب الفرعي. إذا كان الملف موجودًا، يتمّ استخدام محتوى هذا الملف. أمَّا إذا لم يكن موجودًا، فيتمّ استخدام نفس الملف في القالب الأساسي. <br>هُناكَ استثناءٌ واحد لهذه القاعدة ألا وهو ملفّ دوال القالب. يتمّ تحميل ملف <span style="font-family:courier new,courier,monospace;">functions.php</span> الموجود في كلٍّ من القالب الأساسي والقالب الفرعي. إذا قامت دوال القالب الفرعي باستبدال دوال القالب الأساسي فقد تواجه موقعًا به خلل أو قد تحتاج إلى نسخ ولصق محتويات ملف دوال القالب الأساسي كلُّها إلى ملف القالب الفرعي والتي تُفشِلُ نوعًا ما الهدف من تمديد قالب. <br>خطوات سير العمل عند تعديل التأدية الوظيفيَّة هي كالتَّالي: إذا أردتَ عمل تعديلات على التَّرويسة header فعليكَ نسخ ولصق ملفّ القالب الأساسي<span style="font-family:courier new,courier,monospace;"> header.php</span> إلى قالبك الفرعي. قُم بتعديل الملفّ كما يحلو لك، قُم بحفظ الملف بعد الانتهاء من التَّعديل وشاهد نتائج عملك.</p></div><div id="wmd-preview-section-47"><h2 id="بعض-الملاحظات-إلى-صانعي-قوالب-ووردبريس">بعض المُلاحظات إلى صانعي قوالب ووردبريس</h2><p>إذا كُنتَ تُنشيء قالبكَ الخاصّ فهُناكَ بعض الإرشادات التي رُبَّما عليكَ اتِّباعها من أجل بناءٍ أسهل للقالب الفرعي. الإرشادين الأهمّ هما: معرفة الفرق بين دالَّتي<span style="font-family:courier new,courier,monospace;"> ()get_stylesheet_directory </span>و<span style="font-family:courier new,courier,monospace;">()get_template_directory</span>، وإنشاء دوال قابلة للإضافة.</p></div><div id="wmd-preview-section-48"><h3 id="1-المجلد-الصحيح">1. المُجلَّد الصحيح</h3><p>عليك -عند الرَّبط مع مُمتلكات باستخدام الدَّوال المذكورة- أن تكون على دراية بأنَّ عائلة دوال <span style="font-family:courier new,courier,monospace;">get_template_ </span>ستُشيرُ دائمًا إلى مُجلَّد القالب الأساسي في حين أنَّ عائلة دوال <span style="font-family:courier new,courier,monospace;">get_stylesheet_ </span>ستُشيرُ دائمًا إلى مُجلَّد القالب الفرعي.</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">&lt;a href="http://twitter.com/danielpataki"&gt;&lt;img src="&lt;?php echo get_template_directory_uri() ?&gt;/images/twitter.png" alt='Twitter Logo'&gt;Follow Me&lt;/a&gt;
&lt;a href="http://github.com/danielpataki"&gt;&lt;img src="&lt;?php echo get_stylesheet_directory_uri() ?&gt;/images/github.png" alt='Github Logo'&gt;On Github&lt;/a&gt;</pre><p>في المثال أعلاه، يأخذ الرابط الأول صورته من القالب الأساسي في حين أنَّ الرابط الثاني يأخذ صورته من القالب الفرعي. ليس هُناك أفضيلة لطريقة على الأخرى، اختيار احداهما هو أمرٌ يرجع إليك. <br>ميزة استخدام <span style="font-family:courier new,courier,monospace;">()get_stylesheet_directory_uri </span>هي أنَّه يُمكن لمُطوِّري القالب الفرعي استخدام صورهم الخاصَّة ويتمّ هذا ببساطة عن طريق إنشائها في الموقع المُناسب. على الجانب الآخر، إذا لم تكن الصور موجودة في القالب الفرعي فلن يتم عرضها على الإطلاق. <br>سبب هذا هو أنَّه إذا كان القالب الفرعي مُفَعَّل فإنَّ دالَّة <span style="font-family:courier new,courier,monospace;">()get_stylesheet_directory_uri</span> لا تتحقَّق من (ولا تعرف) ما هو الملفّ الذي تقوم أنتَ بتحميله ولذلك فلن تقوم الدَّالَّة بالتحقُّق من وجوده أصلًا. ستقوم الدَّالَّة دائمًا بإعادة مُعرِّف الموارد المُوحَّد URI للقالب الفرعي.</p></div><div id="wmd-preview-section-49"><h3 id="2-دوال-قابلة-للتعديل">2. دوال قابلة للتَّعديل</h3><p>الطريقة الأخرى التي عليكَ استخدامها هي ما يُسمِّيها ووردبريس دوال قابلة للإضافة. يسمح هذا لمالكي القالب الفرعي الكتابة على الدوال التي قُمتَ بتعريفها في القالب الأساسي. يشتمل هذا على إحاطة دوالّك بتأكيدات <span style="font-family:courier new,courier,monospace;">()function_exists</span>. <br>لنفترض أنَّكَ قد قُمتَ بإنشاء دالَّة تُسمَّى<span style="font-family:courier new,courier,monospace;"> ()my_meta</span> لعرض بادئة تدوينة مُخصَّص. لا يوجد مجال للقالب الفرعي لتعديل هذه الدَّالَّة حيثُ أنَّه لا يُمكن تعريفها مرَّتين. حلّ المُشكلة هو إنشاء هذه الدَّالَّة إذا لم يتمّ تعريفها (تذكَّر، يتمّ تحميل ملف دالَّة القالب الفرعي أوَّلًا).</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">if ( !is_defined( 'my_meta' ) ) {
function my_meta() {
// code for postmeta here
}
}</pre></div><div id="wmd-preview-section-50"><h2 id="ختاما">ختامًا</h2><p>يُمكنكَ باستخدام بعض خطوات النَّسخ واللَّصق البسيطة إنشاء بيئة مُستقبليَّة لقالبك والتي ستُبعد عنكَ الكثير من المتاعب. رغم أنَّه من المُغري استخدام مُحرِّر القالب المُدمج في ووردبريس، إلَّا أنَّه غالبًا ما يُسبِّب أخطاءً أكثر مِمَّا يحلّ في حالة عدم استخدام قالب فرعي. <br>قُم باستغلال بعض الوقت لاتِّباع الخطوات الموجودة بهذا الدَّرس وسيكون موقعك ومُطوِّره شاكرين لفعلكَ هذا. أخيرًا، إن كان لديكَ بعض النَّصائح حول القوالب الفرعيَّة، لا تتردَّد في اعلامنا بها.</p></div>
]]></description><guid isPermaLink="false">107</guid><pubDate>Thu, 25 Jun 2015 12:10:00 +0000</pubDate></item></channel></rss>
