플러그인 개발을위한 객관적인 모범 사례? [닫은]


135

플러그인 개발을위한 객관적인 모범 사례 를 수집하기 위해 커뮤니티 위키를 시작합니다 . 이 질문은 wp-hackers에 대한 @EAMann의 의견에서 영감을 얻었습니다 .

아이디어는 어떤 객관적인 모범 사례가 될 수 있는지에 대해 협업하여 일부 커뮤니티 협업 검토 프로세스에서 잠재적으로 사용할 수 있도록합니다.

업데이트 : 처음 몇 가지 응답을 본 후에는 답변 당 하나의 아이디어 / 제안 / 모범 사례가 필요하며 사람들은 목록을 검토하여 게시하기 전에 중복이 없는지 확인해야합니다.


나는 커뮤니티 위키가 SE와 함께 이것 (그리고 다른 것들)에서 어떻게 제대로 작동 해야하는지 이해하지 못하지만 메타에 관한 질문 일 수 있습니다. 그것은 답안에 주로 속임수를 쌓을 것입니다.
hakre

@hakre : 좋은 지적입니다. 내용을 본 후에 사람들이 "답변"당 하나의 아이디어 만 추가해야한다는 설명에 설명을 추가하고 기존 답변을 여러 답변으로 변경하겠습니다.
MikeSchinkel

답변:


72

동작 및 필터 사용

사람들이 일부 데이터를 추가하거나 변경한다고 생각하는 경우 : return_ 전에 apply_filters ()제공 하십시오 .

추신 : 조금 실망스럽고 귀하의 질문에 대한 답변은 최종 사용자 전용으로 설계된 플러그인의 비율입니다. 즉, 자체 후크가없는 플러그인입니다. 워드 프레스가 대부분의 플러그인처럼 설계되었다고 상상해보십시오. 융통성이없고 매우 틈새 솔루션입니다.

WordPress가 다른 플러그인이 의존하는 플러그인을 자동 설치하는 기능이 있다면 상황이 다를 수 있습니까? 클라이언트는 특정 방식과 사용 가능한 플러그인을 원하기 때문에 처음부터 필요한 많은 기능을 작성해야하지만 90 %는 나머지 10 %를 유연하게 업데이트 할 수 없습니다.

WordPress 커뮤니티를 선도하는 사람들이 StackExchange 사이트에서 좋은 답변을 얻는 것과 마찬가지로 모범 사례 (예 : 다른 개발자를위한 후크 추가)에 따라 플러그인이 보상되도록하는 방법을 식별하기를 바랍니다.

다른 질문 에서 예를 들어 봅시다 .

예 : 누군가가 기사를 리트 윗 할 때 플러그인에서 무언가를하고 싶습니다. 인기있는 리트 윗 플러그인에 커스텀 훅이 있다면 내가 연결하고 해고 할 수 있다면 좋을 것입니다. 플러그인을 포함하도록 플러그인을 수정할 수는 없지만 내 사본에만 적용되며 재배포하려고하지 않습니다.

관련


55

wp_enqueue_script및로 스크립트 / CSS로드wp_enqueue_style

플러그인은 JS / CSS 파일의 중복 버전, 특히 WP Core에 포함 된 jQuery 및 기타 JS 파일을로드 /로드하려고 시도해서는 안됩니다.

플러그인은 항상 JS와 CSS 파일을 링크 할 때 사용 wp_enqueue_script하고 태그 wp_enqueue_style를 통해 직접 사용해서는 안됩니다 <script>.

관련


1
제안 : 인큐 시스템의 일부이기 때문에 의존성을 사용하는 것에 대해 약간의 메모를 할 가치가 있습니다.
t31os

맞습니다. 그러나 스타일과 스크립트를 등록한 다음 ID를 통해이 스크립트를 대기열에 넣는 것이 좋습니다. 다른 개발자가 스크립트를 변경하거나 사용자 정의 플러그인에서 사용하는 것이 좋습니다. 순서를 변경하거나 여름 파일을 만드는 것이 더 쉽습니다.
bueltge

2
또한 필요한 경우 페이지에 스크립트 및 스타일을로드하십시오. scribu.net/wordpress/optimal-script-loading.html
MR

49

I18n 지원

개발자가 자체 플러그인 번역에 관심이없는 경우에도 모든 출력 문자열을 적절한 텍스트 도메인에 연결하여 이해 당사자가 국제화 할 수 있도록해야합니다.

init사용자가 작업에 연결할 수 있도록 작업 중에 언어 파일을로드하는 것이 매우 중요합니다 .

코덱스 : WordPress 개발자를위한 I18n 참조

또한이 기사 : WP 언어 파일을 올바르게로드 하십시오 .

WordPress 4.6 이상부터

WP 4.6은로드 순서와 위치를 변경하여 개발자와 사용자가 훨씬 쉽게 만들었습니다.

