워드프레스 플러그인 개발 입문: 처음부터 첫 기능 확장을 구축하기

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

왜 WordPress 플러그인을 개발하려고 하나요?

WordPress는 전 세계에서 가장 인기 있는 콘텐츠 관리 시스템(CMS)으로, 그 강력한 확장성은 주로 플러그인 아키텍처 덕분입니다. 자신만의 플러그인을 개발한다는 것은 기존 플러그인의 기능에 제한받지 않고, 자신의 웹사이트나 고객의 특정 요구사항을 정확하게 충족시킬 수 있다는 것을 의미합니다. 간단한 쇼트코드를 추가하는 것부터 복잡한 관리 패널을 구축하는 것까지, 플러그인을 사용하면 기능 로직을 테마와 분리할 수 있어 테마가 업데이트되어도 기능이 영향을 받지 않도록 보장할 수 있습니다.

학습의 관점에서 볼 때, 플러그인 개발을 이해하는 것은 WordPress의 핵심 기능을 깊이 있게 파악하는 데 필수적인 과정입니다. 이를 통해 액션 후크(Action Hooks)와 필터 후크(Filter Hooks)라는 두 가지 핵심 개념을 접하게 되는데, 이 두 가지는 WordPress가 모듈화와 확장성을 실현하는 기반이 됩니다. 플러그인 개발을 마스터하면 기술 능력을 향상시킬 뿐만 아니라 새로운 직업 기회를 열어주며, 심지어 판매 가능한 디지털 제품을 만들 수도 있습니다.

개발 전의 준비 작업

첫 번째 코드를 작성하기 전에, 적합한 개발 환경을 준비해야 합니다. 이 개발 환경에는 일반적으로 로컬 서버(예: Local by Flywheel, XAMPP, MAMP), 코드 편집기(예: VS Code, PhpStorm), 그리고 WordPress가 설치된 테스트 사이트가 포함됩니다. 테스트 환경의 PHP 버전이 실제 온라인 프로덕션 환경의 PHP 버전과 일치하는지 확인하여 호환성 문제가 발생하지 않도록 하십시오.

추천 읽기 워드프레스 핵심 기술 마스터하기: 빌드부터 최적화까지 완벽한 실습 가이드

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

가장 기본적인 WordPress 플러그인은 단 하나의 PHP 파일만을 포함할 수 있습니다. 하지만 잘 구성된 플러그인은 더 나은 조직성을 위해 여러 디렉터리와 파일을 포함하는 것이 일반적입니다. 전형적인 플러그인 디렉터리는 다음과 같은 구조를 가질 수 있습니다:
주 플러그인 파일(예: ) my-first-plugin.php이것은 플러그인의 진입점으로, 플러그인에 대한 메타정보가 포함되어 있습니다.
- includes/ 목록: 핵심 기능을 구현하는 클래스나 함수 파일들이 저장되는 곳입니다.
- admin/ 목록: 백엔드 관리 인터페이스와 관련된 코드가 저장되어 있습니다.
- public/ 목록: 웹사이트 프론트엔드용 코드가 저장되는 곳입니다.
- assets/ 목록: JavaScript, CSS, 이미지와 같은 정적 리소스를 저장하는 곳입니다.
- languages/ 목록: 국제화 번역 파일(.po/.mo)을 저장하는 곳입니다.

UltaHost의 WordPress 호스팅 서비스
30일 환불 보장, 무제한 대역폭 및 데이터베이스 이용, 무료 DDoS 보호 서비스 제공. 3년 구매 시 50% 용량이 할인됩니다.

필수 플러그인 헤더 정보

모든 WordPress 플러그인은 주 PHP 파일의 맨 위에 표준적인 플러그인 헤더 주석을 포함해야 합니다. 이는 WordPress가 플러그인을 인식하는 데 필수적입니다. 다음은 가장 기본적인 예시입니다:

<?php
/**
 * Plugin Name:       我的第一个插件
 * Plugin URI:        https://example.com/my-first-plugin
 * Description:       这是一个用于学习插件开发的简单示例插件。
 * Version:           1.0.0
 * Author:            你的名字
 * Author URI:        https://example.com
 * License:           GPL v2 or later
 * Text Domain:       my-first-plugin
 * Domain Path:       /languages
 */

