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

כיצד לאפשר Inline SVG בעורך התוכן של וורדפרס

האם וורדפרס מאפשרת Inline SVG בתוכן הפוסטים כברירת מחדל? התשובה הקצרה: באופן חלקי. וורדפרס שומרת קוד <svg> רק עבור משתמשים בעלי ההרשאה unfiltered_html, והלשונית ״ויזואלי״ בעורך הקלאסי מסירה אותו אצל כולם.

השלבים הבאים מיועדים להדבקת קוד SVG (<svg>, <path>, <rect> וכדומה) ישירות בעורך. כדי להעלות קבצי SVG לספריית המדיה, עיינו בסניפט כיצד לאפשר העלאת קבצי SVG בוורדפרס.

הפעלת Inline SVG בעורך הקלאסי (TinyMCE)

TinyMCE, העורך שמאחורי העורך הקלאסי והבלוק ״קלאסי״, מסיר כל אלמנט שאינו חלק מסכמת ה-HTML5 שלו, ואלמנטים של SVG אינם חלק ממנה. כדי למנוע זאת, הוסיפו את הקוד הבא לקובץ functions.php של תבנית הבת שלכם:

function override_mce_options( $initArray ) {
    $opts = '*[*]';
    $initArray['valid_elements']          = $opts;
    $initArray['extended_valid_elements'] = $opts;
    return $initArray;
}
add_filter( 'tiny_mce_before_init', 'override_mce_options' );

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

tiny_mce_before_init מסנן את מערך ההגדרות שוורדפרס מעבירה ל-TinyMCE לפני שהעורך נטען. וורדפרס מפעילה אותו בעורך הקלאסי ובבלוק ״קלאסי״ שבעורך הבלוקים.

valid_elements אומר ל-TinyMCE אילו תגיות ומאפיינים לשמור. משמעות הערך *[*] היא כל אלמנט עם כל מאפיין, כך שקוד ה-SVG שורד את המעבר בין הלשוניות ״ויזואלי״ ו״טקסט״.

שימו לב ש-*[*] מבטל את סינון האלמנטים של TinyMCE עבור כל התגיות, לא רק עבור SVG.

TinyMCE ממיר את viewBox לאותיות קטנות (viewbox). זה לא פוגע בפועל, מכיוון שמנתח ה-HTML של הדפדפן משחזר את הכתיב הנכון עבור Inline SVG.

מה וורדפרס שומרת בפועל: unfiltered_html ו-KSES

ההגדרה של TinyMCE משנה רק את העורך בדפדפן. מה שנשמר בפועל במסד הנתונים נקבע בצד השרת על ידי KSES, מסנן ה-HTML של וורדפרס:

  • למנהלים ולעורכים באתר בודד יש unfiltered_html. התוכן שלהם לא מסונן, כך שה-Inline SVG נשמר כפי שנכתב.
  • למחברים ולתורמים אין את ההרשאה הזו. KSES מסיר את <svg>, <path> ושאר תגיות ה-SVG בזמן השמירה, בלי קשר למה שהעורך מציג.
  • ברשת אתרים (Multisite), רק למנהלי רשת יש unfiltered_html. הגדרת DISALLOW_UNFILTERED_HTML כ-true בקובץ wp-config.php מסירה אותה מכולם.

בעורך הבלוקים, הבלוק HTML מותאם פועל לפי אותו כלל. אין צורך בפילטר של TinyMCE עבורו, מכיוון שהבלוק הזה לא משתמש ב-TinyMCE, אבל משתמשים ללא unfiltered_html עדיין יאבדו את ה-SVG כשהפוסט יישמר.

הפעלת תגיות SVG בטוחות למחברים ולתורמים

אם משתמשים ללא unfiltered_html צריכים אייקונים פשוטים כ-Inline SVG, הוסיפו את אלמנטי ה-SVG ואת המאפיינים שלהם לרשימת ההיתרים (allowlist) של KSES עבור תוכן פוסטים. כל מה שלא ברשימה, כמו תגיות <script> ומאפייני onload, עדיין יוסר:

