როგორ შევქმნათ საკუთარი სარეგისტრაციო გვერდი WordPress Multisite. Vikoristannya ბიბლიოთეკა TGM მოდული გააქტიურება WordPress თემებში Mirkuvannya გააქტიურება php

საშუალებას გაძლევთ გამოიყენოთ ერთი WordPress ინსტალაცია რამდენიმე საიტისთვის ერთდროულად. ამ შემთხვევაში, საიტი ამოიღებს მონაცემებს მონაცემთა ბაზის ცხრილიდან უნიკალური პრეფიქსით.

ცხრილები სარეგისტრაციო მონაცემებით ვაჭრებისა და პარტნიორებისთვის ქსელის ყველა საიტისთვის. ეს არის აბსოლუტური პლიუსი: ერთხელ დარეგისტრირებით, შეგიძლიათ უარი თქვათ წვდომაზე ბევრ საიტზე. უფრო მეტიც, თითოეულ საიტზე, ერთი და იგივე ანგარიშის ჩანაწერს შეიძლება ჰქონდეს განსხვავებული უფლებები. მაგალითად, ერთ საიტზე კონტრიბუტორი შეიძლება იყოს რედაქტორი, მეორეზე კი ადმინისტრატორი.

ბაგა-ბაღში WordPress დაინსტალირებულიარეგისტრაციის, ავტორიზაციის და პაროლის გადატვირთვის გვერდისთვის აჩვენეთ ფაილი wp-login.php.

  • wp-login.php - ავტორიზაცია
  • wp-login.php?action=რეგისტრაცია - რეგისტრაცია
  • wp-login.php?action=lostpassword - დაკარგული პაროლი

Multisite რეჟიმში, WordPress-ის ბირთვი იწყებს ბევრად განსხვავებულად ქცევას და როდესაც მიჰყვებით wp-login.php?action=register ინსტრუქციას, გადამისამართდებით wp-signup.php-ზე. ეს არის თქვენი ვებსაიტის რეგისტრაციის მხარე, როგორც ეს არის WordPress-ის შემთხვევაში.

თქვენი ადგილობრივი ანგარიშების რეგისტრაციის გარდა, შეგიძლიათ შექმნათ ახალი საიტი მასზე, თუ სუპერადმინისტრატორმა ჩართო ეს ფუნქცია კონფიგურირებულ პარამეტრებში (ქსელის ადმინისტრატორი → პარამეტრები → ქსელის პარამეტრები).

აქ რეგისტრაციის გვერდი არც თუ ისე კარგად გამოიყურება. ბევრი დიზაინის თემით, CSS ჩარჩოებით, როგორიცაა Bootstrap, და მრავალი სპეციფიური კლასი გვერდებზე სხვადასხვა ელემენტების სტილისთვის, მნიშვნელოვანია დაწეროთ ერთი HTML, რომელიც ყველას მოერგება.

გაგიჟება არ არის კარგი იდეა, რადგან მხარე უდანაშაულოდ გამოიყურება. ფაილი wp-signup.php მნიშვნელოვანია, თუ ბევრი დრო არ გაქვთ საიტის დეტალების დასამუშავებლად, შეგიძლიათ ფოკუსირება სხვა საკითხებზე მნიშვნელოვანი გვერდებიდა შინაარსი.

როდესაც მზად იქნებით შექმნათ თქვენი საკუთარი ოფიციალური სარეგისტრაციო საიტი, wp-signup.php იქნება შესანიშნავი ნიშანი და ინსტრუმენტი იმ ფუნქციების დიაპაზონში ადვილად წვდომისთვის, რომელსაც WordPress უზრუნველყოფს მომხმარებლების მიერ შეყვანილი მონაცემების დამუშავებისა და გადამოწმებისთვის და ახალი ღრუბლოვანი ჩანაწერების შესაქმნელად. c. .

მერეჟას მთავარი საიტი

აქციების შემდეგ WordPress ხსნის რეგისტრაციის გვერდს (wp-signup.php) ქსელის მთავარ დომენზე (საიტზე). არანაკლებ, თქვენ შეგიძლიათ შექმნათ სარეგისტრაციო გვერდები საზღვრის კანის საიტისთვის, თითქოს მათთან სუნი ასდის.

ჩვენ პრობლემას ვუყურებთ, თუ ყველა შინაარსის საიტს აქვს ერთი თემა, მაგრამ მხოლოდ ერთ მათგანს აქვს რეგისტრაციის გვერდი. საიტები გამოყოფილია ჩემით (ინგლისური და რუსული), ამიტომ რეგისტრაციის გვერდი გამოჩნდება ჩემს "მშობლიურ" საიტზე. ვინაიდან საიტები ეძღვნება სხვადასხვა თემებს, ყველაფერი დაფუძნებული იქნება იმ ფაქტზე, რომ მათ ექნებათ ერთი და იგივე განლაგება (განსაკუთრებული სიტუაცია, რომელიც დაგეხმარებათ ყველა თქვენი თემის გაერთიანებაში) ან გთხოვთ, დაამუშავოთ გვერდები ინდივიდუალურად.

ფუნქციების ალტერნატივა.php

ფაილის შეკვეთა

MU დანამატებს შეუძლიათ იმდენი ფაილის განთავსება, რამდენიც გსურთ, სტრუქტურაში, რომელიც თქვენთვის ლოგიკურია. მსურს მიახლოებით მივუდგე ამ იერარქიას:

| mu-plugins | | load.php | | selena-network | | | რეგისტრაცია | | | | plugin.php | | | ... | | | Jetpack | | | | plugin.php

ფაილი load.php შეიცავს თარგმანებს და ყველა საჭირო „დამატებას“:

// MU-plugins-ის თარგმანების ძიება load_muplugin_textdomain("selena_network", "/selena-network/languages/"); // რეგისტრაციის გვერდის ფუნქციონალობა მოითხოვს WPMU_PLUGIN_DIR . "/selena-network/signup/plugin.php"; // სხვა დანამატი // მოითხოვს WPMU_PLUGIN_DIR ...

დანამატის საქაღალდეები ინახება სელენის ქსელის დირექტორიაში. თითოეულ მათგანს აქვს საკუთარი plugin.php, რომელიც დაკავშირებულია load.php-თან. ეს იძლევა მოქნილობას და შესაძლებლობას გამორთოთ და ჩართოთ სხვა კომპონენტები სამუშაო პროექტზე, როდესაც არის საგანგებო სიტუაცია.

რეგისტრაციის გვერდი

იმის დანახვის შემდეგ, სადაც ჩვენ დავწერეთ კოდი, შეგიძლიათ გადახვიდეთ რეგისტრაციის შემდეგ გვერდზე.

მოდით შევქმნათ გვერდი მისამართზე example.org/signup/ მთავარი ინტერფეისის მეშვეობით. თქვენ შეგიძლიათ გამოიყენოთ URL, როგორც მისამართი, რომელიც შესაფერისია თქვენი პროექტისთვის.

გადამისამართება საჭირო რეგისტრაციის გვერდზე

იმისათვის, რომ WordPress-მა გაიგოს ჩვენი ახალი სარეგისტრაციო გვერდის შესახებ და თავად გადამისამართდეს მასზე, როდესაც დააწკაპუნებთ შეტყობინებაზე „რეგისტრაცია“, გამოჩნდება wp_signup_location ფილტრი. თქვენ შეგიძლიათ იპოვოთ ის wp-login.php-ის შუაში და ის თავად მიუთითებს გადამისამართებას wp-signup.php-ზე ინსტრუქციებისთვის.