그중에서,Plugin Name 이 항목은 필수 입력 사항이며, 나머지 항목들은 선택 사항입니다. 하지만 플러그인의 완전성과 유지보수성을 위해 가능한 한 모든 관련 정보를 기입하는 것이 좋습니다.Text Domain 국제화를 위해 사용됩니다.Domain Path 언어 파일 디렉터리를 가리킵니다.

첫 번째 플러그인을 만들어 보세요: 간단한 인사 기능입니다.

실제 예제를 통해 실습해 보겠습니다. 우리는 웹사이트의 기사 내용 상단에 사용자가 설정할 수 있는 인사말을 표시하는 플러그인을 만들 것입니다.

플러그인 파일과 디렉터리를 생성합니다.

먼저, 당신의 WordPress 설치 디렉터리 내에서… wp-content/plugins/ 폴더 안에 새로운 폴더를 만들어서 그 이름을 ‘새폴더’로 지정하세요. my-greeting-plugin그런 다음 해당 폴더 내에 주 PHP 파일을 생성하고, 파일 이름을 ‘main.php’로 지정하세요. my-greeting-plugin.php그리고 위에 언급된 플러그인 헤더 정보를 그곳에 복사하세요.

추천 읽기 어떻게 고품질의 WordPress 플러그인을 선택하고 개발할 수 있을까요? 초보자부터 전문가까지.

후크를 사용하여 기능을 추가하세요.

WordPress는 훅(hook) 시스템을 통해 동작합니다. 글 내용 앞에 정보를 추가하려면 이 훅 시스템을 사용해야 합니다. the_content 필터 후크입니다. 주 플러그인 파일에 다음 함수와 후크 호출을 추가하세요:

/**
 * 在文章内容前添加问候语
 *
 * @param string $content 原始的文章内容。
 * @return string 修改后的文章内容。
 */
function mgp_add_greeting_to_content( $content ) {
    $greeting_text = get_option( 'mgp_greeting_text', '欢迎阅读!' ); // 从数据库获取设置,默认为“欢迎阅读!”
    $custom_greeting = '<div class="mgp-greeting"><p><strong>'`. esc_html($greeting_text).`'</strong></p></div>';

// 仅对主循环中的单篇文章页面生效
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        return $custom_greeting . $content;
    }
    return $content;
}
// 将函数挂载到 `the_content` 过滤器
add_filter( 'the_content', 'mgp_add_greeting_to_content' );

이 코드는 함수를 정의합니다. mgp_add_greeting_to_content이 시스템은 기사의 내용을 받아들여, 그 앞에 인사말이 포함된 DIV 컨테이너를 추가합니다. add_filter() 함수에 대해서는, 우리가 자체적으로 작성한 함수를 WordPress에 등록하여 사용할 수 있습니다. the_content 필터를 통해 처리됩니다. 함수 내부의 논리적 판단에 따라 인사말이 프론트엔드의 단일 기사 페이지 메인 루프에서만 표시되도록 하여, 페이지, 아카이브 페이지, 또는 도구 모음에는 영향을 미치지 않습니다.

간단한 관리 설정 페이지를 만들기

사용자가 인사말 텍스트를 직접 설정할 수 있도록 하기 위해, 간단한 설정 페이지를 추가해야 합니다. 이를 위해서는 WordPress의 관리 메뉴 API를 사용해야 합니다. 메인 플러그인 파일에 다음 코드를 계속 추가하세요:

호스팅닷컴 공유 호스팅
AMD EPYC CPU, NVMe SSD 스토리지 및 LiteSpeed를 통한 고성능, 연중무휴 24시간 전문가 사내 지원, SSL, 무차별 공격, 멀웨어 및 DDoS 보호를 포함한 고급 보안 조치, 최대 73%의 비용 절감.
/**
 * 注册插件设置菜单和页面
 */
function mgp_register_admin_menu() {
    add_options_page(
        '问候语设置',           // 页面标题
        '问候语插件设置',       // 菜单标题
        'manage_options',      // 所需权限
        'my-greeting-plugin',  // 菜单slug
        'mgp_render_settings_page' // 用于输出页面内容的回调函数
    );
}
add_action( 'admin_menu', 'mgp_register_admin_menu' );

