워드프레스 플러그인 개발을 위한 최종 가이드: 처음부터 커스터마이징된 기능 확장을 구축하기

3분 읽기
2026-03-14
2026-06-03
2,029
아래 링크를 통해 쇼핑하면 추가 비용 없이 수수료를 받을 수 있습니다.

준비 작업 및 환경 설정

코드를 작성하기 시작하기 전에 전문적인 로컬 개발 환경을 설정하는 것이 매우 중요합니다. 이를 통해 개발 효율성을 높일 수 있을 뿐만 아니라, 온라인 서버에서 테스트를 진행할 때 발생할 수 있는 위험을 줄일 수도 있습니다. Apache/Nginx, MySQL, PHP가 통합된 로컬 서버 소프트웨어를 사용하는 것을 추천합니다. 예를 들어, Local by Flywheel, XAMPP, MAMP 등이 있습니다. 사용하는 PHP 버전이 대상 WordPress 환경과 호환되는지 확인하십시오. 일반적으로 PHP 7.4 이상을 사용하는 것이 권장됩니다.

코드를 편집하기 위해서는 Visual Studio Code, PhpStorm, Sublime Text와 같은 전문적인 코드 편집기가 필요합니다. 이러한 편집기들은 문법 강조 기능, 코드 자동 완성 기능, 버전 관리 시스템과의 통합 등을 제공하여 코딩 작업의 효율성을 크게 향상시켜 줍니다. 또한, WordPress 공식의 ‘플러그인 개발 안내서’와 ‘코딩 표준’ 문서를 잘 숙지하고 그 규칙을 준수하는 것이 고품질 플러그인을 개발하는 데 매우 중요합니다. 예를 들어, 함수명의 충돌을 피하기 위해 전용 접두사를 사용하는 것이 그러한 규칙 중 하나입니다.

플러그인의 기본 구조를 이해하세요.

가장 기본적인 WordPress 플러그인은 단 하나의 메인 파일로 구성될 수 있습니다. 이 메인 파일의 이름은 매우 중요하며, 일반적으로 플러그인의 기능을 반영하여 명명됩니다. 예를 들어… my-custom-plugin.php파일의 시작 부분에는 특정 형식에 맞는 플러그인 헤더 주석이 반드시 포함되어야 합니다. 이는 WordPress가 플러그인을 인식하는 데 필수적인 요소입니다.

추천 읽기 WordPress 플러그인 개발을 마스터하세요: 제로에서 시작하여 첫 번째 커스텀 플러그인을 만들어 보세요.

플러그인 헤더 주석에는 플러그인의 기본 정보가 포함되어 있으며, 여기에는 이름, 설명, 버전, 저자 등이 포함됩니다. 다음은 표준적인 플러그인 헤더의 예시입니다:

UltaHost의 WordPress 호스팅 서비스
30일 환불 보장, 무제한 대역폭 및 데이터베이스 이용, 무료 DDoS 보호 서비스 제공. 3년 구매 시 50% 용량이 할인됩니다.
<?php
/**
 * Plugin Name:       我的自定义功能扩展
 * Plugin URI:        https://example.com/my-custom-plugin
 * Description:       这是一个用于演示的 WordPress 自定义插件。
 * Version:           1.0.0
 * Author:            你的名字
 * Author URI:        https://example.com
 * License:           GPL v2 or later
 * Text Domain:       my-custom-plugin
 * Domain Path:       /languages
 */

Core Development: Action and Filter Hooks

WordPress 플러그인 개발의 핵심은 “후크(Hooks)” 시스템을 이해하고 활용하는 데 있습니다. 후크에는 두 가지 종류가 있습니다: 액션(Action)과 필터(Filter)입니다. 액션을 사용하면 WordPress의 특정 라이프사이클 단계(예: 초기화, 페이지 로딩, 글 게시 시)에 사용자 정의 코드를 실행할 수 있습니다. 필터는 WordPress나 다른 플러그인이 실행하는 동안 생성되는 데이터를 수정할 수 있게 해줍니다.

액션 훅을 사용하여 기능을 추가합니다.

액션 후크(Action Hook)가 정상적으로 작동하고 있습니다. add_action() 함수 마운팅. 예를 들어, 웹사이트의 관리자 페이지 상단에 사용자 정의 알림을 추가하고 싶다면 다음과 같이 할 수 있습니다. admin_notices 이 액션 후크에 대해 말씀드리자면, 알림 내용을 출력하는 함수를 만들어야 합니다. 그런 다음 이 함수를 해당 후크에 등록해야 합니다.

