동시에 여러 사이트에 대해 하나의 WordPress 설치를 사용할 수 있습니다. 이 경우 각 사이트는 고유한 접두사를 사용하여 데이터베이스에서 고유한 테이블을 가져옵니다.

등록된 사용자의 데이터가 있는 테이블은 모든 네트워크 사이트에 공통입니다. 이것은 확실한 장점이며 일단 등록하면 여러 사이트에 액세스할 수 있습니다. 또한 각 사이트에서 동일한 계정이 다른 권한을 가질 수 있습니다. 예를 들어 사용자가 한 사이트에서는 편집자이고 다른 사이트에서는 관리자일 수 있습니다.

정상에서 워드프레스 설치등록, 인증 및 비밀번호 재설정 페이지에 wp-login.php 파일이 표시됩니다.

  • wp-login.php - 인증
  • wp-login.php?action=register - 등록
  • wp-login.php?action=lostpassword - 비밀번호 재설정

다중 사이트 모드에서 WordPress 코어는 약간 다르게 작동하기 시작하고 wp-login.php?action=register 링크를 클릭하면 wp-signup.php 로 리디렉션됩니다. 이것은 기본적으로 WordPress와 함께 제공되는 네트워크 등록 페이지입니다.

일반 사용자 계정을 등록하는 것 외에도 최고 관리자가 네트워크 설정(네트워크 관리자 → 설정 → 네트워크 설정)에서 이 기능을 활성화한 경우 새 사이트를 만들 수도 있습니다.

대부분의 테마에서 등록 페이지가 잘 보이지 않습니다. 많은 테마가 Bootstrap과 같은 CSS 프레임워크 및 고유한 특정 클래스를 사용하여 페이지의 다양한 요소에 스타일을 지정하므로 모든 사람에게 맞는 단일 HTML을 작성하기가 어렵습니다.

그러나 페이지가 어수선해 보인다고 절망하지 마십시오. wp-signup.php 파일은 처음에는 사이트의 모든 세부 사항을 살펴볼 시간이 없을 때 유용합니다. 다른 더 중요한 페이지와 콘텐츠에 집중할 수 있습니다.

자신만의 가입 페이지를 만들 준비가 되었다면 wp-signup.php는 WordPress가 사용자 입력을 처리 및 검증하고 새 계정을 생성하기 위해 제공하는 기능의 범위를 쉽게 이해할 수 있는 좋은 참고 자료이자 예입니다.

네트워크 메인 사이트

기본적으로 워드프레스는 웹의 메인 도메인(웹사이트)에서 가입 페이지(wp-signup.php)를 엽니다. 그러나 테마가 있더라도 네트워크의 모든 사이트에 대해 등록 페이지를 만들 수 있습니다.

네트워크의 모든 사이트가 동일한 테마를 사용하지만 각 사이트에 등록 페이지가 있는 경우를 고려할 것입니다. 사이트는 언어(영어 및 러시아어)가 다르므로 등록 페이지는 사이트의 "네이티브" 언어로 표시됩니다. 사이트에서 서로 다른 테마를 사용하는 경우 모든 테마는 동일한 레이아웃이 적합한지(모든 테마를 통합해야 하는 상황) 또는 개별적으로 페이지를 개발할 가치가 있는지 여부에 따라 달라집니다.

functions.php 대안

파일 순서

MU 플러그인은 논리적으로 보이는 파일과 구조를 얼마든지 포함할 수 있습니다. 나는 다음과 같은 계층 구조를 따릅니다.

| 뮤 플러그인 | | 로드.php | | 셀레나 네트워크 | | | 가입 | | | | 플러그인.php | | | ... | | | 제트팩 | | | | 플러그인.php

load.php 파일에서 번역 및 필요한 모든 "플러그인"이 연결됩니다.

// MU 플러그인에 대한 번역 로드 load_muplugin_textdomain("selena_network", "/selena-network/languages/"); // 등록 페이지의 기능에는 WPMU_PLUGIN_DIR이 필요합니다. "/셀레나-네트워크/가입/플러그인.php"; // 다른 플러그인 // WPMU_PLUGIN_DIR 필요 ...

플러그인 폴더는 selena-network 디렉토리에 저장됩니다. 각각은 load.php에 포함된 자체 plugin.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"))); exit; // ...

기억하시겠지만 기본적으로 등록 페이지는 기본 네트워크 도메인에서 열립니다. 이것이 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 플러그인 내부 모든 기능 이름에 사용하는 접두사입니다. 내 고유 접두사로 바꿔야 합니다. bbPress 및 BuddyPress와 같은 일부 플러그인이 이 주소를 자체 주소로 덮어쓸 수 있기 때문에 필터 우선순위 99를 추가합니다(MU 플러그인은 일반 플러그인보다 먼저 로드됨, 위 참조).