/**
 * 渲染设置页面的内容
 */
function mgp_render_settings_page() {
    ?&gt;
    <div class="wrap">
        <h1>인사말 플러그인 설정</h1>
        <form method="post" action="/ko/options.php/" data-trp-original-action="options.php">
            <?php
            settings_fields( 'mgp_settings_group' ); // 输出设置组和非ce字段
            do_settings_sections( 'my-greeting-plugin' ); // 输出设置区域
            submit_button(); // 输出提交按钮
            ?>
        <input type="hidden" name="trp-form-language" value="ko"/></form>
    </div>
    <?php
}

/**
 * 初始化插件设置
 */
function mgp_initialize_settings() {
    // 注册一个设置
    register_setting(
        'mgp_settings_group', // 设置组名
        'mgp_greeting_text',  // 选项名,对应数据库中的键
        array( // 可选的验证回调函数
            'sanitize_callback' => 'sanitize_text_field',
            'default' =&gt; '欢迎阅读!'
        )
    );

// 添加一个设置区域
    add_settings_section(
        'mgp_main_section',           // 区域ID
        '主要设置',                   // 区域标题
        null,                         // 区域介绍的回调函数(此处不需要)
        'my-greeting-plugin'          // 页面slug
    );

// 向区域中添加一个字段
    add_settings_field(
        'mgp_greeting_field',         // 字段ID
        '问候语文本',                 // 字段标签
        'mgp_greeting_field_callback', // 用于输出字段HTML的回调函数
        'my-greeting-plugin',         // 页面slug
        'mgp_main_section'            // 区域ID
    );
}
add_action( 'admin_init', 'mgp_initialize_settings' );

/**
 * 渲染问候语文本输入字段
 */
function mgp_greeting_field_callback() {
    $greeting = get_option( 'mgp_greeting_text', '欢迎阅读!' );
    echo '<input type="text" name="mgp_greeting_text" value="' . esc_attr( $greeting ) . '" class="regular-text" />'echo '<p class="description">이 텍스트는 귀하 웹사이트의 모든 기사 상단에 표시될 것입니다.</p>';
}

이 코드는 다음 작업을 수행합니다:
1. 사용하기 add_action( 'admin_menu', ... ) “설정” 메뉴에 하위 메뉴 페이지가 추가되었습니다.
2. 사용하기 add_action( 'admin_init', ... ) 초기화 설정에는 데이터베이스 등록 옵션, 설정 영역, 그리고 입력 필드가 포함됩니다.
3. 렌더링 설정 페이지의 폼 및 필드를 정의하는 함수가 작성되었습니다.
지금, WordPress 관리자에 로그인한 다음 “설정” 메뉴에서 “환영 메시지 플러그인 설정”을 찾으세요. 여기서 환영 메시지의 내용을 수정하면 즉시 홈페이지의 글들에서 그 변경 사항을 확인할 수 있습니다.

플러그인 개발의 모범 사례와 고급 기술

기본 기능을 완성한 후에는 모범 사례(Best Practices)를 따르면 플러그인을 더 전문적이고, 더 안전하며, 더 쉽게 유지보수할 수 있습니다.

보안은 최우선 과제입니다.

절대로 사용자가 입력한 데이터를 신뢰해서는 안 됩니다. 플러그인 내에서는 외부에서 가져온 모든 데이터에 대해 주의를 기울여야 합니다. $_GET$_POST$_COOKIE 데이터베이스 쿼리 결과는 출력되거나 사용되기 전에 반드시 검증, 정제 또는 이스케이프 처리를 거쳐야 합니다.
에스케이프 출력: 사용하세요. esc_html()esc_attr()esc_url() 그리고 wp_kses_post() 등의 함수들입니다.
입력 정리: 사용하세요. sanitize_text_field()sanitize_email()intval() 등의 함수들입니다.
데이터베이스 보안: 사용하기 $wpdb 클래스의 메서드를 사용하여 조회를 수행하거나, prepare() SQL 인젝션을 방지하기 위해 매개변수화된 쿼리를 사용하는 방법입니다.
권한 검사: 관리 페이지에서 또는 민감한 작업을 실행하기 전에 사용하십시오. current_user_can() 사용자 권한을 확인하고 그에 따라 적절한 조치를 취하세요. check_admin_referer() nonce 필드를 검증하여 크로스사이트 요청 위조(CSRF)를 방지합니다.

