WordPress 플러그인 개발 완벽 가이드: 제로에서 시작하여 첫 번째 플러그인을 만들어보세요

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

준비 작업 및 환경 구축

코드를 작성하기 시작하기 전에, 적합한 개발 환경을 준비해야 합니다. 여기에는 로컬에 설치된 WordPress, 코드 편집기, 그리고 기본적인 PHP 지식이 포함됩니다. XAMPP, MAMP 또는 Local by Flywheel을 사용하여 로컬 WordPress 환경을 빠르게 설정하는 것을 추천합니다. 사용하는 PHP 버전이 WordPress 공식 요구 사항을 충족하는지 확인하십시오. 일반적으로 PHP 7.4 이상이 필요합니다.

플러그인이란 본질적으로 하나 이상의 PHP 파일로 구성되어 있으며, WordPress에 설치되어 웹사이트의 기능을 확장하거나 개선하는 역할을 합니다.wp-content/plugins디렉터리 내에 있습니다. 각 플러그인은 고유한 이름을 가져야 하며, 주 파일의 시작 부분에는 표준적인 플러그인 정보 주석이 포함되어야 합니다. 이는 WordPress가 플러그인을 인식하는 데 기본이 됩니다.

첫 번째 플러그인 파일을 만드세요.

먼저,wp-content/plugins디렉터리 내에 새로운 폴더를 생성하세요. 예를 들어, `new_folder`라는 이름으로 폴더를 만들 수 있습니다.my-first-plugin그런 다음 해당 폴더 내에 주 PHP 파일을 생성합니다. 이 파일의 이름은 보통 폴더의 이름과 동일합니다.my-first-plugin.php이 파일에 플러그인의 헤더 정보를 작성해야 합니다.

추천 읽기 워드프레스 플러그인 개발을 위한 완전한 가이드: 첫 번째 플러그인을 만들기 위한 0부터 1까지의 과정

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

파일을 저장한 후, WordPress 관리자의 “플러그인” 페이지로 이동하세요. 그러면 “내 첫 번째 플러그인”이 플러그인 목록에 표시되는 것을 볼 수 있을 것입니다. 이제 이 플러그인을 활성화하세요. 비록 아직 어떠한 기능도 없지만, 이는 해당 플러그인이 WordPress에 성공적으로 로드되었음을 의미합니다.

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

WordPress의 핵심 메커니즘을 이해하기: 훅(Hooks)과 필터(Filters)

WordPress의 강력한 확장성은 이벤트 기반의 아키텍처에서 비롯되며, 그 핵심은 “후크(Hooks)”입니다. 후크에는 두 가지 종류가 있습니다: 액션(Action)과 필터(Filter)입니다. 이러한 후크의 작동 원리를 이해하는 것이 효과적인 플러그인 개발을 위한 핵심입니다.

액션 훅(Action Hook)을 사용하면 특정 시점(예: 글 게시, 페이지 로딩 등)에 자신의 코드를 삽입하여 실행할 수 있습니다. 예를 들어, 글이 게시될 때 이메일을 보내는 기능을 구현할 수 있습니다.add_action()이 함수는 사용자 정의한 함수를 지정된 액션 후크에 등록합니다.

필터 후크(filter hook)를 사용하면 데이터를 수정할 수 있습니다. 데이터가 사용되기 전에(예: 데이터베이스에 저장되거나 브라우저에 표시되기 전에), 데이터를 가로채서 수정할 수 있습니다. 예를 들어, 기사 제목이나 댓글 내용을 수정하는 것이 가능합니다.add_filter()이 함수는 필터를 적용하는 데 사용됩니다.

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

가령 우리가 웹사이트의 관리자 대시보드 하단에 사용자 정의 텍스트를 추가하고 싶다고 가정해 봅시다. WordPress는 이를 위해 ‘관리자 헤더 및 푸터 설정’(Administrator Header and Footer Settings)이라는 기능을 제공합니다.admin_footer액션 후크(Action Hook)에 대한 설명입니다. 플러그인의 메인 파일에 다음 코드를 추가할 수 있습니다:

추천 읽기 WordPress 플러그인 개발 초보자를 위한 입문 가이드: 제0단계에서 첫 번째 기능 플러그인을 만들어보세요

// 定义一个在管理后台页脚显示信息的函数
function myplugin_display_admin_footer_text() {
    echo '<p>“제 첫 번째 플러그인”을 사용해 주셔서 감사합니다!</p>';
}
// 将函数挂载到 admin_footer 动作钩子
add_action( 'admin_footer', 'myplugin_display_admin_footer_text' );

파일을 저장한 후 WordPress 관리자 페이지를 새로고침하세요. 페이지 하단으로 스크롤하면 추가한 텍스트를 확인할 수 있을 것입니다. 이것이 바로 액션 훅(Action Hook)의 기본적인 사용 방법입니다: 특정 위치에서 코드를 실행하는 것이죠.

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