შემთხვევა "რეგისტრაცია" : if (is_multisite()) (wp_redirect(apply_filters("wp_signup_location", network_site_url("wp-signup.php"))); გასვლა; // ...

როგორც გახსოვთ, რეგისტრაციის გვერდი იხსნება ქსელის მთავარ დომენზე. Network_site_url() ასევე არის ვიკიპედია ამისათვის.

დაამატეთ თქვენი ნიმუში ფილტრში mu-plugins/selena-network/signup/plugin.php, რომელიც გადაეცემა რეგისტრაციის გვერდის მისამართს ნაკადის საიტზე:

ფუნქცია selena_network_signup_page($url) ( return home_url("რეგისტრაცია"); ) add_filter("wp_signup_location", "selena_network_signup_page", 99);

selena_network - პრეფიქსი, რომელსაც ვიყენებ ყველა ფუნქციის სახელში ჩემს საიტზე MU-პლაგინების შუაში უნიკალური თანამშრომლობისთვის, რომელიც უნდა შეიცვალოს თქვენი უნიკალური პრეფიქსით. დამატებული ფილტრის პრიორიტეტია 99, რათა დანამატებმა, მაგალითად, bbPress-მა და BuddyPress-მა შეძლონ ამ მისამართის გადაწერა მასტერზე (MU დანამატები გამოიყენება უფრო ადრე, ქვედა პირველადი დანამატები, მით უმეტეს).

გთხოვთ, გაითვალისწინოთ, რომ home_url() გამოიყენება network_site_url()-ის შემცვლელად, რომელიც იძლევა სტრიმინგის საიტის მისამართს და არა ქსელის მთავარი საიტის.

ფუნქციონალობა wp-signup.php

wp-signup.php ფაილი შეიცავს უამრავ ფუნქციას და კოდს. მთლიანი სურათის უკეთ გასაგებად, შეგიძლიათ სწრაფად გაიაროთ კოდი. როგორც წესი, ინგლისურად მას კოდის დასაკეცი ეწოდება.

ფაილის თავში 1-დან 80-მდე სტრიქონიდან (4.1.1 ვერსიაში) ტარდება სხვადასხვა შემოწმება და გვერდის „დაწყება“ ნაჩვენებია get_header()-ის დახმარებით.

შემდეგი, ჩვენ გვეშინია ყველა მეთოდის და სანამ დავიწყებთ მათთან მუშაობას, ფრთხილად უნდა ვიყოთ კანის ფუნქციის გასაუმჯობესებლად. პაკეტის შუაში ხშირად გამოიყენება სხვა ფუნქციები wpmu_ პრეფიქსით, ყველა მათგანი შეგიძლიათ იხილოთ wp-includes/ms-functions.php ფაილში. მნიშვნელოვანია ამ განყოფილების გაგება და არ შეცვალოთ კოდი დამოუკიდებლად. ქვემოთ მოცემულია ძირითადი ფუნქციების აღწერა, თუ რაიმე სირთულე გაქვთ.

  • wpmu_signup_stylesheet() – აჩვენეთ დამატებითი CSS რეგისტრაციის გვერდზე.
  • show_blog_form() - საიტის რეგისტრაციის ველები (მისამართები, ხილვადობის სახელები საძიებო სისტემებისთვის).
  • validate_blog_form() - საიტისთვის შეყვანილი მისამართის გადამოწმება და დახმარებისთვის დარეკეთ wpmu_validate_blog_signup().
  • show_user_form() - მომხმარებლის რეგისტრაციის ველები (შესვლა და ელექტრონული ფოსტის მისამართი).
  • validate_user_form() - შეყვანილი შესვლისა და ელექტრონული ფოსტის მისამართის დადასტურება. გთხოვთ, დახმარებისთვის სთხოვოთ wpmu_validate_user_signup().
  • signup_another_blog() - ველები ახალი საიტების რეგისტრაციისთვის show_blog_form()-ის გამოყენებით იმ კონტრიბუტორებისთვის, რომლებიც უკვე დარეგისტრირებულნი არიან საიტზე.
  • validate_another_blog_signup() - ამოწმებს საიტის მისამართს და რეკავს validate_blog_form() დახმარებისთვის.
  • signup_user() არის მთავარი ფუნქცია რეგისტრაციის გვერდზე ველების ჩვენებისთვის.
  • validate_user_signup() - ამოწმებს შესვლას და ელფოსტის მისამართს. გთხოვთ, დახმარებისთვის მოითხოვოთ validate_user_form().
  • signup_blog() - ველები მისამართის შეყვანისთვის, საიტის ხილვადობის სახელი (სხვა სარეგისტრაციო ტერმინი) show_blog_form() გამოყენებით.
  • validate_blog_signup() - ამოწმებს შესვლას და ელფოსტის მისამართს. გთხოვთ, მისამართს და საიტს გეტყვით.

wp-signup.php ფაილის ბოლოში (ნომერი 646 4.1.1 ვერსიაში) არის რეგისტრაციის მხარის მთავარი ლოგიკა, რომელიც მიჰყვება ყველა აღწერილ მეთოდს. კოდის ეს ნაწილი არ შედის ფუნქციაში. მაგალითად, get_footer() ეწოდება.

ჩვენ ვაკოპირებთ wp-signup.php-ის ფუნქციონირებას

ქვემოთ აღწერილი იქნება wp-signup.php MU დანამატში კოპირების და ჩანგალში ცვლილებების შეტანის პროცედურა. შესაძლოა, თქვენ არ ხართ სწორ გზაზე. ფაქტობრივად, თქვენ შეგიძლიათ დაწეროთ თქვენი საკუთარი ფუნქციები ნულიდან, რათა დაამტკიცოთ და აჩვენოთ vikory კლასის ფორმები, ვიდრე ორიგინალური ფუნქციები. ჩემი აზრით, wp-signup.php-ს უკვე აქვს ყველა საჭირო ლოგიკა ჩვენი გვერდისთვის, უბრალოდ მცირე ცვლილებები უნდა შევიტანოთ.

WordPress-ის განახლებისას, wp-signup.php იცვლება, მაგრამ ეს არ ნიშნავს იმას, რომ მისი გამოშვებისას თქვენ მოგიწევთ თქვენი „ფორკის“ სინქრონიზაცია. wp-signup.php-ის შუაში არსებული ფუნქციები არსებითად ეხება HTML-ის გამომავალს, მონაცემთა გადამოწმებას, ღრუბლოვანი ჩანაწერების და საიტების შექმნას, რომლებიც განიხილება wpmu_ პრეფიქსის მქონე მეთოდებით, რომლებიც დეკლარირებულია ms-ში. ფუნქციები.php.

მოდით შევხედოთ შექმნის ფუნქციებს, როგორიცაა რეგისტრაციის ფორმის ჩვენება გვერდზე. ამისათვის დააკოპირეთ wp-signup.php WordPress root-დან mu-plugings/selena-network/signup/. მოდით დავაკავშიროთ იგი mu-plugins/selena-network/signup/plugin.php-ში).

საჭიროა WPMU_PLUGIN_DIR. "/selena-network/signup/wp-signup.php";

კოპირებული ფაილის თავიდანვე ვხედავთ ყველა საჭირო და არასაჭირო გადამოწმებას. 4.1.1 ვერსიას არ აქვს ყველა კოდი 1-დან 80-მდე.

