블로그
워드프레스 동적 블록 마스터하기: PHP와 JavaScript를 활용한 인터랙티브 콘텐츠
PHP와 JavaScript를 모두 활용하여 사용자에게 인터랙티브하고 데이터 기반의 콘텐츠 경험을 제공하는 동적 워드프레스 블록을 만드는 방법을 알아보세요.

요약
워드프레스 동적 블록은 정적 HTML을 넘어 실시간 데이터 통합 및 인터랙티브 요소를 가능하게 하는 강력한 콘텐츠 생성 방법을 제공합니다. 정적 블록과 달리 동적 블록은 PHP를 사용하여 서버 측에서 출력을 렌더링하여 최신 정보를 가져오고 표시할 수 있습니다. 이 글은 블록 등록, 서버 측 렌더링 콜백, 클라이언트 측 속성 처리의 필수 개념을 다루며 자체 동적 블록 개발을 위한 실용적인 가이드를 제공합니다. 최근 게시물을 표시하는 동적 블록을 구축하는 방법을 단계별 예제를 통해 살펴보고 더 복잡한 인터랙티브 구성 요소의 기반을 제공합니다.
워드프레스 동적 블록 마스터하기: PHP와 JavaScript를 활용한 인터랙티브 콘텐츠
워드프레스는 본질적으로 모듈식 PHP 아키텍처와 MySQL 데이터베이스를 기반으로 구축된 강력한 콘텐츠 관리 시스템(CMS)입니다. 확장성은 테마와 플러그인을 통해 주로 달성되는 핵심 강점입니다. 블록 편집기인 구텐베르크의 등장은 모듈식 JavaScript 기반 인터페이스를 도입하여 콘텐츠 제작에 혁명을 일으켰습니다. 정적 구텐베르크 블록은 구조화되고 변경되지 않는 콘텐츠에 탁월하지만, 많은 실제 시나리오에서는 동적이고 인터랙티브하며 데이터 기반인 콘텐츠를 요구합니다. 여기서 동적 블록이 등장하여 서버 측 PHP 로직과 클라이언트 측 JavaScript 상호 작용 간의 강력한 다리 역할을 합니다.
동적 블록의 힘 이해하기
구텐베르크의 기본값인 정적 블록은 저장 시 클라이언트 측에서 HTML을 생성합니다. 이 HTML은 게시물 콘텐츠에 직접 저장됩니다. 정적 콘텐츠에는 효율적이지만, 자주 변경되거나 서버 측 처리가 필요한 데이터를 다룰 때는 이 접근 방식에 한계가 있습니다. 반면에 동적 블록은 PHP를 사용하여 서버 측에서 출력을 렌더링하여 이 문제를 해결합니다. 사용자가 동적 블록이 포함된 페이지를 볼 때 워드프레스는 PHP 함수(render_callback)를 실행하여 블록의 HTML을 즉석에서 생성합니다. 이를 통해 블록은 데이터베이스에서 실시간 데이터를 가져오고, 다른 워드프레스 기능과 상호 작용하며, 항상 최신 정보를 표시할 수 있습니다.
이 서버 측 렌더링은 여러 가지 이유로 중요합니다.
- 실시간 데이터: 최신 게시물, 예정된 이벤트, 주가 또는 자주 변경되는 기타 데이터를 표시합니다.
- 복잡한 로직: 출력을 렌더링하기 전에 계산을 수행하거나, 사용자 정의 게시물 유형을 쿼리하거나, 외부 API와 통합합니다.
- 보안: 특히 사용자 생성 콘텐츠나 외부 소스를 다룰 때 표시되기 전에 데이터를 정리하고 검증합니다.
- 성능: 복잡한 렌더링 작업을 서버로 오프로드하면 클라이언트 측 성능이 향상될 수 있습니다.
동적 블록의 구조
다른 모든 구텐베르크 블록과 마찬가지로 동적 블록은 메타데이터와 JavaScript 등록으로 정의됩니다. 그러나 고유한 특징은 등록 중에 지정된 render_callback 속성에 있습니다. 이 콜백 함수는 서버에서 블록의 HTML 출력을 생성하는 역할을 합니다.
주요 구성 요소는 다음과 같습니다.
- 블록 등록(JavaScript): JavaScript 파일에서
registerBlockType()을 사용하여 블록을 등록해야 합니다. 이렇게 하면 구텐베르크에 블록이 존재하고 속성과 편집기 인터페이스를 처리하는 방법을 알 수 있습니다. - 속성: 게시물 콘텐츠에 저장되는 블록과 관련된 데이터 필드입니다. 동적 블록의 경우 속성은 주로 편집기에서 블록의 동작과 설정을 구성하는 데 사용됩니다. 표시되는 실제 콘텐츠는
render_callback에 의해 생성됩니다. render_callback(PHP): 동적 블록의 핵심입니다. 블록의 속성을 인수로 받아 프런트엔드에서 렌더링될 HTML 문자열을 반환하는 PHP 함수입니다.- 편집기 인터페이스(JavaScript): React 구성 요소를 사용하여 구텐베르크 편집기 내에서 블록의 인터페이스를 계속 구축하게 됩니다. 이 인터페이스를 통해 사용자는 블록의 속성을 구성하고 동적 콘텐츠가 어떻게 보일지에 대한 미리 보기(종종 단순화된 표현)를 볼 수 있습니다.
단계별: 동적 "최근 게시물" 블록 만들기
실용적인 예제를 만들어 보겠습니다. 워드프레스 사이트의 최신 게시물 목록을 표시하는 동적 블록입니다.
사전 요구 사항:
- 로컬 워드프레스 개발 환경.
- PHP 및 JavaScript에 대한 기본 이해.
- 블록 코드를 추가할 플러그인 또는 테마.
1단계: 블록 플러그인/테마 설정
사용자 정의 플러그인이나 테마가 없다면 간단한 것을 만드세요. 이 예제에서는 플러그인에 추가한다고 가정합니다.
2단계: 블록 등록(JavaScript)
플러그인의 JavaScript 파일(예: src/index.js)에서 블록을 등록합니다. 국제화를 위해 @wordpress/blocks 및 @wordpress/i18n을 사용합니다.
// src/index.js
import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';
// 블록의 편집 컴포넌트 가져오기
import Edit from './edit';
registerBlockType( 'my-dynamic-blocks/recent-posts', {
title: __( 'Recent Posts', 'my-dynamic-blocks' ),
icon: 'list-view',
category: 'widgets',
attributes: {
numberOfPosts: {
type: 'number',
default: 5,
},
showExcerpt: {
type: 'boolean',
default: true,
},
},
edit: Edit,
// save() 함수는 동적 블록에 필요하지 않습니다
// 서버 측 render_callback이 출력을 처리합니다
} );
3단계: 편집기 컴포넌트 만들기(JavaScript)
이제 src/edit.js 파일을 만듭니다. 이 컴포넌트는 구텐베르크 편집기 내에서 블록이 어떻게 보이고 작동하는지 정의합니다.
// src/edit.js
import { useBlockProps, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, RangeControl, ToggleControl } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import ServerSideRender from '@wordpress/server-side-render';
export default function Edit( { attributes, setAttributes } ) {
const blockProps = useBlockProps();
const { numberOfPosts, showExcerpt } = attributes;
return (
<div { ...blockProps }>
<InspectorControls>
<PanelBody title={ __( 'Post Settings', 'my-dynamic-blocks' ) }>
<RangeControl
label={ __( 'Number of Posts', 'my-dynamic-blocks' ) }
value={ numberOfPosts }
onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
min={ 1 }
max={ 10 }
/>
<ToggleControl
label={ __( 'Show Excerpt', 'my-dynamic-blocks' ) }
checked={ showExcerpt }
onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
/>
</PanelBody>
</InspectorControls>
{
// 동적 블록의 출력 미리 보기를 표시하기 위해 ServerSideRender 사용
<ServerSideRender
block="my-dynamic-blocks/recent-posts"
attributes={ attributes }
/>
}
</div>
);
}
save() 함수를 정의하지 않는다는 점에 유의하세요. 이것이 동적 블록의 핵심 차이점입니다. ServerSideRender 컴포넌트는 서버에 요청을 하여 편집기 내에서 블록 출력의 미리 보기를 표시하는 데 사용됩니다.
4단계: 스크립트 인큐 및 서버 측 렌더링 등록(PHP)
플러그인의 메인 PHP 파일(예: my-dynamic-blocks.php)에서 JavaScript 파일을 인큐하고 render_callback을 포함하여 블록 유형을 등록해야 합니다.
<?php
/**
* Plugin Name: My Dynamic Blocks
* Description: A simple plugin for dynamic Gutenberg blocks.
* Version: 1.0
* Author: Your Name
*/
function my_dynamic_blocks_register_block() {
// 블록 유형 등록
register_block_type( 'my-dynamic-blocks/recent-posts', array(
'editor_script' => 'my-dynamic-blocks-editor-script',
'render_callback' => 'my_dynamic_blocks_render_recent_posts',
'attributes' => array(
'numberOfPosts' => array(
'type' => 'number',
'default' => 5,
),
'showExcerpt' => array(
'type' => 'boolean',
'default' => true,
),
),
) );
}
add_action( 'init', 'my_dynamic_blocks_register_block' );
function my_dynamic_blocks_enqueue_editor_scripts() {
wp_enqueue_script(
'my-dynamic-blocks-editor-script',
plugins_url( 'build/index.js', __FILE__ ), // 빌드 프로세스가 있다고 가정
array( 'wp-blocks', 'wp-element', 'wp-editor', 'wp-components', 'wp-i18n', 'wp-server-side-render' ),
filemtime( plugin_dir_path( __FILE__ ) . 'build/index.js' )
);
}
add_action( 'enqueue_block_editor_assets', 'my_dynamic_blocks_enqueue_editor_scripts' );
/**
* Recent Posts 동적 블록의 렌더링 콜백.
*
* @param array $attributes 블록 속성.
* @return string HTML 출력.
*/
function my_dynamic_blocks_render_recent_posts( $attributes ) {
$number_of_posts = isset( $attributes['numberOfPosts'] ) ? (int) $attributes['numberOfPosts'] : 5;
$show_excerpt = isset( $attributes['showExcerpt'] ) ? (bool) $attributes['showExcerpt'] : true;
$args = array(
'posts_per_page' => $number_of_posts,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
'ignore_sticky_posts' => true,
);
$recent_posts_query = new WP_Query( $args );
$output = '';
if ( $recent_posts_query->have_posts() ) {
$output .= '<ul class="wp-block-my-dynamic-blocks-recent-posts">'; // 스타일링을 위한 클래스 사용
while ( $recent_posts_query->have_posts() ) {
$recent_posts_query->the_post();
$output .= '<li>';
$output .= '<a href="' . esc_url( get_permalink() ) . '">' . esc_html( get_the_title() ) . '</a>';
if ( $show_excerpt ) {
$output .= '<p>' . get_the_excerpt() . '</p>';
}
$output .= '</li>';
}
$output .= '</ul>';
wp_reset_postdata(); // 사용자 정의 루프 후 게시물 데이터 재설정: 중요
} else {
$output = '<p>' . __( 'No posts found.', 'my-dynamic-blocks' ) . '</p>';
}
return $output;
}
PHP 코드 설명:
my_dynamic_blocks_register_block(): 이 함수는init에 후킹하여 블록 유형을 등록합니다. 중요하게도render_callback을my_dynamic_blocks_render_recent_posts로 정의하고 JavaScript에서 정의된 것과 동일한 블록 속성을 전달합니다.my_dynamic_blocks_enqueue_editor_scripts(): 이 함수는enqueue_block_editor_assets에 후킹하여 편집기에만 JavaScript 파일을 로드합니다.wp-server-side-render를 종속성으로 포함합니다.my_dynamic_blocks_render_recent_posts(): 이것이 우리의render_callback입니다.$attributes배열을 받고, 이를 올바른 유형으로 정리하고 캐스팅한 다음,WP_Query를 사용하여 최근 게시물을 가져옵니다. HTML<ul>목록을 구성하고 반환합니다.wp_reset_postdata()는 원래 워드프레스 쿼리와의 충돌을 방지하기 위해 사용자 정의WP_Query루프 후에 필수적입니다.
5단계: JavaScript 빌드
최신 JavaScript 빌드 프로세스(예: @wordpress/scripts)를 사용하는 경우 에셋을 빌드해야 합니다. 플러그인 디렉터리에서 npm run build (또는 yarn build)를 실행합니다.
6단계: 활성화 및 테스트
플러그인을 활성화합니다. 이제 게시물이나 페이지에 'Recent Posts' 블록을 추가하면 편집기 인터페이스가 표시됩니다. 미리 보기 영역에는 PHP 콜백에서 렌더링된 출력이 표시됩니다. 게시물을 게시하거나 업데이트하면 동일한 PHP 콜백이 프런트엔드에서 실행되어 동적 콘텐츠를 표시합니다.
모범 사례 및 주의 사항
- 보안 우선:
render_callback에서 사용하기 전에 속성이나 외부 소스에서 오는 모든 데이터를 항상 정리하고 검증하세요.esc_html(),esc_url(),sanitize_text_field()와 같은 워드프레스 함수를 사용하세요. wp_reset_postdata():render_callback이WP_Query를 사용하거나 전역$post객체를 수정하는 경우, 원래 쿼리 및 게시물 데이터를 복원하기 위해 항상wp_reset_postdata()를 호출하세요.- 성능 고려 사항: 동적 블록은 강력하지만 과도하거나 복잡한 서버 측 렌더링은 페이지 로드 시간에 영향을 줄 수 있습니다. 쿼리 및 렌더링 로직을 최적화하세요. 성능 문제가 발생하면 캐싱 메커니즘을 고려하세요.
- 편집기 미리 보기:
ServerSideRender컴포넌트는 좋은 미리 보기를 제공하지만 서버 요청에 의존합니다. 매우 복잡한 블록의 경우 즉각적이지 않을 수 있습니다.render_callback이 효율적인지 확인하세요. - 속성 처리: 속성은 주로 편집기에서 블록을 구성하는 데 사용됩니다.
render_callback은 실제 동적 콘텐츠를 가져오고 표시하는 역할을 합니다. 속성에 대량의 동적 데이터를 직접 저장하지 마세요. - 명명 규칙: 블록 이름(예:
my-plugin-slug/block-name)과 PHP 함수 이름에 고유한 접두사를 사용하여 다른 플러그인이나 테마와의 충돌을 피하세요. - 국제화: JavaScript 및 PHP 코드 모두에서 번역 가능한 문자열에
__()및_n()을 사용하세요.
최근 게시물 그 이상: 동적 블록 기능 확장
"Recent Posts" 예제는 빙산의 일각일 뿐입니다. 동적 블록을 다음과 같이 활용할 수 있습니다.
- 사용자 정의 게시물 유형 표시: 제품, 포트폴리오 항목 또는 이벤트를 보여줍니다.
- 사용자별 콘텐츠: 로그인한 사용자에게 관련 콘텐츠를 표시합니다.
- 인터랙티브 양식: 복잡한 양식은 전용 플러그인의 이점을 계속 누릴 수 있지만, 간단한 동적 양식을 만들 수 있습니다.
- 데이터 시각화: API에서 데이터를 가져와 차트나 그래프를 렌더링합니다(이것은 종종 더 고급 JavaScript 라이브러리가 필요합니다).
- 다른 플러그인과의 통합: 다른 플러그인에서 관리하는 데이터를 동적으로 표시합니다.
결론
동적 워드프레스 블록은 구텐베르크 편집기 내에서 진정으로 인터랙티브하고 데이터 기반인 경험을 만들고자 하는 개발자에게 필수적인 도구입니다. render_callback 함수로 블록을 등록하고 속성을 효과적으로 관리하는 방법을 이해하면 실시간 정보를 가져오고 표시하는 강력한 구성 요소를 구축할 수 있습니다. 정적 블록이 구조화된 콘텐츠에 목적을 수행하는 반면, 동적 블록은 서버 측 로직과 프런트엔드 프레젠테이션 간의 격차를 해소하여 새로운 수준의 기능을 잠금 해제합니다. 보안, 성능 및 코드 구성에 대한 모범 사례를 따르면 워드프레스 웹사이트를 향상시키는 강력하고 유용한 동적 블록을 자신 있게 개발할 수 있습니다.
Sources (5)
- WordPress Architecture: A Complete Guide - Liquid Web
- Explaining WordPress Hooks with Actions and Filters - Hey Reliable
- WordPress Hooks, Actions, and Filters: What They Do and How They Work
- Getting Started with Gutenberg: WordPress Block Development Essentials
- Gutenberg Block Development Step by Step Guide - White Label IQ