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

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

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

function single_result() {
    if (is_search()) {
        global $wp_query;
        if ($wp_query->post_count == 1) {
            wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
        }
    }
}

add_action('template_redirect', 'single_result');

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

עיצוב anchor tags לפי סוג הקישור

קוד זה מכוון לשיפור חווית המשתמש. לא מעט פעמים אנו נתקלים במצב בו אנו לוחצים על קישורים אשר איננו יודעים לאן הם מובילים. קוד זה יכול לשפר את חווית המשתמש על ידי הוספת אייקונים קטנים ליד הקישור ולהראות לגולש כי זהו לינק חיצוני – אימייל / קובץ pdf / תמונה וכו׳…

/* external links */
a[href^="http://"]{
    padding-right: 20px;
    background: url(external.gif) no-repeat center right;
}
 
/* emails */
a[href^="mailto:"]{
    padding-right: 20px;
    background: url(email.png) no-repeat center right;
}
 
/* pdfs */
a[href$=".pdf"]{
    padding-right: 20px;
    background: url(pdf.png) no-repeat center right;
}

לעוד על עיצוב קישורים, תנו מבט בעיצוב קישורים חיצוניים באמצעות CSS.

הפניית משתמש לאחר כניסה למערכת ניהול בוורדפרס

ניתן להפנות משתמשים אשר מתחברים לאתר הוורדפרס שלכם לכתובת url שונה בהתאם לתפקיד (role) שלהם.


function redirect_user_on_role()
{
	// קח מידע לגבי המשתמש הנוכחי
	global $current_user;
     	get_currentuserinfo();
 	// אם תפקיד המשתמש הוא מנוי
     	if ($current_user->user_level == 0)
     	{
        	wp_redirect( home_url() ); exit;
     	}
 	// אם תפקיד המשתמש הוא תורם
 	else if ($current_user->user_level > 1)
 	{
        	 wp_redirect( home_url() ); exit;
     	}
  	// אם תפקיד המשתמש הוא עורך
     	else if ($current_user->user_level >8)
     	{
		wp_redirect( home_url() ); exit;
     	}
 	// תפקידים אחרים...
	else
     	{
      		$redirect_to = 'http://google.com/';
        	return $redirect_to;
 	}
}
add_action('admin_init','redirect_user_on_role');

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

הפניית WWW לכתובת ללא WWW ולהפך – HTACCESS

אם ברצונכם להפנות כל כתובת באתר שלכם המכילה www לכתובת ללא www, כלומר http:/www.my-domain.co.il ל http://my-domain.co.il הוסיפו את הקוד הבא לקובץ htaccess:


RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

אם ברצונכם לבצע את הפעולה ההפוכה, כלומר להפנות כתובת שאינה מכילה www לאותה כתובת עם www, השתמשו בקוד הבא:


RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

מדוע לבצע זאת?

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

העברת אתר וורדפרס ל HTTPS אינו עניין של מה בכך, תנו מבט במדריך מעבר ל HTTPS באתרי וורדפרס.

מנעו hotlinking לתמונות

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

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?example.com/.*$ [NC] 
RewriteRule .(gif|jpg)$ http://www.example.com/hotlink.gif [R,L]

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

כיצד לאפשר העלאת קבצי SVG דרך ספריית המדיה

כברירת מחדל, וורדפרס חוסמת העלאה של קבצי SVG לספריית המדיה (״אין לך הרשאות להעלות קבצים מהסוג הזה״, או בלעז ״Sorry, you are not allowed to upload this file type״). כדי לאפשר העלאת קבצי SVG, הוסיפו את סוג ה-MIME של SVG באמצעות הפילטר upload_mimes והגבילו אותו למשתמשים מהימנים.

ההגבלה הזו חשובה, כי קובץ SVG יכול להכיל JavaScript שירוץ על הדומיין שלכם.

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

אפשור העלאת SVG בקובץ functions.php

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

function cc_mime_types( $mimes, $user = null ) {
    $can_upload_svg = $user ? user_can( $user, 'unfiltered_html' ) : current_user_can( 'unfiltered_html' );

    if ( $can_upload_svg ) {
        $mimes['svg'] = 'image/svg+xml';
    }

    return $mimes;
}
add_filter( 'upload_mimes', 'cc_mime_types', 10, 2 );

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

הפילטר upload_mimes מסנן את רשימת סיומות הקבצים וסוגי ה-MIME שוורדפרס מקבלת. השורה $mimes['svg'] = 'image/svg+xml'; מוסיפה את SVG לרשימה הזו.

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

unfiltered_html היא ההרשאה לפרסם HTML ו-JavaScript גולמיים, וליבת וורדפרס משתמשת באותה בדיקה לפני שהיא מאפשרת העלאת קבצי .html ו-.js. באתר בודד, למנהלים ולעורכים יש אותה. ברשת אתרים (Multisite), רק למנהלי רשת (Super Admins).

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

אבטחת SVG: הגבלה או סניטציה

קובץ SVG יכול להכיל תגיות <script> ו-event handlers כמו onload.

סקריפטים לא רצים כשה-SVG מוצג בתגית <img> או כרקע ב-CSS. הם כן רצים כשמישהו פותח את כתובת הקובץ ישירות, וזה פותח פתח ל-XSS (Cross-Site Scripting) על הדומיין שלכם.