텍스트 도메인 'my-plugin'이있는 플러그인을 고려하면 WordPress는 이제 다음 위치에서 번역 파일을 찾습니다.
/wp-content/languages/plugins/my-plugin-en_US.mo

그것이 하나를 찾지 못하면 플러그인이 찾도록 지시하는 곳을 찾습니다 (일반적으로 코덱스를 따르는 경우 pluigns 'language'폴더에서) :
/ wp-content / plugins / my-plugin / languages ​​/ my- plugin-en_US.mo

마지막으로 언어 파일이 없으면 /wp-content/languages/my-plugin-en_US.mo 의 기본 위치를 확인합니다.

첫 번째 검사는 4.6에서 추가되었으며 개발자가 언어 파일을 추가 한 위치를 알아야하기 전에 사용자에게 언어 파일을 추가 할 수있는 정의 된 위치를 제공합니다. 이제 사용자는 플러그인의 텍스트 도메인을 알아야합니다. / wp-content / 언어 / 플러그인 /TEXTDOMAIN-LOCAL.mo


아래는 구식입니다 (WP 4.6+ 이후에는 관련이 없음)

[...]
마지막으로 플러그인과 함께 제공되는 언어 파일을로드하기 전에 WP_LANG_DIR에서 사용자 정의 사용자 언어 파일로드 하는 것이 중요하다는 점을 지적하고자합니다 . 동일한 도메인에 여러 개의 mo 파일이로드되면 처음 찾은 번역이 사용됩니다. 이런 식으로 플러그인에서 제공하는 언어 파일은 사용자가 번역하지 않은 문자열에 대한 폴백 역할을합니다.

public function load_plugin_textdomain()
{
    $domain = 'my-plugin';
    // The "plugin_locale" filter is also used in load_plugin_textdomain()
    $locale = apply_filters( 'plugin_locale', get_locale(), $domain );

    load_textdomain( 
            $domain, 
            WP_LANG_DIR . '/my-plugin/' . $domain . '-' . $locale . '.mo' 
    );
    load_plugin_textdomain( 
            $domain, 
            FALSE, 
            dirname( plugin_basename(__FILE__) ) . '/languages/' 
    );
}

나에게 가장 중요한 것. 추가 작업은 많지 않지만 영어를 모국어로 사용하지 않는 수백만 명의 사용자에게 플러그인을 더 유용하게 만들 수있는 것 중 하나입니다. 단어를 직접 번역 할 필요는 없지만 번역 할 모든 것을 준비하십시오.
2ndkauboy

이것은 매우 귀중하지만 쉬운 일입니다. 동의한다고 말하고 싶었고 모든 플러그인 작성자 가이 작업을 수행해야합니다.
t31os

48

WP_DEBUG에서 플러그인이 오류를 생성하지 않도록 확인

항상 플러그인을 설정 한 상태 WP_DEBUG에서 플러그인을 테스트 하고 개발 프로세스 전체에서 플러그인을 켜는 것이 가장 좋습니다. 플러그인은 WP_DEBUGon으로 오류를 발생시키지 않아야합니다 . 더 이상 사용되지 않는 알림 및 확인되지 않은 인덱스가 포함됩니다.

디버깅을 켜려면 상수가로 설정 wp-config.php되도록 파일을 편집하십시오 . 자세한 내용은 Codex on Debug 를 참조하십시오.WP_DEBUGtrue


답변 당 모범 사례 만있는 것에 대한 업데이트를 참조하십시오. 여러 답변으로 나눌 수 있습니까?
MikeSchinkel

물론 문제 없습니다. 미안합니다.
John P Bloch

고마워요, 당신의 감독이 아니 었습니다. 중복에 대한 @hakre의 질문 과이 작업을 수행하는 방법에 따라 답변 당 하나의 모범 사례를 요청하도록 질문을 수정했습니다.
MikeSchinkel

6
이 답변을 두 번 공표 할 수 있다면 그렇게 할 것입니다. 개발자 사이트에서 작업 할 때 너무 실망 스럽습니다. 사용해야 할 플러그인이 경고를 알리고 곳곳에 알리기 때문에 WP_DEBUG를 꺼야합니다.
Ian Dunn

42

WordPress Core에서 기존 함수 사용

가능한 경우 : 직접 작성하는 대신 WordPress 코어에 포함 된 기존 기능을 사용 하십시오. WordPress core에 적절한 기존 함수가없는 경우에만 사용자 정의 PHP 함수를 개발하십시오.

한 가지 이점은 "사용되지 않는 로그 기록"사용 하여 교체해야하는 기능을 쉽게 모니터링 할 수 있다는 것입니다. 또 다른 이점은 사용자가 Codex에서 함수 설명서를 볼 수 있으며 숙련 된 PHP 개발자가 아니더라도 플러그인의 기능을 더 잘 이해할 수 있다는 것입니다.

관련