추천 읽기 WordPress의 핵심 기술을 익혀 기능과 아름다움을 갖춘 전문 웹사이트를 만드세요

국제화(i18n) 실현

당신의 플러그인이 전 세계 사용자들에게 사용될 수 있도록 하기 위해서는 다국어 번역을 지원해야 합니다. 이를 위해 WordPress의 번역 기능을 사용하여 사용자에게 표시되는 모든 문자열을 처리해야 합니다. 이전 코드에서 문자열 출력 부분을 수정해 주세요.

// 在插件头信息中已定义 Text Domain: my-first-plugin
$greeting_text = get_option( 'mgp_greeting_text', __( '欢迎阅读!', 'my-first-plugin' ) );

// 在管理菜单函数中
add_options_page(
    __( '问候语设置', 'my-first-plugin' ),
    __( '问候语插件设置', 'my-first-plugin' ),
    'manage_options',
    'my-greeting-plugin',
    'mgp_render_settings_page'
);

그런 다음, Poedit와 같은 도구를 사용하여 플러그인의 소스 코드에서 문자열을 추출하여 생성할 수 있습니다. .pot 템플릿 파일을 통해 번역자는 다양한 언어로 콘텐츠를 생성할 수 있습니다. .po 그리고 .mo 파일을 가져와 플러그인에 넣으세요. /languages 카탈로그.

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

코드 구조화 및 성능 최적화

플러그인의 기능이 점점 더 확장됨에 따라, 코드를 여러 파일로 분리하는 것이 현명한 선택입니다. 객체 지향 프로그래밍(OOP)과 클래스를 사용하여 코드를 구성하면 가독성과 재사용성을 향상시킬 수 있습니다. 리소스(CSS, JS)의 경우에도 마찬가지로… wp_enqueue_style() 그리고 wp_enqueue_script() 함수가 올바른 후크(hook)에서 실행되고 있습니다. wp_enqueue_scripts 또는 admin_enqueue_scripts필요에 따라 콘텐츠를 로드하고, 의존하는 버전을 명시적으로 지정하세요. 플러그인 내에서 비용이 많이 드는 데이터베이스 쿼리를 직접 수행하는 것을 피하고, 비핵심 데이터를 캐싱하기 위해 Transients API를 사용하는 것을 고려해 보세요.

요약

간단한 PHP 파일을 만들고 표준 플러그인 헤더 정보를 추가하는 것부터 시작하여, 액션 후크(Action Hooks)와 필터 후크(Filter Hooks)를 활용해 WordPress의 라이프사이클에 플러그인을 통합하는 방법을 배웠으며, 관리 인터페이스를 구축하고 보안 및 국제화(Security and Internationalization) 관련 모범 사례를 준수하는 과정까지, 이제는 완전한 WordPress 플러그인을 개발하는 기본적인 단계들을 모두 거쳤습니다. 이 “인사말 플러그인”은 비록 간단하지만, 플러그인 개발의 핵심 프로세스——기능 계획, 후크의 활용, 데이터 처리, 인터페이스 생성—를 완벽하게 보여줍니다. 공식 문서를 꾸준히 학습하고 우수한 오픈소스 플러그인의 코드를 분석하며 실제로 코딩 연습을 계속하는 것이 플러그인 개발 기술을 향상시키는 가장 좋은 방법입니다. 여러분의 다음 플러그인은 아마도 더 복잡하고 흥미로운 실제 문제를 해결하는 데 도움이 될 것입니다.

자주 묻는 질문

WordPress 플러그인은 최소 몇 개의 파일로 구성되어 있을까요?

