it-swarm-ko.tech

객관적인 모범 사례?

플러그인 개발을위한 모범 사례 objective를 모으기위한 커뮤니티 위키 시작하기. 이 질문은 wp-hackers에 대한 @ EAMann의 의견에 영감을 받았습니다. .

아이디어는 객관적인 모범 사례가 무엇인지에 대해 공동 작업을하는 것이므로 커뮤니티 공동 작업 검토 프로세스에서 잠재적으로이를 사용할 수 있습니다.

UPDATE : 처음 몇 개의 답변을 본 후 답변 당 하나의 아이디어/제안/모범 사례 만 있으면되고 사람들은 게시하기 전에 중복되지 않도록 목록을 검토해야합니다.

131
MikeSchinkel

작업 및 필터 사용

사람들이 일부 데이터를 추가하거나 변경하려는 경우 다음과 같이 생각하십시오. 반환하기 전에 apply_filters () } 제공.

추신 한 가지 실망스러운 점은 질문에 답하는 것이 최종 사용자만을 위해 설계된 플러그인의 비율 즉, 자체적 인 후크가없는 플러그인의 비율입니다. WordPress가 대부분의 플러그인처럼 디자인되었다고 상상해보십시오. 융통성이없고 매우 틈새 솔루션입니다.

워드 프레스가 다른 플러그인이 의존하는 플러그인을 자동으로 설치할 수 있다면 상황이 달라질 수 있습니까? 클라이언트가 특정 방식으로 사용 가능한 플러그인을 원하기 때문에 일반적으로 90 %는 나머지 10 %를 업데이트 할 수있는 유연성을 허용하지 않기 때문에 일반적으로 필요한 기능을 처음부터 작성해야합니다.

나는 WordPress 커뮤니티를 이끌고있는 사람들이 좋은 답변이 StackExchange 사이트에서 보상받는 것과 같은 베스트 프랙티스 (예 : 다른 개발자를위한 후크 추가)에 대한 플러그인에 대한 보상을받을 수있는 방법을 찾길 바란다.

다른 질문 의 예를 들어 봅시다.

예 : 누군가가 기사를 리트 윗 할 때 내 플러그인에서 무언가를하고 싶습니다. 인기있는 리트 윗 플러그인이 무엇이든간에 사용자 정의 후크가있어서 내가 연결하여 불을 끄면 좋을 것입니다. 거기에, 그래서 내가 그것을 포함하도록 자신의 플러그인을 수정할 수 있지만, 내 복사본에 대해서만 작동하고, 나는 그것을 재배하려고하고 싶지 않아.

관련

69
Arlen Beiler

스크립트/CSS에 wp_enqueue_scriptwp_enqueue_style로드

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

플러그인은 JS와 CSS 파일을 연결할 때 항상 wp_enqueue_scriptwp_enqueue_style를 사용해야하며 <script> 태그를 통해 직접적으로 사용하지 않아야합니다.

관련

53
Rick Curran

I18n 지원

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

init 작업 중에 언어 파일을로드해야 사용자가 작업에 연결할 수 있습니다.

코덱스 참조 : WordPress Developers의 경우 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/languages ​​/ plugins/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/' 
    );
}
49
EAMann

WP_DEBUG로 플러그인이 오류를 발생시키지 않는지 확인하십시오

WP_DEBUG 켜져있는 플러그인을 항상 테스트하고 개발 프로세스 전반에 걸쳐 사용하도록 설정하는 것이 이상적입니다. 플러그인은 WP_DEBUG를 사용하여 오류를 던져서는 안됩니다. 여기에는 사용되지 않는주의 사항 및 점검되지 않은 색인이 포함됩니다.

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

47
John P Bloch

WordPress Core에서 처음으로 기존 기능 사용

당신이 할 수있는 경우 : 자신의 글을 쓰는 대신에 WordPress core 에 포함 된 기존 함수를 사용하십시오. WordPress 핵심에 적절한 기존 함수가 없을 때만 커스텀 PHP 함수를 개발하십시오.

