예시적인 활성화 php. WordPress Multisite에서 자신의 가입 페이지를 만드는 방법

오늘은 인기 있는 Joomla CMS에서 10월 말 인터넷에서 폭발한 치명적인 1일 취약점의 익스플로잇을 살펴보겠습니다. 숫자로 취약점에 대해 이야기하겠습니다. CVE-2016-8869, CVE-2016-8870그리고 CVE-2016-9081. 세 가지 모두 5년 동안 프레임워크의 창자에서 시들었던 동일한 코드 조각에서 나왔으며 날개에서 자유로워지고 혼돈, 해킹된 사이트 및 이 Joomla의 무고한 사용자의 눈물을 가져오기를 기다리고 있습니다. 모니터 빛에 눈이 빨개지고 키보드에 빵 부스러기가 흩어져있는 가장 용감하고 용감한 개발자 만이 성난 악령에 도전하고 수정의 제단에 머리를 얹을 수있었습니다.

경고

모든 정보는 정보 제공의 목적으로만 제공됩니다. 편집자와 저자는 이 기사의 자료로 인해 발생할 수 있는 피해에 대해 책임을 지지 않습니다.

모든 것이 어떻게 시작되었는지

2016년 10월 6일, Demis Palma는 Stack Exchange에 대한 주제를 작성하여 다음과 같이 질문했습니다. 실제로 Joomla 버전 3.6에서 동일한 이름으로 사용자를 등록하는 두 가지 방법이 있는 이유 register() ? 첫 번째는 UsersControllerRegistration 컨트롤러에 있고 두 번째는 UsersControllerUser에 있습니다. Damis는 UsersControllerUser::register() 메서드가 어딘가에서 사용되고 있는지, 아니면 오래된 논리에서 남겨진 진화적 시대착오인지 알고 싶었습니다. 그는 이 메서드가 어떤 뷰에서도 사용되지 않더라도 생성된 요청으로 여전히 호출될 수 있다는 사실에 대해 우려했습니다. 문제가 실제로 존재한다는 것을 확인한 itoctopus라는 별명으로 개발자로부터 응답을 받았습니다. 그리고 Joomla 개발자들에게 보고서를 보냈습니다.

추가 이벤트가 가장 빠르게 개발되었습니다. 10월 18일, Joomla 개발자는 당시 사용자 등록을 허용하는 PoC의 초안을 작성한 Damis의 보고서를 수락합니다. 그는 자신의 웹사이트에 자신이 발견한 문제와 그에 대한 자신의 생각에 대해 일반적인 용어로 설명하는 메모를 게시했습니다. 같은 날, 여전히 취약한 코드를 포함하고 있는 새 버전의 Joomla 3.6.3이 출시되었습니다.

그 후 Davide Tampellini는 버그를 단순 사용자가 아닌 관리자로 등록한 상태로 돌립니다. 그리고 이미 10월 21일에 Joomla 보안 팀에 새로운 사례가 도착했습니다. 이미 권한 에스컬레이션에 대해 이야기하고 있습니다. 같은 날 Joomla 웹 사이트에는 10월 25일 화요일에 시스템 코어의 치명적인 취약점을 수정하는 일련 번호 3.6.3의 다음 버전이 출시될 것이라는 발표가 나타납니다.

10월 25일, Joomla Security Strike Team은 Damis가 발견한 코드 조각에 의해 생성된 최신 문제를 발견합니다. 그런 다음 10월 21일부터 이름이 눈에 띄지 않는 Prepare 3.6.4 Stable Release의 커밋이 공식 Joomla 리포지토리의 메인 브랜치로 푸시되어 불행한 버그를 수정합니다.

이것이 나온 후 많은 관심 있는 개인이 개발자의 도당에 합류합니다. 그들은 취약성을 돌리고 악용을 준비하기 시작합니다.

10월 27일, 연구원 Harry Roberts는 Xiphos Research 리포지토리에 취약한 CMS가 있는 서버에 PHP 파일을 업로드할 수 있는 기성 익스플로잇을 업로드합니다.

세부

음, 선사 시대는 끝났습니다. 가장 흥미로운 취약점 분석으로 넘어 갑시다. 실험 버전으로 Joomla 3.6.3을 설치했으므로 모든 줄 번호가 이 버전과 관련이 있습니다. 다음에 표시되는 파일의 모든 경로는 설치된 CMS의 루트를 기준으로 표시됩니다.

