Categories
ווקומרס וורדפרס

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

ליצור עמוד למשתמש ברכישת מוצר מסוים בווקומרס:

add_action( 'woocommerce_order_status_completed', 'condless_create_page' );
function condless_create_page( $order_id ) {
        foreach ( wc_get_order( $order_id )->get_items() as $item ) {
                if ( $item->get_product_id() === 49 ) {
                        $post_details = array(
                                'post_title' => 'My New Page',
                                'post_status' => 'publish',
                                'post_author' => wc_get_order( $order_id )->get_user_id(),
                                'post_type' => 'page',
                        );
                        wp_insert_post( $post_details );
                }
        }
}
Categories
ווקומרס

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

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

add_filter( 'woocommerce_is_sold_individually', 'condless_wc_remove_quantity_fields', 10, 2 );
function condless_wc_remove_quantity_fields( $return, $product ) {
	if ( $product->get_stock_quantity() <= $product->get_low_stock_amount() )
  		return true;
}
Categories
ווקומרס

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

ובחזרה לעתיד.

לשנות סדר הופעת השדות:

add_filter( 'woocommerce_checkout_fields', 'condless_reordering_checkout_fields' );
function condless_reordering_checkout_fields( $fields ) {
        $billing_order = array(
                'billing_first_name',
                'billing_last_name',
                'billing_email',
                'billing_phone',
                'billing_company',
                'billing_address_1',
                'billing_address_2',
                'billing_postcode',
                'billing_city',
                'billing_state',
                'billing_country'
        );
        $count = 0;
        $priority = 10;
        foreach( $billing_order as $field_name ) {
                $count++;
                $fields['billing'][$field_name]['priority'] = $count * $priority;
        }
        $fields['billing']['billing_email']['class'] = array('form-row-first');
        $fields['billing']['billing_phone']['class'] = array('form-row-last');
        $fields['billing']['billing_postcode']['class'] = array('form-row-first');
        $fields['billing']['billing_city']['class'] = array('form-row-last');
        return $fields;
}

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

Categories
ווקומרס

שינוי אוטומטי של מצב הזמנה בווקומרס

לשנות בצורה אוטומוטית את מצב ההזמנה מ"בהשהייה" ל"בטיפול", על מנת לאפשר ללקוח שמשלם בהעברה בנקאית (אשר לוקחת זמן) לצפות בקישור ההורדה של מוצר דיגיטלי בדף "ההזמנה התקבלה" (אחרי רענון הדף):

add_action( 'woocommerce_thankyou', 'condless_woocommerce_auto_processing_orders' );
function condless_woocommerce_auto_processing_orders( $order_id ) {
	if ( ! $order_id ) {
		return;
	}
	$order = wc_get_order( $order_id );
	if( $order->has_status( 'on-hold' ) ) {
        	$order->update_status( 'processing' );
	}
}
Categories
ווקומרס

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

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

add_filter( 'gettext', 'condless_change_update_cart_text', 20, 3 );
function condless_change_update_cart_text( $translated, $text, $domain ) {
	if ( wp_is_mobile() && is_cart() && $translated == 'עדכן עגלת קניות' ) {
		$translated = 'עדכן';
	}
	return $translated;
}

לבטל את ההודעות על מוצר שנוסף/הוסר:

add_filter( 'wc_add_to_cart_message_html', '__return_null' );
add_filter( 'woocommerce_cart_item_removed_notice_type', '__return_null' );
Categories
ווקומרס

נראות מוצרים בחיפוש בווקומרס

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

add_filter( 'pre_get_posts', 'condless_search_wc' );
function condless_search_wc( $query ) {
	if( ! is_admin() && is_search() ) {
		$query->set( 'post_type', 'product' );
	}
	return $query;
}

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

add_action( 'pre_get_posts', 'condless_search_query_fix' );
function condless_search_query_fix( $query = false ) {
	if( ! is_admin() && is_search() ) {
		$query->set( 'tax_query', array( array( 'taxonomy' => 'product_visibility', 'field' => 'name', 'terms' => 'exclude-from-search', 'operator' => 'NOT IN' ) ) );
	}
}
Categories
ווקומרס

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