한 가지 이점은 "log deprecated notices"를 사용하여 쉽게 교체해야하는 기능을 모니터 할 수 있다는 것입니다. 또 다른 이점은 사용자가 Codex에서 함수 문서를 볼 수 있고 경험 많은 PHP 개발자가 아니더라도 플러그인이 수행하는 것을 더 잘 이해할 수 있다는 것입니다.

관련

41
kaiser

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

WordPress 설치에서 제거되면 플러그인은 생성 한 모든 파일, 폴더, 데이터베이스 항목 및 테이블 을 삭제해야합니다. 뿐만 아니라 옵션 값 도 만들었습니다.

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

관련

34
Travis Northcutt

입력 데이터로 SQL 주입 방지

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

참조 : SQL 문 형식 지정 .

33
MikeSchinkel

클래스와 객체 지향 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
    }
}
30
Husky

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

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

그것의 공통점은 이름 앞에 3 또는 4 개의 문자 접두사를 사용하거나 PHP Namespace Feature 를 사용해야합니다. 비교 : PHP 클래스 상수에 대한 단일 문자 접두사?

관련

29
John P Bloch

비활성화로 인해 데이터 손실이 발생하지 않아야 함

플러그인 해서는 안됨 deactivation .

관련

26
MikeSchinkel

필요한 파일 만 포함 ...

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

23
Denis de Bernardy

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

설치 제거시 플러그인 해야합니다 사용자에게 프롬프트 표시 데이터 를 삭제하고 사용자가 데이터를 삭제하기 전에 데이터가 삭제되었다는 확인 메시지를 받고 플러그인 should 제거 할 때 사용자에게 데이터 를 유지하는 옵션을 허용합니다. (@EAMann의 아이디어입니다.)

관련

21
MikeSchinkel

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()의 "공동 작업"을 수정하는 관련 티켓이 링크되어 있으며 다른 티켓도 따라옵니다. 댓글, 비평가 등이 인정됩니다.

19
kaiser

플러그인의 폴더 이름 변경 가능

/ plugins/pluginname/{various}

폴더에 사용 된 "플러그인 이름"은 항상 변경 가능해야합니다.

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

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

관련 항목 :

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

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

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

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

함수 및 클래스 옆에 플러그인should not전역 변수를 도입해야합니다. 클래스를 사용하면 일반적으로 클래스가 더 이상 사용되지 않으며 플러그인 유지 관리가 단순화됩니다.

관련

18
hakre

PhpDoc을 사용한 댓글

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

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

17
kaiser

Add_option 전에 설정 API 사용

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

Add_option 전에 테마 수정 API 사용

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

17
kaiser

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

(이전 : 익명 API 통신)

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

16
EAMann

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

많은 경우, 사용자는 특히 플러그인이 여러 복잡한 작업을 수행하는 플러그인을 사용하여 만든 영역에 모든 사용자가 액세스 할 수 없도록하려는 경우 하드 코딩 된 기능 검사 하나만으로는 충분하지 않을 수 있습니다.

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

15
eddiemoya

WordPress.org의 호스트 플러그인

플러그인을 호스팅하려면 SVN repository WordPress.org에서 제공됨 을 사용하십시오. 더 쉽게 사용자 경험을 업데이트하고 이전에 SVN을 사용 해본 적이 없다면 그것을 정당화하는 컨텍스트에서 사용하여 실제로 이해할 수 있습니다.

14
pixeline

코드 구성

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

자신의 폴더에서 css와 js 같은 것을 분리하십시오. 또한 array flatteners와 비슷한 헬퍼 만 사용하는 함수로이 작업을 시도하십시오. "메인"파일을 가능한 한 깨끗하고 읽기 쉬운 것으로 유지하는 것은 1 년 내에 업데이트하려고 시도하고 더 오랜 시간 동안 코드를 보지 않은 사용자, 개발자 및 사용자를 돕는 방법입니다.

자주 반복하는 구조를 갖는 것도 좋은 일이기 때문에 항상 길을 찾을 수 있습니다. 다른 프로젝트에서 알려진 구조로 개발하면 시간을 절약 할 수 있으며 클라이언트가 다른 개발자로 전환하더라도 "그는 혼란을 겪었습니다"라는 말을 결코들을 수 없습니다. 이것은 명성을 쌓고 장기 목표이어야합니다.

