테마에서 플러그 가능한 기능을 재정의하는 방법은 무엇입니까?


10

내가 만난 모든 문서는 플러그인을 통해 플러그 가능한 기능을 재정의하는 것에 대해 설명합니다.

테마 개발을하고 있다면 어떨까요?

내 functions.php에는 get_user_by()에 정의 된 함수 를 재정의하는 다른 파일이 필요합니다 pluggable.php.

if( function_exists() )전화를 생략하면 "재 선언 할 수 없습니다 ..."오류가 발생합니다.

if( function exists() )호출을 포함하면 오류가 발생하지 않지만 플러그 가능한 버전이 존재하기 때문에 내 기능은 무시됩니다.

에 도미닉의 멋진 게시물에 기반 워드 프레스 시작하기 위해 , 그 분명 pluggable.php로드 하기 전에 테마의 functions.php그 오류를 설명하고 있으므로, 등등합니다.

문제는 플러그인을 작성하거나 테마와 함께 번들로 설치하지 않고도 테마 내에서 멋진 플러그 가능한 아키텍처를 어떻게 활용할 수 있습니까?

추가 참고 사항 : 따라서 테마가 플러그인이 수행하는 작업을 수행해서는 안된다는 주장이 있습니다. 그러나이 주장은 4 년이 넘었습니다 (4 자리 트랙 번호에 따라). 오늘날의 테마 개발 환경의 복잡한 토폴로지를 고려할 때이 철학이 여전히 적용되는지 여부를 많은 타자들로부터 듣고 싶습니다. 그 이후로 우리가 진화했다고 믿고 싶습니다.

컨텍스트 : 많은 사용자 지정 메타 데이터, 관리자 백엔드 사용자 지정, 로그인 / 인증 프로세스, 작업을 통해 고객을위한 일회용 CMS 솔루션을 개발 중입니다. 그리고 물론, 디자인 요소있다 -.의 테마 부분이 들어오는 사실은, 이들이 단순히 하지 재사용 가능한 구성 요소 - 그들은 다른 클라이언트에 적용되지 않습니다, 그들은 GPL 아래에 넣어되지 않습니다 및 오픈 소스, 그들은 대부분입니다 확실히 다른 워드 프레스 배포에 배포 / 설치되지 않아야합니다. 기껏해야 향후 프로젝트에 활용할 모범 사례가 있지만 이는 참조 / 복사-붙여 넣기 작업이 될 것입니다.

이것은 플러그인의 유스 케이스처럼 들리지 않습니다. 테마는 아마도 Twenty Eleven의 하위 테마 일 수도 있고 독립형 일 수도 있습니다. functions.php는 포함 된 보트로 호출되며 각각은 해당 CMS의 다른 측면을 처리합니다. 그런 다음 테마 템플리트 파일은 포함에 정의 된 사용자 정의 '템플릿 태그'를 사용합니다. 일부 플러그인 또는 다른 플러그인에 의존하는 테마 파일을 갖고 싶지 않습니다. 시스템에 복잡성을 구축하는 것은 의미가 없습니다. 물론 필자는이 플러그인을 필수 플러그인 폴더에 넣을 수 있지만 지금은 여전히 ​​해킹처럼 느껴 집니다.이 프로젝트의 사용자 정의와 관련된 모든 것은에 포함되어 wp-content/themes/my-theme/있습니다. 또한 일부 플러그인 폴더에서 물건을 검색하는 것을 고려하고 싶지 않습니다.

내가 틀리지 마 나는 플러그인을 좋아하고 그것들을 사용하고 작성합니다. 그리고 플러그인이 타사 일 이러한 종류의 고도로 맞춤화 된 테마 개발과 함께 플러그인을 사용 하며 합리적인 기간 내에 출시 할 수있는 것 이상의 모범 사례를 나타냅니다. 그러나 일회성 시나리오의 핵심 기능을 수정해야 할 때 작업 후크, 필터 후크로 전환하고 사용자 및 인증 측면에서도 플러그 가능한 기능에 의존하고 싶습니다.