network_site_url() 과 달리 home_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 파일의 맨 아래(버전 4.1.1의 646행)는 위에서 설명한 모든 방법을 사용하는 가입 페이지의 주요 로직입니다. 코드의 이 부분은 함수로 이동되지 않습니다. 마지막에 get_footer()가 호출됩니다.

wp-signup.php의 기능 복사

다음으로 wp-signup.php를 MU 플러그인에 복사하고 "fork"를 변경하는 절차를 설명합니다. 아마도 이것은 올바른 방법이 아닌 것 같습니다. 대신 일반 함수가 아닌 클래스를 사용하여 처음부터 양식을 확인하고 표시하기 위한 고유한 함수를 작성할 수 있습니다. 내 생각에 wp-signup.php는 이미 우리 페이지에 필요한 모든 로직을 가지고 있으며, 약간만 변경하면 됩니다.

WordPress를 업데이트할 때 wp-signup.php도 수시로 변경되지만 이것이 "포크"를 각 릴리스와 동기화해야 한다는 의미는 아닙니다. wp-signup.php 내부의 함수는 기본적으로 HTML 출력, 데이터 유효성 검사, 계정 및 사이트 생성, ms-functions.php에 선언된 wpmu_ 접두사 메서드 외에는 아무 것도 하지 않습니다.

페이지에 등록 양식을 표시하는 함수를 만들어 보겠습니다. 이렇게 하려면 WordPress 루트에서 wp-signup.php를 mu-plugings/selena-network/signup/으로 복사합니다. mu-plugins/selena-network/signup/plugin.php 내부에 연결합니다.

WPMU_PLUGIN_DIR이 필요합니다. "/셀레나-네트워크/가입/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 페이지 템플릿을 만드는 것입니다. "가입"이라는 단어 대신 페이지에 할당된 고유 ID를 사용할 수 있습니다. 템플릿 내부에 필요한 레이아웃을 추가하고 올바른 위치에서 selena_network_signup_main()을 호출합니다.

결과적으로 내 등록 페이지가 훨씬 더 좋고 깨끗해 보입니다.

활성화 페이지

에 의해 워드프레스 기본값조건부로 Multisite의 등록 프로세스를 두 단계로 나눕니다. 사이트에서 양식을 작성하고 이메일로 전송된 링크를 클릭할 때 계정을 활성화합니다. 이전 섹션에서 만든 양식을 작성하면 WordPress에서 몇 가지 지침과 계정 활성화 링크가 포함된 이메일을 보냅니다.

WordPress 루트 디렉토리에 있는 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이 필요합니다. "/셀레나-네트워크/가입/wp-activate.php";

wp-signup.php 와 달리 내부에는 내용이 많지 않습니다. 파일은 단일 작업을 수행합니다. 올바른 키가 수신되면 계정을 활성화하고 오류 또는 성공 메시지를 표시합니다.

불필요한 검사를 모두 제거하고 WordPress 4.1.1에서 1~69행을 요구합니다. 맨 마지막에 get_footer() 호출을 제거합니다. 나머지 콘텐츠는 selena_network_activate_main() 함수로 전송됩니다.

여기에서 WordPress(wp-load.php)를 로드하기 전에 WP_INSTALLING 상수가 선언되었다는 점에 주목하는 것이 좋습니다. 그것의 존재는 WordPress가 플러그인을 로드하지 못하게 합니다.

등록 페이지의 경우와 마찬가지로 필요한 경우 레이아웃을 수정하는 것만 남아 있습니다. 표시되는 메시지의 텍스트를 변경할 수도 있습니다(이 경우 MU 플러그인의 텍스트 도메인을 모든 번역기 기능에 추가하는 것을 잊지 마십시오. 기본적으로 어디에도 설정되어 있지 않습니다).

기성 기능은 미리 생성된 페이지에서 숏코드 또는 자식 테마의 별도 템플릿을 통해 사용할 수 있습니다.

올바른 링크가 포함된 활성화 이메일

활성화 페이지를 사용할 준비가 되었지만 WordPress는 이에 대해 알지 못하며 여전히 wp-activate.php 링크가 포함된 활성화 이메일을 보냅니다. wp-signup.php와 달리 주소를 변경할 수 있는 필터가 없습니다. 대신 올바른 링크가 포함된 이메일을 보낼 함수를 직접 작성해야 합니다.

