به شما امکان می دهد از یک نصب وردپرس برای چندین سایت به طور همزمان استفاده کنید. در این حالت، هر سایت جداول خود را در پایگاه داده با یک پیشوند منحصر به فرد دریافت می کند.

جداول با داده های کاربران ثبت نام شده برای همه سایت های شبکه مشترک است. این یک مزیت قطعی است و با یک بار ثبت نام می توانید به چندین سایت دسترسی پیدا کنید. علاوه بر این، در هر سایت، یک حساب کاربری می تواند حقوق متفاوتی داشته باشد. به عنوان مثال، یک کاربر ممکن است در یک سایت ویرایشگر و در سایت دیگر مدیر باشد.

در حالت عادی نصب وردپرسصفحه ثبت نام، مجوز و تنظیم مجدد رمز عبور فایل wp-login.php را نشان می دهد.

  • wp-login.php - مجوز
  • wp-login.php?action=register - ثبت نام
  • wp-login.php?action=lostpassword - بازنشانی رمز عبور

در حالت Multisite، هسته وردپرس کمی متفاوت عمل می‌کند و وقتی روی پیوند wp-login.php?action=register کلیک می‌کنید، به wp-signup.php هدایت می‌شود. این صفحه ثبت نام شبکه شما است که به طور پیش فرض با وردپرس ارائه می شود.

علاوه بر ثبت حساب‌های کاربری معمولی، در صورتی که سرپرست فوق‌العاده این ویژگی را در تنظیمات شبکه فعال کرده باشد، می‌توانید یک سایت جدید نیز در آن ایجاد کنید (مدیر شبکه → تنظیمات → تنظیمات شبکه).

در اکثر تم ها، صفحه ثبت نام خیلی خوب به نظر نمی رسد. بسیاری از تم ها از چارچوب های CSS مانند Bootstrap و کلاس های خاص خود برای استایل دادن به عناصر مختلف در صفحه استفاده می کنند، بنابراین نوشتن یک HTML منفرد که برای همه مناسب باشد، دشوار است.

اما اگر صفحه نامرتب به نظر می رسد ناامید نشوید. فایل wp-signup.php در ابتدا عالی است، زمانی که وقت ندارید روی تمام جزئیات سایت کار کنید - می توانید روی صفحات و محتوای مهمتر دیگر تمرکز کنید.

هنگامی که آماده ساختن صفحه ثبت نام خود هستید، wp-signup.php مرجع و مثال خوبی است تا به شما در درک طیف وسیعی از ویژگی هایی که وردپرس برای پردازش و اعتبارسنجی ورودی کاربر و ایجاد حساب های جدید ارائه می دهد کمک کند.

سایت اصلی شبکه

به طور پیش فرض، وردپرس صفحه ثبت نام (wp-signup.php) را در دامنه اصلی (وب سایت) وب باز می کند. با این حال، می توانید صفحات ثبت نام را برای هر سایتی در شبکه ایجاد کنید، حتی اگر دارای مضامین باشد.

ما موردی را در نظر خواهیم گرفت که همه سایت‌های موجود در شبکه از یک موضوع استفاده کنند، اما هر یک از آنها یک صفحه ثبت نام داشته باشند. سایت ها در زبان (انگلیسی و روسی) متفاوت هستند، بنابراین صفحه ثبت نام به زبان "بومی" سایت نمایش داده می شود. درصورتی‌که سایت‌ها از تم‌های متفاوتی استفاده می‌کنند، همه به این بستگی دارد که چه تم‌هایی هستند، آیا طرح‌بندی یکسان برای آن‌ها مناسب است (وضعیت عالی که می‌تواند شما را به یکپارچه‌سازی تمام تم‌هایتان سوق دهد) یا اینکه ارزش دارد صفحات را به صورت جداگانه توسعه دهید.

جایگزین functions.php

سفارش فایل

پلاگین های MU می توانند حاوی هر تعداد فایل و ساختاری باشند که به نظر شما منطقی باشد. من یک سلسله مراتب را دنبال می کنم:

| پلاگین mu | | load.php | | شبکه سلنا | | | ثبت نام | | | | plugin.php | | | ... | | | جت پک | | | | plugin.php

در فایل load.php، ترجمه ها و تمام "افزونه های" لازم وصل شده اند:

// بارگیری ترجمه برای افزونه های MU load_muplugin_textdomain("selena_network", "/selena-network/languages/"); // عملکرد صفحه ثبت نام به WPMU_PLUGIN_DIR نیاز دارد. "/selena-network/signup/plugin.php"؛ // افزونه دیگری // به WPMU_PLUGIN_DIR نیاز دارد ...

