내 코드를 넣을 위치 : plugin 또는 functions.php?


86

있습니까 방식은 이해하기 쉬운 플러그인이나 테마의에 속하는 코드의 종류를 결정하는 functions.php?

있습니다 많은 경우 많은 논쟁 이 항목에 대한 워드 프레스의 내부 동작에 대한 몇 가지 오해가 주로 있기 때문에. 의견이 아닌 사실에 근거한 답변을 요청하고 있습니다.

이러한 점을 처리하는 방법을 설명해야합니다.

종종 양쪽에 장단점이 있습니다. 우리의 가장 인기있는 질문 귀하의 functions.php 파일에 대한 최상의 코드 컬렉션은 적어도 논쟁의 여지가있는 답변으로 많은 코드 스 니펫을 얻었습니다.
우리는 초보자가 이해할 수있는 기준, 아마도 점검 목록을 필요로합니다.

메타 사이트에서 Chip Bennett의 관련 질문도 참조하십시오. "플러그인없이"솔루션을 요구하는 질문

관련 : 내가 찾은 코드 스 니펫은 어디에 또는 웹의 다른 곳에 배치해야합니까?


이 질문의 목적을 위해 무엇이 사실을 구성하는지 궁금합니다. Person A는 CPT가 플러그인에 있고, Person B는 CPT가 테마에 있다고 말합니다. 의견 중 하나를 확인하기 위해 사실을 어떻게 조달 할 수 있습니까? 이것은 "건설적이지 않은"위험에 가깝습니다.
Rarst

답변:


72

나는이 질문으로 시작할 것이다 : 기능 은 컨텐츠의 표현 , 컨텐츠, 사이트, 사이트 또는 사용자 신원의 생성 / 관리 와 관련이 있는가?

기능이 경우 관계없는 특이 콘텐츠의 프리젠 테이션 , 그것은 플러그인 영역 내 정면이다. 이 목록은 길다 :

  • 핵심 WP 필터 수정 ( wp_head표준 링크, 생성기 및 기타 HTML 메타 등의 컨텐츠)
  • 사이트 파비콘
  • 컨텐츠 후 단축 코드
  • 게시물 공유 링크
  • Google 웹 로그 분석 및 유사 바닥 글 스크립트
  • SEO 툴 / 컨트롤
  • 기타

기능이있는 경우 관련 으로 내용의 프리젠 테이션 , 다음은 인 후보 테마에 포함되기에이. 이 시점에서, 나는에 복귀 할 Raf912의 테마 스위치 기준 @ : 당신이 테마를 전환 할 때이 기능을 놓칠? 해당 질문에 대한 답변이 no 인 경우 기능은 테마에 속합니다. 몇 가지 예 :

  • WP 코어 갤러리 CSS 제거 / 재정의
  • 게시물 발췌 길이 필터링, "더 읽기"텍스트 등
  • 통해 구현 된 모든 것 add_theme_support()(이것이 분명해야한다고 생각합니다)
  • 맞춤 CSS

일반적으로이 두 질문은 상당히 명확한 차별화를 제공합니다. 그러나 예외가 있습니다.

맞춤 게시물 유형

예를 들어, 사용자 정의 게시물 유형은 템플리트 계층이 단일 게시물 유형 아카이브 색인 페이지단일 게시물 페이지에 대해 작동하는 방식을 고려할 때 컨텐츠 생성 및 프리젠 테이션의 독특한 혼합입니다 . CPT의 컨텐츠 생성 측면은 보통 플러그인 영역에 CPT를 배치합니다. 그러나 플러그인은 특정 테마의 디자인 / 레이아웃 / 스타일에 본질적으로 맞는 템플릿 페이지를 정의 할 수 없습니다 (특히 CPT가 일반적인 제목 / 콘텐츠 / 메타 이외의 항목을 표시하거나 이와 연관된 사용자 정의 분류법이있는 경우).

이러한 불일치에 대한 장기 해결책 인 IMHO는 특정 유형의 컨텐츠 (부동산 리스팅, 캘린더 이벤트, 전자 상거래 제품, 서적 / 미디어 라이브러리 항목 등)에 대한 CPT 정의에 대한 표준 컨벤션 / 컨센서스를 갖도록하는 것입니다. ). 이렇게하면 사용자 생성 컨텐츠는 주어진 CPT의 표준 / 컨벤션 정의를 구현하는 테마간에 이식성이 유지되는 반면 테마 개발자는 테마 템플리트 파일에서 해당 CPT의 디자인 / 레이아웃 / 스타일을 정의 할 수있는 유연성을 유지합니다.

소셜 미디어 링크

마찬가지로, 나는 일반적으로 소셜 미디어 프로필 링크는 현재 테마에서 유비쿼터스가되었지만 컨텐츠 표시 와 관련이 없기 때문에 플러그인 영역이라고 말합니다 . 가장 좋은 해결책은 이러한 프로파일을 핵심 어딘가에 정의하는 것입니다. 그러나 현재 이러한 링크를 정의하는 표준 / 합의 수단은 없습니다. 사이트 설정 수준 또는 사용자별로 가장 잘 정의되어 있습니까? 사용자 별 인 경우 어떤 사용자의 메타가 템플릿에 노출됩니까? 기타