ახლა ჩვენ მზად ვართ შევქმნათ მთავარი ფუნქცია რეგისტრაციის ფორმის ჩვენებისთვის. ამ მიზნით, დატენვის მთელი ლოგიკა 646 და ფაილის ბოლომდე გადადის ფუნქციაზე სახელად selena_network_signup_main. მაგალითად, ჩვენ შეგვიძლია ვნახოთ ორი დახურვის აპლიკაცია

(722 და 723 რიგები), ასევე get_footer() .

selena_network_signup_main()-ის წარმატებულ შექმნას თავიდანვე აქვს გლობალური ცვლილება active_signup, რომელიც გამოიყენება ამ ფაილის ყველა სხვა მეთოდისთვის. და დავამატეთ დაწკაპუნება გვერდზე before_signup_form, რომელიც ჩვენ ამოვიღეთ ფაილის თავიდანვე.

ფუნქცია selena_network_signup_main() ( გლობალური $active_signup; do_action("fore_signup_form"); // ... )

ახლა თქვენ აღარ შეგიძლიათ შეცვალოთ განლაგება ყველა ადგილას, სადაც საჭიროა და რეგისტრაციის გვერდი მზად არის.

სარეგისტრაციო ფორმის პროექტი

აქ არის მინიმუმ ორი ვარიანტი. მეტი ხელით გზა— შექმენით მოკლე კოდი და განათავსეთ იგი გვერდზე ძირითადი რედაქტორის საშუალებით.

// შექმენით shortcode network_signup add_shortcode("network_signup", "selena_network_signup_main");

კიდევ ერთი ვარიანტია შექმნათ page-signup.php გვერდის შაბლონი საბავშვო თემების საქაღალდეში. სიტყვის "რეგისტრაციის" ნაცვლად შეგიძლიათ გამოიყენოთ გვერდზე განთავსებული უნიკალური ID. შუაში დაამატეთ შაბლონს საჭირო განლაგება და შექმენით დააწკაპუნეთ selena_network_signup_main() საჭირო ადგილას.

შედეგად, ჩემი რეგისტრაციის გვერდი ბევრად უკეთესი და სუფთა გახდა.

გააქტიურების გვერდი

WordPress-ის თანახმად, გონივრულია მულტისაიტში რეგისტრაციის პროცესის ორ ეტაპად დაყოფა - საიტზე არსებული ფორმის შევსება და ღრუბლოვანი ანგარიშის გააქტიურება, როდესაც მიდიხართ გაგზავნილი შეტყობინებების მისაღებად. ელექტრონული ფურცელი. წინა განყოფილებაში შექმნილი ფორმის შევსების შემდეგ, WordPress დაამატებს ფურცელს რამდენიმე ინსტრუქციით და ინსტრუქციებით ღრუბლოვანი ანგარიშის გასააქტიურებლად.

აქტივაციის გვერდი ნაჩვენებია wp-activate.php ფაილში, რომელიც მდებარეობს WordPress root დირექტორიაში. wp-activate.php ასევე შეიძლება მთლიანად შეიცვალოს. პროცესი მსგავსია, რაც ჩვენ უკვე გავაკეთეთ wp-signup.php-სთვის.

შევქმნათ გვერდი example.org/activate/ სტანდარტული ინტერფეისის საშუალებით. მისამართიდან გამომდინარე, აირჩიეთ URL, რომელიც თქვენთვის შესაფერისია.

დააკოპირეთ wp-activate.php ფაილი თქვენს MU-დანამატში და დააკავშირეთ იგი mu-plugins/selena-network/signup/plugin.php.

საჭიროა WPMU_PLUGIN_DIR. "/selena-network/signup/wp-activate.php";

შუაში არც ისე ბევრია ერთად, wp-signup.php ადმინზე. ფაილი ინახება ერთ ოპერაციაში - ის ააქტიურებს ღრუბლოვან ჩანაწერს, თუ ნაპოვნია სწორი გასაღები და აჩვენებს შეტყობინებას ოპერაციის გაუქმების ან წარმატებით დასრულების შესახებ.

ჩვენ ვხედავთ ყველა არასაჭირო შემოწმებას და ვითხოვთ - 1-დან 69 მწკრივამდე WordPress 4.1.1-ში. მაგალითად, ავიღოთ ზარი get_footer(). ამის ნაცვლად, ის, რაც აკლია, გადაეცემა ფუნქციას selena_network_activate_main().

მნიშვნელოვანია აღინიშნოს, რომ WP_INSTALLING მუდმივი იყო ნახსენები აქ WordPress-ის წინ (wp-load.php). ნათელია, რომ WordPress არ იყენებს დანამატებს.

როგორც სარეგისტრაციო მხარის შემთხვევაში, საჭიროების შემთხვევაში არ არის საჭირო განლაგების კორექტირება. თქვენ ასევე შეგიძლიათ შეცვალოთ ნაჩვენები შეტყობინების ტექსტი (ამ პარამეტრში არ დაგავიწყდეთ თქვენი MU-პლაგინების ტექსტური დომენის დამატება ყველა თარგმანის ფუნქციისთვის, გარდა ინსტალაციებისა).

დასრულებული ფუნქცია შეიძლება გამოსახული იყოს გვერდის უკანა მხარეს მოკლე კოდის ან მიმდებარე შაბლონის საშუალებით საბავშვო თემაში.

აქტივაციის ფურცლები სწორი ინსტრუქციებით

აქტივაციის გვერდი მზად არის წასასვლელად, მაგრამ WordPress-მა არ იცის ამის შესახებ და, როგორც ადრე, მძლავრი აქტივაციის გვერდი გაგზავნილია wp-activate.php-ზე. wp-signup.php-ში არ არის ფილტრი, რომელიც საშუალებას გაძლევთ შეცვალოთ მისამართი. შემდეგ თქვენ უნდა დაწეროთ თქვენი ფუნქცია, რათა გადატვირთოთ ფურცელი სწორი ინსტრუქციებით.

WordPress-ის რეგისტრაციის გვერდზე ფორმის შევსების მომენტში დააჭირეთ wpmu_signup_ მომხმარებელი() ან wpmu_signup_ ბლოგი() დამოკიდებულია რეგისტრაციის ტიპზე. ორივე ფუნქცია ქმნის ახალ ჩანაწერს wp_signups ცხრილში, რომელიც ავსებს საჭირო ადგილებს, რომელთა შორის არის ღრუბლოვანი შესვლის აქტივაციის გასაღები.

რის შემდეგაც ფუნქციაში გამოიძახება wpmu_signup_ მომხმარებელი _notification() ან wpmu_signup_ ბლოგი _შეტყობინება(). ორივე ფუნქციას აქვს მსგავსი ფუნქციონირება - ისინი ქმნიან და ააქტიურებენ გასააქტიურებლად გაგზავნილ სიებს, მაგრამ ასევე იღებენ სხვადასხვა არგუმენტებს. ორივეს აქვს ფილტრები სითხის შესაგროვებლად.

თუ (! apply_filters("wpmu_signup_user_notification", $user, $user_email, $key, $meta)) დააბრუნებს false;

ღრუბლოვანი ანგარიშების გასააქტიურებლად თქვენს ბლოგზე:

თუ (! apply_filters("wpmu_signup_blog_notification", $domain, $path, $title, $user, $user_email, $key, $meta)) ( დაბრუნება false; )

თქვენ არ გჭირდებათ დაწეროთ თქვენი დეტალები, რომელთა შუაში შეგიძლიათ დაამატოთ სიები wp_mail()-ის საშუალებით და, მაგალითად, უნდა შეიყვანოთ false, რათა WordPress-მა არ გამოაგზავნოს აქტივაციის ორი ფურცელი - ერთი თქვენი და სხვა - ინსტრუქციების სია wp-activate.php .

ფუნქცია selena_network_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) (// სათაურის, ტექსტის და ფურცლის სათაურის გენერირება // ... // გაგზავნეთ ფურცელი ან დაამატეთ Cron სამუშაო ფურცლის გასააქტიურებლად wp_mail( $user_email , wp_specialchars_decode ($subject), $message, $message_headers);// დააყენეთ false-ზე, რათა თავიდან აიცილოთ WordPress-ის აქტივაციის ფურცლის გაგზავნა და დააბრუნოს false; ) add_filter("wpmu_signup_user_notification", "selena_network_wpmu_sign"

თუ ფურცლებს გადატვირთავთ SMTP სერვერის საშუალებით, ან რეგისტრაციების რაოდენობა ძალიან დიდია, ფრთხილად უნდა იყოთ, რომ ფურცლები არ გადააჭარბოთ. თქვენ ასევე შეგიძლიათ დაამატოთ Cron სამუშაო WordPress Cron-ში.

wp-signup.php და wp-activate.php წვდომა დაბლოკილია

რეგისტრაციისა და აქტივაციის გვერდების დახურვის შემდეგ შეიძლება დაგჭირდეთ „ორიგინალების“ დახურვა. მაგალითად, რეგისტრაციის გვერდზე არის დამატებითი ველები, რომლებიც უნდა შეივსოს. ასევე, WordPress-ის ბევრი საიტი ექვემდებარება სპამის რეგისტრაციას.

თქვენ შეგიძლიათ ორივე პრობლემის გადაჭრა ერთი მოქმედებით, თუ სთხოვთ Apache-ს დააბრუნოს 404 ყოველ ჯერზე, როდესაც ცდილობთ ამ გვერდების გახსნას. ამისთვის ასევე დაგჭირდებათ რამდენიმე დამატებითი RewriteRules-ის ჩაწერა კონფიგურაციის ფაილში ან .htaccess.

RewriteEngine On RewriteBase / # რეგულარული გამონათქვამების ცოდნა არასოდეს გამოტოვებთ :) RewriteRule END WordPress

ვისნოვოკი

ინტერნეტში WordPress-თან დაკავშირებული ამ და მრავალი სხვა პრობლემისთვის არის უმტკივნეულო გამოსავალი. მაგალითად, რეგისტრაციისა და აქტივაციის გვერდების შესაქმნელად, თქვენ უნდა გადაწეროთ ორიგინალი wp-signup.php და wp-activate.php. ძნელია მუშაობა, რადგან WordPress-ის განახლებისას თქვენ დახარჯავთ ფაილებში განხორციელებულ ყველა ცვლილებას და ვერ შეძლებთ დახმარებისთვის შეამოწმოთ ბირთვის მთლიანობა.

თუ რაიმე დამატებით ფუნქციას განავითარებთ, რამდენიმე საათი უნდა დახარჯოთ ყველაფრის გასაგებად, რაც მოყვება WordPress-ს. რისთვისაც საჭირო ინსტრუმენტები არ არის საჭირო.

P.S.

ახალი წევრებისთვის სხვადასხვა როლების ავტომატურად მინიჭებისთვის, შეგიძლიათ გამოიყენოთ Multisite User Management მოდული.

თუ სტატიის წაკითხვის შემდეგ სარეგისტრაციო და გააქტიურების გვერდების გახსნისას შეგექმნათ პრობლემები კვებასთან ან სირთულეებთან დაკავშირებით, გთხოვთ, რა თქმა უნდა შეავსოთ კომენტარი ჩვენთან.

27.03.2015 27.03.2015

WordPress საცალო ვაჭრობა. გიყვართ წესრიგი ყველაფერში და დააფასეთ ახალი იარაღები. შთაგონებულია Symfony კომპონენტების არქიტექტურით.

  • დღეს ჩვენ გადავხედავთ კრიტიკული 1 დღიანი დაუცველობის ექსპლუატაციას პოპულარულ CMS Joomla-ში, რომელიც ბოლო წლებში გამოჩნდა ინტერნეტში. გთხოვთ გაითვალისწინოთ განსხვავება რიცხვებთან CVE-2016-8869, CVE-2016-8870і CVE-2016-9081. გამოიყენე ერთი შომატოჩკა კოდის სამი მილი, იაკი პიატ დოვგიხ როკივას ცელქი ფრამვარკი თვალში, შჩობ პოტიმ ვირვატი ნებაზე, ქაოსის მოტანა, ზლამანი, ეს არ არის იგივე, არა ჩომუვაჩივებში, ყველაზე კაშკაშა და მეგობრულმა მუშებმა, რომელთა თვალები მონიტორების შუქზე წითელია და კლავიატურა პურის ნამსხვრევებით არის გაჟღენთილი, შეძლეს მძვინვარებული ბოროტი სულების ძახილი და თავები შენზე დაადონ. აფიქსირებს.

    გაფრთხილება

    ყველა ინფორმაცია მოცემულია მხოლოდ საინფორმაციო მიზნებისთვის. არც რედაქტორებს და არც ავტორს არ ეკისრებათ პასუხისმგებლობა ამ სტატიის მასალებიდან გამოწვეულ შესაძლო ზიანს.

    რატომ დაიწყო ეს ყველაფერი

    2016 წლის 6 ივნისს დემის პალმამ შექმნა თემა Stack Exchange-ზე, რომელშიც მან თქვა: რატომ ჯანდაბა, Joomla-ს 3.6 ვერსიაში არის ორი მეთოდი კლიენტების დარეგისტრირებისთვის ახალი სახელის რეგისტრით()? პირველი მდებარეობს UsersControllerRegistration კონტროლერში, ხოლო მეორე არის UsersControllerUser-ში. ჩვენ გვინდა ვიცოდეთ, რომ ეს მეთოდი UsersControllerUser::register() ბოროტად გამოიყენება, მაგრამ ეს უბრალოდ ევოლუციური ანაქრონიზმია, რომელმაც დაკარგა ძველი ლოგიკა. ეს გამოწვეულია იმით, რომ ეს მეთოდი არ ერევა ყოველდღიურ მოვლენებში, მაგრამ შეიძლება დაგისვათ დამატებითი ჩამოყალიბებული შეკითხვა. ამ მიზნით, ჩვენ ვუპასუხეთ დეველოპერს მეტსახელით itoctopus, რომელმაც დაადასტურა, რომ პრობლემა ნამდვილად არსებობს. І გაგზავნით შეტყობინება Joomla-ს გადამყიდველებს.

    გარდა ამისა, წიპწები განვითარდა ყველაზე მოწინავე გზით. 18 ივნისს Joomla-ს დისტრიბუტორებმა მიიღეს მოხსენება დემისისგან, რომელმაც იმ დროს გაგზავნა PoC, რომელიც კლიენტის რეგისტრაციის საშუალებას იძლევა. თქვენ გამოაქვეყნეთ ჩანაწერი თქვენს ვებსაიტზე, სადაც დაადასტურეთ, რომ თქვენს დისკზე პრობლემა იპოვეთ. რა დღეში მიდიხარ? Ახალი ვერსია Joomla 3.6.3, რომელიც ჯერ კიდევ ხელს უშლის კოდის დაღვრას.

    ამის შემდეგ, დავიდე ტამპელინი ავრცელებს შეცდომას იმ დონემდე, რომ დაარეგისტრიროს არა მხოლოდ უბრალო ბუღალტერი, არამედ ადმინისტრატორი. უკვე 21 წელია, ჯომლას უსაფრთხოების ჯგუფმა მიიღო ახალი საქმე. უკვე არავინ იცის პრივილეგიების წინსვლის შესახებ. ამ დღესვე, Joomla-ს ვებგვერდზე გავრცელდა განცხადება იმის შესახებ, რომ სამშაბათს, 25-ში, გამოვა ახალი ვერსია სერიული ნომრით 3.6.3, რომელიც ასწორებს კრიტიკულ გაჟონვას სისტემის ბირთვში.

    Joomla Security Strike Team-ის 25-ე ეპიზოდი ვიცი პრობლემას დავტოვებ, რომელიც ქმნის დემის შმატოკის კოდის გამოვლინებებს. შემდეგ, Joomla-ს ოფიციალური საცავების სათაურში არის 21 ღონისძიების კომიტეტი შეუმჩნეველი სახელით Prepare 3.6.4 Stable Release, რომელიც ასწორებს საშინელ შეცდომას.

    ამ გამოსვლის შემდეგ, ინდივიდების რაოდენობა უკავშირდება დისტრიბუტორების ურთიერთდაკავშირებას - ისინი იწყებენ დაღვრას და მზადებას შერწყმისთვის.

    27 ივნისს მკვლევარმა ჰარი რობერტსმა Xiphos Research-ის საცავში შეიტანა მზა ექსპლოიტი, რომელსაც შეუძლია PHP ფაილის იმპორტი სერვერზე CMS გამოშვებიდან.

    დეტალები

    ისე, პრეისტორია დასრულდა, გადავიდეთ ბოლო ნაწილზე - ჩამოსხმის ანალიზზე. მას შემდეგ, რაც მე დავაყენე Joomla 3.6.3, როგორც ბოლო ვერსია, მწკრივის ყველა ნომერი შესაბამისი იქნება ამ ვერსიისთვის. და ფაილებისკენ მიმავალი ყველა გზა, რომელიც შემდგომ დაგჭირდებათ, მითითებულია დაინსტალირებული CMS-ის ძირში.

    ჩვენ დიდი ხანია ვიცით, რომ დემის პალმამ იცის, რომ სისტემაში კლიენტის რეგისტრაციის დასრულების ორი მეთოდი არსებობს. პირველი მდებარეობს CMS ფაილში /components/com_users/controllers/registration.php:108. მეორე (ის, რომელზეც უნდა დავაჭიროთ) ცხოვრობს /components/com_users/controllers/user.php:293-ში. მოდით გავაკვირვოთ ახალი უფრო ახლოს.

    286: /** 287: * მომხმარებლის რეგისტრაციის მეთოდი. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: */ 293: public function register() 294: ( 295: JSession::checkToken("post") ან jexit(JText::_ ("JINVALID_TOKEN"));... 300: // მიიღეთ ფორმის მონაცემები.301: $data = $this->input->post->get("user", array(), "array"); . 315: $return = $model->validate($form, $data);316: 317: // შეამოწმეთ შეცდომები. / დაასრულეთ რეგისტრაცია 346: $return = $model->register($data);

    აქ მე დავკარგე მეტი რიგები. ჩამოსხმის მეთოდის უახლესი ვერსია შეგიძლიათ იხილოთ Joomla-ს საცავში.

    მოდით გავარკვიოთ, რა ხდება კორისტუვაჩის თავდაპირველი რეგისტრაციის დროს: როგორ ხდება მონაცემების იძულება და როგორ წარმოიქმნება სუნი. თუ კლიენტების რეგისტრაცია ჩართულია პარამეტრებში, ფორმა შეგიძლიათ იხილოთ მისამართზე http://joomla.local/index.php/component/users/?view=registration.


    კორისტუვაჩის რეგისტრაციის ლეგიტიმური მოთხოვნა ჰგავს შემდეგ ეკრანის სურათს.


    com_users კომპონენტი პასუხისმგებელია კლიენტებთან მუშაობაზე. შეცვალეთ მნიშვნელობა ჩანაწერის ამოცანის პარამეტრზე. ფორმატი არის $controller.$method. მოდით შევხედოთ ფაილის სტრუქტურას.

    მამის სცენარის სახელები კონტროლერებიისინი მიუთითებენ იმ კონტროლერების სახელებს, რომლებსაც დაუკავშირდნენ. ასე რომ, რადგან ჩვენ გვაქვს $controller = "რეგისტრაცია" ერთდროულად, მაშინ ფაილი გამოიძახება რეგისტრაცია.phpეს არის register() მეთოდი.

    Uvaga, საკვები: როგორ გადავიტანოთ რეგისტრაციის დამუშავება ადგილზე კოდით? შენ, იმღერე-სიმღერა, უკვე გამოიცანი. მიმდინარე და რეალური მეთოდების სახელები გაერთიანებულია (რეგისტრაცია), ამიტომ უნდა შევცვალოთ დაწკაპუნებული კონტროლერის სახელი. და სად ვართ ცნობილი, როგორც კონფლიქტების მაკონტროლებელი? მართალია, ფაილი user.php. შეიყვანეთ $controller = "მომხმარებელი". ყველაფერს ერთდროულად ვაგროვებთ და ვირჩევთ task=user.register. ახლა რეგისტრაციის მოთხოვნა მუშავდება ჩვენთვის საჭირო მეთოდით.


    კიდევ ერთი რაც უნდა გავაკეთოთ არის მონაცემების სწორი ფორმატით გაგზავნა. აქ ყველაფერი მარტივია. Legitimate register() ამოწმებს ჩვენთვის მასივს სახელად jform, რომელშიც ჩვენ გადავცემთ სარეგისტრაციო მონაცემებს - სახელი, შესვლა, პაროლი, ელფოსტა (დივ. სკრინშოტი მძიმით).

    • /components/com_users/controllers/registration.php: 124: // მიიღეთ მომხმარებლის მონაცემები. 125: $requestData = $this->input->post->get("jform", array(), "array");

    ჩვენი კლიენტი იღებს ამ მონაცემებს მომხმარებლის სახელწოდებით მასივიდან.

    • /components/com_users/controllers/user.php: 301: // მიიღეთ ფორმის მონაცემები. 302: $data = $this->input->post->get("user", array(), "array");

    ამიტომ, თქვენ შეგიძლიათ შეცვალოთ ყველა პარამეტრის სახელი jfrom-დან მომხმარებელამდე.

    ჩვენი მესამე ეტაპი არის CSRF მოქმედი ჟეტონის აღმოჩენა, ამიტომ ამის გარეშე რეგისტრაცია არ იქნება.

    • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") ან jexit(JText::_("JINVALID_TOKEN"));

    ეს ჰგავს MD5 ჰეშს და შეგიძლიათ მიიღოთ ის, მაგალითად, ავტორიზაციის ფორმიდან საიტზე /index.php/component/users/?view=login.


    ახლა თქვენ შეგიძლიათ შექმნათ koristuvachs მეშვეობით საჭირო მეთოდი. როგორც კი ყველაფერი მოგვარდება, მაშინ მე ვკვდები - თქვენ ფრთხილად იყენებდით დაღვრას CVE-2016-8870„ახალი ბუღალტერების რეგისტრაციის ნებართვების ყოველდღიური შემოწმება“.

    ღერძი ასე გამოიყურება register() მუშა მეთოდში UsersControllerRegistration კონტროლერიდან:

    • /components/com_users/controllers/registration.php: 113: // თუ რეგისტრაცია გამორთულია - გადამისამართება შესვლის გვერდზე. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= შესვლა", ყალბი)); 117: 118: დაბრუნება ყალბი; 119: )

    და ასე მოჩხუბართათვის:

    • /components/com_users/controllers/user.php:

    ჰო, არა.

    იმისათვის, რომ დაგეხმაროთ ამ ძალიან სერიოზული პრობლემის გაგებაში, მოდით ჩამოვაყალიბოთ და უბრალოდ ავუხსნათ, თუ როგორ მუშაობს ის კოდის სხვადასხვა განყოფილებებზე. ნივთების ღერძი, რომელიც მიუთითებს მომხმარებლისთვის გაგზავნილი მონაცემების გადამოწმებაზე სამუშაო მეთოდით:

    გაფართოება აღარ არის ხელმისაწვდომი მონაწილეებისთვის

    ვარიანტი 1. გადადით "საიტზე" საიტზე არსებული ყველა მასალის წასაკითხად

    საზოგადოებაში წევრობა განსაზღვრული ვადის განმავლობაში მოგცემთ წვდომას ჰაკერების ყველა მასალაზე, გაზრდით შემნახველ ანგარიშს და მოგცემთ დაგროვების საშუალებას პროფესიული რეიტინგი Xakep ქულა!

    ჩვენ ვქმნით საბაჟო რეგისტრაციის გვერდს მრავალსაიტისთვის სტანდარტული wp-signup.php-ის ნაცვლად.

    WordPress-ის სარეგისტრაციო ნაგულისხმევი გვერდისთვის (ავტორიზაცია, პაროლის აღდგენა) შეიყვანეთ ფაილი wp-login.php.

    • /wp-login.php - ავტორიზაცია
    • /wp-login.php?action=register - რეგისტრაცია
    • /wp-login.php?action=lostpassword - დაკარგული პაროლი

    მრავალსაიტისთვის, wp-login.php სრულიად განსხვავებულია. ასე რომ, როდესაც აპირებთ /wp-login.php?action=რეგისტრაციას WordPress მრავალსაიტზე, შექმენით გადამისამართება /wp-signup.php მხარეს. ბევრი თემისთვის მხარე არც თუ ისე მიმზიდველად გამოიყურება, ამიტომ ძალას ვკარგავ.

    მერეჟას მთავარი საიტი

    აქციების შემდეგ WordPress ხსნის რეგისტრაციის გვერდს (wp-signup.php) ქსელის მთავარ დომენზე (საიტზე). დაიცავით, თქვენ შეგიძლიათ შექმნათ გვერდიგვერდ რეგისტრაციის გვერდი კანის საიტისთვის, რადგან ისინი შეიძლება განსხვავდებოდეს ერთმანეთისგან. ჩვენ პრობლემად მიგვაჩნია, თუ ყველა ვებსაიტს აქვს საკუთარი სარეგისტრაციო გვერდი, მაგრამ ხდება იგივე თემის ვიკორიზაცია და ვებსაიტებს უფრო მეტად ეპყრობიან, ვიდრე ჩემსას. თუ იყენებთ სხვადასხვა თემებს, მოგიწევთ მეტი კოდის დაწერა.

    functions.php?

    არა. როგორც ჩანს, ამ ფაილში შეგიძლიათ გამოიცნოთ WordPress-ის შესახებ ნებისმიერი სტატიიდან. ჩვენი აზრით, იმის გაგებით, რომ რიგ საიტებზე სადაზღვევო პრეტენზიების დარეგისტრირების ფუნქციონალურია, შესაძლებელია მისი ჩართვა MU-პლაგინებში, რომელიც ჩართული იქნება ნებისმიერი საიტის შექმნაში.

    ლირიული მიდგომა

    მნიშვნელოვანია აღინიშნოს, რომ MU დანამატები გამოიყენება ორიგინალურ დანამატებამდე და სანამ WordPress-ის ბირთვი უფრო მნიშვნელოვანი გახდება, ამიტომ გარკვეული ფუნქციების გამოყენებამ შეიძლება გამოიწვიოს ფატალური პრობლემები PHP-თან დაკავშირებით. ამ სახის "ადრეულ" მოზიდვას აქვს თავისი უპირატესობები. ვთქვათ, საბოლოო ჯამში, თქვენ არ შეგიძლიათ ინერვიულოთ რაიმე ქმედებაზე, რომელიც უნდა გაკეთდეს მანამ, სანამ functions.php ფაილი მათთან ასოცირდება. ამის მაგალითი შეიძლება იყოს მოქმედებები Jetpack მოდულით jetpack_module_loaded_related-posts სახით (related-posts არის მოდულის სახელი), რომელიც დაგეხმარებათ აკონტროლოთ მოდულების აქტივობა Jetpack-ში. შეუძლებელია ქმედება „დაერთოს“ ფაილს მათთან ერთად, ასე რომ, თუ მოქმედება უკვე შექმნილია მათ მიერ შეძენის წინ, დანამატები უფრო ადრე იქნება შეძენილი. შეგიძლიათ გაოცდეთ WordPress საიტის მაგარი სურათით კოდექსის Action Reference გვერდზე.

    ფაილის შეკვეთა

    MU დანამატებს შეუძლიათ შეიტანონ ნებისმიერი რაოდენობის ფაილი ან ნებისმიერი სტრუქტურა, რომელიც თქვენთვის ლოგიკურია. მსურს მიახლოებით მივუდგე ამ იერარქიას:

    |-mu-plugins |-|-load.php |-|-|-selena-network |-|-|-|-რეგისტრაცია |-|-|-|-|-plugin.php |-|-|-| -|-... |-|-|-|-jetpack |-|-|-|-|-plugin.php

    ფაილი load.php მოიცავს ყველა საჭირო დანამატს ჩვენი ქსელისთვის:

    // Load Translates ყველა დანამატისთვის load_muplugin_textdomain ("selena_network", "/selena-network/languages/"); // ქსელის რეგისტრაცია მოითხოვს WPMU_PLUGIN_DIR. "/selena-network/signup/plugin.php"; // სხვა დანამატები // საჭიროებს WPMU_PLUGIN_DIR ...

    selena-network საქაღალდის შუაში არის დანამატის საქაღალდეები, თითოეულს აქვს თავისი plugin.php, რომელსაც ჩვენ ვაერთიანებთ load.php-ში. ეს იძლევა მოქნილობას და მეტყველების მოქმედებების სწრაფად ჩართვისა და გამორთვის უნარს.

    რეგისტრაციის მხარის მისამართები

    რეგისტრაციის გვერდის მისამართის შესაყვანად გამოიყენეთ wp_signup_location ფილტრი. თქვენ შეგიძლიათ იპოვოთ იგი wp-login.php ფაილის შუაში და ის თავად მიუთითებს გადამისამართებაზე wp-signup.php.

    შემთხვევა "რეგისტრაცია" : if (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) ( return home_url () . "/signup/"; ) add_filter ( "wp_signup_location", "selena_network_signup_page", 99);

    selena_network - პრეფიქსი, რომელსაც ვიყენებ ყველა ფუნქციის სახელში ჩემს საიტზე არსებული MU-პლაგინების შუაში კონფლიქტის თავიდან ასაცილებლად, რომელიც უნდა შეიცვალოს თქვენი უნიკალური პრეფიქსით. დამატებული ფილტრის პრიორიტეტია 99, ასე რომ დანამატებმა, როგორიცაა bbPress და BuddyPress, შეუძლიათ გადაწერონ ეს მისამართი საკუთარ დომენში (MU დანამატები უფრო ადრე იზიდავენ, ქვედა პირველადი დანამატები, მით უმეტეს). გთხოვთ, გაითვალისწინოთ, რომ home_url() გამოიყენება network_site_url()-ის ნაცვლად იმავე დომენზე რეკლამის განმთავსებლის გასათიშად. მისამართის მსგავსად შეგიძლიათ vikoristovat be-yak URL მისამართი.

    მხარის შექმნა

    ახლა მოდით შევქმნათ გვერდი მისამართით site.com/signup/ მთავარი ინტერფეისის მეშვეობით და ჩვენს ქალიშვილს აქვს ჩვენი შაბლონი. ახალი ისტორიები- page-signup.php. სიტყვის რეგისტრაციის ნაცვლად, შეგიძლიათ გამოიყენოთ უნიკალური ID.

    ახალი შაბლონის შუაში, რეგისტრაციის ფორმის საჩვენებლად უნდა გამორთოთ selena_network_signup_main() ფუნქცია.

    გთხოვთ გაითვალისწინოთ, რომ შაბლონების გამოყენების მთელი პროცესი არ არის რთული და ამის ნაცვლად შეგიძლიათ შექმნათ თქვენი საკუთარი მოკლე კოდი, რომელიც ასევე შეიძლება გამოიყენოთ selena_network_signup_main() ფუნქციით.

    wp-signup.php და wp-activate.php

    ახლა გადავიდეთ შექმნის ფუნქციაზე, რომელიც არის რეგისტრაციის ფორმის ჩვენება. ამ მიზნით, ჩვენ ვაკოპირებთ ფაილებს wp-signup.php და wp-activate.php WordPress root-დან mu-plugings/selena-network/signup/ (და არ დაგავიწყდეთ მათი დაკავშირება შუა mu-plugins-ში/). selena-network/signup/plugin.php) . ფაილებთან შემდგომი მანიპულაციების აღწერა რთულია, ასე რომ თქვენ მოგიწევთ მათი გაკეთება. მე უბრალოდ აღვწერ რა გჭირდებათ თქვენი პროექტის გამომავალი ფაილების შესაქმნელად და გამოქვეყნებისთვის:

    1. ფაილის ზედა ნაწილში წაშალეთ ყველა მოთხოვნა, დააწკაპუნეთ ფუნქციებზე და სხვა კოდსა და ფუნქციებზე.
    2. გადაარქვით ყველა ფუნქცია სახელებს უნიკალური პრეფიქსების დამატებით.
    3. wp-signup.php კოდის ქვედა ნაწილი გადაიტანეთ selena_network_signup_main ფუნქციაში და ჩაწერეთ გლობალური $active_signup; .
    4. შეცვალეთ განლაგება ვლასნათი საჭირო ადგილებში.

    wp-activate.php-ის შუაში თქვენ უნდა შექმნათ მსგავსი რამ:

    1. წაშალეთ ყველა კოდი ფუნქციებით, გადაიტანეთ განლაგება ფუნქციის გარშემო.
    2. შეცვალეთ განლაგება იმ ადგილებში, სადაც ეს აუცილებელია.

    wp-activate.php ფაილი წარმოადგენს ღრუბლის ანგარიშის გააქტიურების გვერდს. რაც შეეხება რეგისტრაციის მხარეს, აუცილებელია თარგის შექმნა, რომლის შუაში დააწკაპუნეთ ფუნქციას wp-activate.php ფაილიდან.

    აქტივაციის სია გადატვირთულია

    რეგისტრაციის გვერდი აიძულებს მოთხოვნის ფორმის წარდგენას ღრუბლოვანი რეგისტრაციის გასააქტიურებლად. ამას ამუშავებს wpmu_signup_user_notification() ფუნქცია ms-functions.php ფაილიდან. თქვენ შეგიძლიათ მივანიჭოთ ეს ფუნქცია თქვენს საკუთარ ფუნქციას. მიზეზი, რის გამოც თქვენ უნდა იცოდეთ ეს ფუნქცია არის ის, რომ ის აგზავნის აქტივაციის შეტყობინებას ღრუბლოვან ანგარიშზე wp-activate.php-დან. თქვენ შეგიძლიათ „ჩართოთ“ ეს ფუნქცია დამატებითი ფილტრის wpmu_signup_user_notification-ის გამოყენებით, რომელიც დააბრუნებს false-ს (რადგან თქვენ ვერ შექმნით ერთს, აქტივაციის ფურცელი გაიგზავნება ორ, კარგი, რეალურად ორ სხვადასხვა ფურცელზე).

    ფუნქცია armyofselenagomez_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) (// ... // ფუნქციის კოდი wpmu_signup_user_notification() wp_mail($user_email, wp_specialchars_return$s_ubsede;) "wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

    შედეგად, სელენას თემაზე სარეგისტრაციო გვერდი ბევრად უფრო სუფთა და მოწესრიგებული გახდა.

    ვისნოვოკი

    ინტერნეტში არ არსებობს სხვა შეუსაბამო გზა ამის გასაკეთებლად - Apache გადამისამართებები, AJAX ფორმები, რომელთა დამუშავება შეუძლებელია. ჯავა სკრიპტიდა ა.შ. ეს ყველაფერი ჩემთვის საკმარისი არ იყო, ამიტომ ვცდილობდი მაქსიმალურად სწორად გამომემუშავებინა საიტზე.

    ვაფასებ, რომ ფაილები ფრთხილად უნდა დაარედაქტიროთ და ძალიან შორს არ წახვიდეთ, რათა მომავალში, თუ WordPress შეცვლის ფაილებს wp-signup.php და wp-activate.php, მათთვის უფრო ადვილი იქნება თითოეულის შედარება. სხვა ცვლილებების საპოვნელად..

    არ დაგავიწყდეთ გაოცება გამომავალი კოდიძირითადი ფუნქციების ყველა აღწერა ეფუძნება იმას, რაც მოსალოდნელია კოდის შუაში.

    ბონუსი. დაიცავით სპამისგან

    WordPress საიტების უმეტესობა ხშირად განიცდის სპამის რეგისტრაციას. თქვენ შეგიძლიათ დაწეროთ გაუთავებელი იდეები ბოტების გაფილტვრისთვის, რომლებიც ხშირად უფრო ჰგავს შექმნის მცდელობას ცალი ინტელექტი🙂 რადგან მულტისაიტი მაქვს, უკვე მჭირდებოდა ძირითადი გადამისამართება Apache-ში, დახმარებისთვის /wp-signup.php და /wp-acitvate.php შესვლისას ვთხოვე 404-ის ნახვა (მე არ ვარ Apache-ის ექსპერტი, ამიტომ ჩემი წესები შეიძლება არ იყოს საკმაოდ სწორი).

    RewriteEngine On RewriteBase / RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # BEGIN WordPress # WordPress-ის წესები არ უნდა იყოს იგნორირებული :) # ... # END WordPress

    პ.ს ვცდილობ რაც შეიძლება დეტალურად აღვწერო მესამე მხარის გამოსვლების ქმედებები, რადგან როცა დავიწყე, ბევრი გამოსვლის შემოთავაზება და ახსნა არავინ იყო. ასევე ვაფასებ, რომ სხვა მასალებზე ასეთი მცირე პუნქტები დაეხმარება ვინმეს ისწავლოს რაიმე ახალი და გააფართოოს ცოდნა. RewriteRule ჩანაწერები ვიკორიზებულია რეგულარული გამონათქვამები, სუნი სულაც არ არის რთული, მაგალითად, სიმბოლო ნიშნავს მწკრივის ყურს.

    ერთჯერადი წარდგენები შეიძლება გამოყენებულ იქნას სხვადასხვა სიტუაციებში: ფაილზე ან გვერდზე მყისიერი წვდომის უზრუნველსაყოფად, ან რეგისტრაციის დასადასტურებლად. ეს გაკვეთილი გაჩვენებთ, თუ როგორ შექმნათ და დანერგოთ ერთჯერადი URL-ები.

    URL-ის შექმნა

    მისაღებია, რომ ჩვენს ვებ-გვერდზე გვაქვს კლიენტების ავთენტიფიკაციის სისტემა. რეგისტრაციის შემდეგ მომხმარებელს ვთხოვთ გაიაროს ელექტრონული ფოსტის გადამოწმების პროცედურა. მსგავსი გეგმების შესაქმნელად, შეგვიძლია დავაჩქაროთ სპეციალური პარამეტრინიშანი. მსგავსი რამის მაგალითი:

    Http://example.com/activate?token=ee97780...

    ჩვენ არ შეგვიძლია ამის გაკეთება მონაცემთა ბაზის გარეშე, ასე რომ, მოდით გადავხედოთ ცხრილს, თუ რა ღირს.

    CREATE TABLE pending_users (token CHAR(40) NOT NULL, მომხმარებლის სახელი VARCHAR(45) NOT NULL, tstamp INTEGER Unsigned NOT NULL, PRIMARY KEY(token));

    ცხრილი ინახავს 3 ველს: ჟეტონს, ანგარიშის სახელს და საათს. ტოკენის გენერირებისთვის ვიყენებთ სწრაფ ფუნქციას sha1(), რომელიც არის 40 სიმბოლოსგან შემდგარი მწკრივი. tstamp ველი დაზოგავს ჟეტონების გენერირების საათს, რათა ჩვენ შეგვიძლია გამოვაქვეყნოთ შეტყობინებები გასული ვადით.

    არ არსებობს ტოკენის გენერირების გზები, მაგრამ ეს გაკვეთილი სწრაფად ისწავლება uniqid() და sha1() ფუნქციების გამოყენებით. ტოკენის გენერირების მეთოდის მიუხედავად, დარწმუნდით, რომ გენერირებული მნიშვნელობები განსხვავებული იქნება და დუბლიკატების გამოჩენის ალბათობა მინიმალურია.

    $token = sha1(uniqid($username, true));

    uniqid() ფუნქცია იღებს სტრიქონს პარამეტრად და გამოსავალად იძლევა უნიკალურ იდენტიფიკატორს, რომელიც დაფუძნებულია გავლილ არგუმენტზე და ნაკადის საათზე. ასევე, როგორც კიდევ ერთი არგუმენტი, ეს ფუნქცია ადიდებს ლოგიკურ მნიშვნელობას, რათა სიგნალი გაუწიოს uniqid-ს, დაამატოს დამატებითი სიმბოლოები, რათა გაზარდოს მნიშვნელობის უნიკალურობის დარწმუნება. sha1 ფუნქცია იღებს უნიკალურ იდენტიფიკატორს და ქმნის ჰეშს.

    ამ ორ ფუნქციასთან მუშაობის შემდეგ, ჩვენ გვაქვს უნიკალური ჟეტონი, რომელიც შეიძლება გამოყენებულ იქნას URL მისამართის გენერირებისთვის. ახლა ჩვენ უნდა მივიყვანოთ ის ბაზაზე:

    $query = $db->prepare("INSERT INTO pending_users (username, token, tstamp) VALUES (?, ?, ?)"); $query->execute(მაივი ($username, $token, $_SERVER["REQUEST_TIME"])));

    იმისათვის, რომ ვიცოდეთ რომელი ბუღალტერი გავააქტიუროთ, ბუღალტერის შესვლას ვაფიქსირებთ ცხრილში. მაგალითში, რომელიც უფრო ადაპტირებულია რეალური საიტისთვის, შეგიძლიათ სწრაფად მიიღოთ ანგარიშის ID.

    ახლა, თუ ჩვენ გვაქვს ყველა საჭირო ინფორმაცია, შეგვიძლია შევქმნათ დროული URL:

    $url = "http://example.com/activate.php?token=$token";

    $message =<<

    ხელახალი შემოწმება

    ახლა ჩვენ გვჭირდება სკრიპტი, რომელიც უნდა გადავამოწმოთ. ყველაფერი რაც ჩვენ უნდა გავაკეთოთ არის ტოკენის შესატყვისი URL მისამართიდან და ჟეტონი ბაზიდან. თუ ასეა, ერთი საათიც არ გასულა სიცოცხლე, მაშინ ყველაფერი რიგზეა.

    // მოსახსნელი ჟეტონი if (isset($_GET["token"]) && preg_match("/^(40)$/i", $_GET["token"])) ($token = $_GET["token"] ; ) else ( throw new Exception("token is not valid."); ) // ჟეტონის შემოწმება $query = $db->prepare("SELECT მომხმარებლის სახელი, tstamp FROM pending_users WHERE token =?"); $query->შესრულება(მასივი($token)); $row = $query->fetch(PDO::FETCH_ASSOC); $query->closeCursor(); if ($row) (extract($row); ) else (writing new Exception("token is not valid."); ) // კლიენტის ანგარიშის გააქტიურება // ... // ტოკენის ამოღება ბაზიდან $ query = $db- >prepare("DELETE FROM pending_users WHERE username = ? AND token = ? AND tstamp = ?",); $query->execute(მაივი ($username, $token, $tstamp));

    ჩვენ ასევე უნდა გადავამოწმოთ ნიშნები ისე, რომ ცხოვრება წარსულია.

    // 1 დღე წამში = 60 წამი * 60 საათი * 24 წელი $დელტა = 86400; // შებრუნება, თუ ($_SERVER["REQUEST_TIME"] - $tstamp > $delta) ( გადაყარეთ ახალი გამონაკლისი ("ჟეტონის სიცოცხლე გავიდა."); ) // ანგარიშის მფლობელის ანგარიშის ჩანაწერის გააქტიურება // ...

    ამრიგად, ჩვენ გვექნება ორი შემოწმება: ერთი ჟეტონის მოქმედების, მეორე მისი ვადის გასვლის საათისთვის.

    Ჩანთა

    ამ მეთოდის გამოყენება შესაძლებელია მხოლოდ გააქტიურებისთვის ღრუბლოვანი ჩანაწერები koristuvachiv და სხვა საჭიროებისთვის: მაგალითად, ერთჯერადი ან საათობრივი წვდომის უზრუნველყოფა ნებისმიერ რესურსზე ან სერვისზე.

    მანამდე შეგიძლიათ შექმნათ სკრიპტი, რომელიც აქამდე არასდროს გამოგიყენებიათ. ეს სკრიპტი შეიძლება გაშვებული იყოს იმავე ინოდზე, ან შეიძლება მიენიჭოს სხვის კრონს.