סניפטים וקטעי קוד

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

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

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

הסתרת מוצרים שאזלו מהמלאי בווקומרס

ניתן להסתיר מוצרים שאזלו מהמלאי מעמודי הקטלוג והחיפוש. הדרך הפשוטה ביותר היא דרך הגדרות ווקומרס: WooCommerce > Settings > Products > Inventory > "Hide out of stock items from the catalog". אם אתם מעדיפים דרך קוד, הוסיפו ל-functions.php. לעוד על ניהול מלאי בווקומרס.

add_action( 'pre_get_posts', function( $query ) {
	if ( ! is_admin() && $query->is_main_query() && ( is_shop() || is_product_category() || is_product_tag() ) ) {
		$query->set( 'meta_query', array(
			array(
				'key'     => '_stock_status',
				'value'   => 'instock',
				'compare' => '=',
			),
		) );
	}
} );

שינוי סמל המטבע בווקומרס

אם אתם רוצים לשנות את סמל המטבע שווקומרס מציגה (למשל להחליף "$" ב-"USD" או להוסיף רווח), הוסיפו את הקוד הבא לקובץ functions.php. לעוד על הוקים של ווקומרס.

add_filter( 'woocommerce_currency_symbol', function( $symbol, $currency ) {
	switch ( $currency ) {
		case 'USD':
			$symbol = 'USD ';
			break;
		case 'ILS':
			$symbol = '₪ ';
			break;
	}
	return $symbol;
}, 10, 2 );

שנו את ערכי ה-case וה-$symbol בהתאם לצורך.

הוספת תדירות Cron מותאמת בוורדפרס

ליבת וורדפרס מגיעה עם ארבע תדירויות ל-WP-Cron: hourly, twicedaily, daily ו-weekly. אם אתם צריכים תדירות אחרת (למשל כל 5 דקות), הגדירו תדירות מותאמת עם הפילטר cron_schedules, ורק לאחר מכן תזמנו את האירוע עם wp_schedule_event().

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

הוספת תדירות Cron מותאמת

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

// 1. Register the interval.
add_filter( 'cron_schedules', function ( $schedules ) {
	$schedules['every_five_minutes'] = array(
		'interval' => 5 * MINUTE_IN_SECONDS,
		'display'  => 'Every 5 Minutes',
	);
	return $schedules;
} );

// 2. Schedule the event once, if it isn't scheduled yet.
add_action( 'init', function () {
	if ( ! wp_next_scheduled( 'my_custom_cron_event' ) ) {
		wp_schedule_event( time(), 'every_five_minutes', 'my_custom_cron_event' );
	}
} );

// 3. The task that runs on each interval.
add_action( 'my_custom_cron_event', function () {
	// Your code here.
} );

כיצד זה עובד

הפילטר cron_schedules מאפשר לכם להוסיף רשומות לרשימת התדירויות. כל רשומה צריכה מפתח ייחודי, interval בשניות ותווית display שמוצגת בכלים כמו WP-CLI.

wp_schedule_event( $timestamp, $recurrence, $hook ) שומרת את האירוע. ההרצה הראשונה מתבצעת ב-$timestamp, ולאחר מכן בכל פעם שהתדירות שהגדרתם חולפת. הבדיקה wp_next_scheduled() מונעת יצירה של אירוע כפול בכל טעינת עמוד.

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

תדירויות ה-Cron המובנות בוורדפרס

התדירויות הבאות זמינות בלי להוסיף שום פילטר. התדירות weekly נוספה בוורדפרס 5.4.

מפתח תדירות (בשניות) שם תצוגה
hourly 3600 Once Hourly
twicedaily 43200 Twice Daily
daily 86400 Once Daily
weekly 604800 Once Weekly

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

טעויות נפוצות

רוב הבעיות ב-WP-Cron עם תדירויות מותאמות נובעות מאחת הטעויות הבאות.

  • תזמון לפני שהפילטר קיים. אם התדירות אינה רשומה ברגע ש-wp_schedule_event() רצה, הפונקציה מחזירה false (או WP_Error עם הקוד invalid_schedule כאשר אתם מעבירים true כארגומנט החמישי).
  • החלפת מפתח התדירות של האירוע. אם תשנו את 'every_five_minutes' בקריאה ל-wp_schedule_event(), האירוע הקיים ישמור על התדירות הישנה שלו, מכיוון ש-wp_next_scheduled() עדיין מוצאת אותו. הריצו פעם אחת את wp_clear_scheduled_hook( 'my_custom_cron_event' ) ותנו לקוד לתזמן אותו מחדש.
  • אי ניקוי בסיום. בתוסף, נקו את ההוק בזמן ההשבתה עם register_deactivation_hook(), כדי שהאירוע לא ימשיך לרוץ לשווא.
  • ציפייה לתזמון מדויק. WP-Cron רץ רק כשמישהו מבקר באתר, כך שמשימה של 5 דקות באתר עם מעט תנועה תרוץ באיחור.

