المحتوى عن 'إضافات'.



مزيد من الخيارات

  • ابحث بالكلمات المفتاحية

    أضف وسومًا وافصل بينها بفواصل ","
  • ابحث باسم الكاتب

نوع المُحتوى


التصنيفات

  • التخطيط وسير العمل
  • التمويل
  • فريق العمل
  • دراسة حالات
  • نصائح وإرشادات
  • التعامل مع العملاء
  • التعهيد الخارجي
  • التجارة الإلكترونية
  • الإدارة والقيادة
  • مقالات ريادة أعمال عامة

التصنيفات

  • PHP
    • Laravel
    • ووردبريس
  • جافاسكريبت
    • Node.js
    • jQuery
    • AngularJS
    • Cordova
  • HTML
    • HTML5
  • CSS
  • SQL
  • سي شارب #C
    • منصة Xamarin
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • Sass
    • إطار عمل Bootstrap
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • برمجة أندرويد
  • لغة Swift
  • لغة R
  • لغة TypeScript
  • سير العمل
    • Git
  • صناعة الألعاب
    • Unity3D
  • مقالات برمجة عامة

التصنيفات

  • تجربة المستخدم
  • الرسوميات
    • إنكسكيب
    • أدوبي إليستريتور
    • كوريل درو
  • التصميم الجرافيكي
    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب
  • التصميم ثلاثي الأبعاد
    • 3Ds Max
    • Blender
  • مقالات تصميم عامة

التصنيفات

  • خواديم
    • الويب HTTP
    • قواعد البيانات
    • البريد الإلكتروني
    • DNS
    • Samba
  • الحوسبة السّحابية
    • Docker
  • إدارة الإعدادات والنّشر
    • Chef
    • Puppet
    • Ansible
  • لينكس
  • FreeBSD
  • حماية
    • الجدران النارية
    • VPN
    • SSH
  • مقالات DevOps عامة

التصنيفات

  • التسويق بالأداء
    • أدوات تحليل الزوار
  • تهيئة محركات البحث SEO
  • الشبكات الاجتماعية
  • التسويق بالبريد الالكتروني
  • التسويق الضمني
  • التسويق بالرسائل النصية القصيرة
  • استسراع النمو
  • المبيعات
  • تجارب ونصائح

التصنيفات

  • إدارة مالية
  • الإنتاجية
  • تجارب
  • مشاريع جانبية
  • التعامل مع العملاء
  • الحفاظ على الصحة
  • التسويق الذاتي
  • مقالات عمل حر عامة

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
  • أندرويد
  • iOS
  • macOS
  • ويندوز

التصنيفات

  • شهادات سيسكو
    • CCNA
  • شهادات مايكروسوفت
  • شهادات Amazon Web Services
  • شهادات ريدهات
    • RHCSA
  • شهادات CompTIA
  • مقالات عامة

أسئلة وأجوبة

  • الأقسام
    • أسئلة ريادة الأعمال
    • أسئلة العمل الحر
    • أسئلة التسويق والمبيعات
    • أسئلة البرمجة
    • أسئلة التصميم
    • أسئلة DevOps
    • أسئلة البرامج والتطبيقات
    • أسئلة الشهادات المتخصصة

التصنيفات

  • ريادة الأعمال
  • العمل الحر
  • التسويق والمبيعات
  • البرمجة
  • التصميم
  • DevOps