ואמנות ה-ASCII.

לאפשר בשדות בדף התשלום אותיות בעברית ותווי ASCII בלבד (אשר כוללים אותיות באנגלית):

add_action( 'woocommerce_after_checkout_validation', 'condless_ascii_validate_checkout', 10, 2 );
function condless_ascii_validate_checkout( $fields, $errors ) {
	$error_msg = ' מכיל אותיות שלא באנגלית או בעברית.';
	$regex_cond = '/[^[:ascii:]א-ת]/';
        if ( preg_match( $regex_cond, $fields[ 'billing_first_name' ] ) )
                $errors->add( 'validation', '<strong>' . __( 'Billing First Name', 'woocommerce' ) . '</strong>' . $error_msg );
        if ( preg_match( $regex_cond, $fields[ 'billing_last_name' ] ) )
		$errors->add( 'validation', '<strong>' . __( 'Billing Last Name', 'woocommerce' ) . '</strong>' . $error_msg );
        if ( preg_match( $regex_cond, $fields[ 'billing_company' ] ) )
		$errors->add( 'validation', '<strong>' . __( 'Billing Company', 'woocommerce' ) . '</strong>' . $error_msg );
        if ( preg_match( $regex_cond, $fields[ 'billing_address_1' ] ) )
		$errors->add( 'validation', '<strong>' . __( 'Billing Address', 'woocommerce' ) . '</strong>' . $error_msg );
        if ( preg_match( $regex_cond, $fields[ 'billing_address_2' ] ) )
		$errors->add( 'validation', '<strong>' . __( 'Billing Address 2', 'woocommerce' ) . '</strong>' . $error_msg );
        if ( preg_match( $regex_cond, $fields[ 'billing_city' ] ) )
		$errors->add( 'validation', '<strong>' . __( 'Billing City', 'woocommerce' ) . '</strong>' . $error_msg );
        if ( preg_match( $regex_cond, $fields[ 'shipping_first_name' ] ) )
		$errors->add( 'validation', '<strong>' . __( 'Shipping First Name', 'woocommerce' ) . '</strong>' . $error_msg );
        if ( preg_match( $regex_cond, $fields[ 'shipping_last_name' ] ) )
		$errors->add( 'validation', '<strong>' . __( 'Shipping Last Name', 'woocommerce' ) . '</strong>' . $error_msg );
        if ( preg_match( $regex_cond, $fields[ 'shipping_company' ] ) )
		$errors->add( 'validation', '<strong>' . __( 'Shipping Company', 'woocommerce' ) . '</strong>' . $error_msg );
        if ( preg_match( $regex_cond, $fields[ 'shipping_address_1' ] ) )
		$errors->add( 'validation', '<strong>' . __( 'Shipping Address', 'woocommerce' ) . '</strong>' . $error_msg );
        if ( preg_match( $regex_cond, $fields[ 'shipping_address_2' ] ) )
		$errors->add( 'validation', '<strong>' . __( 'Shipping Address 2', 'woocommerce' ) . '</strong>' . $error_msg );
        if ( preg_match( $regex_cond, $fields[ 'shipping_city' ] ) )
		$errors->add( 'validation', '<strong>' . __( 'Shipping City', 'woocommerce' ) . '</strong>' . $error_msg );
}

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

Categories
ווקומרס

מחיר וריאציה במקום טווח בווקומרס

והציפור מניו זילנד.

להציג מחיר וריאציה במקום טווח מחירים:

function get_default_variation( $product ) {
	// If no default variation exist we exit
	if( count( $product->get_variation_attributes() ) != count( $product->get_default_attributes() ) )
        	return false;
	foreach( $product->get_available_variations() as $variation ) {
		$found = true;
		foreach( $variation['attributes'] as $key => $value ) {
			$taxonomy = str_replace( 'attribute_', '', $key );
			// Searching for a matching variation as default
			if( isset( $default_attributes[$taxonomy] ) && $default_attributes[$taxonomy] != $value ) {
				$found = false;
				break;
			}
		}
		if( $found ) {
			$default_variaton = $variation;
			break;
		}
		else {
			continue;
		}
	}
	return isset($default_variaton) ? $default_variaton : false;
}