Damis Palma의 발견 덕분에 시스템에서 사용자 등록을 수행하는 두 가지 방법이 있음을 알게 되었습니다. 첫 번째는 CMS에서 사용되며 /components/com_users/controllers/registration.php:108 파일에 있습니다. 두 번째 것(우리가 호출해야 하는 것)은 /components/com_users/controllers/user.php:293 에 있습니다. 자세히 살펴보겠습니다.

286: /** 287: * 사용자 등록 방법. 288: * 289: * @return 부울 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: // 오류 확인 318: if ($return === false) 319: ( ... 345: / / 등록을 마칩니다.346: $return = $model->register($data);

여기서는 흥미로운 줄만 남겼습니다. 취약한 메서드의 전체 버전은 Joomla 저장소에서 볼 수 있습니다.

정상적인 사용자 등록 중에 어떤 일이 발생하는지 알아봅시다: 어떤 데이터가 전송되고 어떻게 처리되는지. 설정에서 사용자 등록이 활성화된 경우 양식은 http://joomla.local/index.php/component/users/?view=registration에서 찾을 수 있습니다.


합법적인 사용자 등록 요청은 다음 스크린샷과 같습니다.


com_users 구성 요소는 사용자 작업을 담당합니다. 요청의 태스크 매개변수에 주의하십시오. 형식은 $controller.$method 입니다. 파일 구조를 살펴보자.

폴더의 스크립트 이름 컨트롤러호출된 컨트롤러의 이름과 일치합니다. 이제 요청에 $controller = "registration" 이 있으므로 파일이 호출됩니다. 등록.php그리고 그 register() 메소드.

주의, 문제는 등록 처리를 코드의 취약한 위치로 이전하는 방법입니다. 아마 이미 짐작하셨을 것입니다. 취약한 메서드와 실제 메서드의 이름이 동일(등록)하므로 호출되는 컨트롤러의 이름만 변경하면 됩니다. 취약한 컨트롤러는 어디에 있습니까? 그렇군요 파일에 사용자.php. 그것은 밝혀졌습니다 $controller = "user" . 모두 합치면 task = user.register 가 됩니다. 이제 등록 요청이 필요한 방법으로 처리됩니다.


두 번째로 해야 할 일은 올바른 형식으로 데이터를 보내는 것입니다. 여기에서는 모든 것이 간단합니다. 합법적인 register()는 이름, 로그인, 암호, 메일(요청과 함께 스크린샷 참조)과 같은 등록 데이터를 전달하는 jform이라는 배열을 기대합니다.

  • /components/com_users/controllers/registration.php: 124: // 사용자 데이터를 가져옵니다. 125: $requestData = $this->input->post->get("jform", array(), "array");

우리 아이는 user라는 배열에서 이 데이터를 받습니다.

  • /components/com_users/controllers/user.php: 301: // 양식 데이터를 가져옵니다. 302: $data = $this->input->post->get("사용자", 배열(), "배열");

따라서 요청의 모든 매개변수 이름을 jfrom에서 user로 변경합니다.

세 번째 단계는 유효한 CSRF 토큰을 찾는 것입니다. CSRF 토큰이 없으면 등록이 되지 않기 때문입니다.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("포스트") 또는 jexit(JText::_("JINVALID_TOKEN"));

MD5 해시처럼 보이며 예를 들어 /index.php/component/users/?view=login 사이트의 인증 양식에서 가져올 수 있습니다.


이제 원하는 방법으로 사용자를 생성할 수 있습니다. 모든 것이 잘 되었다면 축하합니다. 방금 취약점을 악용했습니다. CVE-2016-8870"새 사용자 등록을 위한 권한 확인이 누락되었습니다."

다음은 UsersControllerRegistration 컨트롤러의 "작동하는" register() 메서드에서 보이는 모습입니다.

  • /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. "사이트" 커뮤니티에 가입하여 사이트의 모든 자료 읽기

지정된 기간 동안 커뮤니티에 가입하면 모든 Hacker 자료에 액세스할 수 있고 개인 누적 할인이 증가하며 전문적인 Xakep 점수 등급을 축적할 수 있습니다!

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

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

일반적인 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와 함께 제공되는 네트워크 등록 페이지입니다.

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

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

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

자신만의 가입 페이지를 만들 준비가 되었으면 wp-signup.php는 WordPress가 사용자 입력을 처리 및 확인하고 새 계정을 생성하기 위해 제공하는 다양한 기능을 이해하는 데 도움이 되는 좋은 참조 및 예제입니다.

네트워크 메인 사이트

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

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

functions.php 대안

파일 주문

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

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

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

// MU 플러그인에 대한 번역 로드 load_muplugin_textdomain("selena_network", "/selena-network/languages/"); // 등록 페이지 기능에는 WPMU_PLUGIN_DIR이 필요합니다. "/selena-network/signup/plugin.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"))); 종료; // ...

기본적으로 등록 페이지는 기본 네트워크 도메인에서 열립니다. 이것이 여기서 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_ 접두사 메서드만 수행합니다.

페이지에 등록 양식을 표시하는 함수를 만들어 봅시다. 이렇게 하려면 wp-signup.php를 WordPress 루트에서 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() ( global $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()을 호출합니다.

결과적으로 등록 페이지가 훨씬 보기 좋고 깔끔해졌습니다.

활성화 페이지

기본적으로 WordPress는 조건부로 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 이 필요합니다. "/selena-network/signup/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와 달리 주소를 변경할 수 있는 필터가 없습니다. 대신 올바른 링크가 포함된 이메일을 보내는 고유한 함수를 작성해야 합니다.

등록 페이지에서 양식을 작성하고 제출하면 WordPress에서 wpmu_signup_을 호출합니다. 사용자() 또는 wpmu_signup_ 블로그() 등록 유형에 따라 다름. 두 함수 모두 wp_signups 테이블에 새 항목을 생성하여 계정 활성화 키를 포함하여 필요한 콘텐츠로 채웁니다.

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

If (!apply_filters("wpmu_signup_user_notification", $user, $user_email, $key, $meta)) 거짓을 반환합니다.

블로그 생성과 함께 계정 활성화하기:

If (!apply_filters("wpmu_signup_blog_notification", $domain, $path, $title, $user, $user_email, $key, $meta)) ( 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를 전달 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 WordPress # 기본 WordPress 규칙을 그대로 둡니다 :) # ... # END WordPress

결론

이것과 WordPress와 관련된 다른 많은 "문제"에 대해 인터넷에 많은 솔루션이 있습니다. 예를 들어, 등록 및 활성화 페이지를 만들기 위해 일부는 원래 wp-signup.php 및 wp-activate.php 를 다시 작성할 것을 제안합니다. WordPress를 업데이트하면 파일에 대한 모든 변경 사항이 손실되고 .

추가 기능, 테마 또는 솔루션을 개발할 때 약간의 시간을 들여 WordPress 내부에서 진행되는 작업을 파악하세요. 이를 위한 유용한 디버그 도구가 많이 있습니다.

추신

Multisite User Management 플러그인을 사용하여 새 사용자에게 다른 역할을 자동으로 할당할 수 있습니다.

기사를 읽은 후 등록 및 활성화 페이지를 만드는 동안 질문이나 어려움이 있는 경우 의견을 남겨 주시면 확실히 답변해 드리겠습니다.

27.03.2015 27.03.2015

워드프레스 개발자. 그는 모든 것의 질서를 좋아하고 새로운 도구를 이해하는 것을 좋아합니다. Symfony 컴포넌트 아키텍처에서 영감을 받았습니다.

  • 테마는 일반적으로 작동하지 않지만 때때로 개발자는 테마를 조금 더 좋고 편리하게 만들기 위해 일부 기능을 구현해야 합니다.

    이 자습서에서는 "플러그인 영역"이라는 용어를 살펴보고 Thomas Griffin이 작성한 환상적인 도구인 TGM 플러그인 활성화 라이브러리를 사용하는 방법도 배웁니다.

    테마 기능: 플러그인 영역 침입

    테마는 WordPress 웹사이트의 디자인을 변경하도록 설계되었습니다. 이상적으로 테마는 시각적 측면에만 영향을 주어야 합니다. 그러나 WordPress의 황금기에 플러그인 개발자는 종종 테마에 시장에서 경쟁력을 유지하는 데 도움이 되는 기능을 포함합니다.

    이것은 플러그인 영역의 침범입니다. 우리는 "플러그인 영역"을 기능적인 코드 조각으로 생각할 수 있습니다. 사이트의 기능을 변경하는 코드는 지정된 코드가 WordPress의 핵심에 내장되어 있지 않는 한 플러그인으로 제출해야 합니다.

    나는 이미 내 기사 중 하나에서 "플러그인 영역" 경험 법칙을 공식화했습니다.

    기능이 사이트의 시각적 표시와 관련된 경우 테마에 포함되어야 합니다. 기능과 관련된 경우 별도의 플러그인으로 제공되어야 합니다.

    아주 간단한 규칙. 사람들은 여전히 ​​기능적 스니펫을 테마에 코딩하려고 시도하지만 테마 디렉토리(예: WordPress.org 또는 ThemeForest)는 "플러그인 영역"을 침범하는 테마를 허용하지 않습니다. 따라서 테마에서 기능을 제공하는 것은 분명한 도전이 되었습니다.

    운 좋게도 "플러그인 영역" 규칙에 위배되지 않는 간단한 솔루션이 있습니다.

    TGM 플러그인 활성화 라이브러리 소개

    TGM 플러그인 활성화 구성

    코드 맨 끝에 두 개의 매개변수가 있는 tgmpa() 함수에 주의하십시오. 두 번째 매개변수는 $config 변수이며 $plugins와 마찬가지로 배열이기도 합니다. 이름에서 알 수 있듯이 이 어레이를 사용하여 TGM Plugin Activation 라이브러리를 사용자 정의할 수 있습니다. 변수는 자체 옵션 세트도 허용합니다.

    • id(문자열) - 테마에 있는 TGM 플러그인 활성화 라이브러리의 고유 ID입니다. 이것은 매우 중요합니다. 다른 플러그인도 TGM 플러그인 활성화를 사용하는 경우 다른 ID가 충돌 가능성을 방지합니다.
    • default_path(문자열) - 테마에 있는 플러그인의 기본 절대 경로입니다. 일단 설치하면 ZIP 파일의 이름을 플러그인의 소스 매개변수 값으로 사용할 수 있습니다.
    • menu (문자열) - 플러그인 설치 페이지의 메뉴 슬러그입니다.
    • has_notices (부울) - true로 설정하면 필수/권장 플러그인에 대해 관리자 알림이 발행됩니다.
    • 해제 가능(부울) - true로 설정하면 사용자가 알림을 "해제"할 수 있습니다.
    • disable_msg(문자열) - 해제 가능 옵션이 false로 설정되어 있으면 이 메시지가 관리자 알림 위에 표시됩니다.
    • is_automatic(부울) - true로 설정하면 사용자가 설치에 동의한 후 플러그인이 활성화됩니다.
    • 메시지(문자열) - 플러그인 테이블 앞의 추가 HTML 출력.
    • 문자열(배열) - 출력 메시지를 포함하는 배열입니다. 브로드캐스트 문자열로 지정할 수 있습니다. 모든 게시물의 전체 목록을 보려면 example.php 파일을 살펴보십시오.
    "mytheme-tgmpa", // 고유한 TGMPA ID "default_path" => get_stylesheet_directory() . "/lib/plugins/", // 기본 절대 경로 "menu" => "mytheme-install-required-plugins", // 메뉴 슬러그 "has_notices" => true, // 관리자 알림 표시 "dismissable" => false , // 알림은 무시할 수 없습니다. "dismiss_msg" => "정말로 이 플러그인을 설치해야 합니다. 알겠죠?", // 이 메시지는 nag 상단에 출력됩니다. "is_automatic" => true, // 자동으로 설치 후 플러그인 활성화 "message" => "", // 플러그인 테이블 직전에 출력할 메시지 "strings" => array(); // TGM Plugin Activation이 사용하는 메시지 문자열의 배열); ?>

    결론

    보시다시피 WordPress 테마에서 기능을 제공하는 것이 가능합니다. 한 테마에서 다른 테마로 전환할 수 있는 사용자에 대해 먼저 생각하기만 하면 됩니다. TGM Plugin Activation 라이브러리는 이를 수행하는 정말 현명한 방법을 제공합니다.

    이 도구에 대해 어떻게 생각하세요? 사용해 본 적이 있습니까? 앞으로 사용할 계획이 있습니까? 당신의 생각을 함께 나누세요!

    표준 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=register를 클릭하면 WordPress가 /wp-signup.php 페이지로 리디렉션됩니다. 많은 테마에서 페이지가 그다지 매력적으로 보이지 않으므로 우리가 직접 만들 것입니다.

    네트워크 메인 사이트

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

    함수.php?

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

    서정적 여담

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

    파일 주문

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

    |-mu-plugins |-|-load.php |-|-|-selena-network |-|-|-|-signup |-|-|-|-|-plugin.php |-|-|-| -|-... |-|-|-|-jetpack |-|-|-|-|-plugin.php

    load.php 파일에는 네트워크에 필요한 모든 "플러그인"이 연결되어 있습니다.

    // 모든 애드온에 대한 Traslate 로드 load_muplugin_textdomain("selena_network", "/selena-network/languages/"); // 네트워크 가입에는 WPMU_PLUGIN_DIR이 필요합니다. "/selena-network/signup/plugin.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 플러그인은 일반 플러그인보다 먼저 로드됩니다. 위 참조). 방문자를 동일한 도메인에 유지하기 위해 network_site_url() 대신 home_url()이 사용됩니다. 모든 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 루트에서 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에서 계정 활성화 링크를 보내기 때문입니다. wpmu_signup_user_notification 필터를 사용하여 false를 지정하여 이 기능을 "해제"할 수 있습니다(이 작업을 수행하지 않으면 활성화 문자가 두 번 전송됩니다. 실제로 두 개의 다른 문자가 전송됩니다).

    function 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_headers) ; false 반환; ) add_filter("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

    덕분에 셀레나 테마의 등록 페이지가 훨씬 깔끔하고 깔끔해졌습니다.

    결론

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

    파일을 신중하게 편집하고 원래 파일에서 너무 많이 벗어나지 않도록 노력해야 하므로 향후 WordPress에서 wp-signup.php 및 wp-activate.php 파일을 변경하면 비교하기가 더 쉬울 것입니다. 변경 사항을 찾을 수 있습니다.

    코드 내부에서 무엇이 어떻게 발생하는지 완전히 이해하기 위해 위에서 설명한 모든 함수의 소스 코드를 살펴보는 것을 잊지 마십시오.

    보너스. 스패머 보호

    가장 작은 WordPress 사이트조차도 종종 스팸 등록으로 폭격을 당합니다. 종종 인공 지능을 생성하려는 시도와 같은 봇 필터링을 위한 끝없는 조건을 작성할 수 있습니다. php 및 /wp-acitvate.php(저는 Apache 설정 전문가가 아니므로 제 규칙이 정확하지 않을 수 있습니다.)

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

    추신: 내가 시작할 때 때때로 많은 것을 촉구하고 설명하는 사람이 없었기 때문에 일부 타사 항목을 가능한 한 자세히 설명하려고 노력합니다. 또한 다른 자료에 대한 이러한 작은 팁이 누군가가 새로운 것을 배우고 지식 영역을 확장하도록 유도할 것이라고 믿습니다. RewriteRule 항목은 정규식을 사용하며 전혀 복잡하지 않습니다. 예를 들어 ^ 문자는 줄의 시작을 의미합니다.

    플러그인이 활성화될 때 실행될 함수를 등록합니다.

    이 함수는 지정된 콜백 함수를 activate_(plugin) 후크에 연결하고 이 후크의 래퍼입니다.

    activate_(plugin) 후크의 (plugin)은 기본 플러그인 파일에 대한 상대 경로의 이름으로 대체됩니다. 예를 들어 플러그인 위치가 wp-content/plugins/sampleplugin/sample.php 인 경우 후크 이름은 activate_sampleplugin/sample.php 가 됩니다.

    버전 3.1부터. 후크는 플러그인 활성화 중에만 실행되며 자동 플러그인 업데이트 중에는 실행되지 않습니다.

    작동 원리

    플러그인은 activate_(plugin) 후크를 실행하는 activate_plugin() 함수에 의해 활성화됩니다.

    코어의 activate_plugin() 함수는 VI 환경이 로드된 후 호출됩니다. 이 함수는 기본 플러그인 파일(및 그 안에 있는 모든 것)을 포함하고 후크를 통해 지정된 콜백 함수를 활성화합니다. 이로 인해 플러그인의 모든 기능과 클래스는 콜백 기능에서 사용할 수 있습니다. 그러나 WP 환경을 로드하는 동안 모든 기본 WP 후크가 이미 실행되었으므로 기본 플러그인 파일이 포함되면 plugins_loaded 와 같은 후크에 매달린 플러그인 이벤트가 더 이상 작동하지 않습니다. 즉, 플러그인이 연결되지만 완전하지는 않습니다. 이미 활성화되었을 때 연결해야 하기 때문이 아닙니다.

    예를 들어 플러그인이 plugins_loaded 이벤트 중에 무언가를 수행하면 플러그인이 활성화될 때 모든 작업이 발생하지 않습니다. 예를 들어 번역 파일이 포함된 경우 register_activation_hook()에 지정된 콜백 함수가 실행될 때 번역 파일이 포함되지 않습니다.

    일반적으로 콜백 함수가 트리거된 후 함수를 중단할 수 있는 2개의 이벤트가 있습니다: activated_plugin 및 shutdown .

    플러그인을 활성화할 때 멋진 작업을 수행하려면 예제 5를 참조하세요.

    이용약관

    예를 들어 plugins_loaded , init 와 같은 후크를 트리거하는 순간에 함수가 호출되면 함수가 작동하지 않습니다. 함수는 기본 플러그인 파일에서 직접 호출해야 합니다. 활성화 규칙:

      register_activation_hook()는 Plugin Name: ... 지시문이 있는 기본 플러그인 파일에서 호출해야 하며 plugins_loaded 또는 init와 같은 후크에서 호출하면 안 됩니다.

      후크 기능은 후크와 동일한 파일에 있거나 다른 파일에서 미리 포함되어 있어야 합니다.

      훅 기능에서는 화면으로의 출력(echo)이 되지 않습니다. 리디렉션이 있고 에코가 표시되지 않기 때문입니다. 하지만 die() 를 사용할 수 있습니다.

    1. 후크 함수에서 액세스하려면 전역 변수(있는 경우)를 명시적으로 정의해야 합니다.

    변수 범위에 대한 참고 사항

    플러그인이 활성화되면 메인 플러그인 파일은 전역 범위가 아닌 activate_plugin() 함수 내부에 포함됩니다. 따라서 플러그인의 일반 모드에서 전역으로 간주되는 변수는 전역이 아닙니다.

    예를 들어, register_activation_hook()에서 사용되는 함수는 전역 변수를 해당 함수 내에서 전역으로 선언하더라도 전역 변수를 볼 수 없습니다. 예:

    $myvar = "뭔가"; register_activation_hook(__FILE__, "myplugin_activate"); function myplugin_activate()( global $myvar; echo $myvar; // 변수가 "something"과 같지 않음)

    이 기능 때문에 전역 변수는 항상 명시적으로 지정해야 합니다. 플러그인의 본문에 변수가 지정되어 있더라도 모든 전역 변수는 전역으로 정의되어야 합니다. 이 경우에만 어디서나 액세스할 수 있습니다. 예:

    글로벌 $myvar; // 이것이 전역 변수임을 명시적으로 나타냅니다. $myvar = "something"; register_activation_hook(__FILE__, "myplugin_activate"); function myplugin_activate()( global $myvar; echo $myvar; //> 무언가 )

    후크가 없습니다.

    보고

    없는. 아무것도 반환하지 않습니다.

    용법

    register_activation_hook($file, $function); $파일 (문자열) (필수)플러그인 자체의 이름을 포함하여 플러그인의 기본 php 파일 경로입니다. 일반적으로 매직 PHP 상수 __FILE__이 사용됩니다. $함수 (문자열/배열/람다) (필수)

    콜백 함수의 이름입니다. 클래스의 경우 배열을 사용하십시오. array($this, "function_name"); .

    이 기능은 부울 변수 $network_wide를 수신합니다. 플러그인이 다중 사이트를 사용하여 사이트의 전체 네트워크에 대해 활성화되는지 여부입니다.

    #1. 플러그인이 활성화될 때 기능 트리거

    기본 플러그인 파일 wp-content/plugins/myplugin/myplugin.php 에 my_plugin_activate() 함수가 있다고 가정하고 플러그인 활성화 중에 이 함수를 실행하려면 다음 코드를 사용하십시오.

    Register_activation_hook(__FILE__, "my_plugin_activate"); function my_plugin_activate() ( // 활성화 코드... )

    #2. 클래스 메서드 실행

    플러그인이 PHP 클래스를 사용하는 경우 다음과 같이 활성화 코드가 추가됩니다.

    Register_activation_hook(__FILE__, array("My_Plugin", "설치")); class My_Plugin ( static function install() ( // 여기에 출력을 생성하지 마십시오... ) )

    #삼. 별도의 파일에서 클래스 메서드 실행

    활성화 함수를 포함하는 클래스가 별도의 파일에 있는 경우 다음과 같이 활성화 함수를 등록합니다.

    include_once __DIR__ . "/class-My_Plugin.php"; register_activation_hook(__FILE__, array("My_Plugin", "on_activate_function"));

    #4. 클래스 자체에서 클래스 메서드 실행

    __construct() 안에 있는 경우. 중요, __FILE__은 기본 플러그인 파일을 "보아야" 합니다.

    Register_activation_hook(__FILE__, array($this, "YOUR_METHOD_NAME"));

    #5 플러그인 활성화 직후 작업 수행

    플러그인이 활성화된 후에는 activated_plugin 및 shutdown의 두 후크만 트리거됩니다.

    플러그인을 활성화한 직후에 무언가를 해야 할 때 플러그인에 기능을 첨부할 수 있습니다.

    해당 솔루션이 작동하지 않으면 WP 옵션을 사용할 수 있습니다. 옵션에 데이터를 저장한 다음 옵션을 확인한 다음 옵션이 있는 경우 조치를 취하십시오.

    // 메인 플러그인 파일. ... function my_plugin_activate() ( // 나중에 존재하는 경우 작업을 수행하도록 옵션을 추가합니다. add_option("Activated_Plugin", "Plugin-Slug"); // 여기에 활성화 코드... ) register_activation_hook(__FILE__, " my_plugin_activate"); function load_plugin() ( if (is_admin() && get_option("Activated_Plugin") == "Plugin-Slug") ( // 더 이상 작동하지 않도록 추가된 옵션을 제거하고 // 필요한 작업을 수행합니다... delete_option( "Activated_Plugin "); // 플러그인을 활성화한 후 한 번 수행 // 예: add_action("init", "my_init_function"); ) ) add_action("admin_init", "load_plugin");

    플러그인 활성화 중에 무언가를 할 수 있는 또 다른 옵션은 다음과 같이 고유한 이벤트를 만드는 것입니다.

    Function my_plugin_activate()( // 플러그인 파일에서 연결할 수 있도록 후크를 설치합니다. do_action("my_plugin_activate"); ) register_activation_hook(__FILE__, "my_plugin_activate");

    #6 함수 사용의 또 다른 데모

    기능 사용 방법을 보여주는 작은 플러그인:

    /* 플러그인 이름: 테스트 설명: 테스트 */ require_once dirname(__FILE__) . "/my_other_file.php"; /* 이 코드는 작동하지 않습니다. 활성화 후크는 기본 파일에서 호출해야 합니다. register_activation_hook (dirname(__FILE__) . "/my_other_file.php", "my_other_function"); */ // 작동하는 코드입니다. register_activation_hook(__FILE__, "test_activated"); /* 이것은 전역 변수를 선언하고 액세스하는 올바른 방법입니다. 전역 변수는 명확하게 선언해야 합니다. 이것이 없으면 액세스할 수 없습니다. */ 글로벌 $some_var; $some_var = "야"; // 활성화 함수 function test_activated()( // 여기서 $some_var은 hey global $some_var와 같지 않습니다. // 그리고 여기서 $some_var는 hey와 같습니다. // 이 함수는 "my_other_file.php" 파일에 정의되어 있습니다. my_other_function (); /* 임시 파일에 로그를 기록하려면 fopen/fwrite를 사용하십시오. 활성화 후크가 작동하는지 테스트하려면 후크 함수 내에서 exit()를 사용하십시오. */ echo "test_activated called !"; )