당신의 첫 워드프레스 플러그인을 단계별로 구축하세요: 입문서부터 실제 개발까지

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

WordPress 플러그인 개발 기초 및 환경 준비

WordPress 플러그인은 본질적으로 PHP 파일 모음으로, WordPress가 제공하는 API를 통해 핵심 기능을 확장하는 역할을 합니다. 플러그인의 크기는 단순히 짧은 코드 한 줄을 추가하는 것부터 완전한 관리 시스템을 구축하는 것까지 다양할 수 있습니다. 코딩을 시작하기 전에 플러그인의 기본 구조를 이해하는 것이 매우 중요합니다. 모든 플러그인은 반드시 주 파일을 가지고 있어야 하며, 이 파일은 일반적으로 플러그인의 이름으로 명명됩니다. my-first-plugin.php이 파일 상단의 주석 부분은 WordPress가 플러그인을 인식하는 데 중요한 역할을 합니다.

개발 환경은 효율적인 작업을 위한 기반이 됩니다. 온라인 환경과 가능한 한 일치하는 테스트 환경을 로컬에 구축해야 합니다. XAMPP, MAMP 또는 Local by Flywheel과 같은 로컬 서버 통합 패키지를 사용하는 것을 추천합니다. 또한, 코드 편집기나 통합 개발 환경(IDE)이 PHP 문법의 하이라이팅 및 디버깅을 지원하는지 확인하십시오. 예를 들어, VS Code, PhpStorm, Sublime Text 등이 이에 해당합니다. WordPress의 설정도 적절히 활성화해야 합니다.WP_DEBUG패턴은 개발 단계에서 오류를 찾아내는 데 매우 중요합니다. 웹사이트에서도 이를 활용할 수 있습니다.wp-config.php파일 내에서는 정의를 통해 해당 내용을 처리합니다.define('WP_DEBUG', true);이것을 활성화하려면…

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

가장 간단한 플러그인을 만드는 것부터 시작해 보겠습니다. 이 플러그인은 웹사이트의 관리자 페이지에 사용자 정의된 알림 메시지를 표시할 수 있습니다.

추천 읽기 워드프레스 플러그인 개발 가이드: 처음부터 자신만의 기능을 개발하는 방법

플러그인의 메인 파일과 주석 파일을 작성하세요.

먼저, 당신의 WordPress 설치 디렉터리 내에서…wp-content/plugins폴더 안에 새로운 폴더를 만들어서 그 이름을 ‘새 폴더’(New Folder)로 지정하세요.my-first-plugin해당 폴더 내에 PHP 파일을 하나 만들어주세요. 파일 이름도 동일하게 지정해 주세요.my-first-plugin.php

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

이 파일을 열고, 아래의 표준 플러그인 정보 주석 형식을 입력하세요. 이 정보들은 WordPress 관리자의 “플러그인” 페이지에 표시됩니다.

<?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
 * Domain Path:       /languages
 */

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

기본적인 백엔드 알림 기능을 구현합니다.

이제 이 플러그인에 첫 번째 기능을 추가하겠습니다: 관리자 대시보드 상단에 환영 메시지를 표시하는 기능입니다. 이를 위해 WordPress의 기능을 사용할 것입니다.admin_notices후크(Hook): 방금 전 플러그인의 메인 파일에서, 주석 헤더 아래에 다음 코드를 추가하세요:

// 在管理后台显示自定义通知
function mfp_show_admin_notice() {
    ?&gt;
    <div class="notice notice-success is-dismissible">
        <p><?php _e( '欢迎使用“我的第一个插件”!', 'my-first-plugin' ); ?></p>
    </div>
    &lt;?php
}
add_action( &#039;admin_notices&#039;, &#039;mfp_show_admin_notice&#039; );

코드 설명: 우리는 `my_project`라는 이름의 프로젝트를 생성했습니다.mfp_show_admin_notice이 함수는 WordPress 백엔드 스타일에 맞는 HTML 알림 코드를 출력합니다. 사용 방법은 다음과 같습니다:_e()이 함수는 향후의 국제화(i18n)를 지원하기 위해 만들어졌습니다. 마지막으로,add_action()이 함수는 우리가 직접 작성한 사용자 정의 함수를 WordPress에 등록합니다.admin_notices이 “후크”를 사용하세요. 파일을 저장한 후 WordPress 관리자 페이지를 새로고침하면 녹색의 성공 메시지를 보실 수 있습니다.

추천 읽기 WordPress 플러그인 개발 완전 가이드: 초보자부터 고급 실전까지의 단계별 학습 과정

플러그인의 핵심 기능 개발에 대한 심층적인 이해

기본 구조를 익힌 후에는 더 유용한 기능들을 개발할 수 있습니다. 흔한 요구 사항 중 하나는 기사 내용의 끝에 사용자가 정의한 텍스트를 자동으로 추가하는 것입니다.

필터를 사용하여 기사 내용을 수정합니다.

WordPress는 다양한 데이터를 수정하기 위한 많은 “필터(Filter)”를 제공합니다. 글 내용 뒤에 텍스트를 추가하기 위해, 우리는 해당 필터를 사용할 것입니다.the_content필터: 플러그인의 메인 파일에 다음과 같은 새로운 함수를 추가하세요:

// 在文章内容末尾添加自定义文本
function mfp_append_to_content( $content ) {
    // 确保只在主循环的单篇文章页面执行
    if ( is_single() &amp;&amp; in_the_loop() &amp;&amp; is_main_query() ) {
        $custom_text = '<div class="my-plugin-footer"><p>읽어주셔서 감사합니다! 이 글은 “제 첫 번째 플러그인'에서 제공됩니다.</p></div>';
        $content .= $custom_text;
    }
    return $content;
}
add_filter( 'the_content', 'mfp_append_to_content' );

이 함수는 원본 데이터를 입력으로 받습니다.$content조건 판단을 통해 해당 커스텀 HTML 텍스트가 오직 개별 기사 페이지에서만, 그리고 메인 쿼리가 실행될 때에만 추가되도록 합니다. 수정된 콘텐츠는 최종적으로 반환됩니다. 이 방식은 비침습적이며, 데이터베이스에 저장된 원본 콘텐츠를 변경하지 않습니다.

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

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

사용자가 기사 끝에 추가할 텍스트를 직접 설정할 수 있도록 하기 위해, 플러그인에 설정 페이지를 만들어야 합니다. 이 작업에는 몇 가지 단계가 포함됩니다: 메뉴 등록, 페이지 콜백 함수 생성, 폼 데이터 처리입니다.

먼저, 사용하기 위해…admin_menu후크에 하위 메뉴 페이지를 추가하세요:

// 添加插件设置菜单到后台
function mfp_add_admin_menu() {
    add_options_page(
        '我的第一个插件设置', // 页面标题
        '我的插件设置',       // 菜单标题
        'manage_options',    // 权限要求
        'my-first-plugin',   // 菜单slug
        'mfp_options_page_html' // 显示页面内容的回调函数
    );
}
add_action( 'admin_menu', 'mfp_add_admin_menu' );

다음으로, 콜백 함수를 정의합니다.mfp_options_page_htmlHTML 폼을 렌더링하는 설정 페이지를 만들어야 합니다. 또한, WordPress 설정 API를 사용하여 옵션들을 안전하게 등록, 저장, 조회해야 합니다. 간결함을 위해 다음은 그 구현의 단순화된 버전입니다:

추천 읽기 WordPress 플러그인 개발 완전 가이드: 초보자부터 전문가급 확장 기능 구축까지

// 设置页面的HTML内容
function mfp_options_page_html() {
    // 检查用户权限
    if ( !current_user_can( 'manage_options' ) ) {
        return;
    }
    ?&gt;
    <div class="wrap">
        <h1></h1>
        <form action="/ko/options.php/" method="post" data-trp-original-action="options.php">
            <?php
            // 输出设置字段、非ce等安全字段
            settings_fields( 'mfp_options_group' );
            do_settings_sections( 'my-first-plugin' );
            submit_button( '保存设置' );
            ?>
        <input type="hidden" name="trp-form-language" value="ko"/></form>
    </div>
    <?php
}

// 初始化插件设置
function mfp_settings_init() {
    // 注册一个设置
    register_setting( 'mfp_options_group', 'mfp_footer_text' );

// 添加一个设置区域
    add_settings_section(
        'mfp_section',
        '自定义文本设置',
        null,
        'my-first-plugin'
    );

// 向区域中添加字段
    add_settings_field(
        'mfp_field_footer',
        '文章页脚文本',
        'mfp_field_footer_html',
        'my-first-plugin',
        'mfp_section'
    );
}
add_action( 'admin_init', 'mfp_settings_init' );

// 渲染文本输入字段
function mfp_field_footer_html() {
    $option = get_option( 'mfp_footer_text', '感谢阅读!本文由“我的第一个插件”为您呈现。' );
    ?>
    <input type='text' name='mfp_footer_text' value='<?php echo esc_attr( $option ); ?>' class='regular-text'>
    <p class="description">여기에 입력한 내용은 모든 기사의 끝에 표시됩니다.</p>
    &lt;?php
}

마지막으로, 이전에 수정한 내용을 다시 적용해 주세요.mfp_append_to_content함수를 사용하여 데이터베이스 옵션에서 정보를 가져옵니다.mfp_footer_text텍스트는 파일에서 읽어오며, 하드코딩된 텍스트를 사용하지 않습니다.

플러그인의 보안성 강화, 성능 최적화, 그리고 배포 준비

개발의 마지막 단계에서는 보안성, 코드 품질, 그리고 배포 프로세스에 주의를 기울여야 합니다. 이를 통해 플러그인이 안정적이고 사용하기에 적합하도록 만들어야 합니다.

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

보안 모범 사례를 준수하세요.

모든 사용자 입력은 브라우저에 출력되거나 데이터베이스에 저장되기 전에 반드시 이스케이프 처리 또는 검증을 거쳐야 합니다. 출력 시에는…esc_html()esc_attr()esc_url()등의 함수들입니다. 폼 제출이나 AJAX 요청을 처리할 때 사용됩니다.wp_verify_nonce()그리고check_admin_referer()요청의 유효성을 검증하여 크로스사이트 요청 위조(CSRF) 공격을 방지하세요. 절대로 요청을 그대로 신뢰해서는 안 됩니다.$_GET$_POST또는$_REQUEST중의 데이터.

국제화 지원을 구현합니다.

플러그인을 전 세계의 사용자들이 사용할 수 있도록 하기 위해서는 코드 내에 있는 모든 사용자 대상의 문자열들을 국제화 처리해야 합니다. 우리는 이전의 예제에서 이미 이를 적용해 보았습니다._e()함수를 사용하여 번역된 텍스트를 출력하세요. 또한, 플러그인의 주석 부분에 이를 명시해야 합니다.Text Domain그리고Domain Path
플러그인이 초기화될 때(예를 들어, 특정 이벤트나 프로세스를 통해)...plugins_loaded훅(hook)을 사용하기 위해서는 먼저 해당 훅이 정의된 위치를 찾아야 합니다. 훅은 일반적으로 코드 내의 특정 위치에 삽입되며, 다른 코드가 이 훅을 호출할 수 있도록 설계됩니다. 훅을 호출하려면 훅의 이름을 사용하거나, 훅을 호출하는 코드에서 해당 훅을 참조해야 합니다. 훅의 사용 방load_plugin_textdomain()언어 파일을 로드하는 함수:

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

그런 다음, Poedit와 같은 도구를 사용하여 플러그인의 소스 코드에서 문자열을 추출할 수 있습니다.__()_e()등의 함수로 감싸진 문자열을 생성합니다..pot템플릿 파일은 번역가가 작업을 수행하는 데 사용하는 파일입니다..po그리고.mo파일.

코드 조직 및 성능 고려사항

플러그인 기능이 점점 늘어남에 따라, 모든 코드를 메인 파일에 몰아넣는 것은 바람직하지 않습니다. 적절한 방법은 기능 모듈에 따라 코드를 분리하여 각각 다른 파일에 저장하는 것입니다..php파일 내에 존재하는 내용들을 주 파일을 통해 선택적으로 포함시킬 수 있습니다. 예를 들어, 다음과 같이 할 수 있습니다:includes/admin/디렉터리에는 백엔드 관련 코드가 저장되어 있습니다.includes/public/프론트엔드 관련 코드를 저장하는 곳입니다.includes/class-*.php저장 클래스 정의.
자원이 많이 소모되는 작업의 경우, WordPress의 ‘Transients API’를 사용하여 시간이 많이 걸리는 쿼리의 결과를 캐싱하거나, ‘Cron API’를 활용하여 백그라운드에서 즉시 처리되지 않아도 되는 작업들을 처리하는 것을 고려해 보세요. 플러그인을 비활성화할 때에도 등록된 언인스톨링 후크(uninstall hook)를 통해 필요한 작업들이 제대로 수행되도록 해야 합니다.register_uninstall_hook()) 생성된 데이터와 옵션을 삭제하여 사이트를 깔끔하게 유지하세요.

