ארכיון: סניפטים וקטעי קוד

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

הסרת הגירסה של וורדפרס ב Header

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

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

// remove version info from head and feeds
function sv_complete_version_removal() {
    return '';
}
add_filter('the_generator', 'sv_complete_version_removal');

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

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

function sv_registration_redirect(){
    return home_url( '/finished/' );
}
add_filter( 'registration_redirect', 'sv_registration_redirect' );

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

כיצד לאפשר לתורמים (Contributors) להעלות תמונות

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

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


function sv_allow_contributor_uploads() {
    $contributor = get_role('contributor');
    $contributor->add_cap('upload_files');
}

if (current_user_can('contributor') && !current_user_can('upload_files'))
    add_action('admin_init', 'sv_allow_contributor_uploads');

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

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

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

function catch_that_image() {
  global $post, $posts;
  $first_img = '';
  ob_start();
  ob_end_clean();
  $output = preg_match_all('/<img.+?src=[\'"]([^\'"]+)[\'"].*?>/i', $post->post_content, $matches);
  $first_img = $matches[1][0];

  if(empty($first_img)) {
    $first_img = "/path/to/default.png";
  }
  return $first_img;
}

ובכדי להשתמש בזה בתוך הלולאה של וורדפרס:

if ( get_the_post_thumbnail($post_id) != '' ) {

  echo '<a href="'; the_permalink(); echo '" class="thumbnail-wrapper">';
   the_post_thumbnail();
  echo '</a>';

} else {

 echo '<a href="'; the_permalink(); echo '" class="thumbnail-wrapper">';
 echo '<img src="';
 echo catch_that_image();
 echo '" alt="" />';
 echo '</a>';

}

הוספת שם הקטגוריה ל body_class

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

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

function sv_add_category_to_single($classes) {
    if (is_single() ) {
        global $post;
        foreach((get_the_category($post->ID)) as $category) {
            // add category slug to the $classes array
            $classes[] = $category->category_nicename;
        }
    }
    // return the $classes array
    return $classes;
}
add_filter('body_class','sv_add_category_to_single');

קבלת הקישור לתמונה הראשית (featured image url)

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

add_theme_support('post-thumbnails'); 

גם די פשוט להציג תמונה זו כ HTML המייצר את תגית ה <img> הרצויה:

get_the_post_thumbnail();

אך מה במידה ואתם צריכים רק את הקישור לתמונה ראשית זו? נניח במצב בו את רוצים להשתמש בה כ background-image על אלמנט מסויים. אז זה לא פשוט כפי שאני מצפה שיהיה, עם זאת לא כזה מסובך. מה שעליכם לעשות הוא להוסיף את הקוד הבא בתוך הלולאה של וורדפרס:

המשתנה $thumb_url יהיה הקישור לתמונה הראשית של הפוסט המדובר…

הוספת קלאס לקישורים המיוצרים ע״י next_posts_link ו previous_posts_link

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

add_filter('next_posts_link_attributes', 'posts_link_attributes');
add_filter('previous_posts_link_attributes', 'posts_link_attributes');

function posts_link_attributes() {
  return 'class="styled-button"';
}

שינוי סדר הפוסטים עבור ארכיון (archive.php)

הדרך הפשוטה ביותר לשנות את סדר הפוסטים בעמוד המשתמש בקובץ archive.php יהיה להשתמש בהוק pre_get_posts. עליכם במקרה זה לוודא שהשאילתא (query) היא זו לה אתם רוצים לבצע את השינוי כמובן.

שימוש בתנאי is_archive או is_post_type_archive אמור לספק במקרה זה. הנה דוגמה:

function sv_change_sort_order($query){
    if(is_archive()):
        //If you wanted it for the archive of a custom post type use: is_post_type_archive( $post_type )
        //Set the order ASC or DESC
        $query->set( 'order', 'ASC' );
        //Set the orderby
        $query->set( 'orderby', 'title' );
    endif;
}
add_action( 'pre_get_posts', 'sv_change_sort_order');

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

כיצד למנוע מוורדפרס לנחש כתובות URL

