كيفية إنشاء صفحة التسجيل الخاصة بك في WordPress Multisite. كيفية إنشاء صفحة التسجيل الخاصة بك في WordPress مكافأة متعددة الأطراف. الحماية ضد المرسللين

يمكن استخدام الروابط المتاح في مجموعة متنوعة من المواقف: من أجل توفير وصول مؤقت إلى الملف أو الصفحة، أو لتأكيد التسجيل. في هذا الدرس، سنظهر كيفية توليد وتنفيذ عناوين URL يمكن التخلص منها.

إنشاء عنوان URL.

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

http: //example.com/acctivate؟ رمز \u003d EE97780 ...

بدون قاعدة بيانات، لا يمكننا أن نفعل هنا، لذلك دعونا ننظر إلى الجدول الذي سنعمل به.

إنشاء جدول رطل (الرمز char (40) غير فارغة، اسم المستخدم varchar (45) غير فارغة، tstamp عدد صحيح غير موقعة غير فارغة، مفتاح أساسي (رمز)؛

في الجدول، سنخزن 3 الحقول: رمز، اسم المستخدم والوقت. لتوليد رمز رمزي، سوف نستخدم وظيفة Sha1 ()، والتي تعطي سلسلة من 40 حرفا. سيقوم حقل Tstamp بتخزين وقت توليد الرمز المميز حتى نتمكن من تتبع الروابط مع Outtrae.

هناك العديد من الطرق لتوليد رمز مميز، ولكن في هذا الدرس سوف نستخدم وظائف UNIQID () و SHA1 (). بغض النظر عن طريقة توليد رمز رمزي، تأكد من أن القيم التي تم إنشاؤها ستكون مختلفة واحتمال التكرار ضئيلة.

$ token \u003d sha1 (UNIQID (اسم المستخدم، صحيح))؛

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

بعد العمل على وظيفتين، سيكون لدينا رمز فريد يمكن استخدامه لإنشاء عناوين URL. الآن نحتاج إلى وضعه في قاعدة البيانات:

$ query \u003d $ db-\u003e قم بإعداد ("إدراج في الرايتين (اسم المستخدم، الرمز المميز، Tstamp) القيم (؟،؟)")؛ استعلام $-\u003e تنفيذ (صفيف اسم المستخدم، الرمز المميز $، $ _server ["preser_time"])؛

من أجل معرفة أي مستخدم يجب تنشيطه، سنقوم بتسجيل الدخول وتسجيل الدخول إلى الجدول. في مثال، أكثر تتكيف مع موقع ويب حقيقي، يمكنك استخدام معرف المستخدم.

الآن أن لدينا كل المعلومات اللازمة، يمكننا إنشاء عنوان عنوان URL مؤقت:

$ URL \u003d "http://example.com/activate.php؟token\u003dartoken"؛

رسالة $ \u003d.<<

الشيك

الآن نحن بحاجة إلى برنامج نصي، بفضل التي سوف نتحقق منها. كل ما نحتاج إلى القيام به هو مقارنة الرمز المميز من عنوان URL والرمز من القاعدة. إذا كان هناك شيء مثل هذا الأمر، ووقت حياته لم تنته بعد، فكل شيء على ما يرام.

// احصل إذا تم الرمز المميز (ASSET ($ _ احصل على ["الرمز المميز"]) && preg_match ("/ ^ (40) $ / i"، $ _GET ["الرمز المميز")) ($ الرمز المميز \u003d $ _GET ["رمز" ["رمز" ["token" ]؛) آخر (رمي استثناء جديد ("Tocken غير صالح.")؛) // التحقق من استعلام $ \u003d $ db-\u003e قم بتحضير الرمز المميز ("حدد اسم المستخدم، tstamp من رعايتها، حيث رمز \u003d؟")؛ الاستعلام $-\u003e تنفيذ (صفيف (رمز الرمز المميز))؛ $ الصف \u003d $ query-\u003e fetch (pdo :: fetch_assoc)؛ استعلام $-\u003e المؤشر الأسري ()؛ إذا ($ صف) (استخراج ($ صف)؛) آخر (رمي استثناء جديد ("Tocken غير صالح")؛) // تنشيط حساب المستخدم // ... // قم بإزالة الرمز المميز من استعلام Base $ \u003d $ DB\u003e قم بالتحضير ("حذف من Bending_users حيث اسم المستخدم \u003d؟ و Token \u003d؟ و Tstamp \u003d؟"،)؛ الاستعلام $-\u003e تنفيذ (صفيف (اسم المستخدم $، الرمز المميز $، $ tstamp))؛

نحتاج أيضا إلى توفير اختبار الرموز، وهو مدى انتهت صلاحية العمر:

// 1 يوم في ثوان \u003d 60 ثانية * 60 دقيقة * 24 ساعة $ دلتا \u003d 86400؛ / / تحقق من ما إذا كان ($ _Server ["price_time"] - $ tstamp\u003e delta $) (رمي استثناء جديد ("TOCKEN Lifetime منتهية الصلاحية")؛) // تنشيط حساب مخصص // ...

وبالتالي، سيكون لدينا اثنين من الشيكات: واحد على صحة الرمز المميز، والآخر في وقت وجودها.

حصيلة

يمكن تطبيق هذه الطريقة ليس فقط لتنشيط حسابات المستخدمين، ولكن أيضا في الاحتياجات الأخرى: على سبيل المثال، لتوفير وصول واحد أو مؤقت إلى مورد أو خدمة.

بالإضافة إلى كل هذا، يمكنك إنشاء برنامج نصي يقوم بإزالة الرموز التي لم تستخدمها أبدا. يمكن إطلاق هذا البرنامج النصي من وقت لآخر أو التقدم بطلب للحصول على هذا Cron.

Segal سننظر في استغلال الضعف النقدي لمدة يومية في جملة CMS الشهير، والتي رعد على الإنترنت في نهاية أكتوبر. سيكون حول نقاط الضعف مع الأرقام cve-2016-8869., cve-2016-8870. و cve-2016-9081.وبعد تحدث الثلاثة جميعا من قطعة واحدة من التعليمات البرمجية، والتي كانت ذات مرة في أعماق الإطار، في انتظار ساعاتهم الخاصة، ثم تحررها وتجلب معه الفوضى، واخترق المواقع والدموع في أي مستخدمين بريئة في جملة. فقط المطورين الأكثر سبقا وجريئة الذين عيونهم حمراء من نور الشاشات، وتستغرق لوحات المفاتيح مع فتات الخبز، كانوا قادرين على تحدي الانهاء المنتفخ وفرض رأسها على مذبح الإصلاحات.

تحذير

يتم توفير جميع المعلومات فقط لأغراض إعلامية. لا يوجد محررون ولا المؤلف مسؤولون عن أي ضرر ممكن ناجم عن مواد هذه المادة.

لماذا بدأ كل شيء

في 6 أكتوبر 2016، أنشأ Damis Palma (Demis Palma) موضوعا على تبادل المكدس، والذي استفسر: لماذا، في الواقع، في جملة الإصدار 3.6 هناك طريقتان لتسجيل المستخدمين بنفس الاسم السجل ()؟ أول موجود في وحدة تحكم UsersControlesRegistration، والثاني في userscontrolleruser. أراد DAMIS معرفة ما إذا تم استخدام أسلوب UsersConTrollerolerUser :: Record () في مكان ما، أو أنها مجرد مفارقة تاريخية تطورية لا تزال من المنطق القديم. لقد كان منزعجا من حقيقة أنه، حتى لو لم يتم استخدام هذه الطريقة في أي عرض تقديمي، فيمكن استدعاء استخدام طلب معين. ما كان الجواب من المطور تحت لقب ITOCTOPUS، مؤكدا: المشكلة موجودة حقا. وأرسل تقريرا إلى مطوري جملة.

بعد ذلك، طورت الأحداث الطريقة الأكثر سرعة. في 18 أكتوبر، يقبل مطورو جملة تقريرا من DAMIS، وهو ما أدوره بوك، مما يتيح لك تسجيل المستخدم. نشر ملاحظة على موقعه، حيث أخبر المصطلحات العامة عن المشكلة والأفكار حول هذا الموضوع. في نفس اليوم، يخرج الإصدار الجديد من Joomla 3.6.3، والتي لا تزال تحتوي على رمز ضعيف.

بعد ذلك، يدور David Tampellini (Davide Tampellini) الخلل إلى حالة التسجيل ليس مستخدم بسيط، ولكن المسؤول. وفي 21 أكتوبر، يصل فريق Joomla الأمن إلى حالة جديدة. يتحدث بالفعل عن رفع الامتيازات. في نفس اليوم، يظهر الإعلان على موقع جملة في موقع جملة أنه يوم الثلاثاء، 25 أكتوبر، سيتم إصدار نسخة أخرى ذات رقم تسلسل 3.6.3، والذي يصحح الضعف الحرج في نواة النظام.

في 25 أكتوبر، يجد فريق Joomla Security Electron المشكلة الأخيرة التي اكتشفها DAMIS. ثم في الفرع الرئيسي لمستودع جملة الرسمي، ارتكاب 21 أكتوبر، مع اسم غير واضح يعد الإصدار 3.6.4 المستقر، الذي يحدد الخطأ غير المصدر.

بعد ذلك، يتم توصيل العديد من الأفراد المهتمين بنقل المطورين إلى نقل المطورين - يبدأون في تعزيز الضعف وطهي الطعام الصلبة.

في 27 أكتوبر، يضع باحث هاري روبرتس استغلال جاهز في مستودع البحوث Xiphos، والذي يمكنه تحميل ملف PHP إلى خادم مع CMS عرضة للخطر.

تفاصيل

حسنا، مع ما قبل التاريخ انتهى، انتقل إلى الشيء الأكثر إثارة للاهتمام - تمييز الضعف. كإصدار اختبار، قمت بتثبيت Joomla 3.6.3، لذلك ستكون جميع أرقام الصف ذات صلة بهذا الإصدار. وجميع المسارات إلى الملفات التي سترى بعدها ستتم الإشارة إلى جذر CMS المثبت.

بفضل النخيل Damis Find، نعلم أن هناك طريقتان تؤديان تسجيل المستخدم في النظام. يتم استخدام الأول من قبل CMS وهو في /Components/Com_users/Controllers/comments/controllers/registration.php:108. والثاني (الشخص الذي نصل إليه)، يعيش في / مكونات / COM_USERS / وحدات التحكم / User.php: 293. دعونا ننظر إليها أقرب.

286: / ** 287: * طريقة لتسجيل المستخدم. 288: * 289: * 289: * return boolean 290: * 291: * sinceins 1.6 292: * / 293: سجل الوظيفة العامة () 294: (295: jsession :: checktoken ("مشاركة") أو jexit (jtext :: _ ("Jinvalid_token"))؛ ... 300: // الحصول على بيانات النموذج. 301: بيانات $ \u003d $ this- $-\u003e post-\u003e get-\u003e الحصول عليها ("المستخدم"، صفيف ()، "صفيف")؛ .. 315: $ return \u003d $ model-\u003e التحقق من صحة ($ النموذج، $ البيانات)؛ 316: 317: // التحقق من الأخطاء. 318: إذا ($ return \u003d\u003d\u003d false) 319: (... 345: / الانتهاء من التسجيل. 346: $ العودة \u003d $ model-\u003e سجل (بيانات $)؛

هنا تركت فقط خطوط مثيرة للاهتمام. يمكن عرض النسخة الكاملة من الطريقة الضعيفة في مستودع جملة.

سنكتشف ذلك ما يحدث عند تسجيل المستخدم العادي: ما البيانات التي يتم إرسالها وكيفية معالجتها. إذا تم تمكين تسجيل المستخدم في الإعدادات، فيمكن العثور على النموذج على http: //joomla.local/index.php/component/users/؟ عرض \u003d التسجيل.


يبدو طلب شرعي لتسجيل المستخدم مثل لقطة الشاشة التالية.


مكونات COM_USERS هي المسؤولة عن العمل مع المستخدمين. انتبه إلى معلمة المهمة في الاستعلام. لديها تحكم $. طريقة $. دعونا نلقي نظرة على هيكل الملف.

أسماء البرنامج النصي في مجلد تحكم. يتوافق مع أسماء وحدات التحكم المسمى. نظرا لأن طلبنا هو الآن $ Commonder \u003d "التسجيل"، سيتصل الملف. التسجيل. وسجلها () طريقة.

الاهتمام والسؤال: كيفية نقل معالجة التسجيل في منطقة عرضة للخطر في القانون؟ ربما كنت قد خمنت بالفعل. تتزامن أسماء الطرق الضعيفة والحديثة (التسجيل)، حتى نتمكن من تغيير اسم وحدة التحكم المسمى فقط. وأين هي وحدة تحكم ضعيفة؟ الحق في الملف user.php.وبعد اتضح $ Controller \u003d "المستخدم". نجمع كل شيء معا واحصل على المهمة \u003d User.register. الآن تتم معالجة طلب التسجيل بالطريقة التي نحتاجها.


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

  • / كمنتس /Com_users/Controllers/registration.php: 124: // الحصول على بيانات المستخدم. 125: $ leaddata \u003d $ this-\u003e إدخال\u003e post-\u003e الحصول على ("jform"، صفيف ()، "صفيف")؛

جناحنا يتلقى هذه البيانات من مجموعة المستخدم المسمى.

  • oncomponents/com_users/controllers/user.php: 301: // الحصول على بيانات النموذج. 302: بيانات $ \u003d $ this-\u003e إدخال\u003e post-\u003e الحصول على ("مستخدم"، صفيف ()، "صفيف")؛

لذلك، نحن نغير أسماء جميع المعلمات مع jfrom على المستخدم.

ثالث خطوتنا هي العثور على رمز CSRF ساري المفعول، حيث لن يكون هناك تسجيل بدونها.

  • /Components/Com_users/Controllers/user.php: 296: jsession :: checktoken ("المشاركة") أو jexit (jinvalid_token))؛

يبدو وكأنه علامة تجزئة MD5، ويمكنك أن تأخذها، على سبيل المثال، من نموذج الترخيص على الموقع /index.php/component/users/؟view\u003dlogin.


يمكنك الآن إنشاء مستخدمين من خلال الطريقة المطلوبة. إذا حدث كل شيء، فأنت أهنئ - لقد فهمت للتو cve-2016-8870. "التحقق المفقود للتصاريح لتسجيل المستخدمين الجدد."

إليك كيف تبدو في طريقة تسجيل "العمل" () من وحدة تحكم UsersControllerolerLerrolleDroller

  • oncomponents/com_users/controllers/registration.php: 113: // إذا تم تعطيل التسجيل - إعادة توجيه إلى صفحة تسجيل الدخول. 114: إذا (jcomponenthelperpelper :: GetParams ("COM_USERS") -\u003e احصل على ("allowusereRegistration") \u003d\u003d 0) 115: (116: $ this-\u003e setredirect (jroute :: _ ("index.php؟ الخيار \u003d com_users & عرض \u003d تسجيل الدخول "، خطأ))؛ 117: 118: العودة كاذبة؛ 119 :)

وهكذا في عرضة للخطر:

  • / كمنذر/com_users/controllers/user.php:

نعم، بأي حال من الأحوال.

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

استمرار متاح فقط للمشاركين

الخيار 1. انضم إلى مجتمع الموقع لقراءة جميع المواد الموجودة على الموقع

ستفتح عضوية المجتمع خلال الفترة المحددة في الوصول إلى جميع مواد القراصنة، وسوف تزيد خصمك التراكمي الشخصي وسوف تتراكم تصنيف درجة XakeP المهنية!

قم بإنشاء صفحة التسجيل الخاصة بك ل Multisite بدلا من Signup.php.php Standard WP.

في إعداد WordPress المعتاد، تعرض صفحة التسجيل (إذن إعادة تعيين كلمة المرور) ملف WP-Login.php.

  • /wp-login.php - إذن
  • /wp-login.php؟action\u003dRegister - التسجيل
  • /wp-login.php؟action\u003dlostpassword - إعادة تعيين كلمة المرور

بالنسبة إلى Multisite في WP-Login.php هناك شروط منفصلة. لذلك، عند النقر فوق الارتباط /wp-login.php؟action\u003dregister على multisaite، سيجعل WordPress إعادة توجيه إلى صفحة /wp-signup.php. في العديد من الموضوعات، تبدو الصفحة ليست جذابة للغاية، لذلك سنجعلنا.

شبكة الموقع الرئيسية

بشكل افتراضي، يفتح WordPress صفحة التسجيل (WP-Signup.php) على شبكة المجال الرئيسي (موقع الويب). ومع ذلك، يمكنك إجراء صفحة تسجيل منفصلة لكل موقع شبكة، حتى لو كان لديهم مواضيع مختلفة. سننظر في الحال عندما يكون على جميع مواقع الشبكة صفحة تسجيل خاصة به، ولكن يتم استخدام نفس الموضوع واختلاف المواقع إلا باللغة. إذا تم استخدام مواضيع مختلفة، فستحتاج إلى كتابة المزيد من التعليمات البرمجية.

وظائف.

لا. يبدو أن اسم هذا الملف مذكورة في أي مقالة حول WordPress. في حالتنا، مع مراعاة حقيقة أن وظيفة التسجيل مصممة لعدة مواقع، فمن المنطقي أن تأخذها في مواقع MU-Plugins التي يتم تحميلها عند فتح أي موقع.

digression غنائي

تجدر الإشارة إلى أن Mu-Plugins يتم تحميله في وقت مبكر من المكونات الإضافية العادية وحتى يتم تنزيل WordPress Kernel بالكامل، لذلك يمكن أن تؤدي الدعوة لبعض الوظائف إلى أخطاء فاطن في PHP. تحميل "في وقت مبكر" مماثل له مزاياه. دعنا نقول داخل أي موضوع لا يمكن التشبث ببعض الإجراءات التي يتم تشغيلها قبل تنزيل ملف الوظائف. VP من الموضوع. مثال على ذلك يمكن أن يكون بمثابة البرنامج المساعد jetpack_module_loaded_related-المشاركات (المشاركات ذات الصلة - اسم الوحدة النمطية) التي من الممكن تتبع نشاط الوحدات النمطية في Jetpack. من المستحيل "القابض" من ملف الموضوع إلى هذا الإجراء، لأن الإجراء يعمل بالفعل قبل تحميل الموضوع - يتم تحميل الإضافات في وقت سابق. يمكنك إلقاء نظرة على الصورة الشائعة لطلب التمهيد WordPress في صفحة مرجع الإجراء في التعليمات البرمجية.

النظام في الملفات

قد تحتوي Mu-Plugsins على أي عدد من الملفات وأي مخطط، الأمر الذي يبدو منطقيا لك. انا تلتزم بمثل هذا التسلسل الهرمي:

| -MU-Plugins | - | load.php | - | - | Selena-Network | - | - | - - -Signup | - | - | - | - | - | - | - | - | - | - | - | - | - | - | -... | - | - | - | -jetpack | - | - | - | - | - - plugin.php

في ملف Load.php، يتم توصيل جميع "الإضافات" الضرورية بشبكتنا:

تحميل Traslates لجميع الإضافات load_muplugin_textdomain ("selena_network"، "/ selena-network / language /")؛ // اشتراك الشبكة تتطلب wpmu_plugin_dir. "/selena-network/signup/plugin.php"؛ // الإضافات الأخرى // تتطلب WPMU_PLUGIN_DIR ...

داخل مجلد Selena-Network، يتم تخزين مجلدات المكونات الإضافية، ولكل منها PlayPin.php الخاص به، والذي نتصل به على load.php. إنها تعطي المرونة والقدرة على تعطيلها بسرعة وتضمين بعض الأشياء.

عنوان صفحة التسجيل

لتحديد عنوان صفحة التسجيل، استخدم مرشح WP_SIGNUP_LOCTION. يمكن العثور عليها داخل ملف WP-Login.php وهو هو المسؤول عن إعادة التوجيه في WP-Signup.php.

حالة "التسجيل": إذا كان (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location"، network_site_url ("wp-signup.php"))؛ خروج؛

أضف الميزة الخاصة بك في Mu-Plugins / Selena-Network / Signup / Plugin.php، مما سيعطي عنوان صفحة التسجيل في الموقع الحالي:

وظيفة selena_network_signup_page (url $) (urt home_url (). "/ الاشتراك /"؛ add_filter ("wp_signup_location"، "selena_network_signup_page_page"، 99)؛

يجب استبدال SELENA_NETWORK - بادئة، التي أستخدمها في أسماء جميع الوظائف داخل المكونات الإضافية MU على موقعي لتجنب التعارضات، بادئة فريدة خاصة بها. أولوية إضافة عامل التصفية 99، لأن بعض الإضافات، مثل BBPress و Buddypress، يمكن الكتابة فوق هذا العنوان لوحدك (MU الإضافات يتم تحميلها في وقت مبكر من الإضافات التقليدية، انظر أعلاه). يرجى ملاحظة أنه يتم استخدام home_url ()، بدلا من network_site_url ()، لمغادرة الزائر في نفس المجال. يمكنك استخدام أي عنوان URL كعنوان.

إنشاء صفحة

الآن دعنا ننشئ صفحة مع Site.Com/Signup/ من خلال واجهة منتظمة، وفي قالب مجلد الابنة للموضوع لصفحتنا الجديدة - Signup.ph.php. بدلا من كلمة "اشتراك"، يمكنك استخدام معرف فريد من نوعه.

داخل القالب الجديد، يجب عليك الاتصال بوظيفة Selena_network_signup_main ()، والتي ستعرض نموذج التسجيل.

تجدر الإشارة إلى أن العملية بأكملها مع القوالب غير مطلوبة وبدلا من ذلك، يمكنك إنشاء وظيفة الرمز القصير الخاص بك، والتي ستستدعى أيضا وظيفة selena_network_signup_main ().

wP-Signup.php و WP-Activate.php

الآن سنقوم بإنشاء وظيفة تعرض نموذج التسجيل. للقيام بذلك، انسخ الملفات WP-Signup.php و WP-Activate.php من الجذر WordPress في توصيل MU / Selena-Network / Signup / (ولا تنس ربطها داخل Mu-Plugins / Selena-Network / الاشتراك / البرنامج plampin.php). مزيد من التلاعب مع الملفات صعبة للغاية وطويلة لوصف، لذلك تعال لجعلها بنفسك. لن أصف فقط ما يجب القيام به بالضبط وننشر الملفات المصدر لمشروعك:

  1. في بداية الملف، احذف جميع الطلبات، ووظائف الاتصال وغيرها من التعليمات البرمجية الوظائف الخارجية.
  2. إعادة تسمية جميع الوظائف عن طريق إضافة البادئات الفريدة إلى الأسماء.
  3. يتم تغليف الجزء السفلي من رمز WP-Signup.php في وظيفة SELENA_NETWORK_SIGNUP_MAIN وفي البداية في كتابته في كتابة Active_Signup Global $؛ وبعد
  4. استبدال التخطيط لوحدك في الأماكن الصحيحة.

داخل WP-Activate.php تحتاج إلى القيام به حول نفس الشيء:

  1. احذف جميع التعليمات البرمجية الوظائف الخارجية، ولف التخطيط في وظيفة منفصلة.
  2. تغيير التخطيط في الأماكن التي يكون ذلك ضروريا.

ملف WP-Activate.php هو المسؤول عن صفحة تنشيط الحساب. كما هو الحال مع صفحة التسجيل، تحتاج إلى إنشاء قالب منفصل في الداخل للاتصال بوظيفة من ملف WP-Activate.php.

نرسل رسائل التنشيط

ترسل صفحة التسجيل خطابا إلى الزائر بالإشارة إلى تنشيط الحساب. بشكل افتراضي، هذه هي وظيفة WPMU_Signup_User_Notification () من ملف MS-FUNCHTION.PHP. يمكن استعارة وظائفها لوظائفها. السبب في الرغبة في رفض استخدام هذه الوظيفة - إنه يرسل مرجع تنشيط الحساب مع WP-Activate.php. يمكنك تعطيل هذه الميزة باستخدام عامل تصفية WPMU_Signup_User_Notification من خلال تحريك FALSE على ذلك (إذا لم يكن الأمر كذلك، فسيتم إرسال خطاب التنشيط مرتين، حسنا، في الواقع حرفين مختلفين).

وظيفة Armyofselenagomez_wpmu_signup_user_notification (مستخدم $، $ user_mail، $ key، $ meta \u003d array (). )؛ إرجاع false؛) add_filter ("wpmu_signup_user_notification"، "Armyofselegenagomez_wpmu_signup_user_notification"، 10، 4)؛

نتيجة لذلك، بدأت صفحة التسجيل في موضوع سيلينا أن تبدو أكثر نظافة وذات حريصة.

استنتاج

يحتوي الإنترنت على العديد من الطرق الأخرى غير الصحيحة للغاية لجعل نفس الشيء - إعادة توجيهات Apache، وأشكال AJAX التي لن تعمل بدون برنامج نصي جافا، وما إلى ذلك، إلخ لا أحب ذلك كثيرا، لذلك حاولت أن أفعل ذلك بشكل صحيح موقعي الخاص.

لاحظ أن ملفات التحرير يجب أن تكون قادرة على تحقيقها بعناية ومحاولة عدم الابتعاد عن المصدر إلى RankNesh، إذا تغير WordPress ملفات WP-Signup.php.php و WP-Activate.php، فهي أسهل لمقارنتها لإيجاد التغييرات وبعد

لا تنسى النظر في التعليمات البرمجية المصدر لجميع الوظائف الموضحة أعلاه من أجل التعامل الكامل مع ما وكيف يحدث ذلك داخل التعليمات البرمجية.

علاوة. الحماية ضد المرسللين

حتى أن أصغر المواقع على WordPress تخضع لتسجيل البريد المزعج. يمكنك كتابة شروط لا نهاية لها لتصفية الروبوتات، وغالبا ما تشبه محاولة لإنشاء ذكاء اصطناعي 🙂 في حالة متعدد متعدد، ساعدني إعادة توجيه منتظم في Apache، والتي عند فتحها /wp-signup.php و / WP- acitvate.php، طلب مني إصدار 404 (أنا لست خبيرا في إعداد Apache، لذلك قد لا تكون قواعدي صحيحة للغاية).

rewriteEngine على rewritebase / rewriterule ^ تسجيل الدخول - .php - rewriterule - rewriterule ^ wp-ascivate \\ .php - # تبدأ قواعد WordPress # قواعد من WordPress افتراضيا لا تلمس :) # ... # ...

P. S. أحاول وصف بعض الأشياء من طرف ثالث كما بالتفصيل قدر الإمكان، لأنه عندما بدأت، في بعض الأحيان كانت بطريقة أو بأخرى أحيانا وأشرح أشياء كثيرة. أعتقد أيضا أن نصائح صغيرة مماثلة على مواد أخرى سيتم دفع شخص ما إلى دراسة شيء جديد وتوسيع مجال المعرفة الخاصة بهم. يتم استخدام تعبيرات منتظمة في سجلات Reriterule، فهي ليست معقدة تماما، على سبيل المثال، الرمز ^ يعني بداية الخط.

يسجل وظيفة سيتم تشغيلها أثناء تنشيط البرنامج المساعد.

تولي هذه الميزة وظيفة رد الاتصال المحدد إلى ربط. activate_ (البرنامج المساعد) وهو غلاف لهذا الخطاف.

(البرنامج المساعد) في Activate_ (البرنامج المساعد) يتم استبدال باسم النسبي السماح بملف المكونات الإضافية الرئيسية. على سبيل المثال، إذا كان البرنامج المساعد موجودا: WP-Content / Plugins / SamplePlugin / Sample.php، ثم اسم هوك سيكون: Activate_SamplePamplegin / Sample.php.

من الإصدار 3.1. يتم تشغيل الخطاف فقط أثناء تنشيط البرنامج المساعد، ولا يعمل أثناء التحديث التلقائي للمكون الإضافي.

كيف تعمل

يتم تنشيط البرنامج المساعد بواسطة الوظيفة activate_Plugin () حيث يتم تشغيل تنشيط هوك (البرنامج المساعد).

تسبب وظيفة Activate_Plugin () في النواة بعد تحميل المتوسطة VP. وبعد توصل هذه الوظيفة ملف المكون الإضافي الرئيسي (وكل ما يتم تحديده فيه)، ثم من خلال ربط تنشيط وظيفة رد الاتصال المحدد. نظرا لهذا، تتوفر جميع الوظائف والفئات من المكونات الإضافية في وظيفة رد الاتصال بنا. ولكن، نظرا لأن جميع السنانير الرئيسية من WP عملت بالفعل أثناء التمهيد EN المتوسطة، فلن يتم تعليق أي أحداث إضافية على السنانير، على سبيل المثال Plugins_Loaded، لم تعد تعمل عند توصيل الملف الرئيسي المكون الإضافي. لذلك، سيتم توصيل البرنامج المساعد لدينا، ولكن ليس تماما: ليس كما يجب الاتصال عند تنشيط بالفعل.

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

كقاعدة عامة، بعد تشغيل وظيفة رد الاتصال، هناك 2 أحداث لتعليق الوظائف: Activated_Plugin والإغلاق.

للقيام بشيء غير عادي عند تنشيط البرنامج المساعد، انظر المثال 5.

شروط الاستخدام

لن تعمل الوظيفة إذا قمت بتسميتها في وقت الخطاف، على سبيل المثال، plugins_loaded، init. يجب أن يتم استدعاء الوظيفة مباشرة من الملف الرئيسي المكونات. قواعد التنشيط:

    يجب استدعاء Register_activation_hook () من ملف البرنامج المساعد الرئيسي، من حيث يوجد توجيه اسم البرنامج المساعد: ... ولا ينبغي استدعاء من أي خطاف، مثل Plugins_Loaded أو INIT.

    يجب أن تكون وظيفة الخطافة في نفس الملف ك هوك أو الاتصال مسبقا من ملف آخر.

    لا تعمل وظيفة الخطاف على الشاشة (صدى). لأن إعادة التوجيه والصدى يحدث. ولكن يمكنك استخدام الموت ().

  1. يجب تحديد المتغيرات العالمية (إن وجدت) صراحة للوصول إليها من وظيفة الخطافة.

ملاحظات حول مساحة المتغيرات

عند تنشيط البرنامج المساعد، لا يتم توصيل ملف المكون الإضافي الرئيسي في المنطقة العالمية، ولكن داخل دالة Activate_Plugin (). لذلك، المتغيرات التي تعتبر عالمية في الوضع المعتاد لتشغيل البرنامج المساعد.

لذلك، قد لا ترى الوظيفة المستخدمة في Register_Activation_Hook () المتغيرات العالمية، حتى لو أعلنتها على أنها عالمية داخل هذه الوظيفة. مثال:

$ myvar \u003d "شيء"؛ register_activation_hook (__ file__، myplugin_activate ")؛ وظيفة myplugin_active () (Myvar Global $؛ صدى $ myvar؛ // المتغير لا يساوي "شيء")

بسبب هذه الميزة، يجب دائما تحديد المتغيرات العالمية. يجب تعريف جميع المتغيرات العالمية بأنها عالمية، حتى لو تم الإشارة إلى المتغير في جسم المكون الإضافي. فقط في هذه الحالة سيتم الوصول إليها في أي مكان. مثال:

Myvar العالمية $ يشير // بوضوح إلى أن هذا هو متغير عالمي $ myvar \u003d "شيء"؛ register_activation_hook (__ file__، myplugin_activate ")؛ وظيفة myplugin_active () (Myvar Global $؛ صدى $ $ myvar؛ //\u003e شيء ما)

لا هوكس.

عائدات

باطل. لا شيء يعود.

استخدام

register_activation_hook (ملف $، وظيفة $)؛ ملف $. (سلسلة) (مطلوب) المسار إلى ملف المساعد PHP الرئيسي بما في ذلك اسم البرنامج المساعد نفسه. تستخدم عادة السحر ثابت PHP __file__. وظيفة $. (خط / صفيف / لامبدا) (مطلوب)

اسم وظيفة رد الاتصال. للفصول الدراسية، استخدم صفيف: صفيف ($ هذا، اسم الوظيفة ")؛ وبعد

ستتلقى الوظيفة متغيرا منطقي Network_Wide - ما إذا كان البرنامج المساعد يتم تنشيطه للشبكة بأكملها من المواقع، مع multiSaite.

أمثلة

#واحد. تشغيل وظيفة عند تنشيط البرنامج المساعد

نفترض أن لدينا وظيفة my_plugin_activate () في ملف البرنامج المساعد الرئيسي: WP-Content / Plugins / MyPlugin / MyPlugin.php، ثم لبدء هذه الوظيفة أثناء تنشيط البرنامج المساعد، استخدم مثل هذا الرمز:

Register_Activation_hook (__ file__، "my_plugin_active")؛ وظيفة my_plugin_activate () (// رمز التنشيط ...)

# 2. بدء طريقة الفصل

إذا كان البرنامج المساعد يستخدم فئة PHP، فسيتم إضافة رمز التنشيط ك:

register_activation_hook (__ file__، صفيف ("my_plugin"، "تثبيت"))؛ فئة my_plugin (تثبيت الدالة الثابتة () (// لا تنشئ أي إخراج هنا ...))

# 3. تشغيل طريقة الفصل من ملف منفصل

إذا كانت الفئة التي تحتوي على وظيفة التنشيط في ملف منفصل، فقم بتسجيل وظيفة التنشيط كما يلي:

fines_once __dir__. "/ class-my_plugin.php"؛ register_activation_hook (__ file__، صفيف ("my_plugin"، "on_activate_function"))؛

#four. تشغيل فئة من الفصل من الفصل

إذا كنت داخل __constress (). هام، __file__ يجب أن "انظر" إلى ملف البرنامج المساعد الرئيسي:

register_activation_hook (__ file__، صفيف ($ هذا، "your_method_name"))؛

# 5 جعل أي شيء مباشرة بعد تنشيط البرنامج المساعد

بعد تنشيط البرنامج المساعد، يتم تشغيل اثنين فقط من السنانير: Activated_Plugin وإغلاق.

عندما تحتاج إلى القيام بأي شيء مباشرة بعد تنشيط البرنامج المساعد، يمكنك إرفاق الوظيفة لهم.

عندما يكون هذا الحل غير مناسب، يمكنك استخدام خيارات WP: احفظ البيانات على الخيار ثم تحقق من توفر الخيار، والقيام بشيء ما إذا كان الخيار:

/ / ملف المكونات الرئيسية الرئيسية. ... الدالة my_plugin_activate () (// أضف خيارا ثم إذا كان ذلك هو أن تفعل أي شيء. Add_Option ("Activated_Plugin"، "Plugin-slug")؛ // هنا رمز التفعيل ...) register_activation_hook (__ file__، " my_plugin_activate ")؛ وظيفة load_plugin () (إذا كان (is_admin () && get_option ("assceded_plugin") \u003d\u003d "Plugin-slug") (// قم بإزالة الخيار الإضافي بحيث لا يعمل بعد الآن // وفعل ما تحتاجه ... Delete_Option ("Activated_Plugin")؛ // جعل أي شيء مرة واحدة، بعد تنشيط المكون الإضافي // على سبيل المثال: add_action ("INIT"، "my_init_function")؛) add_action ("admin_init"، "load_plugin")؛

خيار آخر للقيام بشيء ما أثناء تنشيط المكون الإضافي هو إنشاء حدث خاص بك مثل هذا:

وظيفة my_plugin_activate () (// تثبيت ربطك بحيث يمكنك الذهاب إليها من البرنامج المساعد Do_action نفسه ("my_plugin_active")؛) register_activation_hook (__ file__، "my_plugin_active")؛

# 6 مظاهرة أخرى لاستخدام الوظيفة

مكون إضافي صغير يوضح كيفية استخدام الوظيفة:

/ * اسم البرنامج المساعد: وصف الاختبار: اختبار * / contects_once dirname (__ file__). "/my_other_file.php"؛ / * هذا الرمز لن يعمل. يجب استدعاء ربط التنشيط من الملف الرئيسي. register_activation_hook (dirname (__ file__). "/my_other_file.php"، "my_other_function")؛ * / / / هذا هو رمز العمل. register_activation_hook (__ file__، test_activated ")؛ / * هذا هو الخيار الإعلاني الصحيح والوصول إلى المتغيرات العالمية. يجب الإعلان عن المتغيرات العالمية بوضوح. بدون هذا لن يكون لديك إمكانية الوصول إليها. * / Global $ Some_var؛ $ some_var \u003d "مهلا"؛ // وظيفة test_activated () test_activated () (// هنا $ some_var لن تكون مهلا $ global $ somvar_var؛ // وهنا دولار ستكون هناك على قدم المساواة // تعريف هذه الوظيفة في ملف "my_other_file.php" ملف "my_other_function ()؛ / * لن يعمل الخيار. إذا كنت بحاجة إلى تسجيل سجلات إلى ملف مؤقت، فاستخدم FOPEN / FWWRITE. إذا كنت ترغب في التحقق مما إذا كان هوك يعمل التنشيط، فاستخدم مخرج () داخل وظيفة الخطافة. * / Echo "Test_activated يسمى ! "؛