여기서 가장 큰 문제 중 하나는 적절한 기존 기능이 존재한다는 사실을 배우는 것입니다. 유용한 것은 코드 및 / 또는 기능을 게시 할 수있는 장소가 될 것이며 커뮤니티는 어떤 기능을 가장 잘 사용할 수 있는지 의견을 제시 할 수 있어야합니다. 아마도 StackExchange를 사용할 수 있습니까?
MikeSchinkel

푸 그것은 꽤 어려울 것이고 나는 일종의 끝없는 작업을 추측합니다. 코덱이 이미 존재하기 때문에 이러한 방식으로 확장하는 것이 가장 좋습니다.
카이저

나는 코덱을 확장하고 거기에서 관련 주식 교환 스레드로 연결하는 것이 충분할 것이라고 생각합니다.
kaiser

4
이것의 문제는 많은 코어가 실제로 재사용 성을 위해 구조적으로 설계되지 않았다는 것입니다. downsize ()와 같은 함수가 post-type = 'attachment에 대한 하드 코딩 된 검사를 포함하는 일부 함수를 호출하기 때문에 이미지 처리 / 메타 데이터 함수의 절반을 복사하고 약간 수정하여 내 자신의 첨부 파일과 같은 동작 포스트 유형을 만듭니다. '. 융통성없는 wp_count_posts ()와 같은 많은 것이 또 다른 예입니다. 코어 WP를 실제로 재사용하려면 완전한 리팩토링이 필요합니다.
wyrfel

이것에 완전히 동의하십시오. 내가 가장 좋아하는 예 : wp-login.php. 따라서 "만약 당신이 할 수 있다면"이 답을위한 좋은 출발점이되었습니다.
kaiser

35

제거하면 모든 플러그인 데이터가 제거되어야합니다

플러그인은 WordPress 설치에서 제거되면 작성된 모든 파일, 폴더, 데이터베이스 항목 및 테이블과 작성된 옵션 값을 삭제 해야합니다.

플러그인은 설정을 내보내거나 가져 오는 옵션을 제공하여 삭제하기 전에 WordPress 외부에 설정을 저장할 수 있습니다.

관련


4
이것은 기본 동작이어야합니다. 그러나 비디오 게임을 제거 할 때 저장된 게임과 다운로드 한 자료를 제거 할 것인지 묻는 메시지와 같이 사용자에게 데이터를 유지하라는 메시지도 표시됩니다. 사용자는 테스트 목적으로 만 플러그인을 비활성화하고있을 때 다시 활성화 할 때 옵션 설정을 다시 수행하고 싶지 않을 수 있습니다.
EAMann

1
플러그인이 비활성화되었을 때가 아니라 완전히 제거 된 시점에 대해서만 이야기하고 있습니다.
Travis Northcutt

2
이해하지만 ... 때때로 플러그인을 삭제하여 리포지토리에서 아직 호스팅되지 않은 백업 또는 베타 버전에서 수동으로 다시 추가 할 수 있습니다 ...
EAMann

4
@EAMann :이를 위해 플러그인을 다른 서버로 마이그레이션하려면 플러그인에서 설정을 내보내고 가져 오는 메커니즘을 제공해야합니다.
hakre

2
일부 플러그인은 설정에서 "제거"버튼을 제공하여 큰 빨간색 경고를 표시하며 모든 데이터를 삭제합니다. 이것은 비활성화와 별개이며 처리하는 좋은 방법이라고 생각합니다. 모든 사람이 "삭제"버튼을 사용하여 플러그인을 제거하는 것은 아닙니다.
gabrielk

34

입력 데이터로 SQL 삽입 방지

플러그인은 해야 검색된 모든 사용자 입력을 직접 또는 간접적으로 (통해 예 살균 $_POST또는$_GET MySQL 데이터베이스를 쿼리 입력 값을 사용하기 전에).

SQL 문 형식화를 참조하십시오 .


5
또한 데이터가 오는 살균한다 밖으로 데이터베이스. 기본적으로 하드 코딩되지 않은 데이터는 절대 신뢰하지 마십시오. codex.wordpress.org/Data_Validation 도 좋은 참고 자료입니다.
Ian Dunn

31

모든 전역 네임 스페이스 항목 접두사

플러그인은 모든 전역 네임 스페이스 항목 (상수, 함수, 클래스, 변수, 사용자 정의 분류법, 게시물 유형, 위젯 등)을 올바르게 접두어로 사용해야합니다. 예를 들어 init(); 이라는 함수를 만들지 마십시오 . 대신, 이름을 다음과 같이 지정하십시오 jpb_init().

일반적으로 이름 앞에 3-4 개의 접두사를 사용하거나 PHP 네임 스페이스 기능을 사용해야합니다 . 비교 : PHP 클래스 상수에 대한 단일 문자 접두어를?

관련


31

클래스와 객체 지향 PHP5 코드 사용