הוספת הקוד הבא ל functions.php של התבנית שלכם, ימנע מוורדפרס לבצע הפנייה אוטומטית של URL לא נכון לעמוד או פוסט בעל כתובת URL דומה.

/** stop guessing urls */

function sv_no_redirect_404($redirect_url) {
    if (is_404()) {
        return false;
    }
    return $redirect_url;
}

add_filter('redirect_canonical', 'sv_no_redirect_404');

You might find more information by search google for "Stop wordpress from guessing url's".

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

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

function change_search_url_rewrite() {
    if ( is_search() && ! empty( $_GET['s'] ) ) {
        wp_redirect( home_url( "/search/" ) . urlencode( get_query_var( 's' ) ) );
        exit();
    }
}
add_action( 'template_redirect', 'change_search_url_rewrite' );

לאחר הוספת פונקציה זו, כתובת החיפוש תהיה serach/test במקום ?s=test

הצגת קטגוריות המוצרים בפירורי הלחם של ווקומרס

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

/**
 * Show product categories in WooCommerce breadcrumbs
 */
// Get breadcrumbs on product pages that read: Home > Shop > Product category > Product Name
add_filter( 'woo_breadcrumbs_trail', 'woo_custom_breadcrumbs_trail_add_product_categories', 20 );

function woo_custom_breadcrumbs_trail_add_product_categories ( $trail ) {
  if ( ( get_post_type() == 'product' ) && is_singular() ) {
		global $post;

		$taxonomy = 'product_cat';

		$terms = get_the_terms( $post->ID, $taxonomy );
		$links = array();

		if ( $terms && ! is_wp_error( $terms ) ) {
		$count = 0;
			foreach ( $terms as $c ) {
				$count++;
				if ( $count > 1 ) { continue; }
				$parents = woo_get_term_parents( $c->term_id, $taxonomy, true, ', ', $c->name, array() );

				if ( $parents != '' && ! is_wp_error( $parents ) ) {
					$parents_arr = explode( ', ', $parents );

					foreach ( $parents_arr as $p ) {
						if ( $p != '' ) { $links[] = $p; }
					}
				}
			}

			// Add the trail back on to the end.
			// $links[] = $trail['trail_end'];
			$trail_end = get_the_title($post->ID);

			// Add the new links, and the original trail's end, back into the trail.
			array_splice( $trail, 2, count( $trail ) - 1, $links );

			$trail['trail_end'] = $trail_end;
		}
	}

	return $trail;
}

/**
 * Retrieve term parents with separator.
 *
 * @param int $id Term ID.
 * @param string $taxonomy.
 * @param bool $link Optional, default is false. Whether to format with link.
 * @param string $separator Optional, default is '/'. How to separate terms.
 * @param bool $nicename Optional, default is false. Whether to use nice name for display.
 * @param array $visited Optional. Already linked to terms to prevent duplicates.
 * @return string
 */

if ( ! function_exists( 'woo_get_term_parents' ) ) {
function woo_get_term_parents( $id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array() ) {
	$chain = '';
	$parent = &get_term( $id, $taxonomy );
	if ( is_wp_error( $parent ) )
		return $parent;

	if ( $nicename ) {
		$name = $parent->slug;
	} else {
		$name = $parent->name;
	}

	if ( $parent->parent && ( $parent->parent != $parent->term_id ) && !in_array( $parent->parent, $visited ) ) {
		$visited[] = $parent->parent;
		$chain .= woo_get_term_parents( $parent->parent, $taxonomy, $link, $separator, $nicename, $visited );
	}

	if ( $link ) {
		$chain .= '<a href="' . get_term_link( $parent, $taxonomy ) . '" title="' . esc_attr( sprintf( __( "View all posts in %s" ), $parent->name ) ) . '">'.$parent->name.'</a>' . $separator;
	} else {
		$chain .= $name.$separator;
	}
	return $chain;
	}
}

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

הקוד הבא יציג את הקישור לעמוד ״החשבון שלי״ באתרי ווקומרס. אם המשתמש אינו מחובר יוצג עבורו הקישור עם הטקסט ״הרשם / התחבר״, אחרת יוצג הקישור עם הטקסט ״החשבון שלי״.