function savvy_allow_inline_svg( $tags, $context ) {
    if ( 'post' !== $context ) {
        return $tags;
    }

    $tags['svg'] = array(
        'xmlns'       => true,
        'viewbox'     => true,
        'width'       => true,
        'height'      => true,
        'fill'        => true,
        'class'       => true,
        'role'        => true,
        'aria-hidden' => true,
        'aria-label'  => true,
        'focusable'   => true,
    );
    $tags['g']      = array( 'fill' => true, 'stroke' => true, 'transform' => true );
    $tags['title']  = array();
    $tags['path']   = array( 'd' => true, 'fill' => true, 'stroke' => true, 'stroke-width' => true, 'stroke-linecap' => true, 'stroke-linejoin' => true, 'fill-rule' => true, 'clip-rule' => true, 'transform' => true );
    $tags['circle'] = array( 'cx' => true, 'cy' => true, 'r' => true, 'fill' => true, 'stroke' => true, 'stroke-width' => true );
    $tags['rect']   = array( 'x' => true, 'y' => true, 'width' => true, 'height' => true, 'rx' => true, 'ry' => true, 'fill' => true, 'stroke' => true, 'stroke-width' => true );

    return $tags;
}
add_filter( 'wp_kses_allowed_html', 'savvy_allow_inline_svg', 10, 2 );

שמות המאפיינים נכתבים באותיות קטנות (viewbox), מכיוון ש-KSES משווה אותם באותיות קטנות. שמרו על רשימה קצרה והימנעו מהיתר ל-<use>, <foreignObject>, href או style אלא אם אתם באמת צריכים אותם.

שאלות נפוצות

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

האם וורדפרס מאפשרת Inline SVG בתוכן הפוסטים כברירת מחדל?
רק עבור משתמשים בעלי ההרשאה unfiltered_html (מנהלים ועורכים באתר בודד), ורק בעורך הקוד, בלשונית ״טקסט״ או בבלוק HTML מותאם. אצל תפקידים אחרים וורדפרס מסירה את ה-SVG בזמן השמירה.
מדוע ה-SVG נעלם כשעוברים ללשונית ״ויזואלי״?
TinyMCE מסיר אלמנטים שאינם חלק מסכמת ה-HTML5 שלו, ואלמנטים של SVG אינם כלולים בה. הגדירו את valid_elements כ-*[*] באמצעות הפילטר tiny_mce_before_init.
האם הפילטר tiny_mce_before_init משפיע על עורך הבלוקים?
רק על הבלוק ״קלאסי״, שעדיין מריץ TinyMCE. בלוקים כמו HTML מותאם לא משתמשים ב-TinyMCE, כך שלפילטר אין עליהם השפעה.
האם זה בטוח לאפשר Inline SVG לכל המשתמשים?
לא על ידי מתן ההרשאה unfiltered_html, שמאפשרת להם גם להוסיף סקריפטים. במקום זאת, אפשרו רשימה קצרה של תגיות ומאפייני SVG דרך wp_kses_allowed_html, כך ש-KSES ימשיך להסיר סקריפטים ו-event handlers.

מקבלים HTTP Error כשאתם מעלים תמונות באתר וורדפרס?

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

  • שם קובץ בעייתי (סימנים מיוחדים וכדומה).
  • משקל הקובץ הוא מעבר למה שהשרת מאפשר (upload_max_size).
  • זכרון PHP בשרת אינו מספיק.
  • אין מספיק שטח אחסון בשרת.
מקבלים HTTP Error כשאתם מעלים תמונות באתר וורדפרס?

שגיאת HTTP בספריית המדיה של וורדפרס.

אז בתור התחלה בדקו את שם הקובץ ונסו להקטין את משקל הקובץ. בכדי להגדיל את הזיכרון הוסיפו את הקוד הבא לקובץ wp-config.php הנמצא בתיקייה הראשית של האתר:

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

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

php_value memory_limit 256M

אם יש לכם גישה לקובץ php.ini אז ניתן לעשות זאת על ידי הקוד הבא:

memory_limit = 256M

במצבים מסויימים גם ModSecurity בשרת יכול למנוע מכם להעלות קבצים. ניתן לבטל אותו דרך cPanel או לנסות את השורות הבאות בקובץ .htaccess (בטלו אם מופיעה שגיאה). נציין כי ישנה סיבה טובה ש ModSecurity קיים לטובת אבטחת אתר הוורדפרס שלכם:

