ארכיונים: Snippets | עמוד 12

הצגת התמונה הראשית של הפוסט ב RSS Feed

אם אתם מעוניינים להציג את התמונה הראשית של הפוסט ב RSS (חיוני אם אתם משתמשים ב RSS עבור Mailchimp למשל), הוסיפו את הקוד הבא לקובץ functions.php:

// Put post thumbnails into rss feed
function savvy_feed_post_thumbnail($content) {
    global $post;
    if(has_post_thumbnail($post->ID)) {
        $content = '' . $content;
    }
    return $content;
}
add_filter('the_excerpt_rss', 'savvy_feed_post_thumbnail');
add_filter('the_content_feed', 'savvy_feed_post_thumbnail');

הוספת CSS לממשק הניהול של וורדפרס (Admin Area)

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

function my_custom_fonts() {
    echo '<style>
    body {
      font-size: 12px;
    } 
  </style>';
}

add_action('admin_head', 'my_custom_fonts');

שינוי אייקונים בעמוד התשלום של ווקומרס

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

<?php
/**
 * Add custom gateway icons
 * 
 * @param  string $icon       Image HTML.
 * @param  string $gateway_id Gateway ID.
 * 
 * @return string
 */
function custom_wc_gateway_icons( $icon, $gateway_id ) {
	// Example for PayPal:
	if ( 'paypal' == $gateway_id ) {
		$icon = '<img src="' . WC_HTTPS::force_https_url( 'http://your-site.com/image.png' ) . '" alt="' . __( 'PayPal' ) . '" />'
	}
	return $icon;
}
add_filter( 'woocommerce_gateway_icon', 'custom_wc_gateway_icons', 10, 2 );

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

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

בכדי לשנות את מספר הפריטים בעמוד ההזמנות של ווקומרס (ב Front) ניתן להשתמש בקוד הבא כאשר X הוא מספר הפריטים המקסימלי שיוצג (functions.php):

function custom_my_account_orders( $args ) {
    $args['posts_per_page'] = X;
    return $args;
}
add_filter( 'woocommerce_my_account_my_orders_query', 'custom_my_account_orders', 10, 1 );

עוד על ניהול וטיפול בהזמנות באתרי ווקומרס תמצאו בפוסט טיפול וניהול הזמנות (Orders) באתרי ווקומרס.

הוספת קישור לפירורי הלחם של Yoast SEO

הפילטר wpseo_breadcrumb_links מאפשר לכם להוסיף פריטים, להסיר פריטים או לשנות את הסדר שלהם בפירורי הלחם של Yoast SEO. דוגמה נפוצה היא הוספת קישור לבלוג מיד אחרי הקישור לעמוד הבית בעמודי פוסט בודד, כך שהתוצאה תהיה: Home › Blog › Post title.

אם אתם רוצים להסיר את הנתונים המובנים של פירורי הלחם, ראו את הסרת סכמת פירורי הלחם ב-Yoast. כדי לבטל את סכמת Yoast כולה, ראו ביטול סכמת Yoast SEO.

הקוד

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

function yoast_seo_breadcrumb_append_link( $links ) {
    if ( ! is_singular( 'post' ) ) {
        return $links;
    }

    $breadcrumb[] = array(
        'url'  => home_url( '/blog/' ),
        'text' => 'Blog',
    );

    array_splice( $links, 1, 0, $breadcrumb );

    return $links;
}
add_filter( 'wpseo_breadcrumb_links', 'yoast_seo_breadcrumb_append_link' );

כיצד זה עובד

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

כל פריט הוא מערך עם url ו-text. בנוסף, Yoast מוסיף מפתח שמזהה את סוג הפריט: id לפוסטים ולעמודים, term_id ו-taxonomy למונחים, ו-ptarchive לארכיוני סוגי תוכן.

הקריאה array_splice( $links, 1, 0, $breadcrumb ) מכניסה את הפריט החדש במיקום 1, מיד אחרי עמוד הבית, בלי להסיר שום פריט. הארגומנט השלישי חייב להיות 0. כל ערך אחר (למשל -2) ימחק בלי התרעה פריטים מרשימות פירורי לחם ארוכות יותר.

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

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

