Language EN
חיפוש

הבנת הוקים בוורדפרס: מדריך לשימוש ב- Actions ו- Filters

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

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

הסבר על המונחים

הוק (Hook) הוא מונח גנרי בוורדפרס המתייחס למיקומים בהם ניתן, או להוסיף קוד משלכם או לשנות את הפעולות אותן וורדפרס מבצעת או מדפיסה כברירת מחדל. קיימים שני סוגים של הוקים והם Actions & Filters. לצורך הנוחות נתייחס אליהם בפוסט זה כפעולות ופילטרים.

פעולה (Action)

פעולה בוורדפרס היא הוק המתבצע בזמן ספציפי כאשר וורדפרס רצה ומאפשר לכם לבצע פעולה מסוימת באותו זמן. פעולה למשל יכולה להיות יצירת פוסט מותאם אישית (Custom Post Type) כאשר וורדפרס מאותחלת או אף שיתוף הפוסט שלכם בפייסבוק כאשר אתם מפרסמים פוסט.

בעבודה עם פעולה אתם לא מקבלים או משנים מידע, אלא פשוט מקבלים מקום להוסיף ולהריץ קוד משלכם בזמן מסוים במהלך הריצה של וורדפרס (WordPress Runtime).

פילטר (Filter)

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

העבודה עם הוקים מתחילה בזיהוי ההוק שאליו צריך להצמיד את הקוד, ולאחר מכן כתיבת הפונקציה שמשנה מידע (פילטר) או מבצעת פעולה.

כיצד להצמד להוקים או להסיר צימוד להוקים?

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

כיצד להצמד לפעולה

add_action( $hook, $function_to_add, $priority, $accepted_args );

הפרמטרים הדרושים לפונקציה add_action הינם ההוק אליו אתם מעוניינים להצמד ושם הפונקציה שברצונכם להצמיד אליו.

הפרמטר priority הוא אופציונלי (ברירת מחדל 10) ושולט בסדר הביצוע – מספרים נמוכים יותר רצים ראשונים. הפרמטר $accepted_args מציין כמה ארגומנטים הפונקציה מקבלת.

לידיעתכם, פרמטר ה priority כברירת המחדל שלו הוא 10.

כיצד להצמד לפילטר

add_filter( $tag, $function_to_add, $priority, $accepted_args );

הפונקציה add_filter עובדת בצורה זהה כמו add_action, אך זכרו כי עבור פילטר – על הפרמטר function_to_add לקבל ערך ולהחזיר אותו בסוף הפונקציה.

כיצד להסיר צימוד להוקים

השתמשו ב-remove_action() או remove_filter() עם שם ההוק, שם הפונקציה והעדיפות. העדיפות חייבת להתאים לזו שהוגדרה כשהפונקציה הוצמדה במקור.

remove_action( $tag, $function_to_remove, $priority );
remove_filter( $tag, $function_to_remove, $priority );

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

דוגמאות שימוש בהוקים – וורדפרס

בוורדפרס ישנם מאות הוקים מובנים, ותוספים ותבניות מוסיפים משלהם. להלן דוגמאות מעשיות עם הוקים של ליבת וורדפרס ושל התוסף Yoast SEO.

1. הוספת קישור לעמוד הבית בפוטר (footer)

<?php
/****** BEGIN HERE ******/
function add_footer_link() { ?> 
 <a href="https://savvy.co.il">Savvy.co.il - WordPress Developer &amp Designer</a>
<?php
}
add_action( 'wp_footer', 'add_footer_link' );

2. שינוי אורך התקציר (excerpt)

function excerpt_length_example( $words ) {
 return 15;
}
add_filter( 'excerpt_length', 'excerpt_length_example' );

בדוגמא זו אנו נצמדים להוק (פילטר) בשם excerpt_length המספק לנו מספר (שלם) הקובע את מספר המילים שיופיע כשאשר משתמשים בפונקציה the_excerpt() בתבנית שלכם.

