왜 플러그인부터 시작하여 WordPress 개발을 배우는 걸까요?
WordPress의 핵심 디자인 철학 중 하나는 뛰어난 확장성이며, 플러그인이 바로 이러한 특성을 실현하는 주요 수단입니다. 테마를 직접 수정하는 것과는 달리, 플러그인을 사용하면 WordPress의 기능을 쉽고 유연하게 확장할 수 있습니다.functions.php파일과 비교할 때, 독립적인 플러그인을 만드는 것에는 상당한 장점이 있습니다. 플러그인은 기능 로직과 테마의 외관을 분리해주기 때문에 웹사이트 테마를 변경하더라도 핵심 기능은 그대로 유지됩니다. 이로 인해 코드가 더 체계적이고 유지보수가 용이해지며, 코드의 재사용, 버전 관리, 그리고 다른 개발자들과의 공유가 더 쉬워집니다.
기술적인 관점에서 볼 때, 플러그인은 본질적으로 하나 이상의 PHP 파일로 구성되며, 특정 WordPress 표준을 준수합니다. 이러한 파일들은 WordPress 시스템 내의 특정 위치에 배치됩니다./wp-content/plugins/WordPress가 초기화될 때, 이 디렉터리를 스캔하여 활성화된 모든 플러그인의 코드를 로드합니다. 이를 통해 플러그인을 사용하여 WordPress의 거의 모든 측면을 제한 없이 수정하거나 개선할 수 있습니다. 간단한 쇼트코드를 추가하는 것부터 복잡한 관리 패널을 만드는 것까지 가능합니다.
자신의 첫 번째 플러그인 기본 구조를 만들어 보세요.
WordPress 플러그인을 만드는 첫 번째 단계는 기본 파일 구조를 설정하는 것입니다. 플러그인이 하나의 파일로만 구성될 수도 있지만, 좋은 구조는 장기적인 유지보수에 도움이 됩니다.
추천 읽기 WordPress 플러그인 개발 입문 가이드: 제0단계에서 시작하여 첫 번째 사용자 정의 기능 확장을 만들어보세요.。
메인 플러그인 파일을 생성합니다.
모든 플러그인에는 플러그인에 대한 메타정보를 포함하는 메인 파일이 반드시 있어야 합니다. 우선 로컬 개발 환경에서…/wp-content/plugins/예를 들어, 카테고리 아래에 새 폴더를 만들어 보세요.my-first-plugin그런 다음, 해당 폴더 내에 주 PHP 파일을 생성합니다. 이 파일의 이름은 보통 폴더의 이름과 동일합니다.my-first-plugin.php。
이 주 파일의 맨 위에 표준적인 플러그인 정보 주석 블록을 추가해야 합니다. 이 주석 블록은 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
*/ 플러그인의 핵심 클래스를 정의합니다.
코드의 은닉성을 유지하고 이름 충돌을 피하기 위한 최선의 방법은 객체 지향 프로그래밍을 사용하여 플러그인의 모든 기능을 하나의 클래스에 담는 것입니다. 우리는 메인 파일에서 이 클래스를 정의합니다.
if ( ! class_exists( 'My_First_Plugin' ) ) {
class My_First_Plugin {
/**
* 构造方法,用于初始化插件
*/
public function __construct() {
// 初始化钩子
$this->init_hooks();
}
/**
* 初始化WordPress动作和过滤器钩子
*/
private function init_hooks() {
// 钩子将在这里添加
}
}
// 实例化插件类
new My_First_Plugin();
} if ( ! class_exists( 'My_First_Plugin' ) )이것은 클래스가 중복으로 정의되는 것을 방지하기 위한 보안 검사입니다.__construct()이것은 클래스의 생성자(constructor)로, 클래스가 인스턴스화될 때 자동으로 호출됩니다. 여기서 우리는 비공개 메서드(private method)를 호출했습니다.init_hooks()모든 훅의 등록을 중앙에서 관리하기 위함입니다.
후크 시스템을 활용하여 기능을 추가합니다.
WordPress의 훅(Hooks) 시스템은 이벤트 기반 아키텍처의 핵심으로, 액션(Action)과 필터(Filter)로 나뉩니다. 액션을 사용하면 특정 시점에 코드를 실행할 수 있으며, 필터를 사용하면 데이터를 수정할 수 있습니다.
추천 읽기 WordPress 플러그인 개발 입문부터 전문가 수준까지: 사용자 정의 기능 만들기를 단계별로 안내합니다.。
글의 내용에 사용자 정의 저작권을 추가하세요.
흔한 요구 사항 중 하나는 각 기사의 끝에 자동으로 저작권 정보를 추가하는 것입니다. 이를 위해 다음과 같은 방법을 사용할 수 있습니다:the_content필터를 사용하여 이를 구현합니다. 우리는…init_hooks()이 필터를 메서드에 추가하세요.
먼저, 업데이트하세요.init_hooks()방법:
private function init_hooks() {
// 使用过滤器在文章内容后追加版权信息
add_filter( 'the_content', array( $this, 'append_copyright_notice' ) );
} 여기,add_filter()이 함수는 우리 클래스 내의 내용을 처리합니다.append_copyright_noticeMethod mounted tothe_content필터에 적용되어 있습니다. 이제 이 콜백 메서드를 정의해야 합니다.
/**
* 기사 내용 뒤에 저작권 정보를 추가하는 콜백 기능
*
* @param 문자열 $content 원본 글 내용입니다.
* 반환 문자열 저작권 정보를 추가한 후의 콘텐츠입니다.
*/
public function append_copyright_notice( $content ) {
// 메인 쿼리의 단일 문서 페이지에만 표시합니다.
if ( is_single() && in_the_loop() && is_main_query() ) {
$copyright_text = sprintf(
'<p><small>© 저작권 고지: 이 글은 %s에 처음 게재되었습니다. 재발행할 경우 출처를 명시해 주시기 바랍니다.</small></p>',
get_bloginfo( 'name' )
).
$content . = $copyright_text;
}
$content를 반환합니다;
} 이 메서드는 원본 데이터를 받습니다.$content조건 판단을 통해is_single()、in_the_loop()그리고is_main_query()우리는 저작권 정보가 페이지의 본문 내용에만 표시되도록 하여, 페이지의 레이아웃, 요약 내용, 또는 관리자 후단 인터페이스에 영향을 미치지 않도록 합니다. 그런 다음, 저작권 관련 텍스트를 작성하고 문자열 연결 연산자를 사용하여 이 텍스트를 페이지에 표시합니다..=원본 내용에 그것을 추가한 후, 수정된 내용을 최종적으로 반환합니다.
관리 메뉴 페이지를 생성합니다.
플러그인에 간단한 설정 페이지를 추가하는 것도 흔한 기능 중 하나입니다. 이를 위해서는 액션 후크(Action Hook)를 사용해야 합니다. 우리는 최상위 관리 메뉴 페이지를 만들어 보겠습니다.
Ininit_hooks()중에서 하나의 액션을 더 추가하세요:
추천 읽기 워드프레스 플러그인 개발 입문 가이드: 처음부터 첫 번째 기능 모듈을 만들기。
private function init_hooks() {
add_filter( 'the_content', array( $this, 'append_copyright_notice' ) );
// 添加管理菜单
add_action( 'admin_menu', array( $this, 'add_admin_menu_page' ) );
} WordPress가 관리 메뉴를 생성할 때, 해당 프로세스가 실행됩니다.admin_menu액션(Action). 이제 우리는 그것을 정의해 나갈 것입니다.add_admin_menu_page()방법.
/**
* 向WordPress管理后台添加一个自定义菜单页面
*/
public function add_admin_menu_page() {
add_menu_page(
'我的第一个插件', // 页面标题
'我的插件', // 菜单标题
'manage_options', // 权限要求
'my-first-plugin-page', // 菜单别名
array( $this, 'render_admin_page' ), // 回调函数,用于输出页面内容
'dashicons-admin-plugins', // 图标
80 // 菜单位置
);
} add_menu_page()이 함수는 WordPress의 핵심 API로, 최상위 메뉴를 등록하는 데 사용됩니다.manage_options이것은 권한을 나타내는 식별자로, 관리자만이 이 메뉴를 볼 수 있음을 의미합니다. 우리가 지정한 것입니다.render_admin_page페이지 콘텐츠를 렌더링하는 방법들.
/**
* 관리되는 페이지 콘텐츠 렌더링을 위한 콜백 기능
*/
public function render_admin_page() {?
? >
<div class="wrap">
<h1>제 첫 번째 플러그인 관리 페이지입니다.</h1>
<p>축하합니다! 관리 페이지가 포함된 WordPress 플러그인을 성공적으로 만들었습니다.</p>
<p>이것은 간단한 예제 페이지로, 여기에 폼을 추가하거나 옵션을 설정하는 등의 작업을 할 수 있습니다.</p>
<p>현재 사이트의 이름은:<strong><?php echo esc_html( get_bloginfo( 'name' ) ); ?></strong></p>
</div>
<?php
} 국제화 및 보안 모범 사례를 구현하기
표준적인 플러그인은 국제화와 보안성을 고려해야 하며, 이를 통해 전 세계 사용자들이 안전하게 해당 플러그인을 사용할 수 있도록 해야 합니다.
플러그인을 다국어로 지원하도록 만들기
국제화(i18n)를 통해 플러그인의 텍스트를 번역할 수 있게 되었습니다. 우리는 이미 플러그인의 헤더에 관련 주석을 남겨두었습니다.Text Domain: my-first-plugin이제 사용해야 합니다.__()또는_e()함수를 사용하여 모든 출력되는 문자열을 감싸세요.
먼저,__construct()또는init_hooks()번역 파일을 로드하기 위한 액션을 추가하세요:
add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) ); 로딩 번역 방법을 정의합니다:
public function load_textdomain() {
load_plugin_textdomain(
'my-first-plugin',
false,
dirname( plugin_basename( __FILE__ ) ) . '/languages/'
);
} 그런 다음, 이전에 출력된 텍스트가 있는 부분을 수정하세요. 예를 들어, 내용을 업데이트하거나 수정하는 것입니다.append_copyright_notice메서드 내의 텍스트:
$copyright_text = sprintf('<p><small>© %s: %s, %s.</small></p>'저작권 고지, 'my-first-plugin', 글을 처음 게시한 사이트인 '%s'에 대한 정보, 그리고 재게시 시 출처를 표기해 달라는 요청이 포함되어 있습니다.; 마찬가지로, 관리 페이지에 있는 문자열도 업데이트해야 합니다:
<h1>\n</h1>
<p>축하합니다! 관리 페이지가 있는 WordPress 플러그인을 성공적으로 만들었습니다.</p> esc_html_e()이 함수는 번역된 텍스트를 출력하는 동시에 HTML 엔티티를 자동으로 이스케이프 처리하여 보안성을 향상시켰습니다.
에스케이프 출력 및 입력 확인
플러그인 개발에서는 프론트엔드나 브라우저로 출력되는 모든 데이터를 반드시 이스케이프 처리해야 하며, 사용자나 외부 소스에서 오는 모든 입력 데이터는 반드시 검증 및 정제 과정을 거쳐야 합니다.
사이트 이름을 출력할 때 이미 사용했습니다.esc_html()이것은 크로스사이트 스크립팅(XSS) 공격을 방지하기 위한 핵심 단계입니다. 함수 이름이 “_e”로 끝나는 경우(이는 “echo”를 의미함), 해당 함수는 일반적으로 이스케이프 처리된 내용을 그대로 출력합니다. 반면에 “__”로 시작하는 함수는 번역된 문자열을 반환하므로, 이를 출력하기 전에 직접 이스케이프 처리를 해야 합니다.
만약 우리의 관리 페이지가 향후 폼 제출을 처리해야 한다면, 반드시 그에 필요한 기능을 사용해야 합니다.wp_verify_nonce()요청을 확인하고 사용하세요.sanitize_text_field()、intval()사용자가 입력한 데이터를 정리하기 위해 `clean()`와 같은 함수를 사용한 다음, 해당 데이터를 데이터베이스에 저장하거나 다른 작업을 수행해야 합니다. 이는 웹사이트의 보안을 보호하는 데 필수적인 단계입니다.
요약
이 가이드를 통해 우리는 기본적인 플러그인 파일 구조를 만드는 것부터 시작하여 플러그인의 핵심 기능을 단계적으로 구현해 나갔습니다. 객체 지향적인 방식으로 코드를 구성하는 방법을 배웠으며, WordPress의 강력한 액션(Action)과 필터(Filter) 후크를 활용하여 시스템의 실행 과정에 개입하고, 글 내용에 사용자 정의 기능을 추가하는 방법도 익혔습니다. 또한 관리자 페이지도 생성했습니다. 아울러, 국제화(i18n)와 보안한 데이터 출력/입력(Secure Output/Input)이라는 플러그인 개발에 매우 중요한 두 가지 측면에 대해서도 살펴보았습니다.
이것은 단지 시작점에 불과합니다. 이 프레임워크를 기반으로 더 많은 가능성을 탐색할 수 있습니다: 설정 옵션을 추가하거나, 사용자 정의된 글 유형과 분류 체계를 만들거나, 위젯(Widget)을 작성하거나, AJAX 상호작용을 도입하거나, 쇼트코드(Shortcode)를 활용하는 것 등이죠. WordPress 공식 플러그인 매뉴얼과 코어 코드를 읽는 것이 심화 학습을 위한 가장 좋은 방법이라는 점을 기억하세요. 이제 여러분은 WordPress 플러그인을 제로에서부터 만드는 기본 기술을 습득했으니, 자신의 아이디어를 현실로 구현해 나갈 수 있습니다.
자주 묻는 질문
플러그인은 반드시 클래스를 사용하여 개발해야만 하나요?
꼭 그런 것은 아닙니다. WordPress 플러그인은 순수한 프로시저형 함수를 사용하여 작성될 수도 있습니다. 하지만 클래스(객체 지향 프로그래밍)를 사용하는 것이 더 권장되는 방법입니다. 클래스를 사용하면 코드를 더 잘 구성할 수 있으며, 변수와 메서드를 독립적인 네임스페이스에 캡슐화하여 다른 플러그인이나 테마의 함수명과의 충돌을 효과적으로 방지할 수 있습니다. 또한 코드의 유지보수성과 재사용성도 향상됩니다.
내 플러그인을 어떻게 디버깅하나요?
WordPress 개발에서 자주 사용되는 디버깅 방법은 `WP_DEBUG`를 활성화하는 것입니다. 이를 위해 웹사이트의 루트 디렉터리에 있는 `wp-config.php` 파일을 열어 `WP_DEBUG` 설정을 `true`로 변경해야 합니다.wp-config.php파일에서 다음 줄을 찾아서 수정하세요:define( 'WP_DEBUG', true );. 또한 동시에 설정할 수도 있습니다.define( 'WP_DEBUG_LOG', true );이렇게 하면 오류 메시지가 기록됩니다./wp-content/debug.log이 파일은 페이지에는 표시되지 않습니다. 또한, 브라우저의 개발자 도구(Developer Tools)의 콘솔(Console) 및 네트워크(Network) 탭을 사용하거나 PHP 오류 로그를 확인하는 것도 문제를 찾는 데 효과적인 방법입니다.
플러그인 내에서 직접 jQuery를 사용할 수 있나요?
네, 가능합니다. WordPress 코어에는 jQuery 라이브러리가 이미 내장되어 있습니다. 사용자 정의 JavaScript 파일이나 의존성을 올바르고 안전하게 로드하려면 다음과 같은 방법을 사용해야 합니다:wp_enqueue_script()함수를 작성하고, 의존성 배열에 해당 함수를 명시하세요.array( 'jquery' )이렇게 하면 WordPress가 jQuery를 여러분의 스크립트보다 먼저 로드하도록 보장됩니다. 절대로 플러그인에 외부 jQuery CDN 링크를 하드코딩하지 마세요. 그렇게 하면 충돌이나 보안 문제가 발생할 수 있습니다.
플러그인을 출시하기 전에 어떤 검사를 해야 할까요?
플러그인을 출시하기 전에 다음 사항을 확인하기를 권해 드립니다. WordPress 코딩 표준에 따라 코드를 작성했는지 확인하십시오. 국제화 준비가 완료되었는지 확인하십시오. 모든 사용자가 볼 수 있는 문자열은 모두 번역 함수로 포장되어 있는지 확인하십시오. 여러 버전의 WordPress 및 PHP에서 호환성 테스트를 실시하십시오. 모든 출력이 올바르게 이스케이프되었는지 확인하십시오. 모든 입력이 적당히 검증되고 정리되었는지 확인하십시오. 필요한 경우 플러그인이 생성한 모든 데이터베이스 옵션 및 테이블을 제거할 수 있는 명확한 제거 방법을 제공하십시오. 자세한 설명서를 작성하십시오.readme.txt이러한 단계들을 통해 플러그인의 전문성과 신뢰성을 향상시킬 수 있습니다.
다음 단계는 무엇인가요?
확장된 독서 및 실무 지식
다음은 이 도움말의 주제와 관련이 있으며 더 깊이 있게 읽기에 적합합니다. 현재 문제와 가장 가까운 문서부터 시작하여 점차 주변 주제로 확장하는 것이 우선순위를 정하는 것이 좋습니다.