تمّ العثور على 30 نتائج

  1. يصف هذا الدرس كيفية استخدام إضافات أندرويد فيKotlin لتحسين دعم تطوير أندرويد. في هذا الدرس سوف نستعرض الخطوات اللازمة لاستخدام ملحقات أندرويد الإضافية في لغة البرمجة Kotlin، لتعزيز تجربة التطوير في أندرويد. ربط العرض View Binding الخلفية كل مطوري أندرويد يعرفون جيدًا الدالة ()findViewById. والتي هي من دون أدنى شك، مصدر لكثير من المتاعب والأخطاء المحتملة والشيفرات السيئة والتي يصعب قراءتها وصيانتها. صحيح أن هناك العديد من المكتبات المتاحة لتوفير حلول لهذه المشكلة، إلّا أن هذه المكتبات تتطلب حقول تأشير annotating fields لكل عنصر معروض من نوع View. توفر لنا ملحقات أندرويد الإضافية لـ Kotlin تجربة مماثلة لما توفره بعض تلك المكتبات، دون أن نكون في حاجة إلى كتابة شيفرات إضافية. في الأساس، هذا يسمح لنا بكتابة الشيفرة التالية: // Using R.layout.activity_main from the 'main' source set import kotlinx.android.synthetic.main.activity_main.* class MyActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Instead of findViewById<TextView>(R.id.textView) textView.setText("Hello, world!") } } textView هي خاصية إضافية لـ Activity، ولها نفس النوع المعلن في activity_main.xml (أي TextView). استخدام إضافات أندرويد لـKotlin إعداد الارتباطات Configuring the Dependency سنستخدم في هذا الدرس Gradle، لكن يمكنك تحقيق نفس النتائج باستخدام IntelliJ IDEA project structure أو Maven. إضافات أندرويد هي جزء من ملحقة Kotlin الخاصة بكل من IntelliJ IDEA وAndroid Studio. لذلك لا تحتاج إلى تثبيت ملحقات إضافية. كل ما تحتاجه هو إتاحة ملحقة Gradle لأندرويد في ملف الوحدة build.gradle: apply plugin: 'kotlin-android-extensions' استيراد الخصائص التركيبية synthetic properties من الملائم استيراد جميع خصائص الودجةwidget) ) لخطاطة (layout) معينة دفعة واحدة: import kotlinx.android.synthetic.main.<layout>.* وهكذا إذا كان اسم ملف الخطاطة هو activity_main.xml، فسنقوم باستيراد kotlinx.android.synthetic.main.activity_main.* إن كنّا نريد أن نستدعي الخصائص التركيبية على View، فيجب علينا أيضًا استيراد kotlinx.android.synthetic.main.activity_main.view.* وبمجرد أن نفعل ذلك، يمكننا حينها استدعاء الإضافات المقابلة والتي هي اسماء خصائص سُمّيت على إثر عناصر العرضviews الموجودة في ملف XML. فعلى سبيل المثال، بالنسبة لهذا العرض: <TextView android:id="@+id/hello" android:layout_width="fill_parent" android:layout_height="wrap_content"/> ستكون هناك خاصية اسمها hello: activity.hello.text = "Hello World!" الوضع التجريبي Experimental Mode تشمل الملحقات الإضافية لأندرويد العديد من الميزات التجريبية مثل دعم LayoutContainer ومولّدات تقديم الصنف Parcelable (Parcelable implementation generator). هذه الميزات لا تُعتبر جاهزة بعدُ للإنتاج، لذلك نحتاج إلى التحوّل للوضع التجريبي في build.gradle من أجل استخدامها: androidExtensions { experimental = true } دعم LayoutContainer تدعم الملحقات الإضافية لأندرويد أنواع مختلفة من الحاويات containers. وأبسط تلك الحاويات Activity، Fragment وView. ولكن يمكنك أن تحوّل (افتراضيًا) أي صنف إلى حاوية لإضافات أندرويد من خلال تطبيق الواجهةLayoutContainer ، على سبيل المثال: import kotlinx.android.extensions.LayoutContainer class ViewHolder(override val containerView: View) : ViewHolder(containerView), LayoutContainer { fun setup(title: String) { itemTitle.text = "Hello World!" } } لاحظ أنك تحتاج إلى التحوّل إلى الوضع التجريبي لاستخدام LayoutContainer. دعم النكهات Flavor Support تدعم ملحقات أندرويد الإضافية نكهات أندرويد ((Android flavors. لنفترض أن لديك نكهة اسمها free في ملف build.gradle خاصّتك: android { productFlavors { free { versionName "1.0-free" } } } يمكنك استيراد كافة الخصائص التركيبية للخطاطة free/res/layout/activity_free.xml بإضافة هذا الاستيراد: import kotlinx.android.synthetic.free.activity_free.* في الوضع التجريبي، يمكنك تحديد أي اسم آخر (وليس فقط flavor)، على سبيل المثال freeDebug أو freeRelease يصلحان كذلك. التخزين المؤقت لعناصرView استدعاء ()findViewById يمكن أن يكون بطيئًا، خصوصًا في حالة تشعبات العرض (view hierarchies) الكبيرة، لذلك تحاول إضافات أندرويد التقليل من عدد مرّات استدعاء ()findViewById بواسطة التخزين المؤقت للعروض في الحاويات. افتراضيًا، اضافات أندرويد تضيف دالة تخزين مؤقت مخفية وحقل تخزين إلى كل حاوية (Activity، Fragment، View أو LayoutContainer implementation) مكتوبة بـ Kotlin. التابع method)) صغير جدًا لذلك لا يزيد حجم APK كثيرًا. في المثال التالي، يتم استدعاء ()findViewById مرة واحدة فقط: class MyActivity : Activity() fun MyActivity.a() { textView.text = "Hidden view" textView.visibility = View.INVISIBLE } لكن في الحالة التالية: fun Activity.b() { textView.text = "Hidden view" textView.visibility = View.INVISIBLE } لا يمكننا أن نعرف ما إذا كان سيتم استدعاء هذه الدالة في أنشطة مصادرنا فقط أم أيضا في كل أنشطة جافا. لهذا السبب، لن نستخدم التخزين المؤقت هنا، حتى لو تم تمرير أحد عيّنات instance الصنف MyActivity من المثال السابق كمستقبِل. تغيير استراتيجية التخزين المؤقت للصنف View يمكنك تغيير استراتيجية التخزين المؤقت بشكل شامل أو بالنسبة لكل حاوية على حدة. وهذا أيضًا يتطلب التحول إلى الوضع التجريبي. يتم تحديد استراتيجية التخزين المؤقت الشاملة للمشروع في ملف build.gradle: androidExtensions { defaultCacheImplementation = "HASH_MAP" // also SPARSE_ARRAY, NONE } افتراضيًا، الملحقات الإضافية لأندرويد تستخدم HashMap كمرجع احتياطي للتخزين، ولكن يمكنك التبديل لتطبيق SparseArray، أو إيقاف التخزين المؤقت وحسب. هذا الأخير مفيد بشكل خاص إن أردت الاكتفاء باستخدام الجزء المقسّم Parcelable من إضافات Android. يمكنك أيضًا التأشير على حاوية ما بـ ContainerOptions@ لتغيير استراتيجية التخزين المؤقت: import kotlinx.android.extensions.ContainerOptions @ContainerOptions(cache = CacheImplementation.NO_CACHE) class MyActivity : Activity() fun MyActivity.a() { // findViewById() will be called twice textView.text = "Hidden view" textView.visibility = View.INVISIBLE } Parcelable بدءًا من الإصدار Kotlin 1.1.4، وفّرت الملحقات الإضافية لأندرويد مولّدات تطبيق للصنف Parcelable كميزة تجريبية. إتاحة دعم Parcelable قم بتطبيق ملحقة Gradle المسمّاة kotlin-android-extensions كما هو موضح [أعلاه] (#إعداد الارتباطات) وقم بتشغيل الوضع التجريبي. كيفية الاستخدام قم بالتأشير على الصنف بـ Parcelize@، وسيتم إنشاء تطبيق Parcelable تلقائيًا. import kotlinx.android.parcel.Parcelize @Parcelize class User(val firstName: String, val lastName: String, val age: Int): Parcelable يتطلّب Parcelize@ التصريح بجميع الخصائص المتسلسلة في المنشئ constructor الأولي. ستقوم إضافات أندرويد بإطلاق تحذير على كل الخصائص ذات الحقول المصرّح بها في جسم الصّنف، كما أنّه لا يمكن تطبيق Parcelize@ إذا لم تكن كل معاملات المنشئ الأوّلية خصائصًا. إن كان صنفك يتطلب تسلسلاً منطقيًا أكثر تقدمًا، فيمكنك كتابته داخل صنف مرافق: @Parcelize data class Value(val firstName: String, val lastName: String, val age: Int) : Parcelable { private companion object : Parceler<User> { override fun User.write(parcel: Parcel, flags: Int) { // Custom write implementation } override fun create(parcel: Parcel): User { // Custom read implementation } } } الأنواع المدعومة يدعم Parcelize@ طيفًا واسعًا من الأنواع: الأنواع الأولية Primitive types (ونسخها المغلّفة boxed versions). Objects وenums . String، CharSequence. Exception. Size، SizeF، Bundle، IBinder، IInterface، FileDescriptor SparseArray، SparseIntArray، SparseLongArray، SparseBooleanArray. كل الأنواع المتسلسلة Serializable (حتى Date مدعوم) وتطبيقات Parcelable. تجميعات كل الأنواع المدعومة: List (مُحالة على ArrayList)، و Set (مُحالة على LinkedHashSet)، و Map (مُحالة على LinkedHashMap). بالإضافة إلى عدد من التطبيقات الملموسة: ArrayList، LinkedList، SortedSet، NavigableSet، HashSet، LinkedHashSet، TreeSet، SortedMap، NavigableMap، HashMap، LinkedHashMap، TreeMap، ConcurrentHashMap. الجداول التي تحتوي الأنواع المدعومة. النسخ الفارغة Nullable versions من كل الأنواع المدعومة. تخصيص الـ Parcelers حتى إن لم يكن النوع مدعوما مباشرة، يمكنك كتابة كائن Parceler لأجل دعمه. class ExternalClass(val value: Int) object ExternalClassParceler : Parceler<ExternalClass> { override fun create(parcel: Parcel) = ExternalClass(parcel.readInt()) override fun ExternalClass.write(parcel: Parcel, flags: Int) { parcel.writeInt(value) } } أمّا عناصر Parcelers الخارجية يمكن تطبيقها باستخدام التأشيرات TypeParceler@ أو WriteWith@: // Class-local parceler @Parcelable @TypeParceler<ExternalClass, ExternalClassParceler>() class MyClass(val external: ExternalClass) // Property-local parceler @Parcelable class MyClass(@TypeParceler<ExternalClass, ExternalClassParceler>() val external: ExternalClass) // Type-local parceler @Parcelable class MyClass(val external: @WriteWith<ExternalClassParceler>() ExternalClass) ترجمة -وبتصرّف- للمقال Kotlin Android Extensions لصاحبه Yan Zhulanow
  2. هل تريد تطوير مهاراتك في تطوير ووردبريس إلى مرحلة متقدمة؟ هل أنت مستعد لرفع مستواك في لغة PHP لأعلى مستوى وإضافة المزيد من القوة إلى إضافات وقوالب ووردبريس التي تقوم بتطويرها. قبل أن نبدأ يُفترض قبل البدء أنك تعرف برمجة ووردبريس وتعلم كيف تعمل قوالب وإضافات ووردبريس بشكل بسيط إذا لم تكن تعلم فيمكنك البحث في الموقع وستجد مقالات للمبتدئين. ماذا سنغطي في هذه المقالة في هذه المقالة، سوف نبدئ مباشرة في البرمجة غرضية التوجه (object-oriented programming) وكيف يتم استخدامها في تطوير ووردبريس. البرمجة غرضية التوجه لا تحتاجها بشدة كمطور ووردبريس لكن بعد استخدامي لها لاحظت أن جودة تعليماتي البرمجية قد تحسنت بشكل سريع وقوي عندما بدأت في وضع مفاهيم البرمجة غرضية التوجه في عين الاعتبار، واستطعت أن أتعلم لغات برمجة آخرى لأن مفهوم الأصناف(classes) والكائنات(objects) متشابهة في كل لغات البرمجة. لنلقي نظرة على مبادئ البرمجة غرضية التوجه لنرى ما هي ولنستعملها في برمجة قوالب وإضافات قوية. ما هي البرمجة غرضية التوجه؟ البرمجة غرضية التوجه هي منطق تفكيري أكثر من أن تكون طريقة لكتابة التعليمات البرمجية، لأنها تعني التفكير في البرمجة بشكل منظم أكثر، وتغليف التعليمات البرمجية وجعلها كوحدات منفصلة من أجل استخدامها بشكل أفضل لاحقًا. لا تقلق إذا لم تستوعب ما شرحناه، لأننا سنلقي نظرة على كثير من الأمثلة خلال هذه المقالة لتساعدك في ترسيخ هذه المفاهيم. لماذا نستخدم البرمجة غرضية التوجه؟ البرمجة غرضية التوجه تُغلف المجموعات المتماثلة منطقيًا من التعليمات البرمجية موفرةً بذلك تعليمات برمجية أكثر قابلية للقراءة وأكثر تنظيمًا وهي توفر الفوائد التالية: • تعليمات برمجية أسهل تتبعًا. • تطوير هذه التعليمات البرمجية يصبح فيما بعد أسهل بكثير. • أسماء الدوال لا داعلي لأن تكون طويلة بعد الآن، والدوال داخل الأصناف لا تتضارب مع الدوال خارج هذه الأصناف. • درجة أعلى من قابلية إعادة استخدام التعليمات البرمجية. تعلم عن طريق مثال لنبدأ مع مثال على تعليمات برمجية عادية وتحويلها إلى تعليمات برمجية غرضية التوجه، لنفترض أننا نبني موقع تويتر Twitter، ونريد أن نقوم بحذف الأحرف من نص معين، وتحويل النصوص إلى روابط، لذا سأقوم بكتابة بعض الدوال لاستعمالها في المشروع: // Cut text down to required length function get_chirp_text( $text ) { return substr( $text, 0, 200 ); } // Parse hashtags from text function get_hashtags( $text ) { preg_match_all("/S*#((?:\[[^\]]+\]|\S+))/", $text, $matches); return $matches; } // Create the final chirp text function create_chirp( $text ) { $chirp_text = get_chirp_text( $text ); $hastags = get_hashtags( $chirp_text ); if( !empty( $hastags[1] ) ) { foreach( $hastags[1] as $key => $match ) { $hastags[1][$key] = "<a href='http://chirp.chip/hastags/" . $match . "/'>" . '#' . $match . "</a>"; } $chirp_text = str_replace( $hastags[0], $hastags[1], $chirp_text ); } return $chirp_text; } $text = 'This is a chirp with an #example hashtag created with code that is #procedural'; echo create_chirp( $text ); دالة ()get_chirp_text تقوم باستلام نص كوسيط و تقتطعه، أما دالة ()get_hashtags تقوم باستلام نص و إرجاع الجزء من النص الذي يبدأ ب “#”. دالة ()create_chirp تستعمل القيم المعادة من الدالتين السابقتين لتحويلها إلى روابط. صحيح أن هذه التعليمات البرمجية تعمل بشكل صحيح، لكن ماذا لو أردنا تغيير عدد الأحرف التي نريد اقتطاعها إلى 200 أو 300 حرف، أو نريد تغيير الروابط. هذه المشاكل لن يتم ملاحظتها ولكن من الممكن أن تعقد التعليمات البرمجية إذا كانت هذه التعليمات كثيرة. لنقم بتغليف هذه التعليمات البرمجية وتحويلها إلى تعليمات برمجية غرضية التوجه سأبدأ مع التعليمات البرمجية كاملة وسأقوم بشرحها بالتتالي: class Chirp { var $text; var $length; var $hashtag_base; var $hashtags; var $chirp; function __construct( $text ) { $this->hashtag_base = 'http://chirp.chip/hastags/'; $this->text = $text; $this->set_length(); $this->set_hashtags(); $this->set_chirp(); } function set_length() { $this->length = 200; } function set_hashtags() { preg_match_all("/S*#((?:\[[^\]]+\]|\S+))/", $this->text, $matches); $hashtags = array(); foreach( $matches[1] as $key => $match ) { $hashtags['#' . $match] = "<a href='http://chirp.chip/hastags/" . $match . "/'>" . '#' . $match . "</a>"; } $this->hashtags = $hashtags; } function set_chirp() { $chirp = substr( $this->text, 0, $this->length ); $chirp = str_replace( array_keys( $this->hashtags ) , array_values( $this->hashtags ), $chirp); $this->chirp = $chirp; } } $chirp = new Chirp( 'This is a chirp with an #example hashtag created with code that is #procedural' ); echo $chirp->chirp; من البداية قمت بتعريف صنف اسمه chirp. يحوي بداخله عددًا من المتغيرات والدوال. المتغيرات تمثل خصائص مهمة للكائنات التي سيتم بناءها من هذا الصنف. متغير text$ يحمل النص الأصلي الذي نريد معالجته متغير length$ يحمل عدد الأحرف المسموحة بها في التغريدة متغير hashtag_base$ يحمل القيمة الأساسية لروابط الهاشتاغ متغير hashtags$ يحمل خريطة الهاشتاغ متغير chirp$ يحمل ال html النهائية للتغريدة لنتخطى دالة __construct() للوقت الحالي و نركز على دالة ()set_length . كل ما تفعله هذه الدالة هي تعيين قيمة 200 ل this->$length. من المؤكد أنك تتساءل عن المتغير ?this$ يستخدم للإشارة إلى المتغيرات والدوال داخل الصنف، كما قمنا بتعيين قيمة length$ عن طريق this->$length سنكون قادرين على مناداة هذا المتغير في أي مكان في الصنف باستخدام this->$length والنتيجة أننا لا نحتاج لتمرير هذا المتغير كوسيط عند استعماله في كل دالة. الدالة التالية هي ()set_hashtage، تقوم بهذه الدالة بجلب النص للقيام بمعالجته من this->$text و الذي سوف يوضع في دالة __construct() و التي سنقوم بشرحها لاحقًا، لقد قمت بتغيير المصفوفة التي تنتجها هذه الدالة لتحتوي على الهاشتاغ كمفتاح و الرابط الكامل كقيمة هذا المفتاح و هذه سيجعل استبدال النص أسهل. و أخيرًا الدالة ()set_chirp تستخدم this->$text و this->$length لقطع النص و this->$hashtags لتبديل النصوص مع الروابط. أخيرًا تقوم بتعيين نتيجة html إلى this->$chirp. و في النهاية قمت باستخدام هذا الصنف لإنشاء الكائنات مخزن في chirp$ قمت بتمرير وسيط واحد لهذا الصنف عندما تم إنشاء الكائن من الدالة __construct() عندما تم تفعيل هذا الصنف. هذه الدالة يتم تفعيلها فورًا عند إنشاء الكائن يمكنك رؤية كيف يتم تمرير الوسائط وتقوم ايضًا بالتالي: تضع قيمة المتغير $this->hashtag_base مباشرةً تضع قيمة للمتغير this->$text مباشرةً تستخدم الدالة ()set_length لضبط الطول، لاحظ بما أن الدالة داخل الصنف فيتم الإشارة إليها ب this$ تقوم بإنشاء تعليمات html النهائية باستخدام الدالة ()set_chirp. بعد إنشاء الكائن يمكننا إظهار أي قيمة من الكائن ونعلم أن تعليمات html النهائية مخزنة في الخاصية chirp$، ويمكننا الدخول إليها باستخدام الصيغة chirp->$chirp. عناصر الأصناف والكائنات في هذا القسم، سوف نشرح عناصر الأصناف والكائنات. الاختلاف بين الأصناف والكائنات، بأن الأصناف هي المخططات التي تصنع منها الكائنات. الأصناف تعرف باستخدام الكلمة class متبوعة باسم الصنف الذي نريده و كل التعليمات البرمجية الخاصة به موضوعة بين { }. <p>These are just 8 of our awesome posts. Click here for <?php echo $posts->found_posts - 8 ?> more!</p> الأصناف يمكن أن تحوي شيئين هما المتغيرات والدوال، لكن داخل الأصناف يشار لهم بالخصائص(properties) والطرق(methods) وهذا هو الصنف فقط عبارة عن مجموعة من الخصائص والطرق. لاستخدام الخصائص والطرق داخل الصنف نحتاج إلى الإشارة لها ب this$. الأصناف يمكن أن تحوي عددًا من الدوال الخاصة. واحدة من هذه الدوال __construct() والتي يبدأ تنفيذها مباشرةً عندما ننشأ كائن من صنف. أي عدد من الكائنات يمكن إنشاءه من صنف واحد. $chirp_one = new Chirp( 'This is a chirp with an #example hashtag created with code that is #procedural' ); echo $chirp_one->chirp; $chirp_two = new Chirp( 'This is a chirp with an #example hashtag created with code that is #procedural' ); echo $chirp_two->chirp; استخدام الكائنات بشكل صحيح ليس هناك طريقة واحدة صحيحة لاستعمال الكائنات، لأن ذلك يعتمد بشكل كبير على ماهية ما تبنيه. لنراجع بعض النقاط المهمة في المثال السابق تحديد الطول لدينا دالة منفصلة لتعيين الطول، لكن كل ما تفعله هو تعيين الطول ل 200 و كان يمكننا أن نضع القيمة يدويًا في دالة ()substr الموجودة في ()set_chirp. السبب هو التفكير للأمام، لأنه لا يجب أن نكون هذه مهمة ()set_chirp لمعرفة الطول. لأنه من الممكن أن نقرر أن يكون عدد الحروف 160، وتوفير أطوال مختلفة بناء على حالة المستخدم على سبيل المثال. إذا أسندنا مهمة تعيين الطول لدالة منفصلة يمكننا تغيير المنطق الخاص بالطول من دون التأثير على أجزاء آخرى في التعليمات البرمجية. دوال الضبط Setter Methods الطرق أو الدوال التي تقوم بتعيين قيمة لخاصية يتم الإشارة إليها بدوال الضبط أو التعيين. يمكنك ملاحظة أنني قمت بتعيين بعض الخصائص من الدالة البانية __construct() و بعضها من الدوال الآخرة. طريقة تفكيري هنا كانت أن الخصائص التي لا أحتاج إلى إجراء العمليات عليها يمكنني تعيين قيمها في الدالة البانية أما التي أريد معالجة قيمها أسندتها لدوال خاصة. العمل مع الكائنات القدرة على الإشارة إلى الخصائص والطرق داخل الأصناف توفر لنا كثيرًا من الاستراتيجيات في التعامل مع الأصناف. إذا أزلنا معظم التعليمات من الدالة البانية في مثالنا السابق يمكننا القيام بالعمليات المطلوبة من خارج الأصناف. لنلقي نظرة: class Chirp { var $text; var $length; var $hashtags; var $chirp; function __construct( $text ) { $this->hashtag_base = 'http://chirp.chip/hastags/'; $this->text = $text; $this->set_length(); } function set_length() { $this->length = 200; } function set_hashtags() { preg_match_all("/S*#((?:\[[^\]]+\]|\S+))/", $this->text, $matches); $hashtags = array(); foreach( $matches[1] as $key => $match ) { $hashtags['#' . $match] = "<a href='http://chirp.chip/hastags/" . $match . "/'>" . '#' . $match . "</a>"; } $this->hashtags = $hashtags; } function get_chirp() { $chirp = substr( $this->text, 0, $this->length ); if( !empty( $this->hashtags ) ) { $chirp = str_replace( array_keys( $this->hashtags ) , array_values( $this->hashtags ), $chirp); } return $chirp; } } الفرق هنا أن الدالة البانية لا تقوم بتشغيل دالة ()set_hashtags و بالتالي يمكننا بناء التغريدة بطريقتين: $chirp = new Chirp( 'This is a chirp with an #example hashtag created with code that is #procedural' ); // Hashtags will not be links here echo $chirp->get_chirp(); $chirp->set_hashtags(); // Hashtags are now links because they have been set echo $chirp->get_chirp(); مثال ووردبريس يمكننا أخذ مثال رائع من ووردبريس يستخدم البرمجة غرضية التوجه وهو WP_Query. إذا كنت قد استخدمته من قبل من دون علم بالبرمجة غرضية التوجه فسيصبح أوضح بالنسبة لك الآن. لنفترض أنك تقوم بإنشاء صفحة خاصة في ووردبريس ستحتوي على أحدث 8 مقالات و3 من تقييمات الكتب القادمة. يمكنك صناعة كائنين باستخدام هذا الصنف: $posts = new WP_Query(array( 'post_type' => 'post', 'posts_per_page' => 8, 'post_status' => 'publish' )); $books = new WP_Query(array( 'post_type' => 'book', 'posts_per_page' => 3, 'post_status' => 'future' )) إذا اطلعت على التوثيق الخاص بهذا الصنف يمكنك روية أنه يملك العديد من الخصائص ومن بينها $found_posts. ولقد أصبحنا نعرف كيف نشير إلى هذه الخصائص: <p>These are just 8 of our awesome posts. Click here for <?php echo $posts->found_posts - 8 ?> more!</p> أصعب جزء في الأصناف والكائنات هو ليس استخدامها بل كيف تستخدمها بشكل صحيح، وأنا أشجعك أن تبدأ باستخدام البرمجة غرضية التوجه في مشاريعك، ربما في البداية سترى أنها غير مفيدة. لكن عندما بدأت في تطبيقها في مشاريعي وجدت الفائدة الكبيرة للبرمجة غرضية التوجه ومعظم إطارات العمل الحديثة ك Laravel تستخدم البرمجة غرضية التوجه. احتراف تطوير ووردبريس نحن فقط بدأنا في تعلم ما يمكننا فعله، ويوجد الكثير مما يمكن تعلمه عن الأصناف وأنصحك في التدريب والتجريب وارتكاب الأخطاء وعدم الاستسلام. ترجمة -وبتصرّف- للمقال Advanced WordPress Development: Introduction to Object-Oriented Programming لصاحبه Daniel Pataki
  3. قد يبدو مفهوم البرمجة غرضية التوجه (object-oriented programming)، صعبًا ومعقدًا في البداية لكنه مفهوم مهم يجب تعلمه، إذا أردت زيادة مهاراتك وقدراتك في تطوير إضافات ووردبريس.سوف نشرح طريقتين مفيدتين تمكنك من جعل إضافاتك غرضية التوجه، الأمر الذي سيقلل من فرص تعقيد التعليمات البرمجية وتضاربها مع بعضها البعض، وتمكنك من كتابة تعليمات برمجية مرتبة وقوية وتشكل وحدات منفصلة. ملاحظة: هذه المقالة حول البرمجة غرضية التوجه، لم يتم التطرق فيها إلى طرق الكتابة المتقدمة للتعليمات البرمجية أو تم تبسيط بعضها لتصبح مفهومة بشكل أكبر للمبتدئين، الغرض من هذه المقالة تعليمك المبادئ الأساسية للبرمجة غرضية التوجه، وليس جعلك محترفًا في ليلة وضحاها، لكن إذا واصلت شغفك على التعلم والتجربة فستصبح محترفًا في وقت قصير. ما هي البرمجة غرضية التوجه؟ البرمجة غرضية التوجه بأبسط مفهوم هي طبقة أخرى من التجريد(abstraction)، إذا كتبت تعليمات php عند عملك في ووردبريس من قبل ففي الغالب أنك مررت بمرحلة التجريد، بدلًا من كتابة أسطر من التعليمات البرمجية سطرًا تلو سطر، البرمجة الغرضية تستخدم بواني (constructs) كالدوال (functions). الدوال يمكن ان تجعل التعليمات البرمجية أكثر مركزية ووحدة. لنأخذ هذا المثال: <div class='post' id='post-23'> <h2><?php the_title() ?></h2> <div class='excerpt'> <?php $content = get_the_content(); if( strlen($content) < 250 ) { echo $content; } else { $content = substr( $content, 0, 250 ); echo $content . '...'; } ?> </div> </div> قمت يدويًا بإنشاء مقتطف عند جلب البيانات مباشرة، لكن تخيل أن أفعل ذلك في كل مرة أعرض منشور ووردبريس، ليست هذه بداية المشكلة حتى، لكن ماذا لو أردت بعد فترة تغيير طول محارف المقتطف. الآن هي معدة لتقتطع 250 محرفًا و إذا أردت تغيير هذا العدد عليك أن تمر على جميع الأماكن التي كتبت هذه التعليمات فيها و تغييرها واحدًا تلو الآخر، لهذا استخدام الدوال مفيد جدًا، ووردبريس أوجدت حلًا لهذه المشكلة عن طريق استخدام دالة ()the_excerpt. <div class='post' id='post-23'> <h2><?php the_title() ?></h2> <div class='excerpt'> <?php the_excerpt() ?> </div> </div> البرمجة غرضية التوجه هي طبقة أخرى من التجريد(abstraction)، مشابهة كثيرًا للدوال. في هذه المقالة، سنقوم بإنشاء صنف(class)، الذي يمكن تشبيهه بوعاء حاوي للدوال. كتابة صنفك الأول لنقم بإنشاء صنف باسم “Post”. سيكون الهدف منه هو التلاعب بمنشورات ووردبريس: class Post { function get_excerpt( $content ) { if( strlen($content) < 250 ) { return $content; } else { $excerpt = substr( $content, 0, 250 ); return $excerpt . '...'; } } function the_excerpt( $content ) { echo get_excerpt( $content ); } function the_title( $title ) { echo $title; } } صنفنا الآن يحتوي على 3 دوال بسيطة، واحدة لجلب المقتطف والثانية من أجل عرض المقتطف، الثالثة لعرض عنوان المقال. في الوقت الحالي الصنف يحتوي الآن فقط دوال، لكن هذا ليس كل شيء يمكن للصنف أن يفعله. لنرى القوة الحقيقية للأصناف سنلقي نظرة على دالة خاصة في الأصناف تدعي الباني __construct() ، ومتغير خاص يدعى this$، والمتغيرات داخل الأصناف. عندما ننشأ صنف، يكون الهدف منه معظم الأحيان هو إنشاء كائنات متعددة، يمكنك إنشاء عدة منشورات، لنرى كيف سنقوم بها من خلال هذا المثال: class Post { var $title; var $content; function __construct( $data ) { $this->title = $data['title']; $this->title = $data['content']; } function get_excerpt() { if( strlen($this->content) < 250 ) { return $this->content; } else { $excerpt = substr( $content, 0, 250 ); return $excerpt . '...'; } } function the_excerpt() { echo $this->get_excerpt(); } function the_title() { echo $this->title; } } $postdata = array( 'title' => 'Post 1 Title', 'content' => 'Content of Post 1' ); $post = new Post( $postdata ); $post->the_excerpt(); هناك الكثير من الأشياء غير المفهومة بالنسبة لك في هذا المثال، لكن سيتم شرح كل شيء خلال لحظات، عندما تريد إنشاء كائن من صنف تستعمل هذه التعليمات كما في المثال $post = new Post ($postdata)، عندما تقوم بإنشاء الكائن ستنفذ الدالة البانية بشكل مباشر. الوسيط postdata$ الذي تم تمريره للكائن عند إنشائها سيصبح متاحًا لدالة الباني التي تم تعريفها في الصنف. لتعطي قيم للمتغيرين اللذين تم تعريفهما داخل الصنف. تم إسناد قيمة للمتغير title$ عن طريق this->$title وللمتغير content$ عن طريق this->$content . المتغير this$ هو متغير خاص يشير إلى الصنف نفسه، في أي وقت تريد الإشارة فيه إلى متغير تم تعريفه داخل الصنف بـ this->$property_name أو إلى دالة ()this->$function_name تم تعريفها داخل الصنف. ملاحظة: الدوال داخل الصنف تدعى طرائق(methods)، والمتغيرات تدعى خصائص(properties) وسيتم من الآن الإشارة إليهم بهذه الأسماء بهذا المقال. إن أفضل طريقة لفهم كيفية عمل الأصناف هو تتبع التعليمات البرمجية، بعد أن قمنا بإنشاء الكائن قمنا بتشغيل الدالة ()post->the_excerpt$ لكن الآن نستعمل متغير post$ للإشارة إلى الدالة بدلًا من this$ لأننا نستعمل هذه الدالة خارج الصنف. الآن لنعرف بماذا تقوم هذه الدالة يمكننا التوجه إلى تعريف الصنف لأننا نعلم أن التعريف الأصلي والتعليمات البرمجية لهذه الدالة هي في الصنف الذي تم تعريفها فيه. كما نرى أن دالة get_excerpt لا تحتاج لتمرير أي محتوى لأنها تأخذ المحتوى من المتغير content$ مراجعة ما تعلمناه لنراجع ما تعلمناه عن الأصناف قبل أن نرى كيف نستعملها في برمجة إضافات ووردبريس. الصنف هو وعاء حاوي للدوال يمكن تعريف الصنف بكتابة كلمة class وبعدها اسم الصنف، الدوال داخل الصنف تدعى طرائق، والمتغيرات تدعى خصائص. إذا كنا نكتب التعليمات البرمجية داخل الصنف فيمكن الإشارة إلى الخصائص والدوال بالمتغير this$. يمكن إنشاء كائن من صنف باستخدام الصيغة $object = new class( $params ) . الدالة البانية يتم تنفيذها مباشرة عند إنشاء الكائن. استخدام الكائنات في إضافات ووردبريس بما أن الأصناف تقوم بتغليف التعليمات البرمجية ضمن وعاء أو وحدة واحدة فهي تمنع التضارب مع التعليمات البرمجية المتواجدة خارج هذا الصنف يمكنني تعريف الدالة get_excerpt في إضافة ووردبريس التي أعمل عليها على الرغم أن هذه الدالة متواجدة بنفس الاسم في التعليمات البرمجية الأساسية لووردبريس. البرمجية غرضية التوجه تعتبر ميزة رائعة لأنها تجبرك استخدام معايير برمجية جيدة بالإضافة أنها تجعلك مبرمجًا أفضل. عندما تكون البرمجة غرضية التوجه مكتوبة بشكل جيد، فإنها دائمًا تكون الحل الأمثل لتتمكن من معرفة مزاياها بشكل جيد نحن نحتاج إلى أكثر من عدة أسطر برمجية، برمجة إضافة ووردبريس ستكون مثالًا رائعًا. هذا مثال هو عبارة عن إضافة تضيف نصًا إلى نهاية كل مقال يتم نشره بشكل تلقائي: <?php /* Plugin Name: Written By Awesome Description: Adds a nice author tagline Version: 1.0.0 Author: Daniel Pataki Author URI: http://danielpataki.com */ class Written_By_Awesome { function __construct() { add_filter( 'the_content', array( $this, 'add_author_line_to_content' ) ); } function add_author_line_to_content( $content ) { return $content . '<br> Written by someone awesome'; } } $written_by_awesome = new Written_By_Awesome(); عندما تفهم كيف تعمل الأصناف يمكنك تخطي الكثير من العوائق والتفكير بتعليماتك البرمجية كوحدات منفصلة، على سبيل المثال يمكنك إنشاء أصناف لتتولى التعليمات البرمجية الخاصة بالتفاعل مع المستخدم وإظهار النتائج، وأصناف آخرى للتعامل مع الخادم (server). لنلقي نظرة على هذه الإضافة، التي ترتب المنشورات بناء عدد التعليقات: <?php class PostsByCommentBackend { function construct() { add_action( 'pre_get_posts', array( $this, 'backend_query' ) ); } function backend_query( $query ) { if ( ! $query->is_admin() ) { $query->set( 'orderby', 'comment_count' ); $query->set( 'order', 'DESC' ); } } } class PostsByCommentFrontend { function construct() { add_action( 'pre_get_posts', array( $this, 'frontend_query' ) ); } function frontend_query( $query ) { if ( $query->is_admin() ) { $query->set( 'orderby', 'comment_count' ); $query->set( 'order', 'DESC' ); } } } $backend = new PostsByCommentBackend(); $frontend = new PostsByCommentFrontend(); ربما تجد هذه التعليمات بالغة الصعوبة، لكن النقطة التي أحاول الوصول إليها أن فصل تعليماتك البرمجية إلى وحدات منفصلة، يسهل عملية تطوير هذه الوحدات والبناء عليها. مثال كامل إذا كنت مهتمًا بمزيد من الأمثلة التوضيحية يمكنك الاطلاع على مشروع WordPress Plugin Boilerplate وهو عبارة عن قاعدة لبناء إضافات ووردبريس عن طريق البرمجة غرضية التوجه. لقد استخدمتها في العديد من مشاريعي وأنصح بها بشدة، خاصة للإضافات التي تتطلب درجة عالية من التعقيد. الخاتمة منصة ووردبريس تحتاج إلى إضافات مكتوبة بشكل أفضل، والحل الوحيد هو استخدام البرمجة غرضية التوجه، إنها تجعل التعليمات البرمجية أكثر قابلية للقراءة، مرتبة بشكل أفضل وذات جودة عالية وسهلة التطوير مستقبلًا. ترجمة -وبتصرّف- للمقال An Introduction to Object-Oriented Code for WordPress Plugins لصاحبه Daniel Pataki
  4. سنناقش في هذا الدرس أهمّية تحديث كلّ شيءٍ متعلّق بموقع ووردبريس الخاصّ بك إلى آخر الإصدارات المتوفّرة وأهميّة التحديثات بشكلٍ عام، وهو من أهمّ الأمور التي يمكنك القيام بها لزيادة حماية وأمان موقعك. لماذا نقوم بالتحديث؟ السؤال الحقيقي يجب أن يكون "ولما لا"؟ يقوم مطوروا ووردبريس بإرسال التحديثات إلى المستخدمين لسببٍ معيّن في النهاية، حيث أنّ هذه التحديثات تحتوي على إصلاحاتٍ لثغراتٍ خطيرة يمكن أن يستغلها المهاجمون لمهاجمة موقعك، مما يجعل التحديث ضرورة لا مفرّ منها. أنواع التحديثات قبل أن نتابع، من المهمّ أن نفهم أنواع التحديثات المختلفة المتوفّرة في سكربت ووردبريس. يشير Tony Perez في تدوينة حديثة إلى أنّه هناك 3 أنواع مختلفة من التحديثات: تحديثات الأمان، الترقيعات والإصدارات الرئيسية. تحديثات الأمان هي بالضبط كما تبدو عليه من اسمها. يتم إصدارها بسرعة وتحتوي فقط على بضع إصلاحاتٍ لثغراتٍ موجودة تم اكتشافها مؤخرًا. تكون هذه التحديثات عادةً على شاكلة أرقام الإصدارات مثل 4.2.1. تحديثات الترقيعات أكبر قليلًا، لا تحتوي هي الأخرى على مميزاتٍ جديدة، ولكنّها تقوم بتحديث النظام وعادةً ما تتضمن تحديثاتٍ أمنية كذلك، كما أنّه يتم إصدارها بصفة دورية ومن الممكن توقّع وقت صدور الترقيع الجديد. وأمّا عن التحديثات الرئيسية من الانتقال من الإصدار 3.9 إلى الإصدار 4.0 فهذا تحديثٌ جوهري، يحتوي مميزاتٍ جديدة وإصلاحاتٍ للمشاكل الأمنية المعروفة بالإضافة لأمورٍ أخرى، كما أنّه يتم التدوين عنها في مدونة ووردبريس وفي العديد من المواقع الإخبارية الأخرى، حيث أنّها تحديثات كبيرة ويجب على الجميع معرفتها. قد تقوم هذه التحديثات أحيانًا بتحطيم شكل موقعك بسبب عدم توافقية مع القالب الذي تستخدمه مثلًا، ولكن مع وجود نسخة احتياطية من موقعك، فيجب ألّا تكون مشكلةً بالنسبة لك. الفشل بالتحديث يعني مشكلة أعظم كما ذكرنا سابقًا، عدم قيامك / فشلك بتحديث أيّ إضافات أو قوالب ووردبريس مثبّتة على موقعك قد يعرّضك لخطرٍ كبير، وما قد لا تفهمه هو "لماذا"؟ يمكن قول نفس الأمر بخصوص القوالب والإضافات، صحيحٌ أنّها ليست جزءً من لبّ نواة ووردبريس، ولكنّها أيضًا قد تحتوي على ثغرات تمكّن المخترقين من استغلالها لاختراق موقعك، وأيضًا يتم اكتشاف هذه الثغرات كلّ فترة وتصدر تحديثات لترقيعها كلّ فترة، وعليك تثبيتها بمجرّد توفّرها. بعض السمات والقوالب تكون مبرمجة بصورة سيئة ويكون بها العديد من الثغرات ويجب عليك الانتباه إلى ذلك، كما يجب عليك تثبيت واستخدام القوالب والإضافات التي تستعملها فقط وحذف كلّ شيء لا تستعمله. إدارة تحديثات ووردبريس أفضل طريقة للتأكّد من أنّ كلّ شيء على موقعك محدّث هو جعل عملية التحقق من وجود تحديثات متوفّرة هي مهمّة روتينية أخرى على جدولك (لو لم تكن تقنيًا، فيجب عليك البحث عن استضافة تقوم تلقائيًا بتحديث جميع القوالب والإضافات والنواة الخاصّة بووردبريس)، يجب عليك التحقق من توفّر التحديثات بنفسك كلّ يوم لتجنّب أي مشاكل أمنية قد تحصل. منذ الإصدار 3.7 من ووردبريس فإنّ المنصة تسمح بالتحديث التلقائي بسهولة، بمجرّد تفعيل هذا الخيار، فإنّه هذا يعني أنّ نواة موقعك ستقوم بالتحديث تلقائيًا عند توفّر تحديثات جديدة بدون أيّ تدخّل منك. طبعًا لا يمكن فعل نفس الشيء بالنسبة للقوالب والإضافات، حيث يجب عليك القيام بتحديثها يدويًا. الخاتمة تحديثات ووردبريس مهمّة للغاية، بل ومهمّة جدًا، ومن واجبك الاهتمام بتحديث كلّ شيءٍ موجود على موقعك إلى الإصدارات الأخيرة المتوفّرة، وإلّا فإنك تترك بابك مفتوحًا للمخترقين ليخترقوك، إنّها مسألة وقت. ترجمة -وبتصرف- للمقال: The WordPress Developer’s Guide to Security: Updates لصاحبه: Brenda Barron.
  5. هل ترغب في تعلّم برمجة إضافات ووردبريس؟ هذه السّلسلة أُعدّت خصّيصًا لك. سنتعرف في هذه السّلسلة على كل ما تحتاجه لتطوير أوّل إضافة لك على ووردبريس، وفق النّهج التّالي: 1. مُقدّمة إلى برمجة إضافات Wordpress: ستتعرّف في هذا المقال على ماهية إضافات ووردبريس، الأسباب التي تدفعك إلى إنشاء إضافة، وكيف تبني أوّل إضافية بسيطة. 2. برمجة إضافات ووردبريس: الخُطّافات (Hooks) : في هذا المقال ستتعرّف على مفهوم الخّطافات في ووردبريس والتي تعد من أهم الخصائص التي يوفرها ووردبريس والتي جعلته مرنًا وقابل للتمدد بصورة قل أن تجد لها نظيرًا في برمجيات الويب. 3. استقبال وحفظ خيارات (وبيانات) الإضافة: سنتعرف في هذا الدّرس على أنسب الطّرق لحفظ الخيارات العامةللإضافة، وكيفيّة إضافة صفحة إعدادات Settings Page في لوحة التحكم تمكن المستخدم من إدخال وتعديل الخيارات الخاصة بالإضافة 4. نظرة شاملة على قاعدة بيانات ووردبريس: في هذا المقال ستتعرّف على جداول قاعدة بيانات ووردبريس ودور كل جدول بالإضافة لأهم محتوياته وارتباطه بالجداول الأخرى، بالإضافة إلى ذكر بعض الطرق التي يوفرها ووردبريس للتعامل مع البيانات. الآن وبعد أن كوّنت صورة واضحة على كيفية برمجة إضافة ووردبريس، نختم السّلسلة بمثال عملي: 5. مثال عملي لبرمجة إضافة ووردبريس- الجزء الأوّل 6. مثال عملي لبرمجة إضافة ووردبريس- الجزء الثّاني
  6. بعد أن تطرّقنا إلى أساسيات تطوير إضافات ووردبريس حان الوقت لنقوم بإنشاء إضافة لتطبيق بعض ما تعلمناه. وهذا ما سنقوم به في هذا الدرس والدرس الذي يليه من خلال إنشاء إضافة تقوم بإضافة مربع جانبي لعرض المقالات الأكثر مشاهدة في موقع ووردبريس مع إمكانية عرض عدد المشاهدات في كل مقالة. التخطيط للإضافةلنبدأ بتحديد الأمور التي ستقوم بها الإضافة: إحصاء عدد المشاهدات لكل مقال.توفير شيفرة مختصرة Shortcode لعرض عدد مشاهدات المقال في أي مكان.توفير ودجت Widget لعرض المقالات الأكثر مشاهدة.وذلك من خلال: الاستفادة من البيانات الإضافية للمقال Post Meta لإضافة حقل بيانات جديد للمقالات يستخدم في حفظ واسترجاع عدد المشاهدات.الاستفادة من Shortcode API التي يوفرها ووردبريس لإنشاء الشيفرة المختصرة.الاستفادة من Widget API التي يوفرها ووردبريس لإنشاء الودجت واستخدام صنف WP_Query للحصول على المقالات مرتبة على حسب عدد المشاهدات.برمجة الإضافةدعنا في البداية نقوم بالتخطيط لجميع الملفات والمجلدات التي سنقوم بإنشائها لبرمجة الإضافة. تركيبة الملفات والمجلداتلنبدأ أولا بإنشاء مجلد للإضافة يحمل الإسم: ha-views-widget وأظن أنه اختصار جيد لاسم الإضافة واستخدامنا في البداية الحرفين ha كاختصار ل Hsoub Academy :). وبالطبع سنضع هذا المجلد في مجلد إضافات ووردبريس (ونحن نفترض أنك قمت بتنصيب ووردبريس مسبقا) والموجود في المسار wp-content/plugins. بعد ذلك سنقوم بإنشاء ملف php بنفس اسم المجلد وهو ha-views-widget.php وهذا الملف هو الملف الأساسي للإضافة وسيحتوي على الترويسة التي بها معلومات الإضافة والتي تعرفنا عليه في الدرس الأول من هذه السلسلة وبالتالي سيحتوي على هذه الترويسة: /** * Plugin Name: Hsoub Views Widget * Plugin URI: http://academy.hsoub.com/ * Description: إضافة صغيرة تقوم بإضافة مربع جانبي لعرض المقالات الأكثر مشاهدة في موقع ووردبريس مع إمكانية عرض عدد المشاهدات في كل مقالة. * Version: 1.4.0 * Author: Adil Elsaeed * Author URI: http://adilelsaeed.com * Text Domain: ha-widgets * Domain Path: /lang/ * License: GPL2 */بالطبع يمكننا أن نكتب جميع شيفرات php الخاصة بالإضافة في هذا المجلد لكن هذه ليست فكرة جيدة خصوصا إذا أردنا إنشاء إضافة سهلة التطوير والمراجعة، لذلك سنخصص ملفًا لإنشاء ومتابعة عدد المشاهدات وليكن باسم views.php وملف آخر لإنشاء الودجت وليكن باسم widget.php (لاحظ أنه داخل مجلد الإضافة يمكنك تسمية الملفات بأي اسم بدون خوف من التعارض مع ملفات ووردبريس الأخرى)، كما أننا سنحتاج لملف آخر لإنشاء الشيفرة المختصرة وليكن باسم shortcode.php ويمكننا أن نضع هذه الملفات الثلاثة داخل مجلد باسم includes للمحافظة على المجلد الرئيسي للإضافة مرتبًا. وبالطبع ما دمنا سنكتب بعض شيفرات html فإننا سنحتاج لتنسيقها من خلال CSS وهذا يعني أننا نحتاج لملف لوضع شيفرات CSS هذه، لذلك سنقوم بإنشاء مجلد أخر باسم css وبداخله ملف widget.css. هذه كل الملفات والمجلدات التي سنحتاج إليها في هذه النسخة الأولى من الإضافة. الملف الأساسي للإضافةفي الملف الأساسي للإضافة سنقوم أولا بتعريف بعض الثوابت التي سنحتاج إليها لاحقا، حيث سنحتفظ بكل من مسار الإضافة ورابطها URL وكذلك النسخة الحالية للإضافة كثوابت بالصورة التالية: if ( !defined( 'SDG_PLUGIN_DIR' ) ) { define( 'HA_VIEWS_DIR', plugin_dir_path( __FILE__ ) ); } if ( !defined( 'HA_VIEWS_URL' ) ) { define( 'SDG_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); } if ( !defined( 'HA_VIEWS_VER' ) ) { define( 'SDG_PLUGIN_VER', '1.1.0' ); }لاحظ أننا استخدمنا الدالتين plugin_dir_path و plugin_dir_url اللتين يوفرهما ووردبريس حيث تُرجعان مسار الإضافة ورابطها على التوالي. ثانيا سنقوم بتضمين ملفات php التي أنشأناها سابقا حتى ينفذ ووردبريس الشفرات الموجودة فيها ويتم تضمينها من خلال require_once كالآتي: // الملف المسؤول عن عدد المشاهدات require_once HA_VIEWS_DIR . 'includes/views.php'; // الملف المسؤول عن الويدجت require_once HA_VIEWS_DIR . 'includes/widget.php'; // الملف المسؤول عن الكود المختصر require_once HA_VIEWS_DIR . 'includes/shortcode.php';ثالثا وأخيرًا سنقوم بصف ملف الCSS الخاص بتنسيق الويدجت من خلال استخدام الحدث wp_enqueue_scripts ويمكنك معرفة المزيد حول التعامل مع ملفات CSS في ووردبريس بالإطلاع على مقال صف و تسجيل ملفات CSS في ووردبريس. وهذه هي الطريقة التي سنصف بها ملف widget.css: add_action('wp_enqueue_scripts', 'ha_scripts'); function ha_scripts(){ wp_enqueue_script( 'sdg-admin', HA_VIEWS_URL . 'css/widget.css', array(), HA_VIEWS_VER); }حفظ وتحديث عدد المشاهداتلننتقل الآن إلى ملف views.php حيث سنقوم بإضافة عداد المشاهدات لكل مقال من خلال بيانات الميتا الخاصة بالمقال post meta حيث سنقوم بإنشاء الدالة ha_set_post_views والتي تقوم بتحديث عدد المشاهدات للمقال عند زيارته ولنضمن تنفيذها عند كل مقال سنقوم بإضافتها للحدث wp_head والذي يتم تنفيذه في ترويسة Header كل صفحات الموقع. ويتم إضافة الدالة إلى هذا الحدث بالصورة التالية: add_action('wp_head', 'ha_set_post_views');أما بالنسبة للدالة نفسها فهذه هي صورتها: function ha_set_post_views() { // إذا لم يكن هذا مقال مفرد (صفحة أو مقال) لا تنفذ أي شيء if(!is_singular()){ return; } // الوصول إلى بيانات المقال الحالي global $post; $post_id = $post->ID; $count_key = 'ha_post_views_count'; // استرجاع العدد الحالي للمشاهدات $count = get_post_meta($post_id, $count_key, true); if($count==''){ // هذا يعني أنه لم يتم إنشاء الميتا الخاص بحفظ عدد المشاهدات حتى الان $count = 0; delete_post_meta($post_id, $count_key); add_post_meta($post_id, $count_key, '0'); // إنشاء الميتا الخاص بحفظ عدد المشاهدات }else{ // زيادة عدد المشاهدات بمقدار مشاهدة واحدة $count++; // حفظ الميتا التي حفظنا فيه عدد المشاهدات update_post_meta($post_id, $count_key, $count); } }لعل التعليقات تشرح الدالة بصورة واضحة لكن دعنا نوضح الأمور أكثر، قمنا في هذه الدالة أولا باستخدام الدالة is_singular والتي تتحقق إن كان المعروض حاليا صفحة مقال مفرد (مقال، صفحة، مقال مخصص) أم لا (صفحة تصنيف مثلا أو أرشيف أو غيرهما) وفي حالة لم يكن المقال مفردًا يتوقف تنفيذ الدالة لأن مهمتها تحديث عدد المشاهدات للمقالات والصفحات والمقالات المخصصة فقط وليس بقية صفحات الموقع (الأرشيفات أو التصنيفات أو غيرها). ثانيا قمنا باستخدام المتغير العام (global) الذي يوفره ووردبريس وهو post$ والذي يحفظ فيه بيانات المقال الحالي (الذي يتم عرضه) حتى نحصل على معرف المقال الحالي من أجل استخدامه في تحديث عدد مشاهداته. ثالثا قمنا باستخدام الدوال update_post_meta، get_post_meta، add_post_meta و delete_post_meta والتي تمكننا من إضافة ميتا مخصصة للمقال واسترجاعها وحذفها وتحديثها على التوالي. وكما تلاحظ قمنا بالتأكد من أن عدد المشاهدات لا يساوي قيمة خالية (غير موجود) وفي حالة أنه غير موجود يتم إنشاؤه وفي حالة أنه موجود يتم زيادته بمقدار واحد وهذه كل مهمة الدالة. استرجاع عدد المشاهداتفي هذا الملف أيضا (أعني ملف view.php) سنقوم بإنشاء دالة أخرى تقوم باسترجاع عدد المشاهدات للمقال الحالي حتى نستخدمها لاحقا في الشيفرة المختصرة shortcode، وهذه هي الدالة: function ha_get_post_views(){ // الوصول إلى بيانات المقال الحالي global $post; $post_id = $post->ID; $count_key = 'ha_post_views_count'; $count = get_post_meta($post_id, $count_key, true); if($count==''){ delete_post_meta($post_id, $count_key); add_post_meta($post_id, $count_key, '0'); return "0 مشاهدة"; } return $count.' مشاهدة'; }ليس هنالك الكثير مما يحتاج إلى شرح فقط قمنا باستخدام الدالة get_post_meta لاسترجاع قيمة الميتا ha_post_views_count وإعادتها في حالة كانت القيمة غير خالية وإعادة صفر في حالة كانت القيمة خالية وفي هذه الحالة تقوم أيضا بإضافة الميتا. برمجة الشيفرة المختصرة shortcodeفي هذه الجزئية سنعتمد على الواجهة البرمجية التي يوفرها ووردبريس حيث سنستخدم الدالة add_shortcode والتي لها الصورة التالية: <?php add_shortcode( $tag , $func ); ?>حيث: tag$ هو اسم الشيفرة المختصرة التي سيستخدمها المستخدم في حالتنا هذه سنسميها ha_views وسيقوم المستخدم بإستدعائها بالصورة التالية [ha_views] في المقال أو الصفحة. func$ هي الدالة المسؤولة عن إرجاع محتويات الشيفرة المختصرة أي ما تقوم به الشيفرة المختصرة وفي حالتنا هذه الدالة عبارة عن دالة ترجع عدد المشاهدات للمقال الحالي وهذه هي الشيفرة النهائية في ملف shortcode.php function ha_views_shortcode( $atts ){ return ha_get_post_views(); } add_shortcode( 'ha_views', 'ha_views_shortcode' );لاحظ أن الدالة ha_views_shortcode تقوم فقط بإرجاع القيمة المرجعة من الدالة ha_get_post_views والتي عرفناها مسبقا في ملف views.php والتي بدورها ترجع عدد المشاهدات للمقال الحالي. ولن نتطرق إلى شرح المزيد من التفاصيل حول الدالة add_shortcode تجنبا للإطالة وربما نخصص لها مقالا مفردا بعد نهاية هذه السلسلة إن شاء الله. سنكتفي بهذا القدر في هذا الدرس وفي الدرس الأخير من هذه السلسة سنكمل –إن شاء الله- برمجة الإضافة (حيث تبقى فقط برمجة الويدجت الذي يعرض أكثر المقالات مشاهدة)، كما سنلقي بعض الضوء على مجموعة من الأدوات والمواقع المفيدة لمطوري إضافات ووردبريس.
  7. تلعب جداول التسعير دورًا هامًّا في مساعدة زوّار موقعك في رؤية ومقارنة مختلف المميّزات التي تقدّمها خططك التسعيريّة. تكمن المشكلة في أنه يمكن لهذه الجداول أن تشكّل تحديًا من ناحية التصميم وسهولة الاستخدام في ذات الوقت. يجب أن تكون الجداول بسيطة ولكن يجب أن تفرّق بشكل واضح بين ميزات وأسعار الخدمات والمنتجات المختلفة. إذا لم يتمكّن مستخدموك من رؤية قيمة المنتج أو الخدمة فورًا فعليك أن تعرف أن أموالهم لن تُغادر محافظهم. ولكن يمكن لجداول مقارنة التسعير -مع بعض استراتيجيّات التسويق الصحيحة- توفير وسيلة فعّالة لتحديد موضع إظهار حِزَمك من أجل زيادة المبيعات. لذلك سنقوم بإلقاء نظرة على أفضل الإضافات المتاحة لمساعدتك في إظهار تسعيرك بالطريقة الصحيحة في موقعك المبني باستخدام ووردبريس. CSS3 Responsive Pricing Table إضافة CSS3 Responsive Pricing Table المُقدّمة من طرف QuanticaLabs هي إضافة جداول تسعير لووردبريس مدفوعة والتي توفر تصميمًا متجاوبًا. إذا كان مجرّد التفكير في احتياجك لكتابة شيفرات برمجيّة يسبب لك التوتر فإن هذه الإضافة طُوّرت خصيّصا لك. الإضافة متوافقة مع ووردبريس متعدّد المواقع أيضًا (Multisite WordPress). هناك تصميمان يمكنك الاختيار من بينهما، فاتح وغامق، وكل تصميم يأتي مع 20 لون مُختلف. تم تطوير الإضافة باستخدام CSS3 فقط مما يجعل الإضافة صغيرة الحجم ومؤثّرة. قام المطورون أيضًا بإطلاق نسخة HTML من الإضافة. تأتي الإضافة مُحمّلة بخيارات عديدة مثل ضابط وضع التجاوب ولوحة إدارة شاملة مع ضبط حي live configuration. لديك إمكانيّة التحكم الكامل في تصميم الجدول باستخدام عدد كبير من الخيارات للصفوف، الأعمدة، حالات الحومان (Hover states)، الأشرطة وأيقونات صح/خطأ (tick/cross icons). يمكنك الحصول على ترخيص عادي مقابل 18 دولار والذي يقدم لك أيضًا 6 أشهر دعم من المطورين والتحديثات المستقبليّة. خصائص الإضافةتفعيل وضع التجاوب وتحديد خطوات وأبعاد التجاوبلوحة إدارة بديهيّة مع ضبط حيتصميمان للجدول، 20 لون مُختلفعدد لا نهائي من الجداولعدد لا نهائي من الأعمدة والصفوفإظهار/إخفاء عمود أو عدّة أعمدة من لوحة الإدارةتحديد الأعمدة كنشطة (مُنبثقة)صفوف قابلة للتوسيعحالات الحومان (Hover states)42 أيقونة صح/خطأمثال حييستخدم موقع Fast Followerz هذه الإضافة منذ ثلاث أعوام إلى الآن. الصورة التالية توضح معاينة لجدول التسعير المصمم لشركتهم القائم على تقديم خدمات على الإنترنت. لاحظ كيفية انبثاق الأعمدة وإذا قمت بزيارة الموقع باستخدام هاتف ذكي ستلاحظ أن التصميم متجاوب. Plugmatter Pro Pricing Table Plugin إضافة Plugmatter Pro Pricing Table Plugin هي إضافة ووردبريس مدفوعة سهلة الاستخدام والتي تساعدك على إنشاء جداول مقارنة أسعار عالية التحويل. وفقًا لموقع الإضافة فإنه "يمكن للإضافة حرفيًّا أخذ مبيعاتك إلى المرحلة التالية وكذلك جعل تصميم موقعك متكاملاً". خاصيّة تحسين التحويل الموجودة بالإضافة مدعومة بواسطة دراسات البحث السلوكي وتحسين مُعدّل التحويل (CRO)، والتي تعطي الإضافة ميزة تنافسيّة تسبق جداول التسعير الأخرى من وجهة نظر تسويقيّة. تمّ تصميم الإضافة لأولئك الذين لا يريدون كتابة شيفرات برمجيّة. تحصل مع هذه الإضافة على 10 قوالب جداول تسعير متجاوبة ومُخصّصة والتي صُمّمت خصّيصًا لزيادة مُعدّل التحويل لموقعك. من الناحية التصميميّة، فإنه يُمكن للقوالب أن تظهر بصورة قوالب مصفوفة أو قوالب بطاقات. هُناك ثلاث خطط يُمكنك الاختيار من بينها بالنسبة لهذه الإضافة. أقلها سعرًا هي 47 دولار. إلا أنّ الخدمات التقنية عالية الجودة المُقدّمة بواسطة الإضافة تُبرّر أسعارها العالية. خصائص الإضافةمُحرّر مرئي WYSIWYGإمكانيّة ترتيب الصفوف والأعمدة بطريقة السحب والإفلات (Drag and Drop)خطوط جوجل وأيقونات Font Awesomeتعقّب الأحداث من جوجل23 زر قابلة للتعديلمُحرّر الخلايا مُحمّل مع خيارات مُختلفةتصميم متجاوب بالكاملاختبار A/B Split Testingدعم فوري للمُستخدمينرموز قصيرة (Short Codes)يُمكن تجربة جميع القوالب باستخدام مُدخلات واحدةVisual Composer Pricing Table Add-On إضافة Viusal Composer Pricing Table Add-On هي إضافة متجاوبة والتي تم تصميمها خصّيصًا للقوالب التي تم إنشاؤها باستخدام Visual Composer. الميزة البارزة لهذه الإضافة هي أّنّها تُتيح لك حريّة تخصيص خلفيّة، ألوان الخط والشفافيّة (Transparency) بالنسبة لجدول التسعير. مما يُعني أنّه لن تكون بحاجة للتعامل مع مجموعة من القوالب المُعرّفة مسبقًا من جديد. تم تصميم جداول التسعير بطريقة تجعلها تلعب دور أزرار الدّعوة إلى الإجراء Call to action. ستحصل مع الإضافة على أيقونات Font Awesome لإضافة المزيد من الحيويّة لجدول التسعير الخاص بك. تحتوي الإضافة على خاصيّة التبديل (toggle) والتي تُتيح إمكانيّة تبديل مقدار المساحة بين الخطط المختلفة في جدولك. ثمن الترخيص العادي هو 17 دولار والذي يشتمل على ستّة أشهر من الدّعم الفنّي. خصائص الإضافةتخطيطات عمود مُخصّصةتنسيقات حدود (borders) مُخصّصةخلفيّة وألوان خط مُخصّصة بالكاملتأثيرات شفافيّةأيقونات Font Awesomeإضافة تأثيرات تحريكالتّحكّم في المسافات بين خطط التسعيرصناديق الدعوة إلى الإجراءمثال حييستخدم موقع College for Pets هذه الإضافة لعرض أسعار الشهادات التي يقدمونها. Easy Pricing Table إضافة Easy Pricing Table التي توفّرها Fatcat Apps هي جداول تسعير مشهورة يسهل إعدادها خلال دقيقتين فقط. تُقدّم الإضافة 10 قوالب لجداول تسعير متجاوبة تمامًا والتي تحتوي على تلميحات مُضمّنة تُمكّنك من عرض معلومات مُفصّلة عن منتجك أو خدمتك دون بعثرتها. وفقًا لموقع الإضافة، فإن الإضافة ستعمل فور قيامك بتثبيتها. فلا تحتاج لكتابة شيفرات برمجيّة لأي شيء أو الخوض في إعدادات ضبط مُعقّدة. ستكون الإضافة مُثبّتة لديك وتعمل في دقائق معدودة. تُقدّم الإضافة أيضًا خطط خاصة بالشّركات والوكالات والتي تحتوي على تبديلات التسعير وإضافات إحصائيّات جوجل. تبديلات التسعير تُتيح لعملائك معاينة معدّلات التسعير التي تضعها لخدمة معيّنة بعملات مختلفة أو لفترات مختلفة (على سبيل المثال، خطط فصليّة، خطط سنويّة، إلى آخره). تُقدّم Fatcat Apps فترة 60 يوم لاستعادة مبلغك إذا لم تكن راضيًا عن جداول التسعير المُقدّمة. يُمكنك الحصول على ترخيص شخصي مقابل مبلغ 29 دولار والذي يمكن استخدامه في موقع واحد. بهذا الترخيص ستحصل على 10 قوالب ودعم عب البريد الإلكتروني. خصائص الإضافة10 قوالب تصميممتجاوبة وقابلة للتخصيص بالكاملسهلة الاستخدامتلميحات مضمّنةدعم بريد إلكتروني مدفوعإضافة تبديل الأسعارإضافة إحصائيات جوجلمثال حيربمّا تكون قد رأيت جداول Easy Pricing Tables في العديد من المواقع ولكنّك لم تعرف أنّها هي نفس الإضافة. إليك بعض المواقع الشهيرة التي تستخدم الإضافة لأغراضها التجارية: WooThemes، Social Media Examiner، Pagely، WPBeginner، WP Mayor، WPLift و wpmudev. PricingTable إضافة Pricing Table التي تطوّرها ParaTheme هي إضافة جدول تسعير ووردبريس مجّانيّة وصغيرة الحجم. تقوم الإضافة بإنتاج نظام HTML/CSS شبكي (grid) خالص لعرض الجدول في موقعك. إنّ سهولة استخدام الإضافة، تصميمها المتجاوب ومجموعة أخرى من المميزات هي أمور تجعل من هذه الإضافة خيارًا شائعًا لمن لا يريد شراء جدول تسعير. يُمكن ببساطة سحب وإفلات صفوف/أعمدة وإدارة جدول التسعير من خلال لوحة الإدارة المدمجة الخاصّة بالإضافة. تتضمّن الإضافة خاصيّة دعم الرموز القصيرة والتي تُمكّن المستخدمين من وضع جدول التسعير أينما أرادوا بسهولة. أحد أفضل الخصائص بهذه الإضافة هي أنّه بإمكانك تضمين فيديو (يوتيوب أو فيميو) في خطط جدولك التسعيري. خصائص الإضافةمتجاوبةعدد لا نهائي من الأعمدة والصفوفخاصّية السحب والإفلاتحزمة من 7 ألوان للنصوصحزمة من 12 لون للخلفية19 شريط للأعمدة21 خط من خطوط جوجلتدعم الإضافة وضع صورة خلفية في منطقة الجدولGo Pricing – WordPress Responsive Pricing Table تدعم إضافة Go Pricing – WordPress Responsive Pricing Table المُقدّمة بواسطة Granth العديد من عناصر الوسائط شاملة صور، خرائط، تسجيلات صوتيّة وفيديو. تثبيت الإضافة يستغرق بضع دقائق مع لوحة الإدارة. مدمج بالإضافة أيقونات Font Awesome، Icomoon، Linecon وMateral. كلها أيقونات يمكنك استخدامها في جدولك التسعيري المُخصّص. يمكنك معاينة الشكل النهائي لجدول التسعير الخاص بك قبل نشره على موقع وذلك باستخدام خاصيّة المعاينة الفوريّة التي توفّرها الإضافة. توفّر هذه الإضافة الكثير من الوقت الذي يمكن أن يُستنفذ في النشر ثم العودة لإضافة تعديلات بسيطة. تحتوي الإضافة على أكثر من 250 تصميم قالب يمكنك الاختيار منها. القوالب قابلة للتخصيص بالكامل مما يعني أنّه بإمكانك فعل أي شيء مثل تغيير مساحة الخلايا أو تعيين ألوان مختلفة لكل عمود. الترخيص العادي متاح مقابل 20 دولار والذي يسمح لك باستخدام الإضافة في موقع واحد فقط. خصائص الإضافةمجموعة من أكثر من 250 قالب جاهزأكثر من 650 خط من خطوط جوجلأكثر من 1900 أيقونة خطوطعدد لا نهائي من الأزرارتوفير QR Codeمعاينة فوريّة للجداولتخطيط متجاوبرمز قصير لزرّ باي بالعدد لا نهائي من الألوانمثال حييستخدم موقع View from the Boundary الإضافة لعرض خدمات الموقع التسويقيّة. ARPrice ARPrice هي إضافة مدفوعة تُطوّرها Repute InfoSystems. الإضافة تُقدّم جداول مقارنة تسعير متجاوبة وتتميز أيضًا بقوالب متحرّكة مع إمكانيّة تخصيصها. تأتي الحزمة وبها مجموعة فيها أكثر من 170 خيار لجداول التسعير يمكنك الاختيار من بينها. إذا لم تجد أيّ من تلك الجداول يناسب تصميم موقعك فيمكنك تخصيص الجدول بنفسك. مضمّن بالإضافة لوحة إدارة كاملة المزايا والتي من خلالها يمكن سحب وإفلات الأعمدة ومن ثمّ تغيير حجمها. يمكنك إضافة صور، خرائط جوجل، ملفّات صوتيّة وفيديوهات إلى جدول التسعير الخاص بك وإلحاق تأثيرات تحريك بهم. الترخيص العادي متاح مقابل 18 دولار والذي يحتوي على 6 أشهر دعم فنّي والتحديثات المستقبليّة. خصائص الإضافةأكثر من 170 قالب جداول تسعيرتأثيرات حركيةلوحة إدارة كاملة المزاياإمكانيّة السحب والإفلاتتجاوب مُخصّصخطوط جوجل وأيقونات Font Awesome مضمّنةدعم لسكربت بايبالإمكانيّة إضافة صور، خرائط، ملفّات صوتية، فيديودعم التلميحاتKento Pricing Tables تعدّ إضافة Kento Pricing Tables التي تطوّرها KentoThemes إضافة سهلة الاستخدام وقابلة للتخصيص مقدّمة لمواقع ووردبريس. تقوم الإضافة بإنتاج جداول تسعير تمّ إنشاؤها بواسطة HTML/CSS فقط والذي يعني أنها لن تتسبّب في بطء موقعك. تسمح لك الإضافة تخصيص أعمدة وصفوف الجدول بالكامل بالشكل الذي يتناسب مع قالب موقعك والألوان الموجودة به. تتيح لك الإضافة كذلك إمكانيّة تحديد اللون الرئيسي للجدول بلون من اختيارك. ولمن أصابه الملل من الألوان البسيطة فإنّه يمكن إضافة صورة خلفية إلى الجدول. يجب مراعاة أنّ صورة الخلفيّة ليست متجاوبة فلا تتوقع أن تعمل بسلاسة في الهواتف الذكية. تعديل حجم الصفوف والأعمدة بسيط. كل ما عليك فعله هو إدخال القيم وسوف تحصل على جدول بنفس الأبعاد المُحدّدة. خصائص الإضافةتصميم متجاوبعرض مُخصّص للأعمدةعدد لا نهائي من الأعمدة والصفوفلوحة إدارة سهلة الاستخدامحقول إظهار/إخفاء فارغةمثال حييستخدم موقع WebPrezence.com الإضافة في متجره الإلكتروني. يمكن أن ترى كيف أضافت صورة الخلفيّة التي استخدموها تأثيرًا مُكمّلاً للمظهر العام لجدول التسعير. POWr Price Table إضافة POWr Price Table التي تقدّمها POWr هي إضافة مجّانيّة مُختلف عن غيرها، حيث أنها خدمة سحابية ممّا يعني أنّه بإمكانك تعديل موقعك حتى بعد نشره. كما تدعم الإضافة خدمة بايبال ممّا سيُسهّل على زبائنك عملية الدّفع. تُتيح لك الإضافة إنشاء أنظمة دفع دوري لأشياء مثل العضويّات أو الاشتراكات. هذه الميزة ليست موجودة بالإضافات الأخرى التي تمّ استعراضها من قبل. يمكن في هذه الإضافة تخصيص الألوان، الخطوط والخلفيّات. يمكنك استخدام خاصيّة الإبراز (Highlight) لجعل خطّة معيّنة تبرز بين باقي الخطط الأخرى. كما تدعم الإضافة لغات مختلفة ومتجاوبة بالكامل. خصائص الإضافةمتجاوبة بالكاملخدمة سحابيةدعم مدمج للنصوص للعديد من اللغاتإمكانيّة إنشاء خاصيّة الدفع الدوريخاصيّة الإبراز لجعل خطّة محدّدة بارزة عن الخطط الأخرىخطوط، خلفيّات وألوان مُخصّصةدعم بايبالمقارنة بين إضافات جداول التسعير اختيار الإضافة الأنسب من الجدول أعلاه قد تكون مهمّة صعبة حيث أنه يوجد على الأقل ميزة واحدة تبرز كل إضافة عن الإضافات الأخرى. إذا كنت تبحث عن إضافة جداول تسعير مدفوعة فإنّ إضافة Easy Pricing Tables ببساطة هي خيارك الأمثل. تمتلك الإضافة كل ما تحتاج إليه أن يكون موجودًا في إضافة جدول تسعير. أعجبتني خاصيّة تبديل التسعير، وهي الخاصيّة التي لا تقدّمها الإضافات الأخرى. تصبح خاصيّة تبديل التسعير إلزاميّة عندما تختلف أسعار منتجك أو خدمتك. تحتوي إضافة POWr Price Table على العديد من المميّزات التي لا توجد بالإضافات الأخرى. مثل دعم اللّغات المختلفة وكونها خدمة سحابية. إذا كنت تقوم بتغيير المظهر العام لموقعك كثيرًا، فعلى الأرجح أفضل خيار لك هو جداول التسعير التي توفّرها إضافة GO Pricing حيث أن هناك أكثر من 250 خيار يمكنك الاختيار من بينها. اختيار أفضل إضافة تسعيرهناك عدد كبير جدًا من حلول جداول التسعير لووردبريس، ولكن تم اختيار هذه الإضافات التسعة بناءً على خصائصها الممتازة وقدرتها على الموازنة بين التصميم وقابلية الاستخدام. رأينا كيف قامت مواقع حقيقيّة بتنفيذ جداول التسعير الخاصّة بهم عن طريق استخدام الخصائص الأكثر أهميّة بالنسبة لهم. الآن لديك معرفة جيّدة بمختلف جداول التسعير الموجودة وماذا يمكن لكل إضافة من الإضافات تقديمه لك. إذا كنت تريد إضافة بها مجموعة من قوالب الجداول المصمّمة مسبقًا للاختيار من بينها أو واحد تقوم بتخصيصه بنفسك، فإنّك الآن لديك بعض الخيارات المختلفة التي بإمكانك الاختيار منها. هل تستخدم جداول التسعير في موقعك؟ ما هي أفضل إضافة جدول تسعير بالنسبة لك؟ قم بإخبارنا في قسم التعليقات بالأسفل. ترجمة -وبتصرّف- للمقال Nine Best Pricing Table Plugins For WordPress لصاحبه Tom Ewer.
  8. إذا أردت بناء موقع ووردبريس مميز وينسجم مع أهدافك الشخصية والتجارية فيجب عليك حذف بعض الأشياء المُحزّمة بشكل افتراضي مع ووردبريس. خبراء ووردبريس يملكون عادة قائمة من الأشياء لإضافتها وحذفها بشكل تلقائي والتي يقومون بها دون تردد. إذا ماذا تحتوي قائماتهم؟ القائمة التالية تحتوي على ما يمكنك فعله لجعل موقعك يعمل ويبدو أفضل من السابق. 1. التخلص من "Howdy" إذا كنت تستخدم النسخة الإنجليزية من ووردبريس، فأوّل شيء ستراه عند تسجيل دخولك إلى الووردبريس هي لوحة التحكم (dashboard)، وستلاحظ أن اسمك مكتوب في الجانب الأعلى الأيمن من الصفحة، لكن ستجد قبل اسمك كلمة "Howdy" وهي التحية الافتراضية التي تأتي مع ووردبريس. يمكنك إزالة "Howdy" باستخدام شيفرة قصيرة (code snippet). من المفترض أن تكون هذه الكلمة طريفة لبعض الأشخاص إلا أنها لن تكون كذلك للبعض الآخر الذين يريدون أن يظهروا بمظهر مُحترف. شيفرة قصيرة (code snippet) يمكنها إزالة "Howdy". فبماذا سيفكر عميل -لم يستخدم ووردبريس سابقا- بعد أن ترسل له صورة من لوحة التحكم الخاصة بموقعك ورأى فيها "Howdy, Bob"؟ سيفترض على الأغلب أنك أنت من فعل ذلك، وقد يؤثّر ذلك على العلاقة التي بينكما. لذلك لماذا تفسد علاقات عملك بشيء سخيف مثل هذا، خاصة إذا كان يمكنك إزالته بسهولة؟ كل ما تحتاجه لاستبدال "Howdy" هو إضافة هذه الشيفرة القصيرة التّالية إلى ملف functions.php في قالبك: add_filter('gettext', 'change_howdy', 10, 3); function change_howdy($translated, $text, $domain) { if (!is_admin() || 'default' != $domain) return $translated; if (false !== strpos($translated, 'Howdy')) return str_replace('Howdy', 'Welcome', $translated); return $translated; } تذكر أنه من الأفضل دائما أن تنشئ نسخة احتياطية من موقعك قبل القيام بتغييرات في ملفات PHP، أو يمكنك فعل ما هو أفضل وذلك بإنشاء قالب مشتق (child theme) لإضافة التخصيصات الخاصة بك. 2. تخلص من "موقع ووردبريس عربي آخر" هذه الخطوة بسيطة لكنها مهمة لأنني أجد الكثير من المواقع التي يتم تحديثها بانتظام وتحتوي على محتويات مفيدة تضع شعار "موقع ووردبريس عربي آخر"، وهذا الشيء لا يغتفر. لتغييره، كل ما تحتاجه هو تسجيل دخولك إلى موقعك ثم الضغط على: إعدادات > عام وبعد ذلك احذف هذه الجملة من المربع بجانب "سطر الوصف" وضعْ جملة أُخرى خاصة بك. أو إذا لم ترغب بها، قم بحذفها وتجاوز قضية سطر الوصف كلية. يمكنك أيضا فعل ذلك عن طريق لوحة التخصيص: المظهر > تخصيص لا يوجد عذر لإبقاء عبارة "موقع ووردبريس عربي آخر" في موقعك. 3. تنظيف الشريط الجانبي يدعم ووردبريس الأشرطة الجانبية بشكل افتراضي وعند تثبيتك لقالب جديد ستجد أن هذه الأشرطة ممتلئة بودجات كثيرة مثل الأرشيف وآخر المشاركات وسحابة الكلمات الدلالية وغيرها، وعلى الرغم من أن هذه الودجات ستكون مناسبة في بعض الحالات، إلا أنها ليست كذلك دائما. توجد الكثير من الحالات التي لن تحتاج فيها لهذه الودجات، لذلك إذا أردت التحكم أكثر بموقعك ومظهره، سيكون من الأفضل إزالتها، يمكنك فعل ذلك عن طريق الذهاب إلى: المظهر > المربعات الجانبية ثم اسحب الودجات خارج مناطق الودجات في الجانب الأيمن من الشاشة وضعها في منطقة "ودجات متوفّرة". في الغالب، قوالب المدونات هي من أسوأ مفسدي الشريط الجانبي. 4. تنظيف لوحة التحكم تأتي لوحة تحكم ووردبريس ممتلئة بالكثير من المعلومات والودجات التي اعتاد المطورون المحترفون استخدامها، هذه المعلومات التي تظهر داخل هذه الودجات يمكن أن تكون مفيدة لأنها تضع لك كل ما تريده عند تسجيل دخولك، لكن، إذا لم تكن معتادا عليها، ستكون كل هذه الودجات مربكة لك. لذلك ستجد أن الكثير من المطورين يٌبسِّطون لوحات التّحكّم الخاصة بهم عن طريق إزالة الودجات التي لا يحتاجونها أو الودجات التي ستربك عملاءهم، إضافة إلى ذلك إن لوحة التحكم الخفيفة وغير الممتلئة تبدو أفضل، أعني لا تحتاج إلى رؤية آخر أخبار ووردبريس عند عملك على موقعك، أليس كذلك؟ يمكنك إزالة الودجات التي لا تتوقع استخدامها عن طريق إضافة بعض الشيفرات البرمجية إلى ملف functions.php في قالبك. ستكون الخطوة الأولى من عملية تنظيف لوحة التحكم هي التخلص من الودجات الافتراضية التي لن تحتاجها أنت وعملاؤك، هذه الودجات تدعى بـ meta boxes وستجد بشكل افتراضي ودجات browser_nag و right_now و activity و quick_press. يوفر لك ووردبريس Codex تعليمات برمجية بسيطة لإزالة ودجات لوحة التحكم باستخدام دالة ()remove_meta_box، وستكون الشيفرة البرمجية مشابهة لهذه: // Main column (left): $wp_meta_boxes['dashboard']['normal']['high']['dashboard_browser_nag'] $wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now'] $wp_meta_boxes['dashboard']['normal']['core']['dashboard_activity'] // Side Column (right): $wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press'] $wp_meta_boxes['dashboard']['side']['core']['dashboard_primary'] إذا لم تحتج إلى تغيير تخطيط لوحة التحكم كثيرا فسيكون إضافة شيفرة برمجية لإزالة الودجات هو أفضل حل ، وإذا احتجت إلى المزيد من التغييرات أو كنت ترغب بإعطاء عميلك بعض التحكم بها، سيكون من الأفضل استخدام ملحق. تتضمن عملية تنظيف لوحة تحكمك التأكد من إظهار كل شيء تريده، فعلى سبيل المثال إذا أردت أن توفّر لعملائك و/أو المستخدمين تعليمات لكيفية النشر بدون كتابة درس تعلمي منفصل، فيمكنك فعل ذلك عن طريق إنشاء ودجت مخصص يعرض لك المعلومات على لوحة التحكم. فعل ذلك يشبه طريقة إزالة الودجات، فهو يتضمن إضافة شيفرة برمجية إلى ملف functions.php الذي يحتوي على تفاصيل ودجت لوحة التحكم المخصصة التي ترغب بإضافتها. ستبدو الشيفرة البرمجية الخاصة بالودجت البسيطة كالتالي: add_action( 'wp_dashboard_setup', 'register_my_dashboard_widget' ); function register_my_dashboard_widget() { wp_add_dashboard_widget( 'my_dashboard_widget', 'My Dashboard Widget', 'my_dashboard_widget_display' ); } function my_dashboard_widget_display() { echo 'Hello, I am Mr. Widget'; } وبهذا ستنشئ ودجت لوحة تحكم تحتوي على أية معلومات ترغب بها ومن ثم تعرضها بالطريقة التي تريدها، وهذا جيد لعرض معلومات، وكما أشرت سابقا، إن الملحقات يمكنها مساعدتك في الودجات الأخرى مثل روابط تصنيف المشاركات و غيرها… 5. إضافة شعار إلى موقعك وإلى لوحة التحكم في العادة، من الأفضل أن تخصص قالب ووردبريس الجديد أكثر ما يمكن، وستكون خطوتك الأولى هي إضافة شعار مخصص يظهر في الغالب في أعلى موقعك ويوفر طريقة للزوار للتعرّف على علامتك التجارية فورا. يمكنك تغيير هذا الشعار عن طريق الذهاب إلى: المظهر > تخصيص ثم استخدم تخصيصات قالبك لرفع شعارك. إذا أردت وضع شعارك على لوحة تحكم موقعك أيضا -وحذف شعار وودبريس الافتراضي- يمكنك فعل ذلك بإضافة بعض الشيفرات البرمجية، وسيجعل هذا موقعك يبدو أكثر احترافية ولن يرتبك عملاؤك من ظهور علامة تجارية مُختلفة (شعار ووردبريس) على لوحة التّحكّم لديهم. يمكنك استبدال شعار ووردبريس بواحد خاص بك بإضافة هذه الشيفرة البرمجيةإلى functions.php: /**REPLACE WP LOGO**/ function admin_css() { echo ''; } add_action('admin_head','admin_css'); /**END REPLACE WP LOGO**/ ثم أضف هذه الشيفرة إلى admin.css: #header-logo { background-image: url(images/client_logo.jpg); } ستحتاج إلى التأكد من أن مسار ملف الصورة صحيح، أمر سهل أليس كذلك؟ 6. إضافة رمز المفضلة favicon يمكنك تغيير رمز المفضلة باستخدام مخصص القالب. رغم سهولة القيام بذلك، إلّا أن قلّة قليلة فقط تقوم بذلك. في حالة لم تكن تعرف ما هو رمز المفضلة، فهو عبارة عن صورة صغيرة تظهر بجانب رابط عنوان موقعك في نافذة متصفحك، وهي فرصة أخرى لإظهار علامتك التجارية وجذب الانتباه إلى التفاصيل، وهذا الأمر ينصح به المطورون المحترفون. يمكنك إضافة رمز المفضلة بسهولة عن طريق الذهاب إلى: المظهر > تخصيص ثم ارفع رمز المفضلة في مُخصّص القالب، إذا لم تعرف كيف تصنع رمز المفضلة فإن هنالك العديد من الأدوات التي ستساعدك على فعل ذلك مثل RealFaviconGenerator و Heroic Favicon Generator. 7. تخصيص الروابط الثابتة من الأشياء الأخرى التي يمكنك القيام بها ليبدو موقعك أكثر احترافية هي الروابط الثابتة المخصصة، فعند تثبيت قالب ووردبريس لأول مرة، سيتم تعيين الروابط الثابتة كسلسلة نصية من الأرقام بشكل افتراضي، وهي ليست جميلة ولا تساعدك في رفع ترتيبك لدى محركات البحث،أي أنك ستخسر الكثير من الزوار إذا أبقيتها، بالإضافة إلى أن السلسلة النصية من الأرقام تزعج قراء روابط موقعك. لكن لا داعي للقلق، يمكنك إصلاح ذلك، اذهب إلى: الإعدادات > روابط دائمة في لوحة التحكم وغيّرها من "عادي" إلى "عنوان المقالة" (post name)، وبهذه الطريقة، كل مشاركة سيتم حفظها مع رابط يشير إلى عنوان المشاركة أو الصفحة بدلا من أرقام غير مفهومة. 8. التخلص من Hello Dolly تم إضافة ملحق "Hello, Dolly" إلى نسخة ووردبريس باللغة الإنجليزية منذ مدة طويلة، وهو موجود بشكل افتراضي ويعرض كلمات من أغنية "Hello, Dolly" لـ Louis Armstrong في أعلى لوحة التحكم على الجانب الأيمن. هذا كل ما تقوم به هذه الإضافة، وعلى الرغم من أنها تُظهر روح الدعابة لصانعي ووردبريس، إلا أنها ليست مهنية، خاصة إذا كنت تطور مواقع لشركات. يمكنك التخلص من Hello, Dolly بسهولة عن طريق الذهاب إلى Plugins "الملحقات" في لوحة التحكم والبحث عنها. عندما تجدها انقر على Deactivate "تعطيل" في اسم الملحق أو إذا كان ذلك غير كافيًا بالنسبة لك، احذف المُلحق بشكل كامل. 9. إضافة صفحة 404 مخصصة طريقة أخرى ليظهر موقعك بطابع احترافي ومهني وذلك عن طريق إنشاء صفحة 404 مخصصة. حتى لو بذلت جهدًا كبيرًا للتأكد من عدم وجود روابط معطلة في موقعك، سيظل بعض الزوار يكتبون روابط خاطئة لصفحات موقعك أو يصلون إلى موقعك عبر نتائج غير محدّثة من محركات البحث، للتخلص من هذه النهاية المسدودة، ستحتاج إلى إنشاء صفحة 404 تساعد زوارك الضالين للعودة إلى المكان الذي تريده. في الوقت الحالي، أغلب القوالب تأتي مع صفحة 404 بشكل افتراضي لكنها تخبر الزائر فقط أن الصفحة غير موجودة، وقد توفر رابط للعودة إلى الصفحة الرئيسية، وهذا غير كافٍ، أعني أن الزائر ذهب إلى صفحة غير موجودة، لكن قد تكون الصفحة التي يبحث عنها موجودة في موقعك، أليس كذلك؟ لن تحتاج إلى بناء صفحة 404 مخصصة من الصفر فتوجد ملحقات عديدة تفعل ذلك مثل 404page و 404 Page by SeedProd. 10. تخصيص تذييل الصفحة ستجد أن التذييل في أغلب القوالب عام للغاية، ففي كثير من الأحيان ستخبرك هذه المنطقة عن القالب الذي يستخدمه الموقع، ومعلومات حول حقوق النشر و اسم الموقع، يمكنك تغيير هذا النص لكنه سيكون أصعب من تغيير اتجاه هذه المعلومات أو إضافة حقول جديدة. يمكنك تخصيص تذييل الصفحة عن طريق استخدام الودجات، لذلك إذا كان القالب يسمح لك باستخدام ودجات التذييل، يمكنك إضافة بعض المعلومات الأخرى إلى هذه المنطقة، فمثلا يمكنك إضافة ودجت نص مخصص مع بيانات الاتصال بك، أو يمكنك إضافة أيقونات شبكات التواصل الاجتماعي في ودجت أخرى، أو يمكنك أيضا إضافة بعض الودجات القياسية في هذه المنطقة مثل أحدث المُشاركات أو قائمة التصفح الرئيسية. بالطبع توجد بعض الملحقات التي توفر لك المزيد من التخصيص، فعلى سبيل المثال يسمح لك ملحق Footer Putter بإضافة معلومات حقوق النشر وعلامتك التجارية المسجلة، وسيسمح لك ملحق Header and Footer بإضافة شيفرات الإعلانات، أما بالنسبة إلى WP Custom Header Footer فسيسمح لك بإضافة شيفرات CSS و JS مخصصة دون لمس ملفات القالب. إن الاهتمام بتخصيص منطقة التذييل سيُظهر موقعك بمظهر مهني واحترافي. 11. استخدام ملحقات White Label يمكنك استخدام أحد ملاحق white label لتخصيص لوحة التحكم بسرعة وسهولة دون الحاجة إلى الخوض في الشيفرات البرمجية، ونحن ننصح بـ Ultimate Branding، فهذا الملحق مفيد للغاية ويجعل عملية تخصيص لوحة التحكم لعلامة تجارية مُعيّنة أسهل دون كتابة أية شيفرات برمجية. باستخدام هذا الملحق، يمكنك تخصيص شاشة تسجيل الدخول والتذييل وتذييل لوحة التحكم والودجات وغيرها، فهي تعطيك تحكمًا كاملًا على جزء الواجهة الخلفية (backend) لموقعك لتتمكن من تخصيص كل التفاصيل، وهذا شيء مهم للغاية إذا كنت توفر لوحة تحكم لعملائك، لذلك فإن اهتمامك بالتفاصيل سيجعلهم ينبهرون. إن ملحق White Label Branding هو خيار جيد آخر، فهو يوفر لك المميزات السابقة ويسمح بتخصيص لوحة التحكم، وإضافة إلى ذلك فهو يأتي بأدوات إضافية مثل التحكم بالتصفح والقوائم، والسماح بإخفاء شريط المدير، وإضافة ودجات و meta boxes في لوحة التحكم، ويمكنك أيضا تخصيص الألوان والأزرار وتغيير كل ما يراه المستخدم العادي على لوحة التحكم. الخاتمة الانطباعات الأولية مهمة للغاية لعلامتك التجارية ولموقعك على الإنترنت، وستبدأ بخسارة عملائك أو/و زبنائك إذا كان موقعك لا يبدو احترافيًا ومهنيًا، لكن لحسن الحظ ليس من الصعب صقل موقعك ليظهر كأن محترفًا حقيقيًا قام ببنائه. فبإضافة مميزات -وحذف أخرى- يُمكنك تحسين مظهر موقعك بشكل كبير. ما الأشياء التي يجب عليك إضافتها/حذفها إلى موقع ووردبريس الخاص بك ليظهر بمظهر احترافي؟ ما الأشياء الافتراضية التي يجب تغييرها؟ شاركنا تجاربك في التّعليقات. ترجمة -وبتصرف- للمقال: Add (or Remove) These 11 Things From Your WordPress Site and Look Like a Pro لصاحبته Brenda Barron.
  9. هل أنت مهتم بتعلم PHP وبناء قوالب وملحقات خاصة بك على ووردبريس؟ أو ربما أنت مُهتمّ بتعلّم القليل الذي يُمكنك من إدخال التّعديلات التي تحتاجها على مواقعك ومدوّناتك التي تعتمد على ووردبريس. أيّا كان وضعك، هناك أمور يجب عليك أن تعرفها قبل أن تغوص في مجال تطوير ووردبريس. سنحاول في هذا المقال إعطاءك فكرة واضحة عليها. كيف يعمل ووردبريس؟ لنفهم ماذا وكيف يمكننا التطوير في ووردبريس، سنلقي أولا نظرة سريعة على آلية عمل ووردبريس. يتكون ووردبريس من ثلاثة عناصر رئيسية: النواة الأساسية والقوالب والمُلحقات. تحتوي النواة على جميع الوظائف الأساسية التي تشكل نظام إدارة المحتوى لووردبريس، وهذه الشيفرات البرمجية تتضمن كل شيء من البنية التحتية (backend) للإدارة إلى دوال جدولة المشاركات والتأكد من قوة كلمة المرور والسماح بإنشاء مستخدمين وغيرها. في حين أن النواة الأساسية (core) مسؤولة عن البنية التحتية للموقع وكيفية التعامل معها، فإن القوالب مسؤولة عن الواجهة الأمامية للموقع وكيفية ظهوره. نستخدم إدارة ووردبريس (WordPress admin) لإنشاء المشاركات والصفحات وبقية محتوى الموقع، وأما بالنسبة لكيفية ظهور هذه الأشياء للزائر فهو أمر متروك للقالب theme، لذلك فإن هذا سيعطيك قوة كبيرة للتحكم في موقعك، فقد ترغب بتثبيت وتفعيل القوالب الموجودة أو حتى تطوير قوالبك المخصصة. أبسط طريقة لوصف المُلحقات plugins هي أنها توفر وظائف إضافية للووردبريس، ولفعل ذلك، قد تعدّل المُلحق الشيفرة البرمجية للواجهة الأمامية أو البنية التحتية للموقع، وأبسط مثال لذلك هي المُلحق الذي يضيف زر لتغريدة تويتر، وقد تُنشئ أيضا صفحة إعدادات جديدة في البنية التحتية لقائمة الإدارة والتي ستمكنك من إعداد بعض الخيارات الافتراضية لتغريدة المستخدم ويمكنها إضافة نفسها إلى الواجهة الأمامية للموقع، والتي سيكون موقعها في الغالب تحت التدوينة (post). مجالات التطوير بقدر تقدمك في تطوير ووردبريس، ستتمكن من تطوير أي واحدة من المكونات الرئيسية المذكورة أعلاه بالإضافة إلى تطبيقات مستقلة بمساعدة REST API الجديدة وسنذكر المزيد عن هذا الموضوع بعد قليل. مهما كان ما تريد فعله مع ووردبريس، أنصحك باتباع منهج في دراستك، هذه القائمة ستساعدك على التعرف على الأنظمة التي تحتاج إلى معرفتها قبل بدء تعلمك المزيد حول المجال الذي اخترته: القوالب المُلحقات REST API النواة القوالب إن تعلم كيفية عمل القوالب وتطويرها سيسمح لك باحتراف إنشاء المواقع بدءا من المواقع الصفحة الواحدة إلى مواقع المحتوي الحيوي الثقيل، وستسمح لك أيضا بالحصول على المزيد من العملاء (إذا كان هذا ما يهمك) أو حتى بيع القوالب تجاريا. يوجد العديد من مطوري القوالب الناجحين في أسواق مثل Themeforest و Mojo Marketplace وغيرها. ففي وقت كتابة هذا المقال، أشهر قالب على موقع Themeforest تم بيع 1377 نسخة منه في أسبوع أي أكثر من $81,000 في أسبوع واحد فقط! يمكنك الحصول على الكثير من الأموال إذا كنت تستطيع تطوير قالب مميزة. على الرغم من أن هذا المبلغ لا يحققه جميع مطوري القوالب، وربما لن تصبح مليونيرًا بين عشيّة وضحاها من إنشاء القوالب، لكن يمكنك الحصول على مبلغ مالي جيد من القوالب إذا كنت تقوم بالأمر بالشكل الصحيح. إذا أردت رؤية بعض الأمثلة عن القوالب الشهيرة، فألق نظرة على الأسواق التي ذكرناها أعلاه، أو على قسم قوالب ووردبربس حيث جميع القوالب مجانية، فالكثير من مطوري القوالب يصدرون أعمالهم الأولى في هذا القسم. يمكنك تعلم كيفية إنشاء قوالب ووردبريس في أكاديمية حسوب من خلال سلسلة الدروس مدخل إلى تطوير قوالب ووردبريس. الملحقات plugins بطريقة ما، تعتبر المُلحقات شريان حياة ووردبريس، فهي تحوله إلى كل شيء من منتدى إلى شبكة اجتماعية أو منصة للتجارة الإلكترونية وغيرها باستخدام ضغطة زر واحدة، فالمُلحقات تعطيك تحكمًا كاملًا بجميع جوانب نظام ووردبريس، وتسمح لك بتعديل ما تشاء، وسيساعدك هذا كثيرا عند إنشاء مواقع ووردبريس للعملاء. كما هي الحال مع القوالب، فالمُلحقات تملك أيضا أسواقا وفي العادة يتم إدارتها من نفس الشركات التي تدير أسواق القوالب. يعتبر سوق CodeCanyon على سبيل المثال أكبر سوق للملحقات حيث يملك أكثر من 4000 ملحق متاحة للشراء. على الرغم من أن المبيعات ستكون أقل من القوالب إلا أنه يمكنك ربح الكثير إذا أنشأت ملحقًا جيدًا. يملك موقع ووردبريس قسمًا للملحقات المجانية ويحتوي على أكثر من 40000 ملحق، وهو بذلك مصدر كبير للأدوات والإلهام والأمثلة على الشيفرات البرمجية المميزة (والشيفرات البرمجية السيئة للأسف). يمكنك تعلم كيفية إنشاء ملحقات وإضافات ووردبريس في أكاديمية حسوب من خلال سلسلة الدروس مدخل إلى برمجة إضافات ووردبريس. REST API ستستخدم REST API لاحقا عندما تحترف تطوير القوالب والمُلحقات، ونظريا ستكون قادرا على استخدامها إذا كانت لديك خبرة في البرمجة بلغة أخرى مثل جافا أو روبي. تعتبر REST API جديدة نسبيا وتسمح لك بإنشاء تطبيقات حقيقية بالاعتماد على ووردبريس، وهذا يتضمن تطبيقات أندرويد وأيفون وغيرها. أفضل طريقة لشرح هذه الميزة هي عن طريق مقارنتها بمواقع مثل تويتر أو انستغرام، لا شك أنك قد رأيت تغذية تويتر معروضة على موقع أحدهم، ولإضافة هذه الميزة إلى موقعك لن تحتاج إلى معرفة كيفية عمل نواة شيفرة البرمجية الخاصة بتويتر، كل ما تحتاجه هو القليل من الشيفرات البرمجية التي تقول: "من فضلك استرجع آخر خمسة من تغريداتي." وسيتعامل تويتر مع الباقي وسيرجع لك بيانات آخر خمسة تغريدات التي طلبتها، وبعد ذلك يمكنك استخدام HTML و CSS لعرضها. وهذا بالضبط ما يفعله REST API لووردبريس، يمكنك الاتصال بأي موقع وطلب منه آخر خمسة مشاركات فيها، ويمكنك أيضا القيام بأكثر من ذلك: يمكنك إنشاء/حذف المستخدمين وتعديل الفئات وغيرها (بالطبع، تحتاج إلى الاستيثاق قبل استخدامها)، هذا يعني أنه يمكنك استخدام ووردبريس كمستودع للمعلومات وبناء واجهة أمامية وبنية خلفية باستخدام نظام مختلف تماما. النواة ساهم في تطوير ووردبريس مجتمع من الآلاف المتطوعين حول العالم، حيث أنه يعمل 471 شخص على الإصدار 4.4 من ووردبريس، والعديد من الأشخاص الآخرين يعملون على جوانب مختلفة من ووردبريس، من الترجمة وتطبيقات الويب إلى الإتاحة (accessibility) والدعم. في الحقيقة، يمكنك الاشتراك معهم الآن، فبينما تحتاج إلى بعض الخبرة للمشاركة في برمجة نواة ووردبريس إلا أنه يمكنك المساهمة في تحديد المشاكل والأخطاء والتأكد منها وتقديم الأفكار في أي وقت باستخدام WordPress Trac، وهو المكان الذي يمكنك من متابعة تطوير شيفرة نواة ووردبريس. إذا وجدت علة (خطأ - bug) يمكنك إرفاقها بالشيفرة المناسبة للتخلص منها، وبعد عدة مراجعات وتدقيقات سيتم استخدام شيفرتك البرمجية إذا كانت مناسبة، وهذه هي أفضل طريقة للمشاركة في تطوير النواة. تطوير ووردبريس: ماذا تحتاج أن تتعلمه يجب أن تعتاد على العمل على مجموعة محددة من الأدوات حتى تتمكن من تطوير ووردبريس. إن عملية التعلم لا تنتهي بالنسبة إلى أي مطور جيد، سوف أعرض عليك هنا حزمة للبداية كما سأريك بعض الأدوات المتقدمة التي قد تحتاج إليها لاحقا عندما تريد أن تتعلم المزيد. الحد الأدنى من المتطلبات لتطوير الووردبريس هي HTML و CSS و PHP، بالإضافة إلى هذه اللغات ستحتاج إلى جافا سكربت و MySQL في مرحلة ما، عندما تتقن هذه اللغات يمكنك الانتقال إلى أشياء أخرى مثل LESS/SASS و Coffeescript و XML و JSON وغيرها، لكن هذه الأشياء لا تعتبر ضرورية لتطوير ووردبريس، لكن إذا عرفتها سيجعل حياتك أسهل كمطور وستوسع آفاقك. HTML و CSS أول لغتين يجب عليك تعلمهما هما HTML و CSS، مهما كانت الشيفرة البرمجية التي تكتبها ومهما كانت اللغة التي تستخدمها فستحتاج حتما إلى HTML عند إرسال صفحات الويب إلى المستخدم وإلى بعض CSS لتصميم وتزيين الصفحة. إن HTML مسؤولة عن إعطاء هيكل المواقع. على المستوى الأساسي، هذا يعني أنك ستقرر ما النص الذي يجب أن يكون عنوانًا وما يجب أن يكون قائمة وما الذي يجب أن يكون في رأس أو أسفل الصفحة. أما في المستوى الأعمق، ستقرر قرارات مهمة حول SEO والتحسين (optimization). يُستخدم CSS لتطبيق أنماط لهيكل HTML، أي أنك ستُعرّف لون النص والروابط والمسافة بين الفقرات ومحاذاة الصورة وألوان الحدود وسمكها وغيرها من العناصر عن طريق استخدام شيفرة CSS. إن CSS تتميز بسهولة تعلمها وبصعوبة إتقانها. PHP تحظى PHP بشعبية كبيرة كأشهر لغة سكربتات من جانب الخادوم server-side-، ووفقا للاستطلاع الذي قام به W3Techs، تستخدم PHP في 81.6% من المواقع وهي اللغة التي كُتب بها ووردبريس (وتقريبا أغلب أنظمة إدارة المحتوى الأخرى أيضا) ولذلك فإن معرفة PHP هو أمر ضروري لتطوير ووردبريس. إن معرفتك بـ PHP وحدها، سيجعلك تحصل على أكثر من معرفة بتطوير ووردبريس فقط. إن أهم فرق بين لغات جانب الخادوم عن لغات جانب العميل - مثل HTML - هو أنه يتم معالجتها في الخادوم أولا، ففي HTML، يمكنك كتابة شيفرة برمجية لـ Good Morning وسيرسلها HTML كما هي وسيعرضها على الزوار. أما في لغات جانب الخادوم، فستكتب شيء مشابه لهذا [good [time_of_day، وقبل أن يتم إرسال ذلك الأمر إلى المستخدم، سيعالج الخادوم هذه الأمر حتى يعرف ما يضعه في مكان [time_of_day] حسب الوقت الذي دخلت فيه إلى الموقع، فيمكنك أن ترى "Good day" أو "Good evening". لاحظ أن البيانات التي يستقبلها متصفحك تبقى HTML لكن تمت معالجتها في الخادوم مسبقا، ولاحظ أيضا أن الشيفرة السابقة لم تكن شيفرة PHP بل هي مثال فقط لأعطيك فكرة عن آلية عمل هذه اللغة. كما هو الحال مع جميع لغات البرمجة، فالممارسة والتمرين هي التي تجعلك تبرمج بشكل أفضل، فيمكنك تعلم PHP في غضون بضعة أيام لكنك ستجد نفسك أنك لا تملك أية فكرة عن ما الذي تقوم به، لذلك تحتاج إلى تجربة الأشياء وتخريبها وليس الوقوف دون معرفة ما يجري، وكما يقولون الممارسة تولد الإتقان. جافا سكربت ازداد دور جافا سكربت أهمية على الإنترنت، خاصة مع ظهور أدوات مبنية على جافا سكربت مثل Node و Angular. جافاسكربت تستخدم عادة لإضافة وظائف حيوية للمواقع وللتحميل غير المتزامن. سأعطيك مثال على كل واحد منها. فمثلا لو أردت أن يتم إخفاء نموذج بشكل كامل وأن يظهر ببطء داخل lightbox عندما يضغط المستخدم على زر معين، فيمكنك فعل ذلك باستخدام جافا سكربت بما أنه يمكنه التعامل مع تحريك الرسوم (animation) وربما الوظائف الأخرى، مثل التأكد من أنه تم ملئ النموذج بشكل صحيح قبل إرساله. أما التحميل غير المتزامن فيتم عمله عبر آلية تسمى بـ AJAX، فيمكنك استخدام AJAX للحصول على معلومات من الخادوم وعرضها دون إعادة تحميل الصفحة، وأبسط مثال لذلك هو التمرير اللانهائي (endless scrolling) فعندما يتم تحميل 10 مشاركات وتصل إلى نهاية الصفحة فسيتم عرض 10 مشاركات أخرى وتستمر هكذا. الكثير من المطورين تعلموا جافا سكربت من خلال إطار jQuery، فهو يُستخدم على نطاق واسع في ووردبريس وفي ملايين المشاريع على الإنترنت، وعلى الرغم من أن هذا الأمر جيد لكن ضع في اعتبارك أن جافا سكربت هو أكثر من مجرد jQuery وإن تعلم جافا سكربت كما هو هي فكرة جيدة. MySQL إن Mysql هي لغة تُستخدم للوصول والعمل مع البيانات المخزنة في قاعدة البيانات، يستخدم ووردبريس هذه اللغة كثيرا للتعامل مع البيانات، لكن كمطور، لا تحتاج إلى معرفة الكثير لأن ووردبريس يملك مجموعة من الدوال المساعدة. لكن في بعض الحالات الخاصة، قد تحتاج إلى كتابة استعلام قاعدة البيانات بنفسك أو ربما قد ترغب بتحسين شيء في موقعك، لذلك سيفيدك تعلم أساسيات MySQL. إن العمل مع قواعد البيانات واضح للغاية، فالجدول في قاعدة البيانات يشبه كثيرا جداول بيانات Microsoft Excel، فكل عمود يملك عنوانًا وبيانات مخزنة في الأسطر، ونستخدم MySQL لإضافة وحذف وتعديل واسترجاع البيانات، ربما ترغب بكتابة استعلام MySQL يرجع لك جميع المشاركات التي تحتوي على كلمة "awesome" ولديها أكثر من 8 تعليقات، أو قد ترغب أيضا بإيجاد جميع المستخدمين الذين يملكون اسم "Daniel". مرة أخرى، إن كتابة شيفرة MySQL خام في ووردبريس هو أمر نادر، لكنه يحدث في بعض الأحيان، لذلك فإن فهم كيفية عمل اللغة سيساعدك على كتابة شيفرات أفضل بشكل عام أدوات متقدمة بمجرد أن تتعود على الأقل على استخدام ثلاثة اللغات الأساسية - HTML و CSS و PHP - يمكنك البدء باكتشاف العديد من الأدوات المساعدة، واحدة من الأشياء الأولى التي يميل الناس إلى تعلمها هي LESS و/أو SASS، كلاهما "مجموعات موسّعة" (Superset) لـ CSS، أي أن أي شيفرة CSS صحيح تعتبر صحيحة في شيفرة LESS و SASS، وتكمن أهمية إضافة هاتين اللغتين هو إمكانية استخدام متغيرات ودوال و غيرها في CSS، والذي هو غير ممكن بشكل افتراضي. إن أدوات البناء (Build tools) هو شيء سترغب في اكتشافه عند مرحلة معينة، أفضلها Gulp و Grunt فهذان يمكنهما مراقبة تعديلات الملفات وتنفيذ مختلف المهام عند استيفاء المتطلبات، فعلى سبيل المثال، في أي وقت تعدل فيه ملف SASS يمكنك ترجمته تلقائيا إلى CSS وحفظه إلى ملف معين، أو يمكنك تحسين الصور أو دمج الملفات أو تحميل الحزم الخارجية فجميع المهام الأخرى يمكنك أن تفعلها باستخدام هذه الأدوات. سطر الأوامر أو الطرفية (terminal) هو شيء يجب أن تلقي نظرة عليه. نعم إن استخدام سطر الأوامر قد يبدو مخيفا لكنه ليس كذلك، فبمجرد كتابة بضعة أوامر يمكنك حفظ الكثير من الوقت، فسكربت/أداة مثل WP-CLI يمكنه تثبيت ووردبريس في بضعة ثواني، بما في ذلك تثبيت القوالب والمُلحقات والمحتويات للتجربة والتي لو قمت بها بشكل يدوي ستتطلب الكثير من الوقت والجهد. إن أنظمة االتّحكّم في الإصدارات (Version control) هي من الأدوات المفيدة للغاية فلن تعرف حاجتك إليها إلا لو استخدمتها، فعلى الرغم من أنها وُضعت أصلا للعمل على نفس الشيفرة البرمجية في مجموعات إلا أنه يمكنك استخدامها كحل لإدارة المشاريع والمشاكل والنسخ الاحتياطي في نفس الوقت. ويعتبر كل من SVN و Git الأشهر على الإطلاق، لكن بالنسبة لي، أعتبر أن Git أفضل نظرا لأنه يعمل بشكل أفضل وبسبب Github الذي يوفر خدمة استضافة مستودعات Git على الإنترنت. ووردبريس: بوابتك إلى عالم البرمجة إن أفضل شيء بالنسبة إلى ووردبريس أنه يمكن أن يكون مدخلا لتعلم مهارات تطوير ويب ولغات أخرى. ولقد خضت هذه التجربة شخصيا، فلقد تعلمت أولا البرمجة الموجهة في PHP ثم تعلمت إطار عمل Laravel وأدوات البناء ثم LESS/SASS وأدوات سطر الأوامر وغيرها الكثير. ولقد خضت أيضا في غمار native app باستخدام #C وغيرها من اللغات. بمجرد معرفتك بكيفية عمل كل شيء، ستتعلم المزيد عند إنشاء مشاريع جديدة وكبيرة وكل شيء سيصبح أسهل، فبعد البرمجة كائنية التّوجّه في PHP لن تبذل الكثير من الجهد في تعلم #C لأن دماغك سيتعود على منطقه بطريقة مشابه لتعلم قيادة الشاحنات بعد تعلمك قيادة السيارات، فعلى الرغم من وجود الكثير من الاختلافات لكن بمجرد أن يكون لديك بعض الأساسيات سيسهل عليك التّحكمّ فيه. خاتمة ها قد عرفت الآن ما الذي تحتاجه للبدء في تطوير موقع ووردبريس، وقد تشعر بالإرباك، لكن لا تقلق، فالجميع سيشعر بذلك في هذه المرحلة. تذكّر أمرًا: من المهم أن لا تثبط عزيمتك، فجميع المبرمجين بدؤوا من مكان ما، فالكثير منهم كان سيئا للغاية عندما بدأ، يصارع لفهم المفاهيم الجديدة وشعر بالإحباط، لكنهم لم يستسلموا وكانوا دائما يدفعون أنفسهم للتّعلّم وهذا ما يُميّز المبرمج الجيد من السيئ. ترجمة -وبتصرف- للمقال: WordPress Development for Beginners: Getting Started لصاحبه Daniel Pataki. حقوق الصورة البارزة: Designed by Freepik.
  10. إذا كنتَ تعد موقعًا ليستخدمه أشخاصٌ غير متخصصين في التقنية، فسيساعد تخصيص لوحة تحكم ووردبريس في تسهيل إدارتهم لموقعهم ولتعاملهم مع المحتوى. أغلبية المواقع التي أُنشئها تكون لعملاء ليسوا معتادين على التعامل مع ووردبريس وليس لديهم الوقت الكافي لتعلمه كي يديروا موقعهم، لذلك أجنح إلى تخصيص لوحة التحكم لتسهيل عملهم. وعادةً أضيف علامتي التجارية إلى لوحة التحكم كي أذكرهم مَن الذي طوّر الموقع لهم. التعديلات والتخصيصات التي أجريها تختلف بناءً على احتياجات كل عميل، لكنها تتضمن عادةً واحدًا أو أكثر من ما يلي: إضافة علامتي التجارية إلى صفحة تسجيل الدخول بوضع الشعار الخاص بي. إضافة علامتي التجارية إلى صفحات لوحة التحكم، بدءًا من أشياءٍ بسيطة مثل تغيير نص الترويسة (header) أو التذييل (footer) مرورًا بتغيير الألوان وتخطيط الصفحات. إزالة "الودجات" (widgets) التي لا يحتاج لها العميل، وإضافة أخرى تُقدِّم تمهيدًا إلى الموقع، وما الذي عليهم معرفته للبدء باستعمال الموقع. إزالة عناصر من قائمة لوحة التحكم التي لا يحتاج العميل إلى الوصول إليها، وإضافة أخرى إن لزم الأمر. إضافة حقول مخصصة (custom fields) لتسهيل إضافة البيانات من قِبل العملاء. توفر ووردبريس عددًا من الدوال وما نسميه "hooks" التي تساعدك إن أردت كتابة الشيفرات يدويًا، وهذا ما أفعله عادةً (أضع كل شيء في إضافة مخصصة)، لكن إن لم تكن ترغب بالخوض في البرمجة وكتابة الشيفرات أو كنتَ على عجل، فقد تكون الإضافات هي الطريق الأيسر والأسرع لتحقيق مبتغاك. لنبدأ بكبيرها! Ultimate Branding تملك إضافة Ultimate Branding كل ما تحتاج له عندما يأتي الأمر إلى تخصيص لوحة التحكم، فلا تسمح لك بتخصيص صفحات لوحة التحكم فحسب، وإنما تعطيك خياراتٍ تتعلق بتخصيص الواجهة الأمامية (front end) إلى نفس نمط شبكتك من المواقع إن كُنت تستخدم نسخة مُتعدّدة المواقع من ووردبريس wordpress multisite. لكن إضافة Ultimate Branding ليست مفيدة فقط لشبكات المواقع، إذ يمكنك استعمالها عند تثبيت ووردبريس بشكلٍ قياسي لكي تضع علامتك التجارية في الصفحات الإدارية، وتخصص صفحة تسجيل الدخول، وتحذف عناصر القائمة التي لا تريدها وتغير ترتيب بعضها، وتُنشِئ شريط لوحة التحكم الخاص بك، والكثير. يمكن تفعيل أو تعطيل كل تلك الميزات من لوحة التحكم، لذلك تستطيع أن تستعمل منها ما تشاء لموقعك، كما ترى في لقطة الشاشة الآتية: White Label CMS إضافة White Label CMS هي أشهر إضافة مجانية لتخصيص لوحات التحكم، حيث تسمح لك بإضافة شعار في صفحة الدخول، وإضافة وحذف ودجات لوحة التحكم، وإخفاء بعض الصناديق في صفحات التحرير، وإزالة بعض عناصر قائمة لوحة التحكم، وإضافة أنماط CSS في الأماكن التي تريد. ليست ميزات هذه الإضافة بقوة الإضافة Ultimate Branding، وقد يُربِك المستخدمَ وجود كل الإعدادات المتعلقة بهذه الإضافة في صفحةٍ وحيدةٍ، لكنها مجانية وتملك وظائف تشمل تقريبًا كل وظائف الإضافات المجانية المتوفرة. Admin Menu Editor إذا كان ما تريده هو إضافة أو حذف أو إعادة ترتيب أو تعديل عناصر قائمة لوحة تحكم ووردبريس، فإضافة Admin Menu Editor تُسهِّل عليك الأمر. الميزة التي أحبها كثيرًا هي السماح لك بتعديل النص لكل عنصر من قائمة لوحة التحكم، فلو كنت تبني موقعًا لعميلٍ سيستعمل "المقالات" لنشر الأخبار، فيمكنك تغيير كلمة "مقالات" في قائمة لوحة التحكم إلى "أخبار". تعمل هذه الإضافة بشكلٍ مشابه كثيرًا لصفحة "تحرير القوائم" في ووردبريس. يمكنك أيضًا إعادة ترتيب عناصر القائمة، أو إخفاؤها من المستخدمين الذين لا يملكون الامتيازات اللازمة للدخول إليها. تسمح لك النسخة المدفوعة من الإضافة بنقل عناصر القوائم الفرعية إلى قوائم رئيسية أخرى، وهذا قد يفيدك إن كنت تحذف الكثير من عناصر قائمتين رئيسيتين وتريد دمج ما تبقى منهما. Post Type Archive Link أحد الأشياء التي تزعجني في ووردبريس هو مدى صعوبة إضافة رابط إلى أرشيف نوعٍ مخصصٍ من المنشورات (custom post type) إلى قوائم التنقل. الطريقة الوحيدة لفعل ذلك هي معرفة رابط URL لأرشيف النوع المخصص من المنشورات ثم إضافته كرابط مخصص… لكن ذلك صعبٌ عليك إن لم تكن تألف طريقة توليد ووردبريس للروابط. تحل إضافة Post Type Archive Link هذه المشكلة، إذ تضيف مكانًا لنوع المنشورات المخصص إلى قائمة لوحة التحكم، مما يسمح لك بإضافة رابط لكل نوع منشورات في قائمة التنقل. إن كنتَ تستعمل ووردبريس كنظام إدارة محتوى ولديك عدِّة أنواع مخصصة من المنشورات، فستفيدك هذه الإضافة كثيرًا. Media Library Assistant إذا احتوى موقعك على الكثير من ملفات الوسائط التي عليك إدارتها بطريقةٍ أكثر فعاليةً من الطريقة الافتراضية، فستساعدك إضافة Media Library Assistant في ذلك. حيث تسمح لك بإضافة تصنيفات ووسوم إلى ملفات الوسائط وتعرض أيضًا معلومات حول كل ملف وسائط في صفحة "مكتبة الوسائط"، مثل أيّة منشورات تستعمل الصورة كصورة بارزة، مع رابط للمنشور. قد تستفيد من هذه الإضافة في حال احتجت إلى تبديل أو إزالة صورة وكنتَ تعرف اسم ملف الصورة لكنك لم تذكر أين رفعتها. Login Logo هذه الإضافة بسيطة للغاية، وقد برمجها أحد مطوري ووردبريس نفسها (Mark Jaquith)، تسمح إضافة Login Logo لك بتغيير الشعار في صفحة تسجيل الدخول الخاصة بووردبريس بنسخ ملف اسمه login-logo.png إلى مجلد wp-content. كل ما عليك فعله هو تفعيل الإضافة، ثم رفع الملف وسيظهر شعارك بدلًا من شعار ووردبريس. عندما تحاول الوصول إلى هذه الإضافة في “دليل الإضافات”، فستجد تحذيرًا يقول لك أنَّ هذه الإضافة لم تُحدَّث منذ أكثر من سنتين، لا تقلق من ذلك: فهذه الإضافة بسيطة جدًا ولا حاجة لتحديثها، وقام بتطويرها -كما أشرنا-مطوِّر يمكنك أن تثق به. Dashboard Widget Order قد تكون "ودجات" لوحة التحكم مفيدةً للغاية، فهي تعطي المستخدمين معلوماتٍ حول موقعهم، وتسهِّل لهم إنشاء محتوى جديد، وتساعدهم في البدء باستخدام ووردبريس. لكن أحد الأشياء التي أجدها مزعجةً هو أنَّك لا تستطيع تحديد الترتيب الافتراضي لتلك الودجات. يمكنك حذفها أو إضافتها، لكنك لن تستطيع إعادة ترتيبها ما لم تكتب شيفراتٍ معقدة. تحل إضافة Dashboard Widget Order هذه المشكلة، لكنها تعمل في بيئة متعددة المواقع لكنها تسمح لك بسرعة أن تعيد ترتيب الودجات في لوحة التحكم، وهذا يعني أنَّه في كل مرة يُنشَأ فيها مستخدمٌ جديدٌ في شبكتك، فستعلم تمامًا كيف ستبدو لوحة التحكم بالنسبة إليهم. Dashboard Feeds إذا كنتَ تُنشِئ مواقع لعملاء ليسوا مطوري ويب وليسوا مهتمين بووردبريس، فهنالك احتمالٌ كبيرٌ أنَّك ستحذف ودجت "أخبار ووردبريس"، لكن تستطيع فعل ما هو أكثر فائدةً، ألا وهو وضع ودجت أخبار أخرى! تسمح لك إضافة Dashboard Feeds بفعل ذلك: أضف ما تشاء إضافته من تغذية RSS وستملأ هذه الإضافةُ لوحةَ التحكم بودجت لكلٍ منها. إذا كنتَ تُنشِئ موقعًا ذا مجالٍ معيّن، فربما تُضيف أخبارًا من نفس المجال. أو إذا أردت أن تحمِّس مستخدمين وعملائك بتصفح محتوى الموقع، فيمكنك إضافة تغذية RSS من موقعك نفسه! الخلاصة يُسهِّل تخصيص لوحة تحكم ووردبريس العمل كثيرًا للعملاء والمستخدمين، ويمكن أن يساعدك في نشر علامتك التجارية، وذلك بعرض معلوماتٍ عنها، أو إظهار محتوى من موقعك. إن استعملتَ الإضافات السابقة، ستتمكن من إنشاء لوحة تحكم رائعة لمستخدميك وعملائك التي تعكس مدى احترافية عملك في تعديل مواقعهم. هل خصصت لوحة التحكم في موقعك؟ ما هي التغييرات التي تجريها عادةً؟ هل هنالك تخصيصات تفعلها لعملاء محددين؟ أخبرنا ذلك في التعليقات. ترجمة -وبتصرّف- للمقال Customizing the WordPress Admin Experience for Novice Clients لصاحبه Rachel McCollin.
  11. هذا هو الدرس الأخير من هذه السلسلة، ففي الدرس الأول قمنا بتصميم الواجهة باستخدام برنامج الفوتوشوب، وفي الدرس الثاني قمنا بتحويل التصميم إلى نموذج HTML5، أمّا في هذا الدرس فسوف نقوم ببناء قالب ووردبريس كامل وجاهز للاستخدام. إذا كان هذا هو أول درس تتابعه من هذه السلسلة فدعني أخبرك قليلًا عنها. أردنا في هذه السلسلة بناء قالب ووردبريس كامل، وكما ذكرت سابقًا فهذا هو الدرس الثالث والأخير من هذه السلسلة. وقلنا بأنّ اسم القالب سيكون "Typo" وبأنه سيعتمد بشكل كلي على فن Typography من دون استعمال أي صور حتى يكون التركيز بالكامل على المحتوى. اضغط هنا لمعاينة القالب بشكله النهائي. ملفات قالب الووردبريس بما أنّ القالب بسيط فسوف نقوم بإنشاء القالب باستخدام ملفات القوالب المعتادة والمألوفة، كما أنّه سيتم تقسيم نموذج HTML5 الذي قمنا بإنشائه سابقًا على ملفات القالب من أجل إنشاء الصفحات المختلفة للقالب. سنقوم أيضًا بنسخ جميع الصور وملفات CSS إلى مجلد القالب. ملف Style.css الخاص بالقالب Theme Name: Typo Theme URI: http://blog.spoongraphics.co.uk/ Description: A premium theme by Chris Spooner of Blog.SpoonGraphics. Version: 1.0 Author: Chris Spooner Author URI: http://blog.spoongraphics.co.uk/ body, div, h1, h2, h3, h4, h5, h6, p, ul, ol, li, dl, dt, dd, img, form, fieldset, input, textarea, blockquote { margin: 0; padding: 0; border: 0; } body { background: #dedede url(images/bg.jpg); font-family: 'Droid Serif', serif; font-size: 14px; line-height: 24px; color: #666; } قمنا في بداية الملف بإضافة مجموعة من التفاصيل التي تخص القالب حتى يتعرف عليه الووردبريس، كما أننا قمنا بنسخ بعض التنسيقات الموجودة في نموذج HTML5 الذي أنشأناه سابقًا. ملف Header.php <!doctype html> <html> <head> <meta charset="UTF-8"> <title><?php wp_title('&laquo;', true, 'right'); ?> <?php bloginfo('name'); ?></title> <link href="<?php bloginfo('stylesheet_url'); ?>" rel="stylesheet" /> <link href="http://fonts.googleapis.com/css?family=Droid+Serif:400,400italic" rel="stylesheet" /> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <!--[if lt IE 9]> <link href="<?php bloginfo('template_url); ?>/css/ie.css" rel="stylesheet" /> <![endif]--> <!--WP generated header--> <?php wp_head(); ?> <!--End WP generated header--> </head> <body> <div id="container"> <header> <h1><a href="<?php echo get_option('home'); ?>" title="Return to the hompage">Typo</a></h1> <nav role="navigation"> <ul> <li><a href="<?php echo get_option('home'); ?>">Home</a></li> <?php wp_list_pages('title_li=' ); ?> </ul> </nav> </header> قمنا بنسخ الجزء الأول من الشيفرة البرمجية الموجودة في ملف index.html الخاص بالنموذج إلى ملف header.php. فقد قمنا بنسخ كل شيء ابتداءً من Doctype وانتهاءً بمحتويات الوسم <head> ووضعناه في ملف header.php، بعد ذلك أضفنا بعض الوسوم الخاصة بقوالب ووردبريس، وكمثال على ذلك فقد قمنا بإضافة <? ;()php wp_title?> لإظهار عنوان التدوينة أو الصفحة و<? ;('php wp_list_pages('title_li?> لعرض قائمة بجميع الصفحات، فالقيمة title_li استخدمت لإزالة الإعداد الإفتراضي الذي يقوم بإظهار العنوان "Pages" أعلى القائمة. ملف Index.php <?php get_header(); ?> <div id="content" role="main"> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <article <?php post_class(); ?>> <h2 class="post-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <? php the_content(''); ?> <ul class="postinfo"> <li><?php the_time('jS F Y'); ?></li> <li>Posted in <?php the_cetegory(', '); ?></li> <li><a href="<? php the_permalink(); ?>">Continue Reading &raquo;</a></li> </ul> </article> <?php endwhile; ?> <nav id="pagination"> <ul> <li class="older"><?php next_posts_link('Older posts'); ?></li> <li class="newer"><?php previous_posts_link('Newer posts'); ?></li> </ul> </nav> <? php else : ?> <article class="nothing"> <h2>Nothing Found</h2> <p>Sorry, but you are looking for something that isn't here</p> <p><a href="<?php echo get_option('home'); ?>">Return to the homepage</a></p> </article> <?php endif; ?> </div> <?php get_sidebar(); ?> <?php get_footer(); ?> قمنا بعد ذلك بنسخ الشيفرات البرمجية من عند نهاية ما هو موجود في ملف header.php وحتى بداية القائمة الجانبية، بعدها أضفنا حلقة ووردبريس (WordPress loop) لنتفحص فيما إذا كان هناك محتوى/تدوينات أم لا. وإذا كنت تذكر ففي ملف HTML الثابت الذي أنشأناه سابقًا قمنا بوضع 3 تدوينات بنصوص عشوائية، ولكننا الآن لن نحتاج لها لأن الووردبريس سوف يعرض التدوينات باستخدام الكود الموجود بين while وendwhile، ففي داخل هذه الحلقة تبقى بنية HTML موجودة ولكن العناصر التي تحتاج أن تكون متغيرة/ديناميكية (dynamic) استُبدِلت بوسوم PHP مناسبة، فعلى سبيل المثال فإنّ الكود <? ;()php the_permalink?> سوف يعرض عنوان URL الخاص بالتدوينة داخل وسم <a> وأمّا الكود <? ()php the_category?> سوف يقوم بعرض فئة التدوينة. وبالنسبة للمحتوى العشوائي فإنه يمكن استبداله بوسم واحد وهو <? ;()php the_content?> بحيث سيقوم الووردبريس بإدخال كل المحتوى المحفوظ في قاعدة البيانات من محرر النصوص بدل ذلك الوسم. أمّا في أعلى وأسفل هذا الملف فقد قمنا باستدعاء ملفات القالب للحصول على صفحة كاملة، فالوسم <? ;()php get_header?> يقوم بمناداة وإدخال ملف header.php، بينما يقوم الوسم <? ;()php get_sidebar?> بمناداة وإدخال ملف sidebar.php وهكذا بالنسبة لجميع الملفات. ملف Sidebar.php <aside id="sidebar"> <section id="about"> <h3>About me</h3> <p><?php echo get_option('omr_about_excerpt');?> <a href="<?php echo get_option('omr_about_link');?>">Find out more &raquo;</a></p> </section> <section id="categories"> <h3>Categories</h3> <ul> <?php wp_list_categories('show_count=0&title_li=&hide_empty=0&exclude=1'); ?> </ul> </section> <section id="social"> <h3>Social</h3> <ul> <?php if( !get_option('omr_social-one') ) { ?> <?php } else { ?> <li><a href="<?php echo get_option('omr_social-one_url');?>"><?php echo get_option('omr_social-one');?></a></li> <?php } ?> <!-- more custom tags for theme settings page --> <?php if( !get_option('omr_social-six') ) { ?> <?php } else { ?> <li><a href="<?php echo get_option('omr_social-six_url');?>"><?php echo get_option('omr_social-six');?></a></li> <?php } ?> </ul> </section> <section id="latest"> <h3>Latest Posts</h3> <ul> <?php query_posts('showposts=6'); if ( have_posts() ) : whitle ( have_posts() ) : the_post();?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; else: ?> <li>No posts found</li> <?php endif;?> <?php wp_reset_query();?> </ul> </section> <section id="search" role="search"> <h3>Search</h3> <form action="<?php bloginfo('url'); ?>/" method="get"> <fieldset> <input type="text" id="searchbar" placeholder="I'm looking for&hellip;" name="s" /> <input type="submit" id="searchsubmit" value="Search" /> </fieldset> </form> </section> </aside> الجزء التالي هو القائمة الجانبية بحيث تكون عناصره بين وسمي <aside>. نفس القاعدة تنطبق على أي محتوى عشوائي بحيث يتم استبداله بوسم PHP بحيث يتم ادخال المحتوى بشكل ديناميكي. ومن الأمثلة على ذلك <? ;()php wp_list_categories?> مع مجموعة من المتغيرات لتخصيص مخطّط الصفحة (layout). في هذا القالب هناك الكثير من الوسوم المخصصة التي تسمح للمستخدم بتخصيص القالب كما يريد باستخدام صفحة إعدادات خاصة، فجميع الوسوم التي تبدأ بـ _omr تقوم باستدعاء إعدادات مخصصة مثل جزء About وروابط الشبكات الاجتماعية. ملف Footer.php <footer> <ul id="credits"> <li class="wordpress"><a href="http://wordpress.org">Powered by WordPress</a></li> <li class="spoonghraphics"><a href="http://blog.spoongraphics.co.uk">Theme by SpoonGrahpics</a></li> </ul> <p id="back-top"><a href="#">Back to top</a></p> </footer> </div> <!-- <?php echo get_num_queries(); ?> queries. <?php timer_stop(1); ?> seconds. --> <!--WP generated footer--> <?php wp_footer(); ?> <!--END WP generated footer--> </body> </html> ملفات Archive.php وSearch.php <footer> <ul id="credits"> <li class="wordpress"><a href="http://wordpress.org">Powered by WordPress</a></li> <li class="spoonghraphics"><a href="http://blog.spoongraphics.co.uk">Theme by SpoonGrahpics</a></li> </ul> <p id="back-top"><a href="#">Back to top</a></p> </footer> </div> <!-- <?php echo get_num_queries(); ?> queries. <?php timer_stop(1); ?> seconds. --> <!--WP generated footer--> <?php wp_footer(); ?> <!--END WP generated footer--> </body> </html> البنية الرئيسية للصفحة يتم إنشاؤها باستخدام header.php ،index.php ،sidebar.php وfooter.php، ولكن index.php تُستخدم فقط في الصفحة الرئيسية (إذا كانت هناك تدوينات ليتم عرضها على الصفحة الرئيسية). هناك بدائل لـ index.php يتم استخدامها لخصائص متعددة في المدونة مثل تصفح التدوينات بناءً على ترشيح (filter) معين (كالترشيح حسب الفئة أو التاريخ أو حتى حسب الكاتب)، أو عند تصفح التدوينات بناءً على نتيجة بحث معينة. هنا يأتي دور archive.php وsearch.php، فمحتوى هذين الملفين يشبه إلى حد كبير محتوى ملف index.php باستثناء أنّ هذين الملفين يحتويان على عناوين إضافية لوصف المحتوى المعروض على الصفحة. ملفات Page.php وSingle.php <?php get_header(); ?> <div id="content" role=''main"> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <artic1e <?php post_c1ass(); ?>> <h2 c1ass="post-title"><?php the_title(); ?></h2> <?php the_content("); ?> </article> <?php endwhile; ?> <?php endif; ?>> </div> <?php get_sidebar(); ?> <?php get_footer(); ?> <?php get_header(); ?> <div id="content" role=''main"> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <artic1e <?php post_c1ass(); ?>> <h2 c1ass="post-title"><?php the_title(); ?></h2> <?php the_content("); ?> </article> <?php endwhile; ?> <?php endif; ?>> </div> <?php get_sidebar(); ?> <?php get_footer(); ?> عندما يتم تصفّح تدوينة أو صفحة واحدة فإنّ ملفات index.php ،archive.php أو search.php يتم استبدالها بملفات page.php أو single.php. هذه الملفات أيضًا متشابهة ولكن التخطيط الخاص بها عادةً لا يحتوي على بعض الخصائص مثل رابط العنوان (يصبح العنوان نص عادي وليس رابط)، معلومات التدوينة، اقرأ المزيد وروابط ترقيم الصفحات (pagination) لانّ هذه الأمور لم تعد مطلوبة ومهمة عند تصفح المحتوى أو التدوينات بشكل فردي. كما أنّ ملف single.php يحتوي على قسم التعليقات وقد تمت إضافته باستخدام وسم <? ;()php commentstemplate?>. ملف Comments.php <?php // Do not delete these lines if (!empty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME'])) die (‘Please do not load this page directly. Thanks!'); if ( post_password_required() ) { ?> <p c1ass="nocomments">This post is password protected. Enter the password to view comments.</p> <?php return; } ?> <div id="comments"> <h3><?php comments_number('No Comments‘, '1 Comment’, '% Comments’ );?></h3> <?php if ( have_comments() ) : ?> <ol class="commentlist"> <?php wp_list_comments('avatar_size=&type=comment'); ?> <div class="pagination"> <p class="prev"><?php previous_comments_link(‘Older comments‘) ?></p> <p class="next"><?php next_comments_link(‘Newer comments‘) ?></p> </diV> <?php endif; ?> <?php if ( comments_open() ) : ?> <div id="respond"> <h3>Leave a response</h3> <form action="<?php echo get_option('siteurl'); ?> /wp-comments-post.php" method="post" id="commentform"> <fieldset> <label for="author">Name:</label> <input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" /> <label for="email">Email:</label> <input type=“text" name="email" id="email" value="<?php echo $comment_author_email; ?>" /> <label for="url">Website:</label> <input type="text" name="url" id="url" value="<?php echo scomment_author_url; ?>" /> <label for="comment">Comment:</label> <textarea name="comment" id="comment” rows="" cols=""></textarea> <input type="submit" class="commentsubmit" value="Submit" /> <?php comment_id_fields(); ?> <?php do_action('comment_form', $post->ID); ?> </fieldset> </form> <p class="cancel"><?php cancel_comment_reply_link('Cancel Reply'); ?></p> </div> <?php else : ?> <h3>Comments are now closed.</h3> <?php endif; ?> </div><!--Comments--> يمكنك القول بأنّ ملف comments.php هو أحد أكثر الملفات التي يمكن إعادة استخدامها في كل القوالب التي تصنعها لأنّ هذا الملف ومحتوياته لا يتغير كثيرًا. جميع التعليقات يتم إنشاؤها وإظهارها في الصفحة باستخدام وسم واحد فقط وهو <? ;()php wplistcomments?> ثم تحتاج إلى بعض تنسيقات CSS لتنسيق المحتوى، وفي نهاية الملف يوجد نموذج كتابة التعليقات. خاتمة يمكنك بعد إنشاء جميع ملفات القاب أن تقوم برفعها واختبارها على مدونة ووردبريس. حاول بعد ذلك تعديل بعض الإعدادات وإضافة بعض المحتوى (كتابة تدوينةأو تعليق مثلًا) حتى تتأكد أنّ كل شيء يعمل كما هو مطلوب. كما رأيت فعملية بناء قالب ووردبريس تتطلب نسخ ولصق العديد من الأكواد، وإذا كنت تبحث عن أي وسم لاستخدامه يمكنك اللجوء إلى موقع WordPress Codex فهو يحتوي على جميع الوسوم التي يمكنك استخدامها. يمكنك معاينة القالب من هنا. ترجمة -وبتصرف- للمقال: Create a Typography Based WordPress Blog Theme لصاحبه: Iggy.
  12. إن كنت تستعد لإطلاق موقع جديد، عليك أن تعلم أن إنشاء صفحة Coming Soon "سننطلق قريبا" متكاملة يعد العماد الأساس لتوفير دفعة بداية قوية حتى يتم إطلاق موقعك بزخم كبير عوض أن يمر مر السحاب بعيدا عن أعين المتتبعين. من حسن الحظ، يعد القيام بذلك أمرا سهلا عكس ما يبدو عليه من الصعوبة، لتحصل على تفاعل كبير من الزوار في يوم إطلاق موقعك ما عليك إلا أن تقوم ببعض التخطيط الدقيق والقليل من العمل الجاد. سنتطرق وإياكم في مقال اليوم إلى كيفية إنشاء صفحة "سننطلق قريبا" في ثلاث خطوات بالتفصيل، ما سيخولك القدرة على تحديد الأمور التي يجب أن تركز عليها بغرض الرفع من النتائج المرجوة من يوم إطلاق موقعك. الخطوة الأولى: تحديد الأهداف والمقاييس (Metrics) يعد تحديد هدف ما الخطوة الأولى قبل البدء في أي مشروع، بطبيعة الحال تسري هذه القاعدة أيضا على مشروعك لإنشاء صفحة "سننطلق قريبا". يمكن أن يكون لهذه الصفحة أثر كبير على إطلاق موقعك رغم أنها تظهر بشكل مؤقت فقط، لذى يجب عليك الحذر من عدم إنشائها على أتم وجه. لعلك لاحظت أني لم أتساءل حول هدفك من هذا المشروع، فهو واضح وضوح الشمس: تريد الحصول على زيارات سواء تعلّق الأمر بالمعجبين، العملاء أو سفراء علامتك التجارية (brand ambassadors). لتصل إلى هذه النتيجة عليك بناء خط تواصل بينك وبين أكبر عدد ممكن من الزوار. رغم تحمسك لإخبار الزوار بكل الأمور الرائعة التي ستقدمها على موقعك يجب أن تتذكر أن الحصول على معلومات اتصالهم يعتبر أكثر أهمية وذلك حتى تتمكن من التواصل معهم متى أردت. في هذا الصدد، عليك بالاختيار ما بين: بناء قاعدة متتبعيك على مواقع التواصل الاجتماعي (social media). بناء قائمة بريدية (email list). يمكن لاتخاذ هذا القرار أن يكون صعبا للغاية، هنالك العديد من الحجج التي تدعم أن بناء قائمة بريدية يجب أن يكون خيارك الأول. إضافة إلى كون المنافسة ستكون أقل (يعني ستصل رسالتك إلى بريد المُستقبل ولا توجد علامات تجارية أخرى تنافسك عبر إعلاناتها هناك مثلما هو عليه الحال مع الشّبكات الاجتماعية)، تتميز القوائم البريدية بسهولة التحكم كما أنك تستطيع تتبع مردوديتها من ناحية معدلات التحويل (conversion) بسهولة أكبر، كما يمكنك أن تقوم في أي وقت بتحويل المعجبين إلى متتبعين على مواقع التواصل بمجرد الحصول على معلوماتهم. ليس من الضروري أن تختار أحد الخيارين على حساب الآخر، عليك فقط بتحديد أحدهما كهدف أولي ثم القيام بتبسيط هذا الهدف إلى مقاييس (metrics) واضحة يمكنك الوصول إليها ثم تحرِّرُها على شكل "تصريح بالأهداف" (statement of intent). على سبيل المثال: هدفي هو بناء قائمة بريدية من 5000 مشترك أو أكثر خلال الحملة التي تسبق إطلاق الموقع، والتي ستستمر من الإثنين 29 يونيو إلى الإثنين 28 سبتمبر (يوم الإطلاق). سأعمل على تحويل %3 من الزوار الفريدين (unique visitors) إلى مشتركين في القائمة البريدية، ما يعني أنه يجب أن أقوم بجذب 167 000 زائر فريد خلال حملتي التي تسبق إطلاق الموقع. لاحظ استخدامي لأسلوب متفائل من خلال قولي: "سأعمل"، لا ضير في التحلي ببعض الثقة في النفس. الخطوة الثانية: إنشاء الصفحة بعد تحديدك الأهداف التي تبتغي تحقيقها، عليك إنشاء ما سيساعدك على الوصول إليها بشكل عملي. كما هو الأمر بالنسبة للعديد من الأمور على ووردبريس، يبتدأ العمل على إنشاء صفحة "سننطلق قريبا" من خلال اختيارك للملحق المناسب. هنالك العديد من الخيارات المتاحة أمامك، لتسهيل الأمور، سأعمل على حصرها في خيارين اثنين: Coming Soon يوفر ملحق Coming Soon نسخة مجانية تحتوي العديد من الخصائص فضلا عن نسخة مدفوعة رائعة. بعد تجربتي لكلتا النسختين في مشاريع مختلفة أصبح هذا الملحق هو المفضل لدي نظرا لسهولة الاستعمال فضلا عن تعدد الخصائص. WP Maintenance Mode تم تنصيب وتفعيل هذا المُلحق حوالي 300 000 مرة، يمكننا القول أن هذا الملحق أكثر شهرة من سابقه. يتسم WP Maintenance Mode بسهولة الاستخدام، سرعة الإعداد فضلا عن وضعه لأهم الخصائص بين يديك على طبق من فضة. يبقى القرار لك، يمكن الاختيار بينهما حسب احتياجاتك الخاصة فكلاهما كفيلان بالقيام بالعمل على أتم وجه. الخطوة الثالثة: صياغة الرسالة تشكل صفحة "سننطلق قريبا" تحديا إضافيا، فما إن يراها الزائر ويستوعب مضمونها سيعرف أنه لا يوجد أي شيء في الموقع ليطلع عليه ومن ثم سيسارع بالمغادرة، لذا من غير المحتمل أن يستغرق أكثر من ثانية أو ثانيتين في تفحصها ما يستوجب عليك عدم إضاعة الوقت، يجدر بك التركيز على الأهم فقط. يتوجب عليك إيصال رسالتك بسرعة واختصار، سواء كنت تبتغي بناء قائمة بريدية أو الحصول على متتبعين في المواقع الاجتماعية حاول أن تقدم مضمون رسالتك بشكل محَفِّز وجريء: من الواضح أن للمحفزات المادية قدرتها الخاصة على الجذب والإقناع. أثناء صياغتك مضمون رسالتك، يجب عليك أن تتقبل فكرة أن لا أحد من زوارك سيكون بقدر حماسك واهتمامك بما لديك لتقوله، عليك بالاختصار والتركيز: تقدم صفحة "سننطلق قريبا" التالية عروض البيع التي سيوفرها الموقع بشكل جيد للغاية في أقل عدد ممكن من الكلمات. عندما يتعلق الأمر بالتسجيل في الموقع، لا تكثر من الخيارات المتاحة للمستخدمين. أنصحك بأن تكتفي بالتسجيل باستخدام البريد الإلكتروني كبداية، بمجرد حصولك على انتباهه اِعرض عليه مُتابعتك على مواقع التواصل الاجتماعي. إن أردت أن تقدم إمكانية الاطلاع على محتواك في مواقع التواصل الاجتماعي يمكنك استخدام بعض الأزرار الواضحة بكل سلاسة في مكان ما على صفحتك، لن يكون لها أي تأثير سلبي في أغلب الأحيان: الخطوة الرابعة: إطلاق صفحة "سننطلق قريبا" يتطلب تطوير موقع إلكتروني الكثير من الوقت، لذا من البديهي أن تستخدم هذا الوقت لصالحك. يضعك القيام بذلك في موقف أقوى حينما يحين موعد الإطلاق. خير البر عاجله يساعد إنشاؤك لصفحة "سننطلق قريبا" مبكرا خلال مرحلة ما قبل الإطلاق على إتاحة الوقت الكافي لتوفير الزخم ودفعة الانطلاق الضروريين. يمكن أن تتراوح مدة عرضك لهذه الصفحة بين 6 و12 شهرا ما يعتبر أمرا مألوفا، عليك فقط أن تتذكر ضرورة الحفاظ على اهتمام وتفاعل الزوار خلال المرحلة السابقة للإطلاق. خذ على سبيل المثال قصة تحضير إطلاق Mint.com على لسان Noah Kagan: من أكثر الحقائق روعة والتي يمكن أن نستقيها من قصة إطلاق Mint.com هي أنهم أصبحوا أكبر حجما من كل منافسيهم مجتمعين حتى قبل إطلاقهم للمنتج، هنا تتجلى فائدة العمل المتقن والمتفاني خلال المرحلة التي تسبق إطلاق المُنتج. أهمية الترويج قبل إطلاق الموقع بمجرد توفير صفحة "سننطلق قريبا" على موقعك والبدء في جذب اهتمام بعض الزوار، قد يتبادر إلى ذهنك أن هذا كل ما في الأمر ولم يبق عليك إلى الاسترخاء ما يعتبر أمرا خاطئا. يمكنك أن تضاعف جهودك من خلال العمل في الاتجاه المعاكس عن طريق استخدم شبكات التواصل الاجتماعي، شبكة معارفك والتواصل الشخصي من أجل توليد حركة الزوار إلى صفحة "سننطلق قريبا" الخاصة بموقعك، أي عليك بالقيام بتحويل (converting) الأشخاص الذين عرفوا بموقعك من الجهة المعاكسة إلى صفحتك. تتصف هذه العملية بالاستمرارية، كما يجب أن تقوم بالرجوع دائما إلى التصريح بالأهداف الأصلي لتحدد إن كنت على الطريق الصحيح، إن لم تكن كذلك، من الجلي أن هنالك بعض التغييرات الإيجابية التي يجب اتخاذها. خلاصة قمنا في هذا المقال بالتطرق لمجموعة من النقاط، أهمها يتجلى في إدراك أن إنشاء صفحة "سننطلق قريبا" متكاملة يتسم بالتركيز الكبير. ضع نصب عينيك بناء قائمة زوار، تجميع المعلومات والتواصل مع العملاء المحتملين حتى قبل إطلاق منتوجك. إليك فيما يلي تذكيرا بالخطوات الثلاث التي أسلفنا الذكر: حدد أهدافك. أنشئ صفحتك. أطلق صفحتك. تجنب تضييع الوقت والجهد في الجانب التقني واجعل من السرعة حليفا لك، ثم ركز على الترويج كثيرا. عندما يحين أخيرا الوقت لإطلاق موقعك يمكنك أن تقوم بذلك بالضربة القاضية. هل سبق لك تجربة إنشاء صفحة "سننطلق قريبا"؟ هل توصلت إلى التقنية التي تعمل أفضل من الأخريات؟ شاركنا رأيك في التعليقات أسفله. ترجمة بتصرف للمقال: How to Build the Perfect Coming Soon Page for WordPress in Just 3 Steps لصاحبه: Tom Ewer.
  13. تحدثنا في السابق عن بضع خطوات يمكنك تطبيقها لزيادة أمان وحماية موقعك العامل بسكربت ووردبريس الشهير. صحيحٌ أنّ نواة ووردبريس آمنة للغاية، ولكن يجب عليك تثبيت عدّة إضافات وملحقات إضافية لزيادة مستوى أمان موقعك. سنتحدّث في هذا الدرس عن أهم إضافات الأمان والنسخ الاحتياطي التي يمكنك تثبيتها وتفعيلها على سكربت ووردبريس الشهير. لماذا قد أحتاج إضافة للحماية؟بشكلٍ عام، تقوم إضافات الحماية والأمان بتوفير طبقة إضافية من الحماية ضدّ هجمات Bruteforce والهجمات الأخرى والبرمجيات الخبيثة التي قد تصيب موقعك، يمكنها أيضًا أن توفّر لك عدّة أدوات يمكنك استخدامها لتقليل المخاطر الأمنية المحيطة بك، كما توفّر بعض الأدوات للمراجعات اليدوية الدورية أيضًا. هناك إضافات أخرى للنسخ الاحتياطي تمكّنك من استرجاع موقعك بسرعة في حال ما إذا تمّ اختراقه. لهذا، سنتطرّق الآن إلى أهم الإضافات للحماية والأمان والنسخ الاحتياطي التي يمكنك استخدامها. iThemes Security تعتبر هذه الإضافة شهيرةً جدًا عندما يتعلّق الأمر بمجال أمان ووردبريس. كانت هذه الإضافة تدعى بالسابق "WP Security" ولكن تمّ تغيير اسمها. توفّر لك هذه الإضافة عدّة طرق لحماية موقعك. في الواقع، تقوم إضافة iThemes Security بالعديد من الأمور التي ذكرناها بالدروس السابقة تلقائيًا، مثل تغيير اسم المستخدم الرئيسي ورابط صفحة تسجيل الدخول، إزالة وسم generator والمزيد. كما تعرض عدّة أدوات للحماية مثل فحوصاتٍ دورية لملفّات موقعك للبحث عن الثغرات الأمنية والملفّات الخبيثة إن وجدت، مما يحسّن من أمان موقعك، كما أنّها تقوم بحظر المستخدمين الذين يفشلون بتسجيل الدخول لأكثر من مرّة عن طريق الـIP، وتحظر ربوتات الاختراق الشهيرة، وتفرض على المستخدمين اختيار كلمات مرورٍ قويّة.. والمزيد. توفّر إضافة iThemes Security ميزات التنبيه، حيث يمكنها أن تقوم بتنبيهك عندما يتم إجراء تغييراتٍ ما دون صلاحيات. يمكنها أن تلتقط الروبوتات التي تحاول اختراقك ويمكنها أن ترسل رسالة بريدٍ إلكتروني في حال التقطت أيًّا منها. توفّر الإضافة ميّزة النسخ الاحتياطي كذلك، حيث أنّها قادرة على أخذ نسخة احتياطية من جميع ملفّات موقعك وتدويناتك التي نشرتها، ويمكنها استعادتها في أيّ وقتٍ تريده. هناك إصدارٌ مدفوع من الإضافة كذلك ويوفّر ميّزاتٍ أكثر. All in One WP Security & Firewall خيارٌ آخر متوفّر أمامك هو إضافة All in One WP Security & Firewall، تتميز هذه الإضافة بسهولة تثبيتها وإعدادها مما يجعلها خيارًا جيَدًا للمدونين الجدد. تتضمن أيضًا نظام تقييم للحماية يحدد لك مدى أمان موقعك بوضعه الحالي. يمكنك من هناك تفعيل أو تعطيل مميزاتٍ معيّنة للأمان والحماية في موقعك حسبما تريده. تسمح لك هذه الإضافة المجانية كذلك بإعداد العديد من إجراءات الحماية بمجرّد بضع ضغطات، مثل تغيير اسم المستخدم "admin"، التعرّف على المستخدمين الذين يمتلكون أكثر من حساب وتفعيل أداة تقوية كلمات المرور. كما تحتوي الإضافة على ميزة تمنع هجمات Bruteforce على موقعك عبر حظر محاولات تسجيل الدخول الفاشلة لأكثر من مرّة. يمكنك أيضًا فرض تسجيل الخروج على حسابٍ معيّن، تتبع سجل النشاط الخاصّ به والمزيد. تتضمن الإضافة أيضًا مزايا حماية قواعد البيانات والملفّات، بالإضافة إلى إمكانية إنشاء ملفّ htaccess. عبرها وعمل النسخ الاحتياطية لملفّ wp-config.php. هناك ميزة أخرى مهمّة بهذه الإضافة وهي ميّزة الجدار الناري، حيث تسمح لك بتعديل ملفّ htaccess. لتمنع المخترقين حتّى من الوصول إلى الشفرة الخاصّة بموقعك. كما أنّها تحتوي على فاحص ملفّات، الحماية من نسخ النصوص، حماية ضد هجمات السخام (Spam)، تحديثات تلقائية والمزيد. Sucuri Security Sucuri Security هي إضافة أخرى شائعة لحماية ووردبريس. تسمح لك ميزة SiteCheck المُضمّنة بالتحقق من حالة موقعك الحالية وفحصه لإيجاد الثغرات الموجودة به بالإضافة للبحث عن البرمجيات الخبيثة إن وجدت. تمكّنك الميزة كذلك من البحث عن جميع أنواع الثغرات، مثل ثغرات حقن قواعد البيانات، محاولات التصيّد الاحتيالي، إعادة التوجيه المشبوهة.. إلخ، كما يمكنها أن تلتقط أكواد جافاسكربت وPHP الخبيثة إن وجدت. تستخدم الإضافة أكثر من واجهة تطبيق برمجية واحدة (API) لفحص موقعك، أيّ أنّها تستخدم أكثر من قاعدة بيانات للشفرات الضارّة والخبيثة الموجودة على الإنترنت للتأكد من أنّ موقعك لا يحتوي على أحدها، مما يوفّر فحصًا شاملًا لموقعك، تتضمن هذه المصادر الخارجية أسماءً عريقة مثل Norton, McAfee.. إلخ. هناك بعض المزايا الموجودة بالإضافة والتي توفّر الحماية لمسار رفع ملفّات الوسائط الخاصّ بموقعك، حيث تقيّد الوصول إلى مجلّديّ wp-content وwp-includes، تتحقق من إصدارات PHP ووردبريس وتعطّل محرر الإضافات والقوالب من لوحة التحكم. Wordfence Security تحدّثنا من قبل عن إضافة Wordfence Security، وقلنا أنّها من أهم إضافات الحماية لسكربت ووردبريس. بمجرّد تثبيتها على موقعك فإنّها ستقوم بعملية فحصٍ شامل للشفرة المصدرية للتأكّد من أنّها مطابقة للشفرة المصدرية الخامّة المنشورة من موقع ووردبريس الرئيسي، إذا اكتمل الفحص بنجاح، فإنّ الإضافة تقوم بعدها تلقائيا بتفعيل خيارات الحماية لزيادة أمان موقعك. هناك إصدار مدفوع ومجاني من الإضافة، كلاهما يعتمدان على منصّة "Wordfence Cloud"، مما يعني أنّ عملية الفحص وتفعيل الجدار الناري بالواقع تجريان على خواديم الشركة المطوّرة للاستضافة وليس على خادومك مما يقلل من الحمل الموجود عليه. توفّر هذه الإضافة دعمًا لأكثر من موقع ووردبريس في آنٍ واحد، تسجيل الدخول عبر الهاتف المحمول، دعم للإضافات الشهيرة مثل WooCommerce، الاستيثاق الثنائي، فرض كلمات المرور القوية، فحص الملفّات والمزيد. تتضمن الإضافة أيضًا جدارًا ناريًا لحماية موقعك من الروبوتات، البرمجيات الخبيثة وهجمات Bruteforce. بمجرّد تثبيتها فإنك ستكون قادرًا على حظر المهاجمين واتصالات الشبكات المشبوهة، وكلّه في الوقت الحقيقي (Real time). BruteProtect تمّ شراؤها مؤخرًا من قبل شركة Automattic (الشركة المطوّرة لووردبريس)، إضافة BruteProtect هي أحد الحلول الأمنية التي يمكنك استخدامها لصدّ هجمات Bruteforce بالتحديد. توفّر الإضافة أدواتٍ لمراقبة الهجمات الحالية على موقعك في حال حصولها بالوقت الحقيقي بالإضافة إلى التحديث التلقائي لنواة ووردبريس في موقعك. الإضافة ليست مجهّزة لحمايتك ضد الهجمات الأخرى، بل فقط ضدّ هجمات Bruteforce فلا تعتمد عليها لوحدها. Acunetix WP Security Acunetix WP Security هي إضافةٌ أخرى مجانية لفحص موقعك بسهولةٍ ويسر. تمكّنك من إعداد صلاحيات الملفّات، تأمين قاعدة البيانات، إخفاء إصدار ووردبريس الحالي الذي تستخدمه عن أعين المخترقين، تغيير اسم المستخدم admin والمزيد. تتوافق الإضافة مع مواقع ووردبريس المتعددة (multisite) وعمليات النسخ الاحتياطي، كما تتضمّن أداةً تعمل بالوقت الحقيقي لعرض من يتصفّح موقعك حاليًا وماذا يتصفّحون. Bulletproof Security آخر إضافة ووردبريس سنتحدث عنها هي إضافة Bulletproof Security. توفّر هذه الإضافة العديد من المزايا التي توفّرها الإضافات الأخرى مثل ملفّات htaccess. ، حفظ نسخة احتياطية من قاعدة البيانات، سمات مختلفة لواجهة الإضافة والمزيد. يتضمّن الإصدار المدفوع منها المزيد من المميزات مثل التثبيت بنقرة واحدة، الاستعادة التلقائية، جدار ناري يتعامل مع عناوين الـIP للمستخدمين، مسجّل للأخطاء، حامٍ من هجمات Bruteforce، حظر عناوين IP معيّنة والمزيد. أهمّية إضافات النسخ الاحتياطيبجانب إضافة قويّة للحماية والأمان، فإنّه يجب عليك استخدام إضافةٍ أخرى لعمليات النسخ الاحتياطي، معظم هذه الإضافات السابق ذكرها يتضمّن الميّزتين بالواقع مما يسهّل عليك الأمر، ولكن لا تنسى بتاتًا استخدام النسخ الاحتياطي. القيام دوريًا بعمل نُسخ احتياطية من موقعك هو أمرٌ مهم لخطّة أمان كاملة، وإلّا فكيف تتوقع أن تقوم باسترجاع موقعك في حال تمّ اختراقه مثلًا؟ هناك العديد من الإضافات الجيّدة للنسخ الاحتياطي مثل VaultPress ،WordPress Backup to Dropbox و BackupBuddy. تتنوّع هذه الإضافات ما بين المدفوعة والمجانية، ولكنّها مفيدة لضمان عدم فقدان أيّ شيء مهم يتعلّق بموقعك. الخاتمةصحيحٌ أنّه يمكنك القيام بالعديد من الأمور يدويًا لتحسين حماية ووردبريس، ولكن استخدام الإضافات قد يوفّر عليك الكثير من الوقت ويوفّر لك الكثير من المميزات، خاصةً لو كنتَ تمتلك أكثر من موقع ووردبريس واحد. الإضافات السابق ذكرها يجب أن تؤدّي المهمّة المطلوبة بالنسبة لك ويمكنك تجريبها جميعًا لتصل إلى أفضلٍ واحدةٍ منها بالنسبة لك. في الدرس الأخير من هذه السلسلة سنتحدث عن أهمية تحديث ووردبريس وإضافاته لزيادة أمان موقعك. ترجمة -وبتصرف- للمقال The WordPress Developer’s Guide to Security: Security & Backup Plugins لصاحبته Brenda Barron.
  14. تعرفنا في الدرسين الماضيين عن مفهوم حاويات لينكس (LXC) ومبدأ عملها ثم شرعنا في كيفية البدء في استعمالها. سنعرج في هذا الدرس إلى كيفية استغلال مختلف نقاط ومراحل دورة حياة حاويات لينكس (LXC) لإدراج بعض من الإضافات (hooks) التي تقوم بإجراء مهمة ما. إضافات إدارة دورة التشغيل بدءًا من أوبنتو 12.10، أصبح من الممكن تعريف إضافات (hooks) تُنفَّذ عند نقاط محددة من دورة تشغيل الحاوية: الإضافات التي تحدث قبل التشغيل تُنفَّذ من مجال أسماء المضيف قبل أن تُنشَأ طرفيات أو نقاط وصل الحاويات؛ إذا أُجري أي وصل في هذه الفترة، فيجب أن يُنظَّف في إضافة تحدث بعد إيقاف التشغيل. الإضافات التي تحدث قبل الوصل تُنفَّذ في مجال أسماء الحاوية، لكن قبل أن يوصل جذر نظام الملفات؛ سينظف أي وصل لنظام الملفات في هذه الفترة تلقائيًا عند إيقاف تشغيل الحاوية. إضافات الوصل هي إضافات تنفذ بعد وصل أنظمة ملفات الحاوية، لكن قبل أن تُنفِّذ الحاوية pivot_root لتغيير جذر نظام ملفاتها. الإضافات التي تحدث بعد إيقاف التشغيل ستنفَّذ بعد إيقاف تشغيل الحاوية. إذا أعادت أيّة إضافة خطأً، فسيلغى تشغيل الحاوية، لكن أي إضافة تحدث بعد إيقاف التشغيل ستنفَّذ، ستُسجَّل أيّة مخرجات تولد من السكربت بأولوية التنقيح (debug). رجاءً راجع صفحة دليل lxc.container.conf لصيغة ملف الضبط التي سيحدد الإضافات؛ يمكن أن تأتي بعض أمثلة الإضافات في الحزمة lxc لتخدم كمثال حول طريقة كتابة إحدى تلك الإضافات. سطر الأوامر لدى الحاويات عدد مضبوط من «أسطر الأوامر» (consoles)؛ أحدها موجودٌ دائمًا في ‎/dev/console؛ الذي يظهر في الطرفية عندما تُشغِّل lxc-start ما لم تحدد الخيار ‎-d؛ يمكن إعادة توجيه ناتج خرج ‎/dev/console إلى ملف باستخدام ‎-c console-file في الأمر lxc-start؛ يمكن تحديد عدد إضافي من أسطر الأوامر باستخدام المتغير lxc.tty المضبوط عادةً إلى 4؛ يمكن أن تظهر أسطر الأوامر تلك في ‎/dev/ttyN (حيث N أكبر أو تساوي 1، وأصغر أو تساوي 4)؛ ولتسجيل الدخول إلى console 3 من المضيف، فنفِّذ الأمر: sudo lxc-console -n container -t 3 إذا لم تحدد الخيار ‎-t N، فسيتم اختيار سطر أوامر غير مُستخدَم؛ للخروج منه، استخدام عبارة الخروج Ctrl-a q؛ لاحظ أن عبارة الخروج لا تعمل في سطر الأوامر الناتج عن lxc-start دون الخيار ‎-d. استكشاف الأخطاء التسجيل إذا حدث شيء ما خاطئ عند تشغيل حاوية، فإن أول خطوة هي الحصول على سجل كامل من LXC: sudo lxc-start -n C1 -l trace -o debug.out هذا سيؤدي إلى جعل lxc يسجل في أعلى درجة إسهاب، التي هي trace، وسيكون ملف التخزين هو ملف باسم «debug.out»، إذا كان الملف debug.out موجودًا مسبقًا، فستُضاف معلومات السجل الجديد إليه. مراقبة حالة الحاوية هنالك أمران متوفران لمراقبة تغيرات حالة الحاوية: lxc-monitor الذي يراقب حاويةً أو أكثر ﻷي تغيرات في الحالة، حيث يأخذ اسم الحاوية مع الخيار ‎-n كالعادة؛ لكن في هذا الحالة، يمكن أن يكون اسم الحاوية تعبيرًا نمطيًا من نمط POSIX للسماح بمراقبة مجموعة من الحاويات؛ يستمر lxc-monitor بالعمل ويعرض تغيرات حالات الحاويات؛ أما lxc-wait فينتظر تغيِّرًا محددًا في الحالة ثم ينتهي تنفيذه؛ على سبيل المثال: sudo lxc-monitor -n cont[0-5]* هذا سيعرض جميع تغيرات الحالة لأي حاوية تطابق التعبير النمطي؛ بينما: sudo lxc-wait -n cont1 -s 'STOPPED|FROZEN' سينتظر إلى أن تتغير حالة الحاوية cont1 إلى STOPPED أو FROZEN ثم ينتهي. الوصل من الممكن في أوبنتو 14.04 الوصل (attach) إلى مجال أسماء حاوية، أبسط طريقة هي تنفيذ: sudo lxc-attach -n C1 الذي سيبدأ صدفة موصولة لمجال الحاوية C1، أو داخل الحاوية؛ آلية عمل الوصل هي معقدة جدًا، مما يسمح بوصل مجموعة فرعية من مجالات أسماء (namespaces) الحاوية ونمط الحماية (security context)، راجع صفحة الدليل لمزيدٍ من المعلومات. درجة إسهاب init في الحاوية إذا أكمل LXC بدء تشغيل الحاوية، لكن فشل إكمال تنفيذ init فيها (على سبيل المثال، لم يُعرَض محث الدخول)، فمن المفيد طلب درجة إسهاب أكبر من عملية init، فلحاوية upstart: sudo lxc-start -n C1 /sbin/init loglevel=debug يمكنك أيضًا بدء تشغيل برامج مختلفة عن init، على سبيل المثال: sudo lxc-start -n C1 /bin/bash sudo lxc-start -n C1 /bin/sleep 100 sudo lxc-start -n C1 /bin/cat /proc/1/status واجهة LXC البرمجية API يمكن الوصول إلى غالبية وظائف LXC عبر واجهة برمجية (API) مُصدَّرة من liblxc التي تكون ارتباطاتها متوفرة لعدة لغات برمجية بما فيها بايثون، و lua، وروبي، و go. ما يلي هو مثال عن استخدام ربط بايثون (المتوفرة في حزمة python3-lxc)، التي تُنشِئ وتبدأ حاوية، ثم تنتظر إلى أن يوقف تشغيلها: # sudo python3 Python 3.2.3 (default, Aug 28 2012, 08:26:03) [GCC 4.7.1 20120814 (prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import lxc __main__:1: Warning: The python-lxc API isn't yet stable and may change at any p oint in the future. >>> c=lxc.Container("C1") >>> c.create("ubuntu") True >>> c.start() True >>> c.wait("STOPPED") True الحماية يربط مجال الأسماء المعرفات (ids) إلى الموارد؛ لكنه لا يوفر للحاوية أي معرِّف يمكنه أن يشير إلى المورد، لذلك يمكن أن يُحمى المورد؛ وهذا هو أساس بعض الحماية الموفرة لمستخدمي الحاوية؛ على سبيل المثال، مجال أسماء IPC معزول تمامًا؛ لكن مجالات أسماء أخرى فيها بعض «التسربات» (leaks) التي تسمح للامتيازات بأن تُستخرَج بشكل غير ملائم من الحاوية إلى حاوية أخرى، أو إلى المضيف. افتراضيًا، تُشغَّل حاويات LXC بسياسة AppArmor التي تقيّد بعض الأفعال، تفاصيل دمج AppArmor مع LXC موجودة في قسم «AppArmor» في الدرس السابق، الحاويات دون امتيازات تربط الجذر في الحاوية إلى مستخدم دون امتيازات في المضيف، وهذا يمنع الوصول إلى ملفات ‎/proc و ‎/sys التي تمثل موارد المضيف، وغيرها من الملفات المملوكة من الجذر في المضيف. الثغرات في استدعاءات النظام ميزة أساسية من مزايا الحاويات أنها تشارك النواة مع المضيف؛ وهذا يعني أنه إذا حوت النواة على أيّة ثغرات في استدعاءات النظام (system calls)، فيمكن أن تستغلها الحاوية؛ وبعد أن تتحكم حاوية بالنواة، فيمكنها أن تسيطر سيطرةً كاملةً على أي مورد معروف للمضيف! بدءًا من أوبنتو 12.10، يمكن أن تقيَّد الحاوية من مرشِّح seccomp، إن Seccomp هو ميزة جديدة في النواة التي تُرشِّح استدعاءات النظام التي يمكن أن تُستخدَم من المهمة وأولادها؛ بينما يتوقع الوصول إلى إدارة سهلة ومحسنة للسياسة في المستقبل القريب، لكن تحتوي السياسة الحالية على قائمة بيضاء بسيطة لأرقام استدعاءات النظام؛ يبدأ ملف السياسة برقم الإصدار (الذي يجب أن يكون 1) في أول سطر ونوع السياسة (الذي يجب أن يكون whitelist) في ثاني سطر؛ وتُلحَق بقائمة أرقام، كل رقم في سطر. سنحتاج عادةً لتشغيل حاوية بتوزيعة كاملة إلى عدد كبير من استدعاءات النظام؛ لكن لحاويات البرامج، يمكن أن نقلل عدد استدعاءات النظام المتوفرة إلى رقم قليل؛ وحتى للحاويات التي تشغل توزيعات كاملة يمكن الحصول على فوائد أمنية إذا حذفت -على سبيل المثال- استدعاءات النظام المتوافقة مع 32 بت في حاوية 64 بت؛ راجع صفحة دليل lxc.container.conf للمزيد من التفاصيل حول كيفية ضبط الحاوية لتستخدم seccomp؛ لن تُحمَّل افتراضيًا سياسة seccomp. مصادر كتاب «Secure Containers Cookbook» يشرح كيفية استخدام أنماط الحماية لجعل الحاويات أكثر أمانًا. مشروع LXC مُستضاف في linuxcontainers.org. مشاكل LXC الأمنية مذكورة ومناقشة في صفحة وكي «LXC Security». ترجمة -وبتصرف- للمقال Ubuntu Server Guide: LXC.
  15. واحد من أكثر الأشياء المفيدة في ووردبريس ما يسمى بالوسوم الشرطية (Conditional Tags)، حيث ستمكنك من البرمجة بسهولة وفهم الكود الذي تكتبه كأنك تقرأ نص باللغة الإنجليزية. سنقوم في هذا الدرس بدراسة طريقة عمل الوسوم الشرطية مع إيضاح بعض النقاط الخفية والمبهمة مع قائمة بأكثر الوسوم الشرطية المفيدة وسنختم ببعض الأمثلة إن شاء الله. كيف تعمل الوسوم الشرطيةالوسوم الشرطية هي دوال خاصة بووردبريس تقوم بإرجاع قيمة صح أو خطأ (boolean) إعتمادا على معطيات مختلفة. يوجد حوالي 50 وسما شرطيا في ووردبريس، ولذلك سنقوم باختيار أكثرها استعمالا وأكثرها جديرة بالاهتمام وإلا سوف تسبب لنا الكثير من التعقيد. مفيدة()is_single سيتم إرجاع قيمة صحيحة إذا كانت الصفحة الحالية متكونة من تدوينة واحدة فقط من أي نوع ماعدا التدوينة مع المرفقات. ويتم ذلك عن طريق تمرير رقم التدوينة أو عنوانها كمعامل (parameter).()is_page سيتم إرجاع قيمة صحيحة إذا كانت الصفحة معروضة (غير مخفية).()is_singular مشابهة لـ ()is_single، لكنها تعود بقيمة صحيحة إذا تم عرض تدوينة تحتوي على مرفقات، وهي مشابهة لـ ()is_single() || is_page() || is_attachment حيث أن || تعني "أو".()is_archive سيتم إرجاع قيمة صحيحة إذا كانت الصفحة الحالية عبارة عن أرشيف مهما كان نوعها.()is_main_query سيتم إرجاع قيمة صحيحة إذا كان الاستعلام الحالي هو الاستعلام الرئيسي لهذه الصفحة.مبهمة ومخادعة()is_admin سيتم إرجاع قيمة صحيحة إذا كُنت في منطقة الإدارة من موقع ووردبريس، بعض الأشخاص يعتقد أن هذا الوسم لمعرفة هل المستخدم الحالي من المدراء أم لا، وهذا الأمر خاطئ.()is_dynamic_sidebar سيتم إرجاع قيمة صحيحة إذا كان الشريط الجانبي الحالي (ويدجت أو مناطق) لديه أية ودجات مفعلة.()is_home هذا الوسم مربك قليلا، سوف تعتقد للوهلة الأولى أنه لمعرفة هل أنت في الصفحة الرئيسية أم لا مثل http://www.example.com. لكن هذا ليس صحيح لأن هذا الوسم لمعرفة هل أنت في صفحة الرئيسية للتدوينات أم لا لأنه في بعض الأحيان قد تكون الصفحة الرئيسية للموقع ليس هي نفسها للتدوينات.()is_front_page سيتم إرجاع قيمة صحيحة إذا كانت الصفحة التي أنت فيها هي الصفحة الرئيسية سواء أن كانت هي نفسها للتدوينات أو صفحة تابعة للمدونة.قمنا بعرض جزء فقط من الوسوم الشرطية، إذا أردت المزيد يمكنك زيارة القائمة الكاملة. بعض الإستخدامات للوسوم الشرطية في ووردبريسهنالك الكثير من الإستخدامات للوسوم الشرطية وسنقوم الآن باستعراض أشهرها وأكثرها استعمالا. استخدام الوسوم الشرطية في القوالبتستخدم الوسوم الشرطية بكثرة في تطوير القوالب، ففي بعض الأحيان هنالك عنصر يظهر في كل الصفحات لكن هنالك حالات أو صفحات لا تريد أن يظهر بها. على سبيل المثال، لنقل أنك لا تريد أن يظهر التاريخ على الصفحات لكنك تريده أي يظهر على جميع التدوينات، فيمكنك القيام بهذا عن طريق هذه الشِفرة: /* الوسط: داخل ملف single.php */ <?php if ( ! is_page() ): ?> <span class="meta-date"> <?php the_date(); ?> </span> <?php endif; ?>ملاحظة حول الوسوم الشرطية والقالب الهرميإن القالب الهرمي مشابه بالأساس لـشجرة القرار التي يمكنك بناؤها باستعمال الوسوم الشرطية. ويمكنك أيضا وضع كامل القالب في index.php واستخدام هذه الوسوم لعمل ما يعمله القالب الهرمي. في الحقيقة فعل هذا الأمر ليست فكرة فريدة وجيدة، لكن معرفة أن هذا ممكن ومحاولة استعمال الوسوم الشرطية والقالب الهرمي سوف يساعدك على فهم الإثنين معا حسب رأيي. ولفهم هذا الأمر أكثر أنظر لهذا المخطط: إدراج ورقة أنماط خاصة أو ملفات جافا سكريبتفي بعض الأحيان سوف تحتاج إلى صنع صفحة مخصصة في موقعك بها الكثير من التأثيرات و الخصائص، ولتحقيق هذا سوف تحتاج إلى الكثير من التأثيرات والسكريبات والتي يجب أن تكون في صفحة واحدة فقط لأن تحميل كل هذه التأثيرات والسكريبات في جميع صفحات الموقع سوف يزيد من حجمه ويجعله أبطأ، ويمكن القيام بذلك عن طريق الوسوم الشرطية كما في المثال: 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' ); } }هنا قمنا بعمل إدراج بشكل عادي، لكننا قمنا بربط عملية الإدراج بشرط: إذا لم تكن الصفحة الحالية "صفحتنا الخاصة"، التأثيرات وأوراق الأنماط و السكريبتات لن يتم تحميلها. لاحظ أن ()is_page ستقوم باختبارين: الأول للتأكد من أن المشاركة من نوع صفحة.والثاني هل لصفحة special-page اسم للطيف، معناها هل هي slug ؟ ويقصد بها أن الرابط يحتوي على عنوان الصفحة مثلا في هذا الرابط، سيكون slug هو wordpress-203. ولاختبار هذا قمنا بتمرير 'special-page' إلى ()is_page كمعامل.إن التأكد من هذين الشرطين يجعلنا نرفض وضع السكريبتات وأوراق الأنماط سوى لصفحة واحدة مخصصة. ()is_admin يمكن استخدامه أيضا فهو حالة أخرى حيث تحتاج الإضافات للقيام بعمليات اختبار مماثلة. ملاحظة عن الوسوم الشرطية والحالة العامةالوسوم الشرطية تستطيع الوصول إلى الحالة العامة (Global State) لووردبريس (طريقة عمل الأشياء في الخلفية) وهذه الحالة يجب أن يتم وضعها قبل أن تستطيع استخدامها، لكن لا يمكنك الاعتماد كليا على استعمال الوسوم الشرطية حتى تتأكد أن عملية المصنع الخاصة بووردبريس قد فعّلت الإجراء (action) المسمى posts_selection. (هنا لائحة الكاملة بالإجراءات المفعلة من قبل ووردبريس وترتيبها). هذا يعني أن بعض الإجراءات التي يتم استخدامها عادة لا يمكن استخدامها بالتوازي مع الوسوم الشرطية، ومن أشهر هذه الإجراءات: setup_theme، init، register_sidebar و pre_get_posts. ومع ذلك، حوالي نصف الخُطّافات (hooks) وجميع القوالب تعمل جيدا بعد أن يتم تحميل الوسوم الخاصة بالقوالب، وسوف تكون مفيدة جدا هناك. في أغلب الوقت لن تكون هذه مشكلة لك، لكنه من الجيدة أن تعرف ما يمكنك فعله وما لا يمكنك، فهذا الأمر لن يزعجك سوى لمرة واحدة في كل 50 مرة تستخدم فيها الوسوم الشرطية. الوسوم الشرطية: تعلمها، استخدمها، وأحبهاإن الدوال الشرطية لووردبريس واضحة للغاية و مفيدة جدا و تستعمل في كل مكان، وآمل أن تستخدمها وأن تكون مفيدة لك في جميع الحالات عندما تحتاجها و تتحدث مع نفسك مثل : "نعم، أريد فعل هذا لكن ليس في هذه الحالة ..." أو "لكن أريدها فقط أن تظهر عندما ..." وغيرها، وسوف تبرز لك قوة ووردبريس كما هي. ترجمة وبتصرف للمقال: WordPress’s Conditional Tags لصاحبه David Hayes.
  16. ووردبريس هو منصة رائعة لإدارة المحتوى. إذا كنت تملك أيّ محتوى يأتي في شكل وحدات شبيهة بالمقالات (أو ما شابهها مثل منتجات) فلا أجد سببا يدفعك لعدم استخدام ووردبريس. قد يكون التعاون باستخدام سكربت ميديا ويكي سهل أيضا، واستخدام دروبال مع أنظمة الشركات يعد أمرا سهلا وشائعا، لكن ووردبريس له مكانته أيضا في هذا المجال، وهو في رأيي، يوفر تجربة تحرير أفضل. أحد الطرق لجعل المحتوى في ووردبريس يعمل بشكل أفضل هو إضافة معلومات إضافية له (metadata). قد يكون الأمر على شكل تصنيفات خاصة (taxonomies) أو على شكل بيانات تستخدم لهدف واحد (custom fields). ماهو الحقل المخصص في ووردبريس؟إذا أردت أن تستخدم معلومات محددة متغيرة لكل مقال ما (أو شيء شبيه بمقال كمنتج)، هنا تستطيع استخدام الحقول المخصصة في ووردبريس. "الحقول المخصصة" لها تسميتان مختلفتان في ووردبريس، غالبا ما يطلق عليها خصائص المنشور أو المعلومات الجانبية (post metadata) أو post_meta وعادة ما يطلق عليها باسم الحقول المخصصة، وهذه الترجمة الرسمية التي يستخدمها فريق ترجمة ووردبريس العربي. نحن نضيف الحقول المخصصة عندما نريد أن نخزن خصائص إضافية لمنشور ما. منشورات ووردبريس تأتي بالعديد من الخصائص الإضافية بشكل مسبق: تاريخ النشر، كاتب الموضوع، آخر وقت تّم التعديل عليهم. لكنك قد تريد المزيد، مثلا تريد أن تضيف عنوانا ثانويا للمنشور، أو تريد أن تضيف ملخص المنشور تصميم منفرد. ووردبريس يقوم بتخزين هذه المعلومات في قاعدة البيانات، وباستخدام دوال معينة نقوم بتحديدها وتخزينها واسترجاعها. الحقول المخصصة تنفرد عن خيارات الموقع site_settings حيث أنّ لهم علاقة بالمنشور وليس بالموقع ولكن كلاهما يعملان بنظام عنوان وقيمة key/value pair يتم استخارجهم من قاعدة البيانات عبر دوال محددة، لذا إن كانت لك تجربة بنظام خيارات الموقع Settings API فلن تواجه مشكلة في فهم الحقول المخصصة. كيف أضيف الحقول المخصصة لمنشور؟هناك العديد من الطرق التي تستطيع استخدامها لإضافة الحقول المخصصة، الواجهة الافتراضية للتعامل مع الحقول الخاصة في ووردبريس قديمة ولم يتم تحديثها منذ مدة، ورغم أنها تخدم الهدف إلا أنها بعيدة عن المثالية. الجزء المضاف في الأسفل "ما بعد الأساسيات" سيدخل في التفاصيل حول خيارات أخرى تستطيع اللجوء لها من أجل التحكم في الحقول الخاصة، لكن سنقوم الآن بفهم الواجهة الأصلية فحسب، لأنها ستكون موجودة دوما في كل المواقع. في شاشة التعديل على منشور ستجد صندوق "خصائص إضافية"، وستقوم أنت بتعديل الحقول المخصصة فيه. لا داعي لنمر على كامل معلومات تكوين الصندوق، ستقوم ببساطة باختيار الاسم (أو تضيف واحدا جديدا في حال لم تقم بالأمر من قبل). من ثم تقوم بإضافة القيمة، إضغط على الزر ولقد قمت بإضافة الحقل إلى منشورك، محفوظا مع بقية عناصرك. إظهار الحقول المخصصة في منشوراتكلتستخدم الحقول الخاصة في منشوراتك أمامك عدة دوال، وتسمياتهم تختلف حسب طريقة تكلم الناس عنهم، الدوال الأساسية هي كالتالي: ()the_meta: مثل كل دوال ووردبريس التي تبدأ بـ _the فدالة ()the_meta الهدف منها طبع المعلومات (echo) حتى لا تقوم بالأمر يدويا. تستطيع استخدامها عندما لا تريد أن تغير أيّ شيء بالمعلومات التي تريد طباعتها. لكنها تبدو لي غبر مفيدة لأنها لا تتيح لك أيّ تحكم بهيكلة المعلومات التي تحصل عليها، كما أنها تقوم بطبع كل المعلومات للصفحة.()get_post_meta: هي الدالة التي أستخدمها أنا طوال الوقت، المتغير الأول (parameter) الذي تحتاجه هو معرف (ID) المنشور، المتغير الثاني هو اسم الحقل الذي تريد جلبه، والثالث هو Boolean في حال كنت تريد القيمة على شكل string أو array مصفوفة (true من أجل string وfalse ل array).()get_post_custom: عمل بشكل شبيه جدا لـ ()get_post_meta لكنها تختلف في التسمية، الفرق أنك تقوم بتمرير ID المنشور له فحسب (بشكل اختياري أيضا) وسيقوم بإرجال كل القيم المخصصة للمنشور على شكل array.ما بعد الأساسيات: كيفية تحسين واجهة الحقول المخصصةأحد نقاط ضعف ووردبريس من ناحية الحقول المخصصة هو الصندوق الذي تستخدمه للتعديل عليها، فكما أسلفنا الذكر، الصندوق ليس مفيدا لتلك الدرجة، لذا أنت تملك الفرصة لتحسين التجربة لمستخدميك وزبائنك. الدوال التي تحتاجها للتعامل مع الحقول الخاصةحتى الآن، فقد تعلمنا كيف نسترجع الحقول الخاصة فحسب، مهمة أخرى ستقوم بها عند التطوير هي تعديل أو حذف المعلومات. من أجل هذه المهمة يقدم ووردبريس 3 دوال بسيطة للقيام بالأمر وهي: ()add_post_meta : هي الطريقة التي تستخدمها لإنشاء الحقل لأول مرة، تقوم بتمرير ID المنشور لها واسم الحقل المخصص (meta_key) والقيمة التي تريدها، وبشكل اختياري تستطيع تحديد أن يجعل ووردبريس تلك القيمة فريدة من نوعها. addpostmeta($postid, $metakey, $meta_value, $unique = false) ()update_post_meta : يمكن أيضا استخدام هذه الدالة لإنشاء حقل مخصص جديد، لذا هي تملك القدرة لتحل مكان ()add_post_meta في حال لم تكن واثقا أن الحقل جديد أو لا فتستطيع استعمالها، أول ثلاث خيارات هم نفس خيارات ()add_post_meta والخيار الأخير هو القيمة السابقة، وهو أمر لم استخدمه من قبل حقا ولكن قد يكون مفيدا في حال كنت تملك الكثير من القيم لاسم واحد (key). updatepostmeta($postid, $metakey, $metavalue, $prevvalue='') ()delete_post_meta : هي كما تتوقع تماما، وخياراتها مثل البقية تماما، عدى أن الخيار الأخير (قيمة الحقل) هي قيمة اختيارية تستطيع أن لا تحددها. deletepostmeta( $postid, $metakey, $meta_value = '' ) شرح كيفية استخدام هذه الدوال داخل لوحة التحكم هو خارج نطاق المقال، لكنك تستطيع استعمالها عبر إنشاء صندوق جديد، واستخدام الدوال اللازمة وحفظ المعلومات أثناء حفظ المنشور. استخدام إضافات مصممة لتحسين تجربة الحقول الخاصةهناك العديد من الإضافات الرائعة التي تقوم بتحسين واجهة الحقول الخاصة، أشهرها في نظري هي Pods و Advanced Custom Fields. تقوم هذه الإضافات باستخدام custom post type لإنشاء حقول جديد تعمل بمثابة حقل مخصص. أداة أبسط وأقوىالطريقة التي استخدمها عادة والتي تختلف عن البقية هي إضافة CMB2 فهي تتيح لك تحكم عبر الشفرة البرمجية (عكس الإضافات الأخرى التي تتطلب منك إنشاء الحقول عبر واجهة). استخدام هذه الطريقة للبناء بدل الطريقة التقليدية الذي يوفرها ووردبريس هو أمر مختلف تماما وتجربة رائعة. لن تحتاج لكتابة دوال كبيرة لبناء صناديق لحقول مخصصة ثم محاولة حفظها فهي تقوم بكل شيء بشكل أوتوماتيكي. كل ما عليك القيام به هو وضع الملفات في قالبك أو إضافتك أو تنصيب الإضافة والعمل مع دوالها من قالبك، لشرح أكبر لها اقرأ التوثيق المرفق لها. يجدر الذكر أنّ الإضافة مترجمة للعربية بنسبة 93% (بتاريخ هذا اليوم) ويعتبر هذا دعما ممتازا للعربية لذا الشكر لكل من ساهم في ترجمتها (تستطيع الانضمام لهم عبر موقع Transifex). قوة الحقول المخصصة في ووردبريسكما أسلفنا الذكر، الحقول المخصصة تعتبر جزءا مهما في تطوير استخدامك لووردبريس. استخدام الأمور المبنية في ووردبريس لنشر المحتوى أمر جيد، ولكن الحقول المخصصة هي ما تسمح لإضافات مثل WooCommerce و Easy Digital Downloads بإضافات مميزات قوية لووردبريس. ترجمة -وبتصرف- للمقال: Everything You Should Know about WordPress Custom Fields لصاحبه: DAVID HAYES.
  17. في الدرس السابق من هذه السلسلة، تعرفنا على بعض مميزات قالب s_ وإستعرضنا مجلدات القالب وبعض الملفات الأساسية، وفي هذا الدرس سنكمل الإطلاع على الملفات الأساسية وسنحاول شرح مهمة بعض الشيفرات والدوال البرمجية بالإضافة الى الإشارة الى بعض الممارسات الجيدة في تطوير قوالب ووردبريس والتي يمكن أن نتعلمها من قالب underscores. ملفات الوظائف والأحداث والمفلتراتنقصد بهذه الملفات ملف functions.php والملفات التي يتم تضمينها من خلاله، حيث تحتوي هذه الملفات في قالب underscores على بعض الشيفرات المهمة التي يتكرر استخدامها في كل قالب ووردبريس تقريبا (أحيانا مع تعديلات بسيطة عليها) وبالطبع يمكنك إضافة المزيد من الشيفرات أو التخلي عن بعضها على حسب القالب الذي تقوم بتطويره. ملف functions.phpالدالة hsb_setupكما تلاحظ فإن أول الدوال الموجودة في ملف functions.php دالة تأخذ الاسم اللطيف للقالب متبوعا بكلمة setup وبالمناسبة هذه من الممارسات المهمة جدا في تطوير قوالب وإضافات ووردبريس أي أن تقوم ببدء تسمية الدوال الخاصة بالقالب بكلمة مميزة (عادة الاسم اللطيف للقالب) حتى لا تختلط مع اسم أحد الدوال الموجودة في ووردبريس أو أي من الإضافات في الموقع. في حالتنا هنا سنستخدم hsb كاسم لطيف للقالب وهو اختصار لكلمة Hsoub بالتالي فإن اسم الدالة سيكون كالاتي function hsb_setup()قبل أن ندخل في شرح مهمة هذه الدالة قد تكون لاحظت السطر البرمجي السابق لها (تجاهل التعليقات البرمجية) والذي هو عبارة عن عبارة شرطية if statement تأخذ الصورة if ( ! function_exists( 'hsb_setup' ) ) : ويتم إنهاء هذه العبارة الشرطية بعد قوس إغلاق الدالة مباشرة، وهذه أيضا من الممارسات الجيدة حيث أنه بهذه الطريقة يتم التأكد أولا من وجود تعريف الدالة في مكان أخر وفي حالة وجودها يتم تجاهل هذا التعريف وهذا بالطبع يتيح لك إعادة تعريف الدالة من خلال القالب الأبن أو الإضافات وهذا يزيد من دعم القالب لخاصية القالب الإبن. الان لنعود لمهمة هذه الدالة ويمكن أن نقول أنها مسؤولة من ثلاثة أمور: تحميل دعم القالب للترجمة من خلال استخدام الدالة load_theme_textdomain.تسجيل قوائم القالب والتي ستظهر للمستخدم عند إنشائه قائمة جديدة في مكان مواضع القالب ويتم تسجيلها من خلال الدالة register_nav_menus، ويأتي قالب underscores مسجلا لقائمة واحدة فقط وهي القائمة الرئيسية، ويمكنك بالطبع إضافة المزيد على حسب عدد القوائم في قالبك.تعريف خصائص ووردبريس التي يدعمها القالب، أو ببساطة إضافة خصائص القالب من خلال الدالة add_theme_support ومنها على سبيل المثال الصورة البارزة وخصائص أخرى يمكنك الإطلاع عليها في صفحة توثيق الدالة.كما تلاحظ يتم إضافة هذه الدالة الى الحدث after_setup_theme وهو الحدث المناسب معها، وهذه ميزة أخرى يمنحك لها قالب underscores وهي التعرف على الأحداث المناسبة لمختلف الوظائف التي تحتاجها في القالب. الدالة hsb_widgets_initهذه الدالة مسؤولة عن تسجيل مواضع الودجات في القالب، فمثلا قد يحتوي القالب على موضوع واحد وهو موضع الشريط الجانبي الأيسر وقد يحتوي بالإضافة الى ذلك الى مواضع للودجات في الفوتر أو غيره مثلا، وكل هذه المواضع يتم تسجيلها داخل هذه الدالة من خلال الدالة register_sidebar، وبعد ذلك يتم إضافة هذه الدالة الى الحدث widgets_init. الدالة hsb_scriptsوتستخدم هذه الدالة لصف ملفات CSS وملفات الجافا اسكربت ويمكنك معرفة المزيد عن هذا الامر من خلال هذا المقال. كما تلاحظ في نهاية هذا الملف يتم تضمين خمسة ملفات تحتوي على بعض الوظائف ومقسمة على حسب مهامها وهي ما سنتطلع علي تفاصيله في الفقرات القادمة ملف custom-header.phpيوفر لك ميزة ووردبريس تمكين المستخدم من صورة ترويسة القالب من لوحة التحكم وتجدها تحت قائمة المظهر في حالة كان القالب يدعمها، وقالب s_ يأتي افتراضيا داعم لهذه الخاصية حيث يمكنك استدعاء صورة الترويسة التي اختارها المستخدم لعرضها في أي مكان في القالب من خلال هذه الشيفرة (الموجودة في التعليقات أعلى هذا الملف) <?php if ( get_header_image() ) : ?> <a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"> <img src="<?php header_image(); ?>" width="<?php echo esc_attr( get_custom_header()->width ); ?>" height="<?php echo esc_attr( get_custom_header()->height ); ?>" alt=""> </a> <?php endif; // End header image check. ?> ويحتوي هذا الملف على الدوال اللازمة لجعل القالب يدعم الترويسة وقد يفيدك الاطلاع على هذه الدوال وطريقة عملها لتطبيق هذه الميزة كما يمكنك تعديل بعض القيم الافتراضية في حالة أردت ذلك بالإضافة لإضافة التنسيق الخاص بصورة الترويسة وكذلك عنوان ووصف المدونة. ملف template-tags.phpوسوم القالب Template Tags أو يمكن تسميتها بدوال القالب هي مجموعة من الدوال يوفرها ووردبريس لمطوري القوالب ويتم إستخدامها عادة في ملفات القالب لعرض معلومات الموقع والمقالات مثل عنوان المقال و إسم المقال وكاتب المقال ورابط الموقع وغيرها من البيانات التي تحتاج عادة لعرضها في القالب وهذه الدوال تتيح لك عرض مثل البيانات فقط بكتابة إسم الدالة، فبدلا عن الإتصال بقاعدة البيانات وجلب البيانات التي تريدها فإن الدالة (وسم القالب) تقوم بهذه العمليات نيابة عنك وترجع لك المحتويات. هذا الملف يوفر لك مجموعة إضافية من دوال القالب التي تعرض بعض البيانات التي تحتاجها عادة في القالب، وبدلا من كتابة الشيفرة البرمجية لجلب هذه البيانات بداخل ملفات القالب يتم كتابتها في هذه الدوال وتستطيع مناداة هذه الدوال في ملفات القالب وبالتالي تحافظ على شيفرة برمجية نظيفة ومقروءة في ملفات القالب بالإضافة لإمكانية جلب البيانات في اكثر من ملف فقط بإستدعاء هذه الدالة. من الدوال الموجودة في هذا الملف الدالة the_posts_navigation وتستخدم لعرض صفحة المقالات السابقة وصفحة المقالات التالية في صفحة الأرشيف (صفحة عرض المقالات، وصفحة التصنيف وغيرها من الصفحات التي تعرض مجموعة من المقالات).الدالة the_post_navigation وتستخدم لعرض المقال السابق والتالي للمقال الحالي (في صفحة المقال الحالي).الدالة hsb_posted_on تستخدم لعرض تاريخ وكاتب المقال.الدالة the_archive_title تستخدم لعرض عنوان الأرشيف إعتمادا على نوعه فمثلا تعرض عنوان التصنيف بصورة مختلفة عن عنوان الوسم وغيرها من الأرشيفات.الدالة the_archive_description لعرض وصف الأرشيف.الدالة hsb_categorized_blog للتأكد من أن الموقع يحتوي على أكثر من تصنيف للمقالات حيث ترجع true في هذه الحالة.الدالة hsb_category_transient_flusher وتستخدم لمسح الtransient الخاص بالتصنيف والذي يستخدم عادة لزيادة سرعة الموقع.بالطبع يمكنك إضافة المزيد من الدوال في هذا الملف وتذكر أنه أنسب الأماكن لكتابة الدوال التي تحتاج لإستخدامها في ملفات القالب لعرض بيانات معينة، فمثلا يمكنك إنشاء دالة لعرض عدد مشاهدات المقال وسيكون هذا الملف هو الأنسب لكتابتها. ملف extras.phpهذا الملف مشابه للسابق ويختلف عنه أن الدوال في هذا الملف لا يتم إستخدامها عادة في ملفات القالب بل تقوم بعمل مهام لا تعتمد على ملفات القالب، وعموما يمكن أن نقول أن الدوال في هذا الملف هي عادة الدوال التي يتم إضافتها الى مفلترات Filters أو أحداث Actions معينة وليست الدوال التي يتم إستداعائها داخل القالب. من الدوال في هذا الملفK، الدالة hsb_body_classes والتي تستخدم للتعديل على المتغير الذي يحتوي على CSS Classes الخاص بوسم body للموقع من خلال مفلتره body_class، وهي في هنا تضيف الClass المسمى group-blog في حالة كانت المدونة تحتوي على أكثر من كاتب. الدالة hsb_wp_title والتي تقوم بالتعديل على إسم الموقع (الذي يظهر في وسم title بداخل وسم head في الموقع) من خلال فلتره wptitle ويتم التعديل على حسب الصفحة المعروضة (حيث يختلف عنوان الموقع في الصفحة الرئيسية من العنوان في صفحة عرض المقال). الدالة hsb_render_title وهي المسؤولة عن عرض عنوان الموقع داخل وسم head وذلك من خلال إضافتها للحدث wphead. وكما هو الحال بنسبة لملف template-tags.php يمكنك إضافة المزيد من الدوال لهذا الملف كما تريد. ملف jetpack.phpيستخدم هذا الملف لإضافة توافقية القالب مع إضافة Jetpack المشهورة وبالتحديد مع خاصية Infinite Scroll التي توفرها هذه الإضافة حيث وذلك من خلال دالتين الأولى وهي hsb_jetpack_setup تقوم بإخبار ووردبريس أن الموقع متوافق مع خاصية infinite-scroll بإستخدام الدالة add_theme_support، والدالة الثانية هي hsb_infinite_scroll_render وهي المسؤولة عن طريقة عرض المقالات التي سيتم تحميلها من خلال هذه الخاصية. ملف customizer.phpهذا الملف يستخدم لإضافة دعم القالب للمخصص Theme Customizer في تعديل إسم ووصف الموقع بحيث تظهر مباشرة في العرض الحي Live Preview بعد التعديل عندما يتم التعديل على المخصص وهذه هي الطريقة التي يعمل بها المخصص، وسنتناول طريقة عمل المخصص وكيفية جعل القالب داعم له وكيفية إضافة بعض الخيارات في المخصص في سلسلة مقالات اخرى إن شاء الله. خاتمة بهذا المقال نكون قد أكملنا الحديث عن ما يتعلق بالوظائف العامة Functions التي يوفرها القالب وطريقة ترتيبها وتوزيعها بين الملفات، وتبقى لنا الكلام عن ملفات القالب المسؤولة من عرض محتوى الموقع للمستخدم وطريقة تنسيقه وترتيبها وهو ما سنتكم عنه في المقال القادم إن شاء الله.
  18. بعد أن تطرّقنا إلى ما يجب عليك معرفته قبل أن تُقرّر بيع مساحات إعلانية إلى موقعك (سواء قررت بيع الإعلانات بنفسك أو الاستعانة بشبكة إعلانات) سنتطرّق في هذا المقال إلى الإضافات المُناسبة للقيام بذلك على مواقع ومُدوّنات ووردبريس. AdSanity إن كنت تبحث عن أداة مدمجة مع ووردبريس بشكل كلي لإدارة الإعلانات فقد تجد ضالتك في AdSanity. يتميز هذا الملحق بتوفيره لخاصية تدوير الإعلانات (Ad rotation) كما يساعد في إنشاء وإدارة الإعلانات التي تعرضها على موقعك. يعتبر AdSanity خيارا ممتازا إن كنت من محبي إدارة إعلاناتك بشكل ذاتي وتفضل عدم التعامل مع الشبكات الإعلانية. من بين أفضل الأمور فيما يخص هذا الملحق هو أنك لن تكون بحاجة للتعامل مع واجهة جديدة، يمكنك إدارة إعلاناتك بطريقة مشابهة لإدارة منشوراتك. يقدم الملحق ودجتين (widgets) لتسهيل المهمّة عليك، تعرض أولاهما إعلانا وحيدا أما الثانية فتعرض مجموعة من الإعلانات كما يمكن عرض الإعلانات بشكل دائم أو تحديد تاريخ انتهاء صلاحية العرض، يوفر الملحق أيضا إحصاءات سهلة الاستعمال، كما يُوفّر للمُطوّرين الذين يرغبون في التّحكم في الإعلانات بشكل أفضل مجموعة أحداث (actions) ومُرشّحات (filters). يبلغ ثمن الملحق بالنسبة للاستعمال على موقع واحد 29 دولارا، و 69 دولار للاستخدام على ثلاث مواقع في حين يبلغ ثمن النسخة الخاصة بالمطورين أو بالاستعمال اللامحدود 129 دولارا. WP125 يتميز هذا الملحق ببساطته وتوفيره لمجموعة من الخصائص المبهرة، يجعل WP125 من إضافة إعلانات 125×125 بيكسل لموقعك أمرا سهلا للغاية ومباشرًا، كما أن هذا الحجم يُعتبر في الكثير من الحالات أفضل من الإعلانات العريضة والتي تأخذ حيزا أكبر. رغم أنك ستعمل على بيع الإعلانات مباشرة عند استخدام هذا الملحق أي أنه يجب عليك أن تجد المعلنين بنفسك يبقى هذا الملحق خيارا جيدا إن أنت أردت تحكما أكبر في ما يحدث على موقعك. يضيف هذا الملحق المجاني قائمة Ads إلى واجهة التحكم الخاصة بووردبريس، لذا فإن إدارة إعلاناتك غاية في السهولة، تماما كإدارة منشوراتك. تتضمن الخاصيات الأخرى إمكانية العرض على عمود واحد أو عمودين، إعلانات لامحدودة، تتبع النّقرات، تواريخ انتهاء صلاحية العرض، صورة آلية تظهر لما لا يكون هناك أية إعلانات مُتوفّرة (auto-placeholder) والتنبيه باستعمال الرسائل الإلكترونية. Advertising Managerيوفر لك استخدام الملحق Advertising Manager إمكانية إدارة إعلاناتك وأتمتتها ، حيث يستعمل الشبكات الإعلانية المعروفة مثل Google Adsense ويسمح بإعداد الإعلانات المستهدفة بناء على كاتب المنشور، الوسوم (tag)، التصنيف والصفحة. يوفر Advertising Manager كذلك إحصائيات تساعدك في تقييم أفضل لأداء إعلاناتك. يحتوي الملحق على ودجت شريط جانبي، زر لدمج الإعلانات في التدوينات، إمكانية وضع الإعلانات في موقعك عن طريق PHP function وغير ذلك. WordPress Ad Widget إن كنت ترغب في طريقة مباشرة وبسيطة لإدخال الإعلانات في ودجات (widget) خاصة بها فعليك باستخدام ملحق WordPress Ad Widget. عوض إدخال صور الإعلانات في ودجات الصور على موقعك ما قد يسبب مشكلا في المحاذاة، يعمل هذا الملحق على إضافة ودجات جديدة معدة مسبقا حسب أحجام الإعلانات الأكثر استعمالا إلى لوحة التحكم الخاصة بك. كل ما عليك فعله هو إضافة الودجات في المكان الذي تريد أن يظهر الإعلان فيه دون الحاجة لضرورة التعامل يدويا مع مَوْضَعَة الإعلان. AdRotateيعتبر AdRotate من بين الخيارات التي توفر إمكانية إضافة الإعلانات بشكل مباشر وبسيط حيث يمكن استعمال ودجت (widget) أو كود مختصر (shortcode) من أجل إدخال الإعلانات بسهولة. من الأمور الرائعة بخصوص هذا الملحق أنه يمكنك إعداده لعرض الإعلانات بشكل مُدوّر (يعني إظهار إعلان ثم إظهار آخر) أوتوماتيكيا ما يوفر عليك عناء استبدال الإعلانات التي انتهت مدة صلاحية عرضها يدويا فهذا الملحق يقوم بذلك. يتميز AdRotate بكونه بسيطا وذي شعبية كبيرة فحتى وإن لم يكن يقدم الكثير من الخصائص فإنه بالتأكيد يبقى خيارا ممتازا لإدارة إعلاناتك بنفسك. Banner Manager Pro إن كنت ترغب في عرض إعلانات بانر (banner ads) فعليك بأخذ Banner Manager Pro في الحسبان، يسمح هذا الملحق ببيع وإدارة مساحات إعلانات بانر على موقعك من خلال لوحة تحكم ووردبريس، يمكنك استخدام هذا الملحق لبيع مساحاتك الإعلانية مباشرة وحتى بإدارة واستقبال حقوق الإعلانات مُباشرة عليه، حيث أنّه يدعم أكثر من طريقة متنوعة من بينها PayPal و Authorize.Net. تتضمن المميزات الأخرى لهذا الملحق طرقا متعددة للتضمين (embedding)، أحجام بانرات مرنة، تصميما متوافقا مع السيو (SEO)، خاصية المعاينة، تدوير البانرات، الموافقة على البانرات، إحصائيات، قابلية الترجمة وغير ذلك. يبلغ ثمن هذا الملحق 21 دولارا. WP Pro Advertising System من بين الملحقات المدفوعة التي يجب أخذها بعين الاعتبار نجد WP Pro Advertising System، حيث يسهل إدارة الإعلانات ومواضعها، الحملات الإعلانية والمعلنين المستقلين، يعمل هذا الملحق على جعل العملية أوتوماتكية إلى أقصى ما يمكن دون الحاجة إلى الارتباط بشبكة إعلانية ما. يتضمن الملحق دعم البانرات الإعلانية التقليدية فضلا عن الإعلانات المنبثقة (popups)، إعلانات الزوايا (corner peel) إضافة إلى إعلانات الخلفية (background ads) في الصفحات والمنشورات. يدعم الملحق الإحصائيات كذلك حيث يقدم أرقاما عن عدد النقرات (clicks)، مرات الظهور (impressions) ونسبة النقر إلى الظهور (Click-through rate)، يبلغ ثمن الملحق 29 دولارا. AdPress كل الإضافات التي ذكرناها إلى حد السّاعة تُغطّي جميع ما قد تحتاج إليه، لكن إن أردت خيارا آخر فعليك بإلقاء نظرة على AdPress. يسهل هذا الملحق المدفوع بيع، عرض وإدارة الإعلانات من خلال ووردبريس كما يتوفر على العديد من المميزات المهمة. يضيف هذا الملحق أنواع مختلفة من الإعلانات كالصور، إعلانات فلاش (Flash) والروابط، كما يوفر تصميما تفاعليا ومتجاوبا بشكل كامل إضافة إلى مصمم إعلانات (ad designer) يعطيك إمكانية معاينة الإعلانات قبل نشرها. يتضمن AdPress أيضا تدوير الإعلانات، الدعوات إلى الإجراء (CTAs)، دعم منصّات الدّفع الإلكتروني (payment gateway integration)، إحصائيات، الموافقة الأوتوماتيكية على الإعلانات أو التعديل، إدارة ولوج العميل، تنبيهات AdminBar، تواريخ الشراء وغير ذلك. يبلغ ثمن الملحق 40 دولارا. Simple Ads Manager لنتطرق لآخر ملحق في موضوع اليوم : Simple Ads Manager، فكما يدل اسمه، يتميز هذا الملحق بتوفيره لإمكانية إدارة إعلانات ووردبريس ببساطة. يمكنك أن تُحدّد أماكن الإعلانات، مجموعات الإعلانات إضافة إلى تدوير الإعلانات وتحديده، كما تستطيع أن تحدد إعلانا افتراضيا (default ad) لكل مساحة إعلانية كي يبقى عرض الإعلانات مستمرا في كل وقت سواء تعلق الأمر برابط affiliate أو بإعلان يمكنك طبعا الاختيار بينهما حسب رغبتك. تستطيع عرض الإعلانات في ودجات (widget)، كشيفرات مختصرة (shortcodes)، في ملفات القالب من خلال الدوال (functions) يمكن أيضا إعداد مجموعات إعلانات إن أردت ذلك. هنالك العديد من المميزات كأدوات التتبع، الإحصائيات، تتبع العائدات، خاصية Caching، توافق مع WPtouch، وغير ذلك. يمكنك الحصول على هذا الملحق مجانَا. خاتمة نتمنى أن تكون قد كوّنت الآن نظرة أفضل عن ما يتطلبه بيع الإعلانات على موقع ما، خصوصا على ووردبريس، فكما أسلفنا الذكر لا يمكن لأي كان القيام بذلك. إذا ارتأيت أن موقعك مناسب للإعلان وقررت استثمار بعض الوقت للقيام بذلك فيمكنك إتاحة مساحة إعلانية بكل بساطة وبالتالي توليد عائد مادي جيد. ماذا عنك؟ هل تقوم ببيع الإعلانات على موقعك؟ إن كان الأمر كذلك فما هي الأدوات التي تستخدمها لإدارة الإعلانات والتعامل مع المعلنين؟ هل أغفلت ذكر أداتك المفضلة؟ شاركنا رأيك في التعليقات أسفله. ترجمة وبتصرف للمقال: Best Practices For Selling Ads On Your Wordpress Site للكاتبة: Brenda Barron. حقوق الصورة البارزة: Designed by Freepik.
  19. تعرف على ملحقات ووردبريس التي تُسهّل إضافة تأكيد الاشتراك المزدوج (double opt-in) إلى النشرات الإخبارية. بعد أن تطرّقنا في المقال السّابق إلى أهمية تأكيد الاشتراك المُزدوج double opt-in سنتطرّق في هذا الدّرس إلى مجموعة إضافات تٌسهّل عليك استخدامه على نشرات ووردبريس الإخبارية. توجد العديد من الطرق لإضافة تأكيد اشتراك مزدوج إلى ووردبريس، إن كنت تستعمل ملحق نشرة إخبارية (newsletter plugin) فمن المُحتمل أنه يوفر لك هذه الخاصية، فيما يلي نظرة على بعض الملحقات لإضافة تأكيد الولوج المزدوج إلى خاصيات ووردبريس. E-newsletter يوفر ملحق e-newsletter المقدم من طرف WPMU DEV إمكانية إضافة خاصية تأكيد الاشتراك المزدوج فضلا عن رسالة ترحيب أوتوماتيكية وصفحات تسجيل وإلغاء تسجيل مخصصة. يسمح لك أيضا استعمال مخصص أنماط ووردبريس (WordPress theme customizer) لتصميم نشرتك الإخبارية مُباشرة ضمن ووردبريس باستعمال واحد من سبعة أنماط مدمجة كما يُوفّر خاصيّة المعاينة المباشرة. يمكنك توفير الوقت واستخدام نفس تصميمك السّابق من خلال نسخ رسائلك السابقة، فضلا عن إمكانية إضافة وإدارة الاشتراكات، إنشاء مجموعات، إرسال نشرات إخبارية، والحصول على إحصائيات حملاتك من خلال لوحة التحكم فقط ، يمكن تخصيص الرسائل من خلال إضافة ودجت أو شيفرة مختصرة (shortcode). يُكلّف هذا المُلحق 19 دولار شهريًا. Newsletter يعد هذا الملحق أشهر ملحق مجاني للنشرات الإخبارية على ووردبريس، يوفّر كلّا من تأكيد الاشتراك الأحادي والمزدوج، يتميز بكونه نظام نشرات إخبارية متكاملا بعدد لا محدود من المشتركين والرسائل، يمكن لك استعمال النموذج المدمج أو العمل على نموذجك الخاص وتضمينه في صفحة أو استعماله كودجت. يمكن للنشرات الإخبارية أن تكون نصا عاديًا أو شيفرة HTML، كما يُوفر المُلحق إحصائيات مفصّلة للنّشرات البريدية. Email Subscribers يوفر هذا الملحق المجاني كلا من تأكيد الاشتراك الأحادي والمزدوج، كما يسمح لك بإرسال ثلاث أنواع من الرّسائل لمشتركيك: إرسال تنبيه عند قيامك بنشر مُحتوى جديد.صياغة نشرات إخبارية على شكل HTML وإرسالها يدويا للمشتركين.القيام بإنشاء وإرسال رسالة إخبارية تتضمن أحدث منشوراتك بشكل أوتوماتيكي اعتمادًا على cron job.يمكنك إضافة نموذج الاشتراك إلى الشريط الجانبي باستعمال ودجت (widget)، في صفحة أو منشور باستعمال شيفرة مختصرة (shortcode) أو في ملفات القالب الخاص بك باستعمال PHP، يمكن إرسال رسائل كنص عادي أو كشيفرة HTML . Email newsletter يسمح لك هذا الملحق بإرسال رسائل بصيغة HTML للمشتركين، المعلقين والمستخدمين المسجلين، كما يوفر كلا من تأكيد الاشتراك الأحادي والمزدوج. يمكن له أيضًا أن يتكامل مع ReadyGraph (تبقى هذه الخاصية اختيارية يمكن تشغيلها كما يمكن إيقافها) للمساعدة في بناء حركة زوار وقاعدة مستعملي موقعك. من بين الأمور المثيرة للاهتمام فيما يخص هذا الملحق أنه سيقوم بإرسال رسائل أوتوماتيكية للمستخدمين بناء على درجة نشاطهم. يمكن لك القيام بإرسال رسائل ترحيب، ملخصات أسبوعية، تنبيهات بالتحاق الأصدقاء، إلخ. كل الخصائص قابلة للتّخصيص فضلا عن إمكانية تصدير قائمتك كملف CSV . Subscribe To Comments Reloaded لقد تم بناء هذا الملحق بالاعتماد على ملحق Subscribe to Comments، حيث يسمح للمستخدمين بالاشتراك في التعليقات من خلال نظام تأكيد مزدوج، يمكنهم القيام بالتسجيل وإلغائه بالنسبة لكل منشور بشكل منفصل، كما يتضمن واجهة تحكم بها مجموعة من الأدوات لإدارة الاشتراكات، النماذج والتنبيهات فضلا عن قدرتك على إنشاء صفحة إدارة خاصة بك باستعمال الرسائل والخصائص التي قمت بإعدادها. Subscribe to Double-Opt-In Comments تم بناء هذا الملحق أيضًا بناءً على ملحق Subscribe to Comments، يسمح للمستخدمين بالاشتراك في التعليقات من خلال نظام تأكيد مزدوج، يعمل هذا الملحق على تلقي القراء تنبيهات عند نشر تعليقات جديدة على المقالات التي سبق لهم الاشتراك فيها، كما يتضمن صفحة خيارات حيث يمكن لك صياغة مضمون الرسالة، بالمقابل، أنت لا تملك أي تحكم في الاشتراكات ولا أي خصائص إدارة، تكمن جمالية هذا الملحق في بساطته. Opt-In Panda for Wordpress يستعمل هذا الملحق طريقة تأكيد اشتراك مزدوج لا تتطلب صفحة تأكيد، تسمح لقرائك بالاشتراك لولوج صفحة محتواك المحمي حيث يتم توفير خاصية تأكيد الاشتراك المزدوج، بعد القيام بتأكيد عنوان البريد الإلكتروني (بغرض إتمام تأكيد الاشتراك المزدوج) يتم عرض المحتوى دون الحاجة إلى إعادة تحميل (refresh) الصفحة. يبلغ ثمن النسخة العادية Regular license) 22$) للاستعمال مع منتوج واحد لا يقوم مستخدموك بالدّفع مُقابله، يبلغ ثمن النسخة الخاصة 110$ (Extended license) للاستعمال مع منتوج واحد مع إمكانية أن يدفع مستخدموك مُقابله. نصائح إضافية فيما يخص تأكيد الاشتراك المزدوجفي حال ما إذا كنت تحتاج نصائح إضافية حول كيفية توفير وإعداد تأكيد اشتراك مزدوج إليك فيما يلي بعض الأفكار السريعة المهمة: اجعل نموذجك غاية في السهولة، لا تجعل مشتركيك يدخلون معلومات لا حاجة لك بها، ما تحتاجه فعلا هو حقلان وزر واحد:الاسمالبريد الإلكترونيالضغط للقيام بالاشتراكاحصل على أسمائهم الشّخصية حتى يتسنّى لتطبيق النشرات الإخبارية الخاص بك استعمالها لدى إرسال رسائل مخصصة لكل مشترك.قم بكتابة رسالة ترحيب جيدة تخبر فيها مشتركيك بتقديرك لتخصيصهم الوقت للاشتراك.قم بإهدائهم شيئا يحبونه، يعتبر تقديم بعض الهدايا المجانية ككتاب إلكتروني أو قائمة من النصائح للتحفيز على الاشتراك من بين الممارسات المنتشرة، بالنسبة للكتب الإلكترونية استعمل صيغة PDF نظرا لانتشارها وسهولة القيام بتصميم كتابك، يعتبر توفير الولوج المجاني لمقاطع فيديو مدفوعة أمرا رائجا أيضا، لا تهتم كثيرا بإخفاء الكتاب، من المحتمل أن يقوموا بإلغاء التسجيل بعد الحصول على الهدية المجانية لكن يبقى واردا أن لا يقوموا بذلك.لا تُلح على زوّارك كثيرا لكي يشتركوا، يكفي أن يعرفوا بوجود نشرة إخبارية، قد تسبب مضايقتهم بشكل مستمر بنفورهم خصوصا إن كانوا قد اشتركوا من قبل.اجعل نماذجك، صفحات الشكر، الرسائل وصفحة التأكيد واضحة وسهلة الفهم، تجنب استعمال لغة محيرة محافظا بذلك على البساطة والسلاسة قدر الإمكان. تواصل معهم في كل المراحل حتى لا يعتقدوا أن رسائلك أو نشرتك الإخبارية عبارة عن بريد مزعج ، كن حريصا على جعل خانة "المُرْسِل" من رسالتك تماما كما يتوقعه المشتركون. على سبيل المثال إن قاموا بالتسجيل في نشرة إخبارية حول أفضل وصفات الشواء لن يتوقعوا تلقي رسالة تأكيد من اسم شركة تبدو صناعية أو تجارية.ذكّرهم بأنهم قاموا بالاشتراك في نشرتك الإخبارية. في حين تعتبر مضايقة المشتركين أمرا سلبيا، يبقى تذكيرهم بأنهم اشتركوا في نشرتك أمرا مقبولا بل قد يكون مفيدا في أغلب الأحيان في عودة الزوار إلى موقعك.قم بتوفير طريقة سهلة للقيام بإلغاء الاشتراك، صدقا أعرف أنك تريد الحفاظ على كل المشتركين دون نقصان لكن الإبقاء عليهم دون رغبتهم من خلال تعسير عملية إلغاء الاشتراك أمر غير عادل ما يفرض ضرورة توفير طريقة إلغاء اشتراك سهلة وعملية، ما يحد خسارتك في فقدان مشترك دون تعدي ذلك لتكوين نظرة سلبية حول موقعك بسبب تعقيدك عملية إلغاء الاشتراك.خلاصةبالنظر إلى الفوائد الجمة لتأكيد الاشتراك المزدوج لا يوجد سبب مقنع لعدم استعماله، حيث يمكنك تجنب المخاطر المحتملة من استعمال التأكيد الأحادي فضلا عن بناء محتوى ذا جودة عالية وقائمة بريدية قَيِّمَة ما يستحق المخاطرة بإمكانية فقدان بعض المشتركين المحتملين الذين لا يريدون تكبد عناء إتمام خطوات التأكيد. ترجمة -وبتصرّف- للمقال: ADDING A DOUBLE OPT-IN TO WORDPRESS EMAILS NEWSLETTERS AND WHY IT’S BEST PRACTICE لصاحبه: BRENDA BARRON.
  20. سنناقش في هذا الدرس أهمّية تحديث كلّ شيءٍ متعلّق بموقع ووردبريس الخاصّ بك إلى آخر الإصدارات المتوفّرة وأهميّة التحديثات بشكلٍ عام، وهو من أهمّ الأمور التي يمكنك القيام بها لزيادة حماية وأمان موقعك. لماذا نقوم بالتحديث؟السؤال الحقيقي يجب أن يكون "ولما لا"؟ يقوم مطوروا ووردبريس بإرسال التحديثات إلى المستخدمين لسببٍ معيّن في النهاية، حيث أنّ هذه التحديثات تحتوي على إصلاحاتٍ لثغراتٍ خطيرة يمكن أن يستغلها المهاجمون لمهاجمة موقعك، مما يجعل التحديث ضرورة لا مفرّ منها. تحديثات سكربت ووردبريس مهمّة بنفس أهمّية تحديثات أنظمة التشغيل والتطبيقات الأخرى، يتم دومًا اكتشاف ثغراتٍ جديدة في البرمجيات كلّ فترة، ويتم مع ذلك إرسال ترقيعاتٍ جديدة لترقيع هذه الثغرات كلّ فترة إلى أجهزة المستخدمين، مما يجعل التطبيق أكثر أمنًا" - Ken Westin الخبير الأمن في Tripwire, Inc. أنواع التحديثاتقبل أن نتابع، من المهمّ أن نفهم أنواع التحديثات المختلفة المتوفّرة في سكربت ووردبريس. يشير Tony Perez في تدوينة حديثة إلى أنّه هناك 3 أنواع مختلفة من التحديثات: تحديثات الأمان، الترقيعات والإصدارات الرئيسية. تحديثات الأمان هي بالضبط كما تبدو عليه من اسمها. يتم إصدارها بسرعة وتحتوي فقط على بضع إصلاحاتٍ لثغراتٍ موجودة تم اكتشافها مؤخرًا. تكون هذه التحديثات عادةً على شاكلة أرقام الإصدارات مثل 4.2.1. تحديثات الترقيعات أكبر قليلًا، لا تحتوي هي الأخرى على مميزاتٍ جديدة، ولكنّها تقوم بتحديث النظام وعادةً ما تتضمن تحديثاتٍ أمنية كذلك، كما أنّه يتم إصدارها بصفة دورية ومن الممكن توقّع وقت صدور الترقيع الجديد. وأمّا عن التحديثات الرئيسية من الانتقال من الإصدار 3.9 إلى الإصدار 4.0 فهذا تحديثٌ جوهري، يحتوي مميزاتٍ جديدة وإصلاحاتٍ للمشاكل الأمنية المعروفة بالإضافة لأمورٍ أخرى، كما أنّه يتم التدوين عنها في مدونة ووردبريس وفي العديد من المواقع الإخبارية الأخرى، حيث أنّها تحديثات كبيرة ويجب على الجميع معرفتها. قد تقوم هذه التحديثات أحيانًا بتحطيم شكل موقعك بسبب عدم توافقية مع القالب الذي تستخدمه مثلًا، ولكن مع وجود نسخة احتياطية من موقعك، فيجب ألّا تكون مشكلةً بالنسبة لك. الفشل بالتحديث يعني مشكلة أعظم كما ذكرنا سابقًا، عدم قيامك / فشلك بتحديث أيّ إضافات أو قوالب ووردبريس مثبّتة على موقعك قد يعرّضك لخطرٍ كبير، وما قد لا تفهمه هو "لماذا"؟ بمجرّد أن يتوفّر ترقيعٌ معيّن كتحديث، يتزايد الخطر على المستخدمين الذين لم يقوموا بالتحديث بصورةٍ كبيرة، لأنّ المخترقين سيكونون قادرين على قراءة الشفرة المصدرية للترقيع ومعرفة الثغرة الحقيقية وبالتالي يمكنهم استغلالها ضدّ مواقع ووردبريس التي لم تقم بالتحديث والترقيع. هناك فترة زمنية قصيرة ما بين توفّر الترقيع كتحديث لووردبريس وما بين قيام المُخترقين بالبدء باستغلال هذه الثغرة على مواقع ووردبريس التي لم تقم بالترقيع، وهذا هو الوقت الذي يجب على المستخدمين الانتباه إليه، حيث أنّ مجرّد الانتظار إهمالًا يتركك عرضةً لهجماتٍ أكثر - Ken Westin. يمكن قول نفس الأمر بخصوص القوالب والإضافات، صحيحٌ أنّها ليست جزءً من لبّ نواة ووردبريس، ولكنّها أيضًا قد تحتوي على ثغرات تمكّن المخترقين من استغلالها لاختراق موقعك، وأيضًا يتم اكتشاف هذه الثغرات كلّ فترة وتصدر تحديثات لترقيعها كلّ فترة، وعليك تثبيتها بمجرّد توفّرها. بعض السمات والقوالب تكون مبرمجة بصورة سيئة ويكون بها العديد من الثغرات ويجب عليك الانتباه إلى ذلك، كما يجب عليك تثبيت واستخدام القوالب والإضافات التي تستعملها فقط وحذف كلّ شيء لا تستعمله. إدارة تحديثات ووردبريسأفضل طريقة للتأكّد من أنّ كلّ شيء على موقعك محدّث هو جعل عملية التحقق من وجود تحديثات متوفّرة هي مهمّة روتينية أخرى على جدولك (لو لم تكن تقنيًا، فيجب عليك البحث عن استضافة تقوم تلقائيًا بتحديث جميع القوالب والإضافات والنواة الخاصّة بووردبريس)، يجب عليك التحقق من توفّر التحديثات بنفسك كلّ يوم لتجنّب أي مشاكل أمنية قد تحصل. منذ الإصدار 3.7 من ووردبريس فإنّ المنصة تسمح بالتحديث التلقائي بسهولة، بمجرّد تفعيل هذا الخيار، فإنّه هذا يعني أنّ نواة موقعك ستقوم بالتحديث تلقائيًا عند توفّر تحديثات جديدة بدون أيّ تدخّل منك. طبعًا لا يمكن فعل نفس الشيء بالنسبة للقوالب والإضافات، حيث يجب عليك القيام بتحديثها يدويًا. الخاتمةتحديثات ووردبريس مهمّة للغاية، بل ومهمّة جدًا، ومن واجبك الاهتمام بتحديث كلّ شيءٍ موجود على موقعك إلى الإصدارات الأخيرة المتوفّرة، وإلّا فإنك تترك بابك مفتوحًا للمخترقين ليخترقوك، إنّها مسألة وقت. ترجمة -وبتصرف- للمقال: The WordPress Developer’s Guide to Security: Updates لصاحبه: Brenda Barron.
  21. تُعتبر لوحة تسجيل الدخول في ووردبريس من أقل المواضيع التي يتم التحدث فيها أو التلاعب بتصاميمها على عكس التصاميم الخاصة بالقوالب، ولكنه من الجيد لك أن تعرف كيف تُنشئ واحدة حتى يبدو موقعك أو موقع عميلك متميّزًا وله رونقه الخاص. تابع معنا هذا الدرس لتعرف كيفية إنشاء لوحة تسجيل دخول خاصة بدون استعمال الإضافات. لماذا يجب عليك تعلم ذلك؟كل المواقع التي تعمل على منصة ووردبريس تملك نفس تصميم لوحة الدخول وهو التصميم الرئيسي الخاص بالووردبريس، ولكن بعض العملاء يريدون أن يتميزوا بكل صغيرة وكبيرة في موقعهم ومن ضمنها لوحة الدخول. سأريك الآن كيف تقوم بذلك فالأمر سهل وغير معقد ويمكنك أن تكتب أكواد CSS وjQuery خاصة بك ولن تحتاج إلى أي إضافات. لم لا تستخدم إضافة جاهزة وحسب؟هناك إضافة جيدة اسمها "BM Custom Login" ولكن حدثت عليها الكثير من التعديلات والاختلافات منذ إصدارها الأول، وأصبحت أحس أن الإصدار الحالي ليس بتلك الجودة. وشيء آخر، وهو أنه يجب عليك أن تقلل من الإضافات في موقعك على قدر الإمكان إن أردت لموقعك أن يكون سريعًا. على كل حال وكما ذكرنا سابقًا فإننا لن نستخدم أي إضافات في هذا الدرس. هيكلة القالب الجميل في هذه الطريقة هو أنك تستطيع أن تحفظ كل الملفات المهمة داخل القالب نفسه على عكس الإضافات التي تُبقي ملفاتها بداخل مجلد الإضافة نفسه، وبذلك نُبقي كل شيء منظم ومن السهل الرجوع إليه في أي وقت. تحديث/تعديل ملف functions.phpfunction custom_login() { $files = '<link rel="stylesheet" href="'.get_bloginfo('template_directory').'/css/login.css" /> <script src="http://use.typekit.com/pgf3epu.js"></script> <script>try{Typekit.load();}catch(e){}</script> <script src="'.get_bloginfo('template_directory').'/js/jquery.min.js"></script> <script src="'.get_bloginfo('template_directory').'/js/login.js"></script>'; echo $files; } addaction('loginhead', 'custom_login');أول خطوة ستكون كتابة دالة داخل ملف functions.php وتخزين كل الملفات الضرورية داخل مُتغيّر ثمَّ عمل echo له. يمكننا مناداة الملفات الموجودة داخل القالب باستعمال ('get_bloginfo('template_directory وربط الملف مباشرة. لقد قمت أيضًا بإضافة ملف jQuery مُصغّر (minified) وtypekit أيضًا. function customloginurl() { echo bloginfo('url'); } addfilter('loginheaderurl', 'customloginurl'); function customlogintitle() { echo get_option('blogname'); } addfilter('loginheadertitle', 'customlogintitle');قمت أيضًا بإضافة دالّتين؛ واحدة لتغيير رابط الشّعار حتى يظهر الشّعار الخاص بالموقع بدلًا من شعار موقع Wordpress.org، والدالة الثانية استخدمتها لتغيير عنوان لوحة تسجيل الدخول. هذا كان ما يخص أكواد PHP فلن نحتاج إلى أي أكواد PHP إضافية بعد الآن. تغيير تنسيقات CSSهنا يبدأ التحدي. سوف تحتاج الآن إلى الإطلاع على عناصر DOM لمعرفة العناصر التي تستطيع تعديلها وسوف تحتاج أيضًا إلى إزاحة تنسيقات CSS الموجودة في الصفحة واستبدالها بتنسيقات أخرى، وحتى تفعل ذلك سوف تحتاج إلى استخدام Developer Tools كتلك الموجودة في متصفح Google Chrome أو يمكنك استخدام إضافة Firebug المشهورة. ما أحبّ إضافته في بداية الملف هو المحدد العام * لتحديد واستهداف كافة العناصر ومن ثم أضيف لها خاصية transition وخاصية webkit-font-smoothing: antialiasing- حتى نحصل على خط أفضل في متصفحات webkit. ما أفضله أيضًا هو التعديل على محدد الفئة الزائفة (pseudo-class) المسمى focus: للتخلص من الحدود الخارجية (outlines). * { -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -ms-transition: all 0.3s ease; transition: all 0.3s ease; -webkit-font-smoothing: antialiased; } :focus { outline: 0!important; }يمكننا باستعمال Developer Tools معرفة العناصر الموجودة ومعرفة تنسيقات CSS المستخدمة لنتمكن من تغييرها. فعلى سبيل المثال، يمكننا تغيير الشعار الموجود أعلى لوحة تسجيل الدخول إلى شعار الموقع نفسه: body.login h1 a { background: url('../images/logo.png') center center no-repeat transparent; background-size: 188px 189px; width: 188px; height: 189px; margin: 0 auto 30px; opacity: 0.7; padding: 0; } body.login h1 a:hover {opacity: 1;}كما ترى في الأعلى فقد قمت بتحديد العنصر body.login ثم h1 الموجود بداخله انتهاءً بالوسم a، وقمت بعد ذلك باستخدام الخاصية background لوضع صورة الشعار الموجودة في مجلد images واستعمال بعض تنسيقات CSS بسيطة. لاحظ أيضًا أنني استعملت خاصية background-size كما هو في Wordpress 3.4 وخاصية opacity لتقليل شفافية الشّعار وإعادته إلى شفافيته كاملة عند وضع مؤشر الفأرة فوقه (hover). نريد أيضًا إخفاء عنصر backtoblog# لأننا لن نحتاجه فالشّعار سوف يفي بالغرض ليأخدنا إلى الصفحة الرئيسية للمدونة. يمكنني استعمال الكثير من تنسيقات CSS لتغيير جميع العناصر حتى تتوافق مع التصميم، وإذا أردت استبدال تنسيقات مكان أخرى فسوف أستعمل ids الموجودة في الصفحة وimportant! إن اضطررت لذلك. form#loginform p.forgetmenot label { position: relative; background-image: url('../images/checkbox.png'); background-position: 0 0; background-repeat: no-repeat; padding: 2px 0 0 24px; height: 18px; display: inline-block; -webkit-transition: none; -moz-transition: none; -ms-transition: none; transition: none; } form#loginform p.forgetmenot label input[type="checkbox"] { position: absolute; left: 0; opacity: 0; width: 20px; height: 20px; display: block; cursor: pointer; }سنقوم الآن بتغيير التصميم الخاص بمربع الاختيار (checkbox) وذلك باستعمال background-image على الـتسمية (label) وإضافة بعض padding إلى اليسار وسوف نقوم بإخفاء مربع الاختيار نفسه. ولسوء الحظ، فإنه سيكون من الصعب تغيير الصورة عند النقر عليها وذلك لأن مربع الاختيار موجود داخل وسم <label>، وبالتالي سوف نضطر إلى استعمال jQuery. إضافة أكواد jQueryيمكننا استعمال jQuery لإضافة بعض التنسيقات أو attributes أو حتى تغيير أجزاء بعض العناصر، كما أنني أريد أن أضيف placeholders إلى حقول الإدخال وكذلك جعل مربع الاختيار يعمل مع بعض الصور الخاصة وكل ذلك سوف يتم داخل ملف login.js الموجود في مجلد "js" الخاص بالقالب. $('#loginform input[type="text"]').attr('placeholder', 'Username'); $('#loginform input[type="password"]').attr('placeholder', 'Password'); $('#loginform label[for="user_login"]').contents().filter(function() { return this.nodeType === 3; }).remove(); $('#loginform label[for="user_pass"]').contents().filter(function() { return this.nodeType === 3; }).remove();يمكننا باستعمال jQuery إضافة placeholder إلى حقول الإدخال، ولكن ذلك لن يكون سهلًا بسبب وجود الحقول داخل وسوم <label> مما سيجعل عملية إزالة النص الخاص بالـتسمية أمرًا ليس باليسير. سوف نقوم باستعمال ()contents. و ()filter. لإزالة النصوص الخاصة بالـتسمية ليبقى لدينا placeholders فقط. $('input[type="checkbox"]').click(function() { $(this+':checked').parent('label').css("background-position","0px -20px"); $(this).not(':checked').parent('label').css("background-position","0px 0px"); });وكما قلنا سابقًا، فوجود مربع الاختيار داخل وسم <label> سيجعل عملية تطويع مربع الاختيار ليعمل كما نريد أمرًا صعبًا. فالطريقة التي من المفترض أن يعمل بها هو أنّه عندما يتم الضغط على التسمية (label) فإنّ مربع الاختيار سوف يتم اختياره (يصبح checked) وبالتالي تتغير الصورة التي أضفناها لتدل على أنه تم النقر على المربع، ولذلك قمنا باستعمال jQuery لنتفقد فيما إذا كان مربع الاختيار في حالة checked أو لا، فإذا كان في حالة checked فإن المحدد checked: سوف يعمل على تغيير موضعة الصورة (باستعمال background-position) واذا لم يكن كذلك فسوف يعود كل شيء إلى طبيعته. خاتمة كما رأيت، فقد قمنا بإنشاء لوحة تسجيل دخول بكل سهولة وذلك فقط باستعمال Wordpress functions ،CSS وjQuery ومن دون الحاجة إلى أي إضافات. يمكنك الإطلاع على النتيجة النهائية من هنا. ترجمة -وبتصرف- للمقال: Create a Custom WordPress Login Without Plugins لصاحبه: Iggy.
  22. واحدة من أبرز قوى ووردبريس مكتباته التي تحتوي على المئات من دوال PHP، وهذه الدوال لديها وظائف متعددة من كتابة روابط التدوينات والمشاركات داخل الإضافة إلى استرجاع اسم مستخدم كاتب التدوينة والاستعلام عنه في قاعدة البيانات. فإذا لم تفهمهم، ستكون العناصر الأساسية للووردبريس مثل the_post غريبة بالنسبة لك، وسيكون الكود التي تكتبه مليئا بالأخطاء والغرابة. وفي نفس الوقت، عند محاولة استعمال المئات من الدوال ذات أسماء غير نظامية يمكن أن يسبب الإرباك لقارئها، لذا سأقوم اليوم بإعطائك مبدأين أساسيين لفهم دوال ووردبريس. هذه المبادئ المنطقية تطبق بشكل واسع (إذا لم يكن عالميا) على مكتبات الدوال، والتي سوف تعطيك نظرة خاطفة على وظيفة دالة ووردبريس معينة. 1. دوال _get تقوم بإرجاع أشياء و دوال _the تطبع أشياءهذا ملخص بسيط لآلية عمل هذين الدالتين: دوال _get تقوم بإرجاع قيمة، مما يسمح لك بالتعامل معها في تعليمات برمجية لاحقة. دوال _the تقوم بطباعة قيمة في صفحة HTML في المكان الذي تم استدعاؤها فيها.ولتوضيح ذلك، لنلق نظرة على الكود المصدري لدالتين، دالة ()the_ID و دالة ()get_the_ID: function get_the_ID() { post = getpost(); return !empty(post ) ? $post->ID : false; } function the_ID() { echo get_the_ID(); }باختصار، إن دالة ()get_the_ID تقوم بإرجاع مُعرف الرقمي للتدوينة، وأما return فهي تعني: قُم بإعطاء القيمة لمن طلبها”، وعندما تحصل على هذه القيمة، يمكنك القيام بأي شيئ بها، مثلا تقوم بضربها في 3، قسمتها على 2، وغيرها حسب البرنامج، (بالمناسبة إذا كنت تتساءل على بقية الشِفرة البرمجية فإن معناها قُم بإرجاع المُعرف، أو قُم بإرجاع false إذا لم تجد التدوينة التي يجب أن تحصل على مُعرفها). لنفترض أنك ترد تعديل صفحة php، لنأخذ ملف index.php للقالب على سبيل المثال، وتريد أن تقوم بطباعة عنوان التدوينة في الصفحة، هذه بعض الخيارات لتفعل ذلك: <h1><?php get_the_title(); ?></h1> <!-- لن يتم طباعة أي شيئ --> <h1><?php the_title(); ?></h1> <!-- طباعة عنوان التدوينة داخل عنصر h1 --> <h1><?php echo get_the_title(); ?></h1> <!-- طباعة عنوان التدوينة داخل عنصر h1 --> <h1><?php echo 'My title: ' . get_the_title(); ?></h1> <!-- طباعة ": My title" وعنوان التدوينة داخل عنصر h1 -->سيكون مفيدا أن تعرف هذه العلاقة التي تُعقد عبر مكتبة دالة ووردبريس مع استثناء أن ()the_post تقوم بشيء مهم لكنها لا تطبع أي شيئ. 2. داخل أو خارج الحلقة التكراريةالحلقة التكرارية هي النواة التقنية الأساسية لووردبريس، بعض الدوال يجب أن يتم استدعاؤها داخل الحلقة التكرارية، وبعضها لا يجب ذلك، فمثلا هذا المثال يوضح لك ما معناه "دالة داخل الحلقة": //خارج الحلقة التكرارية if ( have_posts() ) : while ( have_posts() ) : the_post(); // داخل الحلقة التكرارية، محتويات التدوينة تكون هنا endwhile; endif; // خارج الحلقة التكرارية مرة أخرىللتمييز بين “دالة داخل الحلقة” و “دالة خارج الحلقة”، سنقوم باستخدام التشبيه لتفسير مكان الحلقة داخل الووردبريس: لنتخذ ووردبريس كمصنع سيارات! ووردبريس هو مصنع السيارات. المشاركات والتدوينات هي السيارات. الحلقة التكرارية هي خط التجميع في المصنع.دعونا نشرح العلاقة بين هذه المصطلحات بمزيد من التفاصيل: خط التجميع تدخل داخله أجزاء السيارات خامة لتخرج سيارة كاملة. بنفس الطريقة، الحلقات التكرارية هي مواد المشاركات الخامة (محتوى المشاركة والبيانات التعريفية) تدخل لتخرج صفحة HTML جاهزة.والآن دعونا نشرح الجزء المهم: كل عملية تقوم بتغيير أو تقوم باسترداد معلومات حول السيارات يجب أن تكون في خط التجميع، ويجب أن يتم الإعلان عن أية سيارة ستعمل بطريقة أخرى، فالعمليات التي لا تعمل على السيارات يجب أن لا تكون في خط التجميع. وبالمثل، كل دالة تقوم باسترداد أو تغيير أو عرض لخصائص التدوينة أو المشاركة يجب أن تكون إما داخل الحلقة التكرارية أو يجب أن يتم إعطاء معرف التدوينة أو المشاركة للتعامل معها كمعامل (paramter) للدالة. الدوال التي لن تعمل عن التدوينات/المشاركات لا يجب أن تكون داخل الحلقة التكرارية. عمليا هذا يعني: إن دوال _the وأغلب دوال _get_the تفترض معرفة التدوينة/المشاركة الحالية لذا سيعملون فقط داخل الحلقة التكرارية. أما في خارج الحلقة التكرارية، يجب إخبار دوال _get_the على أية تدوينة ستعمل، أي يجب تمرير معرفة التدوينة. الدوال التي لا تستخدم لاسترداد أو تغيير أو عرض لخصائص التدوينة/المشاركة يجب أن لا يتم استدعاؤها في الحلقة التكرارية.على خط التجميع: دالة _the_title التي تعمل فقط في الحلقات التكرارية. بالنسبة لآلة الطلاء فإنه يجب على الآلة أن تعرف الكثير من المعلومات حول السيارات قبل البدء بطلائه، ولهذا السبب ستجد هذه الآلة في خط التجميع تحصل على معلومات السيارة الحالية بهذه الطريقة و سوف تكون في المكان الصحيح لطلاء السيارة في الوقت المناسب في المصنع. آلة الطلاء في هذه الحالة هي دالة _the_title، فهي تعمل فقط داخل الحلقة التكرارية، وهي تقوم بطلاء الموقع الذي صممه المصنع لعمل عنوان التدوينة الحالية. لتكون قادرا على الإشارة إلى عنوان تدوينة في موقع ربما يمتلك أكثر من 1000 تدوينة ومشاركة يجب أن نعلم أية تدوينة نريدها بالضبط، والدالة التي تقوم ببساطة بطباعة عنوان التدوينة (بدون خيارات أخرى) لن تؤثر كثيرا خارج سياق الصفحة التي صممت من تلك التدوينة. لذلك فالطريقة الوحيدة لتعمل دالة ()the_title هو وضعها داخل الحلقة التكرارية، مثل الآلة الطلاء التي لا يجب أن تكون في بهو المصنع. داخل أو خارج خط التجميع: ()get_the_title، دالة داخل أو خارج الحلقة التكرارية. دعونا نفترض أنك تريد معرفة لون طلاء لسيارة، وهذا الأمر سيكون ذا أهمية داخل خط التجميع، وفي هذه الحالة سوف تقوم ببناء آلة تقوم بإعطائك لون السيارة التي تمر من أمامها. لكن قد ترغب أيضا بإرسال فريق مراقبة الجودة إلى منطقة الشحن للحصول على لون سيارة معينة، لذلك سوف يحتاج الفريق إلى معرفة أية سيارة سيقومون بتفقدها، وإلا لن يستطيعوا إخبارك بأي شيئ. بكلمات أخرى، يمكنك فعل هذا داخل أو خارج خط التجميع، لكن إذا كنت في الخارج، يجب عليك أن تقوم بخطوة إضافية لتحديد أية سيارة أنت مهتم بها. فمثلا دالة ()get_the_title التي تعمل داخل الحلقة التكرارية بدون إدخال معطيات، أو خارج الحلقة مع إدخال مُعرف التدوينة، كما يلي: get_the_title(); // يتم استدعاؤها داخل الحلقة التكرارية، تقوم بإعطائك عنوان التدوينة الحالية. // استدعاؤها خارج الحلقة لن يفيد. get_the_title(‘121’); // داخل أو خارج الحلقة التكرارية، تقوم بإعطائك عنوان التدوينة مع المُعرف 121.خارج خط التجميع: ()wp_enqueue_script، دالة خارج الحلقة التكرارية. حتى الآن تحدثنا كثيرا حول خط التجميع في المصنع، ومع ذلك، قد يحتوي المصنع أيضا على مستودع ومكتب الاستقبال وقسم الشحن والمكاتب الإدارية وغيرها. ولا أي إدارة من هذه الإدارات تحتاج إلى معرفة أية سيارة يتم العمل عليه الآن، وأنت بالتأكيد لا تريد وضع المكاتب الإدارية مع خط التجميع. وهذا هو نفس الحال مع دالة ()wp_enqueue_script التي لا تفيد داخل الحلقة التكرارية، فهذه الدالة تستعمل لمعرفة أن صفحة ما تم صنعها بواسطة مصدر خاص للووردبريس أو لا. ملفات جافاسكريبت ليست جزءً من التدوينة تم صنعه بواسطة الحلقة التكرارية، فهو لا يتفاعل مع التدوينات بنفس الطريقة التي لا يتفاعل فيها مكتب الحسابات مع السيارات، فعندما توجد شحنة سيارات جاهزة، سوف يتأكد هذا القسم من أن الشحنة لديها فاتورة ملتصقة بها، لكنه بالتأكيد لا يعقل أن يتم إلصاق الفاتورة على أرض المصنع. لذلك لا تقم باستخدام دالة ()wp_enqueue_script في الحلقة التكرارية، وسيكون أفضل لو وضعتها في ملف functions.php للقالب أو للإضافة. قم بالبرمجةحسنا حاولت تسهيل هذا الأمر عن طريق استعمال جميع معرفتي عن مصانع السيارات، و من الأرجح أنني قمت بتوسيع منطقة التشبيهات داخل دماغي، لكن أرجو أنني علمتكم بعض المفاتيح الرئيسية التي سوف تمكنك من الدخول إلى عالم دوال ووردبريس وأنت مطمئن، وإذا كان لديك أي سؤال أو تعليق، فيسرنا أن نسمعه في التعليقات في الأسفل، وإذا أعجبك هذا المقال، أرجو أن تقوم بمشاركتها مع أصدقاءك. ترجمة -وبتصرف- للمقال: Two Key Principles for Understanding WordPress Functions لصاحبه Fred Meyer. حقوق الصورة البارزة: Business vector designed by Freepik.
  23. كل يوم ينمو ووردبريس ويتطور أكثر فأكثر وفي جميع الدول العالم الناطقة باللغة الإنجليزية وغيرها، وأغلب البرمجة في ووردبريس تتم باللغة الإنجليزية بالإضافة إلى أغلب الإضافات والقوالب تكتب بسلاسل نصية باللغة الإنجليزية على الرغم من أن أكثر من نصف مستخدميه لغتهم الأصلية ليست الإنجليزية. هذا المقال، تعزيز للمقال الموجود مسبقا على أكاديمية حسوب، حول دليل المطور لتهيئة إضافات ووردبريس للترجمة. وهذا هو السبب الذي جعلنا نشهد على المدى العقد الماضي المزيد من المناقشات لدعم التدويل التي ستجعل ووردبريس يدعم جميع اللغات الأخرى، وهذا سيكون ضروريا لو كنت تعمل على إضافات أو قوالب عالمية الانتشار. يجب علينا القيام بثلاثة خطوات حتى نتمكن من ترجمة السلاسل النصية لعناصر الواجهة: اختر، صرّح، و استخدم "مجال النص".استخدم وظائف مناسبة لسلاسلك النصية ومجال النص المختار.سيسمح لك هذا بإنشاء ملفات الترجمة.بفضل ملفات الترجمة هذه، ستسمح للناس بترجمة قوالبك و إضافاتك. ما هو "مجال النص" ؟مجال النص هو "ترجمة مساحة الأسماء" (translation namespace) لإضافاتك أو ثيماتك وهي طريقة لوردبريس لفصل قائمة من "السلاسل النصية لترجمتها" من بقية السلاسل النصية. وتكمن أهمية مجال النص في أن بعض السلاسل النصية قد تعني معاني كثيرة في الإضافات والقوالب، فمثلا كلمة "!Let’s go" قد تعني "Create a membership account" في سياق وقد تعني "Start the survey" في سياق آخر. لذلك بعد تعريف مجال النص، واستخدامه مع "gettext" أو مع دوال الترجمة التي سوف نقوم بشرحها فيما بعد. (إن مشروع gettext جزء أساسي من طريقة عمل نظام الترجمة في الووردبريس) إذا أردت أن تضع مجال النص في إضافتك أو في قالبك في الجزء العلوي للتعليقات الموجود في ملف style.css للقوالب أو في ملف PHP الرئيسي لإضافتك. فسيكون مشابهًا لهذا بالنسبة للقوالب: <?php /* Plugin Name: Pretend Plugin [Other comment-block information goes here] Text Domain: wpshout */أما للقوالب فسيكون مشابهًا لهذا: /* Theme Name: Pretend Theme [Other comment-block information goes here] Text Domain: wpshout */دوال Gettext: أبقِ ()__ و ()e_ و ()x_ و ()n_ صحيحةلجعل النصوص الخاصة بك قابلة للترجمة، تحتاج إلى تمرير دالة سوف تقوم باستبدال "!Let’s go" مع ترجمتها باللغة الإسبانية أو العربية أو الفرنسية أو غيرها، ولتسهيل هذا الأمر، يقوم ووردبريس بإعطاء أسماء قصيرة جدا للدوال التي تقوم بهذه الوظيفة. الدالة ()__أعتقد أن هذه الدالة هي الدالة الأهم، فلقد حصلت على أكثر اسم مبهم وغريب. لكن هدفها الرئيسي هو السماح لجميع السلاسل النصية بأن تترجم إلى لغة أخرى إذا كان يجب ذلك. وتُستخدم هذه الدالة مع معاملين الأول للسلسلة النصية والثاني لمجال النص، على سبيل المثال: echo __( 'WPShout is a great WordPress site!', 'wpshout' );الطباعة الذاتية بواسطة () e_الدالة الأولى ستقوم بإرجاع نص فقط ويجب عليك طباعة (عرض) النص بنفسك، فإذا كان هذا يزعجك فيمكنك استخدام ()e_ فهي مثل ()__ echo . ستقوم هذه الدالة باختصار كتابة بعض الأحرف، لكنها لن تقوم بأي شيئ آخر، وهذا مثال تطبيقي على استخدام هذه الدالة: _e( 'WPShout is a great WordPress site!', 'wpshout' );والآن سنبدأ بالتعامل مع الجوانب الدقيقة للترجمة. توفير نص للشرح بواسطة ()x_في بعض الأحيان كلمة أو جملة تكون مبهمة وصعبة الترجمة فقد تعني العديد من المعاني، فمثلا كلمة "post" قد تعني اسما مثل "مشاركة" أو "تدوينة" وقد تعني فعلا مثل "نشر" (to post - to publish). على عكس الدالتين السابقتين، يمكنك بواسطة ()x_ وضع نص لشرح الكلمة أو الجملة مثل المثال التالي: _x( 'Post', 'verb, as in "to publish"', 'wpshout' );النص الأوسط لن يظهر للمستخدم، لكنه سيظهر للمترجم حتى يفهم النص. (يذكر أنه توجد دالة ()ex_ و التي تجمع ما بين e_ و x_). الجمع بواسطة ()n_من المشاكل التي قد تواجهها في الترجمة هو الجمع. ففي اللغة الإنجليزية، "I have 1 Comment" (أنا أملك 1 تعليق) أو "I have 3 Comments" (أنا أملك 3 تعليقات)، لأجل معالجة مشكلة جمع كلمة تعليق، ووردبريس يوفر لك دالة ()n_ التي ستقوم بمعالجة الفرق بين الإثنين. في العادة، عندما تستخدم دالة ()n_ سوف تحتاج إلى استدعاء دالة الكتابة ()printf. (أو sprintf التي تقوم بإرجاع سلسلة نصية على عكس printf التي تقوم بطباعة النص). وهذه الدوال ستقوم باستبدال قيمة في سلسلة نصية مع قيمة تم تمريرها لهم. لتفهم أكثر أنظر للكود أدناه: printf( _n( 'One comment', '%s comments', $comments, 'wpshout' ), $comments );ستلاحظ أننا استخدمنا قيمة عددية مسندة إلى متغير comments$ مرتين. نفترض أن comments$ تمتلك قيمة "3". في المرة الأولى استخدمنا comments$ مع n__ لتحديد هل سنستخدم الجمع أو لا، وبما أن 3 أكبر من 1 سوف يختار " s% comments" بدلا من "One comment". أما في المرة الثانية فاستخدمناها مع printf لوضع الرقم في السلسلة النصية، عن طريق استبدال s% بـ 3 والتي هي قيمة المتغير comments$، لتكون الجملة الكاملة المطبوعة هي "3 comments". دوال Gettext أخرىسوف نقوم بشرح جميع الدوال المهمة والأساسية، وهذا لا يعني أنه لا توجد دوال أخرى جديرة بالاهتمام: ()__esc_attr: هذه الدالة تقوم بنفس وظيفة ()__ لكنها سوف تراعي ()esc_attr (سمة الخروج للـ HTML) لدواعي السلامة. (يوجد أيضا دالة ()esc_attr_e و دالة ()esc_attr_x).()__esc_html: نفس الشيء مع هذه الدالة، ففي سبيل السلامة يمكنك الجمع بين سمة الخروج للـ HTML وبين ترجمتك. (و بالطبع توجد دالة ()esc_html_e و دالة ()esc_html_x). ()n_noop_ : هذه الدالة تقوم بنفس وظيفة دالة ()n_ لكن بدون عمليات.تسليم الترجمة إلى جافا سكريبت عن طريق دالة ()wp_localize_scriptبسبب أن الترجمات في الووردبريس يتم التعامل معها عن طريق PHP، سوف تحتاج إلى تمرير السلاسل النصية لاستخدمها مع الجافا سكريبت، ويمكنك فعل هذا عن طريق دالة ()wp_localize_script. هذه الدالة مفيدة للغاية وتستخدم كثيرا خارج الترجمة، لأنها تمكنك من تمرير أية قيمة أو متغير من PHP إلى جافا سكريبت. لكن الاستخدام الأساسي لها للترجمة ولذلك سميت باسمها. وهذا هو مثال لطريقة استخدام هذه الدالة: wp_localize_script( 'wpshout-js', 'strings', array( 'hello' => __( 'Hello!', 'wpshout' ); ) );وللوصول إلى هذه القيم عن طريق ووردبريس، فستقوم بشيء مثل: alert(strings.hello);تمتلك دالة ()wp_localize_script ثلاثة معاملات: المعرّف (handle) الذي استخدمناه في ()wp_enqueue_script (أو ()wp_register_script) للجافا سكريبت التي نقوم بترجمتها.اسم كائن جافا سكريبت الذي نريد أن ترتبط به ترجمتنا.مصفوفة (array) مترابطة للترجمات، مع مؤشر index أو اسم خاص كمفتاح و قيمة كسلسلة نصية ابتدائية لاستخدمها.يتم التعامل مع الترجمة نفسها عن طريق نفس دوال PHP التي شرحناها في الجزء السابق من الدرس. ما هي ملفات POT ،PO و MO ؟حتى الأن كنا نتحدث عن البرمجة باستخدام PHP، لكن هنالك جزء ثاني لا يعتمد على الـ PHP، وهذا الجزء هو الذي يقوم بإنشاء ملفات الترجمة. يعتبر هذا الجزء صعبا بالنسبة لي، فببطء يقوم نظام ووردبريس ببناء حلول أكثر قوة و أكثر إفادة للتعامل مع العمل الحالي للترجمة (أنظر إلى GlotPress ،translate.wordpress.org و the Polyglot Make blog) لكن يبقى هذا الجزء صعبا للمستخدم ذا الخبرة المتوسطة، على الرغم من أننا سنقوم بشرح أساسياته لكننا لن نخوض في التفاصيل، بالنسبة لي اعتدت على استخدام Poedit كمحرر للترجمة. مهما كانت الطريقة الذي اعتدت بها أن تقوم بإنشاء وتعديل و قراءة ملفات الترجمة، يوجد ثلاثة أنواع أساسية من ملفات الترجمة: ملفات pot.: الملفات الرئيسية للإضافات والقوالب، والتي قامت بجمع جميع السلاسل النصية من الدوال ()s__ وغيرها.ملفات po.: هذه الملفات عبارة عن نص ترجمة السلاسل النصية الإنجليزية إلى اللغة المستهدفة، نادرا ما سوف تقوم بتعديل واحدة مباشرة (لأن الصيغة بها الكثير من الكلمات والرموز المبهمة والغريبة) لكن يمكنك فتحها باستخدام محرر نصوص والقيام بتعديلات سريعة للترجمة.ملفات mo.: الترجمة النهائية من اللغة الإنجليزية إلى اللغة المستهدفة، وهذه الملفات عبارة عن ملفات ثنائية (binary files) تستخدم وتقرأ عن طريق ووردبريس، لذلك عندما تقوم بفتحها مع محرر النصوص لن تستطيع معالجتها، لذا إذا أردت القيام بذلك يجب عليك العودة إلى ملفات PO و التعديل عليها و إعادة إنشاء ملفات MO.كما أخبرتك سابقا، هذا هو الجزء الأصعب بالنسبة لي، لكن إذا كان إضافتك أو قالبك في مستودعات WordPress.org، سوف تجد ملفات pot. جاهزة بالنسبة لك وسيفهم مترجميك كيف يهتمون بالباقي. إذا أردت المزيد من التفاصيل أو الأدوات، قم بزيارة صفحة Translating WordPress. ماذا تعلمنا حول تدويل كود ووردبريسلقد قمنا في هذا الدرس بتغطية الأجزاء الثلاثة الرئيسية لجعل كود ووردبريس الخاص بك جاهزا للترجمة: اختر مجال النص، استخدم دوال gettext ومن ثم أحصل على ملف POT لصنع ملفات الترجمة PO و MO. الخطوات سهلة و قابلة للتنفيذ، ولها تأثير كبير للناطقين بغير اللغة الإنجليزية، أو أولئك الذين يحسون براحة أكبر عند استخدامهم لغة أخرى تعلموها مؤخرا. ترجمة -وبتصرف- للمقال Making plugins and themes translation ready لصاحبه: David Hayes.
  24. توجد الكثير من المقالات التّتي تتحدّث عن ترجمة إضافات Plugins ووردبريس، إلّا أنّ القليل منها يتطرّق لتفاصيل عمليّة التّرجمة عندما تكون مهمَّة يوميّة. مالّذي يحدُث عند تغيير جزء من الشّفرة البرمجيّة Code؟ مالّذي يحدُث عند إضافة سلاسل محارف Strings جديدة؟ مالّذي يحدُث عند تحديث إضافة إلى إصدار جديد؟ هذه هي نوعيّة الأسئلة الّتي سيُجيب عليها هذا المقال. سنتطرَّق، خطوة بخطوة، كيف نعمل من أجل أن تكون الإضافات الجديدة أو المُحدَّثة جاهزةً للتّرجمة إلى أيّ لغة. يتوفّر ووردبريس بلغات عدّة: تُضَمَّن في نظام ووردبريس لإدارة المحتوى قابليّةُ الاستخدام بأيّ لغة، على الرّغم من أنّ لغة الواجهة الافتراضيّة هي الإنجليزية الأميركية (التّرميز en_US). إنشاء إضافةأوّل ما يجب تنفيذه هو إنشاء إضافة. سننشئ إضافةً للتّطبيق عليها. يُمكنك متابعة درس مُقدّمة إلى برمجة إضافات Wordpress للمزيد حول برمجة إضافات ووردبريس. ستعمل الإضافة على كتابة نصّ تحفيزي في التّرويسة Header. أولًا أنشئ مجلَّدًا جديدًا ضمن مجلَّد الإضافات وسمِّه wp-admin-motivation. ثمّ أنشئ ملفًّا ضمن هذا المجلّد وسمِّه wp-admin-motivation.php. في ما يلي الشّفرة الّتي يجب وضعها في الملفّ: <?php /* Plugin Name: Admin Motivation Plugin URI: http://danielpataki.com Description: Shows motivational messages in the admoin bar Author: Daniel Pataki Version: 1.0 Author URI: http://danielpataki.com Text Domain: wp-admin-motivation */ function get_motivation_text() { $motivation = array( 'You are awesome', 'This website is boss', 'You look great today', 'Your earlobes are well rounded, good job!' ); shuffle( $motivation ); return $motivation[0]; } add_action( 'admin_notices', 'show_motivation_text' ); function show_motivation_text() { $text = get_motivation_text(); echo "<p id='wp-admin-motivation'>$text</p>"; } add_action( 'admin_enqueue_scripts', 'motivation_assets' ); function motivation_assets($hook) { wp_enqueue_style( 'motivation-styles', plugin_dir_url( __FILE__ ) . 'styles.css' ); }تخلِط الدّالّة الأولى ()get_motivation_text مصفوفة Array من العبارات التّحفيزيّة باستخدام دالّة shuffle الموجودة في PHP، ثمّ بعد الخلط تختار العبارة الأولى من المصفوفة. يُمكن عدّ دالّة ()get_motivation_text وسيلةً لتوزيع العبارات التّحفيزيّة عشوائيًّا. نربُط في الخطوة التّاليّة بين دالّة ()show_motivation_text والخطّاف Hook المسمَّى admin_notices. تحصُل دالّة ()show_motivation_text على عبارة تحفيزيّة عشوائيّة عن طريق ()get_motivation_text ثمّ تطبع العبارة داخل فقرة ذات معرّف wp-admin-motivation. تكون العبارة التّحفيزيّة، بالوصول إلى هذه النّقطة، مرئيّة؛ ولكنّنا سنغيّر موضعها لتكون إلى جانب تبويب خيّارات/مساعدة (Options/help). نستخدم CSS لهذا الغرض. تكتفي بعض الإضافات بوضع بضعة أسطر CSS في التّرويسة، إلّا أنّ الطّريقة الصّحيحة للتّعامل مع CSS هيّ إدراج الأسطُر ضمن الطّابور Queue؛ وذلك عن طريق ربط دالّة ()motivation_assets بالخطّاف admin_enqueue_scripts وإدراج CSS في الطّابور هناك. يحدّد النّمط مواضع النّصّ مع أخذ اتّجاه الكتابة من اليمين إلى اليسار Right-to-left, RTL في الحسبان. #wp-admin-motivation { float: right; padding-right: 15px; padding-top: 7px; margin: 0; font-size: 11px; } .rtl #wp-admin-motivation { float: left; padding-left: 15px; }الإضافة جاهزة الآن للعمل. المشكل الوحيد هو أنّ العبارات التّحفيزيّة تستخدم الإنجليزيّة فقط. إن أردت استخدام لغة أخرى فسيتطلّب الأمر إنشاء إضافة مماثلة وإبدال العبارات الإنجليزيّة بعبارات اللّغة المستهدفة. تخيّل أنّك تُريد استهداف عشرين لغةً، يعني هذا أنّك ستحتاج لعشرين إضافة لا يوجد فرق بينها سوى في العبارات المعروضة. الكثير من الجهد المهدور، لا بدّ من وجود وسيلة أخرى. تدويل Internationalizing إضافةيهدف تدويل الإضافات في الأساس إلى جعلها جاهزةً لتُترجَم. يتطلّب التّدويل تغليفَ سلاسل المحارف Strings في دوالّ خاصّة تُسخدَم لتحميل التّرجمات الصّحيحة. توجد العديد من دوالّ التّدويل إلّا أنّنا سنأخذ فقط واحدةً منها، وهي دالّة ()__، ونترك البقيّة إلى أن نفهم المثال. تأخذ الدّالّة ()__ معطييْن: النّص الّذي نُريد ترجمته ونطاق النّصّ Text domain. في ما يلي الصّيغة العامّة لاستخدام هذه الدّالّة: <?php $greeting = __( 'Hello There!', 'text-domain' ); ?>نحصُل بعد استخدام دالّة ()__ على ترجمة النّصّ إن كانت موجودة، وإلّا فإنّ الدّالّة تُعيد النّصّ الأصليّ. تستخدم الدّالّةُ اللّغةَ الحاليّة لتحديد التّرجمة المطلوبة. يُمكنك الانتقال بين لغات ووردبريس في الإعدادات. تُطبَّق اللّغة المُختارة في الإعدادات على جميع التّرجمات. نأتي الآن لنطاق النّصّ، حتّى تكتمل عندنا الصّورة. نطاق النّصّ هو طريقة لتجميع التّرجمات مع بعض. لدى القالب Theme الّذي تستخدمه نطاق نصّ خاصّ به، نفس الشّيء بالنّسبة لجميع الإضافات. تجعل نطاقات النّصوص من التّفريق بين التّرجمات عمليّةً أيسر. يجب أن يكون نطاق النّصّ، بالنّسبة للإضافات، مطابقًا لاسم مجلّد الإضافة. يعني هذا، في مثالنا، أنّ نطاق النّصّ يجب أن يكون wp-admin-motivation. كلّ ما ياوجّب علينا فعله، من أجل تدويل الإضافة، هو تغليف سلاسل المحارف بالدّالّة ()__. $motivation = array( __( 'You are awesome', 'wp-admin-motivation'), __( 'This website is boss', 'wp-admin-motivation'), __( 'You look great today', 'wp-admin-motivation'), __( 'Your earlobes are well rounded, good job!, 'wp-admin-motivation')' );تنفيذ التّرجماتجعلنا في الخطوة السّابقة سلاسل المحارف جاهزةً للتّرجمة، لكن لحدّ الآن لا توجد أيّ ترجمات على الموقع. يجب أن نخبر ووردبريس أين توجد ترجمات الإضافة. الطّريقة المعياريّة لذلك هي إنشاء مجلّد فرعيّ باسم lang ضمن مجلَّد الإضافة. أنشئ مجلّد lang الآن وأضف الشّفرة التّاليّة في الملفّ الرّئيس للإضافة حتى يعرف ووردبريس أين توجد التّرجمات: add_action('plugins_loaded', 'wan_load_textdomain'); function wan_load_textdomain() { load_plugin_textdomain( 'wp-admin-motivation', false, dirname( plugin_basename(__FILE__) ) . '/lang/' );تعدّ دالة ()load_plugin_textdomain أساسيّةً هنا ويجب أن تُستدعى من دالّة مربوطة بالخطّاف plugins_loaded. أوّل معطى لدالّة ()load_plugin_textdomain هو اسم نطاق النّصّ الّذي تحدّثنا عنه سابقًا، الثّاني مهجور Deprecated، والثّالث هو مجلّّد اللّغة. ستكون أسماء ملفّات التّرجمات على صيغة plugin_name-locale.mo. حيثُ plugin_name اسم الإضافة وlocale المحلّيّة. سنرى في ما بعد كيفيّة إنشاء هذه التّرجمات. تذكّر، في الوقت الحاليّ، أنّك يجب أن تضع ملفّات التّرجمات هنا. ملحوظة: المحليّة Locale هي مجموعة من المُعطيات تحدّد لغة المستخدم، دولته، وأيّ تفضيلات خاصّة قد يودّ المستخدم رؤيتها في لغة الواجهة. سنختار ترجمة العبارات التّحفيزيّة الموجودة في الإضافة إلى اللّغة العربيّة؛ لذا سيكون المفّ باسم wp-admin-motivation-ar.mo. بالوصول إلى هذه النّقطة سيعمل كلّ شيء بالطريقة المرجوَّة، ينقُصُنا فقط إنشاء التّرجمات. إنشاء التّرجماتتوجد طُرُق متعدّدة لإنشاء ترجمات إلّا أنّ النّتيجة في النّهاية متطابقة. ستحصُل على ملفّين، أحدهما بامتداد po. والآخر بامتداد mo. الأوّل يُمكن للأشخاص قراءته، ويُمكنك فتحه بأيّ محرّر نصوص والتّعديل عليه. أمّا الملفّ ذو الامتداد mo. فهو نتاج تحويل ملفّ po. إلى صيغة مقروءة بالنّسبة للآلة، ذات حجم أصغر بكثير إلّا أنّه لا يمكن للإنسان قراءتها. في ما يلي مثال على ملفّ PO غير مُترجَم. توجد في أعلى الملفّ معلومات أساسيّة عن التّرجمة، المترجِم والمشروع؛ تليها سلاسل محارف تُمكن ترجمتها متبوعة بأماكن التّرجمات المنتظَرة. msgid "" msgstr "" "Project-Id-Version: WP Admin Motivation 1.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-04-27 13:09+0100\n" "PO-Revision-Date: 2015-04-27 13:09+0100\n" "Last-Translator: Daniel Pataki <contact@tastique.org>\n" "Language-Team: Daniel Pataki <hello@danielpataki.com>\n" "Language: Hungarian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-KeywordsList: __;_e\n" "X-Poedit-Basepath: .\n" "X-Poedit-SearchPath-0: ..\n" #: ../wp-admin-motivation.php:20 msgid "You are awesome" msgstr "" #: ../wp-admin-motivation.php:21 msgid "This website is boss" msgstr "" #: ../wp-admin-motivation.php:22 msgid "You look great today" msgstr "" #: ../wp-admin-motivation.php:23 msgid "Your earlobes are well rounded, good job!" msgstr ""الصّيغة العامّة للأسطُر في ملفّ التّرجمة هي التّاليّة: #: مسار الملفّ الّذي توجد به السّلسلة:رقم السّطر حيثُ توجد السّلسلة msgid "السّلسة المطلوبة ترجمتها" msgstr "التّرجمة"قد تظنّ أنّ كون أماكن تواجد السّلاسل مذكورة مباشرةً بعد ذكر رقم السّطر الّذي تتواجد به يجعل من إنشاء وصيّانة ملفّات التّرجمة أمرًا شاقًّا. لهذا السّبب توجد أدوات مخصًّصة للمساعدة. تُساعد أدوات المدير Admin tools في توليد ملفّات po. للإضافات الموجودة في مستودع ووردبريس. كما يُمكن أيضًا إنشاء ملفّات po. عبر البرنامج الرّائع Poedit. نزّل Poedi وشغّله؛ انقُر على File (ملفّ) ثمّ New catalog (مسرَد جديد). أدخل المعلومات المطلوبة في النّافذة المنبثقة. لا تهتّم بطقم المحارف (Charset) وصيّغ الجمع (Plural forms)؛ سنكتفي الآن بالمعلومات الأساسيّة. انتقل إلى تبويب Sources paths (مسارات المصادر). يُخبر مربَّع Paths (المسارات) Poedit أين يجب عليه البحث عن السّلاسل القابلة للتّرجمة ذات العلاقة بالمسار القاعديّ (Base path). سنضع التّرجمات ضمن مجلَّد فرعيّ في الإضافة؛ يعني هذا أنّ لدينا خيّارين لإعداد المسارات في Poedit: ضبط المسار القاعديّ Base path على القيمة /.. (المجلَّد الأب) وإعطاء القيمة . (المجلَّد الحاليّ) لمربَّع المسارات Paths.ضبط قيمة المسار القاعديّ Base path على قيمة المجلَّد الحاليّ . وقيمة مربَّع المسارات Paths على المجلَّد الأب /...يُخبر الخيّار الأوّل Poedit أنّ الشّفرة البرمجيّة للإضافة موجودة في المجلَّد الأب لمجلَّد اللّغة lang؛ أي أنّ البرنامج سيذهب للمجلَّد الأب ويبحث في ذلك المجلَّد. أمّا الخيّار الثّاني فيقول إنّ المجلَّد الّذي يوجد به الملفّ الحاليّ هو مجلَّد اللّغة؛ وأنّ الملفّات الّتي يجب التّحقّق منها توجد في المجلَّد الأعلى، لذلك استخدمنا /.. في مربَّع المسارات Paths. سنعتمد في هذا الدّرس الخيّار الثّانيّ. الخطوة التّاليّة هي ضبط الكلمات المفتاحيّة في تبويب Sources keywords (الكلمات المفتاحيّة للمصادر). نحدّد في هذا التّبويب أسماء دوالّ التّرجمة المستخدَمة. في المثال هنا نحتاج فقط لإضافة دالّة __. في أغلب الحالات ستحتاج لإدراج دالتّيْن إلى ثلاث؛ راجع التّرجمة المتقدّمة أدناه. لم يبق إلّا الموافقة على البيانات المُدخَلة. سيطلُب منك البرنامج مكان حفظ الملفّ؛ اختر مسار المجلَّد lang إن كنت اعتمدت الخيّار الثّاني في إعداد المسارات أعلاه. سيبحث Poedit في ملفّات الإضافة ويعثُر على السّلاسل الجاهزة للتّرجمة. يُمكنك بعدها ترجمة هذه السّلاسل إلى اللّغة الّتي تُريد. احفَظ الملفّ بعد الانتهاء من التّرجمة وسيولّد Poedit ملفّ MO في مجلَّد lang. تجب إعادة تسميّة ملفّ MO (اسم الملفّ في الإعداد الافتراضيّ هو default.mo) ليوافق الصّيغة الّتي ناقشناها سابقًا؛ أي أن اسم الملفّ، في المثال لدينا، هو wp-admin-motivation-ar.mo. بالنّسبة لملفّ PO فلايهمّ اسمه كثيرًا، إلّا أنّ من الأفضل تسميّته بنفس الطّريقة لكي تعرف بسهولة أيّ ملفّ PO يوافق ملفّ MO إذا كانت توجد الكثير من الملفّات في مجلَّد اللّغات. ستظهر العبارات التّحفيزيّة باللّغة العربيّة؛ بعد وضع ملفّ اللّغة في مجلَّد اللّغات ضمن الإضافة وتفعيل اللّغة العربيّة في إعدادات ووردبريس. صيّانة التّرجماتيبدو تحديث التّرجمات صعبًا للوهلة الأولى، إلّا أنّه ليس كذلك. صحيحٌ أنّ ملفّ PO يحوي رقم السّطر الّذي توجد به السّلسلة المُترجمَة، لكن ووردبريس لا يعتمد على أرقام الأسطُر عند استخدام ملفّ PO. الهدف من استخدام الملفّ والسّكر الّذيْن توجد بهما سلسلة المحارف المُترجَمة هو مساعدة المترجِم بحيث يُمكن النّظر إلى مكان وجود العبارة ومن ثمّ ترجمتها حسب السّيّاق الّذي وردت فيه. لن تحتاج إلى ملفّات التّرجمة إن كانت التّعديلات الّتي تُجريها تقتصر على الشّفرة البرمجيّة الّتي توجد بها سلاسل المحارف الجاهزة للتّرجمة دون أن تعدّل على هذه الأخيرة. ما أفعله عادةً هو إنشاء ملفّ POT ثمّ أحدّثه في كلّ مرة أحدّث فيها الإضافة، حتى ولو لم تتغيَّر سلاسل المحارف. تُشبه ملفّات POT ملفّات PO؛ إلّا أنّها لا تحتوي على أيّ ترجمات، فكلّ ما تحتويه هو الجمل والعبارات الجاهزة للتّرجمة؛ أيّ أنّها قوالب فقط. تكون التّرجمات سهلة ما دام ملفّ القالب محدَّثًا ويحوي رقم السّطر الصّحيح لكلّ سلسلة محارف. إذا احتجت إلى تحديث ملفّ لغة فكلّ ما عليك فعله هو فتحه عن طريق Poedit ثمّ النّقر على أيقونة التّحديث Update وسيُشعرك البرنامج بالسّلاسل الجديدة والمُعدَّلة ويمكنك بعدها التّعديل عليها. قبول التّرجماتمن الأمور الّتي يحدُث فيها الارتباك كثيرًا، على الأقلّ هذا ما حدث لي أولَ وهلة، هو كيفيّة إنشاء ترجمات جديدة لإضافة. كيف يُمكنني إضافة ترجماتي الخاصّة؟ كنتُ أظنّ أنّ هذه العمليّة تحدُث آليًّا، لكنّها ليست كذلك. عندما يُعجَب أحدهم بإضافة فإنّه يترجمها إلى لغته باستخدام ملفّ POT المضمَّن في الإضافة ثمّ يُرسل التّرجمة (ملفّات MO وPO) إلى مطوّر الإضافة الّذي يضعها في ملفّ lang، يُنشئ إصدارًا جديدًا ويدفعها إلى مستودع ووردبريس. عندما يتلقّى مستخدم الإضافة التّحديث تظهر الإضافة بلغة واجهة ووردبريس لديه، إن كانت ضمن اللّغات الموجوة في ملفّ lang. أستضيف كلّ مستودعاتي على Github وهو ما يسهّل على المترجمين إرسال ملفّات التّرجمة لي باستخدام طلبات السّحب Pull requests. كلّ ما عليّ فعله بعدها هو الضّغط على زرّ وإنشاء إصدار جديد من مستودع ووردبريس. التّرجمات المتقدّمةتعرّفنا في ما سبق على طريقة ترجمة سلاسل محارف قاعديّة عن طريق دالّة ()__. توجد 14 دالة ترجمة في ووردبريس يُمكن استخدامها لتدقيق ضبط ترجماتك. على الأرجح لن تحتاج إلّا إلى 3 أو 4 منها. نبدأ بالأشهر من بينها. 1- ()__هذه هي الدّالّة الأساسيّة للتّرجمة. تأخذ سلسلة محارف وتُعيد التّرجمة إن كانت موجودة. 2- ()e_نفس عمل الدّالّة السّابقة تقريبًا، إلّا أنّها بدلًا من إرجاع التّرجمة تعرضها مباشرةً. 3- ()n_تتيح هذه الدّالة وسيلة أنيقة للتّعامل مع الجموع. تأخذ الدّالّة أربعة معطيات: صيغة المفرد، صيغة الجمع، العدد الّذي على أساسه ستعرض الصّيغة (صيغة المفرد أو الجمع) ونطاق النّصّ. في ما يلي مثال سريع: <?php $messages = get_message_count(); // الاستعمال المبَسَّط: لا تُظهر الدّالة العدد الفعليّ $text = _n( 'You have one message', 'You have lots of messages', $messages, 'my-message-app' ); // في طريقة الاستعمال هذه نُظهر العدد الفعليّ للرّسائل $text = sprintf( _n( 'You have one message', 'You have %s messages', $messages, 'my-message-app' ), $messages ) ?>في هذا المثال نحصُل على عدد الرّسائل ضمن متغيّر messages ثمّ نستخدم هذا المتغيّر في دالّة ()n_ الّتي تعتمد على قيمة المتغيّر لاختيّار سلسلة المحارف الّتي تعرضها (بصيغة المفرد أو الجمع). في طريقة الاستعمال المبسَّط للدّالة لا يظهر عدد الرّسائل ضمن سلسلة المحارف المعروضة حيثُ توجد عبارتان، الأولى للعرض إذا كانت قيمة messages مفردة وتُعرَض الثّانيّة في حالة الجمع. إذا أردنا عرض العدد نستخدم عبارة s% في المكان الّذي نُريد أن يُعرض فيه العدد. بالنّسبة لملفّ PO فينبغي أخذ اللّغة الّتي نريد التّرجمة إليها في الحسبان. في أغلب اللّغات الأوروبيّة لا توجد سوى صيغة واحدة للجمع: إذا كان المعدود أكبر من أو يُساوي اثنين يُعدّ جمعا، أي أنّ هناك حالتين فقط (واحدة للمفرَد والأخرى للجمع). في اللّغة العربيّة يتغيّر المعدود حسب العدد في ما مجموعه خمس صيّغ (مفرَد، مثنَّى وثلاث حالات بالنّسبة للجمع)، إضافةً للصّيغة الّتي يكون العدد فيها يُساوي صفرا (أيّ أنّ المجموع يُساوي ستة). لمن يُريد التّفصيل في المسألة فليراجع فصل العدد والمعدود في النّحو :). لأخذ هذه التّغييرات في الحسبان عند إنشاء ملفّ التّرجمة نُخبر Poedit بعدد صيّغ الجمع الموجودة لدينا، بالنّسبة للعربيّة: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5; قبل البدء في البحث عن سلاسل المحارف نُضيف الدّالة n_ في تبويب Sources keywords (الكلمات المفتاحيّة للمصادر) حتى يتعرّف عليها البرنامج؛ إضافةً للدّالّة __ السّابقة. ملحوظة: من المهمّ جدًّا كتابة الدّالّة بالصّيغة n:1,2_ الّتي تعني أنّ المُعطى الأوّل (الرّقم 1) يعبّر عن صيغة المفرد وأنّ المعطى الثّاني لصيغة الجمع. يمكننا الآن إنشاء ملفّ اللّغة وترجمة العبارات الواردة فيه مع أخذ الجمع بالحسبان. ملحوظة: أبقِ عبارة %s في التّرجمات الّتي تحتاج ذلك، أي الّتي يكون العدد فيها اثنان فما فوق. ستُبدَل هذه العبارة بالعدد الفعليّ أثناء تنفيذ البرنامج. مثلًا إذا كان العدد بين 3 و 10 (التّبويب الرّابع في الصّورة، الّذي يحمل العنوان Form 3) فيمكن أن تكون التّرجمة “توجد لديك 3 رسائل” أو “توجد لديك 8 رسائل”. القيمة (3 و 8) ستُعرف أثناء عمل الإضافة الّتي ستضعها مكان %s. 4- ()x_تهدف هذه الدّالّة إلى الوقاية من الخلط بين الكلمات مختلفة المعنى الّتي تُكتَب بنفس الطّريقة. مثلًا إذا كنت تستخدم كلمة pair بمعنى “زوج أشخاص” وبمعنى “ربط بجهاز بلوتوث” فيُمكن أن يشتبه المعنى. لمنع الاشتباه ولمساعدة المترجم على اختيّار العبارة المناسبة في لغته استخدم دالّة ()x_. _x( 'Pair', 'A pair of people', 'my-plugin-textomaind' ); _x( 'Pair', 'As in: pairing devices', 'my-plugin-textomaind' );5- ()ex و ()nxيُشبه عمل هاتيْن الدّالتيْن عمل دالّة ()x_ أعلاه. الفرق هو أنّ ()ex_ تعرض النّتيجة مباشرةً في حين أنّ nx_ تُضيف إمكانيّة تحديد صيغة للجمع. تخليص Escaping التّرجماتتتيح الدّوال السّتّ التّاليّة إمكانيّة تخليص التّرجمة من أجل الاستخدام الآمن في نصوص HTML (الثّلاث الأخيرة) أو خاصيّاته attributes (الثّلاث الأولى). ()esc_attr__()esc_attr_e()esc_attr_x()esc_html__()esc_html_e()esc_html_xترجمات Noopتسجّل دوالّ Noop سلاسل المحارف بصيغة الجمع في ملفّ POT دون أن تترجمها. يعود السّبب في ذلك إلى أنّ العدد غير معروف سلفًا، وهو ما يعني أنّنا سنحتاج لدالّة أخرى للحصول على العدد وبالتّالي اختيّار صيغة المعدود (الجمع). لهذا السّبب نستخدم دالّة Noop ثمّ نترجم القيمة الحقيقيّة لاحقًا بعد الحصول على العدد. راجع المقال التّالي للمزيد. تستخدم الدّوال التّاليّة لهذا الغرض: ()n_noop_()nx_noop_()translate_nooped_pluralترجمة Javascriptربّما ننساءل ماذا عن سلاسل المحارف الموجودة ضمن شفرة Javascript؟ يقدّم ووردبريس الحلّ عبر دالّة ()wp_localize_script. تأخذ هذه الدّالّة ثلاثة معطيات: مِقبض Handle (معرّف) السّكريبت الّذي نُريد ترجمته، اسم كائن Object للاستخدام داخل السّكريبت ومصفوفة التّرجمة. في ما يلي مثال على ترجمة سلاسل محارف ضمن Javascript: add_action( 'admin_enqueue_scripts', 'motivation_assets' ); function motivation_assets($hook) { wp_enqueue_script( 'motivation-scripts', plugin_dir_url( __FILE__ ) . 'scripts' ); wp_localize_script( 'motivation-scripts', 'wma', array( 'section_title' => __( 'Today's motivation', 'wp-admin-motivation' ) )); }بعد إضافة التّرجمات يُمكنك استخدامها في ملفّ Javascript المُسجَّل. يجب عليك استخدام اسم الكائن ومفاتيح مصفوفة التّرجمة: jQuery.html( "<h2>" + wma.section_title + "</h2>" );خاتمةيستخدم ملايين الأشخاص لغاتِهم للتّعامل مع ووردبريس، فلمَ لا تساعدهم في عمل نفس الشّيء مع منتجاتك؟ فلا جعل الإضافات جاهزة للتّرجمة أمر صعب ولا صيّانتها تُمثّل كبير إزعاج. يُساعد تجهيز سلاسل المحارف للتّرجمة وإنشاء ملفّات po وmo الجميع كما أنّه يزيد من جودة المنتج. ترجمة بتصرّف لمقال Everything You Need to Know About Translating WordPress Plugins لكاتبه Daniel Pataki.
  25. يجذب ووردبريس بسبب قوته، وشهرته، وتوثيقه الكثير من طاقة “افعل ذلك بنفسك”، فبشكل عام هذا يبدو رائع، فهذه شهادة على أن الناس لديها آمال عالية في ووردبريس، وهذه طريقة ممتازة لتعلمه، لكن للأسف، فإن جهود “افعل ذلك بنفسك” غالبا ما تكون خاطئة. كمطور، غالبا ما أجد أن هذه جهود الفردية تسقط بالكامل، أو أجد نفسي أفسد الموقع عندما يكون تقريبا يعمل جيدا لكن يبدوا غريبا و هنالك بعض الميزات الرئيسية تنقصه. سوف نتحدث هنا عن أولى و أسوء الأخطاء التي قد يرتكبها شخص جديد إلى عالم ووردبريس، لقد رأينا هذه الأخطاء مرات عديدة، ولقد ارتكبنا بعضها سابقا. 1- محاولة بناء موقعك من الثيم الافتراضي إذا كنت جديدا في ووردبريس، فإنه من السهل بناء موقعك عن طريق: تثبيت الووردبريس. تخصيص الووردبريس ليظهر كما تريد.ربما ستكون لديك معرفة بقوالب ووردبريس، لكن سوف تقوم إما بوضع إحدى القوالب الافتراضية المجانية أو انك ستقوم باستخدام قالب بوتستراب (bootstrap) الذي يقوم بتجريد شكل ووردبريس إلى أساسياته، وسرعان ما ستجد نفسك تقوم بتعديلات على ملفات المصدرية للثيم، فتقوم بحذف أجزاء و إضافة أجزاء أخرى. سبب المشكلة: إن المواقع المبنية على قوالب غير ملائمة تكون في العادة قبيحة جدا، و وضعها في موقعك سيجعله سيئا، لأنك ستقوم بتجاهل العديد من أبرز المميزات المفيدة للووردبريس. ربما تحتاج إلى معرفة: قوة ومرونة ثيمات الووردبريس، خاصة المدفوعة منها، وإن إيجاد ثيم مدفوع قريب من احتياجاتك وتخصيصاتك هو الخيار الصحيح. قم بالبحث عن بعض قوائم الثيمات، ستجد أنه يوجد الآلاف منها، لذلك اجعل بحثك أكثر تحديدا، فمثلا قم بالبحث عن “ثيمات مجلات مسطحة للوردبريس” إذا كنت تبحث عن تصميم مسطح وأنت تقوم بتشغيل موقع مجلة، أو قم بالبحث عن موقع تحبه يعمل على الووردبريس واعرف أي ثيم يستخدم. لا تستخدم قالب “Twenty Fourteen” أو أول ثيم يبدوا جميل وتبدأ ببناء موقعك. 2- إفساد ملفات القوالب أو تكديسها بوسوم HTML في أغلب الأوقات يحدث هذا بسبب الإحباط، عندما لا تعرف كيف تقوم بجعل السلايدر يعمل على صفحتك الرئيسية في الوقت الذي يعمل فيه على صفحة HTML الثابتة. فلماذا لا تقوم بقطع جزء من القالب الذي يتعامل مع السلايدر ولصق السلايدر من موقع HTML (مع جافاسكربت) مباشرة في ملف home.php؟ سبب المشكلة: هذا الأمر يجعل ووردبريس ثابت بدل من ديناميكي، وهذه علامة على أنك لا تعرف ما الذي تقوم بفعله، وهذا معناه في الغالب أنه سيكون هنالك مشاكل قريبا، لأنك ستقوم بإفساد وتغيير شِفرة ووردبريس وستزيد من صعوبة العمل عليها لاحقا. ربما تحتاج إلى معرفة: دوال ووردبريس، التي هي الطريقة الصحيحة (والديناميكية) للقيام بأغلب الأشياء التي تريد القيام بها بنفسك، فعلى سبيل المثال، يمكنك التعامل مع السلايدر على أنه شِفرة قصيرة (shortcode) عن طريق دالة ()do_shortcode. وإن وضع السلايدر بالطريقة الصحيحة يسمح لك بتعديل محتويات السلايدر من داخل منطقة إدارة ووردبريس في موقعك. 3- إعادة بناء الوظائف يدويا بدل التعامل معها عن طريق الإضافاتخاصة عندما تكون جديدا في ووردبريس، فإنه من السهل القيام بأشياء اليدوية عن طريق الإضافات، والمثال الكلاسيكي على ذلك هو القيام بلصق شِفرة التتبع الخاصة بـجوجل أناليتكس (Google Analytics) مباشرة في ملف header.php بدل إستخدام Google Analyticator أو أية إضافة مماثلة، وإن القيام بهذه الطريقة يعني أن جوجل أناليتكس لن تتكامل مع موقعك في الوقت الذي يجعل فيه Analyticator الأمر أسهل بالإضافة إلى أن إلصاق شِفرة جوجل أناليتكس إلى الشِفرة المصدرية للقالب لديه سلبياته التي ذكرناها في النقطة الثانية. ومثال آخر على ذلك هو تعديل الأعمدة يدويا داخل التدوينة عن طريق أنماط مضمنة، مثلا (“width: 50%”) بدل استخدام Column Shortcodes أو أية إضافة مشابهة. سبب المشكلة: إعادة اختراع العجلة يستغرق وقتا طويلا و يقود في الغالب إلى نتائج أسوء. ربما تحتاج إلى معرفة: غريزة البحث عن إضافة قبل أي شيئ آخر، فووردبريس يمتلك الآلاف من الإضافات المجانية، وإذا أردت القيام بشيء يحتاجه أشخاص آخرون (مثل مجموعة جميلة من تصاميم الأزرار المسطحة) قُم بالبحث عنه ولا تستسلم حتى تجده. ملاحظة: هذا لا يعني أنه يجب عليك أن تعتمد على الإضافات في كل شيئ بدل من كتابة سكربتات بسيطة (مثل الفلترات) إذا كنت تعرف كيف تكتبها، هذه النصيحة تستهدف القادمين الجدد لتجنب على سبيل المثال صنع حلول للتجارة الإلكترونية بنفسهم بدلا من إستخدام WooCommerce. 4- اقتصار ووردبريس على جزء المدونة من الموقعيحدث هذا عندما تبقي موقعك القديم يعمل وتقوم ببناء ووردبريس في “blog/” ثم تقوم بنسخ جميع ملفات CSS من الموقع الرئيسي و تضعهم (على الأرجح) في قائمة التصفح الرئيسية لموقعك ككود HTML في ملف header.php (تقوم بتكرار خطأ رقم 2 مرة أخرى). سبب المشكلة: إن تكرار تصميم موقعك الرئيسي على ووردبريس هو مضيعة للوقت، فأنت الآن تحافظ على نسختين من ملفات CSS ومن قائمة التصفح الرئيسية وغيرها. وستجد أن العشرات من مميزات الووردبريس لا تعمل سوى على الجزء المدونة في الموقع. ربما تحتاج إلى معرفة: ووردبريس هو نظام إدارة المحتوى، وليس منصة مدونات فالعديد من المواقع التي تضع ووردبريس كمدونة يجب أن تعمل بالكامل على ووردبريس، باستثناء تطبيقات الويب المعقدة، لكن إذا كنت، على سبيل المثال، تقوم بنقل مدونة الشركة إلى ووردبريس، فقُم بنقل بقية الموقع كذلك، وهكذا ستقوم بإدارة نسخة واحدة من كل شيئ وستحصل على مميزات ووردبريس على كامل الموقع. في الختام …بشكل عام، كل هذه الأخطاء سببها عدم معرفة ماذا يمكن للووردبريس أن يفعله، فهذا الأمر يشبه استئجار طائرة للطيران عبر البلاد، لذلك إذا بدأت بالشعور أن المشروع الذي تقوم به بنفسك بدأ يفشل وبدأت الأخطاء والمشاكل بالظهور، فهذه علامة على ضرورة التريث واتخاذ خطوة للوراء، والبدء بتعلم المزيد عن ووردبريس قبل بدأ العمل بها. إذا كنت شخص من نوع يريد أن يفعل كل شيئ بنفسه، فنرجو أن تساعدك هذه النصائح، وإذا كنت تعرف شخص من هذا النوع، فنرجو منك إخباره بهذه النصائح، فهذه النصائح يمكن أن تحدث فرقا بين تجربة أولية جيدة مع ووردبريس وبين إحباط كامل، وكالعادة نريد أن نسمع تعليقاتكم. ترجمة -وبتصرف- للمقال: Classic Do-It-Yourself WordPress Mistakes To Avoid لصاحبه Fred Meyer. حقوق الصورة البارزة: Designed by Freepik.