이제 모든 기사 제목을 수정해 보겠습니다. 제목의 끝에 일괄적으로 상표 기호를 추가해 보죠. 이를 위해 다음과 같은 방법을 사용할 수 있습니다:the_title필터.

// 定义一个修改文章标题的函数
function myplugin_modify_post_title( $title, $post_id ) {
    // 确保只在主循环且非管理后台中修改
    if ( ! is_admin() && in_the_loop() ) {
        $title = $title . ' ™';
    }
    return $title;
}
// 将函数挂载到 the_title 过滤器钩子,参数2表示接受2个参数
add_filter( 'the_title', 'myplugin_modify_post_title', 10, 2 );

이 코드는 현재 환경이 프론트엔드의 기사 주요 처리 루프에 있는지를 확인합니다. 만약 그렇다면, 제목 뒤에 “™” 기호를 추가합니다.10우선순위입니다(숫자가 작을수록 먼저 실행됩니다).2이는 우리의 함수가 두 개의 매개변수를 받는다는 것을 의미합니다 (원본 데이터).$title그리고$post_id)。

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

플러그인 기능 구축: 관리 메뉴 및 설정 페이지 생성

성숙한 플러그인은 일반적으로 WordPress 관리자 페이지에서 설정 옵션을 제공해야 합니다. 이를 위해서는 플러그인에 전용의 관리 메뉴 페이지를 생성해야 합니다. WordPress는 이 기능을 구현하기 위한 다양한 API 함수를 제공합니다. 예를 들어…add_menu_page()그리고add_options_page()

최고 관리 메뉴 추가하기

우리는 플러그인에 독립적인 상위 메뉴를 추가할 예정입니다. 이는 일반적으로…admin_menu작업은 액션 훅(Action Hook) 내에서 완료되었습니다. 메뉴와 페이지를 정의하기 위한 함수를 만들겠습니다.

// 定义添加管理菜单的函数
function myplugin_add_admin_menu() {
    add_menu_page(
        '我的插件设置',           // 页面标题
        '我的插件',               // 菜单标题
        'manage_options',         // 所需权限(管理员)
        'myplugin-settings-page', // 菜单slug(唯一标识)
        'myplugin_display_settings_page', // 用于显示页面内容的回调函数
        'dashicons-admin-generic', // 菜单图标(Dashicons)
        30                        // 菜单位置
    );
}
// 将函数挂载到 admin_menu 钩子
add_action( ‘admin_menu’, ‘myplugin_add_admin_menu’ );

다음으로, 콜백 함수를 정의해야 합니다.myplugin_display_settings_page()이제 설정 페이지의 HTML 콘텐츠를 렌더링할 것입니다.

추천 읽기 WordPress 플러그인 개발 입문부터 전문가 수준까지: 사용자 정의 기능 구축을 위한 완벽한 가이드

// 定义设置页面的显示内容
function myplugin_display_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
            // 输出设置字段、安全nonce等
            settings_fields( ‘myplugin_settings_group’ );
            do_settings_sections( ‘myplugin-settings-page’ );
            submit_button();
            ?>
        <input type="hidden" name="trp-form-language" value="ko"/></form>
    </div>
    &lt;?php
}

등록 설정, 필드, 그리고 파티션(Registration settings, fields, and partitions)

폼 데이터를 안전하게 처리하기 위해서는 WordPress의 설정 API를 사용해야 합니다. 여기에는 설정 등록, 설정 구역 추가, 필드 생성 등의 작업이 포함됩니다.

// 初始化插件设置
function myplugin_settings_init() {
    // 1. 注册一个设置(存储在wp_options表中)
    register_setting(
        ‘myplugin_settings_group’, // 设置组名,与 settings_fields() 对应
        ‘myplugin_options’ // 存储在数据库中的选项名
    );

// 2. 添加一个设置分区
    add_settings_section(
        ‘myplugin_section_basic’, // 分区ID
        ‘基础设置’, // 分区标题
        ‘myplugin_section_basic_callback’, // 分区介绍的回调函数
        ‘myplugin-settings-page’ // 所属页面的slug
    );

// 3. 为分区添加一个字段
    add_settings_field(
        ‘myplugin_field_message’, // 字段ID
        ‘欢迎信息’, // 字段标签
        ‘myplugin_field_message_callback’, // 渲染字段HTML的回调函数
        ‘myplugin-settings-page’, // 所属页面的slug
        ‘myplugin_section_basic’ // 所属分区的ID
    );
}
add_action( ‘admin_init’, ‘myplugin_settings_init’ );

// 分区介绍的回调函数
function myplugin_section_basic_callback() {
    echo ‘<p>플러그인의 기본 정보를 설정합니다.</p>’;
}

