בלוג
שליטה בבלוקים דינמיים של וורדפרס: גישור PHP ו-JavaScript לתוכן אינטראקטיבי
למד כיצד ליצור בלוקים דינמיים של וורדפרס הממנפים גם PHP וגם JavaScript כדי לספק חוויות תוכן אינטראקטיביות ומבוססות נתונים למשתמשים שלך.

סיכום
בלוקים דינמיים של וורדפרס מציעים דרך עוצמתית ליצור תוכן שחורג מ-HTML סטטי, ומאפשרים שילוב נתונים בזמן אמת ואלמנטים אינטראקטיביים. בניגוד לבלוקים סטטיים, בלוקים דינמיים מרנדרים את הפלט שלהם בצד השרת באמצעות PHP, מה שמאפשר להם לאחזר ולהציג מידע עדכני. מאמר זה מספק מדריך מעשי לפיתוח בלוקים דינמיים משלך, המכסה את המושגים החיוניים של רישום בלוקים, קריאות חוזרות של רינדור בצד השרת, וטיפול בתכונות בצד הלקוח. נסקור דוגמה שלב אחר שלב, המדגימה כיצד לבנות בלוק דינמי המציג פוסטים אחרונים, ומציעה בסיס לרכיבים אינטראקטיביים מורכבים יותר.
שליטה בבלוקים דינמיים של וורדפרס: גישור PHP ו-JavaScript לתוכן אינטראקטיבי
וורדפרס, בליבה, היא מערכת ניהול תוכן (CMS) חזקה הבנויה על ארכיטקטורת PHP מודולרית ומסד נתונים MySQL. יכולת ההרחבה שלה היא נקודת חוזק מרכזית, המושגת בעיקר באמצעות ערכות נושא ותוספים. הופעתה של גוטנברג, עורך הבלוקים, חוללה מהפכה ביצירת תוכן על ידי הצגת ממשק מודולרי המונע על ידי JavaScript. בעוד שבלוקי גוטנברג סטטיים מצוינים לתוכן מובנה ובלתי משתנה, תרחישים רבים בעולם האמיתי דורשים תוכן שהוא דינמי, אינטראקטיבי ומבוסס נתונים. כאן נכנסים לתמונה בלוקים דינמיים, המציעים גשר עוצמתי בין הלוגיקה בצד השרת של PHP לאינטראקטיביות בצד הלקוח של JavaScript.
הבנת הכוח של בלוקים דינמיים
בלוקים סטטיים, ברירת המחדל בגוטנברג, מייצרים HTML בצד הלקוח בעת השמירה. HTML זה נשמר ישירות בתוכן הפוסט. בעוד שזה יעיל לתוכן סטטי, גישה זו מוגבלת כאשר עוסקים בנתונים שמשתנים לעיתים קרובות או דורשים עיבוד בצד השרת. בלוקים דינמיים, לעומת זאת, פותרים בעיה זו על ידי רינדור הפלט שלהם בצד השרת באמצעות PHP. כאשר משתמש מציג דף המכיל בלוק דינמי, וורדפרס מפעילה פונקציית PHP (ה-render_callback) כדי ליצור את ה-HTML של הבלוק תוך כדי תנועה. זה מאפשר לבלוק לאחזר נתונים בזמן אמת ממסד הנתונים, ליצור אינטראקציה עם פונקציונליות אחרות של וורדפרס, ולהציג מידע שהוא תמיד עדכני.
רינדור בצד השרת זה חיוני מכמה סיבות:
- נתונים בזמן אמת: הצגת הפוסטים האחרונים, אירועים קרובים, מחירי מניות, או כל נתון אחר שמשתנה לעיתים קרובות.
- לוגיקה מורכבת: ביצוע חישובים, שאילתות לסוגי פוסטים מותאמים אישית, או אינטגרציה עם ממשקי API חיצוניים לפני רינדור הפלט.
- אבטחה: ניקוי ואימות נתונים לפני הצגתם, במיוחד בעת טיפול בתוכן שנוצר על ידי משתמשים או מקורות חיצוניים.
- ביצועים: העברת משימות רינדור מורכבות לשרת יכולה לפעמים לשפר את ביצועי צד הלקוח.
מבנה הבלוק הדינמי
בלוק דינמי, כמו כל בלוק גוטנברג אחר, מוגדר על ידי המטא-דאטה שלו ורישום JavaScript. עם זאת, המאפיין הייחודי שלו טמון בתכונת ה-render_callback המצוינת במהלך הרישום. פונקציית קריאה חוזרת זו אחראית ליצירת פלט ה-HTML של הבלוק בשרת.
להלן פירוט של המרכיבים העיקריים:
- רישום בלוק (JavaScript): עדיין צריך לרשום את הבלוק שלך באמצעות
registerBlockType()בקובץ ה-JavaScript שלך. זה אומר לגוטנברג שהבלוק שלך קיים וכיצד לטפל בתכונותיו ובממשק העורך. - תכונות (Attributes): אלו הם שדות הנתונים המשויכים לבלוק שלך, המאוחסנים בתוכן הפוסט. עבור בלוקים דינמיים, תכונות משמשות בעיקר להגדרת התנהגות הבלוק והגדרותיו בעורך. התוכן המוצג בפועל נוצר על ידי ה-
render_callback. render_callback(PHP): זהו הלב של בלוק דינמי. זוהי פונקציית PHP שמקבלת את תכונות הבלוק כארגומנט ומחזירה את מחרוזת ה-HTML שתרונדר בחזית.- ממשק עורך (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: __( 'פוסטים אחרונים', '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={ __( 'הגדרות פוסט', 'my-dynamic-blocks' ) }>
<RangeControl
label={ __( 'מספר פוסטים', 'my-dynamic-blocks' ) }
value={ numberOfPosts }
onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
min={ 1 }
max={ 10 }
/>
<ToggleControl
label={ __( 'הצג תקציר', '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
/**
* שם התוסף: בלוקים דינמיים שלי
* תיאור: תוסף פשוט לבלוקים דינמיים של גוטנברג.
* גרסה: 1.0
* מחבר: שם המשתמש שלך
*/
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' );
/**
* קריאה חוזרת לרינדור עבור בלוק הפוסטים האחרונים הדינמי.
*
* @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>' . __( 'לא נמצאו פוסטים.', '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כדי לאחזר את הפוסטים האחרונים. היא בונה רשימת<ul>HTML ומחזירה אותה.wp_reset_postdata()חיוני לאחר לולאתWP_Queryמותאמת אישית כדי למנוע התנגשויות עם השאילתה הראשית של וורדפרס.
שלב 5: בניית ה-JavaScript שלך
אם אתה משתמש בתהליך בנייה מודרני של JavaScript (כמו @wordpress/scripts), תצטרך לבנות את הנכסים שלך. הפעל npm run build (או yarn build) בספריית התוסף שלך.
שלב 6: הפעלה ובדיקה
הפעל את התוסף שלך. כעת, כאשר תוסיף את בלוק "פוסטים אחרונים" לפוסט או לדף, תראה את ממשק העורך. אזור התצוגה המקדימה יציג את הפלט שרונדר על ידי קריאת ה-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 כדי למנוע התנגשויות עם תוספים או ערכות נושא אחרות. - לוקליזציה: השתמש ב-
__()וב-_n()עבור מחרוזות ניתנות לתרגום הן בקוד ה-JavaScript והן בקוד ה-PHP שלך.
מעבר לפוסטים אחרונים: הרחבת יכולות הבלוק הדינמי
דוגמת "פוסטים אחרונים" היא רק קצה הקרחון. ניתן למנף בלוקים דינמיים עבור:
- הצגת סוגי פוסטים מותאמים אישית: הצגת מוצרים, פריטי פורטפוליו, או אירועים.
- תוכן ספציפי למשתמש: הצגת תוכן הרלוונטי למשתמש המחובר.
- טפסים אינטראקטיביים: בעוד שטפסים מורכבים עשויים עדיין להפיק תועלת מתוספים ייעודיים, ניתן לבנות טפסים דינמיים פשוטים.
- הדמיית נתונים: אחזור נתונים מממשק 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