요약

이 튜토리얼을 통해 우리는 기능이 완전한 WordPress 플러그인을 처음부터 제작하는 과정을 완료했습니다. 플러그인의 기본 구조와 개발 환경을 설정하는 것부터 시작하여, 표준 주석 헤더가 포함된 메인 파일을 생성했습니다. 그 후, 해당 파일을 WordPress 사이트에 설치하여 플러그인이 제대로 작동하는지 테스트했습니다.admin_notices그리고the_content이 두 가지 핵심 훅을 통해 백엔드 알림 기능과 기사 페이지 하단 텍스트 기능을 구현했습니다. 플러그인의 실용성을 높이기 위해 WordPress 설정 API를 추가로 도입하여 사용자가 텍스트를 직접 수정할 수 있는 관리 페이지를 만들었습니다. 마지막으로, 플러그인 개발에서 매우 중요한 보안 관행, 국제화 지원, 코드 구조 최적화와 같은 고급 주제들에 대해 논의했습니다. 이 과정은 WordPress 플러그인 개발의 핵심 패러다임을 명확하게 보여줍니다: 다양한 액션 훅과 필터를 활용하여 기능을 추가하고, API 규격을 준수하여 인터페이스를 만들며, 항상 보안성과 유지보수성을 최우선으로 합니다. 이러한 기초를 익히면 더 복잡한 플러그인을 개발할 수 있는 능력을 갖추게 됩니다.