// 字段渲染的回调函数
function myplugin_field_message_callback() {
    // 从数据库获取现有值
    $options = get_option( ‘myplugin_options’ );
    $value = $options[‘message’] ?? ‘’; // PHP 7.0+ 空合并运算符
    // 输出输入框
    echo ‘<input type="“text”" name="“myplugin_options[message]”" value="“‘" . esc_attr( $value ) ‘” class ="“regular-text”" />‘;
}

이제 여러분의 플러그인에는 WordPress 표준에 부합하는 완전한 관리 설정 페이지가 생겼으며, 구성 옵션을 안전하게 저장하고 읽을 수 있습니다.

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

플러그인의 국제화 및 보안을 위한 모범 사례

플러그인을 전 세계 사용자들이 이용할 수 있도록 하기 위해서는 국제화(i18n)가 필수적인 단계입니다. 또한, 보안 규범을 준수하는 것은 여러분과 사용자들의 웹사이트를 공격으로부터 보호하는 데 있어 기반이 됩니다.

텍스트의 국제화를 구현하는 방법입니다.

WordPress 사용법__()_e()해당 기능을 구현하기 위해서는 특정 함수들을 사용해야 합니다. 먼저, 플러그인의 시작 부분에 필요한 설정들이 올바르게 되어 있는지 확인해야 합니다.Text Domain(예:my-first-plugin그런 다음, 모든 사용자를 대상으로 하는 문자열들을 번역 함수로 감싸세요.

// 在插件代码中,将硬编码的文本替换
// 修改前:echo ‘<p>“제 첫 번째 플러그인”을 사용해 주셔서 감사합니다!</p>’;
// 修改后:
function myplugin_display_admin_footer_text() {
    echo ‘<p>‘ . esc_html__( ‘感谢使用“我的第一个插件”!’, ‘my-first-plugin’ ) . ‘</p>’;
}

다음으로, Poedit와 같은 도구를 사용하여 생성해야 합니다..pot(템플릿) 파일은 플러그인에 저장됩니다.languages폴더 안에 있습니다. 번역자는 필요에 따라 해당 폴더를 생성할 수 있습니다..po그리고 컴파일된 후.mo마지막으로, 플러그인이 초기화될 때 이 파일을 사용하세요.load_plugin_textdomain()Function loading.

function myplugin_load_textdomain() {
    load_plugin_textdomain( ‘my-first-plugin’, false, dirname( plugin_basename( __FILE__ ) ) . ‘/languages/’ );
}
add_action( ‘plugins_loaded’, ‘myplugin_load_textdomain’ );

보안 코딩 규범을 준수하세요.

보안은 무엇보다도 중요합니다. 우선, 사용자가 입력한 데이터를 절대 신뢰해서는 안 됩니다. 사용자나 외부 소스에서 오는 모든 데이터는…$_GET$_POST$_COOKIE모든 데이터는 반드시 검증, 정제, 그리고 이스케이플링(escape) 과정을 거쳐야 합니다.

  • 에스케이프 출력: 데이터를 HTML, JavaScript 또는 URL로 출력할 때는 해당 에스케이프 함수를 사용하십시오.
    // 输出到HTML属性
    echo ‘<input value="“‘" . esc_attr( $value ) ‘“ />‘;
    // 输出到HTML内容
    echo ‘<p>‘ . esc_html( $text ) . ‘</p>’;
    // 输出到JavaScript变量
    echo ‘<script>var msg = “‘ . esc_js( $message ) . ‘“;</script>’;
    // 输出到URL
    echo ‘<a href="/ko/“‘/" . esc_url( $url ) ‘“>링크</a>’;
  • 입력값의 유효성을 검증합니다: 데이터가 예상된 형식(예: 이메일 주소, 숫자 등)에 맞는지 확인합니다.
    if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
        // 不是有效的邮箱地址
        wp_die( ‘无效的邮箱格式。’ );
    }
  • 능력 검사: 관리 작업을 실행하기 전에, 현재 사용자가 해당 권한을 가지고 있는지 확인하십시오.
    if ( ! current_user_can( ‘manage_options’ ) ) {
        wp_die( ‘你没有执行此操作的权限。’ );
    }
  • Nonce 검증: 상태가 변경되는 작업(예: 폼 제출, AJAX 요청)에서 Nonce(일회용 숫자)를 사용하여 크로스사이트 요청 위조(CSRF) 공격을 방지합니다.
    // 在表单中输出nonce字段
    wp_nonce_field( ‘myplugin_action’, ‘myplugin_nonce’ );
    // 在处理请求时验证nonce
    if ( ! isset( $_POST[‘myplugin_nonce’] ) || ! wp_verify_nonce( $_POST[‘myplugin_nonce’], ‘myplugin_action’ ) ) {
        wp_die( ‘安全校验失败。’ );
    }

요약