깨끗하고 객체 지향적 인 PHP5 코드를 작성하지 않을 이유가 없습니다. PHP4 지원은 다음 릴리즈 (WP 3.1) 이후 단계적으로 중단됩니다. 물론 모든 함수 이름 앞에 endlessly_long_function_names_with_lots_of_underscores를 붙일 수 있지만 간단한 클래스를 작성하고 그 안에 모든 것을 묶는 것이 훨씬 쉽습니다. 또한 클래스를 별도의 파일에 넣고 그에 따라 이름을 지정하여 쉽게 확장하고 유지할 수 있습니다.

// in functions.php
require 'inc/class-my-cool-plugin.php';
new MyCoolPlugin();

// in inc/class-my-cool-plugin.php
class MyCoolPlugin {
    function __construct() {
        // add filter hooks, wp_enqueue_script, etc.

        // To assign a method from your class to a WP 
        // function do something like this
        add_action('admin_menu', array($this, "admin"));
    }

    public function admin() {
        // public methods, for use outside of the class
        // Note that methods used in other WP functions 
        // (such as add_action) should be public
    }

    private function somethingelse() {
        // methods you only use inside this class
    }
}

새로운 MyCoolPlugin ()을 사용하지 마십시오. 난 당신이 후크를 통해 WP에 연결하는 것이 좋습니다 생각 : plugins_loaded
bueltge

확실하지 않습니다. 코덱에 따르면 plugins_loaded는 가장 먼저로드 된 것 중 하나이므로 이와 같은 구성을 수행하거나 작업으로 추가하는 것은 약간의 차이가 있다고 생각합니다.
Husky

5
모든 사람에게 더 좋은 모범 사례 중 하나 일뿐입니다.
Arlen Beiler

1
내가 볼 수있는 한 plugins_loaded에 훅을 추가하면 개선이 없으며, 메모리 사용량이 증가하고 작업을 수행해야 할 때 속도가 느려지면 개선이 없기 때문에 가장 좋은 방법은 아닙니다. 방금 추가 된 작업 대신. 또한 OO를 사용하는 것이 모범 사례로 간주되어서는 안됩니다.
Backie

4
@IanDunn : PHP4 지원을 원하지만 2008 년 이후로 4 년 전에 PHP4 지원이 중단되었습니다. 여전히 PHP4 특정 검사를 사용할 이유가 없습니다.
Husky


23

필요한 파일 만 포함하십시오 ...

프런트 엔드에있는 경우 관리 영역과 관련된 코드를 포함하지 마십시오.


21

플러그인 제거시 데이터 손실 발표

설치 제거시 플러그인 사용자에게 데이터를 삭제할지 묻는 메시지를 표시하고 데이터를 삭제하기 전에 사용자가 데이터를 삭제해도된다는 확인 메시지를 수신 해야 하며, 플러그인 설치 제거시 데이터를 유지할 수있는 옵션허용 해야합니다 . (@EAMann의 아이디어입니다.)

관련


3
워드 프레스 자체는 관리자에게 경고 메시지를 표시합니다 (적어도 현재 트렁크에서는).
hakre

WordPress에 표시되는 경고 메시지 외에, 제거시 플러그인이 이미 비활성화되어 있기 때문에 플러그인이 사용자에게 프롬프트를 표시하는 것은 불가능합니다. 그러나 티켓 # 20578을 참조하십시오 .
JD

19

플러그인의 폴더 이름을 변경하자

/ plugins / pluginname / {various}

폴더에 사용 된 "pluginname"은 항상 변경 가능해야합니다.

이것은 일반적으로 상수를 정의하고 플러그인 전체에서 상수를 사용하여 처리합니다.

말할 것도없이 많은 인기있는 플러그인은 죄인입니다.

관련 :

  • plugins_url() 플러그인에 포함 된 리소스에 쉽게 연결할 수 있습니다.

플러그인 폴더의 이름을 바꾸면 자동 업데이트가 중단되므로 최선의 방법인지 잘 모르겠습니다.
mtekk

어쨌든 변경을 수행 한 후 플러그인을 다시 활성화해야합니다 (이름 변경으로 인해 플러그인이 비활성화 될 수 있음).이 시점에서 WP는 플러그인과 관련된 적절한 DB 항목을 다시 만들거나 업데이트합니다 (그래서 업데이트를 전혀 중단).
t31os

상수를 사용하는 대신 plugin_basename(__FILE__)플러그인의 로컬 이름을 알아내는 데 사용하십시오. 동일한 플러그인 (테스트, 다른 곳의 여러 계정이지만 플러그인 당 하나만 ...)의 사본을 보유하는 데 유용합니다.
Raphael

19

WordPress 사용 (내장) 오류 처리

return;일부 사용자 입력이 잘못되었다고 하지 마십시오 . 정보가 잘못되었다는 정보를 전달하십시오.