پوشه های پلاگین در دایرکتوری شبکه selena ذخیره می شوند. هر کدام plugin.php مخصوص به خود را دارند که در load.php گنجانده شده است. این به انعطاف پذیری و توانایی غیرفعال کردن و فعال کردن فوری می دهد اجزای فردیدر پروژه کار در مواقع اضطراری

صفحه ثبت نام

پس از اینکه فهمیدیم کجا و چگونه کد را می نویسیم، می توانیم به ایجاد صفحه ثبت نام برویم.

بیایید یک صفحه با آدرس example.org/signup/ از طریق رابط معمول ایجاد کنیم. می توانید از هر URL که برای پروژه شما مناسب به نظر می رسد به عنوان آدرس استفاده کنید.

به صفحه ثبت نام مورد نیاز هدایت شوید

برای اینکه وردپرس از صفحه ثبت نام جدید ما مطلع شود و به آن هدایت شود، هنگام کلیک بر روی پیوند "ثبت نام" از فیلتر wp_signup_location استفاده می شود. می توان آن را در داخل wp-login.php یافت و به طور پیش فرض مسئول تغییر مسیر به wp-signup.php است.

Case "register" : 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("signup"); ) 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 و ایجاد تغییرات در "fork" توضیح داده می شود. شاید این راه درست به نظر نرسد. در عوض، می‌توانید توابع خود را برای اعتبارسنجی و نمایش فرم‌ها از ابتدا با استفاده از کلاس‌ها بجای توابع معمولی بنویسید. به نظر من، wp-signup.php در حال حاضر تمام منطق لازم برای صفحه ما را دارد، تنها ایجاد تغییرات کوچک باقی می ماند.

هنگام به روز رسانی وردپرس، wp-signup.php نیز هر از چند گاهی تغییر می کند، اما این بدان معنا نیست که شما مجبور خواهید بود "فورک" خود را با هر نسخه همگام کنید. توابع داخل wp-signup.php اساساً کاری جز خروجی HTML، اعتبارسنجی داده ها، ایجاد حساب و سایت و روش های پیشوند wpmu_ اعلام شده در ms-functions.php انجام نمی دهند.

بیایید تابعی ایجاد کنیم که فرم ثبت نام را در صفحه نمایش دهد. برای انجام این کار، wp-signup.php را از ریشه وردپرس به 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("before_signup_form"); // ... )

اکنون فقط تغییر طرح در تمام مکان هایی که لازم است و صفحه ثبت نام آماده است باقی مانده است.

خروجی فرم ثبت نام

در اینجا حداقل دو گزینه وجود دارد. یک راه راحت تر ایجاد یک کد کوتاه و قرار دادن آن در صفحه از طریق یک ویرایشگر معمولی است.

// ایجاد کد کوتاه network_signup add_shortcode("network_signup", "selena_network_signup_main");

گزینه دوم این است که یک صفحه قالب page-signup.php در پوشه تم فرزند خود ایجاد کنید. به جای کلمه "ثبت نام"، می توانید از یک شناسه منحصر به فرد اختصاص داده شده به صفحه استفاده کنید. در داخل قالب، طرح لازم را اضافه کنید و با () selena_network_signup_main در جای مناسب تماس بگیرید.

در نتیجه، صفحه ثبت نام من بسیار بهتر و تمیزتر به نظر می رسد.

صفحه فعال سازی

توسط پیش فرض وردپرسفرآیند ثبت نام در Multisite را به صورت مشروط به دو مرحله تقسیم می کند - پر کردن یک فرم در سایت و فعال کردن حساب هنگام کلیک کردن روی پیوند ارسال شده در یک ایمیل. پس از پر کردن فرم ایجاد شده در بخش قبل، وردپرس یک ایمیل با چند دستورالعمل و یک لینک برای فعال کردن حساب شما ارسال می کند.

فایل wp-activate.php واقع در دایرکتوری ریشه وردپرس وظیفه نمایش صفحه فعال سازی را بر عهده دارد. 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 در وردپرس 4.1.1. در پایان، فراخوانی ()get_footer را حذف خواهیم کرد. محتوای باقیمانده به تابع ()selena_network_activate_main منتقل خواهد شد.

جالب است بدانید که در اینجا قبل از بارگذاری وردپرس (wp-load.php)، ثابت WP_INSTALLING اعلام شد. وجود آن باعث می شود وردپرس افزونه ها را بارگذاری نکند.