다시 말해, 이러한 차이에 대한 해결책은 핵심적으로 이러한 링크가 정의 된 위치를 정의하거나 테마 개발자 커뮤니티가 자체 합의를 개발하는 것입니다. 그 동안에는 각 테마 내에서 정의 된 것을 유지하는 것 외에는 아무것도 없습니다.


add_theme_support( 'automatic-feed-links' );프레젠테이션이 아닙니다. 그러나 테마 지침에 필요합니다 . 테마 전환 후이 기능을 해제해야하는 이유는 무엇입니까?
fuxia

1
통해 add_theme_support()구현 된 것은 테마를 통해서만 구현할 수 있습니다. add_theme_support( 'automatic-feed-links' )테마 내에서 사용하면 실제로 생성 된 피드 링크가 동일하므로 테마에서 테마로 일관된 환경을 보장 합니다.
칩 베넷

4
이름이 잘못되었다고 생각합니다. 피드 링크가 표시되지 않습니다. 다음 테마가 해당 기능을 호출하지 않으면 사용자는 피드 링크를 잃게됩니다. 그리고 문제없이 플러그인별로 추가 할 수 있습니다. 그래서 내가 그것에 대해 혼란스러워합니다. :)
fuxia

1
알다시피 : 좋은 지적입니다. :)
칩 베넷

50

코드가 가장 잘 배치되는 쉬운 테스트 :

  • functions.php에 코드를 작성하십시오
  • 테마 전환
  • 기능이 빠졌습니까, 블로그가 제대로 작동하지 않거나 이전 테마의 단편 (예 : 단축 코드)이 남아 있습니까?

    • 예 : 플러그인에 넣으십시오.

    • 아니오 : functions.php에 남겨 두십시오.

예 : 단축 코드를 작성하십시오. 테마를 전환하면 일반 단축 코드가 게시물에 남습니다. 따라서 플러그인에 더 잘 배치됩니다.

마지막 주석을 나열하는 함수를 작성하십시오. 테마를 전환 한 후 다른 테마의 기능이 동일하기 때문에 모든 것이 정상입니다.

실제로 코드와 수행 할 작업에 따라 다릅니다. 일부 코드는 테마의 스타일이나 내용에만 영향을 미치고 일부는 블로그 게시물을 수정합니다.


11
+1 코드가 테마와 관련된 경우을 넣습니다 functions.php. 둘 이상의 테마에 적용해야하는 경우 플러그인에 넣으십시오.
s_ha_dum

18

이 질문에 대한 쉬운 대답은 없다고 생각하지만 결정에 도움이되는 순서도를 만들 수 있습니다. 이러한 흐름도의 대략적인 개요는 다음과 같습니다. 제안 사항이있는 댓글!

  • 이 코드는 WordPress의 단일 사이트 설치에서 호스팅됩니까?
    • 예-사이트의 테마는 주요 재 설계 및 기능 변경으로 만 변경됩니까?
      • 예-문제의 코드 가이 현재 디자인에만 적용 됩니까?
        • 예 : functions.php
        • 아니오 : 플러그인
      • 아니요 (자주 변하는 경우)-플러그인
    • 아니요 (Multsisite)-멀티 사이트 설치를 호스팅하고 있습니까, 아니면 플러그인을 허용하는 호스팅 된 멀티 사이트 솔루션입니까?
      • 예 : 해당 기능 이이 사이트에만 해당 됩니까, 아니면 네트워크의 다른 사이트에서 사용할 수 있습니까?
        • 이 사이트에만 해당 : functions.php
        • 여러 사이트에서 공유-모든 사이트에서 강제 실행 하시겠습니까?
          • 예 : 플러그인, mu-plugins 디렉토리에 저장되거나 네트워크 활성화
          • 아니요 : 관련없는 사이트 의 네트워크 입니까? (예 : 다른 고객)
            • 예 : 클라이언트 A가 클라이언트 B, C 및 D에 대해 작성한 플러그인을 보거나 활성화 한 경우 나쁘거나 비전문가입니까? (예 : 사이트를 손상 시키거나 바람직하지 않은 기능을 유발할 수 있음)
              • 예 : functions.php
              • 아니오 : 플러그인
            • 아니요 : 아마도 플러그인
      • 아니요 (플러그인을 허용하지 않는 VIP와 같은 서비스에서 호스팅) : functions.php를 사용하십시오.
내가 여기에 들어가는 방법을 몰랐다는 다른 생각들 :

  • 부모 테마-때로는 공유 기능을 사용하는 경우 부모 테마를 만들고 부모 테마의 functions.php 파일에 기능을 배치하는 것이 좋습니다.
  • 대규모 다중 사이트 설치의 플러그인 디렉토리는 금방 엉망이 될 수 있으므로 때때로 낮은 비율의 사이트 (예 : <1 %)에서 사용하는 공유 기능이 functions.php 파일에 복제하는 것이 가장 좋습니다.