function some_example_fn( $args = array() ) 
{
    // If value was not set, build an error message
    if ( ! isset( $args['some_value'] ) )
        $error = new WP_Error( 'some_value', sprintf( __( 'You have forgotten to specify the %1$s for your function. %2$s Error triggered inside %3$s on line %4$s.', TEXTDOMAIN ), '$args[\'some_value\']', "\n", __FILE__, __LINE__ ) );

    // die & print error message & code - for admins only!
    if ( isset( $error ) && is_wp_error( $error ) && current_user_can( 'manage_options' ) ) 
        wp_die( $error->get_error_code(), 'Theme Error: Missing Argument' );

    // Elseif no error was triggered continue...
}

모두에 대한 하나의 오류 (객체)

부트 스트랩 중에 테마 또는 플러그인에 대한 전역 오류 객체를 설정할 수 있습니다.

function bootstrap_the_theme()
{
    global $prefix_error, $prefix_theme_name;
    // Take the theme name as error ID:
    $theme_data = wp_get_theme();
    $prefix_theme_name = $theme_data->Name;
    $prefix_error = new WP_Error( $theme_data->Name );

    include // whatever, etc...
}
add_action( 'after_setup_theme', 'bootstrap_the_theme' );

나중에 요청시 무제한 오류를 추가 할 수 있습니다.

function some_theme_fn( $args )
{
    global $prefix_error, $prefix_theme_name;
    $theme_data = wp_get_theme();
    if ( ! $args['whatever'] && current_user_can( 'manage_options' ) ) // some required value not set
        $prefix_error->add( $prefix_theme_name, sprintf( 'The function %1$s needs the argument %2$s set.', __FUNCTION__, '$args[\'whatever\']' ) );

    // continue function...
}

그런 다음 테마 끝에서 모두 가져올 수 있습니다. 이렇게하면 페이지 렌더링을 방해하지 않고 개발에 대한 모든 오류를 여전히 출력 할 수 있습니다

function dump_theme_errors()
{
    global $prefix_error, $prefix_theme_name;

    // Not an admin? OR: No error(s)?
    if ( ! current_user_can( 'manage_options' ) ! is_wp_error( $prefix_error ) )
        return;

    $theme_errors = $prefix_error->get_error_messages( $prefix_theme_name );
    echo '<h3>Theme Errors</h3>';
    foreach ( $theme_errors as $error )
        echo "{$error}\n";
}
add_action( 'shutdown', 'dump_theme_errors' );

이 Q 에서 추가 정보를 찾을 수 있습니다 . 이와 관련된 티켓은의 "협력"수정하기 WP_Errorwp_die()거기에서 링크 된 다른 티켓이 따를 것이다. 의견, 비평가 등이 높이 평가됩니다.


WP_Error 객체를 속성에만 액세스하고 인스턴스를 객체로 전달하지 않으면 왜 WP_Error 객체를 인스턴스화합니까?
ProfK

@ProfK 나는 그것을 더 짧게 재 작업했으며 제목 / 내용 wp_die();이 잘못되었습니다 (역전). 당신의 Q에 대해) 나는 그것을 완전히 얻지 못했습니다. 당신이 WP_Error 클래스의 인스턴스를 설정하면 같은 기능을 통해 데이터에 대한 전체 액세스 권한이 get_error_code();, get_error_message();, get_error_data();및 복수 버전. 테마 또는 플러그인의 부트 스트랩에서 한 번만 인스턴스화하고 $error->add();다른 오류를 채우고 바닥 글에 출력 $error->get_error_messages();하여 모두를 잡을 수 있습니다.
카이저

@ProfK 이 Q에 대한 향후 업데이트를 게시 할 것 입니다. 현재 wp 오류 클래스의 동작을 검사 중이며 공개 테마 오류 API에 대한 티켓을 작성하려고합니다 (초안이 이미 완료되었습니다). 당신이 가져 오는 또 다른 티켓에 대한 링크를 찾을 수 WP_Errorwp_die()가깝게를 Q. 귀하의 의견, 제안, 비판의 하단에 (이미 패치가 있습니다) 및 다른 높게 평가된다.
kaiser

18

글로벌 네임 스페이스에 추가 된 이름 최소화

플러그인 전역 네임 스페이스에 추가하는 이름의 수를 최소화하여 가능한 한 영향줄여야합니다 .

플러그인의 함수를 클래스로 캡슐화하거나 PHP 네임 스페이스 기능 을 사용하면 됩니다. 모든 것을 접두사로 사용하면 도움이 될 수 있지만 그렇게 유연하지는 않습니다.

함수와 클래스 옆에 플러그인 전역 변수를 도입 해서는 안됩니다 . 클래스를 사용하면 일반적으로 사용되지 않으며 플러그인 유지 관리가 간단 해집니다.

관련


"글로벌 변수를 도입해서는 안됩니다" 를 자체 답변으로 옮기 시겠습니까? 즉 (모두 내가 동의 할 수있다 생각하기 때문에 특별한 경우 내가 다른 사람의 의견에서 배우고 싶어하기 때문이다.)이 질문 별도로으로 관련이 실제로 하나의 나는 토론하고 싶습니다
MikeSchinkel