همانطور که در مورد صفحه ثبت نام، تنها اصلاح طرح در صورت لزوم باقی می ماند. همچنین می توانید متن پیام های نمایش داده شده را تغییر دهید (در این صورت فراموش نکنید که دامنه متنی افزونه های MU خود را به تمام عملکردهای مترجم اضافه کنید، به طور پیش فرض در هیچ کجا تنظیم نشده است).

تابع آماده را می توان در یک صفحه از پیش ساخته شده از طریق یک کد کوتاه یا یک الگوی جداگانه در یک موضوع کودک استفاده کرد.

ایمیل های فعال سازی با لینک های صحیح

صفحه فعال‌سازی آماده است، اما وردپرس از آن اطلاعی ندارد و همچنان ایمیل‌های فعال‌سازی را با پیوند به wp-activate.php ارسال می‌کند. برخلاف wp-signup.php، هیچ فیلتری وجود ندارد که به شما اجازه دهد آدرس را تغییر دهید. در عوض، باید تابع خود را بنویسید که ایمیل‌هایی را با لینک‌های صحیح ارسال می‌کند.

در زمان پر کردن و ارسال فرم در صفحه ثبت نام در وردپرس 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 بدهید تا وردپرس دو بار نامه فعال سازی ارسال نکند - یکی مال شما، دیگری یک حرف پیش فرض با پیوندی به 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; ) add_filter("wpmu_signup_user_notification", "selena_network_wpmu_signup_user_notification"، );

اگر از طریق یک سرور SMTP ایمیل ارسال می کنید یا تعداد ثبت نام ها بسیار زیاد است، باید در نظر داشته باشید که بلافاصله ایمیل ارسال نکنید. در عوض، می‌توانید با استفاده از WordPress Cron، کارهای کرون را اضافه کنید.

بستن دسترسی به wp-signup.php و wp-activate.php

پس از ایجاد صفحات ثبت نام و فعال سازی خود، ممکن است لازم باشد "اصل" را ببندید. به عنوان مثال، اگر فیلدهای اضافی در صفحه ثبت نام وجود دارد که باید پر شوند. همچنین، بسیاری از سایت های وردپرسی در معرض ثبت نام هرزنامه هستند.

برای حل دو مشکل در یک عمل، می توانید از آپاچی بخواهید در صورت تلاش برای باز کردن این صفحات، 404 را برگرداند. برای انجام این کار، فقط باید چند RewriteRule اضافی را در فایل پیکربندی یا htaccess. ثبت کنید.

RewriteEngine در RewriteBase / # دانستن عبارات منظم هرگز اضافی نیست :) RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # BEGIN WordPress # ترک قوانین پیش فرض وردپرس :) # ... # END WordPress

نتیجه

برای این و بسیاری دیگر از «مشکلات» مربوط به وردپرس، راه حل های زیادی در اینترنت وجود دارد. به عنوان مثال، برای ایجاد صفحات ثبت نام و فعال سازی، برخی پیشنهاد می کنند wp-signup.php و wp-activate.php اصلی را بازنویسی کنید. این کار نباید انجام شود، زیرا اگر به روز رسانی وردپرسشما تمام تغییرات ایجاد شده در فایل ها را از دست خواهید داد و همچنین نمی توانید یکپارچگی هسته را با استفاده از .

هنگام توسعه هر افزونه، موضوع یا راه حلی، کمی زمان صرف کنید تا با آنچه در داخل وردپرس می گذرد آشنا شوید. ابزارهای اشکال زدایی بسیار مفیدی برای این کار وجود دارد.

P.S.

می توانید از افزونه Multisite User Management برای اختصاص خودکار نقش های مختلف به کاربران جدید استفاده کنید.

اگر پس از مطالعه مقاله در حین ایجاد صفحات ثبت نام و فعال سازی سوال یا مشکلی داشتید، کامنت بگذارید و ما قطعا پاسخگو خواهیم بود.

27.03.2015 27.03.2015