페이지에서 양식 작성 및 제출 시 워드프레스 등록 wpmu_signup_ 호출 사용자() 또는 wpmu_signup_ 블로그() 등록 유형에 따라 다릅니다. 두 기능 모두 생성 새로운 기록 wp_signups 테이블에서 필요한 내용으로 채우고 그 중 계정 활성화 키가 있습니다.

그 후, 함수에 따라 wpmu_signup_이 호출됩니다. 사용자 _notification() 또는 wpmu_signup_ 블로그 _알림() . 두 기능 모두 유사한 기능을 가지고 있습니다. 활성화 링크가 포함된 이메일을 생성하고 전송하지만 인수는 다릅니다. 둘 다 이벤트를 "캡처"하는 필터가 있습니다.

if (! apply_filters("wpmu_signup_user_notification", $user, $user_email, $key, $meta))는 false를 반환합니다.

블로그 생성으로 계정을 활성화하려면:

If (! apply_filters("wpmu_signup_blog_notification", $domain, $path, $title, $user, $user_email, $key, $meta)) ( return false; )

wp_mail() 을 통해 편지를 보내는 자체 핸들러를 작성하는 것만 남아 있으며, 마지막에 WordPress가 활성화 편지를 두 번 보내지 않도록 false를 지정해야 합니다. 하나는 귀하의 것이고 다른 하나는 기본 편지입니다. wp-activate.php에 대한 링크.