לתזמון אמין, הגדירו את DISABLE_WP_CRON כ-true והפעילו את ה-cron מהשרת. במילים אחרות, בטלו את WP-Cron והשתמשו ב-cron job אמיתי בשרת.

כדי לוודא שהתדירות והאירוע נרשמו, הריצו את פקודות ה-WP-CLI הבאות:

wp cron schedule list
wp cron event list

רשימת הפרמטרים המלאה נמצאת בתיעוד של wp_schedule_event().

שאלות נפוצות

הנה כמה שאלות נפוצות על תדירויות WP-Cron מותאמות:

מהן תדירויות ה-Cron המובנות בוורדפרס?
hourly, twicedaily, daily ו-weekly. התדירות weekly קיימת החל מוורדפרס 5.4, ולכן מדריכים ישנים מציגים רק שלוש.
האם חובה להוסיף את הפילטר cron_schedules לפני wp_schedule_event()?
כן. wp_schedule_event() בודקת את התדירות מול התדירויות הרשומות ברגע שהיא רצה. אם הפילטר שלכם עוד לא מחובר, האירוע לא יתוזמן.
למה אירוע ה-Cron המותאם שלי לא רץ בזמן?
WP-Cron מופעל על ידי ביקורים בעמודים ולא לפי השעון. באתרים עם מעט תנועה, בטלו אותו עם DISABLE_WP_CRON וקראו ל-wp-cron.php או ל-wp cron event run --due-now מתוך cron job בשרת.
כיצד מסירים אירוע Cron מתוזמן?
קראו ל-wp_clear_scheduled_hook( 'my_custom_cron_event' ), או הריצו wp cron event delete my_custom_cron_event עם WP-CLI. הסירו גם את קוד התזמון, אחרת הוא יוסיף את האירוע בחזרה בטעינת העמוד הבאה.

הגדלת גודל קובץ מקסימלי להעלאה בוורדפרס

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

אפשרות 1 – קובץ .htaccess:

php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value max_execution_time 300
php_value max_input_time 300

אפשרות 2 – קובץ wp-config.php:

@ini_set( 'upload_max_filesize', '64M' );
@ini_set( 'post_max_size', '64M' );
@ini_set( 'max_execution_time', '300' );

אפשרות 3 – קובץ php.ini:

upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300

החליפו 64M בגודל הרצוי.

הגדלת מגבלת הזיכרון בוורדפרס

אם אתם נתקלים בשגיאת "Allowed memory size exhausted", הגדילו את מגבלת הזיכרון של וורדפרס. הוסיפו את השורות הבאות לקובץ wp-config.php לפני השורה "That's all, stop editing!". לעוד על אופטימיזציה של wp-config.php.

define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );

WP_MEMORY_LIMIT משפיע על ה-Frontend ו-WP_MAX_MEMORY_LIMIT על ממשק הניהול. אם השינוי לא עוזר, ייתכן שיש מגבלה ברמת השרת ויש לפנות לחברת האחסון.

קביעת סכום הזמנה מינימלי בווקומרס

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

add_action( 'woocommerce_checkout_process', function() {
	$minimum = 50;
	if ( WC()->cart->get_subtotal() < $minimum ) {
		wc_add_notice(
			sprintf( 'סכום ההזמנה המינימלי הוא %s. סכום העגלה הנוכחי: %s.',
				wc_price( $minimum ),
				wc_price( WC()->cart->get_subtotal() )
			), 'error'
		);
	}
} );

add_action( 'woocommerce_before_cart', function() {
	$minimum = 50;
	if ( WC()->cart->get_subtotal() < $minimum ) {
		wc_print_notice(
			sprintf( 'סכום ההזמנה המינימלי הוא %s. הוסיפו מוצרים נוספים לעגלה.',
				wc_price( $minimum )
			), 'notice'
		);
	}
} );

החליפו 50 בסכום המינימלי הרצוי.

הסרת מוצרים קשורים בווקומרס

ווקומרס מציגה מוצרים קשורים בתחתית עמוד המוצר כברירת מחדל. אם אתם רוצים להסיר אותם, הוסיפו את הקוד הבא לקובץ functions.php. לעוד על הוקים של ווקומרס.

remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );

אם אתם מעוניינים רק לשנות את מספר המוצרים הקשורים המוצגים במקום להסיר לגמרי:

add_filter( 'woocommerce_output_related_products_args', function( $args ) {
	$args['posts_per_page'] = 3;
	$args['columns'] = 3;
	return $args;
} );

הפניית HTTP ל-HTTPS באמצעות htaccess בוורדפרס

כדי לכפות HTTPS בוורדפרס על שרת Apache או LiteSpeed, הוסיפו חוק הפניה 301 לקובץ .htaccess. כך כל בקשת HTTP תופנה לאותה כתובת בדיוק ב-HTTPS, והגולשים (וגם מנועי החיפוש) יראו רק גרסה אחת של כל עמוד.

התקינו קודם את תעודת ה-SSL וודאו שגרסת ה-HTTPS נטענת ללא שגיאות. לתהליך המעבר המלא, כולל טיפול בתוכן מעורב (Mixed Content), הציצו במדריך להעברת אתר וורדפרס ל-HTTPS.

הקוד לכפיית HTTPS בקובץ .htaccess

פתחו את קובץ ה-.htaccess שבתיקייה הראשית של וורדפרס (התיקייה שבה נמצא הקובץ wp-config.php) והוסיפו את השורות הבאות בתחילת הקובץ, מעל הבלוק # BEGIN WordPress:

# Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# BEGIN WordPress
# (the rules WordPress generated stay here, unchanged)
# END WordPress

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

כיצד הקוד עובד

כך עובד כל חלק:

  • RewriteCond %{HTTPS} off תופס בקשות שלא הגיעו דרך SSL/TLS. שרת Apache מגדיר את HTTPS כ-on עבור חיבורים מוצפנים.
  • RewriteRule ^(.*)$ תופס כל נתיב ומפנה אותו ל-https:// יחד עם הדומיין והנתיב שהתבקשו. ה-Query String מועבר אוטומטית.
  • R=301 הופך את ההפניה לקבועה, וכך מנועי החיפוש יודעים לאנדקס את כתובת ה-HTTPS. ללא קוד סטטוס, Apache שולח הפניה זמנית מסוג 302. הדגל L עוצר את שאר החוקים עבור אותה בקשה.

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

שימו לב שדפדפנים שומרים הפניות 301 ב-cache לאורך זמן. בזמן הבדיקות השתמשו ב-R=302, בדקו כמה כתובות, ורק אז החליפו ל-R=301.

עדכון כתובות וורדפרס ל-HTTPS

וורדפרס עדיין בונה את הקישורים לפי ההגדרות שלה. היכנסו להגדרות > כללי ושנו גם את הכתובת של וורדפרס וגם את הכתובת של האתר ל-https://.

אם השדות האלה אפורים (כלומר לא ניתנים לעריכה), הערכים מוגדרים בקובץ wp-config.php. עדכנו אותם שם:

define( 'WP_HOME', 'https://example.com' );
define( 'WP_SITEURL', 'https://example.com' );

קישורי http:// ישנים בתוכן הפוסטים גורמים לאזהרות על תוכן מעורב. עם WP-CLI תוכלו להחליף אותם במסד הנתונים (גבו קודם, והסירו את --dry-run כשהדו"ח נראה תקין):

wp search-replace 'http://example.com' 'https://example.com' --skip-columns=guid --dry-run

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

לולאת הפניות מאחורי Cloudflare, Proxy או Load Balancer

כאשר ה-SSL מסתיים ב-Proxy או ב-Load Balancer, אותו Proxy מתקשר עם השרת שלכם ב-HTTP רגיל. במצב כזה %{HTTPS} תמיד off, כל בקשה מופנית שוב, והדפדפן מציג את השגיאה ״too many redirects״.

במקום %{HTTPS}, בדקו את ה-header בשם X-Forwarded-Proto שה-Proxy שולח:

# Force HTTPS behind a proxy that sets X-Forwarded-Proto
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

הסתמכו על ה-header הזה רק כאשר ה-Proxy בשליטתכם והוא דורס את ה-header בכל בקשה. התיעוד של Apache על כפיית HTTPS מתאר את התצורה הזו ואת ההסתייגות לגביה.

וורדפרס צריכה לדעת גם שהבקשה המקורית הגיעה ב-HTTPS. הוסיפו את הקוד הבא ל-wp-config.php, מעל השורה ״That's all, stop editing!״:

if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https' ) !== false ) {
    $_SERVER['HTTPS'] = 'on';
}

ב-Cloudflare, הסיבה הנפוצה היא מצב ה-SSL/TLS בשם Flexible, שבו Cloudflare מתחבר לשרת שלכם ב-HTTP. הגדירו את המצב ל-Full (strict) עם תעודה תקפה על השרת, כפי שמתואר במדריך פתרון לולאות ההפניה של Cloudflare.