אם אינכם בטוחים איזה סוג ערך הפילטר אמור לקבל, חפשו בקוד הליבה של וורדפרס את apply_filters( 'filter_name' ותנו מבט עמוק יותר במה שקורה עם אותו פילטר.

3. להצמד לשלב בו מפרסמים פוסט

function publish_post_tweet($post_ID) {
 global $post;
 // Code to send a tweet with post info
}
add_action('publish_post', 'publish_post_tweet');

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

4. להצמד לשלב בו מוסיפים נכסים (סקריפטים וקבצי CSS)

function themeslug_enqueue_style() {
	wp_enqueue_style( 'core', 'style.css', false ); 
}

function themeslug_enqueue_script() {
	wp_enqueue_script( 'my-js', 'filename.js', false );
}

add_action( 'wp_enqueue_scripts', 'themeslug_enqueue_style' );
add_action( 'wp_enqueue_scripts', 'themeslug_enqueue_script' );

אני מניח שראיתם משהו דומה לקוד הבא ברבים מהמאמרים בבלוג זה. הוא נמצא בשימוש רבות ולומדים אותו בשלב מאוד מוקדם בעולם של פיתוח וורדפרס. במקרה זה אנו נצמדים להוק (פעולה) בשם wp_enqueue_scripts בכדי להוסיף נכסים – קבצי Javascript וקבצי CSS בצד לקוח (Frontend) בתבנית הוורדפרס שלכם. זוהי הדרך המועדפת להוסיף נכסים באתרי וורדפרס ונכונה יותר מאשר ״תכנות נוקשה״ הלא הוא hard coding.

זה המקום לציין, אם לא הייתי ברור – ניתן להצמיד כמה פונקציות שתרצו לאותו הוק!

5. הוספת מספר העמוד בכותרת המטא הנוצרת על ידי Yoast SEO

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

function change_yoast_title($title) {
 $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
 if ( is_paged() ) {
 return $title . ' - Page ' . $paged;
 }
 else {
 // first page of pagination
 return $title;
 }
}
add_filter('wpseo_title','change_yoast_title');

במקרה אמיתי זה, איש הקידום של אחת החברות להן אני מספק שירות, ביקש להוסיף בעמודים הממוספרים (paginated pages) של האתר את המילה Page ומספר העמוד בסופה של כותרת המטא (meta title) באותם עמודים.

לדוגמה, בעמוד שלוש יופיע Page 3 בסוף כותרת המטא וכנ״ל לגבי הכותרות בשאר העמודים הממוספרים, כל זאת כאשר בעמוד מספר אחד שינוי זה לא יתבצע. מכיוון ובמקרה של אותו אתר ספציפי כותרת המטא נוצרה באמצעות התוסף WordPress SEO by Yoast, נכון היה לחפש פילטר של Yoast המאפשר לבצע מודיפיקציה לכותרת העמוד.

חיפוש זריז הוביל להוק (פילטר) בשם wpseo_title המקבל כערך את כותרת העמוד ומחזיר את הכותרת לאחר השינוי שביצעתם. יצרנו פונקציה בשם change_yoast_title בה אנו בודקים האם העמוד ממוספר או לא, ובמידה וכן תוסיף את הטקסט המבוקש בסוף הכותרת.

6. הסרת כתובות קנוניות מעמודי תוצאות החיפוש באתר שלכם

פעולה שמקדמי אתרים יאהבו סביר להניח. בהנחה ואתם משתמשים ב Yoast SEO הפילטר הבא יסיר את הכתובת הקנונית (Canonical URL) מעמודי תוצאות החיפוש של וורדפרס:

function yoast_remove_canonical_search( $canonical ) {
	if( is_search() ) {
		return false;
	} else {
		return $canonical;
	}
}
add_filter('wpseo_canonical', 'yoast_remove_canonical_search');

פונקציות שימושיות לבדיקת הוקים

וורדפרס מספקת מספר פונקציות לבדיקה ודיבוג של הוקים בזמן ריצה:

  • has_filter( $hook, $callback ) – בדיקה אם פונקציה מסוימת מוצמדת להוק. עובד גם עבור פעולות וגם עבור פילטרים.
  • did_action( $hook ) – מחזיר את מספר הפעמים שפעולה הופעלה. שימושי למניעת ביצוע כפול.
  • current_action() / current_filter() – מחזיר את שם ההוק שמתבצע כרגע.
  • remove_all_actions( $hook ) / remove_all_filters( $hook ) – מסיר את כל הפונקציות המוצמדות להוק מסוים.

מוסכמת שמות: בעת יצירת הוקים מותאמים, הוסיפו תמיד קידומת של שם התוסף או התבנית שלכם (למשל savvy_after_header במקום after_header) כדי למנוע קונפליקטים עם תוספים אחרים.

יצירת הוקים (משלכם)

יצירת הוקים משלכם היא פשוטה. השתמשו ב-do_action() עבור פעולות מותאמות וב-apply_filters() עבור פילטרים מותאמים.

1. הגדירו את ההוק שלכם

הוסיפו את הקוד הבא לקובץ functions.php (או לתוסף שלכם):

function custom_hook() {
 do_action('custom_hook');
}

הקוד המופיע מעלה יוסיף פעולה בשם custom_hook לספריית ההוקים של וורדפרס ויאפשר לכם להשתמש בו בכל מקום שתרצו בתבנית שלכם. כמובן, שעליכם לקרוא להוק בשם הגיוני יותר המתאר את הפונקציה המתבצעת.

2. הוסיפו את ההוק בתבנית שלכם

הוסיפו את הקריאה לפונקציה היכן שתרצו בתבנית שלכם:

<?php custom_hook(); ?>

ניתן אגב פשוט להוסיף את do_action('custom_hook'); בתבנית ישירות.

התבנית שלכם כעת מצוידת בהוק מותאם. כל מפתח יכול להצמיד אליו פונקציות באמצעות add_action().

3. הוסיפו את הפונקציה עצמה

כעת, בכדי להוסיף קוד משלכם במיקום זה עליכם להשתמש בקוד הבא:

if ( ! function_exists( 'your_function_name' ) ) {
 function your_function_name() {
 // Your custom code goes here
 }
 add_action( 'custom_hook', 'your_function_name' );
}

שימו לב כי עטפנו את הפונקציה ב-function_exists() כדי למנוע שגיאות במקרה שכבר קיימת פונקציה בשם זה.

4. יצירת פילטר מותאם

ניתן גם ליצור פילטרים מותאמים באמצעות apply_filters():

function get_custom_greeting( $name ) {
 $greeting = 'Hello, ' . $name;
 return apply_filters( 'custom_greeting', $greeting, $name );
}

מפתחים אחרים יכולים כעת לשנות את הברכה:

function modify_greeting( $greeting, $name ) {
 return 'Welcome, ' . $name . '!';
}
add_filter( 'custom_greeting', 'modify_greeting', 10, 2 );

שאלות נפוצות

מה ההבדל בין פעולות (Actions) לפילטרים (Filters) בוורדפרס?
פעולות מריצות קוד בנקודות ספציפיות במהלך ריצת וורדפרס (כמו פרסום פוסט או טעינת הפוטר) ללא החזרת ערך. פילטרים משנים מידע לפני שהוא מגיע למסד הנתונים או לדפדפן וחייבים תמיד להחזיר ערך. שניהם משתמשים בתחביר דומה אך משרתים מטרות שונות.
היכן כדאי להוסיף קוד הוקים בוורדפרס?
הוסיפו קוד הוקים לקובץ functions.php של תבנית בת, לתוסף מותאם, או לתיקיית mu-plugins. לעולם אל תערכו קבצי ליבה של וורדפרס או את תבנית האב ישירות, מכיוון שהשינויים יאבדו בעדכונים.
מה עושה פרמטר העדיפות (priority) ב-add_action ו-add_filter?
פרמטר העדיפות (ברירת מחדל 10) שולט בסדר הביצוע כאשר מספר פונקציות מוצמדות לאותו הוק. מספרים נמוכים יותר רצים ראשונים. לדוגמה, עדיפות 5 תרוץ לפני עדיפות 20. ליבת וורדפרס משתמשת בדרך כלל בעדיפות 10, אז השתמשו ב-11 ומעלה כדי לרוץ אחרי פונקציות הליבה.
כיצד מוצאים הוקים זמינים בוורדפרס?
חפשו בקוד המקור של וורדפרס קריאות ל-do_action() ו-apply_filters(). ניתן גם להשתמש בתוסף Query Monitor כדי לראות אילו הוקים מופעלים בכל טעינת עמוד, או לעיין ב-Plugin Handbook באתר developer.wordpress.org.
האם ניתן ליצור הוקים מותאמים משלי?
כן. השתמשו ב-do_action('your_hook_name') ליצירת פעולות מותאמות וב-apply_filters('your_filter_name', $value) ליצירת פילטרים מותאמים. זה הופך את התבנית או התוסף שלכם לניתנים להרחבה על ידי מפתחים אחרים. הוסיפו תמיד קידומת של שם הפרויקט שלכם כדי למנוע קונפליקטים.

סיכום

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

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

דיון ותגובות
11 תגובות  ]
  • לאה כהן 31 ינואר 2018, 8:51

    כרגיל, הסבר יפה ודוגמאות מועילות. ישר כח! וכרגיל, יש לי מה להוסיף 😉 :

    הראית בדוגמה של wp_enqueue_scripts שאפשר להצמיד כמה פונקציות שרוצים לכל hook, אבל לא כתבת את זה במפורש אז נראה לי שזה לא מודגש מספיק: אפשר להצמיד כמה פונקציות שרוצים לכל hook! 🙂 . פעם נשאלה שאלה כזאת ב-WPSE, ואחת התשובות הייתה משעשעת במיוחד: Hook-ים של וורדפרס הם כמו הוליווד: אתה לא קורא להם, הם קוראים לך (באנגלית זה נשמע יותר טוב…). אבל בניגוד להוליווד, הם קוראים לכל מי שברשימה.

    ועוד דבר: הראית איך ליצור action (עם do_action) אבל לא הראית איך ליצור פילטר (עם apply_filter). למה?

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

    ולהשומע ינעם. תודה על עוד פוסט מעניין ומועיל.

    • רועי יוסף 31 ינואר 2018, 16:14

      היי לאה!

      תודה על התגובה ועל הרעיונות. הוספתי משפט האומר כי אפשר להצמיד כמה פונקציות שרוצים לכל hook…

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

      תודה שוב 🙂

  • רון 31 ינואר 2018, 19:30

    היי, אני מתכנת פרונט כבר כמה שנים, ורציתי להתחיל לעבוד עם וורדפרס. מה רמת הידע שצריך לדעת בphp על מנת לעשות דברים מורכבים משלך באתר שכן יש לי ידע בסיסי בphp וידע רחב ב js. אשמח אם תשלח קישור למקום שממנו ניתן ללמוד php מוכוון וורדפרס.

    • רועי יוסף 31 ינואר 2018, 19:35

      היי רון 🙂

      אני חושב שהלימוד הכי טוב הוא ניסוי וטעייה. אם יש לך ידע בסיסי ב PHP ואתה מגיע מעולם הפיתוח, עקומת הלמידה שלך לא תהיה תלולה מדי. תרים לעצמך סביבה לוקלית, קח אתר לבחירתך, ונסה לבנות אותו בעצמך (בתבנית שאתה יוצר מאפס).

      לא תמצא שיעור או קורס טוב מזה… בהצלחה!

  • בני 13 ינואר 2019, 19:11

    אני כבר שנים מתכנת בוורדפרס ואף פעם לא הבנתי כ"כ ברור את ההוקים (למרות שהשתמשתי בהם). תודה לך

  • adiel bm 24 אפריל 2020, 11:28

    רועי, יש איזה הוק בשביל להסיר את ה header?

    • רועי יוסף 24 אפריל 2020, 19:35

      היי עדיאל,

      אם אתה מתכוון ולתגית ה head אז אפשר להצמד להוק הנקרא wp_head ולהסיר משם את את הפעולות אחת אחת. אלו הפעולות הקיימות ב wp_head:

      add_action( 'wp_head',             '_wp_render_title_tag',            1     );
      add_action( 'wp_head',             'wp_enqueue_scripts',              1     );
      add_action( 'wp_head',             'feed_links',                      2     );
      add_action( 'wp_head',             'feed_links_extra',                3     );
      add_action( 'wp_head',             'rsd_link'                               );
      add_action( 'wp_head',             'wlwmanifest_link'                       );
      add_action( 'wp_head',             'adjacent_posts_rel_link_wp_head', 10, 0 );
      add_action( 'wp_head',             'locale_stylesheet'                      );
      add_action( 'wp_head',             'noindex',                          1    );
      add_action( 'wp_head',             'print_emoji_detection_script',     7    );
      add_action( 'wp_head',             'wp_print_styles',                  8    );
      add_action( 'wp_head',             'wp_print_head_scripts',            9    );
      add_action( 'wp_head',             'wp_generator'                           );
      add_action( 'wp_head',             'rel_canonical'                          );
      add_action( 'wp_head',             'wp_shortlink_wp_head',            10, 0 );
      add_action( 'wp_head',             'wp_site_icon',                    99    );
      
      if ( isset( $_GET['replytocom'] ) )
          add_action( 'wp_head', 'wp_no_robots' );

      המילים אחרות להשתמש ב remove_action כבדוגמה הבא:

      remove_action( 'wp_head', 'wp_print_styles, 8 );

      רק שים לב שעלייך להסיר את הפעולה עם אותו priority בו הפעולה התבצעה (הארגומנט השלישי)

  • רוני 20 מאי 2020, 22:30

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

  • אהרן 2 יולי 2024, 16:50

    יש דרך לבדוק הוק של תוספים?

    • רועי יוסף 2 יולי 2024, 18:12

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

השאירו תגובה

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

Savvy WordPress Development official logo