SecFilterEngine Off 
SecFilterScanPOST Off 

הנה פוסט רחב יותר המדבר על פתרון בעיות בהעלאת תמונות לאתרי וורדפרס. תנו מבט!

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

הקובץ gitignore מסמן ל Git לא לעקוב (track) אחר קבצים מסוימים בפרויקט. אם מדברים על וורדפרס, הנה קובץ gitignore מומלץ שניתן לשנות בהתאם לצורך הפרויקט שלכם. לעוד על תיקיית mu-plugins שהקובץ כולל, תנו מבט במדריך המקושר.

# -----------------------------------------------------------------
# .gitignore for WordPress
# -----------------------------------------------------------------

# ignore everything in the root except the "wp-content" directory.
/*
!wp-content/

# ignore all files starting with .
.*

# track this file .gitignore (i.e. do NOT ignore it)
!.gitignore

# track .editorconfig file (i.e. do NOT ignore it)
!.editorconfig

# track readme.md in the root (i.e. do NOT ignore it)
!readme.md

# ignore all files that start with ~
~*

# ignore OS generated files
ehthumbs.db
Thumbs.db

# ignore Editor files
*.sublime-project
*.sublime-workspace
*.komodoproject

# ignore log files and databases
*.log
*.sql
*.sqlite

# ignore compiled files
*.com
*.class
*.dll
*.exe
*.o
*.so

# ignore packaged files
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

# ignore everything in the "wp-content" directory, except:
# "mu-plugins" directory
# "plugins" directory
# "themes" directory
wp-content/*
!wp-content/mu-plugins/
!wp-content/plugins/
!wp-content/themes/

# ignore these plugins from the core
wp-content/plugins/hello.php
wp-content/plugins/akismet/

# ignore specific themes
wp-content/themes/twenty*/

# ignore node/grunt dependency directories
node_modules/

הצגת משקל מוצר של ווקומרס תחת הכותרת בעמודי ארכיון

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

ווקומרס בגירסה 3.0+

/**
 * Show product weight on archive pages
 */
add_action( 'woocommerce_after_shop_loop_item', 'savvy_show_weights', 9 );

function savvy_show_weights() {

    global $product;
    $weight = $product->get_weight();

    if ( $product->has_weight() ) {
        echo '<div class="product-meta"><span class="product-meta-label">Weight: </span>' . $weight . get_option('woocommerce_weight_unit') . '</div></br>';
    }
}

הצגה של מימדי מוצר ווקומרס בעמוד ארכיון

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

ווקומרס בגירסה 3.0+

/**
 * Show product dimensions on archive pages for WC 3+
 */
add_action( 'woocommerce_after_shop_loop_item', 'savvy_show_dimensions', 9 );

function savvy_show_dimensions() {
    global $product;
    $dimensions = wc_format_dimensions($product->get_dimensions(false));

        if ( $product->has_dimensions() ) {
                echo '<div class="product-meta"><span class="product-meta-label">Dimensions: </span>' . $dimensions . '</div>';
        }
}

ווקומרס בגירסה נמוכה מ 3.0


/**
 * Show product dimensions on archive pages WC 3 and below
 */
add_action( 'woocommerce_after_shop_loop_item_title', 'wc_show_dimensions', 9 );

function wc_show_dimensions() {
	global $product;
	$dimensions = $product->get_dimensions();

        if ( ! empty( $dimensions ) ) {
                echo '<span class="dimensions">' . $dimensions . '</span>';
        }
}

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

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

/**
 * Automatically add product to cart on visit
 */
add_action( 'template_redirect', 'add_product_to_cart' );
function add_product_to_cart() {
	if ( ! is_admin() ) {
		$product_id = 64; //replace with your own product id
		$found = false;
		//check if product already in cart
		if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
			foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
				$_product = $values['data'];
				if ( $_product->get_id() == $product_id )
					$found = true;
			}
			// if product not found, add it
			if ( ! $found )
				WC()->cart->add_to_cart( $product_id );
		} else {
			// if no products in cart, add it
			WC()->cart->add_to_cart( $product_id );
		}
	}
}

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