שרת Nginx אינו קורא את .htaccess

שרתי Nginx מתעלמים מקבצי .htaccess, כך שהקוד שלמעלה לא יעשה דבר. הוסיפו בלוק server שמאזין לפורט 80 ומפנה ל-HTTPS:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

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

שאלות נפוצות

הנה כמה שאלות שעולות לא מעט לגבי כפיית HTTPS בוורדפרס:

היכן בקובץ .htaccess צריך למקם את חוק כפיית ה-HTTPS?
בראש הקובץ, מעל # BEGIN WordPress. אם תמקמו אותו אחרי החוקים של וורדפרס הוא לא ירוץ עבור כתובות של פוסטים ועמודים, ואם תמקמו אותו בתוך סימוני וורדפרס הוא יימחק כשהקישורים הקבועים יישמרו.
מדוע מופיעה השגיאה ״too many redirects״ אחרי כפיית HTTPS?
בדרך כלל ה-SSL מסתיים ב-Proxy כמו Cloudflare, כך שהשרת שלכם רואה כל בקשה כ-HTTP וממשיך להפנות. בדקו את X-Forwarded-Proto במקום %{HTTPS}, וב-Cloudflare שנו את מצב ה-SSL/TLS מ-Flexible ל-Full (strict).
האם הפניית ה-HTTPS צריכה להיות 301 או 302?
באתר החי השתמשו ב-301, מכיוון שהמעבר ל-HTTPS הוא קבוע ומנועי החיפוש צריכים לאנדקס את כתובות ה-HTTPS. בזמן בדיקות השתמשו ב-302, מכיוון שדפדפנים שומרים הפניות 301 ב-cache.
האם ההפניה ב-.htaccess פותרת אזהרות תוכן מעורב (Mixed Content)?
לא. תוכן מעורב נובע מכתובות http:// בתוך העמודים עצמם, למשל תמונות בתוכן הפוסטים. עדכנו את הכתובת של וורדפרס ואת הכתובת של האתר ל-HTTPS, והחליפו את הכתובות הישנות במסד הנתונים.

הוספת Meta Box מותאם לעורך הפוסטים בוורדפרס

הוספת meta box מותאם לעורך הפוסטים עבור שמירת נתונים נוספים ללא תוסף כמו ACF. לעוד על רישום שדות מותאמים.

add_action( 'add_meta_boxes', function () {
    add_meta_box(
        'savvy_post_subtitle',
        'Post Subtitle',
        'savvy_subtitle_metabox_html',
        'post',
        'normal',
        'high'
    );
} );

function savvy_subtitle_metabox_html( $post ) {
    $value = get_post_meta( $post->ID, '_savvy_subtitle', true );
    wp_nonce_field( 'savvy_subtitle_nonce', 'savvy_subtitle_nonce' );
    printf(
        '<input type="text" name="savvy_subtitle" value="%s" style="width:100%%;" />',
        esc_attr( $value )
    );
}

add_action( 'save_post', function ( $post_id ) {
    if ( ! isset( $_POST['savvy_subtitle_nonce'] ) ||
         ! wp_verify_nonce( $_POST['savvy_subtitle_nonce'], 'savvy_subtitle_nonce' ) ) {
        return;
    }

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }

    if ( isset( $_POST['savvy_subtitle'] ) ) {
        update_post_meta(
            $post_id,
            '_savvy_subtitle',
            sanitize_text_field( $_POST['savvy_subtitle'] )
        );
    }
} );

הוסיפו ל-functions.php. שנו את מפתח ה-meta, הכותרת וסוג ה-input בהתאם לצרכים שלכם.

טעינת סקריפטים רק בעמודי ניהול ספציפיים

כדי לטעון סקריפט רק בעמוד ניהול ספציפי בוורדפרס, השתמשו בהוק admin_enqueue_scripts ובדקו את הפרמטר $hook_suffix לפני הקריאה ל-wp_enqueue_script(). בלי הבדיקה הזו, הקבצים שלכם ייטענו בכל מסך ב-wp-admin.

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

טעינת סקריפטים רק במסך עריכת פוסט

הוסיפו את הקוד הבא לקובץ functions.php של תבנית הבת שלכם או לתוסף. הוא טוען קובץ CSS וסקריפט רק בעת הוספה או עריכה של פוסט.