오순절에, 그 이유에 대한 좋은 설명과 함께 티켓이 다시 닫혔습니다.
Tom Auger

답변:


10

단일 클라이언트 용으로 구축하는 경우 반드시를 활용해야합니다 mu-plugins.

WordPress에는 할 수없는 일이 많이 있습니다 functions.php. 플러그 가능 기능은 그 중 하나이지만보다 확실한 것은 여러 가지 후크 (동작 및 필터 모두)가 발생하기 전에 발생 functions.php합니다. 경우에 따라 이러한 후크는 일반 플러그인보다 먼저 실행되기 mu-plugins때문에 네트워크 활성화 플러그인 을 사용해야 합니다. 다른 경우에는 mu-plugin조차 너무 늦습니다. 아마도에 뭔가가 필요할 것입니다 sunrise.php. 또는의 무언가 (상수 또는 그렇지 않은) wp-config.php.

차라리 쉽게 오버라이드 할 수 있도록 플러그 가능한 함수에 후크를 추가하고 싶습니다. 우리는 다시 플러그 가능한 또 다른 기능을 가질 가능성이 거의 없습니다. 그것들은 후크를 업데이트하고 좋은 구식 (신형?) 후크에 비해 이점이있는 상황을 거의 보지 못했습니다.

6 년이 지난 지금도 앤디 스켈 튼 (Andy Skelton)은 "테마의 기능 파일과 플러그인 사이에는 많은 차이점이 있습니다. 그런 식으로 유지하자"고 동의합니다.

모든 것을 제쳐두고, 이런 변화는 결코 일어날 수 없었습니다. 많은 것들을 망칠 것입니다. 셀 수없이 많은 테마가 함수를 호출 functions.php하면 pluggable.php이미로드되지 않은 경우 치명적인 오류가 발생합니다 ( 예 current_user_can(): 또는) wp_create_nonce(). 그들은 모두 실패 할 것입니다. 그리고 플러그인도 깨뜨릴 수 있습니다. 보통 플러그인에서이 함수를 호출 할 수 plugins_loaded있습니다. (그저 pluggable.php아래로 이동 하면 wp-settings.php코어의 절반이 깨질 것입니다. 또는 최소한 사용자 정의 프로그램은 그럴 것입니다.)

마지막으로, 테마에 별도의 파일이 포함되어있어 pluggable.php플러그인을로드 할 때로드 할 수 있으므로 플러그 가능한 함수를 재정 의 할 수 있다는 아이디어가 있습니다. 이것은 나쁜 생각 (이 주석의 처음 네 단락 참조) 외에도 setup_theme스타일 시트와 템플릿 값을 필터링하여로드 할 테마를 무시할 수 있기 때문에 여전히 호환되지 않습니다 .

불행히도, 워드 프레스가 어떻게 구성되어 있는지를 감안할 때 이것은 불가능합니다. 좋은 방법은 셀 수없는 (더 나은) 방법이 있다는 것입니다.

(원래 여기에 게시 : http://core.trac.wordpress.org/ticket/2479#comment:5 )


시간을내어 답변을 교차 게시 해 주셔서 감사합니다. 당신이 그것을 설명 했으므로, 나는 당신의 길을 봅니다. 맞는 말이다. 감사!
Tom Auger

5

일회성 프로젝트의 맥락에서 필수 코드를에 삽입하는 것이 절대적으로 적합합니다 mu-plugins. "한 번에 모두 적용"이 문제가되는 경우 테마 디렉토리에서 mu-plugins드롭 인에 대한 심볼릭 링크를 만들면 테마 디렉토리를 검색 할 때 표시됩니다.


Mark, symlink에 대한 제안에 감사드립니다. 마이그레이션에 도움이되지는 않지만 개발시 매우 편리합니다.
Tom Auger

0

로딩 순서가 너무 이르다는 방법은 생각할 수 없습니다.

제정신 솔루션에 가장 가까운 것은 wp-config.php(코드 또는 사용자 요청) 사용자 정의 포함을 추가하는 것이지만 번들 번들 플러그인과 비교하면 더 의미가 있습니다.


그래, 말해봐
Tom Auger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.