다음 예제에서 우리는 함수를 하나 만들었습니다. my_custom_admin_notice 간단한 알림 메시지를 출력하고, 그것을 통해 add_action 그것을 다음에 바인딩하세요: admin_notices 후크(Hook).

function my_custom_admin_notice() {
    echo '<div class="notice notice-success is-dismissible"><p>제가 만든 사용자 정의 플러그인이 성공적으로 활성화되었습니다!</p></div>';
}
add_action( 'admin_notices', 'my_custom_admin_notice' );

필터 후크를 사용하여 콘텐츠를 수정합니다.

필터 후크가 정상적으로 작동하고 있습니다. add_filter() `Function mounting` (함수 마운팅): 이는 함수에 전달된 데이터를 수정하는 데 사용됩니다. 일반적인 예로는 기사 내용의 끝부분에 저작권 정보를 자동으로 추가하는 경우가 있습니다.

추천 읽기 워드프레스 플러그인 개발 마스터하기: 첫 번째 확장 기능 모듈을 0부터 만들어보세요.

다음 예제에서 우리는 함수를 하나 만들었습니다. append_copyright_to_content이 함수는 기사의 내용을 매개변수로 받아, 끝에 저작권 정보를 추가한 후 수정된 내용을 반환합니다. 우리는 이 함수를 사용하여… add_filter 그것을 다음에 바인딩하세요: the_content 필터.

function append_copyright_to_content( $content ) {
    if ( is_single() ) { // 仅在单篇文章页面生效
        $copyright = '<p><em>© 2026 모든 권리 보유. 이 문서는 “My Plugin”에 의해 생성되었습니다.</em></p>';
        $content .= $copyright;
    }
    return $content;
}
add_filter( 'the_content', 'append_copyright_to_content' );

관리 페이지를 생성하고 설정 옵션을 설정합니다.

많은 플러그인들은 사용자에게 설정 인터페이스를 제공해야 하며, 이는 일반적으로 WordPress 관리자 페이지에 별도의 설정 페이지를 추가함으로써 구현됩니다. WordPress는 이 과정을 간소화하기 위해 다양한 API를 제공합니다. add_menu_page() 그리고 add_options_page()

최고 관리 메뉴를 추가하세요.

활용 add_menu_page() 함수를 사용하면 플러그인에 대한 최상위 메뉴 항목을 생성할 수 있습니다. 페이지 제목, 메뉴 제목, 사용자 권한, 메뉴 별칭, 페이지 콘텐츠를 렌더링하는 데 사용되는 콜백 함수 등의 매개변수를 정의해야 합니다.

호스팅닷컴 공유 호스팅
AMD EPYC CPU, NVMe SSD 스토리지 및 LiteSpeed를 통한 고성능, 연중무휴 24시간 전문가 사내 지원, SSL, 무차별 공격, 멀웨어 및 DDoS 보호를 포함한 고급 보안 조치, 최대 73%의 비용 절감.

아래 코드는 “내 플러그인 설정”이라는 이름의 상위 메뉴 페이지를 어떻게 생성하는지 보여줍니다. 콜백 함수도 포함되어 있습니다. render_my_plugin_settings_page 이 페이지의 HTML 콘텐츠를 출력하는 역할을 담당합니다.

function my_plugin_add_menu_page() {
    add_menu_page(
        '我的插件设置',          // 页面标题
        '我的插件',             // 菜单标题
        'manage_options',       // 所需用户权限
        'my-plugin-settings',   // 菜单别名 (slug)
        'render_my_plugin_settings_page', // 回调函数
        'dashicons-admin-generic', // 图标(可选)
        30                      // 菜单位置(可选)
    );
}
add_action( 'admin_menu', 'my_plugin_add_menu_page' );

function render_my_plugin_settings_page() {
    ?&gt;
    <div class="wrap">
        <h1>My plugin settings</h1>
        <form method="post" action="/ko/options.php/" data-trp-original-action="options.php">
            <?php
            settings_fields( 'my_plugin_settings_group' );
            do_settings_sections( 'my-plugin-settings' );
            submit_button();
            ?>
        <input type="hidden" name="trp-form-language" value="ko"/></form>
    </div>
    &lt;?php
}

등록 및 인증 설정 필드

사용자가 입력한 데이터를 안전하게 저장하기 위해서는 WordPress의 설정 API를 사용해야 합니다. 여기에는 해당 기능을 활성화하는 작업도 포함됩니다. register_setting()add_settings_section() 그리고 add_settings_field() 등의 함수들이 있습니다. API를 설정하면 데이터 검증, 비보안 요청(nonce) 확인, 그리고 데이터베이스 저장 작업이 자동으로 처리됩니다.