בדקו קודם את ההגדרה המובנית

אם עמוד הבית שלכם מוגדר כעמוד סטטי והגדרתם ״Posts page״ תחת ״הגדרות > קריאה״, יכול להיות שלא תצטרכו קוד בכלל.

תחת ״Yoast SEO > Settings > Advanced > Breadcrumbs״, ההגדרה Show blog page in breadcrumbs מוסיפה את אותו עמוד לפירורי הלחם בפוסטים בודדים.

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

דוגמאות נוספות ל-wpseo_breadcrumb_links

הגרסה הבאה מוסיפה עמוד מרכזי (hub) לפני הפריט הנוכחי בסוג תוכן מותאם. היסט (offset) שלילי נספר מהסוף, כך ש--1 ממקם אותו מיד לפני הפריט האחרון:

add_filter( 'wpseo_breadcrumb_links', function( $links ) {
    if ( ! is_singular( 'snippet' ) ) {
        return $links;
    }

    $new_crumb = array(
        array(
            'url'  => home_url( '/resources/' ),
            'text' => 'Resources',
        ),
    );

    array_splice( $links, -1, 0, $new_crumb );

    return $links;
} );

הדוגמה הבאה מסירה את פריטי הקטגוריה מפירורי הלחם:

add_filter( 'wpseo_breadcrumb_links', function( $links ) {
    foreach ( $links as $i => $link ) {
        if ( isset( $link['taxonomy'] ) && 'category' === $link['taxonomy'] ) {
            unset( $links[ $i ] );
        }
    }
    return array_values( $links );
} );

כמה כללים לשימוש בטוח בפילטר:

  • החזירו תמיד מערך. Yoast מתעלם מכל ערך אחר ורושם הודעת ״doing it wrong״.
  • הקפידו שלכל פריט יהיו גם url וגם text. אם אחד מהם חסר, Yoast לא ידפיס את סכמת ה-BreadcrumbList באותו עמוד.
  • Yoast מדפיס את text כפי שהוא, לכן עטפו ערכים דינמיים כמו כותרות פוסטים ב-esc_html().

לסקירה רחבה יותר על אפשרויות פירורי הלחם, קראו את הפוסט כיצד להוסיף פירורי לחם לאתרי וורדפרס. הפילטר עצמו מוגדר בקובץ ה-breadcrumbs generator בקוד המקור של Yoast.

שאלות נפוצות

הנה כמה שאלות נפוצות על הפילטר wpseo_breadcrumb_links:

האם wpseo_breadcrumb_links משנה גם את סכמת פירורי הלחם?
כן. Yoast בונה גם את פירורי הלחם ב-HTML וגם את ה-JSON-LD של BreadcrumbList מאותו מערך מסונן. פילטרים כמו wpseo_breadcrumb_single_link ו-wpseo_breadcrumb_output משנים רק את ה-HTML.
האם יש שורטקוד לפירורי הלחם של Yoast?
כן, [wpseo_breadcrumb]. בקבצי תבנית PHP השתמשו ב-yoast_breadcrumb( '<p id="breadcrumbs">', '</p>' ), שמדפיס רק כאשר ההגדרה ״Enable breadcrumbs for your theme״ פעילה או כאשר התבנית מצהירה על תמיכה בפירורי הלחם. הפילטר חל על כל האפשרויות האלו.
למה הפריט החדש לא מופיע בפירורי הלחם?
ודאו שההתניה שלכם תואמת לעמוד (למשל is_singular( 'post' ) לא תרוץ בעמודים), שהפונקציה מחזירה את $links, ונקו את ה-cache של העמודים. כמו כן, ודאו שפירורי הלחם בעמוד אכן מגיעים מ-Yoast ולא מהתבנית או מ-WooCommerce.

כיצד להגדיל Maximum Execution Time באתרי וורדפרס