<?php if ( is_user_logged_in() ) { ?>
 	<a href="<?php echo get_permalink( get_option('woocommerce_myaccount_page_id') ); ?>" title="<?php _e('My Account','woothemes'); ?>"><?php _e('My Account','woothemes'); ?></a>
 <?php } 
 else { ?>
 	<a href="<?php echo get_permalink( get_option('woocommerce_myaccount_page_id') ); ?>" title="<?php _e('Login / Register','woothemes'); ?>"><?php _e('Login / Register','woothemes'); ?></a>
 <?php } ?>

עוד מידע על עמוד החשבון שלי בפוסט משחקים עם עמוד ״החשבון שלי״ בווקומרס.

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

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

<ul class="products">
	<?php
		$args = array(
			'post_type' => 'product',
			'posts_per_page' => 12
			);
		$loop = new WP_Query( $args );
		if ( $loop->have_posts() ) {
			while ( $loop->have_posts() ) : $loop->the_post();
				wc_get_template_part( 'content', 'product' );
			endwhile;
		} else {
			echo __( 'No products found' );
		}
		wp_reset_postdata();
	?>
</ul><!--/.products-->

שינוי ומודיפיקציה לפירורי הלחם של ווקומרס

נתאר מספר דוגמאות המאפשרות לשנות את פירורי הלחם (BreadCrumbs) של ווקומרס. את הסניפטים שתמצאו בפוסט זה יש להוסיף לקובץ functions.php בתבנית הבת שלכם.

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

א. שינוי הטקטס "Home״

/**
 * Rename "home" in breadcrumb
 */
add_filter( 'woocommerce_breadcrumb_defaults', 'wcc_change_breadcrumb_home_text' );
function wcc_change_breadcrumb_home_text( $defaults ) {
    // Change the breadcrumb home text from 'Home' to 'Apartment'
	$defaults['home'] = 'Apartment';
	return $defaults;
}

ב. שינוי הקו המפריד (separator)

/**
 * Change the breadcrumb separator
 */
add_filter( 'woocommerce_breadcrumb_defaults', 'wcc_change_breadcrumb_delimiter' );
function wcc_change_breadcrumb_delimiter( $defaults ) {
	// Change the breadcrumb delimeter from '/' to '>'
	$defaults['delimiter'] = ' > ';
	return $defaults;
}

ג. שינוי מספר פרמטרים דיפולטיבים במקביל

/**
 * Change several of the breadcrumb defaults
 */
add_filter( 'woocommerce_breadcrumb_defaults', 'jk_woocommerce_breadcrumbs' );
function jk_woocommerce_breadcrumbs() {
    return array(
            'delimiter'   => ' &#47; ',
            'wrap_before' => '<nav class="woocommerce-breadcrumb" itemprop="breadcrumb">',
            'wrap_after'  => '</nav>',
            'before'      => '',
            'after'       => '',
            'home'        => _x( 'Home', 'breadcrumb', 'woocommerce' ),
        );
}

ד. שינוי הקישור של ״עמוד הבית״ (Home Link)

/**
 * Replace the home link URL
 */
add_filter( 'woocommerce_breadcrumb_home_url', 'woo_custom_breadrumb_home_url' );
function woo_custom_breadrumb_home_url() {
    return 'http://woocommerce.com';
}

ה. הסרה מוחלטת של פירורי הלחם

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

/**
 * Remove the breadcrumbs 
 */
add_action( 'init', 'woo_remove_wc_breadcrumbs' );
function woo_remove_wc_breadcrumbs() {
    remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20, 0 );
}

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

הסרת תוכן כלשהו של מוצר בקטגוריה מסויימת

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

/**
 * Remove product content based on category
 */
function remove_product_content() {
	// If a product in the 'Cookware' category is being viewed...
	if ( is_product() && has_term( 'Cookware', 'product_cat' ) ) {
		//... Remove the images
		remove_action( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 20 );
		// For a full list of what can be removed please see woocommerce-hooks.php
	}
}
add_action( 'wp', 'remove_product_content' );