יש לכם שתי אפשרויות בטוחות:

  • הגבלת ההעלאה למשתמשים מהימנים, כפי שעושה הסניפט שלמעלה.
  • סניטציה של כל קובץ SVG בזמן ההעלאה, כך שסקריפטים ומאפיינים מסוכנים יוסרו. התוסף Safe SVG של 10up עושה זאת עם הספרייה svg-sanitizer, ומאפשר לבחור אילו תפקידים רשאים להעלות קבצי SVG.

אם תפקידים נמוכים יותר, לקוחות או טופס ב-front-end של האתר צריכים להעלות קבצי SVG, השתמשו בסניטציה. הוספת svg ל-upload_mimes עבור כל המשתמשים ללא סניטציה היא בדיוק התצורה שממנה כדאי להימנע.

עדיין מקבלים ״אין לך הרשאות להעלות קבצים מהסוג הזה״?

החל מוורדפרס 4.7.1, הסיומת לבדה לא מספיקה. כאשר הרחבת ה-fileinfo של PHP זמינה, וורדפרס קוראת גם את תוכן הקובץ, ועבור SVG היא מקבלת את הקובץ רק כש-fileinfo מזהה אותו כ-image/svg+xml.

רוב קבצי ה-SVG המיוצאים עוברים את הבדיקה.

ב-PHP 8.3 למשל, קבצים שמתחילים ב-<svg או ב-<?xml מזוהים כראוי, אבל קובץ שמתחיל בהערת HTML או בשורות ריקות מזוהה כ-text/plain ונדחה.

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

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

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

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

שאלות נפוצות

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

מדוע וורדפרס לא מאפשרת העלאת SVG כברירת מחדל?
קבצי SVG הם מסמכי XML שיכולים לכלול JavaScript. קובץ SVG שהועלה ונפתח ישירות בדפדפן יכול להריץ את אותו סקריפט על הדומיין שלכם, ולכן וורדפרס משאירה את SVG מחוץ לסוגי הקבצים המותרים.
האם אפשר לאפשר העלאת SVG דרך wp-config.php?
רק בעקיפין. define( 'ALLOW_UNFILTERED_UPLOADS', true ); מאפשר למנהלים (למנהלי רשת ב-Multisite) להעלות כל סוג קובץ, לא רק SVG, גם כשבדיקת סוג הקובץ נכשלת. הפילטר upload_mimes הוא האפשרות הבטוחה והממוקדת יותר.
האם זה בטוח להעלות קבצי SVG לוורדפרס?
זה בטוח כשרק משתמשים מהימנים יכולים להעלות אותם, או כשכל קובץ עובר סניטציה בזמן ההעלאה, למשל עם התוסף Safe SVG. זה לא בטוח לאפשר לכל משתמש מחובר להעלות קבצי SVG ללא סניטציה.
מדוע קובץ ה-SVG עדיין נדחה אחרי הוספת הקוד?
או שלתפקיד שלכם אין unfiltered_html, או שוורדפרס לא זיהתה את תוכן הקובץ כ-image/svg+xml. הסירו כל הערה או שורות ריקות לפני התגית הפותחת <svg או <?xml והעלו את הקובץ שוב.

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

הסניפט הבא ייקח את התמונה הראשונה שהוא מוצא בפוסט ויגדיר אותה כתמונה ראשית (featured image). במידה ותבחרו תמונה ראשית הוא יראה אותה כמובן.

function autoset_featured() {
          global $post;
          $already_has_thumb = has_post_thumbnail($post->ID);
              if (!$already_has_thumb)  {
              $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
                          if ($attached_image) {
                                foreach ($attached_image as $attachment_id => $attachment) {
                                set_post_thumbnail($post->ID, $attachment_id);
                                }
                           }
                        }
      }
add_action('the_post', 'autoset_featured');
add_action('save_post', 'autoset_featured');
add_action('draft_to_publish', 'autoset_featured');
add_action('new_to_publish', 'autoset_featured');
add_action('pending_to_publish', 'autoset_featured');
add_action('future_to_publish', 'autoset_featured');

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

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

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

add_filter('login_errors',create_function('$a', "return null;"));

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

קביעת ברירת מחדל למצב עריכת פוסט וורדפרס

ישנם כאלו שמעדיפים לעבוד עם העורך הויזואלי (visual editor) כשהם כותבים פוסט וכאלו שמעדיפים את עורך הטקסט (text editor). שנו את ברירת המחדל בעריכת פוסט באמצעות הוספת אחד מהפילטרים הבאים לקובץ functions.php:

// Visual editor as the default
add_filter( 'wp_default_editor', function () {
	return 'tinymce';
} );

// Text (HTML) editor as the default
add_filter( 'wp_default_editor', function () {
	return 'html';
} );

השתמשו רק באחד משניהם. הפילטר קובע איזו לשונית, Visual או Text, תיפתח ראשונה בעורך הקלאסי, ולכן אין לו השפעה על עורך הבלוקים. גרסאות קודמות של הקוד השתמשו ב-create_function(), שהוסרה ב-PHP 8.0 וגורמת כיום לשגיאה קריטית (Fatal Error).

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