add_action( 'admin_enqueue_scripts', function ( $hook_suffix ) {
    // Only load on the post edit screens.
    if ( 'post.php' !== $hook_suffix && 'post-new.php' !== $hook_suffix ) {
        return;
    }

    wp_enqueue_style(
        'savvy-admin-custom',
        get_stylesheet_directory_uri() . '/css/admin-custom.css',
        array(),
        '1.0.0'
    );

    wp_enqueue_script(
        'savvy-admin-custom',
        get_stylesheet_directory_uri() . '/js/admin-custom.js',
        array( 'jquery' ),
        '1.0.0',
        true
    );
} );

הקוד משתמש ב-get_stylesheet_directory_uri(), שמחזירה את ה-URI של תבנית הבת כשאחת כזו פעילה. בתוסף, השתמשו במקום זאת ב-plugins_url( 'js/admin-custom.js', __FILE__ ).

איך עובד הפרמטר $hook_suffix

וורדפרס מפעילה את admin_enqueue_scripts ב-header של ממשק הניהול ומעבירה ארגומנט אחד, $hook_suffix, שמזהה את עמוד הניהול הנוכחי. סיימו את הפונקציה מוקדם כשהערך אינו תואם (כלומר, כשזה לא העמוד שלכם), ושום דבר לא ייטען.

במסכי הליבה הערך הוא שם קובץ ה-PHP:

  • index.php ללוח הבקרה
  • edit.php לרשימות הפוסטים, post.php ו-post-new.php לעורך
  • upload.php לספריית המדיה
  • options-general.php להגדרות > כללי

עמודים שנוספו עם add_menu_page() או add_submenu_page() מקבלים ערך שנבנה מתפריט האב ומה-slug של העמוד, למשל toplevel_page_my-plugin, settings_page_my-plugin או tools_page_my-plugin.

איך למצוא את ה-Hook Suffix של כל עמוד ניהול

אין צורך לנחש את הערך. השתמשו באחת השיטות הבאות.

  1. בדקו את ה-class של ה-body. וורדפרס מוסיפה עותק מנוקה (sanitized) של ה-hook suffix ל-class של תגית ה-<body> בממשק הניהול. בדקו את העמוד וחפשו classes כמו post-php או settings_page_my-plugin.
  2. כתבו אותו ללוג. הוסיפו זמנית את error_log( $hook_suffix ); בתוך ה-callback ובדקו את הקובץ debug.log.
  3. שמרו את הערך המוחזר. הפונקציות add_*_page() מחזירות את ה-hook suffix של העמוד שהן רושמות.

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

add_action( 'admin_menu', function () {
    $hook_suffix = add_options_page(
        'Savvy Settings',
        'Savvy Settings',
        'manage_options',
        'savvy-settings',
        'savvy_render_settings_page'
    );

    add_action( 'admin_enqueue_scripts', function ( $current ) use ( $hook_suffix ) {
        if ( $current !== $hook_suffix ) {
            return;
        }
        wp_enqueue_script( 'savvy-settings', plugins_url( 'js/settings.js', __FILE__ ), array(), '1.0.0', true );
    } );
} );

הגבלה לסוג תוכן אחד

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

add_action( 'admin_enqueue_scripts', function ( $hook_suffix ) {
    $screen = get_current_screen();

    if ( ! in_array( $hook_suffix, array( 'post.php', 'post-new.php' ), true )
        || ! $screen || 'product' !== $screen->post_type ) {
        return;
    }

    // Enqueue your product-only files here.
} );

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

שאלות נפוצות

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

מהו הפרמטר $hook ב-admin_enqueue_scripts?
זהו ה-$hook_suffix של עמוד הניהול הנוכחי, למשל edit.php או toplevel_page_my-plugin. שם המשתנה ב-callback שלכם לא משנה, $hook ו-$hook_suffix מקבלים את אותו הערך.
האם להשוות את $hook_suffix או את get_current_screen()->id?
שתי האפשרויות עובדות, אך הן שונות. ה-$hook_suffix של רשימת הפוסטים הוא edit.php, בעוד שמזהה המסך הוא edit-post. השתמשו באובייקט המסך כאשר אתם צריכים גם את סוג התוכן או את הטקסונומיה.
מהו ה-handle בשם 'common' ב-wp-admin?
הליבה רושמת גם סקריפט וגם קובץ CSS בשם common (wp-admin/js/common.js ו-wp-admin/css/common.css). תוכלו להגדיר אותו כתלות בכדי שה-CSS או ה-JS של ממשק הניהול שלכם ייטענו אחריו.
למה הסקריפט שלי לא נטען בעמוד ההגדרות של התוסף שלי?
כנראה שה-hook suffix אינו מה שציפיתם. בדקו את ה-class של תגית ה-<body> או כתבו את $hook_suffix ללוג באותו עמוד, והשוו מול הערך המדויק.