6

여기에서 테마 VS 플러그인

부모 테마를 업데이트 할 때 사용자 정의 코드가 손실되지 않도록 자식 테마에 사용자 정의 코드를 추가하십시오.

또한 모든 사용자 지정 코드가 포함 된 사이트 별 플러그인을 만들 수도 있습니다.

코드 대 플러그인을 작성하는 한 플러그인을 사용하고 원하는 기능을 사용할 수는 있지만 수동 코딩은 메타 박스와 같은 경우를 제외하고는 플러그인 사용을 고려할 수있는 메타 상자와 같은 경우를 제외하고 수정하기가 가장 좋습니다. '테마 개발자입니다.

 function modify_contact_methods($profile_fields) {

// Add new fields
$profile_fields['twitter'] = 'Twitter Username';
$profile_fields['facebook'] = 'Facebook URL';
$profile_fields['gplus'] = 'Google+ URL';

return $profile_fields;
}
add_filter('user_contactmethods', 'modify_contact_methods');

http://codex.wordpress.org/Plugin_API/Filter_Reference/user_contactmethods

  1. 새로운 맞춤 게시물 유형 추가- 코드
  2. 사용자에게 새 필드 추가-위 코드
  3. 새 위젯 추가- 코드
  4. 사용자 지정 영구 링크 추가-WordPress 영구 링크 설정

5

나는 이것이 죽은 말이라는 것을 알고 있으며 칩은 거의 그것을 덮었지만 몇 가지 생각을 추가하고 싶었습니다.

생생한 프로그래밍을 하고 마감일에 따라 워드 프레스 사이트에서 작업하는 것을 발견하면 실제로 시간이 지남에 따라 알게됩니다.

종종, 특히 방금 시작한 사람들에게는 테마에 필요한 것을 추가하고 호출하는 것이 훨씬 빠르고 간단합니다.

즉, 정기적으로 워드 프레스를 사용하는 경우 다음을 수행하는 것을 진지하게 고려해야합니다 .


  1. 플러그인 스켈레톤 구축

활성화, 비활성화, 버전 업데이트, 관리자 패널 빌드 및 제거를 포함하여 플러그인과 관련하여 일반적으로 필요한 모든 것을 처리해야합니다.

시간을 내면 다음을 찾을 수 있습니다.

  • 플러그인을 통해 기능을 추가하는 데 더 이상 시간이 걸리지 않습니다.
  • 필요한 경우 다른 프로젝트에서 재사용 할 수있는 견고한 플러그인 목록을 작성하여 장기적으로 많은 시간을 절약 할 수 있습니다.
  • 추가 가시성을 원할 경우 공개적으로 사용할 수 있습니다

이제 제대로 구축 하고 향후 프로젝트를 더 빨리 완료 할 수 있습니다.


  1. 테마 스켈레톤 구축

테마에서 일반적으로 필요한 모든 것을 처리해야합니다.

  • 자주 사용하는 스타일 (리셋 등)이 포함 된 핵심 스타일 시트
  • 템플릿에 필요한 모든 것을 처리하는 적절한 index.php 파일
  • functions.php 파일-거의 많이 사용하지는 않지만 여전히 유용합니다.

일단 완료하면 기본 테마를 사용하는 하위 테마 스켈레톤을 빌드하십시오.

  • 부모 테마를 참조하여 스타일 시트를 추가하십시오.
  • functions.php 파일 추가

이 두 가지 작업을 완료하면 사람들을위한 새 사이트를 만드는 것이 훨씬 빨라집니다.


위의 작업을 수행하면 다음 작업을 수행 할 수 있습니다.

  • PHP, WordPress, JavaScript, CSS 및 / 또는 mySQL에 익숙해지면서 새로 찾은 자유 시간을 보내십시오.
  • 개선해야 할 사항을 찾으면 플러그인, 테마 및 하위 테마 스켈레톤을 업데이트하십시오. 아무리 훌륭하더라도 계속 배우면 개선이 이루어질 것입니다.

그리고 위의 모든 작업을 수행 하면 Chip의 답변이 이상적 일뿐 만 아니라 최적의 상태가 될 것입니다.


3

간단한 대답은 이것입니다.

코드가 특정 테마에 내장 된 기능에 의존합니까? 그렇다면 테마를 넣으십시오.

이 코드를 사이트간에 또는 테마간에 전송할 수 있기를 원하십니까? 그렇다면 플러그인을 넣으십시오.

위의 두 가지 모두에 대한 대답이 아니라면 향후 5 년 동안 사이트를 재 설계해야 할 시점에 사진을 그리십시오. 작성중인 코드의 기능이 다음 디자인 업데이트에서 살아남을 수 있습니까? 그렇다면 플러그인을 넣으십시오.

또한 하위 테마를 사용하지 않고 테마를 업데이트하려는 경우 플러그인을 사용하는 것이 좋습니다.

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