기능이 완전한 WordPress 플러그인은 최소한 하나의 PHP 파일만 필요로 합니다. 이 파일의 상단에 올바른 플러그인 헤더 정보가 포함되어 있으면 됩니다 (최소한 다음과 같은 정보가 필요합니다): Plugin NameWordPress는 백엔드 플러그인 목록에서 이 플러그인을 인식하여 활성화할 수 있습니다. 이 파일에는 모든 기능 코드, 관리 페이지 코드 등이 포함될 수 있습니다. 물론, 복잡한 플러그인의 경우 유지보수를 용이하게 하기 위해 코드를 여러 파일과 디렉터리로 분리하는 것이 권장됩니다.

내가 개발한 플러그인이 다른 플러그인과 충돌하는 것을 어떻게 피할 수 있을까요?

충돌을 피하는 핵심은 모든 함수, 클래스, 변수, 옵션 이름, 그리고 액션/필터 후크에 고유한 접두사를 사용하는 것입니다. 예를 들어, 다음과 같은 이름은 사용하지 마세요: add_greeting() 이런 일반적인 함수명 대신, 다음과 같은 이름을 사용하는 것이 더 적절할 것입니다: mgp_add_greeting() 이런 이름들 중에서… mgp (이것은 당신의 플러그인의 약어입니다.) 데이터베이스에 저장된 옵션들에 대해서도 고유한 접두사를 사용해야 합니다. mgp_greeting_text이를 통해 네임스페이스 충돌의 가능성을 최대한 줄일 수 있습니다.

플러그인을 활성화하거나 비활성화할 때 어떤 작업을 해야 할까요?

플러그인을 활성화할 때는 일반적으로 PHP 또는 WordPress의 버전을 확인하거나, 데이터베이스 테이블을 생성하거나, 기본 설정을 초기화하는 등의 일회성 작업을 수행해야 합니다. 이러한 작업들은 다음과 같은 방법으로 처리할 수 있습니다: register_activation_hook() 이 기능은 함수를 사용하여 구현됩니다. 마찬가지로,register_deactivation_hook() 플러그인이 비활성화될 때 실행될 작업을 정의하는 데 사용됩니다. 예를 들어, 예약된 작업을 삭제하는 것이 포함됩니다. 하지만 주의해야 할 점은, 비활성화 후퀴(hook)는 일반적으로 데이터를 삭제하는 데 사용되지 않는다는 것입니다. 데이터 정리는 일반적으로 제거 후퀴(uninstallation hook)나 사용자의 수동 선택을 통해 이루어집니다.

내 플러그인에 설정 페이지를 어떻게 추가하나요?

플러그인에 설정 페이지를 추가하는 데에는 주로 두 가지 WordPress API가 사용됩니다: 메뉴 API와 설정 API입니다. 먼저, add_action( 'admin_menu', ... ) 함수를 마운트하여 그 함수 내에서 사용합니다. add_menu_page() 또는 add_submenu_page() 등록하여 최상위 메뉴 페이지 또는 하위 메뉴 페이지를 만드세요. 그런 다음, 해당 페이지를 사용하세요. add_action( 'admin_init', ... ) 다른 함수를 마운트하여 그 안에서 사용하세요. register_setting()add_settings_section() 그리고 add_settings_field() 구체적인 설정 옵션과 폼 필드를 정의해 보겠습니다. 마지막으로, 설정 페이지의 HTML 폼을 렌더링하기 위한 콜백 함수를 작성하겠습니다.

제 플러그인은 어떤 WordPress 버전과 호환되어야 하나요?

이것은 당신의 타겟 사용자 그룹에 따라 달라집니다. 일반적으로는 최근 3~4개의 주요 WordPress 버전과 호환되는 것이 권장됩니다. 이를 플러그인의 헤더 정보에 명시할 수 있습니다. Requires at least: 다음은 최소 요구 사항인 WordPress 버전에 대한 설명입니다. 개발 과정에서는 매우 최신의 기능들을 사용하는 것을 피해야 하며, 이러한 기능들은 최신 버전의 WordPress에서만 지원됩니다. 즉, 최신 버전이 출시되기 전까지는 해당 기능들을 사용하지 않는 것이 좋습니다. function_exists() 조건을 검사하여 이전 버전과의 호환성을 유지할 수 있는 대체 방안을 제공해야 합니다. 또한, 오래된 버전의 WordPress에서 정기적으로 테스트를 수행하는 것은 호환성을 보장하는 좋은 방법입니다.