이 가이드를 통해 기본 플러그인 파일을 생성하는 것부터 WordPress 코어의 훅 시스템을 이해하고 활용하는 것, 관리자 인터페이스를 구축하는 것, 그리고 국제화 기능을 구현하고 기본적인 보안 관행을 적용하는 것에 이르기까지의 전 과정을 완료하셨습니다. 이제 기능이 완전하고 구조가 명확하며 안전하고 신뢰할 수 있는 WordPress 플러그인을 개발하는 데 필요한 핵심 기술들을 모두 습득하셨습니다. 플러그인 개발의 핵심은 액션(Action)과 필터(Filter) 훅을 효과적으로 활용하여 WordPress의 기능을 확장하는 데 있으며, 동시에 보안성과 유지보수성을 항상 최우선으로 고려해야 합니다. 다음 단계로는 사용자 정의 데이터베이스 테이블, AJAX 상호작용, REST API 엔드포인트와 같은 더 복잡한 API를 탐구하여 더 강력한 도구를 만들어보실 수 있습니다.

자주 묻는 질문

###: WordPress 플러그인을 개발하기 위해 어떤 사전 지식이 필요한가요?
기본적인 PHP 프로그래밍 지식이 필요하며, HTML, CSS, JavaScript(특히 jQuery)에 대한 이해도 매우 도움이 됩니다. 가장 중요한 것은 WordPress의 기본 구조, 즉 테마, 플러그인, 글 유형, 사용자 역할과 같은 개념에 대한 초보적인 이해를 갖추고 있어야 한다는 점입니다. 이 가이드는 여러분이 이러한 기초 지식을 이미 갖추고 있다고 가정합니다.

내 WordPress 플러그인을 어떻게 디버깅하나요?

먼저, 귀하의… (The text seems incomplete here; please provide the full sentence or context.)wp-config.php문서에서WP_DEBUG상수를 다음과 같이 설정합니다:true이렇게 하면 페이지에 PHP 오류, 경고, 알림이 표시됩니다. 또한, 다음과 같은 방법을 사용할 수도 있습니다:error_log()이 함수는 디버깅 정보를 서버의 오류 로그에 기록합니다. 보다 복잡한 디버깅을 위해서는 Query Monitor와 같은 전용 디버깅 플러그인을 사용하는 것을 고려해 볼 수 있습니다. Query Monitor를 사용하면 데이터베이스 쿼리, 핸들러 실행, 스크립트 로딩 등의 상세한 정보를 확인할 수 있습니다.

어떻게 제가 개발한 플러그인을 배포해야 할까요?

개인적인 용도나 소규모 공유를 위해서는 ZIP 파일로 압축하여 사용하시면 됩니다. 공개적으로 배포하고 싶다면 두 가지 주요 방법이 있습니다. 첫 번째는 공식 WordPress 플러그인 디렉터리(WordPress.org)에 제출하는 것으로, 이 경우 제출 가이드라인과 코드 표준을 준수해야 하지만 가장 높은 노출도를 얻을 수 있습니다. 두 번째는 자신의 웹사이트나 CodeCanyon과 같은 제3자 마켓을 통해 플러그인을 배포하는 것입니다. 공식 디렉터리에 제출하기 전에는 반드시 코드의 품질과 보안성을 확인해 주세요.

내 플러그인에 사용자 정의된 글 유형이나 분류 체계를 어떻게 추가할 수 있나요?

당신은 사용할 수 있습니다.register_post_type()함수를 사용하여 사용자 정의 기사 유형(CPT: Custom Post Type)을 생성합니다.register_taxonomy()이 함수들은 사용자 정의 분류 체계를 생성하는 데 사용됩니다. 이러한 작업은 가능한 한…init동작 후크(Action Hook)에서 실행됩니다. WordPress Codex와 Developer Handbook에는 이 두 함수에 대한 자세한 매개변수 설명이 있으며, 이는 WordPress의 콘텐츠 관리 기능을 확장하는 강력한 방법입니다.

플러그인 내의 함수명은 다른 플러그인과의 충돌을 어떻게 피할 수 있나요?

함수명, 클래스명, 상수명의 충돌을 방지하기 위한 가장 좋은 방법은 네임스페이스를 사용하는 것입니다(PHP 5.3 이상). 만약 여러분의 플러그인이 더 이전 버전의 PHP 환경을 지원해야 하거나 최대한의 호환성을 유지하고 싶다면, 모든 식별자에 고유한 접두사를 추가하는 방법을 사용할 수 있습니다. 예를 들어, 플러그인의 이름이나 약어를 접두사로 사용하는 것이 좋습니다.myplugin_function_nameMyPlugin_ClassName또는MYPLUGIN_CONSTANT이 가이드에 포함된 예제 코드들은 모두 접두사(prefix) 방법을 사용하고 있습니다.