אינדקס ה-Hooks של WordPress
אינדקס ניתן-לחיפוש של ה-actions וה-filters של WordPress שמפתחים באמת משתמשים בהם — עם חתימת add_action/add_filter המדויקת, מתי הוא מופעל, דוגמה עובדת והדבר שמכשיל אנשים.
39 hooks, עם החתימה המדויקת של add_action / add_filter, מתי כל אחד מופעל, דוגמה עובדת, והדבר שמפיל אנשים. 1 מסומנים כלא-מאומתים — לא בדקנו את מספר הארגומנטים שלהם מול קוד המקור של WordPress, ואנחנו מעדיפים לסמן זאת מאשר להציג ניחוש כעובדה.
זו אינה רשימה ממצה והיא לא מתיימרת להיות כזו — ל-WordPress יש אלפי hooks. היא מכסה את אלה שאנשים באמת משתמשים בהם.
רץ אחרי ש-WordPress סיים להיטען אך לפני שנשלחות כותרות (headers) כלשהן. המקום הסטנדרטי לרישום סוגי תוכן מותאמים, טקסונומיות וכללי rewrite.
מופעל
בכל בקשה, בחזית ובממשק הניהול, אחרי שהליבה, התוספים וערכת העיצוב נטענו.
חתימה
add_action( 'init', 'my_callback' );דוגמה
add_action( 'init', function () {
register_post_type( 'book', array(
'public' => true,
'label' => 'Books',
'show_in_rest' => true, // required for the block editor
) );
} );המלכודת
init רץ על כל בקשה כולל AJAX, REST ו-cron. ביצוע כל דבר איטי כאן (בקשת HTTP, שאילתה כבדה) מכביד על כל טעינת עמוד ועמוד. כמו כן: המשתמש הנוכחי זמין כאן, אך אי אפשר להוציא שום פלט — כותרות עדיין לא נשלחו, אבל הן עומדות להישלח.
רץ ברגע שערכת העיצוב נטענת. המקום הנכון עבור add_theme_support(), add_image_size() ורישום תפריטי ניווט.
מופעל
אחרי שקובץ functions.php של הערכה נטען, לפני init.
חתימה
add_action( 'after_setup_theme', 'my_callback' );דוגמה
add_action( 'after_setup_theme', function () {
add_theme_support( 'post-thumbnails' );
add_theme_support( 'title-tag' );
add_image_size( 'card', 600, 400, true ); // true = hard crop
} );המלכודת
רישום גדלי תמונות ב-init במקום כאן עובד במקרה ברוב המקרים ואז נכשל באופן מסתורי בחלקם. השתמשו ב-after_setup_theme — זה בדיוק מה שהוא נועד לו.
רץ ברגע שכל התוספים הפעילים נטענו. הנקודה הבטוחה המוקדמת ביותר לתקשר עם תוסף אחר.
מופעל
אחרי שכל קובצי התוספים נכללו, לפני שערכת העיצוב נטענת.
חתימה
add_action( 'plugins_loaded', 'my_callback' );המלכודת
המשתמש הנוכחי עדיין לא זמין כאן — wp_get_current_user() לא יעבוד באופן אמין. אם צריך את המשתמש, השתמשו ב-init.
רץ אחרי ש-WordPress נטען במלואו — התוספים, ערכת העיצוב, init והמשתמש כולם מוכנים.
מופעל
אחרי init ואחרי שהמשתמש הנוכחי הוגדר.
חתימה
add_action( 'wp_loaded', 'my_callback' );רץ בתחילת כל בקשה בממשק הניהול. משמש עבור register_setting(), בדיקות הרשאה והפניות בממשק הניהול.
מופעל
בכל בקשה בצד הניהול.
חתימה
add_action( 'admin_init', 'my_callback' );המלכודת
הוא מופעל גם בבקשות admin-ajax.php, שאינן באמת \"מסכי ניהול\". אם ה-callback שלכם מניח שקיים מסך, הגנו עליו עם wp_doing_ajax().
המקום הנכון היחיד לטעון (enqueue) CSS ו-JavaScript בחזית האתר.
מופעל
בטעינות עמוד בחזית האתר, לפני עיבוד ה-head.
חתימה
add_action( 'wp_enqueue_scripts', 'my_callback' );דוגמה
add_action( 'wp_enqueue_scripts', function () {
wp_enqueue_style(
'child-style',
get_stylesheet_uri(),
array( 'parent-style' ), // load AFTER the parent
wp_get_theme()->get( 'Version' ) // cache-bust on version change
);
} );המלכודת
למרות השם, הוא מטפל גם בגיליונות סגנון ולא רק בסקריפטים — אין hook בשם wp_enqueue_styles, ואנשים מבזבזים זמן אמיתי בחיפוש אחריו. כמו כן: הוא אינו מופעל בממשק הניהול (השתמשו ב-admin_enqueue_scripts) או בעורך הבלוקים (השתמשו ב-enqueue_block_editor_assets).
טעינת CSS/JS בממשק הניהול. מקבל את סיומת ה-hook של המסך הנוכחי כדי שתוכלו לטעון נכסים במסך אחד בלבד.
מופעל
בטעינות עמודים בממשק הניהול.
חתימה
add_action( 'admin_enqueue_scripts', 'my_callback' ); // receives $hook_suffixדוגמה
add_action( 'admin_enqueue_scripts', function ( $hook ) {
if ( 'settings_page_my-plugin' !== $hook ) {
return; // do not load our JS on every admin screen
}
wp_enqueue_script( 'my-admin', plugins_url( 'admin.js', __FILE__ ), array(), '1.0', true );
} );המלכודת
אי-הגנה על בסיס $hook היא הסיבה הנפוצה ביותר לכך שתוסף שובר מסכי ניהול לא קשורים. טענו את הנכסים שלכם היכן שהם נחוצים ולא בשום מקום אחר.
טעינת נכסים לתוך עורך הבלוקים (Gutenberg) בלבד — לא בחזית, לא בשאר ממשק הניהול.
מופעל
כשעורך הבלוקים נטען.
חתימה
add_action( 'enqueue_block_editor_assets', 'my_callback' );מדפיס פלט לתוך ה-<head>. משמש לתגיות מטא ול-CSS קריטי מוטבע.
מופעל
בתוך ה-<head>, בחזית האתר.
חתימה
add_action( 'wp_head', 'my_callback' );המלכודת
אל תטענו כאן סקריפטים או גיליונות סגנון — השתמשו ב-wp_enqueue_scripts, שמאפשר ל-WordPress לטפל בתלויות ובמניעת כפילויות. הדפסת תגית <script> לתוך wp_head עוקפת את כל זה, ולכן כל כך הרבה אתרים טוענים את jQuery שלוש פעמים.
מדפיס פלט ממש לפני </body>. המקום הנכון לקטעי קוד של אנליטיקה ולסימון נדחה.
מופעל
בסוף העמוד בחזית האתר.
חתימה
add_action( 'wp_footer', 'my_callback' );המלכודת
ערכת עיצוב ששוכחת לקרוא ל-wp_footer() שוברת את סרגל הניהול, שוברת כל תוסף שטוען סקריפט בפוטר, ומהווה פסילה אוטומטית בבדיקת הערכות של wordpress.org.
מסנן את תוכן הפוסט ממש לפני הצגתו. המקום הרגיל להוסיף סימון בסוף או בתחילת פוסט.
מופעל
בכל פעם ש-the_content() נקרא.
חתימה
add_filter( 'the_content', 'my_callback' ); // receives $contentדוגמה
add_filter( 'the_content', function ( $content ) {
if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
return $content; // <- the guard everyone forgets
}
return $content . '<p class="cta">Enjoyed this? Read more.</p>';
} );המלכודת
זה רץ הרבה יותר פעמים ממה שנדמה לכם — בווידג'טים, בתגובות REST, ביצירת תקצירים של חלק מהתוספים, ופעם אחת לכל פוסט בלולאה בארכיון. ללא ההגנה is_singular / in_the_loop / is_main_query, ה-CTA שלכם מופיע חמש-עשרה פעמים באינדקס הבלוג ובתוך פיד ה-RSS. זהו ה-filter שנעשה בו השימוש השגוי ביותר ב-WordPress.
מסנן את כותרת הפוסט לפני ההצגה.
מופעל
בכל פעם ש-the_title() או get_the_title() נקראים.
חתימה
add_filter( 'the_title', 'my_callback', 10, 2 ); // receives $title, $post_idהמלכודת
הוא מופעל גם עבור כותרות בתפריט הניהול, בתפריטי הניווט וב-<title> של המסמך. סינון שלו ללא תנאי ישנה שמות במקומות שלא התכוונתם אליהם.
קובע כמה מילים מכיל תקציר שנוצר אוטומטית. ברירת המחדל היא 55.
מופעל
כאשר WordPress יוצר תקציר לפוסט שאין לו תקציר ידני.
חתימה
add_filter( 'excerpt_length', 'my_callback' ); // receives $length (words)דוגמה
add_filter( 'excerpt_length', function ( $length ) {
return 25;
}, 999 ); // high priority: many themes set this too, and last one winsהמלכודת
אין לו השפעה על פוסטים שיש להם תקציר ידני — אלה משמשים כמות שהם. ובנוסף, ערכות עיצוב רבות מגדירות את ה-filter הזה בעצמן, ולכן לרוב צריך מספר עדיפות גבוה כדי לנצח.
משנה את המחרוזת שמצורפת לתקציר קטוע. ברירת המחדל היא \" […]\".
מופעל
כאשר תקציר שנוצר אוטומטית נקטע.
חתימה
add_filter( 'excerpt_more', 'my_callback' ); // receives $moreמשנה שאילתה לפני שהיא רצה. הדרך הנכונה לשנות את מה שמופיע בארכיון — הרבה יותר טוב מ-WP_Query שני.
מופעל
אחרי שמשתני השאילתה מפוענחים, לפני שה-SQL נבנה.
חתימה
add_action( 'pre_get_posts', 'my_callback' ); // receives WP_Query $query (by reference)דוגמה
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return; // <- both guards are mandatory
}
if ( $query->is_category() ) {
$query->set( 'posts_per_page', 12 );
}
} );המלכודת
הוא רץ גם בממשק הניהול, והוא רץ עבור כל שאילתה, כולל תפריטים, ווידג'טים וספריית המדיה. השמיטו את ההגנות is_admin() ו-is_main_query() ותשנו בשקט את מה שרשימת הפוסטים בניהול מציגה — באג שקשה באמת לאתר את מקורו. שימו לב גם: שנו את $query, אל תחזירו שום דבר.
מסנן את פסוקית ה-WHERE הגולמית ב-SQL של שאילתה.
מופעל
בזמן שה-SQL של השאילתה מורכב.
חתימה
add_filter( 'posts_where', 'my_callback', 10, 2 ); // receives $where, WP_Query $queryהמלכודת
אתם כותבים SQL גולמי. תמיד הגנו עם $query->is_main_query() ותמיד השתמשו ב-$wpdb->prepare() עבור כל קלט משתמש. זו הדרך המהירה ביותר להכניס SQL injection לאתר WordPress.
מסנן את המספר הכולל של הפוסטים שהשאילתה מצאה — שממנו מחושב העימוד.
מופעל
אחרי שהשאילתה רצה, לפני שהעימוד מחושב.
חתימה
add_filter( 'found_posts', 'my_callback', 10, 2 ); // receives $found_posts, WP_Query $queryקובע את גודל הפיקסלים שמעליו WordPress מקטין העלאה ומגיש עותק \"-scaled\" במקום המקור שלכם. ברירת מחדל 2560.
מופעל
בעת ההעלאה, כאשר WordPress מחליט אם תמונה היא \"גדולה\".
חתימה
add_filter( 'big_image_size_threshold', 'my_callback' ); // receives int $thresholdדוגמה
// Serve originals at full resolution — no -scaled copy.
add_filter( 'big_image_size_threshold', '__return_false' );
// Or just raise the ceiling:
add_filter( 'big_image_size_threshold', function () {
return 3840;
} );המלכודת
זו הסיבה הנפוצה ביותר ל\"התמונה שלי נראית מטושטשת אחרי ההעלאה ל-WordPress\", וכמעט אף אחד לא יודע שזה קיים. המקור שלכם עדיין נמצא בדיסק — הוא פשוט אף פעם לא מוגש. שימו לב שזה חל על הצלע הארוכה ביותר, ומשפיע רק על תמונות שהועלו אחרי שה-filter פעיל.
מסנן את מערך גדלי התמונות ש-WordPress עומד ליצור עבור העלאה. הסירו (unset) גודל כדי להפסיק ליצור אותו.
מופעל
בעת ההעלאה, לפני שהקבצים הנגזרים נוצרים.
חתימה
add_filter( 'intermediate_image_sizes_advanced', 'my_callback', 10, 2 ); // receives $sizes, $metadataדוגמה
add_filter( 'intermediate_image_sizes_advanced', function ( $sizes ) {
unset( $sizes['1536x1536'] );
unset( $sizes['2048x2048'] );
return $sizes;
} );המלכודת
הסרת גודל שערכת העיצוב שלכם באמת משתמשת בו פירושה ש-WordPress נופל חזרה למקור בגודל מלא — מה שגרוע יותר משטח הדיסק שחסכתם. וזה עוצר רק יצירה של קבצים חדשים; הקיימים נשארים עד שתייצרו אותם מחדש.
קובע את איכות ה-JPEG שבה WordPress מקודד מחדש תמונות שהועלו. ברירת מחדל 82.
מופעל
בכל פעם ש-WordPress כותב JPEG.
חתימה
add_filter( 'jpeg_quality', 'my_callback', 10, 2 ); // receives $quality, $contextהמלכודת
איכות 82 מתאימה לצילומים וגרועה באופן ניכר לצילומי מסך, לוגואים וגרפיקה שטוחה — לאלה יש קצוות חדים ואין רעש צילומי שיסתיר בו את הארטיפקטים. כמו כן: wp_editor_set_quality הוא ה-filter המודרני יותר ומכסה ישירות את מחלקות עורך התמונות; נהוג להגדיר את שניהם.
קובע את איכות הפלט שבה משתמשות מחלקות WP_Image_Editor (GD ו-Imagick).
מופעל
כאשר מופע של עורך תמונות קובע את איכותו.
חתימה
add_filter( 'wp_editor_set_quality', 'my_callback', 10, 2 ); // receives $quality, $mime_typeמוסיף את גדלי התמונות המותאמים שלכם לתפריט הנפתח של הגדלים בחלון המדיה ובעורך הבלוקים.
מופעל
כאשר ממשק המדיה בונה את בורר הגדלים שלו.
חתימה
add_filter( 'image_size_names_choose', 'my_callback' ); // receives $sizesדוגמה
add_filter( 'image_size_names_choose', function ( $sizes ) {
return array_merge( $sizes, array( 'card' => __( 'Card', 'textdomain' ) ) );
} );המלכודת
add_image_size() רושם את הגודל אבל לא הופך אותו לבחיר בעורך. כל שאלה מסוג \"גודל התמונה המותאם שלי לא מופיע בתפריט הנפתח\" נובעת מכך שה-filter הזה חסר.
בודק או דוחה קובץ לפני שהוא מועבר לתיקיית ההעלאות.
מופעל
במהלך ההעלאה, לפני שהקובץ נכתב.
חתימה
add_filter( 'wp_handle_upload_prefilter', 'my_callback' ); // receives $fileהמלכודת
כדי לדחות קובץ, הגדירו את $file['error'] למחרוזת הודעה והחזירו את $file. החזרת false או זריקת חריגה לא יעשו את מה שאתם רוצים.
מסנן את מערך המטא-נתונים (כולל הגדלים שנוצרו) אחרי שקובץ מצורף מעובד.
מופעל
אחרי שהתמונות הנגזרות נוצרות בעת ההעלאה.
חתימה
add_filter( 'wp_generate_attachment_metadata', 'my_callback', 10, 2 ); // receives $metadata, $attachment_idהמלכודת
זהו ה-hook שתוספי אופטימיזציית תמונות משתמשים בו. הוא יכול להיות איטי — הוא רץ אחרי שכל גודל תמונה נכתב, וביצוע בקשת HTTP כאן גורם לכל העלאה להמתין לו.
מסנן את מועמדי ה-srcset ש-WordPress יוצר עבור תמונה רספונסיבית.
מופעל
כאשר תמונה רספונסיבית מעובדת.
חתימה
add_filter( 'wp_calculate_image_srcset', 'my_callback', 10, 5 );המלכודת
הסרת הגודל medium_large (768w) במקום אחר פוגמת בשקט ב-srcset — הגודל הזה קיים כמעט אך ורק כדי לשרת אותו.
לא אימתנו את מספר הארגומנטים המדויק של ה-hook הזה מול קוד המקור של WordPress. בדקו ב-developer.wordpress.org לפני שאתם מסתמכים עליו. אנחנו מעדיפים לסמן את אי-הוודאות מאשר להגיש בשקט ניחוש כעובדה.
רושם עמודי תפריט ותת-תפריט בממשק הניהול.
מופעל
כאשר תפריט הניהול נבנה.
חתימה
add_action( 'admin_menu', 'my_callback' );דוגמה
add_action( 'admin_menu', function () {
add_options_page(
'My Plugin',
'My Plugin',
'manage_options', // capability — NOT a role
'my-plugin',
'my_render_settings_page'
);
} );המלכודת
ארגומנט ה-capability הוא יכולת (capability), לא תפקיד. העברת \"administrator\" נראית כאילו היא עובדת (כי למנהלים יש יכולת בשם הזה בחלק מההגדרות) ואז מעניקה בשקט גישה לאנשים הלא נכונים. השתמשו ב-manage_options.
מדפיס הודעה בראש מסך ניהול.
מופעל
בעת עיבוד עמוד ניהול.
חתימה
add_action( 'admin_notices', 'my_callback' );המלכודת
הוא מופעל על כל מסך ניהול. תוסף שמציג הודעת \"תודה על ההתקנה!\" ללא תנאי בכולם הוא הדפוס השנוא ביותר בממשק הניהול של WordPress. הגנו עליו, והפכו אותו לכזה שאפשר לסגור.
רץ בכל פעם שפוסט נוצר או מתעדכן. המקום הרגיל לשמור נתוני meta box.
מופעל
אחרי שפוסט נכתב למסד הנתונים.
חתימה
add_action( 'save_post', 'my_callback', 10, 3 ); // receives $post_id, $post, $updateדוגמה
add_action( 'save_post', function ( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if ( wp_is_post_revision( $post_id ) ) return;
if ( ! current_user_can( 'edit_post', $post_id ) ) return;
// ... now it is safe to save
}, 10, 1 );המלכודת
הוא מופעל על שמירות אוטומטיות ועל גרסאות (revisions) בנוסף לשמירות אמיתיות. ללא שלוש ההגנות שלמעלה, המטא שלכם נדרס בערכים ריקים בכל פעם שהעורך שומר אוטומטית — באג שנראה כמו נתונים שנעלמים באקראי.
רושם meta boxes במסך עריכת הפוסט.
מופעל
כאשר מסך העריכה נבנה.
חתימה
add_action( 'add_meta_boxes', 'my_callback', 10, 2 ); // receives $post_type, $postהמלכודת
meta boxes קלאסיים אינם מופיעים בעורך הבלוקים אלא אם כן העורך נופל חזרה למצב תאימות. עבור אתר מבוסס עורך בלוקים, רשמו post meta עם show_in_rest ובנו במקום זאת פאנל בסרגל הצד.
רץ אחרי שמשתמש מתחבר בהצלחה.
מופעל
בעת אימות מוצלח.
חתימה
add_action( 'wp_login', 'my_callback', 10, 2 ); // receives $user_login, WP_User $userרץ מיד אחרי שנוצר משתמש חדש.
מופעל
בעת ההרשמה.
חתימה
add_action( 'user_register', 'my_callback', 10, 2 ); // receives $user_id, $userdataמסנן את תוצאת האימות. החזירו WP_Error כדי לחסום התחברות.
מופעל
במהלך ניסיון ההתחברות.
חתימה
add_filter( 'authenticate', 'my_callback', 30, 3 ); // receives $user, $username, $passwordהמלכודת
העדיפות חשובה מאוד כאן. ליבת WordPress מחברת את הבדיקות שלה בעדיפויות 20 ו-30 — התחברו מוקדם מדי ותרוצו לפני שהסיסמה בכלל נבדקה.
רושם נתיבים ושדות של REST.
מופעל
כאשר ה-REST API מאותחל.
חתימה
add_action( 'rest_api_init', 'my_callback' );דוגמה
add_action( 'rest_api_init', function () {
register_rest_route( 'myplugin/v1', '/items', array(
'methods' => 'GET',
'callback' => 'my_get_items',
'permission_callback' => '__return_true', // BE DELIBERATE ABOUT THIS
) );
} );המלכודת
permission_callback הוא חובה — מאז WP 5.5 השמטתו מייצרת notice, והגדרתו ל-__return_true הופכת את ה-endpoint לציבורי לחלוטין. זה בסדר עבור נתונים ציבוריים באמת ופרצה חמורה עבור כל דבר אחר. החליטו, אל תישארו עם ברירת המחדל.
מוסיף מרווח חזרה מותאם עבור wp_schedule_event().
מופעל
כאשר WordPress בונה את רשימת התזמונים הזמינים שלו.
חתימה
add_filter( 'cron_schedules', 'my_callback' ); // receives $schedulesדוגמה
add_filter( 'cron_schedules', function ( $schedules ) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // seconds
'display' => __( 'Every 5 minutes', 'textdomain' ),
);
return $schedules;
} );המלכודת
WP-Cron אינו cron אמיתי. הוא מופעל רק כשמישהו מבקר באתר, כך שאתר עם תנועה נמוכה לא יריץ תזמון של חמש דקות כל חמש דקות. אם התזמון באמת חשוב, כבו את WP-Cron (DISABLE_WP_CRON) וקראו ל-wp-cron.php מ-cron מערכת אמיתי.
רץ מיד אחרי שתגובה נשמרת.
מופעל
בעת שליחת תגובה.
חתימה
add_action( 'comment_post', 'my_callback', 10, 3 ); // receives $comment_id, $approved, $commentdataמסנן נתוני תגובה לפני שהיא נשמרת. משמש לבדיקות ספאם ולאימות.
מופעל
לפני שהתגובה נכתבת.
חתימה
add_filter( 'preprocess_comment', 'my_callback' ); // receives $commentdataהמלכודת
כדי לדחות תגובה כאן, קראו ל-wp_die() עם הודעה — החזרת false לא עוצרת אותה.
רץ בעמוד \"ההזמנה התקבלה\" אחרי תשלום מוצלח.
מופעל
כאשר הלקוח מגיע לעמוד התודה.
חתימה
add_action( 'woocommerce_thankyou', 'my_callback' ); // receives $order_idהמלכודת
זה לא מקום אמין להפעלת מימוש הזמנה. הוא מופעל רק אם הלקוח באמת מגיע לעמוד התודה — אם הוא סוגר את הכרטיסייה אחרי התשלום, זה אף פעם לא רץ. השתמשו ב-woocommerce_payment_complete או ב-hook של מעבר סטטוס הזמנה עבור כל דבר שחייב לקרות.
מוציא סימון ממש לפני כפתור ההוספה לעגלה בעמוד מוצר.
מופעל
בזמן שעמוד המוצר מעובד.
חתימה
add_action( 'woocommerce_before_add_to_cart_button', 'my_callback' );מוסיף, מסיר או מסדר מחדש שדות בקופה הקלאסית.
מופעל
כאשר טופס הקופה נבנה.
חתימה
add_filter( 'woocommerce_checkout_fields', 'my_callback' ); // receives $fieldsהמלכודת
זה משפיע רק על הקופה הקלאסית (מבוססת shortcode). הקופה החדשה מבוססת-הבלוקים מתעלמת ממנו לחלוטין ומותאמת דרך Slot & Fill ב-JavaScript. זה מכשיל כמעט את כולם בפעם הראשונה.