아래 코드는 설정 그룹 설정, 설정 영역 설정, 그리고 텍스트 입력 필드 설정하는 방법을 보여줍니다. 함수입니다. sanitize_my_setting 사용자가 입력한 데이터를 데이터베이스에 저장하기 전에 정리하고 검증하는 데 사용됩니다.

추천 읽기 워드프레스 플러그인 개발을 처음부터 배우기: 첫 번째 사용자 정의 기능을 구축하기

function my_plugin_settings_init() {
    // 注册一个设置
    register_setting( 'my_plugin_settings_group', 'my_plugin_option_name', 'sanitize_my_setting' );

// 添加一个设置区域
    add_settings_section(
        'my_plugin_main_section',
        '主要设置',
        null, // 可选的区域描述回调函数
        'my-plugin-settings'
    );

// 在区域内添加一个字段
    add_settings_field(
        'my_plugin_text_field',
        '示例文本字段',
        'my_plugin_text_field_callback',
        'my-plugin-settings',
        'my_plugin_main_section'
    );
}
add_action( 'admin_init', 'my_plugin_settings_init' );

function sanitize_my_setting( $input ) {
    // 清理输入,例如移除 HTML 标签
    return sanitize_text_field( $input );
}

function my_plugin_text_field_callback() {
    $value = get_option( 'my_plugin_option_name', '默认值' );
    echo '<input type="text" name="my_plugin_option_name" value="' . esc_attr( $value ) . '" class="regular-text" />';
}

플러그인의 국제화 및 보안 관련 모범 사례

성숙한 플러그인은 다양한 언어를 지원해야 하며, 최고 수준의 보안 기준을 준수해야 합니다. 국제화(i18n)를 통해 플러그인이 전 세계 사용자들에게 쉽게 번역될 수 있도록 합니다. 보안 관련 사항들은 플러그인과 사용자의 웹사이트를 흔한 공격으로부터 보호해 줍니다.

텍스트 번역 지원 실현

WordPress는 GNU gettext 프레임워크를 사용하여 국제화를 구현합니다. 플러그인 내에서 사용자에게 표시되는 모든 문자열을 특정 함수로 감싸야 합니다. 가장 일반적으로 사용되는 함수는 `wpgettext()`입니다. __()(번역된 문자열을 반환하는 데 사용되며) _e()(이 부분은 번역된 문자열을 그대로 표시하기 위한 것입니다. 플러그인의 헤더 부분에서도 올바르게 설정해야 합니다.) Text Domain 그리고 Domain Path그리고 사용하세요. load_plugin_textdomain() 함수는 적절한 시점에 번역 파일을 로드합니다.

InterServer 공유 호스팅
공유 호스팅 월 $2.50 USD, 첫 달 $0.1 USD 프로모션 코드 tryinterserver, 461개 클라우드 앱 스크립트, 원클릭 설치.

아래 코드는 플러그인의 텍스트 필드를 로드하고 번역 가능한 문자열을 출력하는 방법을 보여줍니다.