توسعه دهنده وردپرس او نظم در همه چیز و درک ابزارهای جدید را دوست دارد. با الهام از معماری اجزای سیمفونی.

  • --- انتخاب انبار --- Buffalo Grove IL 60089 USA(Buffalo Grove IL 60089 USA)) Chicago USA USA Tamara(16677 SW Blanton street ALOHA. Oregon 97078) Highland Park(USA Highland Park, IL 1322R Madrid Villau0 -Seine) Republica Moldova , Falesti (s.Fagadau) South Kensington (Bute Street) Adler (خیابان آرام 2, منطقه Kudepsta) Aktobe (47/2 Aktobe خیابان) Almetievsk (Almetievsk, Lenin Street 13, office 306) Anapa (88 Ters) خیابان، طبقه 3) آستاراخان (خیابان 17 کومونیستیسکایا، دفتر 4) آتیراو (آتیراو، خیابان آزاتیک 42، دفتر 206) بردیانسک (منطقه زاپوروژیه) بیشکک (بیشکک، خیابان چوی 32B، دفتر مرکز خرید "ایزوم رود" C-5 ) Blagoveshchensk (50 Let Oktyabrya st. 15. "Amur Fair" office 575) Buguruslan (خیابان Krasnoznamnaya خیابان Krasnaya، 61 (طبقه دوم) مرکز شهر) Vladivostok (خیابان Svetlanskaya 147، دفتر 2/4) اولگوگراد (شهر ولگوگراد بزرگراه هوانوردان 15 انبار 23) Dyurtyuli (st. Agidel d.4 kv.2) Yeysk (خ. Pervomayskaya 56, office 308) Yekaterinburg (10 Mamin-Sibiryak St., office 3) Ivanovo (Sheremetevsky Prospect, 85G, Premium Plaza Business Center, طبقه 2, office 212) Izhevsk (Lenina 21, office 304. Business Center "Izhevberba Forumsh") (Chapaeva 4 ind. 368501) Irkutsk (Irkutsk, Gornaya خیابان. 4 (جنب مرکز خرید Karamel) دفتر 407) Ishimbay (Zorge, خانه 18) Yoshkar-Ola (24v Lenin Ave., office 318) Kazan (خط اول- خانه Grivki طرفه 10، ایستگاه مترو "Kozya Sloboda" همچنین خیابان Dekabristov، 85 "B" مرکز تجاری "Relita" دفتر 411) Kamensk-Uralsky (Prospekt Pobeda 56) Kemerovo (خیابان Demyan Bedny، 1 دفتر 401) کیف (خیابان Olevskaya) 9 kv.4 (با تماس قبلی وارد شوید) Komsomolsk-on-Amur (خیابان Shikhanova 10، ورودی دفتر 1 از Komsomolskaya از انتهای ساختمان.) Kostroma (Prospect Mira 51, office 15) .Krasnaya 124 office 302) Krasnoyarsk (کارگر Krasnoyarsky، مرکز خرید 120 "Krasnoyarye") Lviv (Sobornaya Square 12A) Makhachkala (Akushkinogo 9v) Miass (خیابان 30 let VLKSM 85) Minsk (Korzhenevskogo, 26) Moscow (Korzhenevskogo, 26) Moscow (Metro, Yaskaya V. 10، ساختمان 4، دفتر 10 6) مسکو (بلوار سیمفروپلسکی) مسکو (خط گلازوفسکی 5، ورودی در طاق، درب سمت چپ ایستگاه مترو: Smolenskaya-500m، Kropotkinskaya-1km.، Park Kultury-1km.) مسکو (متر. چخوفسکایا، پوشکینسکایا، تورسکایا. بلوار Strastnoy، 6، ساختمان 1، مرکز تجاری، دفتر 421) مسکو (Lobnya، خیابان مایاکوفسکوگو، 4A، TR1، طبقه 3، دفتر 301) مسکو (ایستگاه مترو Molodezhnaya، خیابان Yartsevskaya، ساختمان 27، 9 مرکز بهبود سلامت "چهار" عناصر") مسکو (Krasnaya Presnya 38-45) مسکو (St. مسکو متر خروجی شعاعی Taganskaya 3، 30 متر از مترو. خیابان Bolshiye Kamenshchiki 1، طبقه 4، دفتر 30) مسکو (ایستگاه مترو Leninsky Prospekt، Vavilova 9A، ساختمان 6، دفتر 10 B، طبقه 3) مسکو (ایستگاه مترو Novoslobodskaya، Mendeleevskaya، Mayakovskaya، Belorusskaya (شعاعی). خیابان 4th Tverskaya , 24. ورودی از طریق طاق، PET SHOP) مسکو (مترو Belorusskaya (حلقه)، 5 متر از خروجی مترو. میدان Tverskaya Zastava، 3، طبقه 3، دفتر 321. نزدیک ایستگاه راه آهن Belorussky. ) مسکو (M. ALTUFIEVO , خیابان Pskovskaya, 6) مسکو (مسکو, خیابان رادیو , ورودی 2, دفتر 2) Naberezhnye Chelny (خیابان Sh.Usmanova 122 kb. 111 طبقه 1) Nalchik (Nalchik, Kirov خیابان 292a, طبقه 2, دفتر 6) ) Nakhodka (خیابان Pogranichnaya 6، اتاق 304) Nevinnomyssk (Pl. 50 Let Oktyabrya 8A) Nefteyugansk (12 microdistrict house 7) Nizhnevartovsk (Nizhnevartovsk, Mira st. 31B.) Nizhny Novgorod st.1309 office (Comin) مرکز)) نیژنی نووگورود (متر گورکوفسکایا، خیابان کوستینا، 3، BC "میدان جدید"، طبقه 2، دفتر 239) نیژنی تاگیل (در l. Krasnoarmeyskaya d.42a، طبقه 3 دفتر 4) Nizhny Tagil (Nizhny Tagil, st. پاپانینا 5، دفتر 1، کوشوا، خیابان گورنیاکوا 4) نووسیبیرسک (خیابان، دفتر 601 Oktyabrskaya 42، مرکز تجاری تقریباً میدان لنین، سینما مایاکوفسکی) نووسیبیرسک (خیابان گوگول 33/1. 20 متر از ایستگاه مترو خرید Marshal Pokryshkina، Gogol مرکز). Marden، دفتر 708) اودسا (b -r فرانسوی 60 آسایشگاه توانبخشی چند رشته‌ای "SARTUS") Oktyabrsky (Microdistrict 32a, خانه 6, apt. 88) Omsk (خیابان Severnaya 5 طبقه اول، ایوان سمت راست) Orsk (خیابان لنین 93 ) Pavlodar (خیابان Satpaev 71 office 107) Perm (Sovietskaya d.52 office 1) Perm (Druzhby St. 34 office 305) Pyt-Yak (Microdistrict 5, house 5) Pyatigorsk (خ 295 Rifle Division) و 13 k.2) Rostov-on-Don (Soborny lane 21 office 10 B) Salavat (خیابان Lenina، خانه 3 دفتر 209، طبقه 2) سامارا (خیابان Novo-Sadovaya 106، دفتر 804، آسانسور سمت چپ، طبقه 8) خیابان پترزبورگ (مترو: Vasileostrovskaya، خط 13 جزیره Vasilyevsky، 78، دفتر 182) سنت پترزبورگ (ایستگاه مترو Dostoevskaya (5 متر) و ایستگاه مترو Vladimirskaya (300 متر) گذرگاه VLADIMIRSKY طبقه 3، ورودی مرکزی FIRST GALLERY, Vladimirsky 19) سن پترزبورگ (ایستگاه مترو Admiralteyskaya (10 متر) Spasskaya 1 دقیقه پیاده روی خیابان Efimov 1، طبقه 2، دفتر 4، مرکز تجاری "Sennaya 4"، ورودی سمت چپ کافه "Sever") ساراتوف (Bolshaya Gornaya) خیابان، 359V، دفتر شماره 3) سواستوپل (خیابان Ochakovtsev 19، مرکز "Plaza"، طبقه همکف، دفتر 29/2) Snezhinsk (خیابان Zababahina 19 a) سوچی (Sochi ko. Donskaya house 15.) Sochi ( خیابان Sovetskaya 42 office 204) Stavropol (Lomonosov, Lomonosov 21 office 18) Sterlitamak (خیابان Khudaiberdina 85، طبقه 3) Surgut (30 let Pobedy 64) Tobolsk (Tobolsk, microdistrict 6, ساختمان 11, office 39ent) خیابان Komsomolsky)) Togliatti (40 ساله) Pobedy, 50, office 212a, TD Raduga طبقه 1) Tomsk (Tomsk, Sovetskaya street 84) Tuymazy (خیابان Michurina, 15 office 2) Tyumen (خیابان Gerzen, 72 office Ulyanovsk (214) خیابان Ryabikov، d 73) Ust-Kamenogorsk (خیابان گورکی 57، دفتر 213) Ufa (میدان Verkhnetorgova، 6 (مرکز تجاری NESTEROV)) خاباروفسک (خیابان Postysheva، دفتر 16) از 108) Khanty-Mansiysk (G. Khanty-Mansiysk، خیابان. کارل مارکس، 15، طبقه 2 , 1B) سوئیس (Arosio via Terra Sotto, 1 6939) Shymkent (خیابان Kolkhoznaya 47) Yuzhno-Sakhalinsk (Angarsky lane 21) Yakutsk (خیابان Dzerzhinsky 8 / 3b) Yakutsk (Yakutsk) embankment,EC (Yakutsk5) فواره، طبقه 4) Yanaul (خیابان Sovetskaya، 23، دفتر N 8 ساختمان Berezka) Yaroslavl (57 نمایشگاه) Yaroslavl (خیابان Chkalova 2) Birsk Bashkortostan () ?>

    اغلب این سوال مطرح می شود که چگونه یک فرم را در تمام صفحات برنامه Zend خود قرار دهید. فرض کنید می خواهم فرم اشتراک را در فایل layout.phtml قرار دهم تا در هر صفحه قرار گیرد. دستور layout->content() با اکشن ها و کنترلرها کار می کند... پس چگونه آنچه را که نیاز داریم پیاده سازی کنیم؟

    یک راه حل برای این مشکل ایجاد یک کمک کننده عمل است.

    بیایید با تنظیم برنامه ZF شروع کنیم:

    $ zf ایجاد طرح طرح پروژه $ فرم طرح بندی سی دی $ zf فعال کردن طرح

    فایل application/views/scripts/index/index.phtml را پاک کنید و چیزی شبیه به این را پیست کنید:

    application/views/scripts/index/index.phtml:

    این صفحه اصلی است

    حالا می توانیم شروع کنیم.

    فرم

    بیایید ایجاد کنیم فرم جدید:

    $ zf ثبت نام فرم را ایجاد کنید

    و همچنین زمینه هایی که ما نیاز داریم:

    application/forms/Signup.php:

    کلاس Application_Form_Signup Zend_Form را گسترش می دهد ($processed عمومی = false; تابع عمومی init() ($this->addElement("text", "name", array("label" => "Name", "required" => true, " validators" => array(array("StringLength", false, array("max"=>75)))))); $this->addElement("text", "email", array("label" = > "Email", "required" => true، "validators" => array(array("StringLength", false, array("max"=>150)), "EmailAddress")،))؛ $this- >addElement("ارسال"، "برو"، آرایه("label" => "ثبت نام"،)); ) )

    ما یک فرم داریم. باقی مانده است که آن را بیرون بیاوریم.

    کمک کننده اقدام

    ما از اکشن کمکی برای مقداردهی اولیه فرم استفاده می کنیم.

    یک خط به application.ini اضافه کنید:

    application/configs/application.ini:

    Resources.frontController.actionhelperpaths.Application_Controller_Helper = APPLICATION_PATH "/controllers/helpers"

    اکنون سیستم می‌داند که کجا به دنبال کمک‌کننده‌های عمل بگردد، بنابراین می‌توانیم ادامه دهیم:

    application/Bootstrap.php:

    bootstrap ("frontController"); $signup = Zend_Controller_Action_HelperBroker::getStaticHelper("ثبت نام"); Zend_Controller_Action_HelperBroker::addHelper($signup); ))

    کمک کننده عمل به شکل زیر خواهد بود:

    application/controllers/helpers/Signup.php:

    getActionController()->view; $form = new Application_Form_Signup(); $request = $this->getActionController()->getRequest(); if($request->isPost() && $request->getPost("submitsignup")) ( if($form->isValid($request->getPost())) ($data = $form->getValues() ; // پردازش داده $form->processed = true; ) ) $view->signupForm = $form; ))

    اینجا چیز خاصی نیست. فقط به کلاس والدین توجه کنید.

    مشاهده کمک کننده

    برای نمایش فرم، اجازه دهید یک View Helper ایجاد کنیم که به شکل زیر است:

    application/views/helpers/SignupForm.php:

    برای دریافت خبرنامه ما ثبت نام کنید

    "; if($form->processed) ($html .="

    با تشکر از شما برای ثبت نام

    "; ) else ($html .= $form->render(); ) return $html; ))

    تنها چیزی که برای ما باقی می ماند این است که فرم را در layout.phtml رندر کنیم:

    application/layouts/scripts/layout.phtml:

    headMeta()->prependHttpEquiv("Content-Type", "text/html; charset=UTF-8"); $this->headTitle("آزمون فرم طرح بندی"); echo $this->doctype(); ?> headMeta()->setIndent(4); ?>headTitle()->setIndent(4); ?>

    layout()->content; ?>
    signupForm($this->signupForm); ?>

    اتفاق افتاد

    همین. ما به عملکردی که در نظر داشتیم دست یافته ایم.

    سانتی متر … فرهنگ لغت مترادف

    BAINKI، بدون تغییر. فصل (کودکانه). خواب. آیا شما بوبی می خواهید؟ باینکی دراز بکش فرهنگ لغت توضیحی اوشاکوف. D.N. اوشاکوف. 1935 1940 ... فرهنگ لغت توضیحی اوشاکوف

    انجام / انجام باینکی (بای بای). جارگ میگویند شاتل. خواب. ماکسیموف، 21 … فرهنگ لغت بزرگ گفته های روسی

    من پیش بینی می کنم. گشودن در مورد وضعیت خواب (در گفتار کودکان یا در گفتگوی بزرگسالان با کودکان). دوم بین. گشودن به عنوان جزئی از لالایی استفاده می شود. فرهنگ لغت توضیحی افرموا. T. F. Efremova. 2000 ... نوین فرهنگ لغتزبان روسی Efremova

    باینکی- اینکی، تغییر ناپذیری ... فرهنگ لغت املای روسی

    باینکی- تغییر ناپذیری ... فرهنگ لغت املای زبان روسی

    بین المللی، در funkt. skaz. \u003d بای بای (نشان دوم) ... فرهنگ لغت دایره المعارفی

    باینکی- داخلی؛ در تابع skaz. = خداحافظ 2) … فرهنگ لغت بسیاری از عبارات

    باینکی- ba / جوهر / و، بین ... فرهنگ لغت املای صرفی

    کتاب ها

    • Bainki, Tokmakova I.P. در این کتاب می توانید برای کودک خود لالایی بخوانید یا حتی بخوانید. قطع کتاب...
    • باینکی (2006 ویرایش)، ایرینا توکماکووا. در این کتاب می توانید برای کودک خود لالایی بخوانید یا حتی بخوانید. کتاب را قطع کن شابک:5-9524-2404-X…

    بیایید به جای wp-signup.php استاندارد، صفحه ثبت چند سایت خود را ایجاد کنیم.

    AT نصب معمولی صفحه وردپرسثبت نام (مجوز، تنظیم مجدد رمز عبور) فایل wp-login.php را خروجی می دهد.

    • /wp-login.php - مجوز
    • /wp-login.php?action=register - ثبت نام
    • /wp-login.php?action=lostpassword - بازنشانی رمز عبور

    شرایط جداگانه ای برای multisite در wp-login.php وجود دارد. بنابراین، وقتی روی /wp-login.php?action=register در یک سایت چندگانه کلیک می کنید، وردپرس به صفحه /wp-signup.php هدایت می شود. در بسیاری از تم ها، صفحه چندان جذاب به نظر نمی رسد، بنابراین ما خودمان را خواهیم ساخت.

    سایت اصلی شبکه

    به طور پیش فرض، وردپرس صفحه ثبت نام (wp-signup.php) را در دامنه اصلی (وب سایت) وب باز می کند. با این حال، می توان برای هر سایت در شبکه یک صفحه ثبت نام جداگانه ایجاد کرد، حتی اگر دارای تم های مختلف باشد. ما موردی را در نظر خواهیم گرفت که همه سایت‌های موجود در شبکه صفحه ثبت نام خود را داشته باشند، اما از یک موضوع استفاده شود و سایت‌ها فقط از نظر زبان متفاوت باشند. در صورت استفاده از تم های مختلف، کد بیشتری مورد نیاز خواهد بود.

    functions.php

    خیر به نظر می رسد نام این فایل در هر مقاله وردپرس ذکر شده باشد. در مورد ما، با در نظر گرفتن این واقعیت که عملکرد ثبت نام برای چندین سایت طراحی شده است، منطقی است که آن را به پلاگین های MU منتقل کنیم که هنگام باز شدن هر سایتی بارگذاری می شوند.

    انحراف غزلی

    شایان ذکر است که افزونه های MU قبل از افزونه های معمولی و قبل از بارگیری کامل هسته وردپرس بارگذاری می شوند، بنابراین فراخوانی برخی از توابع می تواند منجر به خطاهای مرگبار در PHP شود. این بارگذاری "زود" مزایای خود را دارد. بیایید بگوییم در داخل هر تمی نمی‌توانید به برخی از اقداماتی که حتی قبل از بارگیری فایل functions.php از درون زمینه کار می‌کنند، بچسبید. نمونه ای از این اقدامات از پلاگین Jetpack از فرم jetpack_module_loaded_related-posts (related-posts نام ماژول است) که با آن می توان فعالیت ماژول ها را در Jetpack پیگیری کرد. این کنش را نمی‌توان از فایل طرح زمینه «ضمیمه کرد» زیرا عملکرد قبلاً قبل از بارگیری طرح زمینه اجرا شده است - افزونه‌ها قبل از تم بارگیری می‌شوند. شما می توانید به یک تصویر کلی از ترتیب بارگذاری وردپرس در صفحه Action Reference در کدکس نگاهی بیندازید.

    سفارش فایل

    افزونه های MU می توانند حاوی هر تعداد فایل و هر ساختاری باشند که به نظر شما منطقی می رسد. من یک سلسله مراتب را دنبال می کنم:

    |-mu-plugins |-|-load.php |-|-|-selena-network |-|-|-|-ثبت نام |-|-|-|-|-plugin.php |-|-|-| -|-... |-|-|-|-jetpack |-|-|-|-|-plugin.php

    در فایل load.php، تمام "افزونه های" لازم برای شبکه ما متصل هستند:

    // بارگیری ترجمه‌ها برای همه افزونه‌ها 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 است.

    Case "register" : if (is_multisite()) (wp_redirect(apply_filters("wp_signup_location", network_site_url("wp-signup.php"))); exit;

    بیایید تابع خود را به 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() برای نگه داشتن بازدید کننده در همان دامنه استفاده می شود. هر URL می تواند به عنوان آدرس استفاده شود.

    ایجاد صفحه

    اکنون صفحه ای با آدرس site.com/signup/ از طریق رابط معمولی ایجاد می کنیم و در پوشه کودک تم یک الگو برای ما ایجاد می کنیم. صفحه جدید- page-signup.php. به جای کلمه "ثبت نام" می توانید از یک شناسه منحصر به فرد استفاده کنید.

    در داخل قالب جدید، باید تابع ()selena_network_signup_main را فراخوانی کنید که فرم ثبت نام را نمایش می دهد.

    شایان ذکر است که کل فرآیند با قالب ها اختیاری است و در عوض می توانید کد کوتاه خود را ایجاد کنید که تابع ()selena_network_signup_main را نیز فراخوانی می کند.

    wp-signup.php و wp-activate.php

    حالا بیایید تابعی ایجاد کنیم که فرم ثبت نام را نمایش دهد. برای انجام این کار، فایل‌های wp-signup.php و wp-activate.php را از ریشه وردپرس در 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_ageers,$smes$$s ; return false; ) add_filter("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

    در نتیجه، صفحه ثبت نام در تم سلنا بسیار تمیزتر و تمیزتر شده است.

    نتیجه

    راه های نه چندان صحیح دیگری نیز در اینترنت وجود دارد که چگونه می توان همین کار را انجام داد - تغییر مسیرهای آپاچی، فرم های AJAX که بدون جاوا اسکریپت کار نمی کنند، و غیره. در سایت خودم امکان پذیر است

    متذکر می شوم که باید فایل ها را با دقت ویرایش کنید و سعی کنید زیاد از فایل های اصلی منحرف نشوید تا در آینده اگر وردپرس فایل های wp-signup.php و wp-activate.php را تغییر دهد، مقایسه آسان تر باشد. آنها را برای یافتن تغییرات.

    فراموش نکنید که نگاه کنید منبعتمام توابع شرح داده شده در بالا به منظور درک کامل آنچه و چگونه در داخل کد اتفاق می افتد.

    جایزه. حفاظت از هرزنامه

    حتی کوچکترین سایت های وردپرس اغلب با ثبت نام های اسپم بمباران می شوند. می‌توانید شرایط بی‌پایانی را برای فیلتر کردن ربات‌ها بنویسید، اغلب بیشتر شبیه تلاش برای ایجاد هوش مصنوعی است. php و /wp-acitvate.php (من متخصص راه اندازی آپاچی نیستم، بنابراین قوانین من ممکن است خیلی درست نباشند).

    RewriteEngine در RewriteBase / RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # BEGIN WordPress # قوانین پیش فرض وردپرس :) # ... # END WordPress

    P.S. من سعی می کنم تا آنجا که ممکن است برخی از چیزهای شخص ثالث را با جزئیات توصیف کنم، زیرا وقتی شروع کردم، گاهی اوقات کسی نبود که خیلی چیزها را تلقین کند و توضیح دهد. من همچنین بر این باورم که چنین نکات کوچکی در مورد سایر مواد باعث می‌شود کسی چیز جدیدی بیاموزد و حوزه دانش خود را گسترش دهد. استفاده از ورودی های RewriteRule عبارات با قاعده، اصلاً پیچیده نیستند، مثلاً علامت ^ به معنای شروع یک خط است.