/**
 * Add another product depending on the cart total
 */
add_action( 'template_redirect', 'add_product_to_cart' );
function add_product_to_cart() {
  if ( ! is_admin() ) {
		global $woocommerce;
		$product_id = 2831; //replace with your product id
		$found = false;
		$cart_total = 30; //replace with your cart total needed to add above item

		if( $woocommerce->cart->total >= $cart_total ) {
			//check if product already in cart
			if ( sizeof( $woocommerce->cart->get_cart() ) > 0 ) {
				foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
					$_product = $values['data'];
					if ( $_product->get_id() == $product_id )
						$found = true;
				}
				// if product not found, add it
				if ( ! $found )
					$woocommerce->cart->add_to_cart( $product_id );
			} else {
				// if no products in cart, add it
				$woocommerce->cart->add_to_cart( $product_id );
			}
		}
	}
}

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

שליחת אימייל לאחר הזמנה כאשר מתבצע שימוש בקופון – ווקומרס

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

/**
 * Send an email each time an order with coupon(s) is completed
 * The email contains coupon(s) used during checkout process
 *
 */ 
function woo_email_order_coupons( $order_id ) {
        $order = new WC_Order( $order_id );
        
        if( $order->get_used_coupons() ) {
        
          $to = '[email protected]';
	        $subject = 'New Order Completed';
	        $headers = 'From: My Name <[email protected]>' . "\r\n";
	        
	        $message = 'A new order has been completed.\n';
	        $message .= 'Order ID: '.$order_id.'\n';
	        $message .= 'Coupons used:\n';
	        
	        foreach( $order->get_used_coupons() as $coupon) {
		        $message .= $coupon.'\n';
	        }
	        @wp_mail( $to, $subject, $message, $headers );
        }
}
add_action( 'woocommerce_thankyou', 'woo_email_order_coupons' );}

גלילה חלקה (Smooth Scroll) ל ID בעזרת jQuery

סניפט קצר בו אני משתמש רבות כשאני נדרש לבצע גלילה לאלמנט מסויים (by ID). פשוט שנו את ׳600׳ למהירות בה אתם רוצים שהגלילה תתבצע (ms) וזהו. אתם יכולים גם לשנות את הסלקטור a[href*="#"] כמובן לאיזה סלקטור שתבחרו.

$('a[href*="#"]').on('click', function (e) {
	e.preventDefault();

	$('html, body').animate({
		scrollTop: $($(this).attr('href')).offset().top
	}, 600, 'linear');
});

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

אכלתי את הראש, אבל הנה גם פוסט המתאר כיצד ליצור אנימציות גלילה (On-Scroll Animations) ממש נחמדות באמצעות הספרייה AOS.

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

WooCommerce יודע להפנות את הגולשים לעמוד עגלת הקניות (Cart Page) לאחר הוספת מוצר לעגלה, אך אין בו הגדרה שמפנה ישירות לעמוד התשלום (Checkout Page). לשם כך תצטרכו את הפילטר woocommerce_add_to_cart_redirect.

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

הפניה לעמוד התשלום לאחר הוספה לעגלה

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

/**
 * Send customers straight to checkout after adding a product to the cart.
 */
function savvy_add_to_cart_redirect_checkout( $url ) {
    return wc_get_checkout_url();
}
add_filter( 'woocommerce_add_to_cart_redirect', 'savvy_add_to_cart_redirect_checkout' );

לאחר מכן גשו אל WooCommerce > הגדרות > מוצרים וסמנו את הפניה לסל הקניות אחרי הוספת מוצר (Redirect to the cart page after successful addition) תחת ״פעולה בעת ההוספה לסל הקניות״. בחלק הבא אסביר למה ההגדרה הזו חשובה.

איך זה עובד?

כאשר מוצר נוסף באמצעות שליחת טופס רגילה או באמצעות קישור ?add-to-cart=, WooCommerce מעביר את כתובת ההפניה דרך woocommerce_add_to_cart_redirect. אם הפילטר מחזיר כתובת, WooCommerce מפנה אליה, בלי קשר למה שנקבע בהגדרות.

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

