WordPress 플러그인 개발을 전반적으로 마스터하기: 제로부터 사용자 정의 기능 모듈을 구축하는 방법

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

제로에서 시작하기: 준비 작업 및 환경 설정

첫 번째 플러그인을 작성하기 시작하기 전에, 충분한 준비 작업을 해야 합니다. 여기에는 WordPress 플러그인의 기본 구조를 이해하고, 안전한 로컬 개발 환경을 설정하며, 플러그인 개발의 핵심 철학을 파악하는 것이 포함됩니다.

전형적인 워드프레스 플러그인은 위치에 있습니다. /wp-content/plugins/ 디렉터리 내에 있는 독립적인 폴더입니다. 이 폴더의 핵심은 특정 파일 헤더를 가진 PHP 메인 파일입니다. 이 메인 파일에는 플러그인의 메타정보뿐만 아니라 플러그인 기능의 전체적인 시작점도 포함되어 있습니다. 플러그인을 시작하는 방법에는 두 가지가 있습니다: 하나는 프로시저 중심의 함수 조합을 사용하는 방법이고, 다른 하나는 객체 지향의 클래스 구조를 사용하는 방법입니다. 후자는 더 나은 캡슐화와 코드 구성 능력 덕분에 현대 플러그인 개발에서 더 선호됩니다.

로컬 개발 환경은 효율적인 개발에 매우 중요합니다. XAMPP, Local by Flywheel, Docker와 같은 도구를 사용하여 Apache/Nginx, MySQL, PHP가 통합된 개발 환경을 설정하는 것을 권장합니다. 이를 통해 온라인 웹사이트에 영향을 주지 않고 자유롭게 테스트와 디버깅을 진행할 수 있습니다.

추천 읽기 제로에서 시작하기: WordPress 플러그인 개발을 위한 완벽한 가이드 및 모범 사례 공유

플러그인의 기본 구조와 핵심 파일을 구축하기: 구조와 필수 파일들

이 섹션에서는 WordPress 표준을 준수하는 가장 기본적인 플러그인 구조를 처음부터 어떻게 만드는지 자세히 설명합니다. 좋은 플러그인 구조는 플러그인의 안정성, 보안성, 그리고 유지보수성을 위한 기반이 됩니다.

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

필수적인 메인 플러그인 파일을 생성하세요.

플러그인의 “생명”은 주 파일에서 시작됩니다. 이 파일의 이름은 보통 플러그인 폴더의 이름과 동일합니다. 예를 들어, 플러그인 폴더의 이름이 ‘my-plugin’이라면, 해당 주 파일의 이름도 ‘my-plugin.js’와 같을 것입니다. my-custom-plugin그렇다면 주 파일의 이름은 다음과 같이 지을 수 있습니다: my-custom-plugin.php이 파일의 맨 위에는 플러그인 정보를 선언하기 위한 특정 형식의 주석 블록을 사용해야 합니다. 이는 WordPress가 플러그인을 인식하고 관리자 페이지의 목록에 표시하는 데 필수적인 요소입니다.

다음은 가장 기본적인 플러그인 파일 헤더의 예시입니다:

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

이 주석에 있는 “Plugin Name”은 필수 항목이며, 나머지 필드들은 선택 사항이지만 권장됩니다. “Text Domain”과 “Domain Path”는 플러그인의 국제화(i18n)를 위해 사용되며, 이후 다양한 언어로 번역하는 데 필요한 정보를 제공합니다.

조직 플러그인의 파일 및 디렉터리 구조

플러그인 기능이 점점 더 많아지면서, 모든 코드를 메인 파일에 몰아넣는 것은 바람직하지 않습니다. 잘 구성된 플러그인 구조는 일반적으로 여러 하위 디렉터리와 파일을 포함합니다. 일반적인 구조는 다음과 같습니다:

추천 읽기 WordPress 플러그인 개발 완전 가이드: 초보자부터 실제 서비스로 배포하기까지의 실전 튜토리얼