Function selena_network_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) ( // 이메일 헤더, 본문 및 헤더 생성 // ... // 이메일을 보내거나 이메일을 보낼 Cron 작업 추가 wp_mail($user_email , wp_specialchars_decode($subject), $message, $message_headers); // WordPress가 활성화 이메일을 두 번 보내지 않도록 false를 전달하면 false return false; ) add_filter("wpmu_signup_user_notification", "selena_network_wpmu_signup_user_notification", 10, 4);

SMTP 서버를 통해 이메일을 보내거나 등록 수가 매우 많다면 즉시 이메일을 보내지 않는 것이 좋습니다. 대신 WordPress Cron을 사용하여 Cron 작업을 추가할 수 있습니다.

wp-signup.php 및 wp-activate.php에 대한 액세스 닫기

고유한 등록 및 활성화 페이지를 만든 후에는 "원본"을 닫아야 할 수도 있습니다. 예를 들어 등록 페이지에 채워야 하는 추가 필드가 있는 경우입니다. 또한 많은 WordPress 사이트가 스팸 등록 대상입니다.

한 작업으로 두 가지 문제를 해결하려면 이러한 페이지를 열려고 시도하는 경우 Apache에 404를 반환하도록 요청할 수 있습니다. 이렇게 하려면 구성 파일 또는 .htaccess 에 몇 가지 추가 RewriteRule을 등록하면 됩니다.

RewriteEngine On RewriteBase / # 정규 표현식을 아는 것은 결코 불필요한 일이 아닙니다 :) RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # 워드프레스 BEGIN # 워드프레스 기본 규칙을 그대로 둡니다 :) # ... # 워드프레스 END

결론

이것과 WordPress와 관련된 다른 많은 "문제"에 대해 인터넷에는 많은 솔루션이 있습니다. 예를 들어, 등록 및 활성화 페이지를 만들기 위해 일부는 원래 wp-signup.php 및 wp-activate.php 를 다시 작성하도록 제안합니다. 이 작업을 수행하면 안 됩니다. 워드프레스 업데이트파일에 대한 모든 변경 사항을 잃게 되며 커널의 무결성을 .

추가 기능, 테마 또는 솔루션을 개발할 때 WordPress 내부에서 일어나는 일을 파악하는 데 약간의 시간을 할애하십시오. 이를 위한 유용한 디버그 도구가 많이 있습니다.

추신

다중 사이트 사용자 관리 플러그인을 사용하여 새 사용자에게 다른 역할을 자동으로 할당할 수 있습니다.

기사를 읽은 후 등록 및 활성화 페이지를 생성하는 동안 질문이나 어려움이 있으면 댓글을 남겨주시면 확실하게 답변해 드리겠습니다.

27.03.2015 27.03.2015

워드프레스 개발자. 그는 모든 것의 질서를 좋아하고 새로운 도구를 이해하는 것을 좋아합니다. Symfony 구성 요소 아키텍처에서 영감을 얻었습니다.

  • --- 창고 선택 --- 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 13R Villa Madrid 92200 Neuilly -Seine) Republica Moldova , Falesti(s.Fagadau) South Kensington(Bute street) Adler(Quiet lane 2, Kudepsta district) Aktobe(47/2 Aktobe street) Almetievsk(Almetievsk, Lenin street 13, office 306) Anapa(88 Terskaya St., 3층) Astrakhan(17 Kommunisticheskaya St., 사무실 4) Atyrau(Atyrau, Azattyk Ave. 42, 사무실 206) Berdyansk(Zaporozhye 지역) Bishkek( Bishkek, 32B Chui avenue, 쇼핑 센터 "Izumrud" 사무실 ) Blagoveshchensk (50 Let Oktyabrya st. 15. "Amur Fair" 사무실 575) Buguruslan (Krasnoznamnaya st. Krasnaya st., 61 (2층) 도심) Vladivostok (147 Svetlanskaya st., 사무실 2/4) olgograd (볼고그라드시 고속도로 Aviators 15 창고 23) Dyurtyuli (st. Agidel d.4 kv.2) Yeysk (st. Pervomayskaya 56, office 308) Yekaterinburg (10 Mamin-Sibiryak St., office 3) Ivanovo (Sheremetevsky prospect, 85G, Premium Plaza Business Center 2nd floor, office 212) Izhevsk (Lenina 21, office 304. 비즈니스 센터 "포럼") Izber (Chapaeva 4 ind. 368501) Irkutsk (Irkutsk, Gornaya st. 4 (Karamel 쇼핑 센터 옆) 사무실 407) Ishimbay (Zorge, 집 18) Yoshkar-Ola (24v Lenin Ave., 사무실 318) Kazan (레인 1- 측면 Grivki 집 10, 지하철역 "Kozya Sloboda" 또한 Dekabristov street, 85 "B" 비즈니스 센터 "Relita" 사무실 411) Kamensk-Uralsky(Prospekt Pobeda 56) Kemerovo(Demyan Bedny st., 1 사무실 401) Kyivst(Olevskaya) 9 kv.4 (사전 전화로 도착) Komsomolsk-on-Amur (Shikhanova st. 10, 사무실 1 건물 끝에서 Komsomolskaya의 입구) Kostroma (Prospect Mira 51, 사무실 15) .Krasnaya 124 사무실 302) Krasnoyarsk(pr. Krasnoyarsky 작업자, 120 쇼핑 센터 "Krasnoyarye") Lviv(Sobornaya Square 12A) Makhachkala(Akushkinogo 9v) Miass(st. 30 let VLKSM 85) Minsk(Korzhenevskogo, 26) 모스크바, Yaros: 10, 건물 4, 사무실 10 6) 모스크바(Simferopolsky 대로) 모스크바(Glazovsky 레인 5, 아치 입구, 지하철역 왼쪽 문: Smolenskaya-500m, Kropotkinskaya-1km., Park Kultury-1km.) 모스크바(m. 체홉스카야, 푸쉬킨스카야, 트베르스카야. Strastnoy Boulevard, 6, 건물 1, 비즈니스 센터, 사무실 421) 모스크바(Lobnya, Mayakovskogo st., 4A, TR1, 3층, 사무실 301) 모스크바(Molodezhnaya 지하철역, Yartsevskaya 거리, 27 건물 9 건강 개선 센터 "Four 요소") 모스크바 (Krasnaya Presnya 38-45) 모스크바 (St. 모스크바 m. Taganskaya 방사형 출구 3, 지하철에서 30m. 성. Bolshiye Kamenshchiki 1, 4층, 사무실 30) 모스크바(지하철 Leninsky Prospekt, Vavilova 9A, 건물 6, 사무실 10 B, 3층) 모스크바(지하철 역 Novoslobodskaya, Mendeleevskaya, Mayakovskaya, Belorusskaya(radial). , 24. 아치를 통한 입구, PET SHOP) 모스크바(메트로 벨로루스카야(고리), 지하철 출구에서 5m. Tverskaya Zastava Square, 3, 3층, 사무실 321. 벨로루스키 기차역 근처. ) 모스크바(M. ALTUFIEVO , Pskovskaya st., 6) 모스크바(Moscow, Radio st., 2번 출입구, 사무실 2) Naberezhnye Chelny(Sh.Usmanova st. 122 kb. 111 1st floor) Nalchik(Nalchik, Kirov st. 292a, 2nd floor, office) ( ) Nakhodka (Pogranichnaya st. 6, room 304) Nevinnomyssk (Pl. 50 Let Oktyabrya 8A) Nefteyugansk (12 microdistrict house 7) Nizhnevartovsk (Nizhnevartovsk, Mira st. 31B.) Nizhn9 Novgorod business.Com1 중앙)) Nizhny Novgorod (m. Gorkovskaya, st. Kostina, 3, BC "New Square", 2층, 사무실 239) Nizhny Tagil (at l. Krasnoarmeyskaya d.42a, 3층 사무실 4) Nizhny Tagil(Nizhny Tagil, st. Papanina 5, office 1, Kushva, Gornyakova st. 4) Novosibirsk (Street, Oktyabrskaya 42 office 601, 비즈니스 센터 대략 Lenin Square, Mayakovsky cinema) Novosibirsk (Gogol street 33/1. Marshal Pokryshgolam 지하철역에서 20미터, 센터.) Novotroitsk(Sovetskaya d st. .144 sq. 26) Novy Urengoy(Druzhba 소구역, house 4/3, apt. 183) Norilsk(Leninsky prospekt 47a of. 79) Nur-Sultan(Astana)(Beibit, BC) Marden, 사무실 708) Odessa(b -R French 60 종합 재활 요양원 "SARTUS") Oktyabrsky(Microdistrict 32a, house 6, apt. 88) Omsk(5 Severnaya st. 1층, 오른쪽 베란다) Orsk(Lenin Ave. 93 ) Pavlodar (Satpaev St. 71 사무실 107) Perm (Sovietskaya d.52 사무실 1) Perm (Druzhby St. 34 사무실 305) Pyt-Yakh (Microdistrict 5, house 5) Pyatigorsk (st. 295 Rifle Division 및 13 k.2) Rostov-on-Don(Soborny 레인 21 사무실 10 B) Salavat(Lenina 거리, 집 3 사무실 209, 2층) Samara(Novo-Sadovaya street 106, 사무실 804, 왼쪽 엘리베이터, 8층) St 상트페테르부르크(지하철: Vasileostrovskaya, Vasilyevsky Island 13th line, 78, office 182) 상트페테르부르크(Dostoevskaya 지하철역(5미터) 및 Vladimirskaya 지하철역(300미터) Vladimirsky 19) 상트페테르부르크(Admiralteyskaya 지하철역(10미터) Spasskaya 도보 1분 Efimov St. 1, 2층, 사무실 4, 비즈니스 센터 "Sennaya 4", 카페 "Sever" 왼쪽 입구) Saratov(Bolshaya Gornaya) St., 359V, 사무실 번호 3) Sevastopol (Ochakovtsev St. 19 , 센터 "Plaza", 1층, 사무실 29/2) Snezhinsk (Zababahina st. 19 a) Sochi (Sochi ko. Donskaya house 15.) 소치 ( Sovetskaya st. 42 office 204) Stavropol (Lomonosov st. 21 office 18) Sterlitamak (85 Khudaiberdina st., 3rd floor) Surgut (30 let Pobedy st. 64) Tobolsk (Tobolsk, microdistrict 6, building 3911, office Komsomolsky avenue)) Togliatti(40세) Pobedy, 50, 사무실 212a, TD Raduga 1st floor) Tomsk(Tomsk, Sovetskaya street 84) Tuymazy(Michurina street, 15 사무실 2) Tyumen(Gerzen street, 72 사무실 214) Ryabikov street, d 73) Ust-Kamenogorsk(57 Gorky St., 사무실 213) Ufa(Verkhnetorgova Square, 6(비즈니스 센터 NESTEROV)) Khabarovsk(Postysheva St., 16 사무실) 108에서) Khanty-Mansiysk (G. 한티-만시스크, st. Karl Marx 15, 2nd floor.) Chelyabinsk (168 Pobedy Ave., 3rd floor, office 36.) Cherkessk (101 Lenina St.) Chita (104 Babushkina St., office 425) Chishmy (17 Ring Road) Chishmy (Friendship Ave. , 1B) 스위스(Arosio via Terra Sotto, 1 6939) Shymkent(Kolkhoznaya st. 47) Yuzhno-Sakhalinsk(Angarsky 레인 21) Yakutsk(Dzerzhinsky st. 8/3b) Yakutsk(Yakutsk) Yaltaembankment(SEC"Lenin5 Fountain, 4th floor) Yanaul (street Sovetskaya, 23, office N 8 building Berezka) Yaroslavl (57 쇼룸) Yaroslavl (street Chkalova 2) Birsk Bashkortostan () ?>

    Zend 애플리케이션의 모든 페이지에 하나의 양식을 배치하는 방법에 대한 질문이 종종 발생합니다. 모든 페이지에 위치하도록 layout.phtml 파일에 구독 양식을 배치하고 싶다고 가정해 보겠습니다. layout->content() 명령은 작업 및 컨트롤러와 함께 작동합니다. 그러면 필요한 것을 어떻게 구현할까요?

    이 문제에 대한 한 가지 해결책은 작업 도우미를 만드는 것입니다.

    ZF 응용 프로그램을 설정하여 시작하겠습니다.

    $ zf 프로젝트 레이아웃 양식 만들기 $ cd 레이아웃 양식 $ zf 레이아웃 활성화

    application/views/scripts/index/index.phtml 파일을 정리하고 다음과 같이 붙여넣습니다.

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

    홈페이지입니다

    이제 시작할 수 있습니다.

    양식

    만들자 새로운 형태:

    $ zf 생성 양식 가입

    필요한 필드:

    application/forms/Signup.php:

    클래스 Application_Form_Signup extends Zend_Form ( public $processed = false; public function init() ( $this->addElement("text", "name", array("label" => "Name", "required" => true, " 유효성 검사기" => array(array("StringLength", false, array("max"=>75)))),)); $this->addElement("text", "email", array("label" = > "이메일", "필수" => true, "검증기" => array(array("StringLength", false, array("max"=>150)), "EmailAddress",),)); $this- >addElement("제출", "이동", array("레이블" => "가입",)); ) )

    양식이 있습니다. 꺼내는 일만 남았습니다.

    작업 도우미

    액션 헬퍼를 사용하여 양식을 초기화합니다.

    application.ini에 다음 줄을 추가합니다.

    application/configs/application.ini:

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

    이제 시스템은 작업 도우미를 찾을 위치를 알고 있으므로 계속 진행할 수 있습니다.

    애플리케이션/부트스트랩.php:

    부트스트랩("프론트 컨트롤러"); $signup = Zend_Controller_Action_HelperBroker::getStaticHelper("가입"); Zend_Controller_Action_HelperBroker::addHelper($signup); ) )

    작업 도우미는 다음과 같습니다.

    application/controllers/helpers/Signup.php:

    getActionController()->보기; $form = 새로운 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; ) )

    여기에는 특별한 것이 없습니다. 부모 클래스에만주의하십시오.

    도우미 보기

    양식을 표시하려면 다음과 같은 보기 도우미를 만들어 보겠습니다.

    application/views/helpers/SignupForm.php:

    뉴스레터 신청

    "; if($form->처리됨) ( $html .= "

    가입 해주셔서 감사합니다

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

    우리에게 남은 것은 layout.phtml에서 양식을 렌더링하는 것입니다.

    application/layouts/scripts/layout.phtml:

    headMeta()->prependHttpEquiv("콘텐츠 유형", "텍스트/html; charset=UTF-8"); $this->headTitle("레이아웃 형식 테스트"); echo $this->doctype(); ?> headMeta()->setIndent(4); ?>headTitle()->setIndent(4); ?>

    레이아웃()->내용; ?>
    가입폼($this->가입폼); ?>

    일어난

    그게 다야. 우리는 우리가 상상했던 기능을 달성했습니다.

    센티미터 … 동의어 사전

    변함없는 BAINKI. ch. (어린애 같은). 잠. 당신은 가슴을 원하십니까? 누우세요 뱅키. Ushakov의 설명 사전. D.N. 우샤코프. 1935년 1940년 ... Ushakov의 설명 사전

    Do / do bainki (바이바이). 자그. 그들은 말한다 우주선. 잠. 막시모프, 21세… 러시아어 속담의 큰 사전

    나는 단언한다. 펴다 수면 상태에 대해 (어린이의 연설 또는 어린이와 성인의 대화에서). II int. 펴다 자장가의 구성 요소로 사용됩니다. Efremova의 설명 사전. T.F.에프레모바. 2000년... 현대의 사전러시아어 Efremova

    바인키- ainki, 불변성 ... 러시아어 철자 사전

    바인키- 불변성 ... 러시아어 맞춤법 사전

    Intl., in funkt. 스카즈. \u003d Bai Bai (II 기호) ... 백과사전

    바인키- 국제; 기능에. 스카즈. = 바이바이 2) … 다양한 표현의 사전

    바인키- 바 / 잉크 / 그리고, 사이 ... 형태소 철자 사전

    서적

    • Bainki, Tokmakova I.P. 이 책에서 아기를 위한 자장가를 읽거나 부를 수 있습니다. 책을 잘라...
    • Bainki (2006 ed.), Irina Tokmakova. 이 책에서 당신은 아기에게 자장가를 읽거나 심지어 불러줄 수도 있습니다. 책을 잘라. ISBN:5-9524-2404-X…

    표준 wp-signup.php 대신 다중 사이트 등록 페이지를 만들어 보겠습니다.

    일반 설치 워드프레스 페이지등록(인증, 비밀번호 재설정)은 wp-login.php 파일을 출력합니다.

    • /wp-login.php - 인증
    • /wp-login.php?action=register - 등록
    • /wp-login.php?action=lostpassword - 비밀번호 재설정

    wp-login.php에는 다중 사이트에 대한 별도의 조건이 있습니다. 따라서 다중 사이트에서 /wp-login.php?action=register를 클릭하면 WordPress가 /wp-signup.php 페이지로 리디렉션됩니다. 많은 테마에서 페이지가별로 매력적이지 않으므로 자체적으로 만들 것입니다.

    네트워크 메인 사이트

    기본적으로 워드프레스는 웹의 메인 도메인(웹사이트)에서 가입 페이지(wp-signup.php)를 엽니다. 단, 네트워크 내 사이트마다 테마가 다르더라도 별도의 등록 페이지를 만드는 것은 가능합니다. 네트워크의 모든 사이트에 자체 등록 페이지가 있지만 동일한 테마가 사용되고 사이트의 언어만 다른 경우를 고려할 것입니다. 다른 테마를 사용하는 경우 더 많은 코드가 필요합니다.

    함수.php?

    아니. 이 파일의 이름은 모든 WordPress 기사에 언급된 것 같습니다. 우리의 경우 등록 기능이 여러 사이트를 위해 설계되었다는 사실을 고려하면 사이트가 열릴 때 로드되는 MU 플러그인으로 이동하는 것이 합리적입니다.

    서정적 탈선

    MU 플러그인은 일반 플러그인보다 먼저 로드되고 WordPress 코어가 완전히 로드되기 전에 로드되므로 일부 함수를 호출하면 PHP에서 치명적인 오류가 발생할 수 있습니다. 이 "조기" 로딩에는 장점이 있습니다. 테마 내부에서 functions.php 파일이 테마에서 로드되기 전에도 작동하는 일부 작업에 집착할 수 없다고 가정해 보겠습니다. 이것의 예는 Jetpack에서 모듈의 활동을 추적할 수 있는 jetpack_module_loaded_related-posts(related-posts는 모듈의 이름) 형식의 Jetpack 플러그인 작업입니다. 이 작업은 테마가 로드되기 전에 이미 실행되었기 때문에 테마 파일에서 "첨부"할 수 없습니다. 플러그인은 테마보다 먼저 로드됩니다. 코덱스의 Action Reference 페이지에서 WordPress 로드 순서의 일반적인 그림을 볼 수 있습니다.

    파일 순서

    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이 필요합니다. "/셀레나-네트워크/가입/플러그인.php"; // 다른 플러그인 // WPMU_PLUGIN_DIR 필요 ...

    플러그인 폴더는 selena-network 폴더 안에 저장되며, 각 폴더에는 load.php에 포함된 자체 plugin.php가 있습니다. 이를 통해 특정 항목을 신속하게 비활성화 및 활성화할 수 있는 유연성과 기능이 제공됩니다.

    등록 페이지 URL

    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 플러그인 내부 모든 기능 이름에 사용하는 접두사이며 고유한 접두사로 바꿔야 합니다. bbPress 및 BuddyPress와 같은 일부 플러그인이 이 주소를 자체 주소로 덮어쓸 수 있기 때문에 필터 우선순위 99를 추가합니다(MU 플러그인은 일반 플러그인보다 먼저 로드됨, 위 참조). 방문자를 동일한 도메인에 유지하기 위해 home_url()이 network_site_url() 대신 사용됩니다. 모든 URL을 주소로 사용할 수 있습니다.

    페이지 생성

    이제 일반적인 인터페이스를 통해 site.com/signup/ 주소로 페이지를 만들고 하위 테마 폴더에 템플릿을 만듭니다. 새 페이지- 페이지 가입.php . "가입"이라는 단어 대신 고유 ID를 사용할 수 있습니다.

    새 템플릿 내에서 가입 양식을 표시하는 selena_network_signup_main() 함수를 호출해야 합니다.

    템플릿이 있는 전체 프로세스는 선택 사항이며 대신 selena_network_signup_main() 함수를 호출하는 고유한 단축 코드를 만들 수 있습니다.

    wp-signup.php 및 wp-activate.php

    이제 등록 양식을 표시하는 함수를 만들어 보겠습니다. 이렇게 하려면 wp-signup.php 및 wp-activate.php 파일을 WordPress 루트에서 mu-plugings/selena-network/signup/으로 복사하고 mu-plugins/selena-network 안에 포함시키는 것을 잊지 마십시오. /signup/plugin.php) . 추가 파일 조작은 설명하기가 매우 어렵고 길기 때문에 직접 수행해야 합니다. 정확히 무엇을 해야 하는지 설명하고 게시하겠습니다. 소스 파일프로젝트의:

    1. 파일 시작 부분에서 모든 require , 함수 호출 및 함수 외부의 기타 코드를 제거합니다.
    2. 이름에 고유한 접두사를 추가하여 모든 함수의 이름을 바꿉니다.
    3. wp-signup.php 코드의 하단 부분을 selena_network_signup_main 함수로 감싸고 맨 처음에 전역 $active_signup을 작성하십시오. .
    4. 적절한 위치에서 레이아웃을 자신의 것으로 교체하십시오.

    wp-activate.php 내부에서 동일한 작업을 수행해야 합니다.

    1. 함수 외부의 모든 코드를 제거하고 레이아웃을 별도의 함수로 래핑합니다.
    2. 필요한 경우 레이아웃을 변경합니다.

    wp-activate.php 파일은 계정 활성화 페이지를 담당합니다. 등록 페이지와 마찬가지로 별도의 템플릿을 생성해야 하며 그 안에 wp-activate.php 파일에서 함수를 호출해야 합니다.

    활성화 이메일 보내기

    등록 페이지는 계정을 활성화할 수 있는 링크가 포함된 이메일을 방문자에게 보냅니다. 기본적으로 이것은 ms-functions.php 파일의 wpmu_signup_user_notification() 함수에 의해 처리됩니다. 그 기능은 그 기능을 빌릴 수 있습니다. 이 기능의 사용을 중단해야 하는 이유는 wp-activate.php 에서 계정 활성화 링크를 보내기 때문입니다. false를 제공하여 wpmu_signup_user_notification 필터를 사용하여 이 기능을 "해제"할 수 있습니다(이렇게 하지 않으면 활성화 문자가 두 번 전송됩니다. ok, 실제로는 두 개의 다른 문자).

    함수 Armyofselenagomez_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) ( // ... // wpmu_signup_user_notification()의 코드 function wp_mail($user_email, wp_specialchars_decode($subject), $message, $message ; 반환 거짓; ) add_filter("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

    그 결과 Selena 테마의 등록 페이지가 훨씬 깨끗하고 깔끔해졌습니다.

    결론

    Apache 리디렉션, Java Script 없이는 작동하지 않는 AJAX 양식 등 인터넷에는 정확하지 않은 방법이 많이 있습니다. 내 사이트에서 가능합니다.

    파일을 신중하게 편집하고 원본 파일에서 너무 많이 벗어나지 않도록 해야 합니다. 그래야 나중에 워드프레스가 wp-signup.php 및 wp-activate.php 파일을 변경하면 비교하기가 더 쉬울 것입니다. 변경 사항을 찾을 수 있습니다.

    보는 것을 잊지 마세요 원천코드 내부에서 어떤 일이 어떻게 일어나는지 완전히 이해하기 위해 위에서 설명한 모든 기능.

    보너스. 스팸 발송자 보호

    가장 작은 WordPress 사이트조차도 스팸 등록으로 공격을 받는 경우가 많습니다. 봇 필터링을 위한 끝없는 조건을 작성할 수 있습니다. 종종 인공 지능을 생성하려고 시도하는 것과 비슷합니다. 다중 사이트의 경우 Apache의 일반적인 리디렉션이 많은 도움이 되었으며, /wp-signup.php를 열 때 404를 발행하도록 요청했습니다. 및 /wp-acitvate.php (나는 Apache 설정 전문가가 아니므로 내 규칙이 정확하지 않을 수 있습니다).

    RewriteEngine On RewriteBase / RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # BEGIN WordPress # 기본 WordPress 규칙 :) # ... # END WordPress

    P.S. 처음 시작할 때 많은 것을 알려주고 설명해줄 사람이 없었기 때문에 가능한 한 많은 제3자에 대한 설명을 하려고 노력했습니다. 나는 또한 다른 자료에 대한 그러한 작은 팁이 누군가가 새로운 것을 배우고 지식 영역을 확장하도록 밀어 줄 것이라고 믿습니다. RewriteRule 항목 사용 정규식, 전혀 복잡하지 않습니다. 예를 들어 ^ 기호는 줄의 시작을 의미합니다.