12
kaiser

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

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

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

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

관련

12
hakre

스타일로 죽어라.

괜찮은 방식으로 죽는다 모든 플러그인 (그리고 심지어 테마) 함수는 중요한 장소에서 wp_die()을 사용하여 일어난 일에 대해 사용자에게 약간의 정보를 제공해야한다. PHP 오류는 성가신 일이며 wp_die는 플러그인에 잘못된 스타일을 지정한 멋진 메시지를 사용자에게 제공 할 수 있습니다. 또한 사용자가 디버깅을 비활성화 한 경우 플러그인이 중단됩니다.

wp_die()을 사용하면 플러그인/테마가 wordpress testsuite 와 호환 될 수 있습니다.

11
kaiser

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

다시 질문에 답하는 것보다 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);

update/note : (카이저의 의견보기) : 위의 예제는 클래스에서 사용됩니다

11
edelwater

확장 가능한 양식 제공

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

참조 : 설정 API

관련

10
kaiser

직접적으로가 아니라 훅을 통해 항상 기능을 포함하십시오.

예:

  • 새 클래스를 사용하지 않고 플러그인의 클래스를 포함시키지 마십시오.

  • 후크 plugins_loaded 사용

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

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

//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

Multisite-install에서 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 저는 이것을 매우 자주 사용하며, 너무 어렵지 않고 일찍 열심히 새로운 것을 사용합니다. 수업();

9
bueltge

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

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

8
Greg

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

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

