워드프레스 플러그인의 기본 구조 및 작동 원리
WordPress 플러그인을 개발하려면 우선 그 핵심 구성 요소와 WordPress 생명 주기에서 동작하는 방식을 이해해야 합니다. 플러그인은 기본적으로 WordPress가 제공하는 다양한 API(애플리케이션 프로그래밍 인터페이스)를 사용하여 웹사이트의 기능을 확장하거나 수정하는 하나 이상의 PHP 파일입니다.
플러그인의 기반은 플러그인 헤더 정보이며, 이는 플러그인 주 파일의 시작 부분에 위치해 있습니다. 이 정보는 특정 PHP 주석 형식으로 작성되며, WordPress에게 해당 플러그인의 이름, 설명, 버전, 작성자 등 메타 데이터를 제공합니다. 예를 들어, 'name'이라는 이름의 플러그인은 다음과 같은 정보를 포함할 것입니다. my-first-plugin.php 이 파일은 아래와 같은 정보로 시작될 수 있습니다:
<?php
/**
* Plugin Name: 我的第一个插件
* Plugin URI: https://example.com/my-first-plugin
* Description: 这是一个用于学习插件开发的简单示例。
* Version: 1.0.0
* Author: 开发者姓名
* License: GPL v2 or later
* Text Domain: my-first-plugin
*/ 워드프레스는 후크(Hooks) 메커니즘을 통해 플러그인과 상호 작용합니다. 후크는 두 가지 종류로 나뉩니다. 액션(Action)과 필터(Filter). 액션 후크는 특정 시점에 워드프레스가 실행할 때 자신만의 코드를 추가할 수 있게 해줍니다. 예를 들면, 게시물을 출판한 후 페이지 헤더에 스타일을 로드할 때와 같습니다. 필터 후크는 워드프레스가 실행하는 동안 생성된 데이터를 수정할 수 있게 해줍니다. 예를 들면, 게시물 내용을 수정하거나 요약문의 길이를 변경하는 것과 같습니다. 후크를 이해하고 능숙하게 사용하는 것은 효율적인 플러그인 개발의 열쇠입니다.
추천 읽기 쉽게 이해할 수 있도록 설명하며, WordPress 플러그인 개발을 처음부터 배우는 완전한 가이드입니다.。
플러그인 파일 구조를 이해하기
간단한 플러그인은 하나의 주 파일로도 되지만, 기능이 추가되면 합리적인 파일 구조가 매우 중요해집니다. 일반적으로, 기능이 완전한 플러그인 디렉토리에는 주 플러그인 파일(예: )이 포함되어 있습니다. my-plugin.php함수와 클래스를 포함하는 데 사용되는 includes 폴더, 프론트엔드 리소스를 저장하는 데 사용되는 assets 폴더(CSS, JavaScript, 이미지가 포함되어 있음), 번역 파일을 위한 폴더 languages 폴더, 그리고 사용자 인터페이스 템플릿을 위한 것들. templates 폴더. 이러한 모ду러한 구조는 코드 유지 보수와 팀 협동에 도움이 됩니다.
첫 번째 간단한 플러그인을 만들어 보세요.
실제 예제를 통해 시작해 봅시다. 우리는 웹사이트의 모든 글과 페이지 내용의 끝에 자동으로 사용자 정의 저작권 선언문을 추가할 수 있는 플러그인을 만들것입니다.
우선 WordPress 설치 디렉토리에서 wp-content/plugins 폴더 아래에서 새 폴더를 만들고 이름을 지어주세요. my-copyright-notice그런 다음 해당 폴더 내에 주요 PHP 파일을 만들고 예를 들면 다음과 같이 이름을 지정합니다. my-copyright-notice.php。
추가 기능을 구현하세요.
우리는 필터 후크를 사용할 것입니다. the_content 이 기능을 구현하려면, 주 파일을 열고, 플러그인 헤더 정보를 추가한 후 핵심 함수를 작성해야 합니다.
<?php
/**
* Plugin Name: 自动版权声明
* Description: 在文章和页面内容末尾自动添加版权信息。
* Version: 1.0
* Author: WordPress 学习者
*/
// 防止直接访问文件
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* 在内容末尾添加版权声明的函数
*
* @param string $content 原始的文章内容。
* @return string 添加了版权声明后的内容。
*/
function mycn_add_copyright_to_content( $content ) {
// 仅对主循环内的文章和页面生效
if ( is_single() || is_page() ) {
$copyright_text = '<p><em>저작권 고지: 이 글은 해당 웹사이트의 소유이며, 사전 동의 없이 재게시할 수 없습니다.</em></p>';
$content .= $copyright_text;
}
return $content;
}
// 将函数挂载到 ‘the_content’ 过滤器上
add_filter( 'the_content', 'mycn_add_copyright_to_content' ); 파일을 저장한 후 WordPress 관리자에서 “플러그인” 페이지로 이동하면 “자동 저작권 표시” 플러그인을 볼 수 있을 것입니다. 이 플러그인을 활성화한 후 임의의 글이나 페이지를 보면 내가 정의한 저작권 텍스트가 내용의 아래에 표시됩니다. 이 예는 단순하지만, 플러그인의 생성, 코딩 및 활성화 전체 프로세스를 완전히 보여줍니다.
추천 읽기 워드프레스 플러그인 개발을 처음부터 배우기: 원리, 실습 및 고급 기술。
WordPress의 API를 사용하여 데이터베이스와 상호 작용하세요.
고급 플러그인은 종종 데이터를 저장하고 검색할 필요가 있습니다. WordPress는 데이터베이스 작업을 수행하는 데 매우 편리한 클래스를 제공합니다. wpdb 옵션 API를 사용하면 SQL 문을 직접 작성하지 않고도 안전하게 데이터베이스를 조작할 수 있습니다.
간단한 키-값 쌍 데이터, 예를 들어 플러그인의 설정 정보를 다룰 때는 옵션 API를 사용하는 것을 강력히 추천합니다. 사용 방법은 다음과 같습니다: add_option(), get_option(), update_option() 그리고 delete_option() 데이터를 관리하는 데 사용되는 함수들입니다. 이 함수들은 데이터의 일련화 및 저장을 자동으로 처리합니다. wp_options 표 안에 있습니다.
커스텀 데이터베이스 테이블을 생성합니다.
구조화된 복잡한 데이터(예: 주문, 서식 제출 기록)를 저장할 필요가 있는 경우에는 사용자 정의 데이터베이스 테이블을 만들어야 합니다. 이는 일반적으로 플러그인을 활성화할 때 완료됩니다. 이를 위해 함수를 작성하고 그것을 등록해야 합니다. register_activation_hook 이 특별한 후크上。
당신의 플러그인 주 파일에는 다음과 같은 코드가 포함될 수 있습니다:
/**
* 插件激活时创建自定义数据库表
*/
function myplugin_create_custom_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'myplugin_data'; // 获取带前缀的表名,如 wp_myplugin_data
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
user_id int NOT NULL,
data_value text NOT NULL,
created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
// 引入 WordPress 升级所需的文件
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
// 注册激活钩子
register_activation_hook( __FILE__, 'myplugin_create_custom_table' ); dbDelta() 함수는 WordPress가 데이터베이스 테이블을 만들거나 업데이트하는 강력한 도구입니다. 기존의 테이블 구조와 SQL 문을 비교하여 필요한 변경 만을 수행합니다. 주의하세요,dbDelta() SQL 문의 형식(예: 열 정의, 인디엔트)에 매우 민감합니다.
플러그인 관리 인터페이스 및 보안 실천 구축
전문적인 플러그인은 일반적으로 사용자가 설정을 변경할 수 있는 백엔드 구성 페이지를 제공합니다. WordPress의 “설정 API'를 사용하여 이 페이지를 표준화하고 안전하게 만들 수 있으며, 이 페이지는 양식 검증, 보안 필드(nonce), 설정 저장 등을 처리하여 개발 프로세스를 크게 단순화할 수 있습니다.
추천 읽기 개인화된 워드프레스 테마: 전문적인 웹사이트 디자인을 처음부터 만들는 완전한 가이드。
추가 플러그인 설정 페이지를 추가하세요.
먼저, 당신은 다음을 사용해야 합니다: add_action() 함수는 다음과 같은 방법으로 매핑됩니다. admin_menu 액션 후크의 콜백 함수를 통해 메뉴 항목과 페이지를 추가합니다. 그런 다음 해당 페이지의 콜백 함수에서 설정 API의 함수를 사용하여 양식을 구성합니다.
다음은 최상위 메뉴 페이지를 추가하고 설정 필드를 등록하는 방법을 보여주는 단순화된 예입니다.
/**
* 添加插件设置菜单
*/
function myplugin_add_admin_menu() {
add_menu_page(
'我的插件设置', // 页面标题
'我的插件', // 菜单标题
'manage_options', // 所需权限
'myplugin-settings', // 菜单 slug
'myplugin_settings_page', // 显示设置页面的回调函数
'dashicons-admin-generic', // 图标
80 // 菜单位置
);
}
add_action( 'admin_menu', 'myplugin_add_admin_menu' );
/**
* 初始化插件设置
*/
function myplugin_settings_init() {
// 注册一个新的设置到 “myplugin_settings” 页面
register_setting( ‘myplugin_settings’, ‘myplugin_options’ );
// 在页面中添加一个区域
add_settings_section(
‘myplugin_section’,
‘主要设置’,
null, // 可选的区域描述回调函数
‘myplugin_settings’
);
// 向区域中添加一个字段
add_settings_field(
‘api_key’,
‘API 密钥’,
‘myplugin_api_key_field_callback’, // 渲染字段 HTML 的回调函数
‘myplugin_settings’,
‘myplugin_section’
);
}
add_action( ‘admin_init’, ‘myplugin_settings_init’ );
/**
* 渲染 API 密钥字段
*/
function myplugin_api_key_field_callback() {
$options = get_option( ‘myplugin_options’ );
?>
<input type="‘text’" name="‘myplugin_options[api_key]’" value="‘NO NUMERIC NOISE KEY" 1003’>
<div class="“wrap”">
<h1></h1>
<form action="/ko/“options.php”/" method="“post”" data-trp-original-action="“options.php”">
<?php
settings_fields( ‘myplugin_settings’ ); // 输出安全字段
do_settings_sections( ‘myplugin_settings’ ); // 输出设置区域和字段
submit_button( ‘保存设置’ );
?>
<input type="hidden" name="trp-form-language" value="ko"/></form>
</div>
<?php
} 워드프레스 보안 표준을 준수하십시오.
보안은 플러그인 개발에서 가장 중요한 고려 사항입니다. 모든 사용자 입력 및 출력을 처리해야 합니다. WordPress는 당신을 도울 수 있는 여러 함수를 제공합니다:
이스케이프 출력: 사용 esc_html(), esc_attr(), esc_url() 그리고 wp_kses_post() 함수를 사용하여 페이지에 표시되는 데이터가 안전한지 확인하십시오.
* 验证和清理输入:在处理表单提交的数据前,使用 sanitize_text_field(), intval(), sanitize_email() 함수를 정리하세요.
* Nonce 验证:对于所有涉及状态更改的操作(如表单提交、AJAX 请求),使用 wp_nonce_field(), wp_create_nonce() 그리고 wp_verify_nonce() 크로스 사이트 요청 위조(CSRF) 공격을 방지하기 위해서입니다.
* 能力检查:使用 current_user_can() 현재 사용자가 특정 작업을 수행할 권한이 있는지 여부를 확인하는 함수입니다. ‘edit_posts’, ‘manage_options’)。
요약
워드프레스 플러그인 개발은 기본 구조(후크, 헤더 정보)을 이해하여 시작되며, 기능 구현, 데이터 관리, 인터페이스 구축 및 보안 강화로 점차 더 깊이 들어가는 체계적인 프로세스입니다. 개발자는 간단한 “저작권 표시” 플러그인부터 시작하여 플러그인 워크플로우에 대한 직관적인 이해를 빠르게 습득할 수 있습니다. 이후 옵션 API 사용을 학습하고, wpdb 데이터 조작을 위한 클래스는 복잡한 정보를 저장하는 데 필요한 단계입니다. 마지막으로, API를 사용하여 사용자 친화적인 백엔드 인터페이스를 구축하고 WordPress의 보안 코딩 표준을 준수하는 것은 플러그인이 전문적이고 신뢰할 수 있으며 널리 채택되도록 하는 열쇠입니다. 지속적인 실습과 핵심 코드 및 다른 우수한 플러그인의 소스 코드 읽기는 개발 기술을 향상시키는 최고의 방법입니다.
자주 묻는 질문
WordPress 플러그인은 최소 몇 개의 파일로 구성되어 있을까요?
기능이 완전한 워드프레스 플러그인은 단순히 하나의 별도 PHP 파일로도 구현될 수 있습니다. 이 파일에는 올바른 플러그인 헤더 주석 정보가 포함되어 있고 필요한 기능을 제공한다면, 워드프레스는 이를 인식하고 활성화할 것입니다. 복잡한 플러그인의 경우, 유지 보수성을 고려할 때 여러 파일과 디렉토리로 분리하는 것이 권장됩니다.
플러그인을 여러 언어로 번역하는 방법은 무엇입니까?
WordPress는 GNU gettext 기술을 사용하여 국제화(i18n)를 구현합니다. 다음 단계를 따라야 합니다. 먼저, 플러그인 헤더와 모든 번역이 필요한 문자열에 < like를 사용하십시오. __(‘文本’, ‘your-text-domain’) 또는 _e(‘文本’, ‘your-text-domain’) 이러한 함수들은 패키지화됩니다. 그런 다음 Poedit 등의 도구를 사용하여 .pot 템플릿 파일을 생성하고 해당 언어의 .po 및 .mo 파일을 만듭니다(예: zh_CN.po마지막으로, 다음과 같은 방법을 통해… load_plugin_textdomain() 함수는 플러그인을 초기화할 때 번역 파일을 로드합니다.
플러그인의 JavaScript 및 CSS 파일은 어떻게 올바르게 로드되어야 합니까?
호환성을 보장하고 충돌을 피하기 위해 HTML 내에서 리소스 파일에 직접 링크를 거는 것은 적절하지 않습니다. 프론트엔드 리소스의 경우, 적절한 방법을 사용하여 링크를 설정해야 합니다. wp_enqueue_script() 그리고 wp_enqueue_style() 함수를 작성하고 이들을 매핑하십시오. wp_enqueue_scripts 액션 후크上。 백그라운드 관리자 페이지의 리소스는 마운트되어야 합니다. admin_enqueue_scripts 후크上。 이러한 함수를 통해 의존성, 버전 번호를 지정하고 같은 리소스가 한 번만 로드되도록 할 수 있습니다.
플러그인을 개발할 때 디버깅은 어떻게 하나요?
WordPress는 강력한 디버깅 도구를 제공합니다. 먼저, 웹사이트의… wp-config.php 파일 내에서, 해당 내용을 처리할 것입니다. WP_DEBUG 상수를 다음과 같이 설정합니다: true이를 통해 PHP 오류, 경고, 및 알림이 페이지에 직접 표시됩니다. 또한, 동시에 이를 활성화할 수도 있습니다. WP_DEBUG_LOG오류를 기록하십시오. wp-content/debug.log 문서와 WP_DEBUG_DISPLAY(페이지에 표시할지 여부를 제어합니다.) 또한, 사용하기 위해서는… error_log() 함수나 사용자 정의 파일에 로그를 기록하는 것도 변수와 프로세스를 추적하는 효과적인 방법입니다.
다음 단계는 무엇인가요?
확장된 독서 및 실무 지식
다음은 이 도움말의 주제와 관련이 있으며 더 깊이 있게 읽기에 적합합니다. 현재 문제와 가장 가까운 문서부터 시작하여 점차 주변 주제로 확장하는 것이 우선순위를 정하는 것이 좋습니다.