אם נתקלתם בהודעה "Maximum execution time of 30 seconds exceeded", פירוש הדבר שסקריפט PHP רץ יותר זמן מהמותר לפי ההגדרה max_execution_time. בוורדפרס זה קורה בדרך כלל בזמן עדכונים, ייבוא תוכן וגיבויים.

בפוסט הזה תמצאו את הדרכים להגדיל את max_execution_time, ואיך לדעת באיזו מהן השרת שלכם תומך. לפתרון מהיר של השגיאה עצמה, הציצו בסניפט תיקון השגיאה Maximum Execution Time Exceeded בוורדפרס.

בדקו קודם את הערך הנוכחי

היכנסו אל כלים > בריאות האתר > מידע ופתחו את החלק שרת (Server).

  • PHP time limit הוא הערך הנוכחי של max_execution_time בשניות.
  • PHP SAPI מראה לכם איזו שיטה תעבוד: apache2handler הוא Apache mod_php, fpm-fcgi הוא PHP-FPM ו-litespeed הוא LiteSpeed.

חזרו למסך הזה אחרי כל שינוי כדי לוודא ש-PHP אכן קלט את הערך החדש.

הגדלת max_execution_time בוורדפרס

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

1. wp-config.php (עובד בכל שרת)

הוסיפו את הקוד הבא לקובץ wp-config.php, מעל השורה /* That's all, stop editing! */:

if ( function_exists( 'set_time_limit' ) ) {
	set_time_limit( 300 );
}

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

2. .user.ini (PHP-FPM ו-CGI)

ב-PHP-FPM (התצורה הנפוצה ביותר כיום), צרו קובץ .user.ini באותה תיקייה שבה נמצא wp-config.php:

max_execution_time = 300
max_input_time = 300

כברירת מחדל, PHP קורא את הקובץ מחדש כל 5 דקות (user_ini.cache_ttl), כך שייתכן שהשינוי לא ייכנס לתוקף מיד.

3. .htaccess (Apache mod_php או LiteSpeed)

גבו קודם את הקובץ .htaccess, ולאחר מכן הוסיפו את השורה הבאה:

php_value max_execution_time 300

השיטה הזו עובדת רק עם Apache mod_php או LiteSpeed. ב-Apache עם PHP-FPM ההנחיה php_value אינה מוכרת, והאתר יחזיר שגיאת 500. במקרה כזה הסירו אותה והשתמשו ב-.user.ini.

4. php.ini (שרת VPS או שרת ייעודי)

אם יש לכם שליטה על השרת, הגדירו את הערך ב-php.ini והפעילו מחדש את PHP-FPM או את Apache. באחסון משותף השתמשו במסך הגדרות ה-PHP בלוח הבקרה של חברת האחסון.

max_execution_time = 300

איך max_execution_time עובד

ההנחיה קובעת כמה שניות סקריפט רשאי לרוץ (30 כברירת מחדל). קריאה ל-set_time_limit() משנה את המגבלה בזמן ריצה ומאפסת את המונה.

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

max_input_time היא מגבלה נפרדת לעיבוד הקלט של הבקשה (למשל נתוני POST והעלאת קבצים). ערך ברירת המחדל שלה הוא -1, כלומר היא משתמשת בערך של max_execution_time. לא ניתן לשנות אותה עם set_time_limit() או ini_set(), אלא רק ב-.user.ini, ב-.htaccess או ב-php.ini.

כשהגדלת המגבלה של PHP אינה מספיקה

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

  • ההגדרה request_terminate_timeout של PHP-FPM הורגת את ה-worker אחרי זמן מוגדר. היא כבויה כברירת מחדל, אך חברות אחסון רבות מפעילות אותה.
  • ערך ברירת המחדל של fastcgi_read_timeout ב-Nginx הוא 60 שניות.
  • Cloudflare מחזירה שגיאת 524 אם שרת המקור לא מגיב תוך 125 שניות (בחבילות שאינן Enterprise).

רק חברת האחסון יכולה להגדיל את הערכים האלה. למשימות כבדות חד פעמיות השתמשו ב-WP-CLI: בשורת הפקודה ערך ברירת המחדל של max_execution_time הוא 0, כלומר אין מגבלה כלל.