17

PhpDoc을 사용한 댓글

모범 사례는 PhpDoc 스타일에 가깝습니다. "Eclipse"와 같은 IDE를 사용하지 않는 경우 PhpDoc Manual을 살펴보십시오 .

이것이 어떻게 작동하는지 정확히 알 필요는 없습니다. 전문 개발자는 어쨌든 코드를 읽을 수 있으며 요약으로 필요합니다. 취미 코더와 사용자는 동일한 지식 수준에서 설명하는 방식에 감사 할 수 있습니다.


17

add_option 전에 설정 API를 사용하십시오.

add_option 함수를 통해 DB에 옵션을 추가하는 대신 모든 것을 처리 하는 설정 API 를 사용하여 옵션을 배열로 저장해야 합니다.

add_option 전에 테마 수정 API 사용

수정 API는 매우 간단한 구조와 옵션을 추가하고 검색 할 수있는 안전한 방법입니다. 모든 것이 데이터베이스에 직렬화 된 값으로 저장됩니다. 쉽고 안전하며 간단합니다.


1
그리고 또한, 사용 update_option결코 add_option존재하지 않는 경우, 업데이트 기능은 옵션을 만들 수 없습니다 .. :)
t31os

3
절대 사용하지 않는다고 말하지 않을 것 add_option입니다. add_option옵션이 이미 설정되어 있으면 변경되지 않는 좋은 사용 사례 가 있으므로 기존 사용자 환경 설정을 유지하기 위해 활성화에 사용합니다.
ProfK

1
또 다른 사용 사례 add_option는 자동로드를 명시 적으로 비활성화하려는 경우입니다 . update_option자동로드를 강제로 true로 설정하므로 자동로드를 사용하지 않으려면 add_option옵션을 처음 작성할 때 사용 하십시오.
Dave Romsey

16

플러그인 사용자 개인 정보 보호

(이전 : 익명 API 통신)

플러그인이 외부 시스템 또는 API (예 : 일부 웹 서비스)와 통신하는 경우 익명으로 수행하거나 사용자에게 익명 옵션을 제공하여 플러그인 사용자와 관련된 데이터가 제어되지 않은 제 2 자에게 누출되지 않도록해야합니다.


15

WordPress.org의 호스트 플러그인

플러그인 호스팅을 위해 WordPress.org제공된 SVN 저장소를 사용하십시오 . 사용자 경험을보다 쉽게 ​​업데이트 할 수 있으며 이전에 SVN을 사용한 적이 없다면이를 정당화하는 컨텍스트에서이를 사용하여 실제로 이해할 수 있습니다.


15

권한을 사용하여 액세스 제어 제공

대부분의 경우, 사용자는 여러 복잡한 작업을 수행하는 플러그인을 사용하여 플러그인으로 생성 된 영역에 모든 사람이 액세스하는 것을 원하지 않을 수 있습니다. 단일 하드 코딩 기능 검사로는 충분하지 않을 수 있습니다.

최소한 플러그인을 사용할 수있는 모든 종류의 절차에 대해 적절한 기능 검사를 수행하십시오.


12

플러그인 설정 가져 오기 / 내보내기

플러그인마다 공통적 인 것은 아니지만 플러그인에 (일부) 설정이있는 경우 구성 및 사용자 입력과 같은 데이터 가져 오기 / 내보내기를 제공 해야 합니다 .

가져 오기 / 내보내기는 플러그인의 사용성을 향상시킵니다.

이러한 가져 오기 및 내보내기 기능 (및 실행 취소 메커니즘)이있는 예제 플러그인은 Breadcrumb NavXT (Wordpress Plugin )입니다.

관련


12

코드 정리

실행 순서대로 작성되지 않은 코드는 항상 읽기가 어렵습니다. 먼저 wp_enqueue_style & _script 등을 포함 / 요구, 정의, 플러그인 / 테마 및 필요한 빌더 기능 (예 : 관리 화면, 테마에 통합 된 항목 등)

css 및 js와 같은 것을 자체 폴더로 분리하십시오. 또한 배열 플래 튼 및 이와 유사한 도우미와 같은 함수 로도이 작업을 수행하십시오. "메인"파일을 가능한 한 깨끗하고 읽기 쉬운 상태로 유지하면 1 년 안에 업데이트하려고 할 때 더 오랜 시간 동안 코드를 보지 못한 사용자, 개발자 및 사용자에게 도움이됩니다.

자주 반복하는 구조를 갖는 것이 좋으므로 항상 길을 찾으십시오. 다른 프로젝트에서 알려진 구조로 개발하면 더 나은 시간을 가질 수 있으며 고객이 다른 개발자로 전환하더라도 "혼돈을 떠났다"는 말을 듣지 못할 것입니다. 이것은 당신의 명성을 쌓고 장기 목표가되어야합니다.