my-custom-plugin/
├── my-custom-plugin.php      # 主插件文件(入口)
├── includes/                 # 核心功能类文件目录
│   ├── class-core.php        # 核心逻辑类
│   └── class-admin.php       # 后台管理逻辑类
├── admin/                    # 后台相关文件
│   ├── css/                  # 后台样式表
│   ├── js/                   # 后台JavaScript
│   └── partials/             # 后台模板片段
├── public/                   # 前端相关文件
│   ├── css/
│   ├── js/
│   └── partials/
├── assets/                   # 公共资源(如图标、图片)
├── languages/                # 国际化语言包(.po, .mo文件)
└── uninstall.php             # 插件卸载清理脚本

In my-custom-plugin.php 주 파일(main file)에서는 일반적으로 비즈니스 로직을 직접 작성하지 않습니다. 대신, 필요한 파일들을 포함하고 핵심 클래스들을 초기화하는 역할을 하는 “시작점(starter)”으로 사용됩니다.

// 防止直接文件访问
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

// 定义插件路径常量,方便在其他文件中引用
define( 'MY_PLUGIN_PATH', plugin_dir_path( __FILE__ ) );
define( 'MY_PLUGIN_URL', plugin_dir_url( __FILE__ ) );

// 包含核心类文件
require_once MY_PLUGIN_PATH . 'includes/class-core.php';
require_once MY_PLUGIN_PATH . 'includes/class-admin.php';

// 初始化插件
function my_custom_plugin_init() {
    $plugin_core = new My_Plugin_Core();
    $plugin_admin = new My_Plugin_Admin();
    // 执行初始化操作...
}
add_action( 'plugins_loaded', 'my_custom_plugin_init' );

WordPress 코어 링크: 액션(Action) 및 필터(Filter) 훅

WordPress 플러그인 시스템이 강력한 이유는 다양한 이벤트 포인트를 제공하기 때문입니다. 이를 통해 개발자들은 WordPress의 코어 코드를 수정하지 않고도 플러그인의 동작을 변경하거나 개선할 수 있습니다. 이러한 메커니즘을 “훅(Hooks)”이라고 하며, 주로 “액션(Action)”과 “필터(Filter)”로 나뉩니다. 훅은 플러그인이 WordPress 코어와 상호작용하는 데 사용되는 중요한 수단입니다.

Action Hook을 이해하고 활용하는 것은 프로그래밍에서 매우 중요합니다. Action Hook은 프로그램의 특정 지점에서 실행될 수 있는 코드 블록으로, 이를 통해 기존의 기능을 확장하거나 새로운 기능을 추가할 수 있습니다. 예를 들어, 웹사이트의 메뉴가 클릭될 때나 페이지가 로드될 때와 같은 이벤트에 반응

액션 훅(Action Hook)을 사용하면 특정 이벤트가 발생할 때 사용자 정의 코드를 실행할 수 있습니다. 예를 들어, 기사가 게시되었을 때, 사용자가 로그인했을 때, 또는 관리자 페이지의 특정 페이지가 로드되었을 때와 같은 경우입니다. add_action() 함수를 사용하면 해당 함수를 이러한 “후크(hook)”에 ‘마운트(mount)’할 수 있습니다.

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

만약 기사의 하단에 자동으로 저작권 정보를 추가하고 싶다면, 다음과 같은 방법을 사용할 수 있습니다. the_content 이 액션 훅(사실은 필터이지만 사용 방식이 액션과 유사하기 때문에, 전통적인 예제에서는 이런 식으로 설명됩니다)의 더 적절한 사용 예는 사용자가 등록에 성공한 후 환영 이메일을 보내는 것입니다.

// 这是一个动作钩子的使用示例
function my_plugin_send_welcome_email( $user_id ) {
    $user = get_userdata( $user_id );
    $to = $user->user_email;
    $subject = '欢迎加入我们的网站!';
    $message = '亲爱的' . $user->display_name . ',感谢您注册!';
    wp_mail( $to, $subject, $message );
}
// 将函数挂载到`user_register`这个动作钩子上
add_action( 'user_register', 'my_plugin_send_welcome_email' );