WP-Cron רץ כבקשת web רגילה, ולכן גם עליו חלות אותן מגבלות. למשימות מתוזמנות ארוכות, בטלו את WP-Cron והשתמשו ב-cron job אמיתי בשרת שמריץ את wp cron event run --due-now.

הציצו גם בפוסט אופטימיזציה לקונפיגורציה של וורדפרס באמצעות wp-config.php ובתיעוד ההנחיה במדריך של PHP.

שאלות נפוצות

הנה כמה שאלות נפוצות על מגבלת הזמן של PHP בוורדפרס:

מהו ערך ברירת המחדל של max_execution_time בוורדפרס?
וורדפרס לא מגדירה ערך גלובלי. היא יורשת את הגדרת ה-PHP, שברירת המחדל שלה היא 30 שניות, אם כי חברות אחסון רבות משתמשות בערך שבין 60 ל-300. ליבת וורדפרס מגדילה את המגבלה באופן זמני עם set_time_limit() בזמן עדכונים.
למה php_value max_execution_time ב-.htaccess לא עובד?
רק Apache mod_php ו-LiteSpeed מכירים את ההנחיה php_value. ב-PHP-FPM היא גורמת לשגיאת 500. בדקו את PHP SAPI במסך בריאות האתר, ואם מופיע שם fpm-fcgi השתמשו ב-.user.ini.
כיצד מגדילים את max_input_time בוורדפרס?
הגדירו max_input_time = 300 ב-.user.ini או ב-php.ini, או php_value max_input_time 300 ב-.htaccess כאשר השרת עובד עם mod_php. לא ניתן לשנות אותה מתוך wp-config.php מכיוון ש-PHP לא מאפשר זאת בזמן ריצה.
האם אפשר להגדיר את max_execution_time ל-0?
כן, הערך 0 מבטל את המגבלה של PHP. עם זאת, סקריפט שנתקע יחזיק אז את ה-worker של PHP עד ש-timeout ברמת השרת יעצור אותו. ערך סופי כמו 300 בטוח יותר באתר חי.

הסרת פירורי לחם של ווקומרס בעמודים מסויימים

אם אתם מחפשים דרך להסיר את פירורי הלחם (Breadcrumbs) באתרים העובדים עם ווקומרס, תוכלו לעשות זאת בצורה הבאה:

/**
 * Remove the breadcrumbs
 */
function savvy_remove_shop_breadcrumbs() {
    if (is_shop()) {

        remove_action('woocommerce_before_main_content', 'woocommerce_breadcrumb', 20);
    }
}
add_action('init', 'savvy_remove_shop_breadcrumbs');

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

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

הדוגמה הבאה תגביל את אפשרות העלאת הקבצים בספריית המדיה רק עבור קבצי JPG ו GIF. אם אתם מעוניינים לאפשר גם קבצי PNG לצורך העניין הוסיפו את השורה 'png' => 'image/png' לקוד זה:

function savvy_restrict_mime($mimes) {
    $mimes = array(
        'jpg|jpeg|jpe' => 'image/jpeg',
        'gif' => 'image/gif',
    );
    return $mimes;
}
add_filter('upload_mimes','savvy_restrict_mime');

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

הוספת קישור לפוסט המלא בתקציר הפוסט

אם אתם מעוניינים להוסיף קישור לפוסט המלא בסוף תקציר (excerpt) הפוסט, ניתן לעשות זאת בצורה הבאה. הוסיפו את הקוד הבא לקובץ functions.php:

function savvy_excerpt_link_post($text) {
    return str_replace( '[...]', '<a href="'. get_permalink( get_the_ID() ) . '" title="' . esc_attr( get_the_title( get_the_ID() ) ) . '">' . '[&hellip;]' . '</a>', $text );
}
add_filter('the_excerpt', 'savvy_excerpt_link_post');

קוד זה משתמש בפילטר excerpt_more. למידע נוסף בהבנת הוקים בוורדפרס.