나는 이것이 사람들이 토론 할 스타일에 대해 너무 많은 것이라며 모든 존경받는 사람들이 동의 할 객관적인 모범 사례가 아니라고 두려워합니다. 사람들이 아무리 의미가 있더라도 논란의 여지가있는 항목이 아니라 목록을 "축복"하는 데 동의 할 수 있도록 객관적인 모범 사례 만 다루는 것이 매우 중요합니다.
MikeSchinkel

11

스타일로 죽어라

괜찮은 방식으로 죽으십시오 모든 플러그인 (및 테마) 기능은 wp_die()중요한 장소에서 사용자에게 발생한 정보를 조금 제공하기 위해 사용해야합니다 . PHP 오류는 성가 시며 wp_die플러그인 (또는 플러그인)이 잘못한 것에 대해 멋진 스타일의 메시지를 사용자에게 줄 수 있습니다. 또한 사용자가 디버깅을 비활성화하면 플러그인이 중단됩니다.

를 사용하면 wp_die()플러그인 / 테마가 워드 프레스 테스트 스위트 와 호환되는 데 도움이됩니다 .

관련 :

11

사용자를위한 도움말 화면 제공

질문에 몇 번이고 다시 대답해야하는 것보다 RTFM (도움말 클릭)을 대답으로 말하는 것이 좋습니다.

/**
  * Add contextual help for this screen
  * 
  * @param $rtfm
  * @uses get_current_screen
  */ 
  function ContextualHelp( /*string*/ $rtfm) 
  { 
     $current_screen = get_current_screen();
     if ($current_screen->id == $this->_pageid) 
     {
        $rtfm .= '<h3>The WordPress Plugin - Screen A</h3>';
        $rtfm .= '<p>Here are some tips: donate to me ' .
     }
     return $rtfm; 
  }
add_action('contextual_help', array($this,'ContextualHelp'),1,1);

업데이트 / 참고 : (kaiser의 의견 참조) : 위 예제는 클래스에서 사용됩니다


(특정 관리자 UI 화면을 설명해야하는 한) 모든 사람의 도구 상자에 있어야합니다. +1
Kaiser

Btw : 이것은 클래스에 상주하고 $ this-> _ page_id와 상호 작용하는 방법 및 functions.php 또는 클래스가없는 플러그인 파일에서 액션 후크를 추가하는 경우의 방법에 대해 언급해야합니다. .
카이저

10

확장 가능한 양식 제공

플러그인이 데이터를 입력 할 수있는 가능성을 제공하는 경우, 항상 "제출"및 / 또는 "재설정"버튼 바로 앞 끝에 후크가 있어야하므로 개발자는 필드뿐만 아니라 버튼으로도 양식을 쉽게 확장 할 수 있습니다.

참조 : 설정 API

관련


9

직접이 아닌 후크를 통해 항상 기능을 포함하십시오.

예:

  • 후크없이 new를 통해 플러그인 클래스를 포함시키는 데 사용하지 마십시오.

  • 후크 플러그인 사용

    // add the class to WP                                   
    function my_plugin_start() {                                                               
        new my_plugin();   
    }                                                        
    add_action( 'plugins_loaded', 'my_plugin_start' );

업데이트 : 작은 라이브 예제 : Plugin-svn-trunk-page 및 pseudo 예제

//avoid direct calls to this file where wp core files not present
if (!function_exists ('add_action')) {
        header('Status: 403 Forbidden');
        header('HTTP/1.1 403 Forbidden');
        exit();
}

if ( !class_exists( 'plugin_class' ) ) {
    class plugin_class {

        function __construct() {
        }

    } // end class

    function plugin_start() {

        new plugin_class();
    }

    add_action( 'plugins_loaded', 'plugin_start' );
} // end class_exists

:에 mu_plugins_loaded를 통해 당신은 또한, 멀티 사이트 설치 작업을 참조의 사본 볼로드 할 수 있습니다 http://codex.wordpress.org/Plugin_API/Action_Reference 또한 여기이 훅 WP을 inlcude 어떻게 볼 수 있습니까 : HTTP : // adambrown합니다. info / p / wp_hooks / hook / plugins_loaded? version = 2.1 & file = wp-settings.php 나는 이것을 매우 자주 사용하고 그렇게 어렵지 않고 일찍 사용하지 않습니다.


@bueltige --- 좀 더 설명해 주시겠습니까?
NetConstructor.com

3
작은 라이브 예 : [Plugin-svn-trunk-page] svn.wp-plugins.org/filter-rewrite-rules/trunk/… 의사 예제 //avoid direct calls to this file where wp core files not present if (!function_exists ('add_action')) { header('Status: 403 Forbidden'); header('HTTP/1.1 403 Forbidden'); exit(); } if ( !class_exists( 'plugin_class' ) ) { class plugin_class { function __construct() { } } // end class function plugin_start() { new plugin_class(); } add_action( 'plugins_loaded', 'plugin_start' ); } // end class_exists
bueltge