필터의 사용 방법을 숙지하세요.

필터 훅(filter hook)을 사용하면 데이터를 수정할 수 있습니다. WordPress가 특정 프로세스를 실행할 때, 해당 데이터를 일련의 필터를 통해 전달하며, 여러분의 플러그인은 이 데이터를 가로채서 수정한 후 다시 반환할 수 있습니다. add_filter() 이 기능은 함수를 사용하여 구현됩니다.

가장 흔한 예는 기사 내용의 출력을 수정하는 것입니다. 예를 들어, 각 기사의 내용 앞에 자동으로 특색 있는 이미지를 삽입하여 가이드 이미지로 사용하는 것입니다.

추천 읽기 WordPress 플러그인 개발 입문 가이드: 제0단계에서 시작하여 첫 번째 커스텀 기능 모듈을 만들어보세요.

function my_plugin_prepend_featured_image_to_content( $content ) {
    // 只在主循环的单篇文章页面生效
    if ( is_single() && in_the_loop() && is_main_query() ) {
        $featured_image = get_the_post_thumbnail( null, 'medium', array( 'class' => 'alignleft' ) );
        if ( $featured_image ) {
            $content = $featured_image . $content;
        }
    }
    return $content;
}
// 将函数挂载到`the_content`这个过滤器钩子上
add_filter( 'the_content', 'my_plugin_prepend_featured_image_to_content' );

플러그인 기능 구현: 관리자 페이지와 프론트엔드의 통합

완전한 플러그인은 일반적으로 사용자와 상호작용해야 하므로, 설정을 관리하기 위한 관리 인터페이스를 만들어야 합니다. 또한, 프론트엔드 페이지에 새로운 기능이나 콘텐츠를 추가할 필요가 있을 수도 있습니다.

백엔드 설정 페이지를 생성하세요.

플러그인에 명확한 백엔드 설정 페이지를 제공하는 것은 우수한 사용자 경험을 위한 핵심입니다. WordPress는 상위 메뉴나 하위 메뉴를 추가하기 위한 다양한 API를 제공합니다. 이 과정은 일반적으로 두 단계로 이루어집니다: 메뉴 항목을 등록하고, 해당 메뉴 항목에 매핑된 콜백 함수를 정의하여 페이지 콘텐츠를 출력하는 것입니다.

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

다음은 “설정” 메인 메뉴에 하위 메뉴 항목을 추가하는 예시입니다:

클래스 My_Plugin_Admin {
    public function __construct() {
        add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
        add_action( 'admin_init', array( $this, 'register_settings' ) );
    }

public function add_admin_menu() {
        add_options_page(
            '내 플러그인 설정',   // 페이지 타이틀
            '내 플러그인',   // 메뉴 타이틀
            'manage_options',   // 필요한 권한
            'my-plugin-settings',   // 메뉴 slug
            array( $this, 'render_settings_page' )   // 콜백 함수
        );
    }

public function register_settings() {
        // 설정 옵션 등록
        register_setting( 'my_plugin_settings_group', 'my_plugin_option_name' );
        // 설정 섹션 추가
        add_settings_section( 'my_plugin_main_section', '주요 설정', null, 'my-plugin-settings' );
        // 섹션에 필드 추가
        add_settings_field(
            'my_plugin_text_field',
            '예제 텍스트 필드',
            array( $this, 'render_text_field' ),
            'my-plugin-settings',
            'my_plugin_main_section'
        );
    }

public function render_settings_page() {
        ?&gt;
    }

}
        <div class="wrap">
            <h1>My plugin settings</h1>
            <form action="/ko/options.php/" method="post" 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
    }

