워드프레스 플러그인 개발 기초
코드를 자세히 살펴보기 전에 WordPress 플러그인의 기본 개념과 구조를 이해하는 것은 매우 중요합니다. WordPress 플러그인은 본질적으로 추가적인 PHP 스크립트로, WordPress가 제공하는 훅(Hooks) 시스템을 통해 코어와 상호작용하여 웹사이트의 기능을 확장하거나 수정합니다. 이는 단일 파일일 수도 있고, 여러 파일, CSS 스타일시트, JavaScript 스크립트를 포함하는 완전한 디렉터리일 수도 있습니다.
플러그인 개발의 최우선 과제는 표준에 부합하는 메인 파일을 만드는 것입니다. 일반적으로 이 메인 파일은 플러그인 이름으로 명명되며, 예를 들어my-custom-plugin.php이 파일의 상단에는 반드시 표준 플러그인 정보 주석 블록이 포함되어야 합니다. 이 주석은 WordPress에 당신의 플러그인을 설명하는 데 사용될 뿐만 아니라, 관리자 화면의 플러그인 관리 페이지에도 표시됩니다.
/**
* 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
*/ 주석 내Plugin Name필수 항목이며, 나머지는 모두 선택 사항이지만 작성을 권장합니다. 이 파일을 만든 후, 이를 넣으세요/wp-content/plugins/디렉터리 아래의 별도 폴더(예:my-custom-plugin)에 있으면 WordPress 관리자 화면의 “플러그인” 페이지에서 그것을 보고 활성화할 수 있습니다.
추천 읽기 입문서부터 실습까지: WordPress 플러그인 개발을 위한 종합 가이드와 고급 기술。
워드프레스 플러그인의 핵심 작동 메커니즘은 “후크’에 기반하고 있습니다. 후크는 두 가지로 나뉩니다: 액션 후크(Action Hooks)필터 후크 (Filter Hook)(Filter Hooks)액션 훅을 사용하면 특정 시점(예: 페이지 헤더를 로드할 때, 글을 게시할 때)에 사용자 지정 코드를 실행할 수 있습니다.add_action()함수는 당신의 함수를 액션 훅에 연결합니다.
필터 훅은 과정 중에 생성된 데이터를 수정할 수 있게 해줍니다. 예를 들어, 글 내용은 표시되기 전에 일련의 필터를 거칩니다.add_filter()함수는 이러한 데이터를 수정할 수 있습니다.
국제화와 현지화는 전문 플러그인에 없어서는 안 될 부분입니다. 이를 사용하여__( ‘文本’, ‘text-domain’ )또는_e( ‘文本’, ‘text-domain’ )함수로 모든 사용자에게 표시되는 문자열을 감싸고, 텍스트 도메인 로드를 함께 사용하면 플러그인이 다국어를 지원할 수 있습니다.Text Domain플러그인 헤더 정보에 정의된 것과 반드시 일치해야 하며, 일반적으로 플러그인 디렉터리명 또는 메인 파일명의 슬러그 버전입니다.
첫 번째 기능 플러그인 만들기
간단한 플러그인을 만드는 것부터 시작해 봅시다. 이 플러그인은 웹사이트 글 목록에 사용자 정의 관리자 열을 추가하여 글의 단어 수 통계를 표시합니다. 이 예제는 플러그인 생성, 훅 사용, 그리고 안전한 출력의 기본 흐름을 다룹니다.
먼저, 당신의…/wp-content/plugins/디렉터리 내에 새로운 폴더를 만들고, 그 이름을 ‘새폴더’로 지정하세요.my-first-extension해당 폴더에서 기본 파일을 만드세요my-first-extension.php그리고 앞 절에서 설명한 플러그인 헤더 정보를 추가합니다.
추천 읽기 WordPress 플러그인 개발 입문 가이드: 제로에서 시작하여 자신만의 맞춤형 기능 모듈을 만들어보세요。
다음으로, 글 관리 목록에 새 열을 추가해야 합니다. 여기에는 두 개의 액션 훅이 관련됩니다:manage_posts_columns그리고manage_posts_custom_column전자는 새 열의 머리글을 정의하는 데 사용되고, 후자는 해당 열의 각 행 내용을 채우는 데 사용됩니다.
// 为文章列表添加“字数统计”列
function mfe_add_word_count_column( $columns ) {
$columns['word_count'] = __( '字数统计', 'my-first-extension' );
return $columns;
}
add_filter( 'manage_posts_columns', 'mfe_add_word_count_column' );
// 填充“字数统计”列的内容
function mfe_display_word_count_column( $column, $post_id ) {
if ( $column === 'word_count' ) {
$post_content = get_post_field( 'post_content', $post_id );
$word_count = str_word_count( strip_tags( $post_content ) );
echo esc_html( $word_count );
}
}
add_action( 'manage_posts_custom_column', 'mfe_display_word_count_column', 10, 2 ); 이 코드에서mfe_add_word_count_column이 함수는 기존의 열 배열을 받아 새로운 열을 추가합니다.word_count키를 입력하고 수정된 배열을 반환합니다.add_filter연결 대상manage_posts_columns필터 위에.mfe_display_word_count_column함수는 먼저 현재 처리 중인 열이 우리가 추가한 “word_count”인지 확인한 다음, 글 내용을 가져와 사용합니다.strip_tags()HTML 태그를 제거한 후 사용str_word_count()단어 수 계산(중국어는 글자 수), 마지막 사용esc_html()안전하게 이스케이프 처리한 후 출력합니다.
이 간단한 플러그인은 이미 기본 기능을 갖추고 있지만, 더 전문적인 플러그인은 플러그인 활성화 및 비활성화 시 몇 가지 작업을 수행하는 것도 고려해야 합니다. 예를 들어, 사용자 정의 데이터베이스 테이블을 생성하거나 임시 옵션을 정리할 수 있습니다. 이는 활성화 및 비활성화 훅을 등록하여 구현할 수 있습니다.
// 插件激活时执行的操作
function mfe_plugin_activation() {
// 例如:添加一个版本号选项,用于后续升级判断
if ( ! get_option( 'mfe_plugin_version' ) ) {
add_option( 'mfe_plugin_version', '1.0.0' );
}
// 触发一个自定义动作,供其他开发者扩展
do_action( 'mfe_plugin_activated' );
}
register_activation_hook( __FILE__, 'mfe_plugin_activation' );
// 插件停用时执行的操作
function mfe_plugin_deactivation() {
// 例如:清除计划任务或临时数据
// 注意:通常不在停用时删除用户数据(如表)
}
register_deactivation_hook( __FILE__, 'mfe_plugin_deactivation' ); 주의하세요register_activation_hook그리고register_deactivation_hook주 파일의 전체 경로가 필요합니다(FILE상수)를 첫 번째 인수로 사용합니다. 활성화, 비활성화 및 제거(제거는 사용자가 플러그인을 삭제할 때 발생함) 로직은 분리하여 처리해야 합니다.
플러그인 설정 페이지 구현
기능이 잘 갖춰진 플러그인은 일반적으로 사용자에게 설정 옵션을 제공해야 합니다. 가장 표준적인 방법은 WordPress 관리자 화면에서 설정 페이지를 만드는 것입니다. 이는 사용하여 수행할 수 있습니다add_menu_page()또는add_options_page()등의 함수를 사용해 구현합니다.
먼저 최상위 메뉴 항목을 하나 만듭니다. 아래 예시에서,mfe_create_admin_menu함수 사용add_menu_page()새 페이지를 추가합니다. 이 함수에는 페이지 제목, 메뉴 제목, 필요한 권한, 메뉴 슬러그, 페이지 내용을 출력하는 콜백 함수, 아이콘 URL, 그리고 메뉴에서의 위치가 필요합니다.
추천 읽기 제로에서 시작하기: WordPress 플러그인 개발을 위한 완벽한 가이드 및 모범 사례 공유。
// 创建后台管理菜单
function mfe_create_admin_menu() {
add_menu_page(
__( '我的扩展设置', 'my-first-extension' ), // 页面标题
__( '我的扩展', 'my-first-extension' ), // 菜单标题
'manage_options', // 权限(管理员)
'mfe-settings', // 菜单slug
'mfe_settings_page_html', // 显示页面内容的函数
'dashicons-admin-generic', // 图标
80 // 位置
);
}
add_action( 'admin_menu', 'mfe_create_admin_menu' ); 다음으로, 우리는 정의해야 합니다.mfe_settings_page_html함수를 사용해 페이지 내용을 렌더링합니다. 전문적인 설정 페이지는 WordPress 표준 설정 API를 사용해야 하며, 이 API는 폼 제출 처리, 필드 검증, 보안이 아닌 기타 번거로운 작업을 담당합니다. 먼저, 우리는 사용해야 합니다register_setting()설정 그룹과 필드를 등록합니다.
// 初始化设置
function mfe_settings_init() {
// 注册一个新的设置组 “mfe_settings_group” 到页面 “mfe-settings”
register_setting( 'mfe-settings', 'mfe_settings_options' );
// 在设置组内添加一个区域(Section)
add_settings_section(
'mfe_settings_section',
__( '基本设置', 'my-first-extension' ),
'mfe_settings_section_cb',
'mfe-settings'
);
// 在区域内添加一个字段
add_settings_field(
'mfe_field_api_key',
__( 'API密钥', 'my-first-extension' ),
'mfe_field_api_key_cb',
'mfe-settings',
'mfe_settings_section',
[ 'label_for' => 'mfe_field_api_key' ]
);
}
add_action( 'admin_init', 'mfe_settings_init' ); 그런 다음 HTML을 출력하기 위한 섹션 콜백과 필드 콜백 함수를 정의해야 합니다. 특히 필드 콜백 함수는 폼 입력 필드를 렌더링하고 그 값이 저장된 설정과 연결되도록 보장하므로 매우 중요합니다.
// 设置区域的说明文本
function mfe_settings_section_cb( $args ) {
?>
<p id="<?php echo esc_attr( $args['id'] ); ?>"><?php esc_html_e( '请在此配置插件的基本参数。', 'my-first-extension' ); ?></p>
<?php
}
// API密钥字段的回调函数
function mfe_field_api_key_cb( $args ) {
// 从已注册的设置选项中获取值
$options = get_option( 'mfe_settings_options' );
$value = $options[ $args['label_for'] ] ?? '';
?>
<input type="text"
id="<?php echo esc_attr( $args['label_for'] ); ?>"
name="mfe_settings_options[<?php echo esc_attr( $args['label_for'] ); ?>]"
value="<?php echo esc_attr( $value ); ?>"
class="regular-text">
<p class="description"><?php esc_html_e( '请输入您的服务API密钥。', 'my-first-extension' ); ?></p>
<?php
} 마지막으로 메인 설정 페이지 함수를 생성하고 사용settings_fields()그리고do_settings_sections()전체 양식을 안전하게 출력합니다.
// 设置页面的HTML结构
function mfe_settings_page_html() {
// 检查用户权限
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
?>
<div class="wrap">
<h1></h1>
<form action="/ko/options.php/" method="post" data-trp-original-action="options.php">
<?php
// 输出安全字段、区域和字段
settings_fields( 'mfe-settings' );
do_settings_sections( 'mfe-settings' );
submit_button( __( '保存设置', 'my-first-extension' ) );
?>
<input type="hidden" name="trp-form-language" value="ko"/></form>
</div>
<?php
} 이러한 방식으로 설정 페이지를 생성하면 모든 양식 데이터의 검증, 정리 및 저장이 WordPress 설정 API에 의해 자동으로 처리되며, 저장됩니다wp_options표에서 이름이mfe_settings_options옵션 중에서 보안성과 편의성을 크게 향상시켰습니다.
플러그인 보안 및 모범 사례
전문적이고 안전하며 유지보수가 용이한 플러그인을 개발하려면 일련의 모범 사례를 반드시 따라야 합니다. 가장 중요한 원칙은 사용자 입력을 절대 신뢰하지 않는 것입니다. 외부에서 오는 모든 것(예:$_GET、$_POST、$_COOKIE, 심지어 데이터베이스)의 데이터는 출력, 사용 또는 저장 전에 모두 적절한 검증, 정리 및 이스케이프 처리를 거쳐야 합니다.
데이터 검증 및 정리: 데이터를 논리적 판단에 사용하기 전에, 해당 데이터가 예상 형식에 부합하는지 검증해야 합니다. 예를 들어, 어떤 필드가 숫자이기를 기대하는 경우, 사용하십시오intval()또는is_numeric(). WordPress는 다음과 같은 많은 헬퍼 함수를 제공합니다.sanitize_text_field()텍스트 문자열을 정리하는 데 사용됩니다.sanitize_email()이메일 주소를 정리하는 데 사용됩니다.
데이터 이스케이프: 모든 데이터를 HTML, JavaScript 또는 URL로 출력할 때는 크로스 사이트 스크립팅(XSS) 공격을 방지하기 위해 반드시 이스케이프 처리를 해야 합니다. 사용esc_html()HTML에 일반 텍스트 출력esc_attr()HTML 속성에 출력esc_url()출력 URLwp_json_encode()코디wp_slash()JavaScript로 출력.
흔한 보안 오류 중 하나는 검증되지 않은 변수를 그대로 데이터베이스 쿼리에 사용하는 것으로, 이는 SQL 인젝션을 유발할 수 있습니다. 절대로 SQL 문을 수동으로 조합하지 마십시오. 대신 WordPress에서 제공하는 기능을 사용해야 합니다.$wpdb클래스 및 해당 준비 쿼리 메서드.
global $wpdb;
$user_input = $_POST['search_term'];
// 错误做法:直接拼接
// $sql = “SELECT * FROM {$wpdb->posts} WHERE post_title LIKE ‘%$user_input%’”;
// 正确做法:使用prepare方法
$sql = $wpdb->prepare(
“SELECT * FROM {$wpdb->posts} WHERE post_title LIKE %s”,
‘%’ . $wpdb->esc_like( $user_input ) . ‘%’
);
$results = $wpdb->get_results( $sql ); 권한 검사: 플러그인이 수행하는 모든 관리 작업, 데이터 수정 또는 민감한 정보 출력 전에 현재 사용자가 해당 작업을 수행할 권한이 있는지 반드시 확인해야 합니다. 사용current_user_can( $capability )또는check_admin_referer()등을 확인한다.
스크립트와 스타일시트를 대기열에 추가하여 로드하기: 플러그인에서 직접 통해서는 절대 안 됩니다<link>또는<script>태그로 CSS와 JS 파일을 가져옵니다. 사용해야 합니다.wp_enqueue_style()그리고wp_enqueue_script()함수를 작성하고, 적절한 후크(hook)에서 해당 함수가 실행되도록 해야 합니다.wp_enqueue_scripts프론트엔드용입니다.admin_enqueue_scripts백엔드에서 실행됩니다. 이를 통해 충돌을 방지하고 의존 관계가 올바르게 로드되도록 보장할 수 있습니다.
코드 구성 및 명명 규약: 플러그인 함수, 클래스, 변수 및 옵션 이름에 고유한 접두사(예:mfe_), 테마, 다른 플러그인 또는 WordPress 코어와 충돌이 발생하지 않도록 방지합니다. 복잡한 플러그인을 여러 파일로 구성하고 객체 지향 프로그래밍(OOP)을 사용하면 코드의 가독성과 재사용성을 높일 수 있습니다.
제거 시 정리 기능 제공: 플러그인이 데이터베이스 테이블이나 사용자 정의 옵션을 생성했다면, 사용자가 플러그인을 “삭제”(“비활성화”가 아니라)할 때 정리 기능을 제공하는 것을 고려해야 합니다. 이는 별도의 제거 파일을 통해 구현할 수 있습니다. 플러그인 메인 파일에서는 사용할 수 있습니다register_uninstall_hook( FILE, ‘mfe_plugin_uninstall’ )삭제 함수를 등록할 수 있지만, 더 일반적인 방법은 플러그인 디렉터리에 하나를 만드는 것입니다uninstall.php파일은 WordPress가 플러그인을 삭제할 때 자동으로 실행합니다.
요약
워드프레스 플러그인 개발은 구조화된 사고와 워드프레스 핵심 아키텍처에 대한 깊은 이해가 결합된 과정입니다. 표준에 맞는 플러그인 헤더 정보를 작성하는 것부터 액션 훅과 필터 훅을 이해하고 능숙하게 활용하는 것까지, 이러한 요소들은 모든 기능 확장을 구축하는 기초입니다. 실용적인 플러그인을 만들기 위해서는 프런트엔드 기능을 구현하는 것뿐만 아니라 명확하고 안전한 백엔드 설정 인터페이스도 구축해야 하며, 이는 워드프레스 설정 API를 통해 효율적으로 완료할 수 있습니다.
보안성은 처음부터 끝까지 관통하는 생명선으로, 입력 검증, 출력 이스케이프, 권한 검사, 안전한 데이터베이스 작업에 이르기까지 어느 단계도 소홀히 해서는 안 됩니다. 스크립트를 올바르게 큐에 넣어 로드하고, 고유한 접두사를 사용하며, 명확한 코드 구조를 구성하는 등 모범 사례를 따르면 플러그인이 더욱 견고해지고 유지 관리가 쉬워지며, 방대한 워드프레스 생태계와 조화롭게 공존할 수 있습니다. 이 가이드의 단계를 통해 이제 처음부터 전문적인 수준의 워드프레스 플러그인을 구축하는 데 필요한 핵심 지식과 기술을 익혔습니다.
자주 묻는 질문
내 플러그인에 숏코드를 추가하려면 어떻게 해야 하나요?
쇼트코드를 사용하면 사용자가 글이나 페이지에 플러그인 기능을 쉽게 삽입할 수 있습니다.add_shortcode()함수를 사용하여 쇼트코드를 등록하세요.
속성을 받는 숏코드 로직 처리 콜백 함수 만들기$atts) 및 콘텐츠($content)매개변수를 받아 처리된 HTML을 반환합니다. 기억하세요. 쇼트코드 콜백 함수는 내용을 직접 출력(echo)하는 것이 아니라 반드시 반환(return)해야 합니다. 반환되는 내용도 안전을 보장하기 위해 적절히 이스케이프 처리해야 합니다.
플러그인 옵션은 어디에 저장해야 하나요?
간단한 키-값 쌍 설정의 경우 WordPress의 Options API 사용을 강력히 권장합니다.add_option()、get_option()그리고update_option()함수. 이러한 데이터는 자동으로 저장됩니다wp_options데이터베이스 테이블에.
플러그인에서 대량의 구조화된 데이터(예: 양식 항목, 로그)를 저장해야 하는 경우 사용자 정의 데이터베이스 테이블 생성을 고려해야 합니다. 사용하십시오dbDelta()함수를 사용하여 테이블 구조의 생성과 업데이트가 안전하고 호환되도록 보장합니다. 사용자 정의 테이블 생성은 일반적으로 플러그인 활성화 훅에서 처리합니다.
내 플러그인이 다른 플러그인이나 테마와 어떻게 호환되나요?
호환성을 높이는 핵심은 WordPress 코딩 표준을 준수하고, 고유한 접두사를 사용하며, 훅(Hooks)을 통해 확장 지점을 제공하는 것입니다. 핵심 파일이나 전역 변수를 직접 수정하는 것은 피해야 합니다.
플러그인에서 사용do_action()또는apply_filters()사용자 정의 훅을 만들어 다른 개발자가 당신의 플러그인 동작을 수정하거나 확장할 수 있도록 하세요. 또한, 충돌을 일으킬 수 있는 작업(예: 스타일 또는 스크립트 추가)을 실행하기 전에 조건 검사를 사용하거나 비활성화 옵션을 제공하세요.
플러그인에 업데이트 메커니즘을 추가하려면 어떻게 해야 하나요?
WordPress 공식 플러그인 디렉터리에 호스팅된 플러그인의 경우, 업데이트는 자동으로 처리됩니다. 비공개 또는 상용 플러그인의 경우, 사용자 지정 업데이트 검사기를 구현해야 합니다.
이것은 일반적으로 새 버전을 확인하기 위해 정기적으로 원격 서버를 조회하고, 사용자가 한 번의 클릭으로 업데이트할 수 있도록 하는 클래스를 만드는 것을 포함합니다. “Plugin Update Checker” 같은 라이브러리를 참고하거나 직접 구현할 수도 있으며, 핵심은 사용하는 것입니다set_site_transient()후크(예:pre_set_site_transient_update_plugins)를 사용하여 업데이트 정보를 주입합니다. 업데이트 서버가 안전하고 신뢰할 수 있는지 반드시 확인하십시오.
다음 단계는 무엇인가요?
확장된 독서 및 실무 지식
다음은 이 도움말의 주제와 관련이 있으며 더 깊이 있게 읽기에 적합합니다. 현재 문제와 가장 가까운 문서부터 시작하여 점차 주변 주제로 확장하는 것이 우선순위를 정하는 것이 좋습니다.
- 웹사이트 구축 입문 가이드: 제로에서 시작하여 현대 웹사이트 개발의 전 과정을 마스터하기
- WordPress 플러그인 개발 가이드: 제로에서 시작하여 첫 번째 커스텀 플러그인을 만들어보세요.
- WordPress 서브테마(Subtheme)란 기존의 WordPress 테마(Theme)를 기반으로 만들어진 추가적인 디자인 및 기능 모듈입니다. 서브테마를 사용하면 기존 테마의 디자인을 그대로 유지한 채 새로운 색상, 글꼴, 레이아웃, 기능 등을 추가하거나 기존 기능을 수정할 수 있습니다. 이를 통
- WordPress 플러그인 개발자가 되기: 제로에서 원까지의 완전한 가이드
- WordPress 테마 개발 마스터하기: 전문 웹사이트를 제작하는 완벽한 가이드