add_action( 'woocommerce_before_single_product', 'condless_move_variations_single_price', 1 );
function condless_move_variations_single_price() {
	global $product, $post;
	if ( $product->is_type( 'variable' ) ) {
		// Removing the variations price for variable products
		remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price' );
		// Change location and inserting back the variations price
		add_action( 'woocommerce_single_product_summary', 'condless_replace_variation_single_price' );
	}
}

function condless_replace_variation_single_price() {
	global $product;
	// Main Price
	$prices = array( $product->get_variation_price( 'min', true ), $product->get_variation_price( 'max', true ) );
	$active_price = $prices[0] !== $prices[1] ? sprintf( __( 'From: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );

	// Sale Price
	$prices = array( $product->get_variation_regular_price( 'min', true ), $product->get_variation_regular_price( 'max', true ) );
	sort( $prices );
	$regular_price = $prices[0] !== $prices[1] ? sprintf( __( 'From: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );

	if ( $active_price !== $regular_price && $product->is_on_sale() ) {
		$price = '<del>' . $regular_price . $product->get_price_suffix() . '</del> <ins>' . $active_price . $product->get_price_suffix() . '</ins>';
	}
	else {
		$price = $regular_price;
	}

	// When a default variation is set for the variable product
	if( get_default_variation( $product ) ) {
	$default_variaton = get_default_variation( $product );
	if( ! empty( $default_variaton['price_html'] ) ) {
		$price_html = $default_variaton['price_html'];
	} else {
		if ( ! $product->is_on_sale() )
			$price_html = $price = wc_price( $default_variaton['display_price'] );
		else
			$price_html = $price;
	}
	$availiability = $default_variaton['availability_html'];
	} else {
		$price_html = $price;
		$availiability = '';
	}
	// Styles ?>
	<style>
	div.woocommerce-variation-price,
	div.woocommerce-variation-availability,
	div.hidden-variable-price {
		height: 0px !important;
		overflow:hidden;
		position:relative;
		line-height: 0px !important;
		font-size: 0% !important;
	}
	</style>
	<?php // Jquery ?>
	<script>
	jQuery(document).ready(function($) {
		var a = 'div.wc-availability', p = 'p.price';
		$('input.variation_id').change( function() {
			if( '' != $('input.variation_id').val() ) {
				if($(a).html() != '' ) $(a).html('');
		$(p).html($('div.woocommerce-variation-price > span.price').html());
		$(a).html($('div.woocommerce-variation-availability').html());
		} else {
			if($(a).html() != '' ) $(a).html('');
			$(p).html($('div.hidden-variable-price').html());
		}
		});
	});
	</script>
	<?php
	echo '<p class="price">'.$price_html.'</p>
	<div class="wc-availability">'.$availiability.'</div>
	<div class="hidden-variable-price" >'.$price.'</div>';
}

add_filter( 'woocommerce_variable_price_html', 'condless_variation_price_format', 10, 2 );
function condless_variation_price_format( $price, $product ) {
	if ( is_shop() ) {
		$min_var_reg_price = $product->get_variation_regular_price( 'min', true );
		$min_var_sale_price = $product->get_variation_sale_price( 'min', true );
		$max_var_reg_price = $product->get_variation_regular_price( 'max', true );
		$max_var_sale_price = $product->get_variation_sale_price( 'max', true );
		if ( ! ( $min_var_reg_price == $max_var_reg_price && $min_var_sale_price == $max_var_sale_price ) ) {
			if ( $min_var_sale_price < $min_var_reg_price ) {
				$price = sprintf( __( 'From: <del>%1$s</del><ins>%2$s</ins>', 'woocommerce' ), wc_price( $min_var_reg_price ), wc_price( $min_var_sale_price ) );
			} else {
				$price = sprintf( __( 'From: %1$s', 'woocommerce' ), wc_price( $min_var_reg_price ) );
			}
		}
	}
	return $price;
}

לשנות את מפריד טווח המחירים ל-"/":

add_filter( 'woocommerce_format_price_range', 'condless_filter_woocommerce_format_price_range', 10, 3 );
function condless_filter_woocommerce_format_price_range( $price, $from, $to ) {
    $price = sprintf( _x( '%1$s &frasl; %2$s', 'Price range: from-to', 'woocommerce' ), is_numeric( $from ) ? wc_price( $from ) : $from, is_numeric( $to ) ? wc_price( $to ) : $to );
    return $price;
}

כפי שבוודאי שמתם לב- המחירים המוצעים במכירה פומבית יכולים להפתיע אפילו את המוכר, כך היה במכירה של נוצה בודדת מציפור ההואיה שנכחדה בתחילת המאה ה-20, אשר נמכרה במחיר $10,000.

Categories
ווקומרס

מיסים בווקומרס

ופרעה.

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

add_filter( 'woocommerce_get_price_suffix', 'condless_price_vat_suffix', 10, 2 );
function condless_price_vat_suffix( $html, $instance ) {
	if ( is_product() ) {
		if ( 'incl' === get_option( 'woocommerce_tax_display_shop' ) ) {
			$html .=  ' - ' . wc_price( wc_get_price_including_tax( $instance ) - wc_get_price_excluding_tax( $instance ) ) . ' ' . __( 'VAT', 'woocommerce' ) . ' =  ' . wc_price( wc_get_price_excluding_tax( $instance ) );
		}
		else {
			$html .=  ' + ' . wc_price( wc_get_price_including_tax( $instance ) - wc_get_price_excluding_tax( $instance ) ) . ' ' . __( 'VAT', 'woocommerce' ) . ' =  ' . wc_price( wc_get_price_including_tax( $instance ) );
		}
	}
	return $html;
}

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

add_action( 'woocommerce_cart_totals_before_order_total', 'condless_wc_display_vat' );
add_action( 'woocommerce_review_order_before_order_total', 'condless_wc_display_vat' );
function condless_wc_display_vat() {
        foreach( WC()->cart->get_taxes() as $tax ) $all_tax += $tax;
        echo '<tr class="cart-discount">
        <th>'. __( esc_attr( WC()->countries->tax_or_vat() ), 'woocommerce' ) .'</th>
        <td data-title=" '. __( esc_attr( WC()->countries->tax_or_vat() ), 'woocommerce' ) .' ">' . wc_price ( $all_tax ) .'</td>
        </tr>';
}

add_filter( 'woocommerce_cart_totals_order_total_html', 'condless_cart_totals_order_total_html' );
function condless_cart_totals_order_total_html( $value ) {
        $value = '<strong>' . WC()->cart->get_total() . '</strong> ';
        return $value;
}

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

add_filter( 'woocommerce_adjust_non_base_location_prices', '__return_false' );

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

Categories
ווקומרס

מספרי הזמנות בווקומרס

והמתמטיקאי הפרסי.

לשנות מספרי ההזמנות:

add_filter( 'woocommerce_order_number', 'condless_wc_order_number' );
function condless_wc_order_number( $order_id ) {
        $order_id = '5' . $order_id;
        return $order_id;
}

ליצור מספרי הזמנות בסדר רציף:

  • להתקין את התוסף
  • מכיוון שהזמנות שמתווספות לבסיס הנתונים כטיוטה (דרך לוח הבקרה או חנות האתר) נספרות גם כן, יש לוודא לעיתים קרובות ששדה ה-Next order number מכיל באמת את מספר ההזמנה הבא
  • באם רצף ההזמנות השתבש להזין את מספר ההזמנה הראשון בשדה Next order number ולשמור, ואז להריץ Renumerate Orders

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