public function render_text_field() {
        $option = get_option( &#039;my_plugin_option_name&#039; );
        echo &#039;<input type="text" name="my_plugin_option_name" value="' . esc_attr( $option ) . '" />';
    }
}

기능을 웹사이트의 프론트엔드에 출력하세요.

프론트엔드 기능의 구현 방법은 다양합니다. 쇼트코드(Shortcode), 위젯(Widget), 또는 API를 사용하여 기존의 출력 내용을 수정하는 방법이 있습니다. 쇼트코드는 사용자가 기사나 페이지 편집기에서 간단한 태그를 입력함으로써 플러그인 기능을 호출할 수 있게 해주는 간단하고 효과적인 방법입니다.

단축 코드를 생성하려면 다음과 같은 도구나 방법을 사용해야 합니다: add_shortcode() 함수:

// 定义一个简单的短代码,用于显示一个问候语
function my_plugin_greeting_shortcode( $atts ) {
    // 解析短代码属性
    $atts = shortcode_atts( array(
        'name' =&gt; '访客',
    ), $atts, 'greeting' );

// 返回输出内容
    return '<p class="my-plugin-greeting">안녕하세요, '. esc_html($atts['name'])'. ‘!</p>'php
add_shortcode('greeting', 'my_plugin_greeting_shortcode');

사용자는 단지 기사 편집기에 내용을 입력하기만 하면 됩니다. [greeting name="张三"]그러면 프론트엔드에 “안녕하세요, 장삼님!”이라는 문장이 표시됩니다.

요약

WordPress 플러그인 개발은 자신만의 아이디어를 거대한 생태계에 적용하는 과정입니다. 그 핵심 기술은 액션(Action)과 필터(Filter) 후크를 이해하고 활용하는 데 있습니다. 성공적인 개발은 명확하고 모듈화된 파일 구조에서 시작되며, 이는 후속 유지보수와 확장을 위한 탄탄한 기반을 마련해 줍니다. 백엔드 설정 페이지를 만들면 플러그인을 사용자 친화적이고 쉽게 구성할 수 있으며, 쇼트코드(Shortcode), 툴팁(Widget), 커스텀 API를 통해 기능을 웹사이트 프론트엔드에 원활하게 통합할 수 있습니다. 보안성, 국제화 호환성, 코드 품질은 개발 전반에 걸쳐 반드시 고려해야 할 중요한 요소들입니다. WordPress의 코딩 표준과 모범 사례를 준수함으로써 플러그인의 안정적인 작동을 보장할 뿐만 아니라, 생태계에 더 잘 통합되어 더 많은 사용자에게 유용한 서비스를 제공할 수 있습니다.

자주 묻는 질문

WordPress 플러그인을 개발하기 위해서는 어느 정도의 PHP 기술이 필요한가요?

간단한 플러그인을 개발하려면 변수, 함수, 조건문, 반복문과 같은 PHP의 기본 지식만 있으면 됩니다. 하지만 기능이 복잡하고 안전하며 효율적인 상업용 플러그인을 개발하려면 객체 지향 프로그래밍(OOP), WordPress 코어 API(예: 데이터베이스 작업 관련 클래스 등)에 대한 보다 심층적인 이해가 필요합니다. wpdbHTTP 요청 API 등을 사용하며, 데이터 검증, 이스케이피(Escape) 처리, SQL 인젝션 및 CSRF 공격 방지와 같은 보안 모범 사례를 적용합니다. 또한, 프론트엔드 상호작용을 위해 기본적인 JavaScript와 CSS 지식도 필요합니다.

기존의 작은 플러그인을 수정하거나 간단한 기능을 구현하는 것부터 시작하여 점차적으로 심화학습을 진행하는 것이 좋습니다.

어떻게 하면 제가 개발한 플러그인이 안전하다고 확신할 수 있을까요?

플러그인의 보안을 확보하는 것은 다단계에 걸친 작업입니다. 먼저, 사용자나 외부에서 제공되는 모든 입력 데이터(예: 양식 데이터, URL 매개변수, 쿠키 등)에 대해 엄격한 검증과 정제 과정을 거쳐야 합니다. 이를 위해 WordPress가 제공하는 함수들을 활용하는 것이 좋습니다. sanitize_text_field(), esc_html(), esc_url() 그리고 wp_kses()

둘째, 데이터베이스 작업을 수행할 때는 반드시 적절한 도구나 방법을 사용해야 합니다. $wpdb 클래스가 제공하는 메서드들(예: prepare() SQL 삽입을 방지하기 위해 적절한 예방 조치를 취해야 합니다. 전단계에 데이터를 출력할 때는 반드시 적절하게 이스케이프 처리를 해야 합니다. 권한이 관련된 작업을 수행할 때는 항상 역할 기반의 권한 검사 함수를 사용해야 합니다. current_user_can()또한, 요청의 의도를 확인하기 위해 CE(nonce)가 아닌 다른 값을 사용하여 크로스사이트 요청 위조(CSRF)를 방지합니다.

플러그인 개발이 완료되었다면, 어떻게 배포하고 업데이트할 수 있을까요?

배포 방법에는 주로 두 가지가 있습니다: WordPress 공식 플러그인 디렉터리를 통해 배포하거나, 자신의 웹사이트에서 직접 다운로드할 수 있도록 제공하는 것입니다. 플러그인이 사용자의 관리자 페이지에서 한 번의 클릭으로 설치되고 자동 업데이트를 받을 수 있도록 하려면, 반드시 공식 디렉터리에 제출해야 합니다. 이를 위해서는 플러그인 코드가 GPLv2(또는 그 이상의 버전) 라이선스를 준수해야 하며, 엄격한 보안 및 코드 품질 검토를 통과해야 합니다.

제출한 후, WordPress는 공식 Subversion(SVN) 저장소에서 귀하의 플러그인 코드를 가져옵니다. 업데이트 알림을 받으려면 SVN 저장소의 메인 파일 헤더 주석에 있는 “Version” 번호를 업데이트하고, 버전 번호가 포함된 새로운 태그(Tag)를 제출해야 합니다.

상업용 플러그인의 경우, 일반적으로 자체 서버에서 업데이트 서비스를 구축합니다. 이 과정에는 업데이트 확인기를 작성하는 작업이 포함되며, 이 확인기는 훅(hook)을 사용하여 업데이트가 필요한지 여부를 판단합니다. pre_set_site_transient_update_pluginsWordPress의 업데이트 시스템과 통합하여 원격 서버상의 버전 정보를 비교하고 업데이트 패키지를 제공합니다.

플러그인 내의 클래스명과 함수명이 다른 플러그인과 충돌하지 않도록 하려면 어떻게 해야 할까요?

이름 충돌을 피하는 것은 전문 플러그인 개발의 기본적인 요구 사항입니다. 가장 좋은 방법은 접두사를 사용하는 것입니다. 플러그인의 모든 클래스, 함수, 상수, 심지어 전역 변수(가능한 한 사용을 자제하는 것이 좋지만)에 대해 고유하고 설명적인 접두사를 사용하세요. 이 접두사는 일반적으로 회사 이름이나 플러그인 이름의 약어, 또는 전체 이름일 수 있습니다.

예를 들어, 만약 당신의 플러그인 이름이 “Awesome Gallery”라면, 함수의 접두사는 “AwesomeGallery_”가 될 수 있습니다. ag_ 또는 awesome_gallery_클래스 이름은 다음과 같은 형태일 수 있습니다: AG_Core 또는 Awesome_Gallery_Admin

더 나은 방법은 코드를 클래스에 담는 것입니다. 이렇게 하면 대부분의 함수가 클래스 메서드의 형태로 존재하게 됩니다. $this->method()이를 통해 전역 네임스페이스의 오염을 방지할 수 있습니다. 전역 공간에 반드시 정의해야 하는 함수의 경우, 길고 고유한 접두사를 사용해야 합니다.