2
@ Netconstructor.co-나는 스레드를 업데이트했습니다, 주석은 코드에 대한 추악하지 않습니다
bueltge

8

GPL 호환 라이센스에 따른 라이센스 플러그인

플러그인 및 테마 WordPress 호환 라이센스에 따라 라이센스가 부여 되어야 합니다. 이를 통해 워드 프레스를 "프로그램"으로 재분배 할 수 있습니다. 권장 라이센스는 GPL 입니다. 플러그인에 포함 된 모든 코드 라이브러리가 동일한 라이센스와 호환되는지주의하십시오.

(이것은 과거와 현재 의 문제 이자 진지한 논쟁의 포인트였습니다 .)


지금 당장 GPL 호환성을 유지하자 : core.trac.wordpress.org/ticket/14685
hakre

8

플러그인 설명은 플러그인의 기능을 정확하게 설명해야합니다. 추천 플러그인 10 개가 있습니다. 그들 모두는 추천 게시물을 표시하지만 많은 기능이 다릅니다. 설명을 읽고 플러그인을 유사한 플러그인과 쉽게 비교할 수 있어야합니다.

플러그인이 정말 기본적이 아닌 한 플러그인이 얼마나 간단한 지 자랑하지 마십시오. 설정에 대한 링크와 같이 설명에 유용한 링크를 포함시켜야합니다.


7

원격 데이터 소스 및 웹 서비스의 부작용 최소화

플러그인 웹 서비스 응답을 느리게 기다리는 요청을하지 않기 위해 캐싱 / 데이터 공급자 계층을 통해 캐시 / 쉴드 웹 서비스 및 / 또는 XMLRPC / SOAP 요청을 캐시 해야합니다.

여기에는 RSS 피드 및 기타 페이지 다운로드가 포함됩니다. 플러그인이 백그라운드에서 데이터를 요청하도록 설계하십시오.

가능한 한 단계는 (예를 들어 ping.fm에 게시하십시오) : 버퍼 테이블을 작성하십시오. ping_fm_buffer_post (날짜, 시간, 메시지, submit_time, status)

  1. ping.fm에 업데이트를 제출할 때마다이 테이블에 업데이트를 추가하십시오.
  2. 이제이 데이터를 처리 할 플러그인을 만들어야합니다. 이 플러그인은 crontab을 통해 실행되어 아직 제출되지 않은 모든 업데이트를 확인합니다.
  3. 이 테이블이 있으므로 ping.fm에 제출 된 모든 메시지를 나열하고 각 게시물의 상태를 확인할 수도 있습니다. ping.fm 측에 문제가있는 경우 다시 제출할 수 있습니다.

나는 이것이 당신이 정확히 어디로 향하고 있는지 이해하지 못합니다. 지원 자료에 대한 링크를 제공 할 수 있습니까?
MikeSchinkel

또한 "Net Overhead" 가 무엇인지 정확히 모르겠습니다 . 더 나은 용어가 없습니까? 더 명확하다면 더 객관적인 규칙이 될 것입니다. 그리고 "방지" 는 불가능합니다; 대신 "최소화"
MikeSchinkel

당신은 (아마) 맞습니다. 나쁜 표현과 예방은 불가능합니다. 더 잘 맞습니다.
hakre

7

플러그인 테스트

플러그인 개발 환경에 몇 가지 테스트 도구가 있어야합니다.

을 바탕으로 이 대답 하여 에단 페르 테스트 질문에, 이들은 따라야 할 모범 사례는 다음과 같습니다

  • 당신의 유닛 테스팅은 클래스가 수행 할 수있는 최소의 행동을 테스트해야합니다.
  • 기능 테스트 수준에 도달하면 Wordpress 종속성으로 코드를 테스트 할 수 있습니다.
  • 플러그인의 기능에 따라-ID를 사용하여 DOM에 데이터가 있는지 테스트하는 Selenium 기반 테스트 사용을 고려하십시오.

테스트는 중요하지만, 단위 테스트는 가장 큰 것이 아니라 가장 작은 것을 테스트해야한다고 말하는 것은 현명하지 않은 것 같습니다. WordPress 종속 문제를 테스트하는 데 어려움이 있다면 WordPress 핵심을 살펴보십시오. 항목이 작동했는지 확인하는 데 사용할 수있는 내부 전역 변수가 많이 있습니다.
Backie

1
그러나 가장 작은 것을 먼저 다루는 것이 기본이므로 WordPress를 사용하여 기능 테스트에 도달 할 수 있습니다. 그렇지 않습니까?
페르난도 Briano

1
이것은 응용 프로그램이 아닌 플러그인입니다. Java 런타임없이 Java 응용 프로그램을 테스트 할 수 있습니까? 그렇습니다. Java를 모형으로 작성한 다음 플러그인을 테스트하십시오. 버그가 모형에있을 가능성이 있습니다. *) 면책 조항 또는 원시 코드로 컴파일합니다.
edelwater 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.