(이것은 문제가 생겼습니다 그리고 심각합니다 토론 지점 과거와 현재 .

8
EAMann

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

플러그인 해야 캐시/쉴드 웹 서비스 및/또는 캐싱/데이터 공급자를 통한 XMLRPC/SOAP 요청 layer 만약 당신이 (느린) 웹 서비스 응답을 기다리는 프론트-요청을하지 않기 위해 그것들을 사용한다면.

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

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

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

플러그인 테스트

우리는 플러그인 개발 환경에 대한 몇 가지 테스트 도구를 확실히 갖추어야합니다.

이 답변 by Ethan Seifert 테스트 질문에 따르면, 다음과 같은 좋은 습관이 있습니다.

  • 테스트 단원은 클래스가 수행 할 수있는 최소한의 행동을 테스트해야합니다.
  • 기능 테스트의 수준까지 올리면 Wordpress 종속성으로 코드를 테스트 할 수 있습니다.
  • 플러그인의 기능에 따라 - ID를 사용하여 DOM에 데이터가 있는지 테스트하는 Selenium 기반 테스트 사용을 고려하십시오.
7
Fernando Briano

올바른 이름 사용

클래스, 함수 및 변수 (클래스, 함수 및 변수) 사람들이 1 년 내에 식별 할 수 있음 더 이상 기억하지 못하는 경우, 코드가 나온다. 후크/필터 이름이 오래 걸리는지 여부는 중요하지 않습니다. 전의. youruniquename_hook/filter_whatitdoes.

  • 파일에 "dbdbInit"이라는 클래스가 있으면 클래스가 들어있는 파일의 이름을 "dbdbInit.class.php"로 지정해야합니다.
  • dbdbInit- class 안에 ex를 등록하는 함수가 있다면. custom_post_types를 호출 한 다음 register_custom_post_types()이라고합니다.
  • Custom_post_types의 이름을 포함하는 배열이 있다면, 배열에 할당 된 변수를 호출하십시오. $custom_post_type_names.
  • 배열을 처리하는 함수가 있다면 function array_handler( $array ) { // handle the array}을 써라.
  • 표지판이하는 일/이름이 어디에 속하는지를 아는 방식으로 물건의 이름을 지정하십시오.

또 다른 한가지 : 99 %의 모든 경우에 디버깅해야한다면, 코드뿐만 아니라 워드 프레스를위한 모든 메시지를 얻을 수 있습니다. 그래서 같은 접두사 ex를 사용해보십시오. 클래스, 공용 함수 및 변수/객체에 대한 "dbdb" 이렇게하면 수백 개의 파일간에 쉽게 찾을 수 있습니다. (Wordpress는 테마와 약 1,550 개의 함수 앞에 64 개의 파일을로드하고 후크와 필터에 대해서는 말하지 않습니다.)

6
kaiser

미래 WordPress 및 테마 버전에 대한 관리

참고 :이 조언을 다시 읽은 후에는 모든 기능을 점검하여 사이트 속도가 느려질 수 있으므로이 연습을 마치십시오.

기능이 더 이상 사용되지 않는지 확인하십시오. 직접 테마에서 확인하십시오.

이것은 "그럴 수있는"예입니다.

if ( ! function_exists( 'wp_some_fn' ) ) 
{
    $theme_data = wp_get_theme();
    $error = new WP_Error( 'wp_some_fn', sprintf( __( 'The function %1$s is deprecated. Please inform the author', TEXTDOMAIN ), "Theme: {$theme_data->Name}: Version {$theme_data->Version}" );

    // abort
    if ( is_wp_error( $error ) )
        return print $error->get_error_message();
} 
// else if no error - the function works and exists
wp_some_fn();

적절한/최선의 방법으로 오류 처리에 대한 답변보기 : link

$ 원인도 함수에 넣을 수 있습니다. 이것은 당신과 당신의 사용자가 변경 될 수있는 테마의 기능이나 클래스를 계속 추적하는 데 도움이 될 것입니다.

6
kaiser

WordPress의 코딩 표준 사용

http://codex.wordpress.org/WordPress_Coding_Standards

다른 사람이 작성한 코드와 비교하여 작업 한 코드를 얼마나 쉽게 업데이트 할 수 있는지 알고 계십니까? 코딩 표준을 통해 프로젝트에 참여하는 모든 개발자가 어떤 일이 일어나고 있는지 쉽게 파악할 수 있습니다.

우리는 당신의 플러그인이나 테마가 당신 자신임을 알고 있습니다. 그리고 당신이 줄을 끊고 중괄호를 추가하는 방법은 당신의 개성을 표현하는 것입니다. 모든 들여 쓰기는주의 깊게 생각한 성명서입니다. 그러나 사용자 정의 코드를 사용하면 코드가 핵심 응용 프로그램에없는 경우에도 WordPress에 기여하게됩니다. 코딩 표준은 개발자가 코드를 신속하게 시작할 수 있도록 도와줍니다.

6
gabrielk

WordPress 핵심 코드에서 분리

플러그인 shouldWordPress API의 플러그인을 WordPress 코드와 분리하기 위해 WordPress API의 영향을 필요한 최소로 줄입니다. 이렇게하면 WordPress 코드베이스 내의 변경 사항이 플러그인에 미치는 영향을 줄일 수 있습니다. 또한 이것은 플러그인 코드의 버전 간 호환성을 향상시킵니다.

이것은 WordPress 기능을 사용하지 않는다는 것을 의미하지는 않습니다. (예 : 재사용 기존 기능 제안) WordPress 기능으로 코드를 너무 많이 매끄럽게 쓰지 않고 WordPress의 플러그인 비즈니스 로직을 분리하십시오. 기능.

6
hakre

플러그인 출력 문자열에 wp 옵션 사용

플러그인을 쉽게 사용하고 사용자 정의 할 수있게하려면 모든 출력 문자열을 수정해야합니다. 이를 수행하는 가장 좋은 방법은 wp-options을 사용하여 출력 문자열을 저장하고 백엔드를 제공하여 기본값을 변경하는 것입니다. 플러그인은 플러그인 백엔드를 사용하여 쉽게 변경할 수없는 표시된 문자열을 사용해서는 안됩니다.

예 : 사교적 인 - 아이콘 부분이 "공유하고 즐기기"전에 나타나는 문장을 변경할 수있는 기능을 제공합니다.

5
hannit cohen

후크 제거, 활성화 및 비활성화 사용

이에 대한 세 가지 다른 고리가 있습니다.

  • register_uninstall_hook(); 제거
  • 비활성화 register_deactivation_hook();
  • 활성화 register_activation_hook();

실제 예제가있는 자세한 지침은 여기에서 찾을 수 있습니다. .

3
kaiser