function my_plugin_load_textdomain() {
    load_plugin_textdomain( 'my-custom-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}
add_action( 'init', 'my_plugin_load_textdomain' );

// 在需要的地方使用翻译函数
$greeting = __( '你好,世界!', 'my-custom-plugin' );
_e( '这是一个直接输出的消息。', 'my-custom-plugin' );

핵심 보안 지침을 준수하십시오.

플러그인의 보안은 개발 과정에서 매우 중요한 부분입니다. 모든 사용자가 입력한 데이터를 반드시 검증하고 정제해야 합니다. 검증(Validation)이란 데이터가 예상된 형식(예: 이메일 주소인지)에 맞는지를 확인하는 과정으로, 다양한 방법을 사용할 수 있습니다. filter_var() 등과 같은 함수들이 있습니다. 데이터의 불안전한 문자를 제거하는 과정을 ‘정화(Sanitization)’라고 하며, WordPress는 이를 위해 다양한 함수를 제공합니다. sanitize_text_field()esc_html()esc_url()

브라우저에 데이터를 출력할 때는 반드시 이스케이핑(Escaping)을 수행해야 합니다. 이는 크로스사이트 스크립팅(XSS) 공격을 방지하기 위함입니다. 다음과 같은 함수를 사용할 수 있습니다: esc_html()esc_attr()wp_kses_post()데이터베이스 작업을 수행할 때는 반드시… $wpdb 클래스와 그 전처리 스크립트를 사용하여 SQL 삽입 공격을 방지하세요. 절대로 사용자 입력을 SQL 쿼리에 직접 결합하지 마십시오.

요약

WordPress 플러그인 개발은 창의성을 기능적인 확장 기능으로 구현하는 과정입니다. 그 핵심은 ‘후크(Hooks)’ 시스템을 깊이 이해하는 데 있습니다. 로컬 개발 환경을 설정하고 표준적인 플러그인 헤더 주석을 작성하는 것부터 시작하여, 개발자는 액션(Action) 및 필터(Filter) 후크를 숙련되게 사용하여 WordPress의 라이프사이클과 데이터 흐름에 개입해야 합니다. 백엔드 관리 페이지와 설정 옵션을 만드는 것은 플러그인과 사용자 간의 상호작용을 가능하게 해주며, 국제화 및 엄격한 보안 관행(유효성 검사, 데이터 정리, 이스케이피 처리, 안전한 데이터베이스 작업)은 플러그인이 전문적이고 신뢰할 수 있으며 전 세계적으로 안전하게 사용될 수 있도록 하는 기반이 됩니다. WordPress의 코딩 표준을 준수하고, 간단한 기능부터 시작하여 점차 복잡한 로직을 구축하는 것이 플러그인 개발의 기술을 마스터하는 효과적인 방법입니다.

자주 묻는 질문

한 플러그인에는 최소 몇 개의 파일이 필요하나요?

기능이 완전한 WordPress 플러그인은 단 하나의 PHP 파일로 구성될 수 있습니다. 이 파일에 올바른 플러그인 헤더(Plugin Header) 주석이 포함되어 있으면, WordPress는 이 파일을 독립적인 플러그인으로 인식합니다. 물론, 기능이 복잡해질수록 코드를 여러 파일로 분할하고 CSS, JavaScript, 이미지와 같은 리소스도 함께 포함시킬 수 있습니다.

플러그인 함수명이 다른 플러그인과 충돌하는 것을 어떻게 방지할 수 있을까요?

WordPress에서는 모든 함수, 클래스, 변수, 상수에 고유한 접두사를 사용할 것을 권장합니다. 이 접두사는 일반적으로 플러그인의 이름이나 회사 이름과 관련이 있어야 하며, 충분히 독특해야 합니다. 예를 들어, 플러그인의 이름이 “Awesome Slider”라면 다음과 같은 접두사를 사용할 수 있습니다: aslider_init()ASLIDER_VERSION 이러한 명명 방식 외에도, 더 현대적이고 우아한 방법으로는 PHP 네임스페이스(Namespace)를 사용하는 것입니다. 네임스페이스를 사용하면 명명 충돌 문제를 근본적으로 해결할 수 있습니다.

플러그인이 활성화되었을 때 어떤 작업을 해야 할까요?

플러그인을 활성화하는 시점은 일회성 설정 작업을 수행하기에 이상적인 때입니다. 이를 위해 활성화 후크(activation hook)를 등록하는 방법을 사용할 수 있습니다. 활성화 후크에서는 환경의 호환성(예: PHP 버전)을 확인하거나, 필요한 데이터베이스 테이블을 생성하거나 업데이트하며, 플러그인 옵션의 기본값을 초기화하는 등의 작업을 수행할 수 있습니다. register_activation_hook( FILE, ‘your_setup_function’ ) 이 함수를 바인딩하세요.

어떻게 하면 사용자들이 제 플러그인을 안전하게 제거할 수 있을까요?

완전한 사용자 경험을 제공하기 위해, 귀하의 플러그인은 자신이 생성한 데이터를 삭제할 수 있어야 합니다. 이는 언인스트럽션(제거) 후크를 등록함으로써 구현할 수 있습니다. WordPress는 두 가지 언인스트럽션 방법을 제공합니다: register_uninstall_hook( FILE, ‘your_cleanup_function’ ) 등록된 함수는 사용자가 “삭제” 플러그인을 클릭할 때 실행됩니다. 이 함수 내에서 플러그인이 생성한 모든 데이터베이스 설정, 사용자 정의 데이터베이스 테이블 등을 안전하게 삭제할 수 있습니다. 단, 절대로 직접 데이터베이스에 접근하거나 데이터를 삭제하지 마십시오. register_deactivation_hook 영구적인 데이터 삭제를 수행해야 합니다. 왜냐하면 ‘비활성화’하는 것은 ‘제거’하는 것과 다르기 때문입니다.