בלוג

ארכיטקטורת הוקים של וורדפרס: פעולות מול פילטרים מוסברות

הבסיס לכל תוסף נהדר. למד כיצד PAGEnza AI משתמשת ב-hooks וב-filters ליצירת קוד בר-תחזוקה וניתן להרחבה.

כל תוסף וורדפרס עושה אחד משני דברים: הוא מריץ קוד ברגע ספציפי (פעולה - action), או שהוא משנה ערך לפני השימוש בו (פילטר - filter). זה הכל. כל מערכת התוספים של וורדפרס בנויה על ההבחנה הזו.

הבנת ההבדל — ומתי להשתמש בכל אחד — היא מה שמבדיל בין תוספים שעובדים לתוספים שגורמים לבעיות.

פעולות (Actions): עשה משהו בנקודת זמן מסוימת

action hook הוא אות שוורדפרס (או תוסף אחר) שולח ברגע ספציפי. אתה מצמיד פונקציה לאות הזה, והפונקציה שלך רצה כאשר האות נשלח.

add_action( 'wp_enqueue_scripts', 'my_plugin_load_assets' );

function my_plugin_load_assets() {
    wp_enqueue_style( 'my-plugin', plugin_dir_url( __FILE__ ) . 'style.css' );
    wp_enqueue_script( 'my-plugin', plugin_dir_url( __FILE__ ) . 'script.js', ['jquery'], '1.0', true );
}

wp_enqueue_scripts נשלח כאשר וורדפרס מתכונן לטעון נכסים (assets) עבור החזית. חיבור אליו הוא הדרך הנכונה לטעון CSS ו-JS — לא להכניס תגיות <script> ישירות לתבניות.

פעולות נפוצות שתשתמש בהן ללא הרף:

  • init — רץ מוקדם, טוב לרישום סוגי פוסטים וטקסונומיות
  • wp_enqueue_scripts — טעינת נכסים לחזית
  • admin_enqueue_scripts — טעינת נכסים לממשק הניהול
  • save_post — רץ כאשר פוסט נשמר, טוב לעיבוד שדות מותאמים אישית
  • wp_ajax_{action} — טיפול בבקשות AJAX ממשתמשים מאומתים
  • wp_ajax_nopriv_{action} — טיפול בבקשות AJAX ממשתמשים לא מחוברים

פילטרים (Filters): שנה ערך לפני השימוש בו

filter hook נותן לך ערך, מאפשר לך לשנות אותו, ומצפה ממך להחזיר את הגרסה ששונתה. וורדפרס משתמשת אז בערך ששינית במקום במקור.

add_filter( 'the_content', 'my_plugin_append_cta' );

function my_plugin_append_cta( $content ) {
    if ( ! is_single() ) {
        return $content;
    }
    $cta = '<div class="post-cta">מוכנים לנסות את PAGEnza? <a href="#">התחילו בחינם →</a></div>';
    return $content . $cta;
}

הכלל הקריטי: תמיד החזר משהו מפילטר. אם תשכח את ה-return, הערך יהפוך ל-null ופשוט שברת את מה שהשתמש בו.

פילטרים נפוצים:

  • the_content — תוכן הפוסט לפני התצוגה
  • the_title — כותרת הפוסט
  • wp_nav_menu_items — קוד HTML של תפריט ניווט
  • upload_mimes — סוגי קבצים מותרים להעלאה
  • plugin_action_links_{plugin-file} — קישורים המוצגים בדף רשימת התוספים

כיצד PAGEnza AI משתמשת ב-hooks

כאשר ה-Plugin Builder מייצר תוסף, הוא ממבנה את הקוד סביב מחלקה (class) עם מתודות (methods) המחוברות ל-hooks בקונסטרקטור. תבנית זו מונעת התנגשויות בשמות פונקציות גלובליות ושומרת על הקוד מאורגן.

class My_Plugin {
    public function __construct() {
        add_action( 'init', [ $this, 'register_post_type' ] );
        add_action( 'wp_enqueue_scripts', [ $this, 'load_assets' ] );
        add_filter( 'the_content', [ $this, 'append_content' ] );
    }

    public function register_post_type() { /* ... */ }
    public function load_assets() { /* ... */ }
    public function append_content( $content ) {
        // תמיד להחזיר
        return $content;
    }
}

new My_Plugin();

סריקת האבטחה בודקת ספציפית שמאחזי AJAX כוללים גם בדיקת nonce וגם בדיקת הרשאות לפני ביצוע כל פעולה:

add_action( 'wp_ajax_my_action', [ $this, 'handle_ajax' ] );

public function handle_ajax() {
    // אבטחה: אימות nonce
    check_ajax_referer( 'my_nonce_action', 'nonce' );

    // אבטחה: אימות הרשאות
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( 'Insufficient permissions', 403 );
    }

    // כעת בטוח לעבד
    $data = sanitize_text_field( $_POST['data'] ?? '' );
    wp_send_json_success( [ 'result' => $data ] );
}

היעדר אחד מאלה מסומן כבעיית אבטחה ומונע את שחרור התוסף.

עדיפות ותור ה-hook

כאשר פונקציות מרובות מחוברות לאותו hook, הן רצות לפי סדר עדיפות (מספר נמוך יותר = רץ קודם). עדיפות ברירת המחדל היא 10.

add_action( 'init', 'runs_first', 5 );
add_action( 'init', 'runs_second', 10 );   // ברירת מחדל
add_action( 'init', 'runs_last', 20 );

זה משנה כאשר התוסף שלך צריך לרוץ לפני או אחרי קוד של תוסף אחר. אם אתה משנה משהו שתוסף אחר גם משנה, העדיפות קובעת מי מנצח.

תבנית נפוצה: אם אתה דורס פילטר של תבנית, השתמש בעדיפות 20 או גבוהה יותר כדי לוודא שאתה רץ אחרי קוד התבנית.

הסרת hooks

אתה יכול להסיר hook שמישהו אחר הוסיף — כולל hooks של תבניות ותוספים:

remove_action( 'wp_head', 'wp_generator' );  // מסיר את גרסת WP מ-<head>
remove_filter( 'the_content', 'wpautop' );   // מסיר עטיפת פסקאות אוטומטית

המלכוד: אתה יכול להסיר hook רק אם אתה קורא ל-remove_action/remove_filter לאחר שה-add_action/add_filter המקורי כבר רץ. זה בדרך כלל אומר לחבר את ההסרה שלך לפעולה מאוחרת יותר.