자주 묻는 질문

WordPress 플러그인을 개발하려면 어떤 사전 지식이 필요한가요?

PHP 프로그래밍에 대한 탄탄한 기초가 필요합니다. 플러그인 코드는 주로 PHP로 작성되기 때문입니다. 또한, HTML, CSS, JavaScript에 대한 기본적인 이해가 있어야 전면적인 디스플레이와 상호작용을 처리할 수 있습니다. WordPress의 기본 개념, 즉 테마(themes), 글 유형(post types), 분류 체계这些类别, 특히 훅(Hooks) 시스템(액션(action)과 필터(filter)에 대한 숙지가 매우 중요합니다.

###
WordPress 플러그인의 가장 기본적인 구성에는 어떤 파일들이 포함되어야 할까요?

가장 기본적인 경우에, 플러그인은 단 하나의 PHP 파일만을 포함할 수 있습니다. 그러나 이 파일의 맨 위에는 WordPress 표준에 부합하는 플러그인 정보 주석 헤더(Plugin Headers)가 반드시 포함되어야 합니다. 즉, 우리 예제에서 보여준 것과 같이 말입니다.Plugin NameDescription등의 필드들입니다. 이것이 WordPress가 해당 플러그인을 인식하고 플러그인 관리 목록에 표시하는 유일한 기준입니다.

###
내 플러그인의 함수와 변수에 이름을 어떻게 지어야 할까요?

WordPress 코어, 테마 또는 다른 플러그인의 코드와 충돌을 피하기 위해 모든 사용자 정의 함수, 클래스, 변수, 상수에는 고유한 접두사를 사용해야 합니다. 일반적으로 플러그인의 약어나 줄임말과 관련된 접두사를 사용하는 것이 좋습니다. 예를 들어, 저희 예제에서는 그러한 접두사를 사용하고 있습니다.mfp_(‘My First Plugin’을 대표하여 말씀드리자면) 클래스명 역시 이 규칙을 따라야 하며, 가능한 한 의미 있는 전체 이름을 사용하는 것이 좋습니다.

###
플러그인에서 생성된 데이터베이스 테이블이나 옵션들은 플러그인이 삭제된 후에 삭제됩니까?

기본적으로는 그렇지 않습니다. 만약 당신이 특정 방법을 통해…add_option()update_option()사용자가 WordPress 관리자 페이지를 통해 플러그인 파일을 삭제하더라도, 생성된 옵션이나 사용자가 직접 정의한 데이터표는 데이터베이스에 남아 있을 수 있습니다. 깨끗하고 원활한 제거 경험을 제공하기 위해서는 반드시 해당 데이터를 미리 삭제해야 합니다.register_uninstall_hook()이 함수는 클리닝 콜백 함수를 등록하는 역할을 합니다. 이 콜백 함수에서는 모든 플러그인 관련 옵션, 데이터베이스 테이블, 그리고 임시 캐시를 삭제합니다.

###
내 플러그인을 더 많은 WordPress 버전과 호환시키려면 어떻게 해야 할까요?

코드에서는 너무 최신 버전의 PHP나 WordPress에만 존재하는 함수를 사용하는 것을 피해야 합니다. 특정 함수, 클래스, 또는 훅(hook)을 사용하기 전에는 반드시 공식 문서를 참조하여 해당 기능이 어떤 WordPress 버전부터 도입되었는지 확인해야 합니다. 이 정보는 플러그인의 메인 파일에 있는 주석 부분에 기재할 수 있습니다.Requires at least:필드 선언에서는 최소 지원되는 WordPress 버전을 명시해야 합니다. 코드 내에서는 조건문과 함께 이를 활용할 수 있습니다.function_exists()또는class_exists()검사를 통해 대체 솔루션을 제공하거나 사용자에게 친절한 안내를 해주세요.