WordPress 플러그인 기초 및 개발 환경
코드를 작성하기 시작하기 전에, WordPress 플러그인의 기본 개념을 이해하고 적절한 개발 환경을 설정하는 것이 매우 중요합니다. WordPress 플러그인은 본질적으로 PHP 코드가 포함된 폴더로, WordPress가 제공하는 풍부한 API를 통해 핵심 기능을 확장하는 역할을 합니다. 플러그인의 크기는 단순히 짧은 코드 한 줄을 추가하는 것부터 완전한 관리 시스템을 구축하는 것까지 다양할 수 있습니다. 플러그인 개발의 핵심 원칙은 “핵심 코드를 수정하지 않는 것”이며, 이를 통해 WordPress가 업그레이드될 때 사용자가 정의한 기능들이 손실되지 않도록 보장됩니다.
효율적인 개발을 위해서는 로컬 개발 환경이 필요합니다. XAMPP, MAMP, Local by Flywheel, Docker와 같은 도구를 사용하면 PHP와 MySQL이 포함된 서버를 빠르게 설정할 수 있습니다. 그런 다음, 최신 버전의 WordPress를 설치하세요. 개발 과정에서는…wp-config.php파일에서 활성화WP_DEBUG오류를 즉시 발견할 수 있도록 하기 위함입니다.
플러그인의 “심장”은 주 PHP 파일입니다. 이 파일의 헤더에 있는 주석들이 바로 그 플러그인의 신원 정보이며, WordPress는 이러한 메타데이터를 읽어서 백그라운드에서 플러그인을 인식하고 관리합니다. 표준적인 플러그인 주 파일의 헤더 주석은 다음과 같습니다:
추천 읽기 워드프레스 테마란 무엇인가요?。
<?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
*/ 첫 번째 기능 플러그인 만들기
실제 기능부터 시작해 보겠습니다: 웹사이트의 각 기사 내용 끝에 자동으로 사용자 정의된 텍스트를 추가하는 것입니다. 이 예제는 플러그인 개발의 핵심 프로세스 전반에 걸쳐 사용될 것입니다.
플러그인의 주 파일과 초기화 과정
먼저, WordPress에서…wp-content/plugins예를 들어, 카테고리 아래에 새 폴더를 만들어 보세요.my-first-plugin해당 폴더 내에서 주요 PHP 파일을 생성하고 이를 이라고 이름 붙פת 수 있습니다.my-first-plugin.php위의 헤더 주석 코드를 복사하여 여기에 붙여주세요.
다음으로, 플러그인의 초기화 코드를 안전하게 실행할 방법이 필요합니다. 가장 좋은 방법은 모든 기능을 하나의 클래스에 담거나 네임스페이스 함수를 사용하는 것입니다. 여기서는 간단한 클래스를 사용하여 코드를 구성하겠습니다. 메인 파일의 헤더 주석 다음에 다음과 같은 클래스 정의를 추가하세요:
if ( ! defined( 'ABSPATH' ) ) {
exit; // 防止直接访问文件
}
class My_First_Plugin {
public function __construct() {
// 构造函数,在这里挂载钩子
}
}
// 初始化插件
new My_First_Plugin(); if ( ! defined( ‘ABSPATH’ ) )이 코드는 WordPress 플러그인 개발의 보안 표준으로, 사용자가 URL을 통해 직접 플러그인 파일에 접근하는 것을 방지하기 위한 것입니다.
후크를 사용하여 기사 페이지의 푸터 내용을 추가합니다.
WordPress의 플러그인 아키텍처는 “후크(Hooks)” 시스템을 기반으로 구축되어 있으며, 액션(Action)과 필터(Filter)로 나뉩니다. 액션을 사용하면 특정 시점에 코드를 실행할 수 있으며, 필터를 사용하면 데이터를 수정할 수 있습니다.
추천 읽기 워드프레스 웹사이트 성능 최적화를 위한 최종 가이드: 기본 설정부터 캐시 플러그인까지 모든 것을 분석하여 제공합니다.。
우리의 목표는 기사 내용의 뒤에 텍스트를 추가하는 것입니다. 이는 “필터링” 과정입니다. 따라서 우리는 다음과 같은 방법을 사용할 것입니다:the_content이 필터의 경우, 클래스 내의 생성자(constructor)와 메서드(method)를 다음과 같이 수정하십시오:
class My_First_Plugin {
public function __construct() {
// 将自定义方法挂载到‘the_content’过滤器上
add_filter( 'the_content', array( $this, 'add_footer_to_content' ) );
}
/**
* 在文章内容后添加自定义页脚
*
* @param string $content 原始文章内容。
* @return string 修改后的文章内容。
*/
public function add_footer_to_content( $content ) {
// 确保只在主循环的单篇文章页面显示
if ( is_single() && in_the_loop() && is_main_query() ) {
$custom_footer = '<div class="my-plugin-footer"><p>이 글을 읽어주셔서 감사합니다! 【My First Plugin】에서 생성되었습니다.</p></div>';
$content .= $custom_footer;
}
return $content;
}
} add_filter()이 함수는 클래스 메서드를 처리합니다.add_footer_to_content등록하기the_content필터: WordPress가 글 내용을 출력할 준비를 할 때, 우리의 메서드가 호출되며 원본 내용이 전달됩니다. 우리는 조건 판단을 통해 푸터를 오직 개별 글 페이지에만 추가하도록 하여, 홈페이지나 아카이브 페이지에서 중복되게 표시되는 것을 방지합니다. 마지막으로, 사용자 정의 HTML을 내용 뒤에 추가한 후 결과를 반환합니다.
플러그인에 관리자 후면 패널 옵션을 추가하세요.
성숙한 플러그인은 일반적으로 사용자가 백엔드에서 설정을 할 수 있도록 허용합니다. 방금 생성한 푸터 텍스트에 간단한 설정 옵션을 추가하여, 사용자가 표시되는 텍스트를 직접 커스터마이징할 수 있도록 하겠습니다.
설정 메뉴 페이지를 생성하세요.
우리는 WordPress 관리자의 “설정” 메뉴에 하위 페이지를 추가해야 합니다. 이를 위해 다음 단계를 따라야 합니다:add_options_page()함수는 보통 특정 위치에 ‘마운트(mount)’되어 사용됩니다.admin_menu액션 후크上。
먼저, 플러그인 클래스에 메뉴와 페이지를 등록하기 위한 새로운 메서드를 추가하세요:
class My_First_Plugin {
// ... 之前的构造函数和方法 ...
public function __construct() {
add_filter( 'the_content', array( $this, 'add_footer_to_content' ) );
// 挂载后台管理菜单
add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
// 挂载初始化设置选项
add_action( 'admin_init', array( $this, 'settings_init' ) );
}
public function add_admin_menu() {
add_options_page(
'我的第一个插件设置', // 页面标题
'自定义页脚设置', // 菜单标题
'manage_options', // 所需权限
'my-first-plugin', // 菜单slug
array( $this, 'options_page_html' ) // 回调函数,用于输出页面HTML
);
}
} 등록 설정 필드(Registration settings fields)와 렌더링 페이지(Rendering page)
다음으로, 우리는 WordPress Settings API를 사용하여 옵션들을 안전하게 등록, 저장, 그리고 검증해야 합니다. 이 과정에는…register_setting(), add_settings_section()그리고add_settings_field()등의 함수들입니다.
public function settings_init() {
// 注册一个设置选项组
register_setting( 'my_first_plugin_settings', 'my_first_plugin_options' );
// 在页面中添加一个设置区域
add_settings_section(
'my_first_plugin_section',
'页脚内容配置',
array( $this, 'section_callback' ),
'my-first-plugin'
);
// 向该区域添加一个字段
add_settings_field(
'footer_text',
'页脚显示文本',
array( $this, 'footer_text_field_render' ),
'my-first-plugin',
'my_first_plugin_section'
);
}
public function section_callback() {
echo '<p>여기에 기사 끝에 표시될 텍스트 내용을 설정하세요.</p>'footer_text_field_render() 공공 함수:
$options = get_option( 'my_first_plugin_options' );
$value = $options['footer_text'] ?? '이 글을 읽어주셔서 감사합니다! [제 첫 번째 플러그인]에서 제작되었습니다.'; // 기본 값
?>
<input type='text' name='my_first_plugin_options[footer_text]' value='<?php echo esc_attr( $value ); ?>' style='width: 400px;'>
<p class="description">간단한 HTML 태그들을 지원합니다, 예를 들어… <strong>, <em>, <a>。</p>
<?php
}
public function options_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( 'my_first_plugin_settings' );
do_settings_sections( 'my-first-plugin' );
submit_button();
?>
<input type="hidden" name="trp-form-language" value="ko"/></form>
</div>
<?php
} 마지막으로, 프론트엔드 출력 함수를 수정하세요.add_footer_to_content데이터베이스 옵션에서 텍스트를 읽도록 하세요.
공개 함수 add_footer_to_content( $content ) {
if ( is_single() && in_the_loop() && is_main_query() ) {
$options = get_option( 'my_first_plugin_options' );
$footer_text = $options['footer_text'] ?? '이 글을 읽어주셔서 감사합니다! [제 첫 번째 플러그인]에서 제공됩니다.';
$custom_footer = ' <';
}
}'<div class="my-plugin-footer"><p>'`. wp_kses_post($footer_text)`.'</p></div>';
$content .= $custom_footer;
}
return $content;
} wp_kses_post()이 함수는 사용자가 입력한 텍스트에 안전한 HTML 태그만 포함되도록 보장합니다. 이는 매우 중요한 보안 조치입니다.
플러그인 국제화 및 모범 사례
플러그인을 전 세계의 사용자들이 사용할 수 있도록 하기 위해서는 국제화(i18n)가 필수적인 단계입니다. WordPress는 번역을 위해 GNU gettext 프레임워크를 사용합니다.
텍스트 필드와 번역 함수
먼저, 플러그인의 헤더 부분에 있는 주석에서 필요한 설정들이 올바르게 정의되어 있는지 확인하십시오.Text Domain예를 들면 다음과 같습니다.my-first-plugin그런 다음, 플러그인 내에서 번역이 필요한 모든 문자열에 대해 특정 함수를 사용하여 해당 문자열을 감싸야 합니다.
이전에 작성한 코드를 수정하여 출력되는 텍스트에 번역 기능을 추가하세요.
생성자 함수에서 번역 파일 로드
public function __construct() {
// ... 다른 후크 ...
add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) );
}
public function load_textdomain() {
load_plugin_textdomain(
'my-first-plugin',
false,
dirname( plugin_basename( __FILE__ ) ) . '/languages/'
);
}
// 설정 페이지의 문자열 수정
public function section_callback() {
echo '<p>'글의 끝부분에 표시되는 텍스트 내용을 여기에서 구성하세요. ' . esc_html__( '여기에서 글의 끝부분에 표시되는 텍스트 내용을 구성하세요.', 'my-first-plugin' ) . '</p>'공유하기: 이 글을 공유해 주십시오. 감사합니다.';
}
public function footer_text_field_render() {
$options = get_option( 'my_first_plugin_options' );
$value = $options['footer_text'] ?? __( '이 글을 읽어 주셔서 감사합니다! [내 첫 번째 플러그인]에서 제작되었습니다.', 'my-first-plugin' );
?>
<input type='text' name='my_first_plugin_options[footer_text]' value='<?php echo esc_attr( $value ); ?>' style='width: 400px;'>
<p class="description"><strong>, <em>, <a> 등 간단한 HTML 태그를 지원합니다.
<?php esc_html_e( '간단한 HTML 태그, 예: <strong>, <em>, <a>를 지원합니다.', 'my-first-plugin' ); ?></p>
<?php
}
// 주의: 사용자가 웹사이트 페이지에서 입력한 “페이지 하단 텍스트'는 일반적으로 번역할 필요가 없습니다. 이는 관리자가 설정한 특정 내용이기 때문입니다. __()문자열을 번역하고 반환하는 데 사용됩니다.esc_html__()HTML 출력을 번역하고 이스케이프하는 데 사용됩니다._e()문자열을 번역하고 그 결과를 즉시 표시하는 데 사용됩니다. 함수의 두 번째 매개변수는 텍스트 필드이며, 플러그인에서 정의한 내용과 일치해야 합니다.
보안, 성능, 그리고 코드 조직
국제화 외에도 다음과 같은 모범 사례를 준수해야 합니다:
1. 보안: 모든 사용자 입력을 검증하고, 불필요한 데이터를 제거하며, 적절하게 에스케이프 처리합니다.sanitize_text_field(), esc_html(), wp_kses_post()등의 함수들을 사용합니다.wp_nonce_field()CSRF(Cross-Site Request Forgery) 공격을 방지합니다.
2. 성능: 훅을 적절히 사용하여 페이지가 로드될 때마다 불필요한 데이터베이스 쿼리가 실행되지 않도록 하십시오. 출력 결과를 일시적으로 캐싱하는 것도 고려해 볼 수 있습니다.
3. 코드 구성: 복잡한 플러그인의 경우, 파일들을 기능 모듈별로 분리하는 것이 좋습니다. 메인 파일은 프로그램의 시작을 담당하며, 클래스와 메서드들은 각각의 모듈 내에 위치시켜야 합니다.includes/목차, 프론트엔드 자산(CSS, JS)은 다음과 같은 위치에 저장합니다:assets/카탈로그.
4. 제거 및 정리: 플러그인이 데이터베이스 테이블이나 설정 옵션을 생성한 경우, 데이터를 삭제할 수 있는 제거 기능을 제공해야 합니다. 이는 별도의 프로세스를 통해 이루어질 수 있습니다.uninstall.php파일을 사용하여 구현합니다.
요약
이 튜토리얼을 통해 우리는 기본 기능을 갖춘 WordPress 커스텀 플러그인의 전체 개발 과정을 완료했습니다. 환경 설정부터 플러그인의 기본 구조를 만들고, 훅 시스템을 활용하여 기능을 추가하는 것, 그리고 백엔드 설정 페이지를 구현하는 것까지, 마지막으로 국제화와 보안 관련 사항도 다루었습니다. 여러분은 이 과정을 통해 어떻게 플러그인을 개발하는지 배웠습니다.add_filter그리고add_actionWordPress 코어와 상호작용하여 Settings API를 사용하여 신뢰할 수 있는 옵션 페이지를 만드는 방법, 그리고 그 과정에 대해 설명합니다.load_plugin_textdomain플러그인을 다국어로 지원하도록 만드세요. 플러그인을 개발할 때는 보안성, 유지보수성, 사용자 경험이 가장 중요한 고려 사항이라는 점을 기억하세요. 이러한 기본 원칙을 바탕으로, 사용자 정의 글 유형, 메타데이터, 쇼트코드, REST API 엔드포인트와 같은 고급 기능들을 더 탐구하여 더 강력한 WordPress 확장 기능을 구축할 수 있습니다.
자주 묻는 질문
왜 제 플러그인이 백엔드 메뉴에 표시되지 않나요?
이런 문제는 대부분 권한 문제나 코드 오류로 인해 발생합니다. 먼저, 귀하의…add_options_page또는add_menu_page함수에서 지정된 권한 매개변수(예:‘manage_options’당신이 현재 로그인한 사용자 역할과 일치합니다. 두 번째로, 확인하세요.admin_menu후크가 올바르게 설치되었는지, 그리고 리콜백 함수에 문법 오류가 없어 PHP 실행이 중단되지 않는지 확인하는 가장 간단한 방법은 WordPress 관리자 페이지에서 해당 기능을 활성화하는 것입니다.WP_DEBUG관련된 오류 메시지가 출력되었는지 확인해 보세요.
플러그인에 사용자 정의 CSS 및 JavaScript 파일을 추가하는 방법은 무엇입니까?
올바른 방법은 다음과 같이 사용하는 것입니다:wp_enqueue_style()그리고wp_enqueue_script()함수에 대해서는… 프론트엔드 리소스의 경우, 해당 리소스를 적절한 위치에 마운트해야 합니다.wp_enqueue_scripts액션 후크에 연결합니다; 관리자 후방 자원의 경우에는 해당 자원에 마운트합니다.admin_enqueue_scripts훅에 걸려 있어요.
당신의 플러그인 클래스에 다음과 같은 메서드를 추가할 수 있습니다:
public function enqueue_frontend_assets() {
wp_enqueue_style( ‘my-plugin-style’, plugin_dir_url( __FILE__ ) . ‘assets/css/style.css’, array(), ‘1.0.0’ );
} 그런 다음 생성자(constructor) 내에서 해당 내용을 사용합니다.add_action( ‘wp_enqueue_scripts’, array( $this, ‘enqueue_frontend_assets’ ) );등록하세요. 이를 통해 의존 관리가 올바르게 이루어지고, 다른 플러그인이나 테마와의 충돌을 방지할 수 있습니다.
사용자가 플러그인을 제거할 때, 제가 생성한 데이터 옵션들은 어떻게 삭제되나요?
WordPress는 두 가지 주요 방법을 제공합니다. 첫 번째 방법은 언인스트럽션 후크(uninstallation hook)를 등록하는 것이지만, 이 방법은 객체 지향적인 플러그인에서는 잘 사용되지 않습니다. 더 추천되고 표준적인 방법은 플러그인 내에서 적절한 코드를 작성하여 필요한 기능을 구현하는 것입니다.uninstall.php이 파일은 주 플러그인 파일과 동일한 레벨에 있습니다.
사용자가 WordPress 관리자 페이지를 통해 플러그인을 삭제하면, WordPress는 자동으로 해당 파일을 확인하고 삭제 작업을 수행합니다.uninstall.php먼저 확인해야 할 부분이 있습니다.WP_UNINSTALL_PLUGIN상수가 정의되어 있는지 확인한 후, 플러그인에서 생성된 모든 옵션, 사용자 정의 데이터베이스 테이블 등의 데이터를 안전하게 삭제해야 합니다. 예를 들어:
if ( ! defined( ‘WP_UNINSTALL_PLUGIN’ ) ) {
exit;
}
delete_option( ‘my_first_plugin_options’ );
// 如果有自定义表:$wpdb->query( “DROP TABLE IF EXISTS {$wpdb->prefix}my_table” ); 제 플러그인을 더 많은 버전의 WordPress와 호환시키려면 어떻게 해야 하나요?
호환성을 유지하는 핵심은 새 버전의 함수와 기능을 신중하게 사용하고, 이전 버전을 위한 대체 방안을 마련하는 것입니다. 새 버전에서만 사용 가능한 함수를 호출하기 전에는 반드시 그 함수가 존재하는지 확인해야 합니다.function_exists()검사를 수행해야 합니다. 예를 들어, 5.0 버전에서 도입된 기능을 사용하려는 경우에는 반드시 해당 기능이 올바르게 작동하는지 확인해야 합니다.wp_date함수는 다음과 같은 기능을 수행할 수 있습니다:
if ( function_exists( ‘wp_date’ ) ) {
$date = wp_date( get_option( ‘date_format’ ), $timestamp );
} else {
$date = date_i18n( get_option( ‘date_format’ ), $timestamp );
} 또한, 플러그인의 상단에 있는 주석과 readme 파일에 테스트된 최소 WordPress 버전을 명확히 명시해야 합니다. 오래된 WordPress 버전에서 정기적으로 테스트를 수행하는 것이 호환성을 보장하는 가장 좋은 방법입니다.
다음 단계는 무엇인가요?
확장된 독서 및 실무 지식
다음은 이 도움말의 주제와 관련이 있으며 더 깊이 있게 읽기에 적합합니다. 현재 문제와 가장 가까운 문서부터 시작하여 점차 주변 주제로 확장하는 것이 우선순위를 정하는 것이 좋습니다.