מדריכים ישנים משתמשים ב-WC()->cart->get_checkout_url(). מתודה זו מוגדרת כ-deprecated מאז גרסה 2.5 של WooCommerce. היא עדיין עובדת, אך מציגה הודעת deprecation ובפועל קוראת ל-wc_get_checkout_url(), לכן השתמשו ישירות בפונקציה.

הוספה לעגלה ב-AJAX והגדרת ההפניה

בעמוד החנות ובעמודי הקטגוריות, המוצרים נוספים בדרך כלל באמצעות AJAX, בהתאם להגדרה הפעל אפשרות כפתור AJAX של "הוסף לסל הקניות" בעמוד ארכיון המוצרים (Enable AJAX add to cart buttons on archives).

בקשת AJAX אף פעם לא מגיעה לקוד ההפניה ב-PHP, ולכן הפילטר לבדו נראה לא פעם כאילו אינו עושה דבר בעמודי הארכיון.

WooCommerce מטפל במצב הזה באמצעות הגדרת ההפניה:

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

בתבניות בלוקים, הבלוקים Product Button ו-Add to Cart with Options משתמשים בקישור רגיל או בשליחת טופס רגילה כאשר ההגדרה פעילה, כך שגם הם עוברים דרך הפילטר.

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

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

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

function savvy_add_to_cart_redirect_courses( $url, $product ) {
    if ( $product instanceof WC_Product && has_term( 'courses', 'product_cat', $product->get_id() ) ) {
        return wc_get_checkout_url();
    }
    return $url;
}
add_filter( 'woocommerce_add_to_cart_redirect', 'savvy_add_to_cart_redirect_courses', 10, 2 );

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

אם קישור מוסיף ישירות מזהה (ID) של וריאציה, $product יהיה אותה וריאציה, ולכן במקרה כזה בדקו את get_parent_id() שלה.

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

שאלות נפוצות

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

האם יש ב-WooCommerce הגדרה שמפנה לעמוד התשלום לאחר הוספה לעגלה?
לא. ההגדרה המובנית תחת WooCommerce > הגדרות > מוצרים מפנה לעגלת הקניות בלבד. בכדי להגיע לעמוד התשלום, שלבו את ההגדרה הזו עם הפילטר woocommerce_add_to_cart_redirect.
למה ההפניה עובדת בעמודי מוצר אך לא בעמוד החנות?
הכפתורים בעמוד החנות משתמשים ב-AJAX, שלא מריץ את ההפניה ב-PHP. הפעילו את ״הפניה לסל הקניות אחרי הוספת מוצר״, וכך WooCommerce יפנה גם הוספות ב-AJAX לכתובת שעברה את הפילטר.
האם הפילטר משנה את הקישור ״מעבר לסל הקניות״ (View cart)?
כן, בעמודי ארכיון קלאסיים. הקישור ״מעבר לסל הקניות״ שמופיע לאחר הוספה ב-AJAX משתמש באותה כתובת שעברה את הפילטר, כך שכאשר הגדרת ההפניה כבויה הוא מפנה לעמוד התשלום.
האם זה יעבוד עם הוספה לעגלה ב-AJAX בעמודי מוצר בודדים?
לא באופן אוטומטי. AJAX מותאם בטופס של עמוד המוצר עוקף את ההפניה ב-PHP, ולכן הסקריפט צריך לבצע את ההפניה בעצמו לאחר שהבקשה מצליחה.

הגבלת החיפוש בוורדפרס לסוג תוכן ספציפי (Custom Post Type)

הסניפט הבא מאפשר לכם להגביל את החיפוש בוורדפרס לסוג תוכן ספציפי (Custom Post Types) כך שיתקבלו תוצאות אך ורק מסוג תוכן זה. הוסיפו ל functions.php וקבעו בשורה מספר 4 את סוג או סוגי התוכן עליהן יתבצע החיפוש.

function SearchFilter($query) {
  if ($query->is_search) {
    // Insert the specific post type you want to search
    $query->set('post_type', 'feeds');
  }
  return $query;
}

// This filter will jump into the loop and arrange our results before they're returned
add_filter('pre_get_posts','SearchFilter');