From 0425a68eca45e4a3e39804543504b255eb5c31a9 Mon Sep 17 00:00:00 2001 From: Mike Jolley Date: Wed, 10 Aug 2011 18:11:11 +0100 Subject: [PATCH] WooCommerce conversion and update --- ...in-attributes.php => admin-attributes.php} | 93 +- ...dmin-dashboard.php => admin-dashboard.php} | 158 +- admin/admin-import.php | 87 + admin/{jigoshop-admin.php => admin-init.php} | 164 +- ...jigoshop-install.php => admin-install.php} | 171 +- ...in-post-types.php => admin-post-types.php} | 167 +- admin/admin-settings.php | 1082 ++++ admin/jigoshop-admin-settings-options.php | 583 -- admin/jigoshop-admin-settings.php | 516 -- admin/jigoshop-write-panels.php | 192 - admin/write-panels/product-types/grouped.php | 44 - admin/write-panels/product-types/virtual.php | 44 - admin/writepanels/writepanel-order_data.php | 603 ++ .../writepanel-product-type-downloadable.php} | 31 +- .../writepanel-product-type-variable.php} | 105 +- .../writepanels/writepanel-product-types.php | 84 + admin/writepanels/writepanel-product_data.php | 569 ++ admin/writepanels/writepanels-init.php | 176 + assets/css/admin.less | 312 +- assets/css/datepicker.css | 129 - assets/css/frontend.css | 1109 ---- assets/css/ui.css | 14 +- assets/css/woocommerce.css | 150 + .../css/{frontend.less => woocommerce.less} | 6 +- assets/images/add.png | Bin 338 -> 256 bytes assets/images/calendar.png | Bin 1091 -> 1048 bytes assets/images/cross.png | Bin 655 -> 600 bytes assets/images/cross_white.png | Bin 245 -> 141 bytes assets/images/edit.png | Bin 714 -> 658 bytes assets/images/fancybox/fancy_close.png | Bin 1517 -> 1097 bytes assets/images/fancybox/fancy_loading.png | Bin 10195 -> 8324 bytes assets/images/fancybox/fancy_nav_left.png | Bin 1446 -> 1047 bytes assets/images/fancybox/fancy_nav_right.png | Bin 1454 -> 1051 bytes assets/images/fancybox/fancy_shadow_n.png | Bin 106 -> 101 bytes assets/images/fancybox/fancy_shadow_ne.png | Bin 347 -> 330 bytes assets/images/fancybox/fancy_shadow_nw.png | Bin 324 -> 322 bytes assets/images/fancybox/fancy_shadow_s.png | Bin 111 -> 106 bytes assets/images/fancybox/fancy_shadow_w.png | Bin 103 -> 99 bytes assets/images/fancybox/fancy_title_over.png | Bin 70 -> 68 bytes assets/images/fancybox/fancybox-x.png | Bin 203 -> 174 bytes assets/images/fancybox/fancybox-y.png | Bin 176 -> 143 bytes assets/images/fancybox/fancybox.png | Bin 15287 -> 14569 bytes assets/images/icons/menu_icons.png | Bin 1738 -> 1860 bytes assets/images/icons/paypal.png | Bin 911 -> 835 bytes assets/images/icons/skrill.png | Bin 4776 -> 1995 bytes assets/images/jigoshop.png | Bin 1383 -> 0 bytes assets/images/jigowatt.png | Bin 8746 -> 0 bytes assets/images/minus.png | Bin 324 -> 245 bytes assets/images/placeholder.png | Bin 6378 -> 5196 bytes assets/images/remove.png | Bin 274 -> 130 bytes assets/images/star.png | Bin 756 -> 673 bytes assets/images/tip.png | Bin 744 -> 639 bytes .../images/ui/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui/ui-bg_glass_55_fbf9ee_1x400.png | Bin 120 -> 0 bytes .../images/ui/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui/ui-bg_glass_75_dadada_1x400.png | Bin 111 -> 0 bytes .../images/ui/ui-bg_glass_75_e6e6e6_1x400.png | Bin 110 -> 0 bytes .../images/ui/ui-bg_glass_75_ffffff_1x400.png | Bin 107 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 101 -> 0 bytes .../ui/ui-bg_inset-soft_95_fef1ec_1x100.png | Bin 123 -> 0 bytes assets/images/ui/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes assets/images/ui/ui-icons_2e83ff_256x240.png | Bin 4369 -> 0 bytes assets/images/ui/ui-icons_454545_256x240.png | Bin 4369 -> 0 bytes assets/images/ui/ui-icons_888888_256x240.png | Bin 4369 -> 0 bytes assets/images/ui/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 0 bytes ...ery.fancybox-1.3.4.pack.js => fancybox.js} | 0 assets/js/{script.js => woocommerce.js} | 4 +- ...goshop_backend.js => woocommerce_admin.js} | 2 +- ...hop_frontend.js => woocommerce_plugins.js} | 0 assets/js/write-panels.js | 28 +- ...jigoshop_cart.class.php => cart.class.php} | 124 +- ..._checkout.class.php => checkout.class.php} | 238 +- ...ountries.class.php => countries.class.php} | 36 +- classes/coupons.class.php | 41 + ..._customer.class.php => customer.class.php} | 26 +- classes/gateways/gateway-banktransfer.php | 204 + classes/gateways/gateway-cheque.php | 114 + classes/gateways/gateway-moneybookers.php | 307 + .../gateways/gateway-paypal.php | 126 +- .../gateways}/gateway.class.php | 16 +- .../gateways}/gateways.class.php | 16 +- classes/jigoshop_coupons.class.php | 41 - ...goshop_order.class.php => order.class.php} | 64 +- ...shop_orders.class.php => orders.class.php} | 16 +- ...op_product.class.php => product.class.php} | 66 +- ....class.php => product_variation.class.php} | 22 +- classes/shipping/shipping-flat_rate.php | 197 + classes/shipping/shipping-free_shipping.php | 116 + .../shipping}/shipping.class.php | 20 +- .../shipping}/shipping_method.class.php | 20 +- .../{jigoshop_tax.class.php => tax.class.php} | 40 +- ...idation.class.php => validation.class.php} | 10 +- ...goshop.class.php => woocommerce.class.php} | 41 +- gateways/cheque.php | 108 - gateways/skrill.php | 300 - languages/jigoshop-de_DE.mo | Bin 72814 -> 0 bytes languages/jigoshop-de_DE.po | 5198 ----------------- languages/jigoshop-en_GB.po | 3729 ------------ languages/jigoshop-fr_FR.mo | Bin 77143 -> 0 bytes languages/jigoshop-fr_FR.po | 5011 ---------------- languages/jigoshop.pot | 4988 ---------------- readme.txt | 182 +- screenshot-1.png | Bin 257765 -> 0 bytes screenshot-2.png | Bin 81671 -> 0 bytes screenshot-3.png | Bin 99584 -> 0 bytes screenshot-4.png | Bin 121714 -> 0 bytes screenshot-5.png | Bin 286114 -> 0 bytes screenshot-6.png | Bin 195252 -> 0 bytes screenshot-7.png | Bin 502653 -> 0 bytes screenshot-8.png | Bin 364618 -> 0 bytes screenshot-9.png | Bin 206381 -> 0 bytes shipping/.DS_Store | Bin 6148 -> 0 bytes shipping/flat_rate.php | 182 - shipping/free_shipping.php | 107 - shortcodes/shortcode-cart.php | 181 + shortcodes/shortcode-checkout.php | 41 + shortcodes/shortcode-my_account.php | 528 ++ shortcodes/shortcode-order_tracking.php | 151 + shortcodes/shortcode-pay.php | 154 + shortcodes/shortcode-thankyou.php | 65 + shortcodes/shortcodes-init.php | 205 + templates/archive-product.php | 16 +- templates/checkout/form.php | 10 +- templates/checkout/pay_for_order.php | 32 +- templates/checkout/review_order.php | 96 +- templates/loop-shop.php | 16 +- templates/product_taxonomy.php | 10 +- templates/single-product-reviews.php | 38 +- templates/single-product.php | 18 +- templates/taxonomy-product_cat.php | 2 +- templates/taxonomy-product_tag.php | 2 +- version.txt | 1 - widgets/widget-cart.php | 80 + widgets/widget-featured_products.php | 100 + widgets/widget-layered_nav.php | 172 + widgets/widget-price_filter.php | 115 + widgets/widget-product_categories.php | 111 + widgets/widget-product_search.php | 57 + widgets/widget-product_tag_cloud.php | 62 + widgets/widget-recent_products.php | 123 + widgets/widgets-init.php | 31 + woocommerce.php | 574 ++ woocommerce_actions.php | 626 ++ woocommerce_emails.php | 286 + woocommerce_query.php | 288 + woocommerce_taxonomy.php | 419 ++ woocommerce_template_actions.php | 84 + woocommerce_template_functions.php | 799 +++ woocommerce_templates.php | 156 + 149 files changed, 10398 insertions(+), 23580 deletions(-) rename admin/{jigoshop-admin-attributes.php => admin-attributes.php} (70%) rename admin/{jigoshop-admin-dashboard.php => admin-dashboard.php} (70%) create mode 100644 admin/admin-import.php rename admin/{jigoshop-admin.php => admin-init.php} (58%) rename admin/{jigoshop-install.php => admin-install.php} (59%) rename admin/{jigoshop-admin-post-types.php => admin-post-types.php} (58%) create mode 100644 admin/admin-settings.php delete mode 100644 admin/jigoshop-admin-settings-options.php delete mode 100644 admin/jigoshop-admin-settings.php delete mode 100644 admin/jigoshop-write-panels.php delete mode 100644 admin/write-panels/product-types/grouped.php delete mode 100644 admin/write-panels/product-types/virtual.php create mode 100644 admin/writepanels/writepanel-order_data.php rename admin/{write-panels/product-types/downloadable.php => writepanels/writepanel-product-type-downloadable.php} (72%) rename admin/{write-panels/product-types/variable.php => writepanels/writepanel-product-type-variable.php} (65%) create mode 100644 admin/writepanels/writepanel-product-types.php create mode 100644 admin/writepanels/writepanel-product_data.php create mode 100644 admin/writepanels/writepanels-init.php delete mode 100644 assets/css/datepicker.css delete mode 100644 assets/css/frontend.css create mode 100644 assets/css/woocommerce.css rename assets/css/{frontend.less => woocommerce.less} (99%) delete mode 100644 assets/images/jigoshop.png delete mode 100644 assets/images/jigowatt.png delete mode 100755 assets/images/ui/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100755 assets/images/ui/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100755 assets/images/ui/ui-bg_glass_65_ffffff_1x400.png delete mode 100755 assets/images/ui/ui-bg_glass_75_dadada_1x400.png delete mode 100755 assets/images/ui/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100755 assets/images/ui/ui-bg_glass_75_ffffff_1x400.png delete mode 100755 assets/images/ui/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100755 assets/images/ui/ui-bg_inset-soft_95_fef1ec_1x100.png delete mode 100755 assets/images/ui/ui-icons_222222_256x240.png delete mode 100755 assets/images/ui/ui-icons_2e83ff_256x240.png delete mode 100755 assets/images/ui/ui-icons_454545_256x240.png delete mode 100755 assets/images/ui/ui-icons_888888_256x240.png delete mode 100755 assets/images/ui/ui-icons_cd0a0a_256x240.png rename assets/js/{jquery.fancybox-1.3.4.pack.js => fancybox.js} (100%) rename assets/js/{script.js => woocommerce.js} (98%) rename assets/js/{jigoshop_backend.js => woocommerce_admin.js} (99%) rename assets/js/{jigoshop_frontend.js => woocommerce_plugins.js} (100%) rename classes/{jigoshop_cart.class.php => cart.class.php} (76%) rename classes/{jigoshop_checkout.class.php => checkout.class.php} (64%) rename classes/{jigoshop_countries.class.php => countries.class.php} (92%) create mode 100644 classes/coupons.class.php rename classes/{jigoshop_customer.class.php => customer.class.php} (87%) create mode 100644 classes/gateways/gateway-banktransfer.php create mode 100755 classes/gateways/gateway-cheque.php create mode 100644 classes/gateways/gateway-moneybookers.php rename gateways/paypal.php => classes/gateways/gateway-paypal.php (57%) rename {gateways => classes/gateways}/gateway.class.php (57%) rename {gateways => classes/gateways}/gateways.class.php (74%) delete mode 100644 classes/jigoshop_coupons.class.php rename classes/{jigoshop_order.class.php => order.class.php} (81%) rename classes/{jigoshop_orders.class.php => orders.class.php} (85%) rename classes/{jigoshop_product.class.php => product.class.php} (86%) rename classes/{jigoshop_product_variation.class.php => product_variation.class.php} (88%) create mode 100644 classes/shipping/shipping-flat_rate.php create mode 100644 classes/shipping/shipping-free_shipping.php rename {shipping => classes/shipping}/shipping.class.php (85%) rename {shipping => classes/shipping}/shipping_method.class.php (60%) rename classes/{jigoshop_tax.class.php => tax.class.php} (85%) rename classes/{jigoshop_validation.class.php => validation.class.php} (96%) rename classes/{jigoshop.class.php => woocommerce.class.php} (85%) delete mode 100755 gateways/cheque.php delete mode 100644 gateways/skrill.php delete mode 100644 languages/jigoshop-de_DE.mo delete mode 100644 languages/jigoshop-de_DE.po delete mode 100644 languages/jigoshop-en_GB.po delete mode 100644 languages/jigoshop-fr_FR.mo delete mode 100644 languages/jigoshop-fr_FR.po delete mode 100644 languages/jigoshop.pot delete mode 100644 screenshot-1.png delete mode 100644 screenshot-2.png delete mode 100644 screenshot-3.png delete mode 100644 screenshot-4.png delete mode 100644 screenshot-5.png delete mode 100644 screenshot-6.png delete mode 100644 screenshot-7.png delete mode 100644 screenshot-8.png delete mode 100644 screenshot-9.png delete mode 100644 shipping/.DS_Store delete mode 100644 shipping/flat_rate.php delete mode 100644 shipping/free_shipping.php create mode 100644 shortcodes/shortcode-cart.php create mode 100644 shortcodes/shortcode-checkout.php create mode 100644 shortcodes/shortcode-my_account.php create mode 100644 shortcodes/shortcode-order_tracking.php create mode 100644 shortcodes/shortcode-pay.php create mode 100644 shortcodes/shortcode-thankyou.php create mode 100644 shortcodes/shortcodes-init.php delete mode 100644 version.txt create mode 100644 widgets/widget-cart.php create mode 100644 widgets/widget-featured_products.php create mode 100644 widgets/widget-layered_nav.php create mode 100644 widgets/widget-price_filter.php create mode 100644 widgets/widget-product_categories.php create mode 100644 widgets/widget-product_search.php create mode 100644 widgets/widget-product_tag_cloud.php create mode 100644 widgets/widget-recent_products.php create mode 100644 widgets/widgets-init.php create mode 100644 woocommerce.php create mode 100644 woocommerce_actions.php create mode 100644 woocommerce_emails.php create mode 100644 woocommerce_query.php create mode 100644 woocommerce_taxonomy.php create mode 100644 woocommerce_template_actions.php create mode 100644 woocommerce_template_functions.php create mode 100644 woocommerce_templates.php diff --git a/admin/jigoshop-admin-attributes.php b/admin/admin-attributes.php similarity index 70% rename from admin/jigoshop-admin-attributes.php rename to admin/admin-attributes.php index b5ad3c63691..ab61e723722 100644 --- a/admin/jigoshop-admin-attributes.php +++ b/admin/admin-attributes.php @@ -2,11 +2,11 @@ /** * Functions used for the attributes section in WordPress Admin * - * The attributes section lets users add custom attributes to assign to products - they can also be used in the layered nav widgets. + * The attributes section lets users add custom attributes to assign to products - they can also be used in the layered nav widget. * - * @author Jigowatt + * @author WooThemes * @category Admin - * @package JigoShop + * @package WooCommerce */ /** @@ -14,11 +14,8 @@ * * Shows the created attributes and lets you add new ones. * The added attributes are stored in the database and can be used for layered navigation. - * - * @since 1.0 - * @usedby jigoshop_admin_menu2() */ -function jigoshop_attributes() { +function woocommerce_attributes() { global $wpdb; @@ -30,9 +27,9 @@ function jigoshop_attributes() { if ($attribute_name && $attribute_type && !taxonomy_exists('product_attribute_'.strtolower(sanitize_title($attribute_name)))) : - $wpdb->insert( $wpdb->prefix . "jigoshop_attribute_taxonomies", array( 'attribute_name' => $attribute_name, 'attribute_type' => $attribute_type ), array( '%s', '%s' ) ); + $wpdb->insert( $wpdb->prefix . "woocommerce_attribute_taxonomies", array( 'attribute_name' => $attribute_name, 'attribute_type' => $attribute_type ), array( '%s', '%s' ) ); - update_option('jigowatt_update_rewrite_rules', '1'); + update_option('woocommerce_update_rewrite_rules', '1'); wp_safe_redirect( get_admin_url() . 'admin.php?page=attributes' ); exit; @@ -47,7 +44,7 @@ function jigoshop_attributes() { $attribute_type = $_POST['attribute_type']; - $wpdb->update( $wpdb->prefix . "jigoshop_attribute_taxonomies", array( 'attribute_type' => $attribute_type ), array( 'attribute_id' => $_GET['edit'] ), array( '%s' ) ); + $wpdb->update( $wpdb->prefix . "woocommerce_attribute_taxonomies", array( 'attribute_type' => $attribute_type ), array( 'attribute_id' => $_GET['edit'] ), array( '%s' ) ); endif; @@ -60,9 +57,9 @@ function jigoshop_attributes() { if ($delete>0) : - $att_name = $wpdb->get_var("SELECT attribute_name FROM " . $wpdb->prefix . "jigoshop_attribute_taxonomies WHERE attribute_id = '$delete'"); + $att_name = $wpdb->get_var("SELECT attribute_name FROM " . $wpdb->prefix . "woocommerce_attribute_taxonomies WHERE attribute_id = '$delete'"); - if ($att_name && $wpdb->query("DELETE FROM " . $wpdb->prefix . "jigoshop_attribute_taxonomies WHERE attribute_id = '$delete'")) : + if ($att_name && $wpdb->query("DELETE FROM " . $wpdb->prefix . "woocommerce_attribute_taxonomies WHERE attribute_id = '$delete'")) : $taxonomy = 'product_attribute_'.strtolower(sanitize_title($att_name)); @@ -85,9 +82,9 @@ function jigoshop_attributes() { endif; if (isset($_GET['edit']) && $_GET['edit'] > 0) : - jigoshop_edit_attribute(); + woocommerce_edit_attribute(); else : - jigoshop_add_attribute(); + woocommerce_add_attribute(); endif; } @@ -96,40 +93,37 @@ function jigoshop_attributes() { * Edit Attribute admin panel * * Shows the interface for changing an attributes type between select, multiselect and text - * - * @since 1.0 - * @usedby jigoshop_attributes() */ -function jigoshop_edit_attribute() { +function woocommerce_edit_attribute() { global $wpdb; $edit = absint($_GET['edit']); - $att_type = $wpdb->get_var("SELECT attribute_type FROM " . $wpdb->prefix . "jigoshop_attribute_taxonomies WHERE attribute_id = '$edit'"); + $att_type = $wpdb->get_var("SELECT attribute_type FROM " . $wpdb->prefix . "woocommerce_attribute_taxonomies WHERE attribute_id = '$edit'"); ?> -
-

-

+
+

+


-

-

+

+

- +
-

+

@@ -144,15 +138,12 @@ function jigoshop_edit_attribute() { * Add Attribute admin panel * * Shows the interface for adding new attributes - * - * @since 1.0 - * @usedby jigoshop_attributes() */ -function jigoshop_add_attribute() { +function woocommerce_add_attribute() { ?> -
-

-

+
+

+


@@ -160,21 +151,21 @@ function jigoshop_add_attribute() { - - - + + + @@ -206,28 +197,28 @@ function jigoshop_add_attribute() {
-

-

+

+

- +
- +
-

+

@@ -237,7 +228,7 @@ function jigoshop_add_attribute() { /* "); + var answer = confirm (""); if (answer) return true; return false; }); diff --git a/admin/jigoshop-admin-dashboard.php b/admin/admin-dashboard.php similarity index 70% rename from admin/jigoshop-admin-dashboard.php rename to admin/admin-dashboard.php index c2b5bcb4bc8..8967302d58f 100644 --- a/admin/jigoshop-admin-dashboard.php +++ b/admin/admin-dashboard.php @@ -1,40 +1,39 @@ -
-

-

-
+
+

+

+
-
-

+
+

-

+

attribute_name; ?> -
|
+
|
attribute_type); ?>
@@ -43,55 +42,55 @@ function jigoshop_dashboard() { $num = number_format_i18n( $num_posts->publish ); echo $num; ?> - + - + - + - +
-

JigoShop .

+

WooCommerce .

@@ -99,7 +98,7 @@ function jigoshop_dashboard() {
-

+

'; foreach ($orders as $order) : - $this_order = &new jigoshop_order( $order->ID ); + $this_order = &new woocommerce_order( $order->ID ); echo '
  • '.ucwords($this_order->status).' '.date_i18n('l jS \of F Y h:i:s A', strtotime($this_order->order_date)).'
    - '.sizeof($this_order->items).' '._n('item', 'items', sizeof($this_order->items), 'jigoshop').' '.__('Total: ', 'jigoshop').jigoshop_price($this_order->order_total).' + '.sizeof($this_order->items).' '._n('item', 'items', sizeof($this_order->items), 'woothemes').' '.__('Total: ', 'woothemes').woocommerce_price($this_order->order_total).'
  • '; endforeach; @@ -129,17 +128,17 @@ function jigoshop_dashboard() {
    - -
    -

    + +
    +

    have_posts()) : while ($my_query->have_posts()) : $my_query->the_post(); - $_product = &new jigoshop_product( $my_query->post->ID ); + $_product = &new woocommerce_product( $my_query->post->ID ); if (!$_product->managing_stock()) continue; $thisitem = ' @@ -172,15 +171,15 @@ function jigoshop_dashboard() { wp_reset_query(); if (sizeof($lowinstock)==0) : - $lowinstock[] = ''.__('No products are low in stock.', 'jigoshop').''; + $lowinstock[] = ''.__('No products are low in stock.', 'woothemes').''; endif; if (sizeof($outofstock)==0) : - $outofstock[] = ''.__('No products are out of stock.', 'jigoshop').''; + $outofstock[] = ''.__('No products are out of stock.', 'woothemes').''; endif; ?>
    -

    +

    @@ -188,7 +187,7 @@ function jigoshop_dashboard() {
    -

    +

    @@ -212,11 +211,11 @@ function jigoshop_dashboard() { if (isset($_GET['month'])) $current_month_offset = (int) $_GET['month']; ?> -
    +

    - - -

    + + +

    +

    -

    +

    -

    +

    -

    Jigowatt

    - -

    From design to deployment Jigowatt delivers expert solutions to enterprise customers using Magento & WordPress open source platforms.

    +

    WooThemes

    diff --git a/admin/admin-import.php b/admin/admin-import.php new file mode 100644 index 00000000000..37aeb84b5ac --- /dev/null +++ b/admin/admin-import.php @@ -0,0 +1,87 @@ +parse( $file ); + + if (isset($import_data['posts'])) : + $posts = $import_data['posts']; + + if ($posts && sizeof($posts)>0) foreach ($posts as $post) : + + if ($post['post_type']=='product') : + + if ($post['terms'] && sizeof($post['terms'])>0) : + + foreach ($post['terms'] as $term) : + + $domain = $term['domain']; + + if (strstr($domain, 'product_attribute_')) : + + // Make sure it exists! + if (!taxonomy_exists( $domain )) : + + $nicename = ucfirst(str_replace('product_attribute_', '', $domain)); + + // Create the taxonomy + $wpdb->insert( $wpdb->prefix . "woocommerce_attribute_taxonomies", array( 'attribute_name' => $nicename, 'attribute_type' => 'text' ), array( '%s', '%s' ) ); + + // Register the taxonomy now so that the import works! + register_taxonomy( $domain, + array('product'), + array( + 'hierarchical' => true, + 'labels' => array( + 'name' => $nicename, + 'singular_name' => $nicename, + 'search_items' => __( 'Search ', 'woothemes') . $nicename, + 'all_items' => __( 'All ', 'woothemes') . $nicename, + 'parent_item' => __( 'Parent ', 'woothemes') . $nicename, + 'parent_item_colon' => __( 'Parent ', 'woothemes') . $nicename . ':', + 'edit_item' => __( 'Edit ', 'woothemes') . $nicename, + 'update_item' => __( 'Update ', 'woothemes') . $nicename, + 'add_new_item' => __( 'Add New ', 'woothemes') . $nicename, + 'new_item_name' => __( 'New ', 'woothemes') . $nicename + ), + 'show_ui' => false, + 'query_var' => true, + 'rewrite' => array( 'slug' => strtolower(sanitize_title($nicename)), 'with_front' => false, 'hierarchical' => true ), + ) + ); + + update_option('woocommerce_update_rewrite_rules', '1'); + + endif; + + endif; + + endforeach; + + endif; + + endif; + + endforeach; + + endif; + +} + +add_action('import_start', 'woocommerce_import_start'); \ No newline at end of file diff --git a/admin/jigoshop-admin.php b/admin/admin-init.php similarity index 58% rename from admin/jigoshop-admin.php rename to admin/admin-init.php index 57ff137a9ff..3c3c46828d3 100644 --- a/admin/jigoshop-admin.php +++ b/admin/admin-init.php @@ -1,29 +1,25 @@ $item ) : - if ( ( ( 'jigoshop' ) == $item ) ) : - $jigoshop_menu_order[] = 'separator-jigoshop'; - unset( $menu_order[$jigoshop_separator] ); + if ( ( ( 'woocommerce' ) == $item ) ) : + $woocommerce_menu_order[] = 'separator-woocommerce'; + unset( $menu_order[$woocommerce_separator] ); endif; - if ( !in_array( $item, array( 'separator-jigoshop' ) ) ) : - $jigoshop_menu_order[] = $item; + if ( !in_array( $item, array( 'separator-woocommerce' ) ) ) : + $woocommerce_menu_order[] = $item; endif; endforeach; // Return order - return $jigoshop_menu_order; + return $woocommerce_menu_order; } -function jigoshop_admin_custom_menu_order() { +function woocommerce_admin_custom_menu_order() { if ( !current_user_can( 'manage_options' ) ) return false; return true; } -add_action('admin_menu', 'jigoshop_admin_menu'); -add_action('menu_order', 'jigoshop_admin_menu_order'); -add_action('custom_menu_order', 'jigoshop_admin_custom_menu_order'); +add_action('admin_menu', 'woocommerce_admin_menu'); +add_action('menu_order', 'woocommerce_admin_menu_order'); +add_action('custom_menu_order', 'woocommerce_admin_custom_menu_order'); /** * Admin Head * - * Outputs some styles in the admin to show icons on the jigoshop admin pages - * - * @since 1.0 + * Outputs some styles in the admin to show icons on the woocommerce admin pages */ -function jigoshop_admin_head() { +function woocommerce_admin_head() { ?> -
    -

    -

    +
    +

    +

      -
    • -
    • +
    • +
    - + - - + + - + - + - + - + @@ -159,38 +150,38 @@ function jigoshop_system_info() {
     
     
    - + - + - + - + - - + + - + - - + +
     
    ' . __('Your server supports fsockopen.', 'jigoshop'). ''; else echo '' . __('Your server does not support fsockopen.', 'jigoshop'). ''; ?>' . __('Your server supports fsockopen.', 'woothemes'). ''; else echo '' . __('Your server does not support fsockopen.', 'woothemes'). ''; ?>
    @@ -215,13 +206,16 @@ function jigoshop_system_info() { post_type !== 'product') die; - $product = new jigoshop_product($post->ID); + $product = new woocommerce_product($post->ID); if ($product->is_featured()) update_post_meta($post->ID, 'featured', 'no'); else update_post_meta($post->ID, 'featured', 'yes'); @@ -241,12 +235,12 @@ function jigoshop_feature_product () { wp_safe_redirect( $sendback ); } -add_action('wp_ajax_jigoshop-feature-product', 'jigoshop_feature_product'); +add_action('wp_ajax_woocommerce-feature-product', 'woocommerce_feature_product'); /** * Returns proper post_type */ -function jigoshop_get_current_post_type() { +function woocommerce_get_current_post_type() { global $post, $typenow, $current_screen; @@ -267,26 +261,22 @@ function jigoshop_get_current_post_type() { } /** - * Categories ordering + * Categories ordering scripts */ - -/** - * Load needed scripts to order categories - */ -function jigoshop_categories_scripts () { +function woocommerce_categories_scripts () { if( !isset($_GET['taxonomy']) || $_GET['taxonomy'] !== 'product_cat') return; - wp_register_script('jigoshop-categories-ordering', jigoshop::plugin_url() . '/assets/js/categories-ordering.js', array('jquery-ui-sortable')); - wp_print_scripts('jigoshop-categories-ordering'); + wp_register_script('woocommerce-categories-ordering', woocommerce::plugin_url() . '/assets/js/categories-ordering.js', array('jquery-ui-sortable')); + wp_print_scripts('woocommerce-categories-ordering'); } -add_action('admin_footer-edit-tags.php', 'jigoshop_categories_scripts'); +add_action('admin_footer-edit-tags.php', 'woocommerce_categories_scripts'); /** * Ajax request handling for categories ordering */ -function jigoshop_categories_ordering () { +function woocommerce_categories_ordering() { global $wpdb; @@ -295,7 +285,7 @@ function jigoshop_categories_ordering () { if( ! $id || ! $term = get_term_by('id', $id, 'product_cat') ) die(0); - jigoshop_order_categories ( $term, $next_id); + woocommerce_order_categories( $term, $next_id ); $children = get_terms('product_cat', "child_of=$id&menu_order=ASC&hide_empty=0"); if( $term && sizeof($children) ) { @@ -304,4 +294,4 @@ function jigoshop_categories_ordering () { } } -add_action('wp_ajax_jigoshop-categories-ordering', 'jigoshop_categories_ordering'); +add_action('wp_ajax_woocommerce-categories-ordering', 'woocommerce_categories_ordering'); diff --git a/admin/jigoshop-install.php b/admin/admin-install.php similarity index 59% rename from admin/jigoshop-install.php rename to admin/admin-install.php index d93e54eed7e..062d5e58787 100644 --- a/admin/jigoshop-install.php +++ b/admin/admin-install.php @@ -1,74 +1,65 @@ flush_rules(); // Update version - update_option( "jigoshop_db_version", JIGOSHOP_VERSION ); + update_option( "woocommerce_db_version", WOOCOMMERCE_VERSION ); } /** * Default options * * Sets up the default options used on the settings page - * - * @since 1.0 */ -function jigoshop_default_options() { +function woocommerce_default_options() { global $options_settings; foreach ($options_settings as $value) { if (isset($value['std'])) add_option($value['id'], $value['std']); } - add_option('jigoshop_shop_slug', 'shop'); + add_option('woocommerce_shop_slug', 'shop'); } /** * Create pages * * Creates pages that the plugin relies on, storing page id's in variables. - * - * @since 1.0 */ -function jigoshop_create_pages() { +function woocommerce_create_pages() { global $wpdb; - $slug = esc_sql( _x('shop', 'page_slug', 'jigoshop') ); + $slug = esc_sql( _x('shop', 'page_slug', 'woothemes') ); $page_found = $wpdb->get_var("SELECT ID FROM " . $wpdb->posts . " WHERE post_name = '$slug' LIMIT 1"); if(!$page_found) { @@ -78,19 +69,19 @@ function jigoshop_create_pages() { 'post_type' => 'page', 'post_author' => 1, 'post_name' => $slug, - 'post_title' => __('Shop', 'jigoshop'), + 'post_title' => __('Shop', 'woothemes'), 'post_content' => '', 'comment_status' => 'closed' ); $page_id = wp_insert_post($page_data); - update_option('jigoshop_shop_page_id', $page_id); + update_option('woocommerce_shop_page_id', $page_id); } else { - update_option('jigoshop_shop_page_id', $page_found); + update_option('woocommerce_shop_page_id', $page_found); } - $slug = esc_sql( _x('cart', 'page_slug', 'jigoshop') ); + $slug = esc_sql( _x('cart', 'page_slug', 'woothemes') ); $page_found = $wpdb->get_var("SELECT ID FROM " . $wpdb->posts . " WHERE post_name = '$slug' LIMIT 1"); if(!$page_found) { @@ -100,19 +91,19 @@ function jigoshop_create_pages() { 'post_type' => 'page', 'post_author' => 1, 'post_name' => $slug, - 'post_title' => __('Cart', 'jigoshop'), - 'post_content' => '[jigoshop_cart]', + 'post_title' => __('Cart', 'woothemes'), + 'post_content' => '[woocommerce_cart]', 'comment_status' => 'closed' ); $page_id = wp_insert_post($page_data); - update_option('jigoshop_cart_page_id', $page_id); + update_option('woocommerce_cart_page_id', $page_id); } else { - update_option('jigoshop_cart_page_id', $page_found); + update_option('woocommerce_cart_page_id', $page_found); } - $slug = esc_sql( _x('checkout', 'page_slug', 'jigoshop') ); + $slug = esc_sql( _x('checkout', 'page_slug', 'woothemes') ); $page_found = $wpdb->get_var("SELECT ID FROM " . $wpdb->posts . " WHERE post_name = '$slug' LIMIT 1"); if(!$page_found) { @@ -122,19 +113,19 @@ function jigoshop_create_pages() { 'post_type' => 'page', 'post_author' => 1, 'post_name' => $slug, - 'post_title' => __('Checkout', 'jigoshop'), - 'post_content' => '[jigoshop_checkout]', + 'post_title' => __('Checkout', 'woothemes'), + 'post_content' => '[woocommerce_checkout]', 'comment_status' => 'closed' ); $page_id = wp_insert_post($page_data); - update_option('jigoshop_checkout_page_id', $page_id); + update_option('woocommerce_checkout_page_id', $page_id); } else { - update_option('jigoshop_checkout_page_id', $page_found); + update_option('woocommerce_checkout_page_id', $page_found); } - $slug = esc_sql( _x('order-tracking', 'page_slug', 'jigoshop') ); + $slug = esc_sql( _x('order-tracking', 'page_slug', 'woothemes') ); $page_found = $wpdb->get_var("SELECT ID FROM " . $wpdb->posts . " WHERE post_name = '$slug' LIMIT 1"); if(!$page_found) { @@ -144,14 +135,14 @@ function jigoshop_create_pages() { 'post_type' => 'page', 'post_author' => 1, 'post_name' => $slug, - 'post_title' => __('Track your order', 'jigoshop'), - 'post_content' => '[jigoshop_order_tracking]', + 'post_title' => __('Track your order', 'woothemes'), + 'post_content' => '[woocommerce_order_tracking]', 'comment_status' => 'closed' ); $page_id = wp_insert_post($page_data); } - $slug = esc_sql( _x('my-account', 'page_slug', 'jigoshop') ); + $slug = esc_sql( _x('my-account', 'page_slug', 'woothemes') ); $page_found = $wpdb->get_var("SELECT ID FROM " . $wpdb->posts . " WHERE post_name = '$slug' LIMIT 1"); if(!$page_found) { @@ -161,19 +152,19 @@ function jigoshop_create_pages() { 'post_type' => 'page', 'post_author' => 1, 'post_name' => $slug, - 'post_title' => __('My Account', 'jigoshop'), - 'post_content' => '[jigoshop_my_account]', + 'post_title' => __('My Account', 'woothemes'), + 'post_content' => '[woocommerce_my_account]', 'comment_status' => 'closed' ); $page_id = wp_insert_post($page_data); - update_option('jigoshop_myaccount_page_id', $page_id); + update_option('woocommerce_myaccount_page_id', $page_id); } else { - update_option('jigoshop_myaccount_page_id', $page_found); + update_option('woocommerce_myaccount_page_id', $page_found); } - $slug = esc_sql( _x('edit-address', 'page_slug', 'jigoshop') ); + $slug = esc_sql( _x('edit-address', 'page_slug', 'woothemes') ); $page_found = $wpdb->get_var("SELECT ID FROM " . $wpdb->posts . " WHERE post_name = '$slug' LIMIT 1"); if(!$page_found) { @@ -181,22 +172,22 @@ function jigoshop_create_pages() { $page_data = array( 'post_status' => 'publish', 'post_type' => 'page', - 'post_parent' => get_option('jigoshop_myaccount_page_id'), + 'post_parent' => get_option('woocommerce_myaccount_page_id'), 'post_author' => 1, 'post_name' => $slug, - 'post_title' => __('Edit My Address', 'jigoshop'), - 'post_content' => '[jigoshop_edit_address]', + 'post_title' => __('Edit My Address', 'woothemes'), + 'post_content' => '[woocommerce_edit_address]', 'comment_status' => 'closed' ); $page_id = wp_insert_post($page_data); - update_option('jigoshop_edit_address_page_id', $page_id); + update_option('woocommerce_edit_address_page_id', $page_id); } else { - update_option('jigoshop_edit_address_page_id', $page_found); + update_option('woocommerce_edit_address_page_id', $page_found); } - $slug = esc_sql( _x('view-order', 'page_slug', 'jigoshop') ); + $slug = esc_sql( _x('view-order', 'page_slug', 'woothemes') ); $page_found = $wpdb->get_var("SELECT ID FROM " . $wpdb->posts . " WHERE post_name = '$slug' LIMIT 1"); if(!$page_found) { @@ -204,22 +195,22 @@ function jigoshop_create_pages() { $page_data = array( 'post_status' => 'publish', 'post_type' => 'page', - 'post_parent' => get_option('jigoshop_myaccount_page_id'), + 'post_parent' => get_option('woocommerce_myaccount_page_id'), 'post_author' => 1, 'post_name' => $slug, - 'post_title' => __('View Order', 'jigoshop'), - 'post_content' => '[jigoshop_view_order]', + 'post_title' => __('View Order', 'woothemes'), + 'post_content' => '[woocommerce_view_order]', 'comment_status' => 'closed' ); $page_id = wp_insert_post($page_data); - update_option('jigoshop_view_order_page_id', $page_id); + update_option('woocommerce_view_order_page_id', $page_id); } else { - update_option('jigoshop_view_order_page_id', $page_found); + update_option('woocommerce_view_order_page_id', $page_found); } - $slug = esc_sql( _x('change-password', 'page_slug', 'jigoshop') ); + $slug = esc_sql( _x('change-password', 'page_slug', 'woothemes') ); $page_found = $wpdb->get_var("SELECT ID FROM " . $wpdb->posts . " WHERE post_name = '$slug' LIMIT 1"); if(!$page_found) { @@ -227,22 +218,22 @@ function jigoshop_create_pages() { $page_data = array( 'post_status' => 'publish', 'post_type' => 'page', - 'post_parent' => get_option('jigoshop_myaccount_page_id'), + 'post_parent' => get_option('woocommerce_myaccount_page_id'), 'post_author' => 1, 'post_name' => $slug, - 'post_title' => __('Change Password', 'jigoshop'), - 'post_content' => '[jigoshop_change_password]', + 'post_title' => __('Change Password', 'woothemes'), + 'post_content' => '[woocommerce_change_password]', 'comment_status' => 'closed' ); $page_id = wp_insert_post($page_data); - update_option('jigoshop_change_password_page_id', $page_id); + update_option('woocommerce_change_password_page_id', $page_id); } else { - update_option('jigoshop_change_password_page_id', $page_found); + update_option('woocommerce_change_password_page_id', $page_found); } - $slug = esc_sql( _x('pay', 'page_slug', 'jigoshop') ); + $slug = esc_sql( _x('pay', 'page_slug', 'woothemes') ); $page_found = $wpdb->get_var("SELECT ID FROM " . $wpdb->posts . " WHERE post_name = '$slug' LIMIT 1"); if(!$page_found) { @@ -250,23 +241,23 @@ function jigoshop_create_pages() { $page_data = array( 'post_status' => 'publish', 'post_type' => 'page', - 'post_parent' => get_option('jigoshop_checkout_page_id'), + 'post_parent' => get_option('woocommerce_checkout_page_id'), 'post_author' => 1, 'post_name' => $slug, - 'post_title' => __('Checkout → Pay', 'jigoshop'), - 'post_content' => '[jigoshop_pay]', + 'post_title' => __('Checkout → Pay', 'woothemes'), + 'post_content' => '[woocommerce_pay]', 'comment_status' => 'closed' ); $page_id = wp_insert_post($page_data); - update_option('jigoshop_pay_page_id', $page_id); + update_option('woocommerce_pay_page_id', $page_id); } else { - update_option('jigoshop_pay_page_id', $page_found); + update_option('woocommerce_pay_page_id', $page_found); } // Thank you Page - $slug = esc_sql( _x('thanks', 'page_slug', 'jigoshop') ); + $slug = esc_sql( _x('thanks', 'page_slug', 'woothemes') ); $page_found = $wpdb->get_var("SELECT ID FROM " . $wpdb->posts . " WHERE post_name = '$slug' LIMIT 1"); if(!$page_found) { @@ -274,19 +265,19 @@ function jigoshop_create_pages() { $page_data = array( 'post_status' => 'publish', 'post_type' => 'page', - 'post_parent' => get_option('jigoshop_checkout_page_id'), + 'post_parent' => get_option('woocommerce_checkout_page_id'), 'post_author' => 1, 'post_name' => $slug, - 'post_title' => __('Thank you', 'jigoshop'), - 'post_content' => '[jigoshop_thankyou]', + 'post_title' => __('Thank you', 'woothemes'), + 'post_content' => '[woocommerce_thankyou]', 'comment_status' => 'closed' ); $page_id = wp_insert_post($page_data); - update_option('jigoshop_thanks_page_id', $page_id); + update_option('woocommerce_thanks_page_id', $page_id); } else { - update_option('jigoshop_thanks_page_id', $page_found); + update_option('woocommerce_thanks_page_id', $page_found); } } @@ -295,28 +286,24 @@ function jigoshop_create_pages() { * Table Install * * Sets up the database tables which the plugin needs to function. - * - * @since 1.0 */ -function jigoshop_tables_install() { +function woocommerce_tables_install() { global $wpdb; - //$wpdb->show_errors(); - - $collate = ''; + $collate = ''; if($wpdb->supports_collation()) { if(!empty($wpdb->charset)) $collate = "DEFAULT CHARACTER SET $wpdb->charset"; if(!empty($wpdb->collate)) $collate .= " COLLATE $wpdb->collate"; } - $sql = "CREATE TABLE IF NOT EXISTS ". $wpdb->prefix . "jigoshop_attribute_taxonomies" ." ( + $sql = "CREATE TABLE IF NOT EXISTS ". $wpdb->prefix . "woocommerce_attribute_taxonomies" ." ( `attribute_id` mediumint(9) NOT NULL AUTO_INCREMENT, `attribute_name` varchar(200) NOT NULL, `attribute_type` varchar(200) NOT NULL, PRIMARY KEY id (`attribute_id`)) $collate;"; $wpdb->query($sql); - $sql = "CREATE TABLE IF NOT EXISTS ". $wpdb->prefix . "jigoshop_downloadable_product_permissions" ." ( + $sql = "CREATE TABLE IF NOT EXISTS ". $wpdb->prefix . "woocommerce_downloadable_product_permissions" ." ( `product_id` mediumint(9) NOT NULL, `user_email` varchar(200) NOT NULL, `user_id` mediumint(9) NULL, @@ -325,9 +312,9 @@ function jigoshop_tables_install() { PRIMARY KEY id (`product_id`, `order_key`)) $collate;"; $wpdb->query($sql); - $sql = "CREATE TABLE IF NOT EXISTS ". $wpdb->prefix . "jigoshop_termmeta" ." ( + $sql = "CREATE TABLE IF NOT EXISTS ". $wpdb->prefix . "woocommerce_termmeta" ." ( `meta_id` bigint(20) NOT NULL AUTO_INCREMENT, - `jigoshop_term_id` bigint(20) NOT NULL, + `woocommerce_term_id` bigint(20) NOT NULL, `meta_key` varchar(255) NULL, `meta_value` longtext NULL, PRIMARY KEY id (`meta_id`)) $collate;"; @@ -339,15 +326,13 @@ function jigoshop_tables_install() { * Default taxonomies * * Adds the default terms for taxonomies - product types and order statuses. Modify at your own risk. - * - * @since 1.0 */ -function jigoshop_default_taxonomies() { +function woocommerce_default_taxonomies() { $product_types = array( 'simple', 'grouped', - 'configurable', + 'variable', 'downloadable', 'virtual' ); diff --git a/admin/jigoshop-admin-post-types.php b/admin/admin-post-types.php similarity index 58% rename from admin/jigoshop-admin-post-types.php rename to admin/admin-post-types.php index 048adebb04b..99ec5625a73 100644 --- a/admin/jigoshop-admin-post-types.php +++ b/admin/admin-post-types.php @@ -4,31 +4,31 @@ * * These functions control columns in admin, and other admin interface bits * - * @author Jigowatt + * @author WooThemes * @category Admin - * @package JigoShop + * @package WooCommerce */ /** * Custom columns **/ - function jigoshop_edit_variation_columns($columns){ + function woocommerce_edit_variation_columns($columns){ $columns = array(); $columns["cb"] = ""; - $columns["thumb"] = __("Thumb", 'jigoshop'); - $columns["id"] = __("ID", 'jigoshop'); - $columns["title"] = __("Name", 'jigoshop'); - $columns["parent"] = __("Parent Product", 'jigoshop'); + $columns["thumb"] = __("Thumb", 'woothemes'); + $columns["id"] = __("ID", 'woothemes'); + $columns["title"] = __("Name", 'woothemes'); + $columns["parent"] = __("Parent Product", 'woothemes'); return $columns; } -add_filter('manage_edit-product_variation_columns', 'jigoshop_edit_variation_columns'); +add_filter('manage_edit-product_variation_columns', 'woocommerce_edit_variation_columns'); -function jigoshop_custom_variation_columns($column) { +function woocommerce_custom_variation_columns($column) { global $post; - $product = &new jigoshop_product($post->ID); + $product = &new woocommerce_product($post->ID); switch ($column) { case "thumb" : @@ -47,36 +47,36 @@ function jigoshop_custom_variation_columns($column) { break; } } -add_action('manage_product_variation_posts_custom_column', 'jigoshop_custom_variation_columns', 2); +add_action('manage_product_variation_posts_custom_column', 'woocommerce_custom_variation_columns', 2); -function jigoshop_edit_product_columns($columns){ +function woocommerce_edit_product_columns($columns){ $columns = array(); $columns["cb"] = ""; - $columns["thumb"] = __("Thumb", 'jigoshop'); - $columns["title"] = __("Name", 'jigoshop'); - $columns["product_type"] = __("Type", 'jigoshop'); - $columns["sku"] = __("ID/SKU", 'jigoshop'); - $columns["product_cat"] = __("Category", 'jigoshop'); - $columns["product_tags"] = __("Tags", 'jigoshop'); - $columns["visibility"] = __("Visibility", 'jigoshop'); - $columns["featured"] = __("Featured", 'jigoshop'); + $columns["thumb"] = __("Thumb", 'woothemes'); + $columns["title"] = __("Name", 'woothemes'); + $columns["product_type"] = __("Type", 'woothemes'); + $columns["sku"] = __("ID/SKU", 'woothemes'); + $columns["product_cat"] = __("Category", 'woothemes'); + $columns["product_tags"] = __("Tags", 'woothemes'); + $columns["visibility"] = __("Visibility", 'woothemes'); + $columns["featured"] = __("Featured", 'woothemes'); - if (get_option('jigoshop_manage_stock')=='yes') : - $columns["is_in_stock"] = __("In Stock?", 'jigoshop'); - $columns["inventory"] = __("Inventory", 'jigoshop'); + if (get_option('woocommerce_manage_stock')=='yes') : + $columns["is_in_stock"] = __("In Stock?", 'woothemes'); + $columns["inventory"] = __("Inventory", 'woothemes'); endif; - $columns["price"] = __("Price", 'jigoshop'); + $columns["price"] = __("Price", 'woothemes'); return $columns; } -add_filter('manage_edit-product_columns', 'jigoshop_edit_product_columns'); +add_filter('manage_edit-product_columns', 'woocommerce_edit_product_columns'); -function jigoshop_custom_product_columns($column) { +function woocommerce_custom_product_columns($column) { global $post; - $product = &new jigoshop_product($post->ID); + $product = &new woocommerce_product($post->ID); switch ($column) { case "thumb" : @@ -104,10 +104,10 @@ function jigoshop_custom_product_columns($column) { endif; break; case "featured" : - $url = wp_nonce_url( admin_url('admin-ajax.php?action=jigoshop-feature-product&product_id=' . $post->ID) ); - echo ''; - if ($product->is_featured()) echo 'yes'; - else echo 'no'; + $url = wp_nonce_url( admin_url('admin-ajax.php?action=woocommerce-feature-product&product_id=' . $post->ID) ); + echo ''; + if ($product->is_featured()) echo 'yes'; + else echo 'no'; echo ''; break; case "visibility" : @@ -118,7 +118,7 @@ function jigoshop_custom_product_columns($column) { endif; break; case "is_in_stock" : - if ( !$product->is_type( 'grouped' ) && $product->is_in_stock() ) echo 'yes'; + if ( !$product->is_type( 'grouped' ) && $product->is_in_stock() ) echo 'yes'; else echo ''; break; case "inventory" : @@ -136,43 +136,43 @@ function jigoshop_custom_product_columns($column) { break; } } -add_action('manage_product_posts_custom_column', 'jigoshop_custom_product_columns', 2); +add_action('manage_product_posts_custom_column', 'woocommerce_custom_product_columns', 2); -function jigoshop_edit_order_columns($columns){ +function woocommerce_edit_order_columns($columns){ $columns = array(); //$columns["cb"] = ""; - $columns["order_status"] = __("Status", 'jigoshop'); + $columns["order_status"] = __("Status", 'woothemes'); - $columns["order_title"] = __("Order", 'jigoshop'); + $columns["order_title"] = __("Order", 'woothemes'); - $columns["customer"] = __("Customer", 'jigoshop'); - $columns["billing_address"] = __("Billing Address", 'jigoshop'); - $columns["shipping_address"] = __("Shipping Address", 'jigoshop'); + $columns["customer"] = __("Customer", 'woothemes'); + $columns["billing_address"] = __("Billing Address", 'woothemes'); + $columns["shipping_address"] = __("Shipping Address", 'woothemes'); - $columns["billing_and_shipping"] = __("Billing & Shipping", 'jigoshop'); + $columns["billing_and_shipping"] = __("Billing & Shipping", 'woothemes'); - $columns["total_cost"] = __("Order Cost", 'jigoshop'); + $columns["total_cost"] = __("Order Cost", 'woothemes'); return $columns; } -add_filter('manage_edit-shop_order_columns', 'jigoshop_edit_order_columns'); +add_filter('manage_edit-shop_order_columns', 'woocommerce_edit_order_columns'); -function jigoshop_custom_order_columns($column) { +function woocommerce_custom_order_columns($column) { global $post; - $order = &new jigoshop_order( $post->ID ); + $order = &new woocommerce_order( $post->ID ); switch ($column) { case "order_status" : - echo sprintf( __('%s', 'jigoshop'), sanitize_title($order->status), $order->status ); + echo sprintf( __('%s', 'woothemes'), sanitize_title($order->status), $order->status ); break; case "order_title" : - echo ''.sprintf( __('Order #%s', 'jigoshop'), $post->ID ).''; + echo ''.sprintf( __('Order #%s', 'woothemes'), $post->ID ).''; echo ''; @@ -183,7 +183,7 @@ function jigoshop_custom_order_columns($column) { ?>
    -
    +
    '; else : - _e('Guest', 'jigoshop'); + _e('Guest', 'woothemes'); endif; ?>
    - billing_email) : ?>
    + billing_email) : ?>
    billing_email; ?>
    - billing_phone) : ?>
    + billing_phone) : ?>
    billing_phone; ?>
    -
    +
    payment_method; ?>
    -
    +
    shipping_method; ?>
    - - + + order_shipping>0) : ?> - - + + get_total_tax()>0) : ?> - - + + order_discount>0) : ?> - - + + - - + +
    order_subtotal); ?>order_subtotal); ?>
    order_shipping); ?>order_shipping); ?>
    get_total_tax()); ?>get_total_tax()); ?>
    order_discount); ?>order_discount); ?>
    order_total); ?>order_total); ?>
    Pending ('.$jigoshop_orders->pending_count.')'; - $views['onhold'] = 'On-Hold ('.$jigoshop_orders->on_hold_count.')'; - $views['processing'] = 'Processing ('.$jigoshop_orders->processing_count.')'; - $views['completed'] = 'Completed ('.$jigoshop_orders->completed_count.')'; - $views['cancelled'] = 'Cancelled ('.$jigoshop_orders->cancelled_count.')'; - $views['refunded'] = 'Refunded ('.$jigoshop_orders->refunded_count.')'; + $views['pending'] = 'Pending ('.$woocommerce_orders->pending_count.')'; + $views['onhold'] = 'On-Hold ('.$woocommerce_orders->on_hold_count.')'; + $views['processing'] = 'Processing ('.$woocommerce_orders->processing_count.')'; + $views['completed'] = 'Completed ('.$woocommerce_orders->completed_count.')'; + $views['cancelled'] = 'Cancelled ('.$woocommerce_orders->cancelled_count.')'; + $views['refunded'] = 'Refunded ('.$woocommerce_orders->refunded_count.')'; if ($pending || $onhold || $processing || $completed || $cancelled || $refunded) : @@ -300,44 +299,44 @@ function jigoshop_custom_order_views( $views ) { return $views; } -add_filter('views_edit-shop_order', 'jigoshop_custom_order_views'); +add_filter('views_edit-shop_order', 'woocommerce_custom_order_views'); /** * Order page actions **/ -function jigoshop_remove_row_actions( $actions ) { +function woocommerce_remove_row_actions( $actions ) { if( get_post_type() === 'shop_order' ) : unset( $actions['view'] ); unset( $actions['inline hide-if-no-js'] ); endif; return $actions; } -add_filter( 'post_row_actions', 'jigoshop_remove_row_actions', 10, 1 ); +add_filter( 'post_row_actions', 'woocommerce_remove_row_actions', 10, 1 ); /** * Order page views **/ -function jigoshop_bulk_actions( $actions ) { +function woocommerce_bulk_actions( $actions ) { return array(); } -add_filter( 'bulk_actions-edit-shop_order', 'jigoshop_bulk_actions' ); +add_filter( 'bulk_actions-edit-shop_order', 'woocommerce_bulk_actions' ); /** * Order messages **/ -function jigoshop_post_updated_messages( $messages ) { +function woocommerce_post_updated_messages( $messages ) { if( get_post_type() === 'shop_order' ) : - $messages['post'][1] = sprintf( __('Order updated.', 'jigoshop') ); - $messages['post'][4] = sprintf( __('Order updated.', 'jigoshop') ); - $messages['post'][6] = sprintf( __('Order published.', 'jigoshop') ); + $messages['post'][1] = sprintf( __('Order updated.', 'woothemes') ); + $messages['post'][4] = sprintf( __('Order updated.', 'woothemes') ); + $messages['post'][6] = sprintf( __('Order published.', 'woothemes') ); - $messages['post'][8] = sprintf( __('Order submitted.', 'jigoshop') ); - $messages['post'][10] = sprintf( __('Order draft updated.', 'jigoshop') ); + $messages['post'][8] = sprintf( __('Order submitted.', 'woothemes') ); + $messages['post'][10] = sprintf( __('Order draft updated.', 'woothemes') ); endif; return $messages; } -add_filter( 'post_updated_messages', 'jigoshop_post_updated_messages' ); +add_filter( 'post_updated_messages', 'woocommerce_post_updated_messages' ); diff --git a/admin/admin-settings.php b/admin/admin-settings.php new file mode 100644 index 00000000000..71958568700 --- /dev/null +++ b/admin/admin-settings.php @@ -0,0 +1,1082 @@ + 'tab', 'tabname' => __('General', 'woothemes') ), + + array( 'name' => __('General Options', 'woothemes'), 'type' => 'title', 'desc' => '' ), + + array( + 'name' => __('Demo store', 'woothemes'), + 'desc' => '', + 'tip' => __('Enable this option to show a banner at the top of the page stating its a demo store.', 'woothemes'), + 'id' => 'woocommerce_demo_store', + 'css' => 'min-width:100px;', + 'std' => 'no', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('Enable SKU field', 'woothemes'), + 'desc' => '', + 'tip' => __('Turning off the SKU field will give products an SKU of their post id.', 'woothemes'), + 'id' => 'woocommerce_enable_sku', + 'css' => 'min-width:100px;', + 'std' => 'yes', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('Enable weight field', 'woothemes'), + 'desc' => '', + 'tip' => '', + 'id' => 'woocommerce_enable_weight', + 'css' => 'min-width:100px;', + 'std' => 'yes', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('Weight Unit', 'woothemes'), + 'desc' => __("This controls what unit you will define weights in.", 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_weight_unit', + 'css' => 'min-width:200px;', + 'std' => 'GBP', + 'type' => 'select', + 'options' => array( + 'kg' => __('kg', 'woothemes'), + 'lbs' => __('lbs', 'woothemes') + ) + ), + + array( + 'name' => __('Base Country/Region', 'woothemes'), + 'desc' => '', + 'tip' => __('This is the base country for your business. Tax rates will be based on this country.', 'woothemes'), + 'id' => 'woocommerce_default_country', + 'css' => '', + 'std' => 'GB', + 'type' => 'single_select_country' + ), + + array( + 'name' => __('Allowed Countries', 'woothemes'), + 'desc' => '', + 'tip' => __('These are countries that you are willing to ship to.', 'woothemes'), + 'id' => 'woocommerce_allowed_countries', + 'css' => 'min-width:100px;', + 'std' => 'all', + 'type' => 'select', + 'options' => array( + 'all' => __('All Countries', 'woothemes'), + 'specific' => __('Specific Countries', 'woothemes') + ) + ), + + array( + 'name' => __('Specific Countries', 'woothemes'), + 'desc' => '', + 'tip' => '', + 'id' => 'woocommerce_specific_allowed_countries', + 'css' => '', + 'std' => '', + 'type' => 'multi_select_countries' + ), + + array( + 'name' => __('Enable guest checkout?', 'woothemes'), + 'desc' => '', + 'tip' => __('Without guest checkout, all users will require an account in order to checkout.', 'woothemes'), + 'id' => 'woocommerce_enable_guest_checkout', + 'css' => 'min-width:100px;', + 'std' => 'yes', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('Force SSL on checkout?', 'woothemes'), + 'desc' => '', + 'tip' => __('Forcing SSL is recommended', 'woothemes'), + 'id' => 'woocommerce_force_ssl_checkout', + 'css' => 'min-width:100px;', + 'std' => 'no', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('ShareThis Publisher ID', 'woothemes'), + 'desc' => __("Enter your ShareThis publisher ID to show ShareThis on product pages.", 'woothemes'), + 'tip' => __('ShareThis is a small social sharing widget for posting links on popular sites such as Twitter and Facebook.', 'woothemes'), + 'id' => 'woocommerce_sharethis', + 'css' => 'width:300px;', + 'type' => 'text', + 'std' => '' + ), + + array( + 'name' => __('Disable WooCommerce frontend.css', 'woothemes'), + 'desc' => '', + 'tip' => __('Useful if you want to disable WooCommerce styles and theme it yourself via your theme.', 'woothemes'), + 'id' => 'woocommerce_disable_css', + 'css' => 'min-width:100px;', + 'std' => 'no', + 'type' => 'select', + 'options' => array( + 'no' => __('No', 'woothemes'), + 'yes' => __('Yes', 'woothemes') + ) + ), + + array( 'type' => 'tabend'), + + array( 'type' => 'tab', 'tabname' => __('Pages', 'woothemes') ), + + array( 'name' => __('Shop page configuration', 'woothemes'), 'type' => 'title', 'desc' => '' ), + + array( + 'name' => __('Cart Page', 'woothemes'), + 'desc' => __('Your page should contain [woocommerce_cart]', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_cart_page_id', + 'css' => 'min-width:50px;', + 'type' => 'single_select_page', + 'std' => '' + ), + + array( + 'name' => __('Checkout Page', 'woothemes'), + 'desc' => __('Your page should contain [woocommerce_checkout]', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_checkout_page_id', + 'css' => 'min-width:50px;', + 'type' => 'single_select_page', + 'std' => '' + ), + + array( + 'name' => __('Pay Page', 'woothemes'), + 'desc' => __('Your page should contain [woocommerce_pay] and usually have "Checkout" as the parent.', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_pay_page_id', + 'css' => 'min-width:50px;', + 'type' => 'single_select_page', + 'std' => '' + ), + + array( + 'name' => __('Thanks Page', 'woothemes'), + 'desc' => __('Your page should contain [woocommerce_thankyou] and usually have "Checkout" as the parent.', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_thanks_page_id', + 'css' => 'min-width:50px;', + 'type' => 'single_select_page', + 'std' => '' + ), + + array( + 'name' => __('My Account Page', 'woothemes'), + 'desc' => __('Your page should contain [woocommerce_my_account]', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_myaccount_page_id', + 'css' => 'min-width:50px;', + 'type' => 'single_select_page', + 'std' => '' + ), + + array( + 'name' => __('Edit Address Page', 'woothemes'), + 'desc' => __('Your page should contain [woocommerce_edit_address] and usually have "My Account" as the parent.', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_edit_address_page_id', + 'css' => 'min-width:50px;', + 'type' => 'single_select_page', + 'std' => '' + ), + + array( + 'name' => __('View Order Page', 'woothemes'), + 'desc' => __('Your page should contain [woocommerce_view_order] and usually have "My Account" as the parent.', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_view_order_page_id', + 'css' => 'min-width:50px;', + 'type' => 'single_select_page', + 'std' => '' + ), + + array( + 'name' => __('Change Password Page', 'woothemes'), + 'desc' => __('Your page should contain [woocommerce_change_password] and usually have "My Account" as the parent.', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_change_password_page_id', + 'css' => 'min-width:50px;', + 'type' => 'single_select_page', + 'std' => '' + ), + + array( 'type' => 'tabend'), + + array( 'type' => 'tab', 'tabname' => __('Catalog', 'woothemes') ), + + array( 'name' => __('Catalog Options', 'woothemes'), 'type' => 'title','desc' => '', 'id' => '' ), + + + array( + 'name' => __('Products Base Page', 'woothemes'), + 'desc' => sprintf( __("IMPORTANT: You must re-save your permalinks for this change to take effect.", 'woothemes'), 'options-permalink.php' ), + 'tip' => __('This sets the base page of your shop. You should not change this value once you have launched your site otherwise you risk breaking urls of other sites pointing to yours, etc.', 'woothemes'), + 'id' => 'woocommerce_shop_page_id', + 'css' => 'min-width:50px;', + 'type' => 'single_select_page', + 'std' => '' + ), + + array( + 'name' => __('Prepend shop categories/tags with base page?', 'woothemes'), + 'desc' => sprintf( __("IMPORTANT: You must re-save your permalinks for this change to take effect.", 'woothemes'), 'options-permalink.php' ), + 'tip' => __('If set to yes, categories will show up as your_base_page/shop_category instead of just shop_category.', 'woothemes'), + 'id' => 'woocommerce_prepend_shop_page_to_urls', + 'css' => 'min-width:100px;', + 'std' => 'no', + 'type' => 'select', + 'options' => array( + 'no' => __('No', 'woothemes'), + 'yes' => __('Yes', 'woothemes') + ) + ), + + array( + 'name' => __('Terms page ID', 'woothemes'), + 'desc' => __('If you define a "Terms" page the customer will be asked if they accept them when checking out.', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_terms_page_id', + 'css' => 'min-width:50px;', + 'std' => '', + 'type' => 'single_select_page', + 'args' => 'show_option_none=' . __('None', 'woothemes'), + ), + + array( 'name' => __('Pricing Options', 'woothemes'), 'type' => 'title','desc' => '', 'id' => '' ), + + array( + 'name' => __('Currency', 'woothemes'), + 'desc' => sprintf( __("This controls what currency prices are listed at in the catalog, and which currency PayPal, and other gateways, will take payments in. See the list of supported PayPal currencies.", 'woothemes'), 'https://www.paypal.com/cgi-bin/webscr?cmd=p/sell/mc/mc_intro-outside' ), + 'tip' => '', + 'id' => 'woocommerce_currency', + 'css' => 'min-width:200px;', + 'std' => 'GBP', + 'type' => 'select', + 'options' => apply_filters('woocommerce_currencies', array( + 'USD' => __('US Dollars ($)', 'woothemes'), + 'EUR' => __('Euros (€)', 'woothemes'), + 'GBP' => __('Pounds Sterling (£)', 'woothemes'), + 'AUD' => __('Australian Dollars ($)', 'woothemes'), + 'BRL' => __('Brazilian Real ($)', 'woothemes'), + 'CAD' => __('Canadian Dollars ($)', 'woothemes'), + 'CZK' => __('Czech Koruna', 'woothemes'), + 'DKK' => __('Danish Krone', 'woothemes'), + 'HKD' => __('Hong Kong Dollar ($)', 'woothemes'), + 'HUF' => __('Hungarian Forint', 'woothemes'), + 'ILS' => __('Israeli Shekel', 'woothemes'), + 'JPY' => __('Japanese Yen (¥)', 'woothemes'), + 'MYR' => __('Malaysian Ringgits', 'woothemes'), + 'MXN' => __('Mexican Peso ($)', 'woothemes'), + 'NZD' => __('New Zealand Dollar ($)', 'woothemes'), + 'NOK' => __('Norwegian Krone', 'woothemes'), + 'PHP' => __('Philippine Pesos', 'woothemes'), + 'PLN' => __('Polish Zloty', 'woothemes'), + 'SGD' => __('Singapore Dollar ($)', 'woothemes'), + 'SEK' => __('Swedish Krona', 'woothemes'), + 'CHF' => __('Swiss Franc', 'woothemes'), + 'TWD' => __('Taiwan New Dollars', 'woothemes'), + 'THB' => __('Thai Baht', 'woothemes') + ) + ) + ), + + array( + 'name' => __('Currency Position', 'woothemes'), + 'desc' => __("This controls the position of the currency symbol.", 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_currency_pos', + 'css' => 'min-width:200px;', + 'std' => 'left', + 'type' => 'select', + 'options' => array( + 'left' => __('Left', 'woothemes'), + 'right' => __('Right', 'woothemes'), + 'left_space' => __('Left (with space)', 'woothemes'), + 'right_space' => __('Right (with space)', 'woothemes') + ) + ), + + array( + 'name' => __('Thousand separator', 'woothemes'), + 'desc' => __('This sets the thousand separator of displayed prices.', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_price_thousand_sep', + 'css' => 'width:30px;', + 'std' => ',', + 'type' => 'text', + ), + + array( + 'name' => __('Decimal separator', 'woothemes'), + 'desc' => __('This sets the decimal separator of displayed prices.', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_price_decimal_sep', + 'css' => 'width:30px;', + 'std' => '.', + 'type' => 'text', + ), + + array( + 'name' => __('Number of decimals', 'woothemes'), + 'desc' => __('This sets the number of decimal points shown in displayed prices.', 'woothemes'), + 'tip' => '', + 'id' => 'woocommerce_price_num_decimals', + 'css' => 'width:30px;', + 'std' => '2', + 'type' => 'text', + ), + + array( 'type' => 'tabend'), + + array( 'type' => 'tab', 'tabname' => __('Coupons', 'woothemes') ), + + array( 'name' => __('Coupon Codes', 'woothemes'), 'type' => 'title', 'desc' => '' ), + + array( + 'name' => __('Coupons', 'woothemes'), + 'desc' => 'All fields are required.', + 'tip' => 'Coupons allow you to give customers special offers and discounts. Leave product IDs blank to apply to all products/items in the cart.', + 'id' => 'woocommerce_coupons', + 'css' => 'min-width:50px;', + 'type' => 'coupons', + 'std' => '' + ), + + array( 'type' => 'tabend'), + + array( 'type' => 'tab', 'tabname' => __('Inventory', 'woothemes') ), + + array( 'name' => __('Inventory Options', 'woothemes'), 'type' => 'title','desc' => '', 'id' => '' ), + + array( + 'name' => __('Manage stock?', 'woothemes'), + 'desc' => __('If you are not managing stock, turn it off here to disable it in admin and on the front-end.', 'woothemes'), + 'tip' => __('You can manage stock on a per-item basis if you leave this option on.', 'woothemes'), + 'id' => 'woocommerce_manage_stock', + 'css' => 'min-width:100px;', + 'std' => 'yes', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('Low stock notification', 'woothemes'), + 'desc' => '', + 'tip' => __('Set the minimum threshold for this below.', 'woothemes'), + 'id' => 'woocommerce_notify_low_stock', + 'css' => 'min-width:100px;', + 'std' => 'yes', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('Low stock threshold', 'woothemes'), + 'desc' => '', + 'tip' => '', + 'id' => 'woocommerce_notify_low_stock_amount', + 'css' => 'min-width:50px;', + 'type' => 'text', + 'std' => '2' + ), + + array( + 'name' => __('Out-of-stock notification', 'woothemes'), + 'desc' => '', + 'tip' => __('Set the minimum threshold for this below.', 'woothemes'), + 'id' => 'woocommerce_notify_no_stock', + 'css' => 'min-width:100px;', + 'std' => 'yes', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('Out of stock threshold', 'woothemes'), + 'desc' => '', + 'tip' => '', + 'id' => 'woocommerce_notify_no_stock_amount', + 'css' => 'min-width:50px;', + 'type' => 'text', + 'std' => '0' + ), + + array( 'type' => 'tabend'), + + array( 'type' => 'tab', 'tabname' => __('Shipping', 'woothemes') ), + + array( 'name' => __('Shipping Options', 'woothemes'), 'type' => 'title','desc' => '', 'id' => '' ), + + array( + 'name' => __('Calculate Shipping', 'woothemes'), + 'desc' => __('Only set this to no if you are not shipping items, or items have shipping costs included.', 'woothemes'), + 'tip' => __('If you are not calculating shipping then you can ignore all other tax options.', 'woothemes'), + 'id' => 'woocommerce_calc_shipping', + 'css' => 'min-width:100px;', + 'std' => 'yes', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('Enable shipping calculator on cart', 'woothemes'), + 'desc' => '', + 'tip' => '', + 'id' => 'woocommerce_enable_shipping_calc', + 'css' => 'min-width:100px;', + 'std' => 'yes', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('Only ship to billing address?', 'woothemes'), + 'desc' => '', + 'tip' => '', + 'id' => 'woocommerce_ship_to_billing_address_only', + 'css' => 'min-width:100px;', + 'std' => 'no', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( 'type' => 'shipping_options'), + + array( 'type' => 'tabend'), + + array( 'type' => 'tab', 'tabname' => __('Tax', 'woothemes') ), + + array( 'name' => __('Tax Options', 'woothemes'), 'type' => 'title','desc' => '', 'id' => '' ), + + array( + 'name' => __('Calculate Taxes', 'woothemes'), + 'desc' => __('Only set this to no if you are exclusively selling non-taxable items.', 'woothemes'), + 'tip' => __('If you are not calculating taxes then you can ignore all other tax options.', 'woothemes'), + 'id' => 'woocommerce_calc_taxes', + 'css' => 'min-width:100px;', + 'std' => 'yes', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('Catalog Prices include tax?', 'woothemes'), + 'desc' => '', + 'tip' => __('If prices include tax then tax calculations will work backwards.', 'woothemes'), + 'id' => 'woocommerce_prices_include_tax', + 'css' => 'min-width:100px;', + 'std' => 'yes', + 'type' => 'select', + 'options' => array( + 'yes' => __('Yes', 'woothemes'), + 'no' => __('No', 'woothemes') + ) + ), + + array( + 'name' => __('Cart totals display...', 'woothemes'), + 'desc' => '', + 'tip' => __('Should the subtotal be shown including or excluding tax on the frontend?', 'woothemes'), + 'id' => 'woocommerce_display_totals_tax', + 'css' => 'min-width:100px;', + 'std' => 'excluding', + 'type' => 'select', + 'options' => array( + 'including' => __('price including tax', 'woothemes'), + 'excluding' => __('price excluding tax', 'woothemes') + ) + ), + + array( + 'name' => __('Additional Tax classes', 'woothemes'), + 'desc' => __('List 1 per line. This is in addition to the default Standard Rate.', 'woothemes'), + 'tip' => __('List product and shipping tax classes here, e.g. Zero Tax, Reduced Rate.', 'woothemes'), + 'id' => 'woocommerce_tax_classes', + 'css' => 'width:100%; height: 75px;', + 'type' => 'textarea', + 'std' => "Reduced Rate\nZero Rate" + ), + + array( + 'name' => __('Tax rates', 'woothemes'), + 'desc' => 'All fields are required.', + 'tip' => 'To avoid rounding errors, insert tax rates with 4 decimal places.', + 'id' => 'woocommerce_tax_rates', + 'css' => 'min-width:50px;', + 'type' => 'tax_rates', + 'std' => '' + ), + + array( 'type' => 'tabend'), + + array( 'type' => 'tab', 'tabname' => __('Payment Gateways', 'woothemes') ), + + array( 'type' => 'gateway_options'), + + array( 'type' => 'tabend') + +) ); + +/** + * Update options + * + * Updates the options on the woocommerce settings page. + */ +function woocommerce_update_options($options) { + if(isset($_POST['submitted']) && $_POST['submitted'] == 'yes') { + foreach ($options as $value) { + if (isset($value['id']) && $value['id']=='woocommerce_tax_rates') : + + $tax_classes = array(); + $tax_countries = array(); + $tax_rate = array(); + $tax_rates = array(); + $tax_shipping = array(); + + if (isset($_POST['tax_class'])) $tax_classes = $_POST['tax_class']; + if (isset($_POST['tax_country'])) $tax_countries = $_POST['tax_country']; + if (isset($_POST['tax_rate'])) $tax_rate = $_POST['tax_rate']; + if (isset($_POST['tax_shipping'])) $tax_shipping = $_POST['tax_shipping']; + + for ($i=0; $i $country, + 'state' => $state, + 'rate' => $rate, + 'shipping' => $shipping, + 'class' => $class + ); + + endif; + + endfor; + + update_option($value['id'], $tax_rates); + + elseif (isset($value['id']) && $value['id']=='woocommerce_coupons') : + + $coupon_code = array(); + $coupon_type = array(); + $coupon_amount = array(); + $product_ids = array(); + $coupons = array(); + $individual = array(); + + if (isset($_POST['coupon_code'])) $coupon_code = $_POST['coupon_code']; + if (isset($_POST['coupon_type'])) $coupon_type = $_POST['coupon_type']; + if (isset($_POST['coupon_amount'])) $coupon_amount = $_POST['coupon_amount']; + if (isset($_POST['product_ids'])) $product_ids = $_POST['product_ids']; + if (isset($_POST['individual'])) $individual = $_POST['individual']; + + for ($i=0; $i $code, + 'amount' => $amount, + 'type' => $type, + 'products' => $products, + 'individual_use' => $individual_use + ); + endif; + + endif; + + endfor; + + update_option($value['id'], $coupons); + + elseif (isset($value['type']) && $value['type']=='multi_select_countries') : + + // Get countries array + if (isset($_POST[$value['id']])) $selected_countries = $_POST[$value['id']]; else $selected_countries = array(); + update_option($value['id'], $selected_countries); + + /* price separators get a special treatment as they should allow a spaces (don't trim) */ + elseif ( isset($value['id']) && ( $value['id'] == 'woocommerce_price_thousand_sep' || $value['id'] == 'woocommerce_price_decimal_sep' ) ): + + if( isset( $_POST[ $value['id'] ] ) ) { + update_option($value['id'], $_POST[$value['id']] ); + } else { + @delete_option($value['id']); + } + + else : + + if(isset($value['id']) && isset($_POST[$value['id']])) { + update_option($value['id'], woocommerce_clean($_POST[$value['id']])); + } else { + @delete_option($value['id']); + } + + endif; + + } + + do_action('woocommerce_update_options'); + + echo '

    '.__('Your settings have been saved.', 'woothemes').'

    '; + } +} + +/** + * Admin fields + * + * Loops though the woocommerce options array and outputs each field. + */ +function woocommerce_admin_fields($options) { + ?> +
    +

    + '; + foreach ($options as $value) { + if ( 'tab' == $value['type'] ) : + echo '
  • '.$value['tabname'].'
  • '. "\n"; + $counter = $counter + 1; + endif; + } + echo ''; + $counter = 1; + foreach ($options as $value) : + switch($value['type']) : + case 'string': + ?> + + + + + '; + echo ''. "\n\n"; + break; + case 'title': + ?> + + + + + + + + + '; + $counter = $counter + 1; + break; + case 'single_select_page' : + $page_setting = (int) get_option($value['id']); + + $args = array( 'name' => $value['id'], + 'id' => $value['id']. '" style="width: 200px;', + 'sort_column' => 'menu_order', + 'sort_order' => 'ASC', + 'selected' => $page_setting); + + if( isset($value['args']) ) $args = wp_parse_args($value['args'], $args); + + ?> + + + + + + + + + get_coupons(); + ?> + + + + + get_tax_classes(); + $tax_rates = get_option('woocommerce_tax_rates'); + ?> + + + + + admin_options(); + + endforeach; + + break; + case "gateway_options" : + + foreach (woocommerce_payment_gateways::payment_gateways() as $gateway) : + + $gateway->admin_options(); + + endforeach; + + break; + endswitch; + endforeach; + ?> +

    + + + + +
    +

    +

    +
    + + + +
    + 'tab', 'tabname' => __('General', 'jigoshop') ), - - array( 'name' => __('General Options', 'jigoshop'), 'type' => 'title', 'desc' => '' ), - - array( - 'name' => __('Demo store','jigoshop'), - 'desc' => '', - 'tip' => __('Enable this option to show a banner at the top of the page stating its a demo store.','jigoshop'), - 'id' => 'jigoshop_demo_store', - 'css' => 'min-width:100px;', - 'std' => 'no', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('Enable SKU field','jigoshop'), - 'desc' => '', - 'tip' => __('Turning off the SKU field will give products an SKU of their post id.','jigoshop'), - 'id' => 'jigoshop_enable_sku', - 'css' => 'min-width:100px;', - 'std' => 'yes', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('Enable weight field','jigoshop'), - 'desc' => '', - 'tip' => '', - 'id' => 'jigoshop_enable_weight', - 'css' => 'min-width:100px;', - 'std' => 'yes', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('Weight Unit', 'jigoshop'), - 'desc' => __("This controls what unit you will define weights in.", 'jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_weight_unit', - 'css' => 'min-width:200px;', - 'std' => 'GBP', - 'type' => 'select', - 'options' => array( - 'kg' => __('kg', 'jigoshop'), - 'lbs' => __('lbs', 'jigoshop') - ) - ), - - array( - 'name' => __('Base Country/Region','jigoshop'), - 'desc' => '', - 'tip' => __('This is the base country for your business. Tax rates will be based on this country.','jigoshop'), - 'id' => 'jigoshop_default_country', - 'css' => '', - 'std' => 'GB', - 'type' => 'single_select_country' - ), - - array( - 'name' => __('Allowed Countries','jigoshop'), - 'desc' => '', - 'tip' => __('These are countries that you are willing to ship to.','jigoshop'), - 'id' => 'jigoshop_allowed_countries', - 'css' => 'min-width:100px;', - 'std' => 'all', - 'type' => 'select', - 'options' => array( - 'all' => __('All Countries', 'jigoshop'), - 'specific' => __('Specific Countries', 'jigoshop') - ) - ), - - array( - 'name' => __('Specific Countries','jigoshop'), - 'desc' => '', - 'tip' => '', - 'id' => 'jigoshop_specific_allowed_countries', - 'css' => '', - 'std' => '', - 'type' => 'multi_select_countries' - ), - - array( - 'name' => __('Enable guest checkout?','jigoshop'), - 'desc' => '', - 'tip' => __('Without guest checkout, all users will require an account in order to checkout.','jigoshop'), - 'id' => 'jigoshop_enable_guest_checkout', - 'css' => 'min-width:100px;', - 'std' => 'yes', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('Force SSL on checkout?','jigoshop'), - 'desc' => '', - 'tip' => __('Forcing SSL is recommended','jigoshop'), - 'id' => 'jigoshop_force_ssl_checkout', - 'css' => 'min-width:100px;', - 'std' => 'no', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('ShareThis Publisher ID','jigoshop'), - 'desc' => __("Enter your ShareThis publisher ID to show ShareThis on product pages.",'jigoshop'), - 'tip' => __('ShareThis is a small social sharing widget for posting links on popular sites such as Twitter and Facebook.','jigoshop'), - 'id' => 'jigoshop_sharethis', - 'css' => 'width:300px;', - 'type' => 'text', - 'std' => '' - ), - - array( - 'name' => __('Disable Jigoshop frontend.css','jigoshop'), - 'desc' => '', - 'tip' => __('Useful if you want to disable Jigoshop styles and theme it yourself via your theme.','jigoshop'), - 'id' => 'jigoshop_disable_css', - 'css' => 'min-width:100px;', - 'std' => 'no', - 'type' => 'select', - 'options' => array( - 'no' => __('No', 'jigoshop'), - 'yes' => __('Yes', 'jigoshop') - ) - ), - - array( 'type' => 'tabend'), - - array( 'type' => 'tab', 'tabname' => __('Pages', 'jigoshop') ), - - array( 'name' => __('Shop page configuration', 'jigoshop'), 'type' => 'title', 'desc' => '' ), - - array( - 'name' => __('Cart Page','jigoshop'), - 'desc' => __('Your page should contain [jigoshop_cart]','jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_cart_page_id', - 'css' => 'min-width:50px;', - 'type' => 'single_select_page', - 'std' => '' - ), - - array( - 'name' => __('Checkout Page','jigoshop'), - 'desc' => __('Your page should contain [jigoshop_checkout]','jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_checkout_page_id', - 'css' => 'min-width:50px;', - 'type' => 'single_select_page', - 'std' => '' - ), - - array( - 'name' => __('Pay Page','jigoshop'), - 'desc' => __('Your page should contain [jigoshop_pay] and usually have "Checkout" as the parent.','jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_pay_page_id', - 'css' => 'min-width:50px;', - 'type' => 'single_select_page', - 'std' => '' - ), - - array( - 'name' => __('Thanks Page','jigoshop'), - 'desc' => __('Your page should contain [jigoshop_thankyou] and usually have "Checkout" as the parent.','jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_thanks_page_id', - 'css' => 'min-width:50px;', - 'type' => 'single_select_page', - 'std' => '' - ), - - array( - 'name' => __('My Account Page','jigoshop'), - 'desc' => __('Your page should contain [jigoshop_my_account]','jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_myaccount_page_id', - 'css' => 'min-width:50px;', - 'type' => 'single_select_page', - 'std' => '' - ), - - array( - 'name' => __('Edit Address Page','jigoshop'), - 'desc' => __('Your page should contain [jigoshop_edit_address] and usually have "My Account" as the parent.','jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_edit_address_page_id', - 'css' => 'min-width:50px;', - 'type' => 'single_select_page', - 'std' => '' - ), - - array( - 'name' => __('View Order Page','jigoshop'), - 'desc' => __('Your page should contain [jigoshop_view_order] and usually have "My Account" as the parent.','jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_view_order_page_id', - 'css' => 'min-width:50px;', - 'type' => 'single_select_page', - 'std' => '' - ), - - array( - 'name' => __('Change Password Page','jigoshop'), - 'desc' => __('Your page should contain [jigoshop_change_password] and usually have "My Account" as the parent.','jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_change_password_page_id', - 'css' => 'min-width:50px;', - 'type' => 'single_select_page', - 'std' => '' - ), - - array( 'type' => 'tabend'), - - array( 'type' => 'tab', 'tabname' => __('Catalog', 'jigoshop') ), - - array( 'name' => __('Catalog Options', 'jigoshop'), 'type' => 'title','desc' => '', 'id' => '' ), - - - array( - 'name' => __('Products Base Page','jigoshop'), - 'desc' => sprintf( __("IMPORTANT: You must re-save your permalinks for this change to take effect.",'jigoshop'), 'options-permalink.php' ), - 'tip' => __('This sets the base page of your shop. You should not change this value once you have launched your site otherwise you risk breaking urls of other sites pointing to yours, etc.','jigoshop'), - 'id' => 'jigoshop_shop_page_id', - 'css' => 'min-width:50px;', - 'type' => 'single_select_page', - 'std' => '' - ), - - array( - 'name' => __('Prepend shop categories/tags with base page?','jigoshop'), - 'desc' => sprintf( __("IMPORTANT: You must re-save your permalinks for this change to take effect.",'jigoshop'), 'options-permalink.php' ), - 'tip' => __('If set to yes, categories will show up as your_base_page/shop_category instead of just shop_category.', 'jigoshop'), - 'id' => 'jigoshop_prepend_shop_page_to_urls', - 'css' => 'min-width:100px;', - 'std' => 'no', - 'type' => 'select', - 'options' => array( - 'no' => __('No', 'jigoshop'), - 'yes' => __('Yes', 'jigoshop') - ) - ), - - array( - 'name' => __('Terms page ID', 'jigoshop'), - 'desc' => __('If you define a "Terms" page the customer will be asked if they accept them when checking out.', 'jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_terms_page_id', - 'css' => 'min-width:50px;', - 'std' => '', - 'type' => 'single_select_page', - 'args' => 'show_option_none=' . __('None', 'jigoshop'), - ), - - array( 'name' => __('Pricing Options', 'jigoshop'), 'type' => 'title','desc' => '', 'id' => '' ), - - array( - 'name' => __('Currency', 'jigoshop'), - 'desc' => sprintf( __("This controls what currency prices are listed at in the catalog, and which currency PayPal, and other gateways, will take payments in. See the list of supported PayPal currencies.", 'jigoshop'), 'https://www.paypal.com/cgi-bin/webscr?cmd=p/sell/mc/mc_intro-outside' ), - 'tip' => '', - 'id' => 'jigoshop_currency', - 'css' => 'min-width:200px;', - 'std' => 'GBP', - 'type' => 'select', - 'options' => apply_filters('jigoshop_currencies', array( - 'USD' => __('US Dollars ($)', 'jigoshop'), - 'EUR' => __('Euros (€)', 'jigoshop'), - 'GBP' => __('Pounds Sterling (£)', 'jigoshop'), - 'AUD' => __('Australian Dollars ($)', 'jigoshop'), - 'BRL' => __('Brazilian Real ($)', 'jigoshop'), - 'CAD' => __('Canadian Dollars ($)', 'jigoshop'), - 'CZK' => __('Czech Koruna', 'jigoshop'), - 'DKK' => __('Danish Krone', 'jigoshop'), - 'HKD' => __('Hong Kong Dollar ($)', 'jigoshop'), - 'HUF' => __('Hungarian Forint', 'jigoshop'), - 'ILS' => __('Israeli Shekel', 'jigoshop'), - 'JPY' => __('Japanese Yen (¥)', 'jigoshop'), - 'MYR' => __('Malaysian Ringgits', 'jigoshop'), - 'MXN' => __('Mexican Peso ($)', 'jigoshop'), - 'NZD' => __('New Zealand Dollar ($)', 'jigoshop'), - 'NOK' => __('Norwegian Krone', 'jigoshop'), - 'PHP' => __('Philippine Pesos', 'jigoshop'), - 'PLN' => __('Polish Zloty', 'jigoshop'), - 'SGD' => __('Singapore Dollar ($)', 'jigoshop'), - 'SEK' => __('Swedish Krona', 'jigoshop'), - 'CHF' => __('Swiss Franc', 'jigoshop'), - 'TWD' => __('Taiwan New Dollars', 'jigoshop'), - 'THB' => __('Thai Baht', 'jigoshop') - ) - ) - ), - - array( - 'name' => __('Currency Position', 'jigoshop'), - 'desc' => __("This controls the position of the currency symbol.", 'jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_currency_pos', - 'css' => 'min-width:200px;', - 'std' => 'left', - 'type' => 'select', - 'options' => array( - 'left' => __('Left', 'jigoshop'), - 'right' => __('Right', 'jigoshop'), - 'left_space' => __('Left (with space)', 'jigoshop'), - 'right_space' => __('Right (with space)', 'jigoshop') - ) - ), - - array( - 'name' => __('Thousand separator', 'jigoshop'), - 'desc' => __('This sets the thousand separator of displayed prices.', 'jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_price_thousand_sep', - 'css' => 'width:30px;', - 'std' => ',', - 'type' => 'text', - ), - - array( - 'name' => __('Decimal separator', 'jigoshop'), - 'desc' => __('This sets the decimal separator of displayed prices.', 'jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_price_decimal_sep', - 'css' => 'width:30px;', - 'std' => '.', - 'type' => 'text', - ), - - array( - 'name' => __('Number of decimals', 'jigoshop'), - 'desc' => __('This sets the number of decimal points shown in displayed prices.', 'jigoshop'), - 'tip' => '', - 'id' => 'jigoshop_price_num_decimals', - 'css' => 'width:30px;', - 'std' => '2', - 'type' => 'text', - ), - - array( 'type' => 'tabend'), - - array( 'type' => 'tab', 'tabname' => __('Coupons', 'jigoshop') ), - - array( 'name' => __('Coupon Codes', 'jigoshop'), 'type' => 'title', 'desc' => '' ), - - array( - 'name' => __('Coupons','jigoshop'), - 'desc' => 'All fields are required.', - 'tip' => 'Coupons allow you to give customers special offers and discounts. Leave product IDs blank to apply to all products/items in the cart.', - 'id' => 'jigoshop_coupons', - 'css' => 'min-width:50px;', - 'type' => 'coupons', - 'std' => '' - ), - - array( 'type' => 'tabend'), - - array( 'type' => 'tab', 'tabname' => __('Inventory', 'jigoshop') ), - - array( 'name' => __('Inventory Options', 'jigoshop'), 'type' => 'title','desc' => '', 'id' => '' ), - - array( - 'name' => __('Manage stock?','jigoshop'), - 'desc' => __('If you are not managing stock, turn it off here to disable it in admin and on the front-end.','jigoshop'), - 'tip' => __('You can manage stock on a per-item basis if you leave this option on.', 'jigoshop'), - 'id' => 'jigoshop_manage_stock', - 'css' => 'min-width:100px;', - 'std' => 'yes', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('Low stock notification','jigoshop'), - 'desc' => '', - 'tip' => __('Set the minimum threshold for this below.', 'jigoshop'), - 'id' => 'jigoshop_notify_low_stock', - 'css' => 'min-width:100px;', - 'std' => 'yes', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('Low stock threshold','jigoshop'), - 'desc' => '', - 'tip' => '', - 'id' => 'jigoshop_notify_low_stock_amount', - 'css' => 'min-width:50px;', - 'type' => 'text', - 'std' => '2' - ), - - array( - 'name' => __('Out-of-stock notification','jigoshop'), - 'desc' => '', - 'tip' => __('Set the minimum threshold for this below.', 'jigoshop'), - 'id' => 'jigoshop_notify_no_stock', - 'css' => 'min-width:100px;', - 'std' => 'yes', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('Out of stock threshold','jigoshop'), - 'desc' => '', - 'tip' => '', - 'id' => 'jigoshop_notify_no_stock_amount', - 'css' => 'min-width:50px;', - 'type' => 'text', - 'std' => '0' - ), - - array( 'type' => 'tabend'), - - array( 'type' => 'tab', 'tabname' => __('Shipping', 'jigoshop') ), - - array( 'name' => __('Shipping Options', 'jigoshop'), 'type' => 'title','desc' => '', 'id' => '' ), - - array( - 'name' => __('Calculate Shipping','jigoshop'), - 'desc' => __('Only set this to no if you are not shipping items, or items have shipping costs included.','jigoshop'), - 'tip' => __('If you are not calculating shipping then you can ignore all other tax options.', 'jigoshop'), - 'id' => 'jigoshop_calc_shipping', - 'css' => 'min-width:100px;', - 'std' => 'yes', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('Enable shipping calculator on cart','jigoshop'), - 'desc' => '', - 'tip' => '', - 'id' => 'jigoshop_enable_shipping_calc', - 'css' => 'min-width:100px;', - 'std' => 'yes', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('Only ship to billing address?','jigoshop'), - 'desc' => '', - 'tip' => '', - 'id' => 'jigoshop_ship_to_billing_address_only', - 'css' => 'min-width:100px;', - 'std' => 'no', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( 'type' => 'shipping_options'), - - array( 'type' => 'tabend'), - - array( 'type' => 'tab', 'tabname' => __('Tax', 'jigoshop') ), - - array( 'name' => __('Tax Options', 'jigoshop'), 'type' => 'title','desc' => '', 'id' => '' ), - - array( - 'name' => __('Calculate Taxes','jigoshop'), - 'desc' => __('Only set this to no if you are exclusively selling non-taxable items.','jigoshop'), - 'tip' => __('If you are not calculating taxes then you can ignore all other tax options.', 'jigoshop'), - 'id' => 'jigoshop_calc_taxes', - 'css' => 'min-width:100px;', - 'std' => 'yes', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('Catalog Prices include tax?','jigoshop'), - 'desc' => '', - 'tip' => __('If prices include tax then tax calculations will work backwards.','jigoshop'), - 'id' => 'jigoshop_prices_include_tax', - 'css' => 'min-width:100px;', - 'std' => 'yes', - 'type' => 'select', - 'options' => array( - 'yes' => __('Yes', 'jigoshop'), - 'no' => __('No', 'jigoshop') - ) - ), - - array( - 'name' => __('Cart totals display...','jigoshop'), - 'desc' => '', - 'tip' => __('Should the subtotal be shown including or excluding tax on the frontend?','jigoshop'), - 'id' => 'jigoshop_display_totals_tax', - 'css' => 'min-width:100px;', - 'std' => 'excluding', - 'type' => 'select', - 'options' => array( - 'including' => __('price including tax', 'jigoshop'), - 'excluding' => __('price excluding tax', 'jigoshop') - ) - ), - - array( - 'name' => __('Additional Tax classes','jigoshop'), - 'desc' => __('List 1 per line. This is in addition to the default Standard Rate.','jigoshop'), - 'tip' => __('List product and shipping tax classes here, e.g. Zero Tax, Reduced Rate.','jigoshop'), - 'id' => 'jigoshop_tax_classes', - 'css' => 'width:100%; height: 75px;', - 'type' => 'textarea', - 'std' => "Reduced Rate\nZero Rate" - ), - - array( - 'name' => __('Tax rates','jigoshop'), - 'desc' => 'All fields are required.', - 'tip' => 'To avoid rounding errors, insert tax rates with 4 decimal places.', - 'id' => 'jigoshop_tax_rates', - 'css' => 'min-width:50px;', - 'type' => 'tax_rates', - 'std' => '' - ), - - array( 'type' => 'tabend'), - - array( 'type' => 'tab', 'tabname' => __('Payment Gateways', 'jigoshop') ), - - array( 'type' => 'gateway_options'), - - array( 'type' => 'tabend') - -) ); diff --git a/admin/jigoshop-admin-settings.php b/admin/jigoshop-admin-settings.php deleted file mode 100644 index 91228121bc1..00000000000 --- a/admin/jigoshop-admin-settings.php +++ /dev/null @@ -1,516 +0,0 @@ - $country, - 'state' => $state, - 'rate' => $rate, - 'shipping' => $shipping, - 'class' => $class - ); - - endif; - - endfor; - - update_option($value['id'], $tax_rates); - - elseif (isset($value['id']) && $value['id']=='jigoshop_coupons') : - - $coupon_code = array(); - $coupon_type = array(); - $coupon_amount = array(); - $product_ids = array(); - $coupons = array(); - $individual = array(); - - if (isset($_POST['coupon_code'])) $coupon_code = $_POST['coupon_code']; - if (isset($_POST['coupon_type'])) $coupon_type = $_POST['coupon_type']; - if (isset($_POST['coupon_amount'])) $coupon_amount = $_POST['coupon_amount']; - if (isset($_POST['product_ids'])) $product_ids = $_POST['product_ids']; - if (isset($_POST['individual'])) $individual = $_POST['individual']; - - for ($i=0; $i $code, - 'amount' => $amount, - 'type' => $type, - 'products' => $products, - 'individual_use' => $individual_use - ); - endif; - - endif; - - endfor; - - update_option($value['id'], $coupons); - - elseif (isset($value['type']) && $value['type']=='multi_select_countries') : - - // Get countries array - if (isset($_POST[$value['id']])) $selected_countries = $_POST[$value['id']]; else $selected_countries = array(); - update_option($value['id'], $selected_countries); - - /* price separators get a special treatment as they should allow a spaces (don't trim) */ - elseif ( isset($value['id']) && ( $value['id'] == 'jigoshop_price_thousand_sep' || $value['id'] == 'jigoshop_price_decimal_sep' ) ): - - if( isset( $_POST[ $value['id'] ] ) ) { - update_option($value['id'], $_POST[$value['id']] ); - } else { - @delete_option($value['id']); - } - - else : - - if(isset($value['id']) && isset($_POST[$value['id']])) { - update_option($value['id'], jigowatt_clean($_POST[$value['id']])); - } else { - @delete_option($value['id']); - } - - endif; - - } - - do_action('jigoshop_update_options'); - - echo '

    '.__('Your settings have been saved.','jigoshop').'

    '; - } -} - -/** - * Admin fields - * - * Loops though the jigoshop options array and outputs each field. - * - * @since 1.0 - * @usedby jigoshop_settings() - * - * @param array $options List of options to go through and save - */ -function jigoshop_admin_fields($options) { - ?> -
    -

    - '; - foreach ($options as $value) { - if ( 'tab' == $value['type'] ) : - echo '
  • '.$value['tabname'].'
  • '. "\n"; - $counter = $counter + 1; - endif; - } - echo ''; - $counter = 1; - foreach ($options as $value) : - switch($value['type']) : - case 'string': - ?> -
    - - - - '; - echo '
     
    :
    :
    +
    : + +
    +
    : + +
    +
    : +
    : +
      $val) : + + echo '
    • '; + + endforeach; + ?>
    +
    : + + + + + + + + + + + + + 0) foreach( $coupon_codes as $coupon ) : $i++; + echo ''; + endforeach; + ?> + +
    ×
    +

    +
    : +
    + 0) foreach( $tax_rates as $rate ) : $i++; + echo '

    % ×

    '; + endforeach; + ?> +
    +

    +
    '. "\n\n"; - break; - case 'title': - ?> - - - - - - - - - '; - $counter = $counter + 1; - break; - case 'single_select_page' : - $page_setting = (int) get_option($value['id']); - - $args = array( 'name' => $value['id'], - 'id' => $value['id']. '" style="width: 200px;', - 'sort_column' => 'menu_order', - 'sort_order' => 'ASC', - 'selected' => $page_setting); - - if( isset($value['args']) ) $args = wp_parse_args($value['args'], $args); - - ?> - - - - - - - - - get_coupons(); - ?> - - - - - get_tax_classes(); - $tax_rates = get_option('jigoshop_tax_rates'); - ?> - - - - - admin_options(); - - endforeach; - - break; - case "gateway_options" : - - foreach (jigoshop_payment_gateways::payment_gateways() as $gateway) : - - $gateway->admin_options(); - - endforeach; - - break; - endswitch; - endforeach; - ?> -

    - - - - -
    -

    -

    -
    - - - -
    - – Note: if you edit quantities or remove items from the order you will need to manually change the item\'s stock levels.', 'jigoshop'), 'jigoshop_order_items_meta_box', 'shop_order', 'normal', 'high'); - add_meta_box( 'jigoshop-order-totals', __('Order Totals', 'jigoshop'), 'jigoshop_order_totals_meta_box', 'shop_order', 'side', 'default'); - - add_meta_box( 'jigoshop-order-actions', __('Order Actions', 'jigoshop'), 'jigoshop_order_actions_meta_box', 'shop_order', 'side', 'default'); - - remove_meta_box( 'commentstatusdiv', 'shop_order' , 'normal' ); - remove_meta_box( 'slugdiv', 'shop_order' , 'normal' ); -} - -/** - * Save meta boxes - * - * Runs when a post is saved and does an action which the write panel save scripts can hook into. - * - * @since 1.0 - */ -add_action( 'save_post', 'jigoshop_meta_boxes_save', 1, 2 ); - -function jigoshop_meta_boxes_save( $post_id, $post ) { - global $wpdb; - - if ( !$_POST ) return $post_id; - if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id; - if ( !isset($_POST['jigoshop_meta_nonce']) || (isset($_POST['jigoshop_meta_nonce']) && !wp_verify_nonce( $_POST['jigoshop_meta_nonce'], 'jigoshop_save_data' ))) return $post_id; - if ( !current_user_can( 'edit_post', $post_id )) return $post_id; - if ( $post->post_type != 'product' && $post->post_type != 'shop_order' ) return $post_id; - - do_action( 'jigoshop_process_'.$post->post_type.'_meta', $post_id, $post ); -} - -/** - * Product data - * - * Forces certain product data based on the product's type, e.g. grouped products cannot have a parent. - * - * @since 1.0 - */ -add_filter('wp_insert_post_data', 'jigoshop_product_data'); - -function jigoshop_product_data( $data ) { - global $post; - if ($data['post_type']=='product' && isset($_POST['product-type'])) { - $product_type = stripslashes( $_POST['product-type'] ); - switch($product_type) : - case "grouped" : - case "variable" : - $data['post_parent'] = 0; - break; - endswitch; - } - return $data; -} - -/** - * Order data - * - * Forces the order posts to have a title in a certain format (containing the date) - * - * @since 1.0 - */ -add_filter('wp_insert_post_data', 'jigoshop_order_data'); - -function jigoshop_order_data( $data ) { - global $post; - if ($data['post_type']=='shop_order' && isset($data['post_date'])) { - - $order_title = 'Order'; - if ($data['post_date']) $order_title.= ' – '.date('F j, Y @ h:i A', strtotime($data['post_date'])); - - $data['post_title'] = $order_title; - } - return $data; -} - - -/** - * Save errors - * - * Stores error messages in a variable so they can be displayed on the edit post screen after saving. - * - * @since 1.0 - */ -add_action( 'admin_notices', 'jigoshop_meta_boxes_save_errors' ); - -function jigoshop_meta_boxes_save_errors() { - $jigoshop_errors = maybe_unserialize(get_option('jigoshop_errors')); - if ($jigoshop_errors && sizeof($jigoshop_errors)>0) : - echo '
    '; - foreach ($jigoshop_errors as $error) : - echo '

    '.$error.'

    '; - endforeach; - echo '
    '; - update_option('jigoshop_errors', ''); - endif; -} - -/** - * Enqueue scripts - * - * Enqueue JavaScript used by the meta panels. - * - * @since 1.0 - */ -function jigoshop_write_panel_scripts() { - - $post_type = jigoshop_get_current_post_type(); - - if( $post_type !== 'product' && $post_type !== 'shop_order' ) return; - - wp_register_script('jigoshop-date', jigoshop::plugin_url() . '/assets/js/date.js'); - wp_register_script('jigoshop-datepicker', jigoshop::plugin_url() . '/assets/js/datepicker.js', array('jquery', 'jigoshop-date')); - - wp_enqueue_script('jigoshop-datepicker'); - - wp_register_script('jigoshop-writepanel', jigoshop::plugin_url() . '/assets/js/write-panels.js', array('jquery')); - wp_enqueue_script('jigoshop-writepanel'); - - wp_enqueue_script('media-upload'); - wp_enqueue_script('thickbox'); - wp_enqueue_style('thickbox'); - - $params = array( - 'remove_item_notice' => __("Remove this item? If you have previously reduced this item's stock, or this order was submitted by a customer, will need to manually restore the item's stock.", 'jigoshop'), - 'cart_total' => __("Calc totals based on order items, discount amount, and shipping?", 'jigoshop'), - 'copy_billing' => __("Copy billing information to shipping information? This will remove any currently entered shipping information.", 'jigoshop'), - 'prices_include_tax' => get_option('jigoshop_prices_include_tax'), - 'ID' => __('ID', 'jigoshop'), - 'item_name' => __('Item Name', 'jigoshop'), - 'quantity' => __('Quantity e.g. 2', 'jigoshop'), - 'cost_unit' => __('Cost per unit e.g. 2.99', 'jigoshop'), - 'tax_rate' => __('Tax Rate e.g. 20.0000', 'jigoshop'), - 'meta_name' => __('Meta Name', 'jigoshop'), - 'meta_value' => __('Meta Value', 'jigoshop'), - 'plugin_url' => jigoshop::plugin_url(), - 'ajax_url' => admin_url('admin-ajax.php'), - 'add_order_item_nonce' => wp_create_nonce("add-order-item") - ); - - wp_localize_script( 'jigoshop-writepanel', 'params', $params ); - - -} -add_action('admin_print_scripts-post.php', 'jigoshop_write_panel_scripts'); -add_action('admin_print_scripts-post-new.php', 'jigoshop_write_panel_scripts'); - -/** - * Meta scripts - * - * Outputs JavaScript used by the meta panels. - * - * @since 1.0 - */ -function jigoshop_meta_scripts() { - ?> - - -
    - parent product option.', 'jigoshop'); - ?> -
    - '.__('Grouped','jigoshop').''; - -} -add_action('product_type_selector', 'grouped_product_type_selector'); \ No newline at end of file diff --git a/admin/write-panels/product-types/virtual.php b/admin/write-panels/product-types/virtual.php deleted file mode 100644 index 8b5164a037b..00000000000 --- a/admin/write-panels/product-types/virtual.php +++ /dev/null @@ -1,44 +0,0 @@ - -
    - -
    - '.__('Virtual','jigoshop').''; - -} -add_action('product_type_selector', 'virtual_product_type_selector'); \ No newline at end of file diff --git a/admin/writepanels/writepanel-order_data.php b/admin/writepanels/writepanel-order_data.php new file mode 100644 index 00000000000..0e91ac206e6 --- /dev/null +++ b/admin/writepanels/writepanel-order_data.php @@ -0,0 +1,603 @@ +ID, 'order_data', true) ); + + if (!isset($data['billing_first_name'])) $data['billing_first_name'] = ''; + if (!isset($data['billing_last_name'])) $data['billing_last_name'] = ''; + if (!isset($data['billing_company'])) $data['billing_company'] = ''; + if (!isset($data['billing_address_1'])) $data['billing_address_1'] = ''; + if (!isset($data['billing_address_2'])) $data['billing_address_2'] = ''; + if (!isset($data['billing_city'])) $data['billing_city'] = ''; + if (!isset($data['billing_postcode'])) $data['billing_postcode'] = ''; + if (!isset($data['billing_country'])) $data['billing_country'] = ''; + if (!isset($data['billing_state'])) $data['billing_state'] = ''; + if (!isset($data['billing_email'])) $data['billing_email'] = ''; + if (!isset($data['billing_phone'])) $data['billing_phone'] = ''; + if (!isset($data['shipping_first_name'])) $data['shipping_first_name'] = ''; + if (!isset($data['shipping_last_name'])) $data['shipping_last_name'] = ''; + if (!isset($data['shipping_company'])) $data['shipping_company'] = ''; + if (!isset($data['shipping_address_1'])) $data['shipping_address_1'] = ''; + if (!isset($data['shipping_address_2'])) $data['shipping_address_2'] = ''; + if (!isset($data['shipping_city'])) $data['shipping_city'] = ''; + if (!isset($data['shipping_postcode'])) $data['shipping_postcode'] = ''; + if (!isset($data['shipping_country'])) $data['shipping_country'] = ''; + if (!isset($data['shipping_state'])) $data['shipping_state'] = ''; + + $data['customer_user'] = (int) get_post_meta($post->ID, 'customer_user', true); + + $order_status = wp_get_post_terms($post->ID, 'shop_order_status'); + if ($order_status) : + $order_status = current($order_status); + $data['order_status'] = $order_status->slug; + else : + $data['order_status'] = 'pending'; + endif; + + if (!isset($post->post_title) || empty($post->post_title)) : + $order_title = 'Order'; + else : + $order_title = $post->post_title; + endif; + + ?> + +
    + + + + + +
    + +

    +

    + +

    +

    + +

    +

    +
    + +
    'billing_first_name', 'label' => 'First Name:' ); + echo '

    +

    '; + + // Last Name + $field = array( 'id' => 'billing_last_name', 'label' => 'Last Name:' ); + echo '

    +

    '; + + // Company + $field = array( 'id' => 'billing_company', 'label' => 'Company:' ); + echo '

    +

    '; + + // Address 1 + $field = array( 'id' => 'billing_address_1', 'label' => 'Address 1:' ); + echo '

    +

    '; + + // Address 2 + $field = array( 'id' => 'billing_address_2', 'label' => 'Address 2:' ); + echo '

    +

    '; + + // City + $field = array( 'id' => 'billing_city', 'label' => 'City:' ); + echo '

    +

    '; + + // Postcode + $field = array( 'id' => 'billing_postcode', 'label' => 'Postcode:' ); + echo '

    +

    '; + + // Country + $field = array( 'id' => 'billing_country', 'label' => 'Country:' ); + echo '

    +

    '; + + // State + $field = array( 'id' => 'billing_state', 'label' => 'State/County:' ); + echo '

    +

    '; + + // Email + $field = array( 'id' => 'billing_email', 'label' => 'Email Address:' ); + echo '

    +

    '; + + // Tel + $field = array( 'id' => 'billing_phone', 'label' => 'Tel:' ); + echo '

    +

    '; + + ?> +
    + +
    + +

    + 'shipping_first_name', 'label' => 'First Name:' ); + echo '

    +

    '; + + // Last Name + $field = array( 'id' => 'shipping_last_name', 'label' => 'Last Name:' ); + echo '

    +

    '; + + // Company + $field = array( 'id' => 'shipping_company', 'label' => 'Company:' ); + echo '

    +

    '; + + // Address 1 + $field = array( 'id' => 'shipping_address_1', 'label' => 'Address 1:' ); + echo '

    +

    '; + + // Address 2 + $field = array( 'id' => 'shipping_address_2', 'label' => 'Address 2:' ); + echo '

    +

    '; + + // City + $field = array( 'id' => 'shipping_city', 'label' => 'City:' ); + echo '

    +

    '; + + // Postcode + $field = array( 'id' => 'shipping_postcode', 'label' => 'Postcode:' ); + echo '

    +

    '; + + // Country + $field = array( 'id' => 'shipping_country', 'label' => 'Country:' ); + echo '

    +

    '; + + // State + $field = array( 'id' => 'shipping_state', 'label' => 'State/County:' ); + echo '

    +

    '; + + ?> +
    +
    + ID, 'order_items', true) ); + ?> +
    +
     
    :
    :
    -
    : - -
    -
    : - -
    -
    : -
    : -
      $val) : - - echo '
    • '; - - endforeach; - ?>
    -
    : - - - - - - - - - - - - - 0) foreach( $coupon_codes as $coupon ) : $i++; - echo ''; - endforeach; - ?> - -
    ×
    -

    -
    : -
    - 0) foreach( $tax_rates as $rate ) : $i++; - echo '

    % ×

    '; - endforeach; - ?> -
    -

    -
    + + + + + + + + + + + + + + + + + + 0 && isset($order_items[0]['id'])) foreach ($order_items as $item) : + + if (isset($item['variation_id']) && $item['variation_id'] > 0) : + $_product = &new woocommerce_product_variation( $item['variation_id'] ); + else : + $_product = &new woocommerce_product( $item['id'] ); + endif; + + ?> + + + + + + + + + + + + + + + +
    sku) echo $_product->sku; ?>variation_data)) : + echo woocommerce_get_formatted_variation( $_product->variation_data, true ); + else : + echo '-'; + endif; + ?> + + + + + + + +
    +
    + + + +
    +
    +

    + + + +

    +

    + +

    + +
    + +
      +
    • + +
    • +
    • + +
    • + +
    • + ID ) ) { + if ( !EMPTY_TRASH_DAYS ) + $delete_text = __('Delete Permanently'); + else + $delete_text = __('Move to Trash'); + ?> + +
    • +
    + ID, 'order_data', true) ); + + if (!isset($data['shipping_method'])) $data['shipping_method'] = ''; + if (!isset($data['payment_method'])) $data['payment_method'] = ''; + if (!isset($data['order_subtotal'])) $data['order_subtotal'] = ''; + if (!isset($data['order_shipping'])) $data['order_shipping'] = ''; + if (!isset($data['order_discount'])) $data['order_discount'] = ''; + if (!isset($data['order_tax'])) $data['order_tax'] = ''; + if (!isset($data['order_total'])) $data['order_total'] = ''; + if (!isset($data['order_shipping_tax'])) $data['order_shipping_tax'] = ''; + ?> +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + update_status( $_POST['order_status'] ); + + // Order items + $order_items = array(); + + if (isset($_POST['item_id'])) : + $item_id = $_POST['item_id']; + $item_variation= $_POST['item_variation']; + $item_name = $_POST['item_name']; + $item_quantity = $_POST['item_quantity']; + $item_cost = $_POST['item_cost']; + $item_tax_rate = $_POST['item_tax_rate']; + + for ($i=0; $i htmlspecialchars(stripslashes($item_id[$i])), + 'variation_id' => (int) $item_variation[$i], + 'name' => htmlspecialchars(stripslashes($item_name[$i])), + 'qty' => (int) $item_quantity[$i], + 'cost' => number_format(woocommerce_clean($item_cost[$i]), 2), + 'taxrate' => number_format(woocommerce_clean($item_tax_rate[$i]), 4) + )); + + endfor; + endif; + + // Save + update_post_meta( $post_id, 'order_data', $data ); + update_post_meta( $post_id, 'order_items', $order_items ); + + + // Handle button actions + + if (isset($_POST['reduce_stock']) && $_POST['reduce_stock'] && sizeof($order_items)>0) : + + $order->add_order_note( __('Manually reducing stock.', 'woothemes') ); + + foreach ($order_items as $order_item) : + + $_product = $order->get_product_from_item( $order_item ); + + if ($_product->exists) : + + if ($_product->managing_stock()) : + + $old_stock = $_product->stock; + + $new_quantity = $_product->reduce_stock( $order_item['qty'] ); + + $order->add_order_note( sprintf( __('Item #%s stock reduced from %s to %s.', 'woothemes'), $order_item['id'], $old_stock, $new_quantity) ); + + if ($new_quantity<0) : + do_action('woocommerce_product_on_backorder_notification', $order_item['id'], $values['quantity']); + endif; + + // stock status notifications + if (get_option('woocommerce_notify_no_stock_amount') && get_option('woocommerce_notify_no_stock_amount')>=$new_quantity) : + do_action('woocommerce_no_stock_notification', $order_item['id']); + elseif (get_option('woocommerce_notify_low_stock_amount') && get_option('woocommerce_notify_low_stock_amount')>=$new_quantity) : + do_action('woocommerce_low_stock_notification', $order_item['id']); + endif; + + endif; + + else : + + $order->add_order_note( sprintf( __('Item %s %s not found, skipping.', 'woothemes'), $order_item['id'], $order_item['name'] ) ); + + endif; + + endforeach; + + $order->add_order_note( __('Manual stock reduction complete.', 'woothemes') ); + + elseif (isset($_POST['restore_stock']) && $_POST['restore_stock'] && sizeof($order_items)>0) : + + $order->add_order_note( __('Manually restoring stock.', 'woothemes') ); + + foreach ($order_items as $order_item) : + + $_product = $order->get_product_from_item( $order_item ); + + if ($_product->exists) : + + if ($_product->managing_stock()) : + + $old_stock = $_product->stock; + + $new_quantity = $_product->increase_stock( $order_item['qty'] ); + + $order->add_order_note( sprintf( __('Item #%s stock increased from %s to %s.', 'woothemes'), $order_item['id'], $old_stock, $new_quantity) ); + + endif; + + else : + + $order->add_order_note( sprintf( __('Item %s %s not found, skipping.', 'woothemes'), $order_item['id'], $order_item['name'] ) ); + + endif; + + endforeach; + + $order->add_order_note( __('Manual stock restore complete.', 'woothemes') ); + + elseif (isset($_POST['invoice']) && $_POST['invoice']) : + + // Mail link to customer + woocommerce_pay_for_order_customer_notification( $order->id ); + + endif; + + // Error Handling + if (sizeof($woocommerce_errors)>0) update_option('woocommerce_errors', $woocommerce_errors); +} \ No newline at end of file diff --git a/admin/write-panels/product-types/downloadable.php b/admin/writepanels/writepanel-product-type-downloadable.php similarity index 72% rename from admin/write-panels/product-types/downloadable.php rename to admin/writepanels/writepanel-product-type-downloadable.php index 3019ac48c2b..d186582a689 100644 --- a/admin/write-panels/product-types/downloadable.php +++ b/admin/writepanels/writepanel-product-type-downloadable.php @@ -4,56 +4,50 @@ * * Functions specific to downloadable products (for the write panels) * - * @author Jigowatt - * @category Admin Write Panel Product Types - * @package JigoShop + * @author WooThemes + * @category Admin Write Panels + * @package WooCommerce */ /** * Product Options * * Product Options for the downloadable product type - * - * @since 1.0 */ function downloadable_product_type_options() { global $post; ?> -
    +
    ID, 'file_path', true); - $field = array( 'id' => 'file_path', 'label' => __('File path', 'jigoshop') ); + $field = array( 'id' => 'file_path', 'label' => __('File path', 'woothemes') ); echo '

    - '.ABSPATH.'

    '; + '.ABSPATH.'

    '; // Download Limit $download_limit = get_post_meta($post->ID, 'download_limit', true); - $field = array( 'id' => 'download_limit', 'label' => __('Download Limit', 'jigoshop') ); + $field = array( 'id' => 'download_limit', 'label' => __('Download Limit', 'woothemes') ); echo '

    - ' . __('Leave blank for unlimited re-downloads.', 'jigoshop') . '

    '; + ' . __('Leave blank for unlimited re-downloads.', 'woothemes') . '

    '; ?>
    '.__('Downloadable','jigoshop').''; + echo ''; } add_action('product_type_selector', 'downloadable_product_type_selector'); @@ -62,11 +56,6 @@ add_action('product_type_selector', 'downloadable_product_type_selector'); * Process meta * * Processes this product types options when a post is saved - * - * @since 1.0 - * - * @param array $data The $data being saved - * @param int $post_id The post id of the post being saved */ function filter_product_meta_downloadable( $data, $post_id ) { diff --git a/admin/write-panels/product-types/variable.php b/admin/writepanels/writepanel-product-type-variable.php similarity index 65% rename from admin/write-panels/product-types/variable.php rename to admin/writepanels/writepanel-product-type-variable.php index 954be68e486..6d1978bbb36 100644 --- a/admin/write-panels/product-types/variable.php +++ b/admin/writepanels/writepanel-product-type-variable.php @@ -4,17 +4,15 @@ * * Functions specific to variable products (for the write panels) * - * @author Jigowatt - * @category Admin Write Panel Product Types - * @package JigoShop + * @author WooThemes + * @category Admin Write Panels + * @package WooCommerce */ /** * Product Options * * Product Options for the variable product type - * - * @since 1.0 */ function variable_product_type_options() { global $post; @@ -24,7 +22,7 @@ function variable_product_type_options() { ?>
    -
    +
    'product_variation', @@ -44,12 +42,12 @@ function variable_product_type_options() { $image = wp_get_attachment_url( $variation_data['_thumbnail_id'][0] ); endif; - if (!$image) $image = jigoshop::plugin_url().'/assets/images/placeholder.png'; + if (!$image) $image = woocommerce::plugin_url().'/assets/images/placeholder.png'; ?> -
    +

    - - #ID; ?> — + + #ID; ?> — '; + echo '

    - +
    - - - - - - - + + + + + + +
    post_status, 'publish'); ?> />post_status, 'publish'); ?> />
    -

    +

    - +
    /assets/images/ajax-loader.gif) no-repeat center', opacity: 0.6 } }); + jQuery('.woocommerce_configurations').block({ message: null, overlayCSS: { background: '#fff url(/assets/images/ajax-loader.gif) no-repeat center', opacity: 0.6 } }); var data = { - action: 'jigoshop_add_variation', + action: 'woocommerce_add_variation', post_id: ID; ?>, security: '' }; @@ -131,12 +127,12 @@ function variable_product_write_panel_js() { var variation_id = parseInt(response); - var loop = jQuery('.jigoshop_configuration').size(); + var loop = jQuery('.woocommerce_configuration').size(); - jQuery('.jigoshop_configurations').append('
    \ + jQuery('.woocommerce_configurations').append('
    \

    \ - \ - \ + \ + \ '; + echo '

    \ - \ +
    \ \ \ - \ - \ - \ - \ - \ - \ - \ + \ + \ + \ + \ + \ + \ + \ \ \
    \
    '); - jQuery('.jigoshop_configurations').unblock(); + jQuery('.woocommerce_configurations').unblock(); }); @@ -179,7 +175,7 @@ function variable_product_write_panel_js() { }); jQuery('button.remove_variation').live('click', function(){ - var answer = confirm(''); + var answer = confirm(''); if (answer){ var el = jQuery(this).parent().parent(); @@ -188,10 +184,10 @@ function variable_product_write_panel_js() { if (variation>0) { - jQuery(el).block({ message: null, overlayCSS: { background: '#fff url(/assets/images/ajax-loader.gif) no-repeat center', opacity: 0.6 } }); + jQuery(el).block({ message: null, overlayCSS: { background: '#fff url(/assets/images/ajax-loader.gif) no-repeat center', opacity: 0.6 } }); var data = { - action: 'jigoshop_remove_variation', + action: 'woocommerce_remove_variation', variation_id: variation, security: '' }; @@ -255,12 +251,10 @@ add_action('product_write_panel_js', 'variable_product_write_panel_js'); /** * Delete variation via ajax function - * - * @since 1.0 */ -add_action('wp_ajax_jigoshop_remove_variation', 'jigoshop_remove_variation'); +add_action('wp_ajax_woocommerce_remove_variation', 'woocommerce_remove_variation'); -function jigoshop_remove_variation() { +function woocommerce_remove_variation() { check_ajax_referer( 'delete-variation', 'security' ); $variation_id = intval( $_POST['variation_id'] ); @@ -272,12 +266,10 @@ function jigoshop_remove_variation() { /** * Add variation via ajax function - * - * @since 1.0 */ -add_action('wp_ajax_jigoshop_add_variation', 'jigoshop_add_variation'); +add_action('wp_ajax_woocommerce_add_variation', 'woocommerce_add_variation'); -function jigoshop_add_variation() { +function woocommerce_add_variation() { check_ajax_referer( 'add-variation', 'security' ); @@ -305,14 +297,10 @@ function jigoshop_add_variation() { * Product Type selector * * Adds this product type to the product type selector in the product options meta box - * - * @since 1.0 - * - * @param string $product_type Passed the current product type so that if it keeps its selected state */ function variable_product_type_selector( $product_type ) { - echo ''; + echo ''; } add_action('product_type_selector', 'variable_product_type_selector'); @@ -321,11 +309,6 @@ add_action('product_type_selector', 'variable_product_type_selector'); * Process meta * * Processes this product types options when a post is saved - * - * @since 1.0 - * - * @param array $data The $data being saved - * @param int $post_id The post id of the post being saved */ function process_product_meta_variable( $data, $post_id ) { diff --git a/admin/writepanels/writepanel-product-types.php b/admin/writepanels/writepanel-product-types.php new file mode 100644 index 00000000000..5af4a53d50e --- /dev/null +++ b/admin/writepanels/writepanel-product-types.php @@ -0,0 +1,84 @@ + +
    + +
    + +
    + +
    + +
    + parent product option.', 'woothemes'); + ?> +
    + '.__('Virtual', 'woothemes').''; +} + +function grouped_product_type_selector( $product_type ) { + echo ''; +} diff --git a/admin/writepanels/writepanel-product_data.php b/admin/writepanels/writepanel-product_data.php new file mode 100644 index 00000000000..983d1de4511 --- /dev/null +++ b/admin/writepanels/writepanel-product_data.php @@ -0,0 +1,569 @@ +ID, 'product_data', true) ); + $featured = (string) get_post_meta( $post->ID, 'featured', true ); + $visibility = (string) get_post_meta( $post->ID, 'visibility', true); + + if (!isset($data['weight'])) $data['weight'] = ''; + if (!isset($data['regular_price'])) $data['regular_price'] = ''; + if (!isset($data['sale_price'])) $data['sale_price'] = ''; + + $thepostid = $post->ID; + + ?> +
    + + +
    slug; else $product_type = 'simple'; + $field = array( 'id' => 'product-type', 'label' => __('Product Type', 'woothemes') ); + echo '

    '; + + // List Grouped products + $posts_in = (array) get_objects_in_term( get_term_by( 'slug', 'grouped', 'product_type' )->term_id, 'product_type' ); + $posts_in = array_unique($posts_in); + + $field = array( 'id' => 'parent_id', 'label' => __('Parent post', 'woothemes') ); + echo '

    '; + + // Ordering + $menu_order = $post->menu_order; + $field = array( 'id' => 'menu_order', 'label' => _x('Post Order', 'ordering', 'woothemes') ); + echo ''; + + + // Summary + echo '

    +

    '; + + // SKU + $field = array( 'id' => 'sku', 'label' => __('SKU', 'woothemes') ); + $SKU = get_post_meta($thepostid, 'SKU', true); + + if( get_option('woocommerce_enable_sku', true) !== 'no' ) : + echo '

    + + ' . __('Leave blank to use product ID', 'woothemes') . '

    '; + else: + echo ''; + endif; + + // Weight + $field = array( 'id' => 'weight', 'label' => __('Weight', 'woothemes') . ' ('.get_option('woocommerce_weight_unit').'):' ); + + if( get_option('woocommerce_enable_weight', true) !== 'no' ) : + echo '

    + +

    '; + else: + echo ''; + endif; + + // Featured + $field = array( 'id' => 'featured', 'label' => __('Featured?', 'woothemes') ); + echo '

    '; + + // Visibility + $field = array( 'id' => 'visibility', 'label' => __('Visibility', 'woothemes') ); + echo '

    '; + ?> +
    +
    + + 'regular_price', 'label' => __('Regular Price', 'woothemes') . ' ('.get_woocommerce_currency_symbol().'):' ); + echo '

    + +

    '; + + // Special Price + $field = array( 'id' => 'sale_price', 'label' => __('Sale Price', 'woothemes') . ' ('.get_woocommerce_currency_symbol().'):' ); + echo '

    + +

    '; + + // Special Price date range + $field = array( 'id' => 'sale_price_dates', 'label' => __('Sale Price Dates', 'woothemes') ); + + $sale_price_dates_from = get_post_meta($thepostid, 'sale_price_dates_from', true); + $sale_price_dates_to = get_post_meta($thepostid, 'sale_price_dates_to', true); + + echo '

    + + + + ' . __('Date format', 'woothemes') . ': YYYY-MM-DD +

    '; + + // Tax + $_tax = new woocommerce_tax(); + + $field = array( 'id' => 'tax_status', 'label' => __('Tax Status', 'woothemes') ); + echo '

    '; + + $field = array( 'id' => 'tax_class', 'label' => __('Tax Class', 'woothemes') ); + echo '

    '; + ?> + +
    + +
    + + 'manage_stock', 'label' => __('Manage stock?', 'woothemes') ); + echo '

    '; + + // Stock status + $field = array( 'id' => 'stock_status', 'label' => 'Stock status:' ); + echo '

    '; + + echo '
    '; + + // Stock + $field = array( 'id' => 'stock', 'label' => __('Stock Qty', 'woothemes') ); + echo '

    + + +

    '; + + // Backorders? + $field = array( 'id' => 'backorders', 'label' => __('Allow Backorders?', 'woothemes') ); + echo '

    '; + + echo '
    '; + ?> + +
    + +
    + +
    + + + + + + + + + + + + + ID, 'product_attributes', true) ); + + $i = -1; + + // Taxonomies + if ( $attribute_taxonomies ) : + foreach ($attribute_taxonomies as $tax) : $i++; + + $attribute_nicename = strtolower(sanitize_title($tax->attribute_name)); + if (isset($attributes[$attribute_nicename])) $attribute = $attributes[$attribute_nicename]; + if (isset($attribute['visible']) && $attribute['visible']=='yes') $checked = 'checked="checked"'; else $checked = ''; + if (isset($attribute['variation']) && $attribute['variation']=='yes') $checked2 = 'checked="checked"'; else $checked2 = ''; + + $values = wp_get_post_terms( $thepostid, 'product_attribute_'.strtolower(sanitize_title($tax->attribute_name)) ); + $value = array(); + if (!is_wp_error($values) && $values) : + foreach ($values as $v) : + $value[] = $v->slug; + endforeach; + endif; + + ?>> + + + + + + + 0) foreach ($attributes as $attribute) : + if (isset($attribute['is_taxonomy']) && $attribute['is_taxonomy']=='yes') continue; + + $i++; + + if (isset($attribute['visible']) && $attribute['visible']=='yes') $checked = 'checked="checked"'; else $checked = ''; + if (isset($attribute['variation']) && $attribute['variation']=='yes') $checked2 = 'checked="checked"'; else $checked2 = ''; + + ?> + + + + + + + + +
    + + + + attribute_name; ?> + + + + attribute_type=="select" || $tax->attribute_type=="multiselect") : ?> + + attribute_type=="text") : ?> + + + name="attribute_visibility[]" value="1" /> name="attribute_variation[]" value="1" />
    + + + + + + name="attribute_visibility[]" value="1" /> name="attribute_variation[]" value="1" />
    +
    + + +
    +
    + + + +
    + htmlspecialchars(stripslashes($attribute_names[$i])), + 'value' => $attribute_values[$i], + 'position' => $attribute_position[$i], + 'visible' => $visible, + 'variation' => $variation, + 'is_taxonomy' => $is_taxonomy + ); + + if ($is_taxonomy=='yes') : + // Update post terms + $tax = $attribute_names[$i]; + $value = $attribute_values[$i]; + + if (taxonomy_exists('product_attribute_'.strtolower(sanitize_title($tax)))) : + + wp_set_object_terms( $post_id, $value, 'product_attribute_'.strtolower(sanitize_title($tax)) ); + + endif; + + endif; + + endfor; + endif; + + if (!function_exists('attributes_cmp')) { + function attributes_cmp($a, $b) { + if ($a['position'] == $b['position']) { + return 0; + } + return ($a['position'] < $b['position']) ? -1 : 1; + } + } + uasort($attributes, 'attributes_cmp'); + + // Product type + $product_type = sanitize_title( stripslashes( $_POST['product-type'] ) ); + if( !$product_type ) $product_type = 'simple'; + + wp_set_object_terms($post_id, $product_type, 'product_type'); + + // visibility + $visibility = stripslashes( $_POST['visibility'] ); + update_post_meta( $post_id, 'visibility', $visibility ); + + // Featured + $featured = stripslashes( $_POST['featured'] ); + update_post_meta( $post_id, 'featured', $featured ); + + // Unique SKU + $SKU = get_post_meta($post_id, 'SKU', true); + $new_sku = stripslashes( $_POST['sku'] ); + if ($new_sku!==$SKU) : + if ($new_sku && !empty($new_sku)) : + if ($wpdb->get_var("SELECT * FROM $wpdb->postmeta WHERE meta_key='SKU' AND meta_value='".$new_sku."';") || $wpdb->get_var("SELECT * FROM $wpdb->posts WHERE ID='".$new_sku."' AND ID!=".$post_id.";")) : + $woocommerce_errors[] = __('Product SKU must be unique.', 'woothemes'); + else : + update_post_meta( $post_id, 'SKU', $new_sku ); + endif; + else : + update_post_meta( $post_id, 'SKU', '' ); + endif; + endif; + + // Sales and prices + + if ($product_type!=='grouped') : + + $date_from = (isset($_POST['sale_price_dates_from'])) ? $_POST['sale_price_dates_from'] : ''; + $date_to = (isset($_POST['sale_price_dates_to'])) ? $_POST['sale_price_dates_to'] : ''; + + // Dates + if ($date_from) : + update_post_meta( $post_id, 'sale_price_dates_from', strtotime($date_from) ); + else : + update_post_meta( $post_id, 'sale_price_dates_from', '' ); + endif; + + if ($date_to) : + update_post_meta( $post_id, 'sale_price_dates_to', strtotime($date_to) ); + else : + update_post_meta( $post_id, 'sale_price_dates_to', '' ); + endif; + + if ($date_to && !$date_from) : + update_post_meta( $post_id, 'sale_price_dates_from', strtotime('NOW') ); + endif; + + // Update price if on sale + if ($data['sale_price'] && $date_to == '' && $date_from == '') : + update_post_meta( $post_id, 'price', $data['sale_price'] ); + else : + update_post_meta( $post_id, 'price', $data['regular_price'] ); + endif; + + if ($date_from && strtotime($date_from) < strtotime('NOW')) : + update_post_meta( $post_id, 'price', $data['sale_price'] ); + endif; + + if ($date_to && strtotime($date_to) < strtotime('NOW')) : + update_post_meta( $post_id, 'price', $data['regular_price'] ); + update_post_meta( $post_id, 'sale_price_dates_from', ''); + update_post_meta( $post_id, 'sale_price_dates_to', ''); + endif; + + else : + + $data['sale_price'] = ''; + $data['regular_price'] = ''; + update_post_meta( $post_id, 'sale_price_dates_from', '' ); + update_post_meta( $post_id, 'sale_price_dates_to', '' ); + update_post_meta( $post_id, 'price', '' ); + + endif; + + // Stock Data + + if (get_option('woocommerce_manage_stock')=='yes') : + // Manage Stock Checkbox + if ($product_type!=='grouped' && isset($_POST['manage_stock']) && $_POST['manage_stock']) : + + update_post_meta( $post_id, 'stock', $_POST['stock'] ); + $data['manage_stock'] = 'yes'; + $data['backorders'] = stripslashes( $_POST['backorders'] ); + + else : + + update_post_meta( $post_id, 'stock', '0' ); + $data['manage_stock'] = 'no'; + $data['backorders'] = 'no'; + + endif; + endif; + + // Apply filters to data + $data = apply_filters( 'process_product_meta', $data, $post_id ); + + // Apply filter to data for product type + $data = apply_filters( 'filter_product_meta_' . $product_type, $data, $post_id ); + + // Do action for product type + do_action( 'process_product_meta_' . $product_type, $data, $post_id ); + + // Save + update_post_meta( $post_id, 'product_attributes', $attributes ); + update_post_meta( $post_id, 'product_data', $data ); + update_option('woocommerce_errors', $woocommerce_errors); +} \ No newline at end of file diff --git a/admin/writepanels/writepanels-init.php b/admin/writepanels/writepanels-init.php new file mode 100644 index 00000000000..0a7a9767705 --- /dev/null +++ b/admin/writepanels/writepanels-init.php @@ -0,0 +1,176 @@ +– Note: if you edit quantities or remove items from the order you will need to manually change the item\'s stock levels.', 'woothemes'), 'woocommerce_order_items_meta_box', 'shop_order', 'normal', 'high'); + add_meta_box( 'woocommerce-order-totals', __('Order Totals', 'woothemes'), 'woocommerce_order_totals_meta_box', 'shop_order', 'side', 'default'); + + add_meta_box( 'woocommerce-order-actions', __('Order Actions', 'woothemes'), 'woocommerce_order_actions_meta_box', 'shop_order', 'side', 'default'); + + remove_meta_box( 'commentstatusdiv', 'shop_order' , 'normal' ); + remove_meta_box( 'slugdiv', 'shop_order' , 'normal' ); +} + +/** + * Save meta boxes + * + * Runs when a post is saved and does an action which the write panel save scripts can hook into. + */ +add_action( 'save_post', 'woocommerce_meta_boxes_save', 1, 2 ); + +function woocommerce_meta_boxes_save( $post_id, $post ) { + global $wpdb; + + if ( !$_POST ) return $post_id; + if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id; + if ( !isset($_POST['woocommerce_meta_nonce']) || (isset($_POST['woocommerce_meta_nonce']) && !wp_verify_nonce( $_POST['woocommerce_meta_nonce'], 'woocommerce_save_data' ))) return $post_id; + if ( !current_user_can( 'edit_post', $post_id )) return $post_id; + if ( $post->post_type != 'product' && $post->post_type != 'shop_order' ) return $post_id; + + do_action( 'woocommerce_process_'.$post->post_type.'_meta', $post_id, $post ); +} + +/** + * Product data + * + * Forces certain product data based on the product's type, e.g. grouped products cannot have a parent. + */ +add_filter('wp_insert_post_data', 'woocommerce_product_data'); + +function woocommerce_product_data( $data ) { + global $post; + if ($data['post_type']=='product' && isset($_POST['product-type'])) { + $product_type = stripslashes( $_POST['product-type'] ); + switch($product_type) : + case "grouped" : + case "variable" : + $data['post_parent'] = 0; + break; + endswitch; + } + return $data; +} + +/** + * Order data + * + * Forces the order posts to have a title in a certain format (containing the date) + */ +add_filter('wp_insert_post_data', 'woocommerce_order_data'); + +function woocommerce_order_data( $data ) { + global $post; + if ($data['post_type']=='shop_order' && isset($data['post_date'])) { + + $order_title = 'Order'; + if ($data['post_date']) $order_title.= ' – '.date('F j, Y @ h:i A', strtotime($data['post_date'])); + + $data['post_title'] = $order_title; + } + return $data; +} + + +/** + * Save errors + * + * Stores error messages in a variable so they can be displayed on the edit post screen after saving. + */ +add_action( 'admin_notices', 'woocommerce_meta_boxes_save_errors' ); + +function woocommerce_meta_boxes_save_errors() { + $woocommerce_errors = maybe_unserialize(get_option('woocommerce_errors')); + if ($woocommerce_errors && sizeof($woocommerce_errors)>0) : + echo '
    '; + foreach ($woocommerce_errors as $error) : + echo '

    '.$error.'

    '; + endforeach; + echo '
    '; + update_option('woocommerce_errors', ''); + endif; +} + +/** + * Enqueue scripts + * + * Enqueue JavaScript used by the meta panels. + */ +function woocommerce_write_panel_scripts() { + + $post_type = woocommerce_get_current_post_type(); + + if( $post_type !== 'product' && $post_type !== 'shop_order' ) return; + + wp_register_script('woocommerce-date', woocommerce::plugin_url() . '/assets/js/date.js'); + wp_register_script('woocommerce-datepicker', woocommerce::plugin_url() . '/assets/js/datepicker.js', array('jquery', 'woocommerce-date')); + + wp_enqueue_script('woocommerce-datepicker'); + + wp_register_script('woocommerce-writepanel', woocommerce::plugin_url() . '/assets/js/write-panels.js', array('jquery')); + wp_enqueue_script('woocommerce-writepanel'); + + wp_enqueue_script('media-upload'); + wp_enqueue_script('thickbox'); + wp_enqueue_style('thickbox'); + + $params = array( + 'remove_item_notice' => __("Remove this item? If you have previously reduced this item's stock, or this order was submitted by a customer, will need to manually restore the item's stock.", 'woothemes'), + 'cart_total' => __("Calc totals based on order items, discount amount, and shipping?", 'woothemes'), + 'copy_billing' => __("Copy billing information to shipping information? This will remove any currently entered shipping information.", 'woothemes'), + 'prices_include_tax' => get_option('woocommerce_prices_include_tax'), + 'ID' => __('ID', 'woothemes'), + 'item_name' => __('Item Name', 'woothemes'), + 'quantity' => __('Quantity e.g. 2', 'woothemes'), + 'cost_unit' => __('Cost per unit e.g. 2.99', 'woothemes'), + 'tax_rate' => __('Tax Rate e.g. 20.0000', 'woothemes'), + 'meta_name' => __('Meta Name', 'woothemes'), + 'meta_value' => __('Meta Value', 'woothemes'), + 'plugin_url' => woocommerce::plugin_url(), + 'ajax_url' => admin_url('admin-ajax.php'), + 'add_order_item_nonce' => wp_create_nonce("add-order-item") + ); + + wp_localize_script( 'woocommerce-writepanel', 'params', $params ); + + +} +add_action('admin_print_scripts-post.php', 'woocommerce_write_panel_scripts'); +add_action('admin_print_scripts-post-new.php', 'woocommerce_write_panel_scripts'); + +/** + * Meta scripts + * + * Outputs JavaScript used by the meta panels. + */ +function woocommerce_meta_scripts() { + ?> + + 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 diff --git a/assets/images/cross_white.png b/assets/images/cross_white.png index edb87f4768ca34a19033b9566684fe633df1211a..cf053d1dd1744b43fa0ca622ddda061a85d1e311 100644 GIT binary patch delta 81 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 M07*qoM6N<$f;ubVQvd(} diff --git a/assets/images/fancybox/fancy_loading.png b/assets/images/fancybox/fancy_loading.png index 2503017960b3972499d3aa92f89953935ae40934..80456f2f71233e76ec84f0eb9545a89d1e4dfc3b 100755 GIT binary patch literal 8324 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 O0000(H3=HfB3ex-CA}8B>rB4S*iGOoj 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 diff --git a/assets/images/fancybox/fancy_nav_left.png b/assets/images/fancybox/fancy_nav_left.png index ebaa6a4fd34e51575a01da366312c20618985cbc..db45063e9672dae57467c4d60afb1d73949f39f9 100755 GIT binary patch delta 1037 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 LNkvXXu0mjfxsd(E delta 1447 zcmV;Y1z7r<2(Al|8Gi-<0028MuA%?{1$9Y8K~zY`rB`i8n^zRJi7}1Q#zYru{LGrE zox%ArSE*G>3u*(KtD{JrwzVzd1Sd??LBSPVvGu!%ild$G-w-yj+n@f>Q8y?3V6AR~ zh@wIrGOJKEAI7BJbHaH=)5N6h3lGV?@43%&@44rkdtV=)y?>v5fQWGX_;KIV)Kp1A zLV}-8r;|1{HOV_WI|Haqpm$^=*z?%eerS*wkO2GR;^G3!%F5JjZEZ0P4Gp@Aii$(6 zt*syS^z_P(V=tYat$(ep$E&NW-wh27eVm`49~}`9q2dWhnaiWNhz(^iF)=}B&YX$5ef##Y z_4W0ioW+)wmhAKM^LFR{=g*)22oGtKlan<{rBXp$%qjA;Qh%CpQBjd@aB%PwyWKud zgjnedxYh~}m|(NM6L7b&rKQDcHk)6t?Gvp2EcQK0p?^>)iPPQ61yR|70|!(&IXSxi z{{GY8*d(I6ckkMwqoX&R1)UKeA8&m0=#foWJ;r^Gz8Dslxe^!iekc+X6Sa+vjkz|P zZGi^&_V!xEV)42sQ2}Io?b@|XLA<-W`?N-*i6m~;*bcaT9DxBLAt9Rb^73N{lwXCF zx)R0SZGRB)yS4-+=2q^s6}4#DcKg-``(@C_XkfH}?Y>cXV`E-H{@4 z9YN$tytK5`LUzxdJ^KyqL?Db;?JMjr_FwU?!GB=LHJMCL$T&Sc-QNbcTC{LY;_n;hLYN)loV~@yTiE-z%Hxrd5hL0Cf(Pw$l}Zh8aSbZYV;X>4#-=O6 zs;VjrxVH8Zy>Q`znM>xs$md%0<&wtEbP{s`*ZTVUW~x-GOGv98AySFJ+Xxqsk$;h4 z!sWou(L8{@5+KvLfQZ=VRL+tR5T{X0zDAMXKK$$I>NdRp&@S zG3P7C;;xGTK! z9veooizpgD1ug<#0dgA&}5TyVB002ovPDHLkV1ghH B*hT;V diff --git a/assets/images/fancybox/fancy_shadow_n.png b/assets/images/fancybox/fancy_shadow_n.png index 69aa10e233b039077e7dc600177ddb1eb46217e3..3c31dd536cd5d5f0ab7033ec67472428a353ab50 100755 GIT binary patch delta 70 zcmc~wouJ~Vxx)Yip00i_>zopr0J*Ico&W#< delta 75 zcmYeznxNul=;`7Z!f`$H^g&Jr1(CxS(gV!}zR&+s9lS?GC@A!3+-g?QFAG?k{;XsF e{OHf~qwfv*7H(&mtX4o(!GE$14ZCZIYstHK7GeRx zLoA{H-#2!65duz>>3|oWfAKJTbUwt-l7zXK*MYIR0C$;5f@f(1_pO_xefWVmlx{c= z+1F2$gYWck1{Kn`lJY`g%*KS6s|{flwBT6G;fun=%d{b&jH6VGFY6*Z0onj4?9b9t zR2oa(ppx0?XDDGBsPdqH1R9jNjEw`n`lVgQ<_o8?c534k6H5R9002ovPDHLkV1k3# Bl6(LF delta 320 zcmV-G0l)sr0^0(RB!41FL_t(I%dM1aj>9krga@1)q3Zo_x9S;!**~WG7P(a`Z6qsx z;9+3EmYMp`&+fOIOPaegNnd&Uc|25LCdt>n1I)f<=wLGeR%Z#D&VKtHYtSebNTp%I zLCy0WLvQ&SYdzL*fcPgN8-UdEnH$Gyf7>w}0HRQI8emDma(@TdSukutuvdZ@MKMX| zx|A3tPyx?YVhN^6z!Mi4Mj2f#%<;nh2{>?YAzu|{u^;Oq!;f7Z4tPBpJEmZ+^GZ#$ z=9nz(K+UmK7}|u&EPi%aRt_C3qOFB_Hc`~N>51%{?ijG?xsHt>MwRChgk=x_z0gh3 zO2xSL)-6?+2RQ%|`xW+REJeU#dA5i3fU^QQTh9la{K=2N%vygNz;{m?+gHCi>SxAK Sh9-mn0000T22B!3A>L_t(I%dL_D3d1l6MWeAjLfQTA*=1|-mxpAdj1@u_7oY!Y zY>d(V`Pl({Y}-${?=^DQ`FR(pWS(p6jNbt&(GLZ=k6b;K3O&-uy0x`tOtbnOrc)B ts@G`}6gaQ7hamdYvyL-uM_CI5tS|5Dc2tQP%C`Uj002ovPDHLkV1o5?irxSK delta 297 zcmV+^0oMM)0>lE4B!3G@L_t(I%dM0F3WG2VMVmDB2(tU%Q@bhs@(6XvSfSLG=I8xH zwcdOA=deTYwXQ$Ker6x5_WM&o1#_Rz&hsaN3iN|utbNQn?r48&*>KTteu!-lwRFEc zCA4(bkwB!UlPqW{K%)-3By}}{q~8c>OSPkT1>H7Qe_}aCfPWkW90Zb`^`)TQbhf8j zR@fA!l6V$musRyB9Y{p$SCW}!$3==Vk)fW)Xo{s^ez$t+XhmZj;ts)!kTokU1+eG@;MY0`fHUKPd@9TC{>A+8+00000NkvXXu0mjf)X9!y diff --git a/assets/images/fancybox/fancy_shadow_s.png b/assets/images/fancybox/fancy_shadow_s.png index d8858bfb78efb8d7268736920efa1eae8873f89c..67964c1dd99dc1ebafeb38bedf5858827b22d0ec 100755 GIT binary patch delta 75 zcmd1LnxNul=;`7Z!V#S;Bra;2oRpC8gJ0=iQ-^(lSkrHAmp?7tf1A4%ck~n-O=yx- e`uOPT>i-PoCq&c?ogbt#0D-5gpUXO@geCx0gB|Pu delta 80 zcmd1GpP=Gx=IP=X!g1a8)Ir_`1A!w45?3lN68@FXEmHJH&;ItN>>leC54h7VUo)@R kwKgxhe_nb4n|J6>#mdKI;Vst0Ae#CyZ`_I diff --git a/assets/images/fancybox/fancy_shadow_w.png b/assets/images/fancybox/fancy_shadow_w.png index 8a4e4a887f18384a204563c0048c9cd1328f7faa..1ba7df0d018f5d9494ee99fb64db719b70e93956 100755 GIT binary patch delta 68 zcmYdKo}gl{<>}%W!Xe9gu$`AdfrmlCN`~L$-~W{Y4EbsS94ZSYYKZW0^>(`?DQ>Wr X)L^L5S**W}0SG)@{an^LB{Ts5eWeoX delta 72 zcmYdJpP=Hb=jq}Y!f`$M&;S4S%p4vaorX-BX$ou?eRu>8Fr^wh8(L3c>nwJ7>M%oe bRX;BSn>=$(WwI4B0}yz+`njxgN@xNAeGL}4 diff --git a/assets/images/fancybox/fancy_title_over.png b/assets/images/fancybox/fancy_title_over.png index d9f458f4bb8770466e44ba97dd8fe1f2936090db..74b9149e280bc64dd2cc97e6be7825f911d3ceec 100755 GIT binary patch delta 48 zcmZ>BnINgn!oa|=RfdNNNO60*IEHY@CMQJjFfc4*SaOT=B`;8z!PC{xWt~$(69D4a B3eW%m delta 50 zcmZ>9n;@yn#=yWJFM6aCNb!2QIEHXsPfkckh~QyhSi!L5=)xHaKnVsd%B!6{DL_t(|+O^L+3IZ_z1kfz5L~#odV=8U5Py!16z!P|vy^n|U zG?BN3-~pWC!BoS9T5AY7r3L{l#$O_4=rG3$8Eb5DK*0$YT=BpiH=J=q!5%wokg>!9 z9j1twphdt4&2T{?l3EAU_n-M)d!fe@1qty3F6}kMP0LJy01E&B07*qoM6N<$f-3Yo Ah5!Hn delta 175 zcmV;g08sy~0m}i9B!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0001O zNkl;uISrWr000091f$+`qyzi~L zU)8Pqt9#CL_1V39uf5kkXLX#KiYx{y2`T^pz>t@d(tsUh007`NG9v7Zh>Ua?01)^p zFD0Snw{}{Hl35_#I&NyiFl}YZXk|)`B8A-Dgvh`2HC}E7J--YNjsy+|8wiwmBP}8Y zj*Sn;@p}}AmyJY9q0eQ=m{D5FW#wL-Kt);A-F)STEES}9aNPyCV{+9fG`QytUy7qm!Z$NM)$dZDI4F$84^`*7IJ z7t@#Hp1zQH-G+k&X5OQp?RPp7vu>xiN*3%4`L z7|dT~^Q|9!3OsL%92H?KRC|Qmy4K&m7bFM{$o@U@8wOCr!Rj{!uy-!yf zKWyzEfByV=w)piK0`W9fSO1nsEg7vv0lpmk`K#NvI2Q;SUFoNgoEO+jTx@gs^*&(` z{Ipp7H^*iheAk~+woT@@9hOvbsm8N`O!WPeY|8AlHpc78TI-3t11ZfBi~SxDZ`!Le zY%XZpl;SkSpfciL&(bsW_}?><|Jih+h+QAy#er_ z^{sk5>~~j`d|&N7B5yXqH?tV?A`ctyYpkNMO%c_&3RfQql;jr8Ec+jcpOb!cldvhm zB|a-sLR0rzmU1Vk4rg+kyF2xyMJ-+Nb10v;k%aEOU(h&u766H353zqmKYS-FCP2#h zq0IkFixIH&7nV~@gT~2yS^xZ~64jnY(Lp-j#f<^X*-C& zrKhLownF5t5YZ+vx~o?I^cl#E0s`yJvW^$}?Zz#0$KIVRUu+UG8KClnhreEuH*qXh zscwzE_W${HvH6LU>{DB?d)Ur;k^7o`)$HpIR!E1@b}e*|^0mX~`SA*klM@k3&SmW| zAnb}AP%4N-?xhA#^|YWJ?``8QvP}0zCNH420IH1&Sq5Q;e9oS9LCma%CX(`>TZ%#q zx1N@K#8wv9YRso}w*3k>X>mZzBZ6AsDLhr-MpQPB(9;u99wdxGAbh%`DtwOU(}L{u zyiudww=#aBi6s8b$3_V*MX2bg?}UNOY5eAJ*Azhks{uzg8S!$ahB}5@$jSQWMD919 zST=ZtSpYnFWTo6tV%oEAxj(F`D`q}8U!m?O20*62G`O1AtxBTqXhARS6m3ZO)6mLT zeI7j4zlZ$&o%>Vo8jM&W?Q+!6bWIgOYl>IfdlU?{tHBxb;b`qi2oG}eTTCLe45j6C zb*^9BJRNa)FE#=0@)qh7jkDPZ?|A(;KDRCUr3fr~3%bYlm1eCG82N9TIPK*~_Xoe&*yn;|F$3F9J0$cpcU;pE{18mPZ{WT8t^L$Q;cGJt$Os>5lE~K$ zbm9w;aK@u!9K*cK$+KQ=P7%3Z5hR&$s*^t4mOF6FBhTDIN^2~zeA7&r7rxz*!HU9a zL`lmnsM@?i#|B5rUv=JdGq;lGxoZ8W5_xJL3fc9v(wQzFLhG#v=Qu#Uw6V7h-b7(60DW9V z3CZx%iFXlNSsJjLtbv0V*zdrvA%wU?uMc=#2JGO?``U!tX$=;geKng##oti`KbjLH zVae53a6BnFu7@$*Ur%$G3fO-y@5*=W>pb7^oUb!qc*G+6++duO6y6)1^9CuIIQWpe zIM;KAb9{#Sa=2#~ZqHRq9#IbSV*yYg0ITor6}+D&yJ^(nw)32Fe^uSkU|OzR=h6F+ zVTW3>5Oeo)L`EAxRB1$zly{yD#GK1G%8%9IRAzIojR6q?tQ^L$3WM%f(Q=l6@yw*+ z02#%&&K%k^_t2|$KKfsD@Ux5s4wWEvk{1x*s9E^6b3W)igi*CfnDkrxGh0v?$F&&B zveG_9w{PNI7T6I_Yyda3HO*(iMvyyAe-^s7+}D;9O9Wbo>M2vW^OwA$44{ot&OqABz^1kB^oE=+9j2~w+&K;U9PQR?vix3kv=?$(&L$FJR-4CIc6>E%L(JY zks*~&8W5A&Il&b~o>w}DpOL8m*fK1fQbw5Q>@C)ohF8!!f|_ zi6p(~0na3S)9$OBdY1Z7nHhPu9T86KFUr8TUJCH*GjEghP#bcJ>488Q%!LGsha_{+ z=YOO(l3y1=NX>-kuG!>QF#YFmlBRtwt9}CnB-$i_m*8QinEma@RZRUoXp^RF@cVV) zE$nq_gk;KbIx8Woxf}YO*EPomXR2lL7gH+3T+Ox!c%)?4L#G(fyf0!4_F4MRG%tAk zHJ)F+Rp3j+COE_qFM&XstJ-B5Xb(WZf6fP4QLqL(YVY07{%UAdhE_zv!*@lFy5$*8 z!s{}cN#f@^SF4YGjiVbU54vVfF<+1D0>9p4g**;Bu+3$+J1%2>mZb%u{sbP9w>Yde zS+D=S{@7nT{EEO+30lR>i9g7nHg-Xo>XD0g1QE6%vJGWU7*1npNjU$E`Q`A+;cHJY z-*hFAJ*L z$mGL0($sc>vs#S?wBobvQ0VG>@O@FLNm!gXqJ=>=o)M4x?nree4ff3rWCd4PCa_WId zz;-={Uz;S4j``O|bRun#0KD*)$E?y@JCsEC=X4~w!Dey|(Ro6?w}*HnWXWwPMXvvh zjIge$)J6$bFn1k>qp??aKJF$E4khm92?(32d}b2ViQ1E1pkPD%vc30~WxbRvrlzni zfNk=`wPPpx{eIiJiy><7j7>HbNWkhhRSy3ABk7XXjLDm6pHvi{uS7YK+37>%4`4NP=f0|40u8vt;NTuLgjiMjtV!l&;q{#>a0kR48mc=}k3 z+W=beZt}~HUn^>H{%Y9mz7tX#Pnv2|8$1M#1dR4Kx-}IZk)fl&A|bActXH z4<3iuHXpLC;S}R^1x_1aUNu_wL5|3XgrQw{i_Qtj6hFu1iaXtX^&c2xd?gQuI|&Qy zNwi8mQv(QZf!3+nI@Kg!X%xTk+SaFZ}!1Mtvp%i(D1|%_INV2Fovp zLhFNcGqDqV^X(NY|E3OR6$g4)>JYXRqJunZxW!Dx>%7n&yoQ7{oTbt*mQ&fMS(#@- z&@RqZL!K5%I{cF%ietEc8ywd|9EFI!pkkZZQ+WSSZw3O)O5&fNmitYl+d}zfF}bV1 zR!40x2=ECaj4hW~R7o??FX?1r7wik0HUTd$t7Bw~P-fi+^z2XVGu6X3KQFw9aJ>N{ z6*6O#k1X+@&3L_6?4s#uYxD6@mggdo%h~%raYNru_jwdI9*O0TKr!FvwhykO(Q!h zv2l%)mB^6e+9M@a{Q<>!1r}C;)xf}P)~7RmwHg`bv)|Wy)Sf__1q~+RSa)y?N3w!kQ0NCxGt_S4L!B@IQ_XF-pq~$sb7hhV8FaSJ^M#HV=qE96p zSOvHKeUCT=?o2{)88VKUkRlYSWWc~HSILYo;q;CkPBb4^$3LqAjznI#JO5b!R5t(k zOtgsYd^xkX9*r+$ALPfG8o9yi&Xcqf<6!%hf^3S^ixN!t65C(nczu0ME(3}70`Y{ZrSX}wQwWEt#tt?19 zUskeX9;Hzo&TMUk|GgY>I1*9f5O6X3HcIq&g6Pru<|mAc+#JX>Rh)TAY7{t%mj1m= zmM#suy~vhHI?h@pIBF1tVT+3X?q%L*hgQ?IoN4PRxH{exZ%~rHEtWy-EoHGdP<0 z| zd!#El^>lUh_5j2u79?3hlv zBVXP5jnVv(uFReqCI9>BYIE_-y_a&axh87yhZ;5Dp1&PhV;nbL@a-rNk5{5)ENcr( zaRqwJbK%WCuz1nHszQi=?hT{}LM(9A1BA8WGT=LZsuvJNG%G_|h31MQiPlQmVV<^dnmtN5Z?LKq>r`ZY=GD3gs<**MBnd4Q`~)#`DH_?`|QNbMEdCt zucPnRUi_asK8n^hq}`se(V&$Txu%W#5Ly2C`laRQ?|vSyqmIB?O)`@IktP&X_eFe^Ah9GlgSp-+?G0!vxa1+#n` zRlb06gvq3P>#Z0VX=iZ5SY8u}s7pz{Jz{)73xzmhQIbvLue9yUaVInqWEf4nAUD)G z*BW!D2O33}5UX7m6cDL&?C?ypI*^C)>EQ>$4LLfJnlER%t1|8AAPaA~&8=y)WTPHA za!!I^UB%L(;x|N(75}*#=dki%^BfJuZ{jdQdm@IPyf5`ED{%=9d^pZZZt<9BkWOD2 zz=xaX2O={dBFq=zj{+;y{QBG_m_6px+AQc$HIOqu>_X4c(6_WwEwBn`B7GQv;!X26 z*0QR$1n-(>Z<1;_rPZ%OcQ2OG`GjpJ*3c77VUZ;mDShwXY&734uY6U$vRr^nMBn2R z0zo9&gMQwYPO<_*>6Q`oaa1Un^=);mSebPcDnr|5!Z@#HNB<_<$u=%x%Xd$B{wV-T zvP2$BZvEMOIF{zB^$<4wO{1k{rCGqol6$4O@IJpIxma}u2vSk#VO|A>XDY0%c_IxA z_U|V`6!`!Y6nB@~&~#mofmGA*3Y0}nlsew8?~Uu3jf)yCtZ3IXP6bzRLt}H)YwQ(d z;VU)$WE5Z?1Cf3-48Ib$){#qSk?s1H@abzBnU(tsuawfDi<~t)48%K zNsooL@QSYyV^<(55Q?XHVUBQ4hK7yIsMcCApwAuD*LWC{F)q%Y5NU`y;DZW1_Aji#WoZ!)giGV;=?O!-PBoxiXL$+MfsU{qTq|XEPzw_ zh=G~=h}^dqznh2e7K5qw@(K{^#d;Pyf8%|If16&cF9cgeP5NGP_Z~43>$5`6kB3i& z}0`+$tTuu-dkxsSvsGVqnxQ5;}%6RNZKh0MnN+LvJt3v~nL-P~`8 zpNOjH>2d5&!oss}-OS_=ui&=LOhOd%c;B__d-vFr$>^P8QbV^*vv$R z0%KO+7_iK^{Pn3l7Z_TlKRzs_h9gLI^j9_o!?coj~Jn-za*)U?I#*1f(DoA5D=N&9jPEA1EKd_n!`1!g>8Zs8sVMY;ig_ z9r|%c#jyz${TP$!8t=w`EOO%(Lmp?=++gei8%I(*>orH(4XJxE7k?WLodm%RCG-lu z2lwHWXKYph$Me|okO$yKW5CVwWnf#pv`WU}BR(c^vqj0=3>6I=cHTZ}L-#N~K%O}m zoLsLuo!L_nhIYCUj&qc_)DgR!VBW<2j@Oqc9O!ZQ-r$*NTaOR>4q~AQ_UdDqyzJ3KCph8Ufm(Cib&lF3Dq3wQC}Q zegVfud0qTdxy=?ZF}$+5sUc!3#e?Hg>$zEgc*wRAKCF3ZNou(#Ys{}mWlxjqm?>9f z53_Gdip}}eo#@xMLocDOc~beC;Vtg3sYE+f)gn)TlHVPM_ltZc6ckG}ygEx2jXt7&|G`qj&it?vEg_)75p+-U0 z=@LqFR}h)6Gh8qW1P1WY=a*H#J#i+v+62e*HWaMVjX!9p_fC>3EzQ6 z+f((;bDBN#bu$7KB+~HqnyayII7H2;%}~=I`Ir}T#Y^PkKsD4j2q_{1-`m;coR>mK zKA(5%rGH;%2tLI;As%v$oD+&LY69d$+%CO-%JXmlpJBc|PP~2viKU+J4Mo)GO_GLa zs?7kCf~2L#{7uvcnKim~VbgZ(+qjwF$dmDR&=OAONK-zY)wK8b{y{~q45ZpF@Kfb0 zdmC?|rx%r2dixYaO$hjFr6rgnr84InR-^J63_mm8y4gr$5MPCytYE2poI8HxQ1LwN zTv6pnCr0n4>pN%rw zV#g2IuI4cw2QCY^&B_iX{z>;Om>Nx&V4#fHS##tF>44gXVk@t%xTkj~10zb9`;jid z;erSGYTyc-6qc^2X>oZT({CKbEhmNjc9Q-ZU+}Y^QcW_dWVx;sk-^gdJQnLm!CCi8 zYx}kM$N{emFGMOvOgi`~It!CJFvbTDIP_-pxWM$MoVYz`It!3!YQ=(2ZR#<<2iMv~ z`kf*DR|j&Y9CBeZ+4M>g0#Nq7IC=>?qDsvom90r1?Hsfgp_??G7`}2X^^-?zF@H*z zA0VQ*w28R&ic0BAkF&@rQVZI6?Pt+<)M8)2ZQ5li7)q`qz#Si;5)@(N9Nk({!$~dZF*2eaJe2v0hc@neAO3dQSw}E z!C^PYG2pN&O_>N^mvo$AyLFU2naE!-V%Xn?>X zmzzTG(FU0ZW>BKy8f`NFIBNv-vP*C)a(Jv5d4Xx(R|dDJ;Tu095YuA&_Cvw^)qq4i zV7$1n2|jU@6~X>1sh>{+l-ZvY{I!VVuY7-NTX^%Eyb7Jmr^ay#!%;7am{$A9;vKtW zAkRV$nspBTE*N7MDO3fPw;*K1fDh#fd!wsdiu%$cRG`nV-H&JOTbmR1_>2b!2c+62 zf$~abG9&`Ssj>H&xsvA&28)|QU#wQc$OKIN`Z7Z!-BI#^6yza7Q~K!4vL^y_@Sh4+ zQNwA)7j>01Nt_d>(-3F2WBZwJz{;}iU^g=`O&Uk|R;Vjd6zkV?6`bcIz>xxt)eZ9n z-98j$gNi@ zKzvL@*tx!F}C&V?PiBKnam(&H{aHfy-g!3l#gwnX70EM$}-;^b_ec(}&PEkdII z2#i#G5+wC1GV2cZa>27jrUEe_Ulz0pm~xLO)ucdkC~|OjL$7v;>HYvI7I_McbtXb1 zTuYMf@PK5_IfTJ6u{l08CeNs6IoMV*Stf>+#g?130R}<{=Nkx%yrGF8wdg$JyPKJ6 z+TAz)^!mm1FMbH1k}BL3f!9G7@-I$H;yJ_>4Z!$j`Ae{%GFnE)A5O}9_t>1bFH5EJ zC_H1iDfwwnhIAWfNmolMY07L^IYz8BA{OSTXH;-9hDP!Rp%H!Yag7**N4Pwrv!X{X zLVlb|VpVLF%*KT%xh;2dT-Lr_n9dR<^aADsZg;%?v;MN7?%R!eBb3%dH{OfQ@?wjb z6rmR12N#LPlO|uh&V+P2x@QzzQV=nKL~XqK=CWAf?s;N(MXm^`O|hm&yGj#irwTM0 z1vhodTg1(fa7uS~Qh-!}Gh;iU<-D^}yysWSi~(JEeNRJ{;5UtL44zuZFv9WWA^21_S$I z^Mu%C+$mMmXW*^fu(b1FrN1}e-dWcK2Mh#m%A%K3y7bBvX7r+l_SLh72$%`;`%YO5 zps2wc>&tJT{#x9TW;befw)`lo7b<>ZJjQO_t_eE86*8Fx%f59dIj_*NjTGX|f22$xu7Uqm53t#}= z=y2!NvWwz8@bfL#EXgHyrfU_0&!9PCD5J67a+pLHDB|D^gt7(2eyE>VjzqyD_yrRQ zDDM0?Z6A=DjbNq4_pi1(UtTQrEg`4-3ygl^0*%^x!V>QvG*Au}-AMdz4&nqkp5mdf z`goeGxyLj&FnY~f`WwOoW)rMf^&*bAju%9tbVoH^Ylb9YQw{p>c?OUDmscRd#$m?= zOw>#bj69NlOnjx&JjZ%{@Sn5x4KhW*Ul;>93i1}7pOpY6ldttX{|$A^79I| zYunDp$9L~ZhTTjdf)F$7AkBJ7B)yyUuB2L=dh+A)3K|MW^!Iwa38uFSlX7V-K0KqX|2 zCUW*(xj?&ml2TZTb_^zN;d{8)>h~Xgt9wg*{f1=h5cDRIyM<^BpFNW(8V8+Jwimu} zv4~?6Bs`|{qr7*~GE&Df`}mS+K3pW2>DK&lI}N1^MTp;b@snMS(!!pt!V()(aZARH zNXmmg0pyP@iH$7VaeL~`3*PBBT#>Dt2Tg29U~mXafxvbZVD91hZ{{#`N$qoi>jC&3 z#87Z+3aT^r(BskP&u8^)BDi%J!J>vkoXImM=h3%-Dcww0WAv#tZgBXpLjCvnz>Lwm zq8n{Z4U({ifU*2&2~JRWlM}&fp@x!7`qGS?TOUtgqn~^XDSE_rtn=FoN%=&vCEjs>66|vLww2~X zNaQR2W@N%ck0ecHBGbjA(^8HZHC<~n&L`wym`cp$Q+4JPRV z%x}`xfx%;I0H>JZTK7M@H(Bp9p3pY^|TWRNGX{Pv_x1#BwbCuw*Ed80> z!e>J~TrMKj`SPEfEYGkNDwE*XmxmM~s>8#4*P@DTgAuqCb-%cUiE}ms3)Rt zcLld@vtg@cPcZZEg=NNr8O&|Fj>uzexw%J4qsRTQ=_gU+jMl+0)g0q~&Z#n&U#3ei z+DJNO^uwpmvs>Mq81v(u46@CuupqZ(&(fM}_vp*Isgr*BC-PzEZ&hml7Z_ke-im61 zTVgpkcYd0yt;bNl=xdbfiHJ)e?@^PW=});K!pS}6zQOlI3^+K;@>Tz!VhN=DnZ`Lh>oWI@iEg9@1yEGswzv&O$B_t3VG?x^31#ARdm|gjas)W zitU+<4{_cqoAPSvE1U#s-+U9QjV&)C<4MOx_x+m_!x|&%uW4lD+4X1+Me5PIVX+b% zJ;q_|F2fRibHL`Z(vmpMy;m;rBr@Z@g<~_-JRoI+u3?19l6;e88@j-Z`x|jyg2PMs z1g3w>ADxt28FlYdmM(S5Bw~oWCh>OE^i>b&lMlyJj|nE~QYMjKAwp(S=mRG#kGUMmj6^Y_L)cW!UQC(;QbF~3d0BC z6@T22XDInk!vv2ivhZ&jeuKjMfHLMx5UkYI6p`<&v^=tL1r4pUSgtUjkwn?1a(~j> z5ryt&Oy`*R%kCzL{0!4I4f-jF@TCpALah2&u7^4?7$&>>RW-{cJQ3k0^8}OEEVq){ z(qub|{(aozoi(BzgpScp%iHzj&(0pebZTF55rsxAue+Xi)8LaX)d%&3WVlDXj`Fkr zsJ?K^7|bs_{;S3|c<42RYF}X^5h{Qdiv$XDvV&o)~KSLj+LC>Je1P{J5 ziiwsRx<-lA{%bCDm8r$7Chu6P{j@$Tw zm?msn>cdHHMEtwsX>K>{R2o;ok43Ii7blF^A0D@N1xzWv88z!2aD4|w?^AoI1-Hiy zw&mR@w-Nfsd2KU?^kh!BUu=jXM)H9X?aANH`4i2(sv;Mz z3QWSuyhfZU4d$UAW_$RsIX`i;LKJn`sJI*^3 zX?F6GNKSGaZ__mdwi++w>m{Qck%GJCcMq;qnD(#5~HItmz+!0;>-6){0nSq3qYQ6kmm7#iKJ{#NJ&XU zwqQG~C<(mBUv#=*Qt59f;$=|<2uYut%zw;ABQHOVuWMYcG*W`}iZn;Esj{!RshxYN z`mG*Q7cRWslm651bAj*9yDvnaVXDVkC_2#-teOfP%VC-92`zo_NLrn6(*3}6*X(8K zlA3-4Q%v_IL%oeDP`vJPE}L9&MXm1Xw}R(Bro{)UdGACK{uOt+g~_afH%=zj=Knt~RY`}Gj3z5=DQZk+pcQ|^f}+-1^lw4c=M=_(hkY(N1j zf-0qZKYU6M(wF1K?yykH+N2Ix?UkbVzPn8zFPqspDD7{W(Tjgtg@Z7tg?%$mU zM{8pUe$rTCJe}Bbe}rL!H-MN&KpEmZs_(n=+szjZ4XrrN)@URNC?(j_{^-aCNUEX*`k%Ef&q=9<=I7sw9!;AIn#v0-EER>fTm;Nw*q&s# zdh~tRgJ~Rv6ZeG)A&z>_rSGGx#CT?zV2mwIYTUK!sIpT)D8v~i9M0?vCQlF zfcgjfjkI%U=y@Ctj*w}4Lg-g{uxt|Oti6k|S1VPuR!%w$6@7iac_%D8F|ujT@may-`)nIbU{1@I zCCs?~cNagQvt$}VTpyd|T5D7l86gvgju-L*C|Oqego31eR#WfFdh$ zRLY$q*T544jD&J)c?8|;CUDfJR=j1YM_LxbGHx~gij6Otc<8V6*HrohI)>=+-1q0) z5IqXACrqO|cqKGUX3j)mZTconHZkJ|`-_D3I5RPl)}DRX+y^?FY0Cpr=#YyOlTcEtul35!pX8%5v$VXGKA^4*Vl$(R6Q%0NWQN4^B+}#uXryB- zaLULt8!r1LT96Kx@cULperwVQ zq%ofU5`RhbR$7*CJnb_h1Of>e-IqS{j>GY|^&G@)s>h=kqS}$TP9oF7hpgj>I{a*@ z4$oSZdd~y;*^Ha7!rix@t{Bh}B(F?RBQc709W=gXMf5oC+jIo?T;NF2;5^4k&YiTE z$DAQ@HG(%S!Oi+^W6NzAquH?NJ9%Z)xPgq^5y$0m?;8t43~mPX^Nr4%OzQqfs_n^~ z!rwfZ)Rr)*RGyO(op<6HKEppc1rr;j92hJz&2^_p-nj+Xa8ldl zoEsK{^8@uP0ciQAlHQVx<*?qO}n?!Gz#Gu<-Wl;-d$Fw~F z-iz+ADc%n7COq+zv-FI>zav#1VYui2X^`N=;euJZ8(j=j7FnC89nbBMYn5TicXSHy z1QLH*NZrg*^_!+m5pLQi#-N?xm%FU%NoNy~o1=`%lM==)XkdTQ^5#3OydyxMDel@e zrnRO28IiUR#`r@yYaH;ox1r#o-?sjL)1}v+o4@ueaYg}T{fLYc#;K_th(bQSZ*b2;8VWI_=?Thncz4IK|gkhHjd&P&P zle^_#E)TKkhK948Gv4nCZ|?qZeWz=`x)G6~2~Iyn!fqsrPs6zs zu6dhjL$_V8r{f+kuOcHFr{OVETH2dw=~mgVxOL6Bnx-9$a*~jARB0k`WWkDfR6?0G zv-fu~q|)_g-=|%EX2YpH)!Q%OX`NAB#B$jqWqLR>t;nM#hh1;0%X#vX_llSm}T@Vy-+^` zas1mQe}U%`CH^23H=DY&--sPY+gG3VvVFOR+l;z4#*`)LMj35lkKi~g?>*i8SzB0? zR{%6U;}C49f{%ik!jEi(aIKg8q&BC^<0%xURz{$(!71j|RM0Tdq{r$*O-X${g72lS zU?sTUCWoNRiz?y%-o~487W$cF@K-5&oMmy_E9Df_ql1+ZJcrgWy6u0VkypdNs^%q3 zu|*|FxeMlIIe5s`vVk!$%b$tpDehPO45cyioi9kQ-x*w@e?(5$wi>FV7bWDWRIRT% z-Sfq>owpQwe=FC;Tc{k?K4YLE{#_Clzyu+AL2;jLU7S>HG9wRw8VGw74Y{_Z{jmCR zA6~TmoRT1;8;09F%l0Nt4)kZo%}>%DR_ju=q6i8}Dr9(3>iHkHmdWh#%?EV(i!9OL zP?C}7fBIx27^v#M$LGYayl|~8A2!&uQ_O!;S{mu7^MScmUapdi`Zer=2^>rvEq?!o^6{L1=okD+|5`=5UN zMa*rNL9CHB!PAA}9V8Iv+UnxAD7rS8ZtkF9F6fE~{|Zm*k0IpCSeHBO6Gni%w2D;y I2ea`10b=2K^Z)<= literal 15287 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 ZMt7F5hocMxav&E)U0Fw|QQ>vO{{ZOG+C=~W diff --git a/assets/images/icons/menu_icons.png b/assets/images/icons/menu_icons.png index d27a41662efbde41db1da4d54db60a3bd162f46b..81c07e942babf0c5b9d182b7ff4de64ad9436fd5 100644 GIT binary patch delta 1566 zcmV+(2I2Y24a5$RGAaU0P)t-s|Ns9000000000000001_q@;b3qI!*^wzjsas;ZN0 zQjB9tk!2)*`uzO<`sMcb`0(=d@bK{H?C|L7?cVG9=H}+u=J(*^=G@`s-rnBN;Pcnq z-^|_c*4f<2+U>>J@72}S&DY=2)!D|><-XMHzS8K+&(p)t+04w$xXQ&~e(XG&02V@Wn(Ml~i-b3035Uqv(`Pjy{HGdM_HC`)M} zOmQ(tTpvknBSvLXJ1j6jP8>pEAV6CwJx?GyQ5ZN>88b;9GC~wENEa?b6D>m$D?$|< zDmxJg`5wvZZj&wRcI=7)Q^pL5?khjT_IlaLr2^bfp=GSE+G znjDBQnKZ|bAvzv)xubMF{C@;@J$J0-us$bB=FJOB5CUp1yRP$azX1nKd9iyF$JVz~ z{=7*^$-hco2S#~KT!lTYxpN`OiHlCBbKennm(%HX--jiEW>bXb0C^FPr_)5m{*C5` z8}4P^SR_AoDLwu6dst$MSei{FNzr_cCCA10|Dmq@3aU*zRD2=7@PF*~{qV&HOr{Df1HgF z%C_NTKb|hEe*G+`ekj(RS&;Eydv3;;L0D2#)6>kRrUsUzv}>?Lqp{(%rwFUxzm+nB z*S7uacoO{D_HlR!mVeaOcb;ccUk^)W*X4w<;pCi}Ev)_=42Fh=Lc_zsp+Wo!!jguD zP6wNY23X>+SP{i2y7^zh7(%ebYQ5uNW3_^knNR&ZUdMhz})%zvG}0 zTn9&d+_-;ik&uv(kdXLaTAO&Z5}GD?BTORA@w!}IQmv)d%%ipq?y~C15gb5!N1;ipunxi|Yqsn%8kes!n~g?% zUhpPfU33#2;eX)iDE6tMVv8#GaQc3<2cg0(2ByzAw{%yP6E zVWeI1Nu-bh~ zb=0#{-CKFOuVd#`#sf=~%Bq!YluB5VYM{b|9h4zeSnc&NK99%8Fnt~m!+022f`3`S zhN55ztyf1W5#2n~7lRL$Xtf4C8?6?U%&^lu>@x)AzGtxzBzi4}9+tRDC>{ovu>Kbg znK$CV7CTsC(BgB_WAH;;DUyufgAZy%!Ut+da>bA&Y8ZJx@k#F|5)xyV-)gY*9G95; QhyVZp07*qoM6N<$g65?Lp#T5? delta 1470 zcmV;v1ws164$2LXGBW}AP)t-s|Ns9000000000000001`rKNg}qik$!T3T97S2;UI zCAPMF=(XP7-q_}@&*1acd2P zz0qmB&}6mEWVg*(vCUw!%v8R@Bat;c(}!I7@K&Z)|p~E_z!8fMAHs7UwoW4D*tgM;6 zNt(JtnYl`%v4Pm2e|n*=dXu<4l)4PxQ4AbgRV1~nVG|o zZhxvTeW)URr!T#WYJ!xifs&@Thi8n8jCzfuv4UfJik+)|V0DO}rFmSTc3PfvSe$cG zYI~8BY*KP^a%^mDTy278W@dw6Nr7HSdRatTT3SX{YfV=nyUQ#4~qHbqY` zU`91VPA)r3U|&TvT|_fDNL@clDm+IgQadcwyo*Z!005|TQchC<5h620RaJ?aLBxt(tWa@5#R~tXlL@8q$%F2AWXi+A|B3U2fpj47l6$KLkrCJIuN@~c2CZ!TW3<>;x zl2$M#DpMI#DaC29!QvFkky`xcNf?tzDDSU-sw%-)B1vWPNMx zEXk-dlcEcc^97JDdZ$S9{(G=kl!YF}T@Ec8U z5+Ra`ltyO=+jl-g8Pjx~DU|<-WfDqtO@vagVnx#WY)Y=MHDF=gfEmvfsU&xy8Z1eN zi3Q!Z=$Wg`gz!h0CXwV91FlHxlsDHgIL4($Y?1{TD+^$W6{uik`ZreE3Y_;72Z#Tk YU;AUf*r*)+PXGV_07*qoM6N<$f*{f69RL6T diff --git a/assets/images/icons/paypal.png b/assets/images/icons/paypal.png index de15fa84e27a84bc2ffa23658db746acfb0b867f..0f6f4442512e8f7877315c8117d83c47a68fc05d 100644 GIT binary patch delta 390 zcmV;10eSw92g3%CBe6240e=BwNkl7{~E#!&14^7L~LcQljl((4nR6 z+Nf1>B;SY*)5sCIGG_2^+i#f3WTyS0_dGv*o|zXSG6+b77$yW{;F+X-Jd<>iDFy|k z=rjWWlx(&PXzrp|9Q~c=wi5Vecl!n0GItCBf3P=}Wp#N9_Ku0wYJbRRka;NVgvrNl zi~RHO!$swCD#ytamdsyY-A?8mXB0(4M%PJ=UGC`*d+~w`$!U>t&3&+u5=UyvK9v*O zwbKn|kCAv`EvgOo;PE+0w>pCC<-SEGY2bNYmn)i8`010qNS#tmY4s-wj4s-!)B(v54 z0010xMObuGZ)S9NVRB^vL1b@YWgtdra%FdKa%*!SLsK*cveTdd00Co3L_t(2kz-&~ zB?2%qs7ez7RDsI42m_!pB2*EtOpKohAVzIviHV8X#>Vl9$RH;xOBlvXH_lFkC@YW3 z6xY*#N=QshfJim@`uZwl7=b`5JF|=oNSSkDd{t(Mw@Njuo=AI4o2^l5s-$Uh4SQHd zaZ#y!hH09Skuyk{bG?eJiHJR~w}W`5EkmjtLtdp_v`YlDPo)H>q#1j-i8EN4NuY{& zrj4JRH=B4+y|}gkpHvvTg0H?+iW7H)p;K&syt1;g7z3lbyMszzpst#DWSNR~ZG*VI zhAVr4wS~KxosWdCXl$6WySqChNLi40Nm7!zeUPlDpPPs$n{ueBhnupprk!Riw;{U+ zR9SGaUztE~aBy9Kqk5cjp^6Sug_#$SFKA|H80zH%Vg`eiF)@LdOdz1+Ss0830F@~@ zAp;?Q4kjf`093|<0+f_^umB8Y*a1+PA`t+njD-k5yfUHy0C<#pyj$g-umAu607*qo IM6N<$f@bHwtpET3 diff --git a/assets/images/icons/skrill.png b/assets/images/icons/skrill.png index ef33fd4bad79b9c5dd84561da0cbdefd73d28c67..4d341b1b009575531ef73b2496a1e87e66e8095e 100644 GIT binary patch delta 1982 zcmV;v2SNC#CCd+xBYy{yNklJm+g+Dy?<(6nlr+O#2%K#t{P2?29o0a6+Qq$H38O1KQz96qqI!520L-!?Y3 zv5gPFKuO^3`(A5x**d9HDovI0#}od2f8XDGpZC21Lde&4J%5D%zrmY(#z9it3z9NE zXq#l<8nJCy@I_vVxI$a!z2SHZe|-Iv$OPtYE$D8^fp`2Sn0mD^T*d>RetMl-X@6uX z7+n{baKo(83(jFP7`ikt*{O!dn|Pzv(?$Kr}S?1Ygud6zs@38ew)2^kQmu1VJ8QQ9|}dbAsiU78wE zZkM+0ow{h>nHGP@>Vu%k3;szrSP{s;{bG1^g9OaII)CtvIblZUqWXJ^HXkDePah!{ zzxO_omh!CA3L7}Y#$zH*r>6JBt=Y!C<#)BWO5Ri-HG#D6GwI-TTiOe5Kkyie#x zVLQTGynkR5OfajXA^sD-UBx^*QZ)e55+3*`JP>gPcT{dUM>sz?M6wZHSu55lYlYDA z_J^*#r_$KD#qr08s&44diW*^D<(AB~yp4xZKZP{yt5`;O!`Z@T(@Eho>7;1$Q3{D4 z94Dwq$`ejAc)AhQ(YGil{O*$HkCVdZGMK#my?^>>(B^}%BLLRH2{2+vnJ^>_c!6n! z{XWa11wnaL1UL6pfaaP6$UOp6Qp-8?-n8se-^gNc;Til5=+PVEM2(mj|9K0b~o>>}WZ{994yyMk66V3eby{2B>1zBakp_bjL&_IFQaz}y`+fdu=}%6gk)HXO-i&bH#zGVc|bwhwMOzytqk{3>V9ySNBEq^Tf z=Rla#;pRM+Lc@>A(I~5n!RY4Yxux%5UM%F`J3N$yU-tJ863jErta)Z<(R1i=npck> zB7<4&o}uENFAs0+8?VKUsp4lBNM{L)i+Q5_r>BT8r_*WVYPa^DxDB$3PvP-Umf%B zdWpupmsYU$Z^E!a&o=r{M&GeRF(I8ZTGwk6ZAz>-?xY8TN7n%!^bJ$DwtuYWSkvr> zSli2gc7}oBidl?ZV7z&hZ|GFNft!BrDb&HuXr*Faqh4{zZD*tYD6GscLHmLFMFeB| z#m}E0c9Aj3(x(Tv(t%CRz5hYrSwopftMpwLBP@n81GB5Qv1QLF075;9^J-2)q+jR{owGP zF=srs;Psl1Bw*;&0FDIU5E;S59izz{in$y&r|})amY!6A8^prqgICXEg*nSSfO@R4 zC~HKcfk`hc&i*_6d7}SVk%&eBkJ^Rso(F@M6n0B*@2^@B=XYtb{eL#&Y*K}8t?fJA z;=+&b3!BmEK^f}oVlq~3QVCY3C2f=3gzsaXppa_;gZK5tz}y$Y^G~;YHSnUmE*a;E zLnI$99BavWSY_~;0>VbYa_ zWsLb4e8yJ~kM((!0e^2qa0bn0n%Fa|9&|Xua+soR90o}#?`?d~%3;=b50KWsU5!SZ z0q8l}6v&D@KtacmkWOER2 zJ>UA*nrP>thIzrojw$T8byyiTS^CD=7;Ns<%Bo$Rg8Wz{?d4Txbi3 z3%lKP3357oA$uSROQMMCiSoG~oL?L`79^GabxBsV3!9=p(xh`IJH>@j9>UYA#x+vP)Vs2~0(^$`9c{MTsx6Bx{o$R3w& Q+W-In07*qoM6N<$f<*%Kod5s; literal 4776 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 p3HC?KsY;NE_Cnc{mmm|d{s84w8&#m4{u diff --git a/assets/images/jigowatt.png b/assets/images/jigowatt.png deleted file mode 100644 index 4a0116ccb9c3471b072d7735699818ca70ef792f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8746 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 delta 207 zcmV;=05Jdc0mK53Bn$&{LP=Bz2ngHZPvDUuU4IF1NLh0L01FZT01FZU(%pXi0000S zbVXQnQ*UN;cVTj606}DLVr3vkX>w(EZ*psMAVX6$2C~zj0001GNklkdFL z42Iz{%(gON2k!qy$yb`i(|>Q8G$s2(wos#3GGrQr*~ix|Val0Bo)A`6E5gMb1YZb_ zzc`cZ5YFQZ$0?y~{YyffRYm9))gi<|McMEQ8=-wJJR$i;GB>Cn2L)Qnb{_x$002ov JPDHLkV1nacPdNYp diff --git a/assets/images/placeholder.png b/assets/images/placeholder.png index e04b694589bab610b56e58971f9e485f40ade56c..ddd912b86517f986168a52beed8083433b483976 100755 GIT binary patch literal 5196 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 delta 483 zcmV<90UZ9J1@r}wBn$&{LP=Bz2ngHZPvDUu`+oola7bBm000XT000XT0n*)m`~Uy| z9CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?ocW-iQb09-gGzPNMpa1{?c1c7*R49>EkZDuG zFc3gD0ZVQ0pyj9sUKJtMT0l7*u`MEp2mJq^W3pR1?fa13yxHu|1_U8xng9i+Cckia<0!5Ijbd;6=$UEMS@`i@h$=^-Yku`V}L z(h4T`LNXLw2~~uFgei5c%cUfthNmlYmTfDdsQ4e@bQ%^!G#o~G5jwq|6Xt|HQrILy zTM@r0Vx5Ix4@ajNqoEDUZ|5Py`Cfwf^?&1ol-U2(OXwYW-I zP(}4VNfOIa$9)yW;^*mSQ7&UZ0agSZAvzFQKu@4bdttKwk5Z}lALHF_ToCKcW}O$~ z%H3UMoD-9VVnSkmqBy!x9O-Nh+fCy(qp{gS_xb%W=EX1*~zBcHIQK!8y Z`3F7~M3OVrugd@c002ovPDHLkV1m~g)kgpT diff --git a/assets/images/tip.png b/assets/images/tip.png index 1d15c7ba219401076d1d51a27c3e63a6aabe928d..3e75d0cdcbad20052af146a23f4443bcae587b9a 100644 GIT binary patch delta 615 zcmV-t0+{{i1^)z)BYy%$Nkl{C}O01NDz{DjGeE&G&_`>z;wy+cQvnX&5q#_UMeV`sR6=#>>zwk=709 zFLX_?wT@{xW&fCjMW5pDv|i24Y0%mySehk!&O8V---&Q1tP%Jhp~O9H?-YmG5Ggt7 zik%h@iw#gsIU^QGD#hzXV6 zN1EqQgc-~hB!8sb{T;?axieAR7yvP$GW%N#ujngf`I~u|L;}i&&CQPcHxf002ovPDHLkV1lVZ BHuV4i delta 721 zcmV;?0xtdk1n32jBYyxHbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU! zib+I4RCwBSlV3J@>e?A$91%IotZ;X*y9#xbT7?@V4$V!cB zFzX@_CB9l+j|b8P6Kk10vNM_Xv`)cFMNk3`V>PYlo#TL(&vlL`)dP_Xj%rJ(i!3j% zNrWJTQpNpFo0e%@*6k!G-;mm5 zZSL1{$$yT*Z3ZY5QmA%_qb@Jj=KVMtmC4pFZ!z<@RwK2}#$WZ#VXE!pJf9l&^x3D0Bbn1a3OdJEWyR$HwR|FZdTQ=Eazz#7cl63t~)M^yBcDi7R)&(thuag{Etivy{@!@+{>8yUxzLbxD`xuK)u8G1HB|I~Lb-00000NkvXXu0mjf DwH96P diff --git a/assets/images/ui/ui-bg_flat_0_aaaaaa_40x100.png b/assets/images/ui/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100755 index 5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 diff --git a/assets/images/ui/ui-bg_glass_55_fbf9ee_1x400.png b/assets/images/ui/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100755 index ad3d6346e00f246102f72f2e026ed0491988b394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v diff --git a/assets/images/ui/ui-bg_glass_65_ffffff_1x400.png b/assets/images/ui/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100755 index 42ccba269b6e91bef12ad0fa18be651b5ef0ee68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& diff --git a/assets/images/ui/ui-bg_glass_75_dadada_1x400.png b/assets/images/ui/ui-bg_glass_75_dadada_1x400.png deleted file mode 100755 index 5a46b47cb16631068aee9e0bd61269fc4e95e5cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uPMaW978O6-<~?i$)F&>d~nX+ z>vO)oJQ&&FVaKefeOt$qOR>f~^ebnN_=~%qdHEaS{Ou}E*`%9 zKPdOkfrN+ZlHSt7(uY{3{#;wiJb&Ugx1>W4qtrSDm(4hFaaY-$3p3x|sIU3`%J?Qj YcLn#R=pC)AfTl5cy85}Sb4q9e0MP_2(*OVf diff --git a/assets/images/ui/ui-icons_222222_256x240.png b/assets/images/ui/ui-icons_222222_256x240.png deleted file mode 100755 index b273ff111d219c9b9a8b96d57683d0075fb7871a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 diff --git a/assets/images/ui/ui-icons_2e83ff_256x240.png b/assets/images/ui/ui-icons_2e83ff_256x240.png deleted file mode 100755 index 09d1cdc856c292c4ab6dd818c7543ac0828bd616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 diff --git a/assets/images/ui/ui-icons_454545_256x240.png b/assets/images/ui/ui-icons_454545_256x240.png deleted file mode 100755 index 59bd45b907c4fd965697774ce8c5fc6b2fd9c105..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 oBo%DI*Kv;w;*%(i9W@f3_WCF#rGn diff --git a/assets/images/ui/ui-icons_cd0a0a_256x240.png b/assets/images/ui/ui-icons_cd0a0a_256x240.png deleted file mode 100755 index 2ab019b73ec11a485fa09378f3a0e155194f6a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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');$.post(ajaxurl,{action:'jigoshop-categories-ordering',id:termid,nextid:nexttermid},function(response){if(response=='children')window.location.reload();else{ui.item.find('.check-column input').show().siblings('img').remove();}});$('table.widefat tbody tr').each(function(){var i=jQuery('table.widefat tbody tr').index(this);if(i%2==0)jQuery(this).addClass('alternate');else jQuery(this).removeClass('alternate');});}});}); +ui.item.find('.check-column input').hide().after('processing');$.post(ajaxurl,{action:'woocommerce-categories-ordering',id:termid,nextid:nexttermid},function(response){if(response=='children')window.location.reload();else{ui.item.find('.check-column input').show().siblings('img').remove();}});$('table.widefat tbody tr').each(function(){var i=jQuery('table.widefat tbody tr').index(this);if(i%2==0)jQuery(this).addClass('alternate');else jQuery(this).removeClass('alternate');});}});}); } /** diff --git a/assets/js/jigoshop_frontend.js b/assets/js/woocommerce_plugins.js similarity index 100% rename from assets/js/jigoshop_frontend.js rename to assets/js/woocommerce_plugins.js diff --git a/assets/js/write-panels.js b/assets/js/write-panels.js index b322d9010aa..7c91bad0c1f 100644 --- a/assets/js/write-panels.js +++ b/assets/js/write-panels.js @@ -101,18 +101,18 @@ jQuery( function($){ if (item_id) { - jQuery('table.jigoshop_order_items').block({ message: null, overlayCSS: { background: '#fff url(' + params.plugin_url + '/assets/images/ajax-loader.gif) no-repeat center', opacity: 0.6 } }); + jQuery('table.woocommerce_order_items').block({ message: null, overlayCSS: { background: '#fff url(' + params.plugin_url + '/assets/images/ajax-loader.gif) no-repeat center', opacity: 0.6 } }); var data = { - action: 'jigoshop_add_order_item', + action: 'woocommerce_add_order_item', item_to_add: jQuery('select.item_id').val(), security: params.add_order_item_nonce }; jQuery.post( params.ajax_url, data, function(response) { - jQuery('table.jigoshop_order_items tbody#order_items_list').append( response ); - jQuery('table.jigoshop_order_items').unblock(); + jQuery('table.woocommerce_order_items tbody#order_items_list').append( response ); + jQuery('table.woocommerce_order_items').unblock(); jQuery('select.item_id').css('border-color', '').val(''); }); @@ -152,7 +152,7 @@ jQuery( function($){ var select_val = jQuery(this).val(); // Hide options - $('#jigoshop-product-type-options .inside > div').hide(); + $('#woocommerce-product-type-options .inside > div').hide(); $('#'+select_val+'_product_options').show(); // Show option @@ -173,7 +173,7 @@ jQuery( function($){ jQuery('.menu_order_field, .parent_id_field').show(); } - $('body').trigger('jigoshop-product-type-change', select_val, $(this) ); + $('body').trigger('woocommerce-product-type-change', select_val, $(this) ); }).change(); @@ -215,17 +215,17 @@ jQuery( function($){ // ATTRIBUTE TABLES // Initial order - var jigoshop_attributes_table_items = jQuery('#attributes_list').children('tr').get(); - jigoshop_attributes_table_items.sort(function(a, b) { + var woocommerce_attributes_table_items = jQuery('#attributes_list').children('tr').get(); + woocommerce_attributes_table_items.sort(function(a, b) { var compA = jQuery(a).attr('rel'); var compB = jQuery(b).attr('rel'); return (compA < compB) ? -1 : (compA > compB) ? 1 : 0; }) - jQuery(jigoshop_attributes_table_items).each( function(idx, itm) { jQuery('#attributes_list').append(itm); } ); + jQuery(woocommerce_attributes_table_items).each( function(idx, itm) { jQuery('#attributes_list').append(itm); } ); // Show function show_attribute_table() { - jQuery('table.jigoshop_attributes, table.jigoshop_variable_attributes').each(function(){ + jQuery('table.woocommerce_attributes, table.woocommerce_variable_attributes').each(function(){ if (jQuery('tbody tr', this).size()==0) jQuery(this).parent().hide(); else @@ -241,20 +241,20 @@ jQuery( function($){ // Add rows jQuery('button.add_attribute').click(function(){ - var size = jQuery('table.jigoshop_attributes tbody tr').size(); + var size = jQuery('table.woocommerce_attributes tbody tr').size(); var attribute_type = jQuery('select.attribute_taxonomy').val(); if (!attribute_type) { // Add custom attribute row - jQuery('table.jigoshop_attributes tbody').append(''); + jQuery('table.woocommerce_attributes tbody').append(''); } else { // Reveal taxonomy row - var thisrow = jQuery('table.jigoshop_attributes tbody tr.' + attribute_type); - jQuery('table.jigoshop_attributes tbody').append( jQuery(thisrow) ); + var thisrow = jQuery('table.woocommerce_attributes tbody tr.' + attribute_type); + jQuery('table.woocommerce_attributes tbody').append( jQuery(thisrow) ); jQuery(thisrow).show(); row_indexes(); diff --git a/classes/jigoshop_cart.class.php b/classes/cart.class.php similarity index 76% rename from classes/jigoshop_cart.class.php rename to classes/cart.class.php index 05adf0bbddd..9c896b58f46 100644 --- a/classes/jigoshop_cart.class.php +++ b/classes/cart.class.php @@ -1,16 +1,16 @@ 0) : - $_product = &new jigoshop_product_variation($values['variation_id']); + $_product = &new woocommerce_product_variation($values['variation_id']); else : - $_product = &new jigoshop_product($values['product_id']); + $_product = &new woocommerce_product($values['product_id']); endif; if ($_product->exists) : @@ -142,7 +142,7 @@ class jigoshop_cart { $cart_item_key = sizeof(self::$cart_contents); - $data = &new jigoshop_product( $product_id ); + $data = &new woocommerce_product( $product_id ); self::$cart_contents[$cart_item_key] = array( 'product_id' => $product_id, @@ -202,13 +202,13 @@ class jigoshop_cart { /** gets the url to the cart page */ function get_cart_url() { - $cart_page_id = get_option('jigoshop_cart_page_id'); + $cart_page_id = get_option('woocommerce_cart_page_id'); if ($cart_page_id) return get_permalink($cart_page_id); } /** gets the url to the checkout page */ function get_checkout_url() { - $checkout_page_id = get_option('jigoshop_checkout_page_id'); + $checkout_page_id = get_option('woocommerce_checkout_page_id'); if ($checkout_page_id) : if (is_ssl()) return str_replace('http:', 'https:', get_permalink($checkout_page_id)); return get_permalink($checkout_page_id); @@ -217,14 +217,14 @@ class jigoshop_cart { /** gets the url to remove an item from the cart */ function get_remove_url( $cart_item_key ) { - $cart_page_id = get_option('jigoshop_cart_page_id'); - if ($cart_page_id) return jigoshop::nonce_url( 'cart', add_query_arg('remove_item', $cart_item_key, get_permalink($cart_page_id))); + $cart_page_id = get_option('woocommerce_cart_page_id'); + if ($cart_page_id) return woocommerce::nonce_url( 'cart', add_query_arg('remove_item', $cart_item_key, get_permalink($cart_page_id))); } /** looks through the cart to see if shipping is actually required */ function needs_shipping() { - if (!jigoshop_shipping::$enabled) return false; + if (!woocommerce_shipping::$enabled) return false; if (!is_array(self::$cart_contents)) return false; $needs_shipping = false; @@ -242,7 +242,7 @@ class jigoshop_cart { /** Sees if we need a shipping address */ function ship_to_billing_address_only() { - $ship_to_billing_address_only = get_option('jigoshop_ship_to_billing_address_only'); + $ship_to_billing_address_only = get_option('woocommerce_ship_to_billing_address_only'); if ($ship_to_billing_address_only=='yes') return true; @@ -264,12 +264,12 @@ class jigoshop_cart { if ($_product->is_in_stock() && $_product->has_enough_stock( $values['quantity'] )) : // :) else : - $error->add( 'out-of-stock', sprintf(__('Sorry, we do not have enough "%s" in stock to fulfill your order. Please edit your cart and try again. We apologise for any inconvenience caused.', 'jigoshop'), $_product->get_title() ) ); + $error->add( 'out-of-stock', sprintf(__('Sorry, we do not have enough "%s" in stock to fulfill your order. Please edit your cart and try again. We apologise for any inconvenience caused.', 'woothemes'), $_product->get_title() ) ); return $error; endif; else : if (!$_product->is_in_stock()) : - $error->add( 'out-of-stock', sprintf(__('Sorry, we do not have enough "%s" in stock to fulfill your order. Please edit your cart and try again. We apologise for any inconvenience caused.', 'jigoshop'), $_product->get_title() ) ); + $error->add( 'out-of-stock', sprintf(__('Sorry, we do not have enough "%s" in stock to fulfill your order. Please edit your cart and try again. We apologise for any inconvenience caused.', 'woothemes'), $_product->get_title() ) ); return $error; endif; endif; @@ -280,7 +280,7 @@ class jigoshop_cart { /** calculate totals for the items in the cart */ public static function calculate_totals() { - $_tax = &new jigoshop_tax(); + $_tax = &new woocommerce_tax(); self::$total = 0; self::$cart_contents_total = 0; @@ -305,13 +305,13 @@ class jigoshop_cart { $total_item_price = $_product->get_price() * $values['quantity'] * 100; // Into pounds - if ( get_option('jigoshop_calc_taxes')=='yes') : + if ( get_option('woocommerce_calc_taxes')=='yes') : if ( $_product->is_taxable() ) : $rate = $_tax->get_rate( $_product->data['tax_class'] ); - if (get_option('jigoshop_prices_include_tax')=='yes') : + if (get_option('woocommerce_prices_include_tax')=='yes') : $tax_amount = $_tax->calc_tax( $total_item_price, $rate, true ); @@ -321,7 +321,7 @@ class jigoshop_cart { endif; - if (get_option('jigoshop_prices_include_tax')=='yes' && jigoshop_customer::is_customer_outside_base() && defined('JIGOSHOP_CHECKOUT') && JIGOSHOP_CHECKOUT ) : + if (get_option('woocommerce_prices_include_tax')=='yes' && woocommerce_customer::is_customer_outside_base() && defined('WOOCOMMERCE_CHECKOUT') && WOOCOMMERCE_CHECKOUT ) : /** * Our prices include tax so we need to take the base tax rate into consideration of our shop's country @@ -355,7 +355,7 @@ class jigoshop_cart { // Product Discounts if (self::$applied_coupons) foreach (self::$applied_coupons as $code) : - $coupon = jigoshop_coupons::get_coupon($code); + $coupon = woocommerce_coupons::get_coupon($code); if ($coupon['type']=='fixed_product' && in_array($values['product_id'], $coupon['products'])) : self::$discount_total = self::$discount_total + ( $coupon['amount'] * $values['quantity'] ); endif; @@ -365,11 +365,11 @@ class jigoshop_cart { endforeach; endif; // Cart Shipping - if (self::needs_shipping()) jigoshop_shipping::calculate_shipping(); else jigoshop_shipping::reset_shipping(); + if (self::needs_shipping()) woocommerce_shipping::calculate_shipping(); else woocommerce_shipping::reset_shipping(); - self::$shipping_total = jigoshop_shipping::$shipping_total; + self::$shipping_total = woocommerce_shipping::$shipping_total; - self::$shipping_tax_total = jigoshop_shipping::$shipping_tax; + self::$shipping_tax_total = woocommerce_shipping::$shipping_tax; self::$tax_total = self::$cart_contents_tax; @@ -379,8 +379,8 @@ class jigoshop_cart { // Cart Discounts if (self::$applied_coupons) foreach (self::$applied_coupons as $code) : - $coupon = jigoshop_coupons::get_coupon($code); - if (jigoshop_coupons::is_valid($code)) : + $coupon = woocommerce_coupons::get_coupon($code); + if (woocommerce_coupons::is_valid($code)) : if ($coupon['type']=='fixed_cart') : self::$discount_total = self::$discount_total + $coupon['amount']; @@ -392,10 +392,10 @@ class jigoshop_cart { endforeach; // Total - if (get_option('jigoshop_prices_include_tax')=='yes') : - self::$total = self::$subtotal + self::$shipping_tax_total - self::$discount_total + jigoshop_shipping::$shipping_total; + if (get_option('woocommerce_prices_include_tax')=='yes') : + self::$total = self::$subtotal + self::$shipping_tax_total - self::$discount_total + woocommerce_shipping::$shipping_total; else : - self::$total = self::$subtotal + self::$tax_total + self::$shipping_tax_total - self::$discount_total + jigoshop_shipping::$shipping_total; + self::$total = self::$subtotal + self::$tax_total + self::$shipping_tax_total - self::$discount_total + woocommerce_shipping::$shipping_total; endif; if (self::$total < 0) self::$total = 0; @@ -403,48 +403,48 @@ class jigoshop_cart { /** gets the total (after calculation) */ function get_total() { - return jigoshop_price(self::$total); + return woocommerce_price(self::$total); } /** gets the cart contens total (after calculation) */ function get_cart_total() { - return jigoshop_price(self::$cart_contents_total); + return woocommerce_price(self::$cart_contents_total); } /** gets the sub total (after calculation) */ function get_cart_subtotal() { - if (get_option('jigoshop_display_totals_tax')=='excluding' || ( defined('JIGOSHOP_CHECKOUT') && JIGOSHOP_CHECKOUT )) : + if (get_option('woocommerce_display_totals_tax')=='excluding' || ( defined('WOOCOMMERCE_CHECKOUT') && WOOCOMMERCE_CHECKOUT )) : - if (get_option('jigoshop_prices_include_tax')=='yes') : + if (get_option('woocommerce_prices_include_tax')=='yes') : - $return = jigoshop_price(self::$subtotal - self::$tax_total); + $return = woocommerce_price(self::$subtotal - self::$tax_total); else : - $return = jigoshop_price(self::$subtotal); + $return = woocommerce_price(self::$subtotal); endif; if (self::$tax_total>0) : - $return .= __(' (ex. tax)', 'jigoshop'); + $return .= __(' (ex. tax)', 'woothemes'); endif; return $return; else : - if (get_option('jigoshop_prices_include_tax')=='yes') : + if (get_option('woocommerce_prices_include_tax')=='yes') : - $return = jigoshop_price(self::$subtotal); + $return = woocommerce_price(self::$subtotal); else : - $return = jigoshop_price(self::$subtotal + self::$tax_total); + $return = woocommerce_price(self::$subtotal + self::$tax_total); endif; if (self::$tax_total>0) : - $return .= __(' (inc. tax)', 'jigoshop'); + $return .= __(' (inc. tax)', 'woothemes'); endif; return $return; @@ -455,43 +455,43 @@ class jigoshop_cart { /** gets the cart tax (after calculation) */ function get_cart_tax() { $cart_total_tax = self::$tax_total + self::$shipping_tax_total; - if ($cart_total_tax > 0) return jigoshop_price( $cart_total_tax ); + if ($cart_total_tax > 0) return woocommerce_price( $cart_total_tax ); return false; } /** gets the shipping total (after calculation) */ function get_cart_shipping_total() { - if (isset(jigoshop_shipping::$shipping_label)) : - if (jigoshop_shipping::$shipping_total>0) : + if (isset(woocommerce_shipping::$shipping_label)) : + if (woocommerce_shipping::$shipping_total>0) : - if (get_option('jigoshop_display_totals_tax')=='excluding') : + if (get_option('woocommerce_display_totals_tax')=='excluding') : - $return = jigoshop_price(jigoshop_shipping::$shipping_total); + $return = woocommerce_price(woocommerce_shipping::$shipping_total); if (self::$shipping_tax_total>0) : - $return .= __(' (ex. tax)', 'jigoshop'); + $return .= __(' (ex. tax)', 'woothemes'); endif; return $return; else : - $return = jigoshop_price(jigoshop_shipping::$shipping_total + jigoshop_shipping::$shipping_tax); + $return = woocommerce_price(woocommerce_shipping::$shipping_total + woocommerce_shipping::$shipping_tax); if (self::$shipping_tax_total>0) : - $return .= __(' (inc. tax)', 'jigoshop'); + $return .= __(' (inc. tax)', 'woothemes'); endif; return $return; endif; else : - return __('Free!', 'jigoshop'); + return __('Free!', 'woothemes'); endif; endif; } /** gets title of the chosen shipping method */ function get_cart_shipping_title() { - if (isset(jigoshop_shipping::$shipping_label)) : - return __('via ','jigoshop') . jigoshop_shipping::$shipping_label; + if (isset(woocommerce_shipping::$shipping_label)) : + return __('via ', 'woothemes') . woocommerce_shipping::$shipping_label; endif; return false; } @@ -504,17 +504,17 @@ class jigoshop_cart { */ function add_discount( $coupon_code ) { - if ($the_coupon = jigoshop_coupons::get_coupon($coupon_code)) : + if ($the_coupon = woocommerce_coupons::get_coupon($coupon_code)) : // Check if applied - if (jigoshop_cart::has_discount($coupon_code)) : - jigoshop::add_error( __('Discount code already applied!', 'jigoshop') ); + if (woocommerce_cart::has_discount($coupon_code)) : + woocommerce::add_error( __('Discount code already applied!', 'woothemes') ); return false; endif; // Check it can be used with cart - if (!jigoshop_coupons::is_valid($coupon_code)) : - jigoshop::add_error( __('Invalid coupon.', 'jigoshop') ); + if (!woocommerce_coupons::is_valid($coupon_code)) : + woocommerce::add_error( __('Invalid coupon.', 'woothemes') ); return false; endif; @@ -524,7 +524,7 @@ class jigoshop_cart { endif; foreach (self::$applied_coupons as $coupon) : - $coupon = jigoshop_coupons::get_coupon($coupon); + $coupon = woocommerce_coupons::get_coupon($coupon); if ($coupon['individual_use']=='yes') : self::$applied_coupons = array(); endif; @@ -532,11 +532,11 @@ class jigoshop_cart { self::$applied_coupons[] = $coupon_code; self::set_session(); - jigoshop::add_message( __('Discount code applied successfully.', 'jigoshop') ); + woocommerce::add_message( __('Discount code applied successfully.', 'woothemes') ); return true; else : - jigoshop::add_error( __('Coupon does not exist!', 'jigoshop') ); + woocommerce::add_error( __('Coupon does not exist!', 'woothemes') ); return false; endif; return false; @@ -551,7 +551,7 @@ class jigoshop_cart { /** gets the total discount amount */ function get_total_discount() { - if (self::$discount_total) return jigoshop_price(self::$discount_total); else return false; + if (self::$discount_total) return woocommerce_price(self::$discount_total); else return false; } /** clears the cart/coupon data and re-calcs totals */ diff --git a/classes/jigoshop_checkout.class.php b/classes/checkout.class.php similarity index 64% rename from classes/jigoshop_checkout.class.php rename to classes/checkout.class.php index f8447c9ac7d..6fe162387f3 100644 --- a/classes/jigoshop_checkout.class.php +++ b/classes/checkout.class.php @@ -1,15 +1,15 @@ must_create_account = true; - if (get_option('jigoshop_enable_guest_checkout')=='yes' || is_user_logged_in()) $this->must_create_account = false; + if (get_option('woocommerce_enable_guest_checkout')=='yes' || is_user_logged_in()) $this->must_create_account = false; $this->billing_fields = array( - array( 'name'=>'billing-first_name', 'label' => __('First Name', 'jigoshop'), 'placeholder' => __('First Name', 'jigoshop'), 'required' => true, 'class' => array('form-row-first') ), - array( 'name'=>'billing-last_name', 'label' => __('Last Name', 'jigoshop'), 'placeholder' => __('Last Name', 'jigoshop'), 'required' => true, 'class' => array('form-row-last') ), - array( 'name'=>'billing-company', 'label' => __('Company', 'jigoshop'), 'placeholder' => __('Company', 'jigoshop') ), - array( 'name'=>'billing-address', 'label' => __('Address', 'jigoshop'), 'placeholder' => __('Address 1', 'jigoshop'), 'required' => true, 'class' => array('form-row-first') ), - array( 'name'=>'billing-address-2', 'label' => __('Address 2', 'jigoshop'), 'placeholder' => __('Address 2', 'jigoshop'), 'class' => array('form-row-last'), 'label_class' => array('hidden') ), - array( 'name'=>'billing-city', 'label' => __('City', 'jigoshop'), 'placeholder' => __('City', 'jigoshop'), 'required' => true, 'class' => array('form-row-first') ), - array( 'validate' => 'postcode', 'format' => 'postcode', 'name'=>'billing-postcode', 'label' => __('Postcode', 'jigoshop'), 'placeholder' => __('Postcode', 'jigoshop'), 'required' => true, 'class' => array('form-row-last') ), - array( 'type'=> 'country', 'name'=>'billing-country', 'label' => __('Country', 'jigoshop'), 'required' => true, 'class' => array('form-row-first'), 'rel' => 'billing-state' ), - array( 'type'=> 'state', 'name'=>'billing-state', 'label' => __('State/County', 'jigoshop'), 'required' => true, 'class' => array('form-row-last'), 'rel' => 'billing-country' ), - array( 'name'=>'billing-email', 'validate' => 'email', 'label' => __('Email Address', 'jigoshop'), 'placeholder' => __('you@yourdomain.com', 'jigoshop'), 'required' => true, 'class' => array('form-row-first') ), - array( 'name'=>'billing-phone', 'validate' => 'phone', 'label' => __('Phone', 'jigoshop'), 'placeholder' => __('Phone number', 'jigoshop'), 'required' => true, 'class' => array('form-row-last') ) + array( 'name'=>'billing-first_name', 'label' => __('First Name', 'woothemes'), 'placeholder' => __('First Name', 'woothemes'), 'required' => true, 'class' => array('form-row-first') ), + array( 'name'=>'billing-last_name', 'label' => __('Last Name', 'woothemes'), 'placeholder' => __('Last Name', 'woothemes'), 'required' => true, 'class' => array('form-row-last') ), + array( 'name'=>'billing-company', 'label' => __('Company', 'woothemes'), 'placeholder' => __('Company', 'woothemes') ), + array( 'name'=>'billing-address', 'label' => __('Address', 'woothemes'), 'placeholder' => __('Address 1', 'woothemes'), 'required' => true, 'class' => array('form-row-first') ), + array( 'name'=>'billing-address-2', 'label' => __('Address 2', 'woothemes'), 'placeholder' => __('Address 2', 'woothemes'), 'class' => array('form-row-last'), 'label_class' => array('hidden') ), + array( 'name'=>'billing-city', 'label' => __('City', 'woothemes'), 'placeholder' => __('City', 'woothemes'), 'required' => true, 'class' => array('form-row-first') ), + array( 'validate' => 'postcode', 'format' => 'postcode', 'name'=>'billing-postcode', 'label' => __('Postcode', 'woothemes'), 'placeholder' => __('Postcode', 'woothemes'), 'required' => true, 'class' => array('form-row-last') ), + array( 'type'=> 'country', 'name'=>'billing-country', 'label' => __('Country', 'woothemes'), 'required' => true, 'class' => array('form-row-first'), 'rel' => 'billing-state' ), + array( 'type'=> 'state', 'name'=>'billing-state', 'label' => __('State/County', 'woothemes'), 'required' => true, 'class' => array('form-row-last'), 'rel' => 'billing-country' ), + array( 'name'=>'billing-email', 'validate' => 'email', 'label' => __('Email Address', 'woothemes'), 'placeholder' => __('you@yourdomain.com', 'woothemes'), 'required' => true, 'class' => array('form-row-first') ), + array( 'name'=>'billing-phone', 'validate' => 'phone', 'label' => __('Phone', 'woothemes'), 'placeholder' => __('Phone number', 'woothemes'), 'required' => true, 'class' => array('form-row-last') ) ); $this->shipping_fields = array( - array( 'name'=>'shipping-first_name', 'label' => __('First Name', 'jigoshop'), 'placeholder' => __('First Name', 'jigoshop'), 'required' => true, 'class' => array('form-row-first') ), - array( 'name'=>'shipping-last_name', 'label' => __('Last Name', 'jigoshop'), 'placeholder' => __('Last Name', 'jigoshop'), 'required' => true, 'class' => array('form-row-last') ), - array( 'name'=>'shipping-company', 'label' => __('Company', 'jigoshop'), 'placeholder' => __('Company', 'jigoshop') ), - array( 'name'=>'shipping-address', 'label' => __('Address', 'jigoshop'), 'placeholder' => __('Address 1', 'jigoshop'), 'required' => true, 'class' => array('form-row-first') ), - array( 'name'=>'shipping-address-2', 'label' => __('Address 2', 'jigoshop'), 'placeholder' => __('Address 2', 'jigoshop'), 'class' => array('form-row-last'), 'label_class' => array('hidden') ), - array( 'name'=>'shipping-city', 'label' => __('City', 'jigoshop'), 'placeholder' => __('City', 'jigoshop'), 'required' => true, 'class' => array('form-row-first') ), - array( 'validate' => 'postcode', 'format' => 'postcode', 'name'=>'shipping-postcode', 'label' => __('Postcode', 'jigoshop'), 'placeholder' => __('Postcode', 'jigoshop'), 'required' => true, 'class' => array('form-row-last') ), - array( 'type'=> 'country', 'name'=>'shipping-country', 'label' => __('Country', 'jigoshop'), 'required' => true, 'class' => array('form-row-first'), 'rel' => 'shipping-state' ), - array( 'type'=> 'state', 'name'=>'shipping-state', 'label' => __('State/County', 'jigoshop'), 'required' => true, 'class' => array('form-row-last'), 'rel' => 'shipping-country' ) + array( 'name'=>'shipping-first_name', 'label' => __('First Name', 'woothemes'), 'placeholder' => __('First Name', 'woothemes'), 'required' => true, 'class' => array('form-row-first') ), + array( 'name'=>'shipping-last_name', 'label' => __('Last Name', 'woothemes'), 'placeholder' => __('Last Name', 'woothemes'), 'required' => true, 'class' => array('form-row-last') ), + array( 'name'=>'shipping-company', 'label' => __('Company', 'woothemes'), 'placeholder' => __('Company', 'woothemes') ), + array( 'name'=>'shipping-address', 'label' => __('Address', 'woothemes'), 'placeholder' => __('Address 1', 'woothemes'), 'required' => true, 'class' => array('form-row-first') ), + array( 'name'=>'shipping-address-2', 'label' => __('Address 2', 'woothemes'), 'placeholder' => __('Address 2', 'woothemes'), 'class' => array('form-row-last'), 'label_class' => array('hidden') ), + array( 'name'=>'shipping-city', 'label' => __('City', 'woothemes'), 'placeholder' => __('City', 'woothemes'), 'required' => true, 'class' => array('form-row-first') ), + array( 'validate' => 'postcode', 'format' => 'postcode', 'name'=>'shipping-postcode', 'label' => __('Postcode', 'woothemes'), 'placeholder' => __('Postcode', 'woothemes'), 'required' => true, 'class' => array('form-row-last') ), + array( 'type'=> 'country', 'name'=>'shipping-country', 'label' => __('Country', 'woothemes'), 'required' => true, 'class' => array('form-row-first'), 'rel' => 'shipping-state' ), + array( 'type'=> 'state', 'name'=>'shipping-state', 'label' => __('State/County', 'woothemes'), 'required' => true, 'class' => array('form-row-last'), 'rel' => 'shipping-country' ) ); } @@ -68,13 +68,13 @@ class jigoshop_checkout { /** Output the billing information form */ function checkout_form_billing() { - if (jigoshop_cart::ship_to_billing_address_only()) : + if (woocommerce_cart::ship_to_billing_address_only()) : - echo '

    '.__('Billing & Shipping', 'jigoshop').'

    '; + echo '

    '.__('Billing & Shipping', 'woothemes').'

    '; else : - echo '

    '.__('Billing Address', 'jigoshop').'

    '; + echo '

    '.__('Billing Address', 'woothemes').'

    '; endif; @@ -86,21 +86,21 @@ class jigoshop_checkout { // Registration Form if (!is_user_logged_in()) : - if (get_option('jigoshop_enable_guest_checkout')=='yes') : + if (get_option('woocommerce_enable_guest_checkout')=='yes') : echo '

    get_value('createaccount')) echo 'checked="checked" '; - echo 'type="checkbox" name="createaccount" />

    '; + echo 'type="checkbox" name="createaccount" />

    '; endif; echo ''; + echo '

    '.__('Save time in the future and check the status of your order by creating an account.', 'woothemes').'

    '; endif; @@ -110,15 +110,15 @@ class jigoshop_checkout { function checkout_form_shipping() { // Shipping Details - if (jigoshop_cart::needs_shipping() && !jigoshop_cart::ship_to_billing_address_only()) : + if (woocommerce_cart::needs_shipping() && !woocommerce_cart::ship_to_billing_address_only()) : echo '

    get_value('shiptobilling'); if ($shiptobilling) echo 'checked="checked" '; - echo 'type="checkbox" name="shiptobilling" />

    '; + echo 'type="checkbox" name="shiptobilling" />

    '; - echo '

    '.__('Shipping Address', 'jigoshop').'

    '; + echo '

    '.__('Shipping Address', 'woothemes').'

    '; echo'
    '; @@ -128,13 +128,13 @@ class jigoshop_checkout { echo'
    '; - elseif (jigoshop_cart::ship_to_billing_address_only()) : + elseif (woocommerce_cart::ship_to_billing_address_only()) : - echo '

    '.__('Notes/Comments', 'jigoshop').'

    '; + echo '

    '.__('Notes/Comments', 'woothemes').'

    '; endif; - $this->checkout_form_field( array( 'type' => 'textarea', 'class' => array('notes'), 'name' => 'order_comments', 'label' => __('Order Notes', 'jigoshop'), 'placeholder' => __('Notes about your order, e.g. special notes for delivery.', 'jigoshop') ) ); + $this->checkout_form_field( array( 'type' => 'textarea', 'class' => array('notes'), 'name' => 'order_comments', 'label' => __('Order Notes', 'woothemes'), 'placeholder' => __('Notes about your order, e.g. special notes for delivery.', 'woothemes') ) ); } @@ -171,13 +171,13 @@ class jigoshop_checkout { $field = '

    '.$after; @@ -189,25 +189,25 @@ class jigoshop_checkout { '; $current_cc = $this->get_value($args['rel']); - if (!$current_cc) $current_cc = jigoshop_customer::get_country(); + if (!$current_cc) $current_cc = woocommerce_customer::get_country(); $current_r = $this->get_value($args['name']); - if (!$current_r) $current_r = jigoshop_customer::get_state(); + if (!$current_r) $current_r = woocommerce_customer::get_state(); - $states = jigoshop_countries::$states; + $states = woocommerce_countries::$states; if (isset( $states[$current_cc][$current_r] )) : // Dropdown - $field .= ''; foreach($states[$current_cc] as $key=>$value) : $field .= ''; endforeach; $field .= ''; else : // Input - $field .= ''; + $field .= ''; endif; $field .= '

    '.$after; @@ -239,33 +239,35 @@ class jigoshop_checkout { global $wpdb; + do_action('woocommerce_before_checkout_process'); + if (isset($_POST) && $_POST && !isset($_POST['login'])) : - jigoshop_cart::calculate_totals(); + woocommerce_cart::calculate_totals(); - jigoshop::verify_nonce('process_checkout'); + woocommerce::verify_nonce('process_checkout'); - if (sizeof(jigoshop_cart::$cart_contents)==0) : - jigoshop::add_error( sprintf(__('Sorry, your session has expired.
    Return to homepage →','jigoshop'), home_url()) ); + if (sizeof(woocommerce_cart::$cart_contents)==0) : + woocommerce::add_error( sprintf(__('Sorry, your session has expired. Return to homepage →', 'woothemes'), home_url()) ); endif; // Checkout fields - $this->posted['shiptobilling'] = isset($_POST['shiptobilling']) ? jigowatt_clean($_POST['shiptobilling']) : ''; - $this->posted['payment_method'] = isset($_POST['payment_method']) ? jigowatt_clean($_POST['payment_method']) : ''; - $this->posted['shipping_method'] = isset($_POST['shipping_method']) ? jigowatt_clean($_POST['shipping_method']) : ''; - $this->posted['order_comments'] = isset($_POST['order_comments']) ? jigowatt_clean($_POST['order_comments']) : ''; - $this->posted['terms'] = isset($_POST['terms']) ? jigowatt_clean($_POST['terms']) : ''; - $this->posted['createaccount'] = isset($_POST['createaccount']) ? jigowatt_clean($_POST['createaccount']) : ''; - $this->posted['account-username'] = isset($_POST['account-username']) ? jigowatt_clean($_POST['account-username']) : ''; - $this->posted['account-password'] = isset($_POST['account-password']) ? jigowatt_clean($_POST['account-password']) : ''; - $this->posted['account-password-2'] = isset($_POST['account-password-2']) ? jigowatt_clean($_POST['account-password-2']) : ''; + $this->posted['shiptobilling'] = isset($_POST['shiptobilling']) ? woocommerce_clean($_POST['shiptobilling']) : ''; + $this->posted['payment_method'] = isset($_POST['payment_method']) ? woocommerce_clean($_POST['payment_method']) : ''; + $this->posted['shipping_method'] = isset($_POST['shipping_method']) ? woocommerce_clean($_POST['shipping_method']) : ''; + $this->posted['order_comments'] = isset($_POST['order_comments']) ? woocommerce_clean($_POST['order_comments']) : ''; + $this->posted['terms'] = isset($_POST['terms']) ? woocommerce_clean($_POST['terms']) : ''; + $this->posted['createaccount'] = isset($_POST['createaccount']) ? woocommerce_clean($_POST['createaccount']) : ''; + $this->posted['account-username'] = isset($_POST['account-username']) ? woocommerce_clean($_POST['account-username']) : ''; + $this->posted['account-password'] = isset($_POST['account-password']) ? woocommerce_clean($_POST['account-password']) : ''; + $this->posted['account-password-2'] = isset($_POST['account-password-2']) ? woocommerce_clean($_POST['account-password-2']) : ''; - if (jigoshop_cart::ship_to_billing_address_only()) $this->posted['shiptobilling'] = 'true'; + if (woocommerce_cart::ship_to_billing_address_only()) $this->posted['shiptobilling'] = 'true'; // Billing Information foreach ($this->billing_fields as $field) : - $this->posted[$field['name']] = isset($_POST[$field['name']]) ? jigowatt_clean($_POST[$field['name']]) : ''; + $this->posted[$field['name']] = isset($_POST[$field['name']]) ? woocommerce_clean($_POST[$field['name']]) : ''; // Format if (isset($field['format'])) switch ( $field['format'] ) : @@ -273,20 +275,20 @@ class jigoshop_checkout { endswitch; // Required - if ( isset($field['required']) && $field['required'] && empty($this->posted[$field['name']]) ) jigoshop::add_error( $field['label'] . __(' (billing) is a required field.','jigoshop') ); + if ( isset($field['required']) && $field['required'] && empty($this->posted[$field['name']]) ) woocommerce::add_error( $field['label'] . __(' (billing) is a required field.', 'woothemes') ); // Validation if (isset($field['validate']) && !empty($this->posted[$field['name']])) switch ( $field['validate'] ) : case 'phone' : - if (!jigoshop_validation::is_phone( $this->posted[$field['name']] )) : jigoshop::add_error( $field['label'] . __(' (billing) is not a valid number.','jigoshop') ); endif; + if (!woocommerce_validation::is_phone( $this->posted[$field['name']] )) : woocommerce::add_error( $field['label'] . __(' (billing) is not a valid number.', 'woothemes') ); endif; break; case 'email' : - if (!jigoshop_validation::is_email( $this->posted[$field['name']] )) : jigoshop::add_error( $field['label'] . __(' (billing) is not a valid email address.','jigoshop') ); endif; + if (!woocommerce_validation::is_email( $this->posted[$field['name']] )) : woocommerce::add_error( $field['label'] . __(' (billing) is not a valid email address.', 'woothemes') ); endif; break; case 'postcode' : - if (!jigoshop_validation::is_postcode( $this->posted[$field['name']], $_POST['billing-country'] )) : jigoshop::add_error( $field['label'] . __(' (billing) is not a valid postcode/ZIP.','jigoshop') ); + if (!woocommerce_validation::is_postcode( $this->posted[$field['name']], $_POST['billing-country'] )) : woocommerce::add_error( $field['label'] . __(' (billing) is not a valid postcode/ZIP.', 'woothemes') ); else : - $this->posted[$field['name']] = jigoshop_validation::format_postcode( $this->posted[$field['name']], $_POST['billing-country'] ); + $this->posted[$field['name']] = woocommerce_validation::format_postcode( $this->posted[$field['name']], $_POST['billing-country'] ); endif; break; endswitch; @@ -294,10 +296,10 @@ class jigoshop_checkout { endforeach; // Shipping Information - if (jigoshop_cart::needs_shipping() && !jigoshop_cart::ship_to_billing_address_only() && empty($this->posted['shiptobilling'])) : + if (woocommerce_cart::needs_shipping() && !woocommerce_cart::ship_to_billing_address_only() && empty($this->posted['shiptobilling'])) : foreach ($this->shipping_fields as $field) : - if (isset( $_POST[$field['name']] )) $this->posted[$field['name']] = jigowatt_clean($_POST[$field['name']]); else $this->posted[$field['name']] = ''; + if (isset( $_POST[$field['name']] )) $this->posted[$field['name']] = woocommerce_clean($_POST[$field['name']]); else $this->posted[$field['name']] = ''; // Format if (isset($field['format'])) switch ( $field['format'] ) : @@ -305,14 +307,14 @@ class jigoshop_checkout { endswitch; // Required - if ( isset($field['required']) && $field['required'] && empty($this->posted[$field['name']]) ) jigoshop::add_error( $field['label'] . __(' (shipping) is a required field.','jigoshop') ); + if ( isset($field['required']) && $field['required'] && empty($this->posted[$field['name']]) ) woocommerce::add_error( $field['label'] . __(' (shipping) is a required field.', 'woothemes') ); // Validation if (isset($field['validate']) && !empty($this->posted[$field['name']])) switch ( $field['validate'] ) : case 'postcode' : - if (!jigoshop_validation::is_postcode( $this->posted[$field['name']], $this->posted['shipping-country'] )) : jigoshop::add_error( $field['label'] . __(' (shipping) is not a valid postcode/ZIP.','jigoshop') ); + if (!woocommerce_validation::is_postcode( $this->posted[$field['name']], $this->posted['shipping-country'] )) : woocommerce::add_error( $field['label'] . __(' (shipping) is not a valid postcode/ZIP.', 'woothemes') ); else : - $this->posted[$field['name']] = jigoshop_validation::format_postcode( $this->posted[$field['name']], $this->posted['shipping-country'] ); + $this->posted[$field['name']] = woocommerce_validation::format_postcode( $this->posted[$field['name']], $this->posted['shipping-country'] ); endif; break; endswitch; @@ -333,48 +335,48 @@ class jigoshop_checkout { if ($this->creating_account && !$user_id) : - if ( empty($this->posted['account-username']) ) jigoshop::add_error( __('Please enter an account username.','jigoshop') ); - if ( empty($this->posted['account-password']) ) jigoshop::add_error( __('Please enter an account password.','jigoshop') ); - if ( $this->posted['account-password-2'] !== $this->posted['account-password'] ) jigoshop::add_error( __('Passwords do not match.','jigoshop') ); + if ( empty($this->posted['account-username']) ) woocommerce::add_error( __('Please enter an account username.', 'woothemes') ); + if ( empty($this->posted['account-password']) ) woocommerce::add_error( __('Please enter an account password.', 'woothemes') ); + if ( $this->posted['account-password-2'] !== $this->posted['account-password'] ) woocommerce::add_error( __('Passwords do not match.', 'woothemes') ); // Check the username if ( !validate_username( $this->posted['account-username'] ) ) : - jigoshop::add_error( __('Invalid email/username.','jigoshop') ); + woocommerce::add_error( __('Invalid email/username.', 'woothemes') ); elseif ( username_exists( $this->posted['account-username'] ) ) : - jigoshop::add_error( __('An account is already registered with that username. Please choose another.','jigoshop') ); + woocommerce::add_error( __('An account is already registered with that username. Please choose another.', 'woothemes') ); endif; // Check the e-mail address if ( email_exists( $this->posted['billing-email'] ) ) : - jigoshop::add_error( __('An account is already registered with your email address. Please login.','jigoshop') ); + woocommerce::add_error( __('An account is already registered with your email address. Please login.', 'woothemes') ); endif; endif; // Terms - if (!isset($_POST['update_totals']) && empty($this->posted['terms']) && get_option('jigoshop_terms_page_id')>0 ) jigoshop::add_error( __('You must accept our Terms & Conditions.','jigoshop') ); + if (!isset($_POST['update_totals']) && empty($this->posted['terms']) && get_option('woocommerce_terms_page_id')>0 ) woocommerce::add_error( __('You must accept our Terms & Conditions.', 'woothemes') ); - if (jigoshop_cart::needs_shipping()) : + if (woocommerce_cart::needs_shipping()) : // Shipping Method - $available_methods = jigoshop_shipping::get_available_shipping_methods(); + $available_methods = woocommerce_shipping::get_available_shipping_methods(); if (!isset($available_methods[$this->posted['shipping_method']])) : - jigoshop::add_error( __('Invalid shipping method.','jigoshop') ); + woocommerce::add_error( __('Invalid shipping method.', 'woothemes') ); endif; endif; - if (jigoshop_cart::needs_payment()) : + if (woocommerce_cart::needs_payment()) : // Payment Method - $available_gateways = jigoshop_payment_gateways::get_available_payment_gateways(); + $available_gateways = woocommerce_payment_gateways::get_available_payment_gateways(); if (!isset($available_gateways[$this->posted['payment_method']])) : - jigoshop::add_error( __('Invalid payment method.','jigoshop') ); + woocommerce::add_error( __('Invalid payment method.', 'woothemes') ); else : // Payment Method Field Validation $available_gateways[$this->posted['payment_method']]->validate_fields(); endif; endif; - if (!isset($_POST['update_totals']) && jigoshop::error_count()==0) : + if (!isset($_POST['update_totals']) && woocommerce::error_count()==0) : $user_id = get_current_user_id(); @@ -393,7 +395,7 @@ class jigoshop_checkout { $user_pass = $this->posted['account-password']; $user_id = wp_create_user( $this->posted['account-username'], $user_pass, $this->posted['billing-email'] ); if ( !$user_id ) { - jigoshop::add_error( sprintf(__('ERROR: Couldn’t register you... please contact the webmaster !', 'jigoshop'), get_option('admin_email'))); + woocommerce::add_error( sprintf(__('ERROR: Couldn’t register you... please contact the webmaster !', 'woothemes'), get_option('admin_email'))); break; } @@ -408,7 +410,7 @@ class jigoshop_checkout { wp_set_auth_cookie($user_id, true, $secure_cookie); else : - jigoshop::add_error( $reg_errors->get_error_message() ); + woocommerce::add_error( $reg_errors->get_error_message() ); break; endif; @@ -427,7 +429,7 @@ class jigoshop_checkout { $shipping_postcode = $this->posted['billing-postcode']; $shipping_country = $this->posted['billing-country']; - elseif ( jigoshop_cart::needs_shipping() ) : + elseif ( woocommerce_cart::needs_shipping() ) : $shipping_first_name = $this->posted['shipping-first_name']; $shipping_last_name = $this->posted['shipping-last_name']; @@ -455,7 +457,7 @@ class jigoshop_checkout { update_user_meta( $user_id, 'billing-state', $this->posted['billing-state'] ); update_user_meta( $user_id, 'billing-phone', $this->posted['billing-phone'] ); - if ( empty($this->posted['shiptobilling']) && jigoshop_cart::needs_shipping() ) : + if ( empty($this->posted['shiptobilling']) && woocommerce_cart::needs_shipping() ) : update_user_meta( $user_id, 'shipping-first_name', $this->posted['shipping-first_name'] ); update_user_meta( $user_id, 'shipping-last_name', $this->posted['shipping-last_name'] ); update_user_meta( $user_id, 'shipping-company', $this->posted['shipping-company'] ); @@ -465,7 +467,7 @@ class jigoshop_checkout { update_user_meta( $user_id, 'shipping-postcode', $this->posted['shipping-postcode'] ); update_user_meta( $user_id, 'shipping-country', $this->posted['shipping-country'] ); update_user_meta( $user_id, 'shipping-state', $this->posted['shipping-state'] ); - elseif ( $this->posted['shiptobilling'] && jigoshop_cart::needs_shipping() ) : + elseif ( $this->posted['shiptobilling'] && woocommerce_cart::needs_shipping() ) : update_user_meta( $user_id, 'shipping-first_name', $this->posted['billing-first_name'] ); update_user_meta( $user_id, 'shipping-last_name', $this->posted['billing-last_name'] ); update_user_meta( $user_id, 'shipping-company', $this->posted['billing-company'] ); @@ -481,7 +483,7 @@ class jigoshop_checkout { // Create Order (send cart variable so we can record items and reduce inventory). Only create if this is a new order, not if the payment was rejected last time. - $_tax = new jigoshop_tax(); + $_tax = new woocommerce_tax(); $order_data = array( 'post_type' => 'shop_order', @@ -515,17 +517,17 @@ class jigoshop_checkout { $data['shipping_state'] = $shipping_state; $data['shipping_method'] = $this->posted['shipping_method']; $data['payment_method'] = $this->posted['payment_method']; - $data['order_subtotal'] = number_format(jigoshop_cart::$subtotal_ex_tax, 2, '.', ''); - $data['order_shipping'] = number_format(jigoshop_cart::$shipping_total, 2, '.', ''); - $data['order_discount'] = number_format(jigoshop_cart::$discount_total, 2, '.', ''); - $data['order_tax'] = number_format(jigoshop_cart::$tax_total, 2, '.', ''); - $data['order_shipping_tax'] = number_format(jigoshop_cart::$shipping_tax_total, 2, '.', ''); - $data['order_total'] = number_format(jigoshop_cart::$total, 2, '.', ''); + $data['order_subtotal'] = number_format(woocommerce_cart::$subtotal_ex_tax, 2, '.', ''); + $data['order_shipping'] = number_format(woocommerce_cart::$shipping_total, 2, '.', ''); + $data['order_discount'] = number_format(woocommerce_cart::$discount_total, 2, '.', ''); + $data['order_tax'] = number_format(woocommerce_cart::$tax_total, 2, '.', ''); + $data['order_shipping_tax'] = number_format(woocommerce_cart::$shipping_tax_total, 2, '.', ''); + $data['order_total'] = number_format(woocommerce_cart::$total, 2, '.', ''); // Cart items $order_items = array(); - foreach (jigoshop_cart::$cart_contents as $cart_item_key => $values) : + foreach (woocommerce_cart::$cart_contents as $cart_item_key => $values) : $_product = $values['data']; @@ -548,7 +550,7 @@ class jigoshop_checkout { if ($_product->managing_stock()) : if (!$_product->is_in_stock() || !$_product->has_enough_stock( $values['quantity'] )) : - jigoshop::add_error( sprintf(__('Sorry, we do not have enough "%s" in stock to fulfill your order. Please edit your cart and try again. We apologise for any inconvenience caused.', 'jigoshop'), $_product->get_title() ) ); + woocommerce::add_error( sprintf(__('Sorry, we do not have enough "%s" in stock to fulfill your order. Please edit your cart and try again. We apologise for any inconvenience caused.', 'woothemes'), $_product->get_title() ) ); break; endif; @@ -556,7 +558,7 @@ class jigoshop_checkout { if (!$_product->is_in_stock()) : - jigoshop::add_error( sprintf(__('Sorry, we do not have enough "%s" in stock to fulfill your order. Please edit your cart and try again. We apologise for any inconvenience caused.', 'jigoshop'), $_product->get_title() ) ); + woocommerce::add_error( sprintf(__('Sorry, we do not have enough "%s" in stock to fulfill your order. Please edit your cart and try again. We apologise for any inconvenience caused.', 'woothemes'), $_product->get_title() ) ); break; endif; @@ -565,7 +567,7 @@ class jigoshop_checkout { endforeach; - if (jigoshop::error_count()>0) break; + if (woocommerce::error_count()>0) break; // Insert or update the post data if (isset($_SESSION['order_awaiting_payment']) && $_SESSION['order_awaiting_payment'] > 0) : @@ -578,7 +580,7 @@ class jigoshop_checkout { $order_id = wp_insert_post( $order_data ); if (is_wp_error($order_id)) : - jigoshop::add_error( 'Error: Unable to create order. Please try again.' ); + woocommerce::add_error( 'Error: Unable to create order. Please try again.' ); break; endif; endif; @@ -590,12 +592,12 @@ class jigoshop_checkout { update_post_meta( $order_id, 'order_items', $order_items ); wp_set_object_terms( $order_id, 'pending', 'shop_order_status' ); - $order = &new jigoshop_order($order_id); + $order = &new woocommerce_order($order_id); // Inserted successfully - do_action('jigoshop_new_order', $order_id); + do_action('woocommerce_new_order', $order_id); - if (jigoshop_cart::needs_payment()) : + if (woocommerce_cart::needs_payment()) : // Store Order ID in session so it can be re-used after payment failure $_SESSION['order_awaiting_payment'] = $order_id; @@ -623,15 +625,15 @@ class jigoshop_checkout { $order->payment_complete(); // Empty the Cart - jigoshop_cart::empty_cart(); + woocommerce_cart::empty_cart(); // Redirect to success/confirmation/payment page if (is_ajax()) : ob_clean(); - echo json_encode( array('redirect' => get_permalink(get_option('jigoshop_thanks_page_id'))) ); + echo json_encode( array('redirect' => get_permalink(get_option('woocommerce_thanks_page_id'))) ); exit; else : - wp_safe_redirect( get_permalink(get_option('jigoshop_thanks_page_id')) ); + wp_safe_redirect( get_permalink(get_option('woocommerce_thanks_page_id')) ); exit; endif; @@ -647,10 +649,10 @@ class jigoshop_checkout { // If we reached this point then there were errors if (is_ajax()) : ob_clean(); - jigoshop::show_messages(); + woocommerce::show_messages(); exit; else : - jigoshop::show_messages(); + woocommerce::show_messages(); endif; endif; diff --git a/classes/jigoshop_countries.class.php b/classes/countries.class.php similarity index 92% rename from classes/jigoshop_countries.class.php rename to classes/countries.class.php index f819d57a507..7b45439f600 100644 --- a/classes/jigoshop_countries.class.php +++ b/classes/countries.class.php @@ -1,15 +1,15 @@ 'Andorra', @@ -472,7 +472,7 @@ class jigoshop_countries { /** get base country */ function get_base_country() { - $default = get_option('jigoshop_default_country'); + $default = get_option('woocommerce_default_country'); if (strstr($default, ':')) : $country = current(explode(':', $default)); $state = end(explode(':', $default)); @@ -486,7 +486,7 @@ class jigoshop_countries { /** get base state */ function get_base_state() { - $default = get_option('jigoshop_default_country'); + $default = get_option('woocommerce_default_country'); if (strstr($default, ':')) : $country = current(explode(':', $default)); $state = end(explode(':', $default)); @@ -505,11 +505,11 @@ class jigoshop_countries { asort($countries); - if (get_option('jigoshop_allowed_countries')!=='specific') return $countries; + if (get_option('woocommerce_allowed_countries')!=='specific') return $countries; $allowed_countries = array(); - $allowed_countries_raw = get_option('jigoshop_specific_allowed_countries'); + $allowed_countries_raw = get_option('woocommerce_specific_allowed_countries'); foreach ($allowed_countries_raw as $country) : @@ -525,16 +525,16 @@ class jigoshop_countries { /** Gets the correct string for shipping - ether 'to the' or 'to' */ function shipping_to_prefix() { $return = ''; - if (in_array(jigoshop_customer::get_country(), array( 'GB', 'US', 'AE', 'CZ', 'DO', 'NL', 'PH', 'USAF' ))) $return = __('to the', 'jigoshop'); - else $return = __('to', 'jigoshop'); - $return = apply_filters('shipping_to_prefix', $return, jigoshop_customer::get_shipping_country()); + if (in_array(woocommerce_customer::get_country(), array( 'GB', 'US', 'AE', 'CZ', 'DO', 'NL', 'PH', 'USAF' ))) $return = __('to the', 'woothemes'); + else $return = __('to', 'woothemes'); + $return = apply_filters('shipping_to_prefix', $return, woocommerce_customer::get_shipping_country()); return $return; } function estimated_for_prefix() { $return = ''; - if (in_array(jigoshop_customer::get_country(), array( 'GB', 'US', 'AE', 'CZ', 'DO', 'NL', 'PH', 'USAF' ))) $return = __('the ', 'jigoshop'); - $return = apply_filters('estimated_for_prefix', $return, jigoshop_customer::get_shipping_country()); + if (in_array(woocommerce_customer::get_country(), array( 'GB', 'US', 'AE', 'CZ', 'DO', 'NL', 'PH', 'USAF' ))) $return = __('the ', 'woothemes'); + $return = apply_filters('estimated_for_prefix', $return, woocommerce_customer::get_shipping_country()); return $return; } @@ -554,7 +554,7 @@ class jigoshop_countries { echo ''; echo ''; + echo '>'.$value.' — '.__('All states', 'woothemes').''; foreach ($states as $state_key=>$state_value) : echo ''; + echo ' value="'.$key.'">'. ($escape ? esc_js( __($value, 'woothemes') ) : __($value, 'woothemes') ) .''; endif; endforeach; } diff --git a/classes/coupons.class.php b/classes/coupons.class.php new file mode 100644 index 00000000000..dd90d0c6e5d --- /dev/null +++ b/classes/coupons.class.php @@ -0,0 +1,41 @@ +0) : + $valid = false; + if (sizeof(woocommerce_cart::$cart_contents)>0) : foreach (woocommerce_cart::$cart_contents as $item_id => $values) : + if (in_array($item_id, $coupon['products'])) : + $valid = true; + endif; + endforeach; endif; + return $valid; + endif; + return true; + } +} \ No newline at end of file diff --git a/classes/jigoshop_customer.class.php b/classes/customer.class.php similarity index 87% rename from classes/jigoshop_customer.class.php rename to classes/customer.class.php index b90ae06d1e2..a33b500e16b 100644 --- a/classes/jigoshop_customer.class.php +++ b/classes/customer.class.php @@ -1,15 +1,15 @@ get_customer_orders( get_current_user_id() ); - if ($jigoshop_orders->orders) foreach ($jigoshop_orders->orders as $order) : + $woocommerce_orders = &new woocommerce_orders(); + $woocommerce_orders->get_customer_orders( get_current_user_id() ); + if ($woocommerce_orders->orders) foreach ($woocommerce_orders->orders as $order) : if ( $order->status == 'completed' ) { - $results = $wpdb->get_results( "SELECT * FROM ".$wpdb->prefix."jigoshop_downloadable_product_permissions WHERE order_key = \"".$order->order_key."\" AND user_id = ".get_current_user_id().";" ); + $results = $wpdb->get_results( "SELECT * FROM ".$wpdb->prefix."woocommerce_downloadable_product_permissions WHERE order_key = \"".$order->order_key."\" AND user_id = ".get_current_user_id().";" ); $user_info = get_userdata(get_current_user_id()); if ($results) foreach ($results as $result) : - $_product = &new jigoshop_product( $result->product_id ); + $_product = &new woocommerce_product( $result->product_id ); if ($_product->exists) : $download_name = $_product->get_title(); else : diff --git a/classes/gateways/gateway-banktransfer.php b/classes/gateways/gateway-banktransfer.php new file mode 100644 index 00000000000..90e13369628 --- /dev/null +++ b/classes/gateways/gateway-banktransfer.php @@ -0,0 +1,204 @@ +id = 'bacs'; + $this->icon = ''; + $this->has_fields = false; + + $this->enabled = get_option('jigoshop_bacs_enabled'); + $this->title = get_option('jigoshop_bacs_title'); + $this->description = get_option('jigoshop_bacs_description'); + $this->account_name = get_option('jigoshop_bacs_account_name'); + $this->account_number = get_option('jigoshop_bacs_account_number'); + $this->sort_code = get_option('jigoshop_bacs_sort_code'); + $this->bank_name = get_option('jigoshop_bacs_bank_name'); + $this->iban = get_option('jigoshop_bacs_iban'); + $this->bic = get_option('jigoshop_bacs_bic'); + + add_action('jigoshop_update_options', array(&$this, 'process_admin_options')); + add_option('jigoshop_bacs_enabled', 'no'); + add_option('jigoshop_bacs_title', __('Direct Bank Transer', 'jigoshop-bacs-gateway')); + add_option('jigoshop_bacs_description', __('Make your payment directly into our bank account. Please use your Order ID as the payment reference. Your order wont be shipped until the funds have cleared in our account.', 'jigoshop-bacs-gateway')); + add_action('thankyou_bacs', array(&$this, 'thankyou_page')); + } + + public function is_available(){ + return ($this->enabled == 'yes') ? true : false; + } + + public function set_current(){ true; } + public function icon(){} + public function validate_fields(){ true; } + + /** + * Admin Panel Options + **/ + public function admin_options() { ?> + + + + + + + + : + + + + + + : + + + + + + : + + + + + + : + + + + + + : + + + + + + : + + + + + + : + + + + + + : + + + + + + : + + + + + description) echo wpautop(wptexturize($this->description)); + } + + function thankyou_page() { + if ($this->description) echo wpautop(wptexturize($this->description)); + ?>

    '; diff --git a/templates/single-product.php b/templates/single-product.php index ccf44317959..7fa386c56a1 100644 --- a/templates/single-product.php +++ b/templates/single-product.php @@ -1,33 +1,33 @@ -
    ?> +
    ?> - ID ); ?> + ID ); ?> - +
    > - +

    - +
    - +
    - + -
    ?> +
    ?> - + \ No newline at end of file diff --git a/templates/taxonomy-product_cat.php b/templates/taxonomy-product_cat.php index 662220ac52a..a84d8757241 100644 --- a/templates/taxonomy-product_cat.php +++ b/templates/taxonomy-product_cat.php @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/templates/taxonomy-product_tag.php b/templates/taxonomy-product_tag.php index 662220ac52a..a84d8757241 100644 --- a/templates/taxonomy-product_tag.php +++ b/templates/taxonomy-product_tag.php @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/version.txt b/version.txt deleted file mode 100644 index 7e310bae199..00000000000 --- a/version.txt +++ /dev/null @@ -1 +0,0 @@ -0.9.9 diff --git a/widgets/widget-cart.php b/widgets/widget-cart.php new file mode 100644 index 00000000000..50b6d006f77 --- /dev/null +++ b/widgets/widget-cart.php @@ -0,0 +1,80 @@ + __( "Shopping Cart for the sidebar.", 'woothemes') ); + parent::WP_Widget('shopping_cart', __('Shopping Cart', 'woothemes'), $widget_ops); + } + + /** @see WP_Widget::widget */ + function widget( $args, $instance ) { + + if (is_cart()) return; + + extract($args); + if ( !empty($instance['title']) ) $title = $instance['title']; else $title = __('Cart', 'woothemes'); + $title = apply_filters('widget_title', $title, $instance, $this->id_base); + + echo $before_widget; + if ( $title ) echo $before_title . $title . $after_title; + + echo ''; + + if (sizeof(woocommerce_cart::$cart_contents)>0) : + echo '

    '; + + if (get_option('js_prices_include_tax')=='yes') : + _e('Total', 'woothemes'); + else : + _e('Subtotal', 'woothemes'); + endif; + + echo ': '.woocommerce_cart::get_cart_total(); + + echo '

    '; + + do_action( 'woocommerce_widget_shopping_cart_before_buttons' ); + + echo '

    '.__('View Cart →', 'woothemes').' '.__('Checkout →', 'woothemes').'

    '; + endif; + echo $after_widget; + } + + /** @see WP_Widget::update */ + function update( $new_instance, $old_instance ) { + $instance['title'] = strip_tags(stripslashes($new_instance['title'])); + return $instance; + } + + /** @see WP_Widget::form */ + function form( $instance ) { + ?> +

    +

    + 'widget_featured_products', 'description' => __( "Featured products on your site", 'woothemes') ); + parent::WP_Widget('featured-products', __('Featured Products', 'woothemes'), $widget_ops); + $this->alt_option_name = 'widget_featured_products'; + + add_action( 'save_post', array(&$this, 'flush_widget_cache') ); + add_action( 'deleted_post', array(&$this, 'flush_widget_cache') ); + add_action( 'switch_theme', array(&$this, 'flush_widget_cache') ); + } + + /** @see WP_Widget::widget */ + function widget($args, $instance) { + $cache = wp_cache_get('widget_featured_products', 'widget'); + + if ( !is_array($cache) ) $cache = array(); + + if ( isset($cache[$args['widget_id']]) ) { + echo $cache[$args['widget_id']]; + return; + } + + ob_start(); + extract($args); + + $title = apply_filters('widget_title', empty($instance['title']) ? __('Featured Products', 'woothemes') : $instance['title'], $instance, $this->id_base); + if ( !$number = (int) $instance['number'] ) + $number = 10; + else if ( $number < 1 ) + $number = 1; + else if ( $number > 15 ) + $number = 15; + + $featured_posts = get_posts(array('numberposts' => $number, 'post_status' => 'publish', 'post_type' => 'product', 'meta_key' => 'featured', 'meta_value' => 'yes' )); + if ($featured_posts) : +?> + + + + +flush_widget_cache(); + + $alloptions = wp_cache_get( 'alloptions', 'options' ); + if ( isset($alloptions['widget_featured_products']) ) delete_option('widget_featured_products'); + + return $instance; + } + + function flush_widget_cache() { + wp_cache_delete('widget_featured_products', 'widget'); + } + + /** @see WP_Widget::form */ + function form( $instance ) { + $title = isset($instance['title']) ? esc_attr($instance['title']) : ''; + if ( !isset($instance['number']) || !$number = (int) $instance['number'] ) + $number = 2; +?> +

    +

    + +

    +

    + __( "Shows a custom attribute in a widget which lets you narrow down the list of shown products in categories.", 'woothemes') ); + parent::WP_Widget('layered_nav', __('Layered Nav', 'woothemes'), $widget_ops); + } + + /** @see WP_Widget::widget */ + function widget( $args, $instance ) { + extract($args); + + if (!is_tax( 'product_cat' ) && !is_post_type_archive('product') && !is_tax( 'product_tag' )) return; + + global $_chosen_attributes, $wpdb, $all_post_ids; + + $title = $instance['title']; + $taxonomy = 'product_attribute_'.strtolower(sanitize_title($instance['attribute'])); + + if (!taxonomy_exists($taxonomy)) return; + + $title = apply_filters('widget_title', $title, $instance, $this->id_base); + + $args = array( + 'hide_empty' => '1' + ); + $terms = get_terms( $taxonomy, $args ); + $count = count($terms); + if($count > 0){ + + $found = false; + ob_start(); + + echo $before_widget . $before_title . $title . $after_title; + + echo "
      "; + + // Reduce count based on chosen attributes + $all_post_ids = woocommerce_layered_nav_query( $all_post_ids ); + $all_post_ids = woocommerce_price_filter( $all_post_ids ); + + foreach ($terms as $term) { + + $_products_in_term = get_objects_in_term( $term->term_id, $taxonomy ); + + $count = sizeof(array_intersect($_products_in_term, $all_post_ids)); + + if ($count>0) $found = true; + + $class = ''; + + $arg = 'filter_'.strtolower(sanitize_title($instance['attribute'])); + + if (isset($_GET[ $arg ])) $current_filter = explode(',', $_GET[ $arg ]); else $current_filter = array(); + + if (!is_array($current_filter)) $current_filter = array(); + + if (!in_array($term->term_id, $current_filter)) $current_filter[] = $term->term_id; + + // Base Link decided by current page + if (defined('SHOP_IS_ON_FRONT')) : + $link = ''; + elseif (is_post_type_archive('product') || is_page( get_option('woocommerce_shop_page_id') )) : + $link = get_post_type_archive_link('product'); + else : + $link = get_term_link( get_query_var('term'), get_query_var('taxonomy') ); + endif; + + // All current filters + if ($_chosen_attributes) foreach ($_chosen_attributes as $name => $value) : + if ($name!==$taxonomy) : + $link = add_query_arg( strtolower(sanitize_title(str_replace('product_attribute_', 'filter_', $name))), implode(',', $value), $link ); + endif; + endforeach; + + // Min/Max + if (isset($_GET['min_price'])) : + $link = add_query_arg( 'min_price', $_GET['min_price'], $link ); + endif; + if (isset($_GET['max_price'])) : + $link = add_query_arg( 'max_price', $_GET['max_price'], $link ); + endif; + + // Current Filter = this widget + if (isset( $_chosen_attributes[$taxonomy] ) && is_array($_chosen_attributes[$taxonomy]) && in_array($term->term_id, $_chosen_attributes[$taxonomy])) : + $class = 'class="chosen"'; + else : + $link = add_query_arg( $arg, implode(',', $current_filter), $link ); + endif; + + // Search Arg + if (get_search_query()) : + $link = add_query_arg( 's', get_search_query(), $link ); + endif; + + // Post Type Arg + if (isset($_GET['post_type'])) : + $link = add_query_arg( 'post_type', $_GET['post_type'], $link ); + endif; + + echo '
    • '; + + if ($count>0) echo ''; else echo ''; + + echo $term->name; + + if ($count>0) echo ''; else echo ''; + + echo ' '.$count.'
    • '; + + } + + echo "
    "; + + echo $after_widget; + + if (!$found) : + ob_clean(); + return; + else : + $widget = ob_get_clean(); + echo $widget; + endif; + + } + } + + /** @see WP_Widget::update */ + function update( $new_instance, $old_instance ) { + if (!isset($new_instance['title']) || empty($new_instance['title'])) $new_instance['title'] = ucwords($new_instance['attribute']); + $instance['title'] = strip_tags(stripslashes($new_instance['title'])); + $instance['attribute'] = stripslashes($new_instance['attribute']); + return $instance; + } + + /** @see WP_Widget::form */ + function form( $instance ) { + global $wpdb; + ?> +

    +

    + +

    + + __( "Shows a price filter slider in a widget which lets you narrow down the list of shown products in categories.", 'woothemes') ); + parent::WP_Widget('price_filter', __('Price Filter', 'woothemes'), $widget_ops); + } + + /** @see WP_Widget::widget */ + function widget( $args, $instance ) { + extract($args); + + if (!is_tax( 'product_cat' ) && !is_post_type_archive('product') && !is_tax( 'product_tag' )) return; + + global $_chosen_attributes, $wpdb, $all_post_ids; + + $title = $instance['title']; + $title = apply_filters('widget_title', $title, $instance, $this->id_base); + + echo $before_widget . $before_title . $title . $after_title; + + // Remember current filters/search + $fields = ''; + + if (get_search_query()) $fields = ''; + if (isset($_GET['post_type'])) $fields .= ''; + + if ($_chosen_attributes) foreach ($_chosen_attributes as $attribute => $value) : + + $fields .= ''; + + endforeach; + + $min = 0; + + $max = ceil($wpdb->get_var("SELECT max(meta_value + 0) + FROM $wpdb->posts + LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id + WHERE meta_key = 'price' AND ( + $wpdb->posts.ID IN (".implode(',', $all_post_ids).") + OR ( + $wpdb->posts.post_parent IN (".implode(',', $all_post_ids).") + AND $wpdb->posts.post_parent != 0 + ) + )")); + + if (defined('SHOP_IS_ON_FRONT')) : + $link = ''; + elseif (is_post_type_archive('product') || is_page( get_option('woocommerce_shop_page_id') )) : + $link = get_post_type_archive_link('product'); + else : + $link = get_term_link( get_query_var('term'), get_query_var('taxonomy') ); + endif; + + echo '

    +
    +
    +
    + '.__('Price: ', 'woothemes').' + + + '.$fields.' +
    +
    +
    '; + + echo $after_widget; + } + + /** @see WP_Widget::update */ + function update( $new_instance, $old_instance ) { + if (!isset($new_instance['title']) || empty($new_instance['title'])) $new_instance['title'] = __('Filter by price', 'woothemes'); + $instance['title'] = strip_tags(stripslashes($new_instance['title'])); + return $instance; + } + + /** @see WP_Widget::form */ + function form( $instance ) { + global $wpdb; + ?> +

    +

    + 'widget_product_categories', 'description' => __( "A list or dropdown of product categories", 'woothemes' ) ); + parent::WP_Widget('product_categories', __('Product Categories', 'woothemes'), $widget_ops); + } + + /** @see WP_Widget::widget */ + function widget( $args, $instance ) { + extract( $args ); + + $title = apply_filters('widget_title', empty( $instance['title'] ) ? __( 'Product Categories', 'woothemes' ) : $instance['title'], $instance, $this->id_base); + $c = $instance['count'] ? '1' : '0'; + $h = $instance['hierarchical'] ? '1' : '0'; + $d = $instance['dropdown'] ? '1' : '0'; + + echo $before_widget; + if ( $title ) + echo $before_title . $title . $after_title; + + $cat_args = array('orderby' => 'name', 'show_count' => $c, 'hierarchical' => $h, 'taxonomy' => 'product_cat'); + + if ( $d ) { + + $terms = get_terms('product_cat'); + $output = ""; + echo $output; + + ?> + + +
      + +
    + '') ); + $title = esc_attr( $instance['title'] ); + $count = isset($instance['count']) ? (bool) $instance['count'] :false; + $hierarchical = isset( $instance['hierarchical'] ) ? (bool) $instance['hierarchical'] : false; + $dropdown = isset( $instance['dropdown'] ) ? (bool) $instance['dropdown'] : false; +?> +

    +

    + +

    /> +
    + + /> +
    + + /> +

    + __( "Search box for products only.", 'woothemes') ); + parent::WP_Widget('product_search', __('Product Search', 'woothemes'), $widget_ops); + } + + /** @see WP_Widget::widget */ + function widget( $args, $instance ) { + extract($args); + + $title = $instance['title']; + $title = apply_filters('widget_title', $title, $instance, $this->id_base); + + echo $before_widget; + + if ($title) echo $before_title . $title . $after_title; + + ?> + + +

    +

    + __( "Your most used product tags in cloud format", 'woothemes') ); + parent::WP_Widget('tag_cloud', __('Product Tag Cloud', 'woothemes'), $widget_ops); + } + + /** @see WP_Widget::widget */ + function widget( $args, $instance ) { + extract($args); + $current_taxonomy = $this->_get_current_taxonomy($instance); + if ( !empty($instance['title']) ) { + $title = $instance['title']; + } else { + if ( 'product_tag' == $current_taxonomy ) { + $title = __('Product Tags', 'woothemes'); + } else { + $tax = get_taxonomy($current_taxonomy); + $title = $tax->labels->name; + } + } + $title = apply_filters('widget_title', $title, $instance, $this->id_base); + + echo $before_widget; + if ( $title ) + echo $before_title . $title . $after_title; + echo '
    '; + wp_tag_cloud( apply_filters('widget_tag_cloud_args', array('taxonomy' => $current_taxonomy) ) ); + echo "
    \n"; + echo $after_widget; + } + + /** @see WP_Widget::update */ + function update( $new_instance, $old_instance ) { + $instance['title'] = strip_tags(stripslashes($new_instance['title'])); + $instance['taxonomy'] = stripslashes($new_instance['taxonomy']); + return $instance; + } + + /** @see WP_Widget::form */ + function form( $instance ) { + $current_taxonomy = $this->_get_current_taxonomy($instance); +?> +

    +

    + 'widget_recent_entries', 'description' => __( "The most recent products on your site", 'woothemes') ); + parent::WP_Widget('recent-products', __('New Products', 'woothemes'), $widget_ops); + $this->alt_option_name = 'widget_recent_entries'; + + add_action( 'save_post', array(&$this, 'flush_widget_cache') ); + add_action( 'deleted_post', array(&$this, 'flush_widget_cache') ); + add_action( 'switch_theme', array(&$this, 'flush_widget_cache') ); + } + + /** @see WP_Widget::widget */ + function widget($args, $instance) { + $cache = wp_cache_get('widget_recent_products', 'widget'); + + if ( !is_array($cache) ) $cache = array(); + + if ( isset($cache[$args['widget_id']]) ) { + echo $cache[$args['widget_id']]; + return; + } + + ob_start(); + extract($args); + + $title = apply_filters('widget_title', empty($instance['title']) ? __('New Products', 'woothemes') : $instance['title'], $instance, $this->id_base); + if ( !$number = (int) $instance['number'] ) + $number = 10; + else if ( $number < 1 ) + $number = 1; + else if ( $number > 15 ) + $number = 15; + + $show_variations = $instance['show_variations'] ? '1' : '0'; + + $args = array('showposts' => $number, 'nopaging' => 0, 'post_status' => 'publish', 'post_type' => 'product'); + + if($show_variations=='0'){ + $args['meta_query'] = array( + array( + 'key' => 'visibility', + 'value' => array('catalog', 'visible'), + 'compare' => 'IN' + ) + ); + $args['parent'] = '0'; + } + + $r = new WP_Query($args); + + if ($r->have_posts()) : +?> + + +
      + have_posts()) : $r->the_post(); $_product = &new woocommerce_product(get_the_ID()); ?> +
    • + '; ?> + + get_price_html(); ?>
    • + +
    + +flush_widget_cache(); + + $alloptions = wp_cache_get( 'alloptions', 'options' ); + if ( isset($alloptions['widget_recent_products']) ) delete_option('widget_recent_products'); + + return $instance; + } + + function flush_widget_cache() { + wp_cache_delete('widget_recent_products', 'widget'); + } + + /** @see WP_Widget::form */ + function form( $instance ) { + $title = isset($instance['title']) ? esc_attr($instance['title']) : ''; + if ( !isset($instance['number']) || !$number = (int) $instance['number'] ) + $number = 5; + + $show_variations = isset( $instance['show_variations'] ) ? (bool) $instance['show_variations'] : false; +?> +

    +

    + +

    +

    + +

    /> +
    + + true, + 'edit_posts' => false, + 'delete_posts' => false + )); + + $css = file_exists(get_stylesheet_directory() . '/woocommerce/style.css') ? get_stylesheet_directory_uri() . '/woocommerce/style.css' : woocommerce::plugin_url() . '/assets/css/woocommerce.css'; + if (WOOCOMMERCE_USE_CSS) wp_register_style('woocommerce_frontend_styles', $css ); + + if (is_admin()) : + wp_register_style('woocommerce_admin_styles', woocommerce::plugin_url() . '/assets/css/admin.css'); + wp_enqueue_style('woocommerce_admin_styles'); + else : + wp_register_style( 'woocommerce_fancybox_styles', woocommerce::plugin_url() . '/assets/css/fancybox.css' ); + wp_register_style( 'jqueryui_styles', woocommerce::plugin_url() . '/assets/css/ui.css' ); + + wp_enqueue_style('woocommerce_frontend_styles'); + wp_enqueue_style('woocommerce_fancybox_styles'); + wp_enqueue_style('jqueryui_styles'); + endif; +} + +function woocommerce_admin_scripts() { + + wp_register_script( 'woocommerce_admin', woocommerce::plugin_url() . '/assets/js/woocommerce_admin.js', 'jquery', '1.0' ); + wp_enqueue_script('woocommerce_admin'); + +} +add_action('admin_print_scripts', 'woocommerce_admin_scripts'); + +function woocommerce_frontend_scripts() { + + wp_register_script( 'woocommerce', woocommerce::plugin_url() . '/assets/js/woocommerce.js', 'jquery', '1.0' ); + wp_register_script( 'woocommerce_plugins', woocommerce::plugin_url() . '/assets/js/woocommerce_plugins.js', 'jquery', '1.0' ); + wp_register_script( 'fancybox', woocommerce::plugin_url() . '/assets/js/jquery.fancybox-1.3.4.pack.js', 'jquery', '1.0' ); + wp_register_script( 'jqueryui', 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js', 'jquery', '1.0' ); + + wp_enqueue_script('jquery'); + wp_enqueue_script('jqueryui'); + wp_enqueue_script('woocommerce_plugins'); + wp_enqueue_script('woocommerce'); + wp_enqueue_script('fancybox'); + + /* Script variables */ + $params = array( + 'currency_symbol' => get_woocommerce_currency_symbol(), + 'countries' => json_encode(woocommerce_countries::$states), + 'select_state_text' => __('Select a state…', 'woothemes'), + 'state_text' => __('state', 'woothemes'), + 'variation_not_available_text' => __('This variation is not available.', 'woothemes'), + 'plugin_url' => woocommerce::plugin_url(), + 'ajax_url' => admin_url('admin-ajax.php'), + 'get_variation_nonce' => wp_create_nonce("get-variation"), + 'review_order_url' => woocommerce_get_template_file_url('checkout/review_order.php', true), + 'option_guest_checkout' => get_option('woocommerce_enable_guest_checkout'), + 'checkout_url' => admin_url('admin-ajax.php?action=woocommerce-checkout') + ); + + if (isset($_SESSION['min_price'])) : + $params['min_price'] = $_SESSION['min_price']; + endif; + if (isset($_SESSION['max_price'])) : + $params['max_price'] = $_SESSION['max_price']; + endif; + + if ( is_page(get_option('woocommerce_checkout_page_id')) || is_page(get_option('woocommerce_pay_page_id')) ) : + $params['is_checkout'] = 1; + else : + $params['is_checkout'] = 0; + endif; + + wp_localize_script( 'woocommerce', 'params', $params ); + +} +add_action('template_redirect', 'woocommerce_frontend_scripts'); + + +/** + * Demo Banner + * + * Adds a demo store banner to the site if enabled + **/ +function woocommerce_demo_store() { + + if (get_option('woocommerce_demo_store')=='yes') : + + echo '

    '.__('This is a demo store for testing purposes — no orders shall be fulfilled.', 'woothemes').'

    '; + + endif; +} + +/** + * Sharethis + * + * Adds social sharing code + **/ +function woocommerce_sharethis() { + if (is_single() && get_option('woocommerce_sharethis')) : + + if (is_ssl()) : + $sharethis = 'https://ws.sharethis.com/button/buttons.js'; + else : + $sharethis = 'http://w.sharethis.com/button/buttons.js'; + endif; + + echo ''; + + endif; +} + +/** + * WooCommerce conditionals + **/ +function is_cart() { + if (is_page(get_option('woocommerce_cart_page_id'))) return true; + return false; +} +function is_checkout() { + if ( + is_page(get_option('woocommerce_checkout_page_id')) + ) return true; + return false; +} +if (!function_exists('is_ajax')) { + function is_ajax() { + if ( isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) return true; + return false; + } +} + +/** + * Force SSL (if enabled) + **/ +function woocommerce_force_ssl() { + if (is_checkout() && !is_ssl()) : + wp_redirect( str_replace('http:', 'https:', get_permalink(get_option('woocommerce_checkout_page_id'))), 301 ); + exit; + endif; +} +function woocommerce_force_ssl_images( $content ) { + if (is_ssl()) : + if (is_array($content)) : + $content = array_map('woocommerce_force_ssl_images', $content); + else : + $content = str_replace('http:', 'https:', $content); + endif; + endif; + return $content; +} +add_filter('post_thumbnail_html', 'woocommerce_force_ssl_images'); +add_filter('widget_text', 'woocommerce_force_ssl_images'); +add_filter('wp_get_attachment_url', 'woocommerce_force_ssl_images'); +add_filter('wp_get_attachment_image_attributes', 'woocommerce_force_ssl_images'); +add_filter('wp_get_attachment_url', 'woocommerce_force_ssl_images'); + +/** + * Currencys + **/ +function get_woocommerce_currency_symbol() { + $currency = get_option('woocommerce_currency'); + $currency_symbol = ''; + switch ($currency) : + case 'AUD' : + case 'BRL' : + case 'CAD' : + case 'MXN' : + case 'NZD' : + case 'HKD' : + case 'SGD' : + case 'USD' : $currency_symbol = '$'; break; + case 'EUR' : $currency_symbol = '€'; break; + case 'JPY' : $currency_symbol = '¥'; break; + + case 'CZK' : + case 'DKK' : + case 'HUF' : + case 'ILS' : + case 'MYR' : + case 'NOK' : + case 'PHP' : + case 'PLN' : + case 'SEK' : + case 'CHF' : + case 'TWD' : + case 'THB' : $currency_symbol = $currency; break; + + case 'GBP' : + default : $currency_symbol = '£'; break; + endswitch; + return apply_filters('woocommerce_currency_symbol', $currency_symbol, $currency); +} + +/** + * Price Formatting + **/ +function woocommerce_price( $price, $args = array() ) { + + extract(shortcode_atts(array( + 'ex_tax_label' => '0' + ), $args)); + + $return = ''; + $num_decimals = (int) get_option('woocommerce_price_num_decimals'); + $currency_pos = get_option('woocommerce_currency_pos'); + $currency_symbol = get_woocommerce_currency_symbol(); + $price = number_format( (double) $price, $num_decimals, get_option('woocommerce_price_decimal_sep'), get_option('woocommerce_price_thousand_sep') ); + + switch ($currency_pos) : + case 'left' : + $return = $currency_symbol . $price; + break; + case 'right' : + $return = $price . $currency_symbol; + break; + case 'left_space' : + $return = $currency_symbol . ' ' . $price; + break; + case 'right_space' : + $return = $price . ' ' . $currency_symbol; + break; + endswitch; + + if ($ex_tax_label && get_option('woocommerce_calc_taxes')=='yes') $return .= __(' (ex. tax)', 'woothemes'); + + return $return; +} + +/** + * Variation Formatting + **/ +function woocommerce_get_formatted_variation( $variation = '', $flat = false ) { + if ($variation && is_array($variation)) : + + $return = ''; + + if (!$flat) : + $return = '
    '; + endif; + + $varation_list = array(); + + foreach ($variation as $name => $value) : + + if ($flat) : + $varation_list[] = ucfirst(str_replace('tax_', '', $name)).': '.ucfirst($value); + else : + $varation_list[] = '
    '.ucfirst(str_replace('tax_', '', $name)).':
    '.ucfirst($value).'
    '; + endif; + + endforeach; + + if ($flat) : + $return .= implode(', ', $varation_list); + else : + $return .= implode('', $varation_list); + endif; + + if (!$flat) : + $return .= '
    '; + endif; + + return $return; + + endif; +} + +/** + * Letter to number + **/ +function woocommerce_let_to_num($v) { + $l = substr($v, -1); + $ret = substr($v, 0, -1); + switch(strtoupper($l)){ + case 'P': + $ret *= 1024; + case 'T': + $ret *= 1024; + case 'G': + $ret *= 1024; + case 'M': + $ret *= 1024; + case 'K': + $ret *= 1024; + break; + } + return $ret; +} + +/** + * Clean variables + **/ +function woocommerce_clean( $var ) { + return strip_tags(stripslashes(trim($var))); +} + +/** + * Rating field for comments + **/ +function woocommerce_add_comment_rating($comment_id) { + if ( isset($_POST['rating']) ) : + if (!$_POST['rating'] || $_POST['rating'] > 5 || $_POST['rating'] < 0) $_POST['rating'] = 5; + add_comment_meta( $comment_id, 'rating', $_POST['rating'], true ); + endif; +} +add_action( 'comment_post', 'woocommerce_add_comment_rating', 1 ); + +function woocommerce_check_comment_rating($comment_data) { + // If posting a comment (not trackback etc) and not logged in + if ( isset($_POST['rating']) && !woocommerce::verify_nonce('comment_rating') ) + wp_die( __('You have taken too long. Please go back and refresh the page.', 'woothemes') ); + + elseif ( isset($_POST['rating']) && empty($_POST['rating']) && $comment_data['comment_type']== '' ) { + wp_die( __('Please rate the product.',"woocommerce") ); + exit; + } + return $comment_data; +} +add_filter('preprocess_comment', 'woocommerce_check_comment_rating', 0); + +/** + * Review comments template + **/ +function woocommerce_comments($comment, $args, $depth) { + $GLOBALS['comment'] = $comment; global $post; ?> + +
  • id="li-comment-"> +
    + + + +
    +
    + comment_ID, 'rating', true ); ?> +
    + comment_approved == '0') : ?> +

    + +

    + : +

    + +
    +
    +
    +
    +
    + posts ON $wpdb->comments.comment_post_ID = $wpdb->posts.ID + "; + + if ($clauses['where']) $clauses['where'] .= ' AND '; + + $clauses['where'] .= " + $wpdb->posts.post_type NOT IN ('shop_order') + "; + + return $clauses; + +} +if (!is_admin()) add_filter('comments_clauses', 'woocommerce_exclude_order_comments'); + +/** + * Cron Job - Update price if on sale + **/ +function woocommerce_update_sale_prices() { + + global $wpdb; + + // On Sale Products + $on_sale = $wpdb->get_results(" + SELECT post_id FROM $wpdb->postmeta + WHERE meta_key = 'sale_price_dates_from' + AND meta_value < ".strtotime('NOW')." + "); + if ($on_sale) foreach ($on_sale as $product) : + + $data = unserialize( get_post_meta($product, 'product_data', true) ); + $price = get_post_meta($product, 'price', true); + + if ($data['sale_price'] && $price!==$data['sale_price']) update_post_meta($product, 'price', $data['sale_price']); + + endforeach; + + // Expired Sales + $sale_expired = $wpdb->get_results(" + SELECT post_id FROM $wpdb->postmeta + WHERE meta_key = 'sale_price_dates_to' + AND meta_value < ".strtotime('NOW')." + "); + if ($sale_expired) foreach ($sale_expired as $product) : + + $data = unserialize( get_post_meta($product, 'product_data', true) ); + $price = get_post_meta($product, 'price', true); + + if ($data['regular_price'] && $price!==$data['regular_price']) update_post_meta($product, 'price', $data['regular_price']); + + // Sale has expired - clear the schedule boxes + update_post_meta($product, 'sale_price_dates_from', ''); + update_post_meta($product, 'sale_price_dates_to', ''); + + endforeach; + +} +function woocommerce_update_sale_prices_schedule_check(){ + wp_schedule_event(time(), 'daily', 'woocommerce_update_sale_prices_schedule_check'); + update_option('woocommerce_update_sale_prices', 'yes'); +} +if (get_option('woocommerce_update_sale_prices')!='yes') woocommerce_update_sale_prices_schedule_check(); + +add_action('woocommerce_update_sale_prices_schedule_check', 'woocommerce_update_sale_prices'); diff --git a/woocommerce_actions.php b/woocommerce_actions.php new file mode 100644 index 00000000000..e26ec659d99 --- /dev/null +++ b/woocommerce_actions.php @@ -0,0 +1,626 @@ +get_availability(); + + if ($availability['availability']) : + $availability_html = '

    '. $availability['availability'].'

    '; + else : + $availability_html = ''; + endif; + + if (has_post_thumbnail($variation_id)) : + $attachment_id = get_post_thumbnail_id( $variation_id ); + $large_thumbnail_size = apply_filters('single_product_large_thumbnail_size', 'shop_large'); + $image = current(wp_get_attachment_image_src( $attachment_id, $large_thumbnail_size)); + $image_link = current(wp_get_attachment_image_src( $attachment_id, 'full')); + else : + $image = ''; + $image_link = ''; + endif; + + $data = array( + 'price_html' => ''.$_product->get_price_html().'', + 'availability_html' => $availability_html, + 'image_src' => $image, + 'image_link' => $image_link + ); + + echo json_encode( $data ); + + // Quit out + die(); +} + +/** + * Add order item via ajax + */ +add_action('wp_ajax_woocommerce_add_order_item', 'woocommerce_add_order_item'); + +function woocommerce_add_order_item() { + + check_ajax_referer( 'add-order-item', 'security' ); + + global $wpdb; + + $item_to_add = trim(stripslashes($_POST['item_to_add'])); + + $post = ''; + + // Find the item + if (is_numeric($item_to_add)) : + $post = get_post( $item_to_add ); + endif; + + if (!$post || ($post->post_type!=='product' && $post->post_type!=='product_variation')) : + $post_id = $wpdb->get_var($wpdb->prepare(" + SELECT post_id + FROM $wpdb->posts + LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) + WHERE $wpdb->postmeta.meta_key = 'SKU' + AND $wpdb->posts.post_status = 'publish' + AND $wpdb->posts.post_type = 'shop_product' + AND $wpdb->postmeta.meta_value = '".$item_to_add."' + LIMIT 1 + ")); + $post = get_post( $post_id ); + endif; + + if (!$post || ($post->post_type!=='product' && $post->post_type!=='product_variation')) : + die(); + endif; + + if ($post->post_type=="product") : + $_product = &new woocommerce_product( $post->ID ); + else : + $_product = &new woocommerce_product_variation( $post->ID ); + endif; + + $loop = 0; + ?> + + #id; ?> + variation_id)) echo $_product->variation_id; else echo '-'; ?> + sku) echo $_product->sku; ?> + get_title(); ?> + variation_data)) : + echo woocommerce_get_formatted_variation( $_product->variation_data, true ); + else : + echo '-'; + endif; + ?> + + + + + + + + +
    + + + + + + + + + + + + 0) : + foreach (woocommerce_cart::$cart_contents as $cart_item_key => $values) : + + if (isset($cart_totals[$cart_item_key]['qty'])) woocommerce_cart::set_quantity( $cart_item_key, $cart_totals[$cart_item_key]['qty'] ); + + endforeach; + endif; + + woocommerce::add_message( __('Cart updated.', 'woothemes') ); + + endif; + +} + +/** + * Add to cart + **/ +add_action( 'init', 'woocommerce_add_to_cart_action' ); + +function woocommerce_add_to_cart_action( $url = false ) { + + if (isset($_GET['add-to-cart']) && $_GET['add-to-cart']) : + + if ( !woocommerce::verify_nonce('add_to_cart', '_GET') ) : + + elseif (is_numeric($_GET['add-to-cart'])) : + + $quantity = 1; + if (isset($_POST['quantity'])) $quantity = $_POST['quantity']; + woocommerce_cart::add_to_cart($_GET['add-to-cart'], $quantity); + + woocommerce::add_message( sprintf(__('View Cart → Product successfully added to your basket.', 'woothemes'), woocommerce_cart::get_cart_url()) ); + + elseif ($_GET['add-to-cart']=='variation') : + + // Variation add to cart + if (isset($_POST['quantity']) && $_POST['quantity']) : + + $product_id = (int) $_GET['product']; + $quantity = ($_POST['quantity']) ? $_POST['quantity'] : 1; + $attributes = (array) maybe_unserialize( get_post_meta($product_id, 'product_attributes', true) ); + $variations = array(); + $all_variations_set = true; + $variation_id = 0; + + foreach ($attributes as $attribute) : + + if ( $attribute['variation']!=='yes' ) continue; + + if (isset($_POST[ 'tax_' . sanitize_title($attribute['name']) ]) && $_POST[ 'tax_' . sanitize_title($attribute['name']) ]) : + $variations['tax_' .sanitize_title($attribute['name'])] = $_POST[ 'tax_' . sanitize_title($attribute['name']) ]; + else : + $all_variations_set = false; + endif; + + endforeach; + + if (!$all_variations_set) : + woocommerce::add_error( __('Please choose product options…', 'woothemes') ); + else : + // Find matching variation + $variation_id = woocommerce_find_variation( $variations ); + + if ($variation_id>0) : + // Add to cart + woocommerce_cart::add_to_cart($product_id, $quantity, $variations, $variation_id); + woocommerce::add_message( sprintf(__('View Cart → Product successfully added to your basket.', 'woothemes'), woocommerce_cart::get_cart_url()) ); + else : + woocommerce::add_error( __('Sorry, this variation is not available.', 'woothemes') ); + endif; + endif; + + elseif ($_GET['product']) : + + /* Link on product pages */ + woocommerce::add_error( __('Please choose product options…', 'woothemes') ); + wp_redirect( get_permalink( $_GET['product'] ) ); + exit; + + endif; + + elseif ($_GET['add-to-cart']=='group') : + + // Group add to cart + if (isset($_POST['quantity']) && is_array($_POST['quantity'])) : + + $total_quantity = 0; + + foreach ($_POST['quantity'] as $item => $quantity) : + if ($quantity>0) : + woocommerce_cart::add_to_cart($item, $quantity); + woocommerce::add_message( sprintf(__('View Cart → Product successfully added to your basket.', 'woothemes'), woocommerce_cart::get_cart_url()) ); + $total_quantity = $total_quantity + $quantity; + endif; + endforeach; + + if ($total_quantity==0) : + woocommerce::add_error( __('Please choose a quantity…', 'woothemes') ); + endif; + + elseif ($_GET['product']) : + + /* Link on product pages */ + woocommerce::add_error( __('Please choose a product…', 'woothemes') ); + wp_redirect( get_permalink( $_GET['product'] ) ); + exit; + + endif; + + endif; + + $url = apply_filters('add_to_cart_redirect', $url); + + // If has custom URL redirect there + if ( $url ) { + wp_safe_redirect( $url ); + exit; + } + + // Otherwise redirect to where they came + else if ( isset($_SERVER['HTTP_REFERER'])) { + wp_safe_redirect($_SERVER['HTTP_REFERER']); + exit; + } + + // If all else fails redirect to root + else { + wp_safe_redirect('/'); + exit; + } + endif; + +} + +/** + * Clear cart + **/ +add_action( 'wp_header', 'woocommerce_clear_cart_on_return' ); + +function woocommerce_clear_cart_on_return() { + + if (is_page(get_option('woocommerce_thanks_page_id'))) : + + if (isset($_GET['order'])) $order_id = $_GET['order']; else $order_id = 0; + if (isset($_GET['key'])) $order_key = $_GET['key']; else $order_key = ''; + if ($order_id > 0) : + $order = &new woocommerce_order( $order_id ); + if ($order->order_key == $order_key) : + woocommerce_cart::empty_cart(); + endif; + endif; + + endif; + +} + +/** + * Clear the cart after payment - order will be processing or complete + **/ +add_action( 'init', 'woocommerce_clear_cart_after_payment' ); + +function woocommerce_clear_cart_after_payment( $url = false ) { + + if (isset($_SESSION['order_awaiting_payment']) && $_SESSION['order_awaiting_payment'] > 0) : + + $order = &new woocommerce_order($_SESSION['order_awaiting_payment']); + + if ($order->id > 0 && ($order->status=='completed' || $order->status=='processing')) : + + woocommerce_cart::empty_cart(); + + unset($_SESSION['order_awaiting_payment']); + + endif; + + endif; + +} + + +/** + * Process the login form + **/ +add_action('init', 'woocommerce_process_login'); + +function woocommerce_process_login() { + + if (isset($_POST['login']) && $_POST['login']) : + + woocommerce::verify_nonce('login'); + + if ( !isset($_POST['username']) || empty($_POST['username']) ) woocommerce::add_error( __('Username is required.', 'woothemes') ); + if ( !isset($_POST['password']) || empty($_POST['password']) ) woocommerce::add_error( __('Password is required.', 'woothemes') ); + + if (woocommerce::error_count()==0) : + + $creds = array(); + $creds['user_login'] = $_POST['username']; + $creds['user_password'] = $_POST['password']; + $creds['remember'] = true; + $secure_cookie = is_ssl() ? true : false; + $user = wp_signon( $creds, $secure_cookie ); + if ( is_wp_error($user) ) : + woocommerce::add_error( $user->get_error_message() ); + else : + if ( isset($_SERVER['HTTP_REFERER'])) { + wp_safe_redirect($_SERVER['HTTP_REFERER']); + exit; + } + wp_redirect(get_permalink(get_option('woocommerce_myaccount_page_id'))); + exit; + endif; + + endif; + + endif; +} + +/** + * Process ajax checkout form + */ +add_action('wp_ajax_woocommerce-checkout', 'woocommerce_process_checkout'); +add_action('wp_ajax_nopriv_woocommerce-checkout', 'woocommerce_process_checkout'); + +function woocommerce_process_checkout () { + include_once woocommerce::plugin_path() . '/classes/woocommerce_checkout.class.php'; + + woocommerce_checkout::instance()->process_checkout(); + + die(0); +} + + +/** + * Cancel a pending order - hook into init function + **/ +add_action('init', 'woocommerce_cancel_order'); + +function woocommerce_cancel_order() { + + if ( isset($_GET['cancel_order']) && isset($_GET['order']) && isset($_GET['order_id']) ) : + + $order_key = urldecode( $_GET['order'] ); + $order_id = (int) $_GET['order_id']; + + $order = &new woocommerce_order( $order_id ); + + if ($order->id == $order_id && $order->order_key == $order_key && $order->status=='pending' && woocommerce::verify_nonce('cancel_order', '_GET')) : + + // Cancel the order + restore stock + $order->cancel_order( __('Order cancelled by customer.', 'woothemes') ); + + // Message + woocommerce::add_message( __('Your order was cancelled.', 'woothemes') ); + + elseif ($order->status!='pending') : + + woocommerce::add_error( __('Your order is no longer pending and could not be cancelled. Please contact us if you need assistance.', 'woothemes') ); + + else : + + woocommerce::add_error( __('Invalid order.', 'woothemes') ); + + endif; + + wp_safe_redirect(woocommerce_cart::get_cart_url()); + exit; + + endif; +} + + +/** + * Download a file - hook into init function + **/ +add_action('init', 'woocommerce_download_product'); + +function woocommerce_download_product() { + + if ( isset($_GET['download_file']) && isset($_GET['order']) && isset($_GET['email']) ) : + + global $wpdb; + + $download_file = (int) urldecode($_GET['download_file']); + $order = urldecode( $_GET['order'] ); + $email = urldecode( $_GET['email'] ); + + if (!is_email($email)) wp_safe_redirect( home_url() ); + + $downloads_remaining = $wpdb->get_var( $wpdb->prepare(" + SELECT downloads_remaining + FROM ".$wpdb->prefix."woocommerce_downloadable_product_permissions + WHERE user_email = '$email' + AND order_key = '$order' + AND product_id = '$download_file' + ;") ); + + if ($downloads_remaining=='0') : + wp_die( sprintf(__('Sorry, you have reached your download limit for this file. Go to homepage →', 'woothemes'), home_url()) ); + else : + + if ($downloads_remaining>0) : + $wpdb->update( $wpdb->prefix . "woocommerce_downloadable_product_permissions", array( + 'downloads_remaining' => $downloads_remaining - 1, + ), array( + 'user_email' => $email, + 'order_key' => $order, + 'product_id' => $download_file + ), array( '%d' ), array( '%s', '%s', '%d' ) ); + endif; + + // Download the file + $file_path = ABSPATH . get_post_meta($download_file, 'file_path', true); + + $file_path = realpath($file_path); + + $file_extension = strtolower(substr(strrchr($file_path,"."),1)); + + switch ($file_extension) : + case "pdf": $ctype="application/pdf"; break; + case "exe": $ctype="application/octet-stream"; break; + case "zip": $ctype="application/zip"; break; + case "doc": $ctype="application/msword"; break; + case "xls": $ctype="application/vnd.ms-excel"; break; + case "ppt": $ctype="application/vnd.ms-powerpoint"; break; + case "gif": $ctype="image/gif"; break; + case "png": $ctype="image/png"; break; + case "jpe": case "jpeg": case "jpg": $ctype="image/jpg"; break; + default: $ctype="application/force-download"; + endswitch; + + if (!file_exists($file_path)) wp_die( sprintf(__('File not found. Go to homepage →', 'woothemes'), home_url()) ); + + @ini_set('zlib.output_compression', 'Off'); + @set_time_limit(0); + @session_start(); + @session_cache_limiter('none'); + @set_magic_quotes_runtime(0); + @ob_end_clean(); + @session_write_close(); + + header("Pragma: no-cache"); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Robots: none"); + header("Content-Type: ".$ctype.""); + header("Content-Description: File Transfer"); + + if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { + // workaround for IE filename bug with multiple periods / multiple dots in filename + $iefilename = preg_replace('/\./', '%2e', basename($file_path), substr_count(basename($file_path), '.') - 1); + header("Content-Disposition: attachment; filename=\"".$iefilename."\";"); + } else { + header("Content-Disposition: attachment; filename=\"".basename($file_path)."\";"); + } + + header("Content-Transfer-Encoding: binary"); + + header("Content-Length: ".@filesize($file_path)); + @readfile("$file_path") or wp_die( sprintf(__('File not found. Go to homepage →', 'woothemes'), home_url()) ); + exit; + + endif; + + endif; +} + + +/** + * Order Status completed - GIVE DOWNLOADABLE PRODUCT ACCESS TO CUSTOMER + **/ +add_action('order_status_completed', 'woocommerce_downloadable_product_permissions'); + +function woocommerce_downloadable_product_permissions( $order_id ) { + + global $wpdb; + + $order = &new woocommerce_order( $order_id ); + + if (sizeof($order->items)>0) foreach ($order->items as $item) : + + if ($item['id']>0) : + $_product = &new woocommerce_product( $item['id'] ); + + if ( $_product->exists && $_product->is_type('downloadable') ) : + + $user_email = $order->billing_email; + + if ($order->user_id>0) : + $user_info = get_userdata($order->user_id); + if ($user_info->user_email) : + $user_email = $user_info->user_email; + endif; + else : + $order->user_id = 0; + endif; + + $limit = trim(get_post_meta($_product->id, 'download_limit', true)); + + if (!empty($limit)) : + $limit = (int) $limit; + else : + $limit = ''; + endif; + + // Downloadable product - give access to the customer + $wpdb->insert( $wpdb->prefix . 'woocommerce_downloadable_product_permissions', array( + 'product_id' => $_product->id, + 'user_id' => $order->user_id, + 'user_email' => $user_email, + 'order_key' => $order->order_key, + 'downloads_remaining' => $limit + ), array( + '%s', + '%s', + '%s', + '%s', + '%s' + ) ); + + endif; + + endif; + + endforeach; +} \ No newline at end of file diff --git a/woocommerce_emails.php b/woocommerce_emails.php new file mode 100644 index 00000000000..f22be103011 --- /dev/null +++ b/woocommerce_emails.php @@ -0,0 +1,286 @@ +id); + + $message = __("You have received an order from ", 'woothemes') . $order->billing_first_name . ' ' . $order->billing_last_name . __(". Their order is as follows:", 'woothemes') . PHP_EOL . PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('ORDER #: ', 'woothemes') . $order->id . '' . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + $message .= $order->email_order_items_list( false, true ); + + if ($order->customer_note) : + $message .= PHP_EOL . __('Note:', 'woothemes') .$order->customer_note . PHP_EOL; + endif; + + $message .= PHP_EOL . __('Subtotal:', 'woothemes') . "\t\t\t" . $order->get_subtotal_to_display() . PHP_EOL; + if ($order->order_shipping > 0) $message .= __('Shipping:', 'woothemes') . "\t\t\t" . $order->get_shipping_to_display() . PHP_EOL; + if ($order->order_discount > 0) $message .= __('Discount:', 'woothemes') . "\t\t\t" . woocommerce_price($order->order_discount) . PHP_EOL; + if ($order->get_total_tax() > 0) $message .= __('Tax:', 'woothemes') . "\t\t\t\t\t" . woocommerce_price($order->get_total_tax()) . PHP_EOL; + $message .= __('Total:', 'woothemes') . "\t\t\t\t" . woocommerce_price($order->order_total) . ' - via ' . ucwords($order->payment_method) . PHP_EOL . PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('CUSTOMER DETAILS', 'woothemes') . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + if ($order->billing_email) $message .= __('Email:', 'woothemes') . "\t\t\t\t" . $order->billing_email . PHP_EOL; + if ($order->billing_phone) $message .= __('Tel:', 'woothemes') . "\t\t\t\t\t" . $order->billing_phone . PHP_EOL; + + $message .= PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('BILLING ADDRESS', 'woothemes') . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + $message .= $order->billing_first_name . ' ' . $order->billing_last_name . PHP_EOL; + if ($order->billing_company) $message .= $order->billing_company . PHP_EOL; + $message .= $order->formatted_billing_address . PHP_EOL . PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('SHIPPING ADDRESS', 'woothemes') . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + $message .= $order->shipping_first_name . ' ' . $order->shipping_last_name . PHP_EOL; + if ($order->shipping_company) $message .= $order->shipping_company . PHP_EOL; + $message .= $order->formatted_shipping_address . PHP_EOL . PHP_EOL; + + $message = html_entity_decode( strip_tags( $message ) ); + + wp_mail( get_option('admin_email'), $subject, $message ); +} + + +/** + * Processing order notification email template + **/ +add_action('order_status_pending_to_processing', 'woocommerce_processing_order_customer_notification'); +add_action('order_status_pending_to_on-hold', 'woocommerce_processing_order_customer_notification'); + +function woocommerce_processing_order_customer_notification( $order_id ) { + + $order = &new woocommerce_order( $order_id ); + + $subject = '[' . get_bloginfo('name') . '] ' . __('Order Received', 'woothemes'); + + $message = __("Thank you, we are now processing your order. Your order's details are below:", 'woothemes') . PHP_EOL . PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('ORDER #: ', 'woothemes') . $order->id . '' . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + $message .= $order->email_order_items_list(); + + if ($order->customer_note) : + $message .= PHP_EOL . __('Note:', 'woothemes') .$order->customer_note . PHP_EOL; + endif; + + $message .= PHP_EOL . __('Subtotal:', 'woothemes') . "\t\t\t" . $order->get_subtotal_to_display() . PHP_EOL; + if ($order->order_shipping > 0) $message .= __('Shipping:', 'woothemes') . "\t\t\t" . $order->get_shipping_to_display() . PHP_EOL; + if ($order->order_discount > 0) $message .= __('Discount:', 'woothemes') . "\t\t\t" . woocommerce_price($order->order_discount) . PHP_EOL; + if ($order->get_total_tax() > 0) $message .= __('Tax:', 'woothemes') . "\t\t\t\t\t" . woocommerce_price($order->get_total_tax()) . PHP_EOL; + $message .= __('Total:', 'woothemes') . "\t\t\t\t" . woocommerce_price($order->order_total) . ' - via ' . ucwords($order->payment_method) . PHP_EOL . PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('CUSTOMER DETAILS', 'woothemes') . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + if ($order->billing_email) $message .= __('Email:', 'woothemes') . "\t\t\t\t" . $order->billing_email . PHP_EOL; + if ($order->billing_phone) $message .= __('Tel:', 'woothemes') . "\t\t\t\t\t" . $order->billing_phone . PHP_EOL; + + $message .= PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('BILLING ADDRESS', 'woothemes') . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + $message .= $order->billing_first_name . ' ' . $order->billing_last_name . PHP_EOL; + if ($order->billing_company) $message .= $order->billing_company . PHP_EOL; + $message .= $order->formatted_billing_address . PHP_EOL . PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('SHIPPING ADDRESS', 'woothemes') . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + $message .= $order->shipping_first_name . ' ' . $order->shipping_last_name . PHP_EOL; + if ($order->shipping_company) $message .= $order->shipping_company . PHP_EOL; + $message .= $order->formatted_shipping_address . PHP_EOL . PHP_EOL; + + $message = html_entity_decode( strip_tags( $message ) ); + + wp_mail( $order->billing_email, $subject, $message ); +} + + +/** + * Completed order notification email template - this one includes download links for downloadable products + **/ +add_action('order_status_completed', 'woocommerce_completed_order_customer_notification'); + +function woocommerce_completed_order_customer_notification( $order_id ) { + + $order = &new woocommerce_order( $order_id ); + + $subject = '[' . get_bloginfo('name') . '] ' . __('Order Complete', 'woothemes'); + + $message = __("Your order is complete. Your order's details are below:", 'woothemes') . PHP_EOL . PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('ORDER #: ', 'woothemes') . $order->id . '' . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + $message .= $order->email_order_items_list( true ); + + if ($order->customer_note) : + $message .= PHP_EOL . __('Note:', 'woothemes') .$order->customer_note . PHP_EOL; + endif; + + $message .= PHP_EOL . __('Subtotal:', 'woothemes') . "\t\t\t" . $order->get_subtotal_to_display() . PHP_EOL; + if ($order->order_shipping > 0) $message .= __('Shipping:', 'woothemes') . "\t\t\t" . $order->get_shipping_to_display() . PHP_EOL; + if ($order->order_discount > 0) $message .= __('Discount:', 'woothemes') . "\t\t\t" . woocommerce_price($order->order_discount) . PHP_EOL; + if ($order->get_total_tax() > 0) $message .= __('Tax:', 'woothemes') . "\t\t\t\t\t" . woocommerce_price($order->get_total_tax()) . PHP_EOL; + $message .= __('Total:', 'woothemes') . "\t\t\t\t" . woocommerce_price($order->order_total) . ' - via ' . ucwords($order->payment_method) . PHP_EOL . PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('CUSTOMER DETAILS', 'woothemes') . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + if ($order->billing_email) $message .= __('Email:', 'woothemes') . "\t\t\t\t" . $order->billing_email . PHP_EOL; + if ($order->billing_phone) $message .= __('Tel:', 'woothemes') . "\t\t\t\t\t" . $order->billing_phone . PHP_EOL; + + $message .= PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('BILLING ADDRESS', 'woothemes') . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + $message .= $order->billing_first_name . ' ' . $order->billing_last_name . PHP_EOL; + if ($order->billing_company) $message .= $order->billing_company . PHP_EOL; + $message .= $order->formatted_billing_address . PHP_EOL . PHP_EOL; + + $message .= '=====================================================================' . PHP_EOL; + $message .= __('SHIPPING ADDRESS', 'woothemes') . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + $message .= $order->shipping_first_name . ' ' . $order->shipping_last_name . PHP_EOL; + if ($order->shipping_company) $message .= $order->shipping_company . PHP_EOL; + $message .= $order->formatted_shipping_address . PHP_EOL . PHP_EOL; + + $message = html_entity_decode( strip_tags( $message ) ); + + wp_mail( $order->billing_email, $subject, $message ); +} + + +/** + * Pay for order notification email template - this one includes a payment link + **/ +function woocommerce_pay_for_order_customer_notification( $order_id ) { + + $order = &new woocommerce_order( $order_id ); + + $subject = '[' . get_bloginfo('name') . '] ' . __('Pay for Order', 'woothemes'); + + $customer_message = sprintf( __("An order has been created for you on “%s”. To pay for this order please use the following link: %s", 'woothemes') . PHP_EOL . PHP_EOL, get_bloginfo('name'), $order->get_checkout_payment_url() ); + + $message = '=====================================================================' . PHP_EOL; + $message .= __('ORDER #: ', 'woothemes') . $order->id . '' . PHP_EOL; + $message .= '=====================================================================' . PHP_EOL; + + $message .= $order->email_order_items_list(); + + if ($order->customer_note) : + $message .= PHP_EOL . __('Note:', 'woothemes') .$order->customer_note . PHP_EOL; + endif; + + $message .= PHP_EOL . __('Subtotal:', 'woothemes') . "\t\t\t" . $order->get_subtotal_to_display() . PHP_EOL; + if ($order->order_shipping > 0) $message .= __('Shipping:', 'woothemes') . "\t\t\t" . $order->get_shipping_to_display() . PHP_EOL; + if ($order->order_discount > 0) $message .= __('Discount:', 'woothemes') . "\t\t\t" . woocommerce_price($order->order_discount) . PHP_EOL; + if ($order->get_total_tax() > 0) $message .= __('Tax:', 'woothemes') . "\t\t\t\t\t" . woocommerce_price($order->get_total_tax()) . PHP_EOL; + $message .= __('Total:', 'woothemes') . "\t\t\t\t" . woocommerce_price($order->order_total) . ' - via ' . ucwords($order->payment_method) . PHP_EOL . PHP_EOL; + + $customer_message = html_entity_decode( strip_tags( $customer_message.$message ) ); + + wp_mail( $order->billing_email, $subject, $customer_message ); +} + + +/** + * Low stock notification email + **/ +function woocommerce_low_stock_notification( $product ) { + $_product = &new woocommerce_product($product); + $subject = '[' . get_bloginfo('name') . '] ' . __('Product low in stock', 'woothemes'); + $message = '#' . $_product->id .' '. $_product->get_title() . ' ('. $_product->sku.') ' . __('is low in stock.', 'woothemes'); + $message = wordwrap( html_entity_decode( strip_tags( $message ) ), 70 ); + wp_mail( get_option('admin_email'), $subject, $message ); +} + + +/** + * No stock notification email + **/ +function woocommerce_no_stock_notification( $product ) { + $_product = &new woocommerce_product($product); + $subject = '[' . get_bloginfo('name') . '] ' . __('Product out of stock', 'woothemes'); + $message = '#' . $_product->id .' '. $_product->get_title() . ' ('. $_product->sku.') ' . __('is out of stock.', 'woothemes'); + $message = wordwrap( html_entity_decode( strip_tags( $message ) ), 70 ); + wp_mail( get_option('admin_email'), $subject, $message ); +} + + +/** + * Backorder notification email + **/ +function woocommerce_product_on_backorder_notification( $product, $amount ) { + $_product = &new woocommerce_product($product); + $subject = '[' . get_bloginfo('name') . '] ' . __('Product Backorder', 'woothemes'); + $message = $amount . __(' units of #', 'woothemes') . $_product->id .' '. $_product->get_title() . ' ('. $_product->sku.') ' . __('have been backordered.', 'woothemes'); + $message = wordwrap( html_entity_decode( strip_tags( $message ) ), 70 ); + wp_mail( get_option('admin_email'), $subject, $message ); +} \ No newline at end of file diff --git a/woocommerce_query.php b/woocommerce_query.php new file mode 100644 index 00000000000..c6bd11f3e59 --- /dev/null +++ b/woocommerce_query.php @@ -0,0 +1,288 @@ + $value) : + + if (!strstr($key, 'tax_')) continue; + + $variation_query[] = array( + 'key' => $key, + 'value' => array( $value ), + 'compare' => 'IN' + ); + + endforeach; + + // do the query + $args = array( + 'post_type' => 'product_variation', + 'orderby' => 'id', + 'order' => 'desc', + 'posts_per_page' => 1, + 'meta_query' => $variation_query + ); + $posts = get_posts( $args ); + + if (!$posts) : + + // Wildcard search + $variation_query = array(); + foreach ($variation_data as $key => $value) : + + if (!strstr($key, 'tax_')) continue; + + $variation_query[] = array( + 'key' => $key, + 'value' => array( $value, '' ), + 'compare' => 'IN' + ); + + endforeach; + $args['meta_query'] = $variation_query; + + $posts = get_posts( $args ); + + endif; + + if (!$posts) return false; + + return $posts[0]->ID; + +} + +/** + * Get unfiltered list of posts in current view for use in loop + widgets + */ +function woocommerce_get_products_in_view() { + + global $all_post_ids; + + $all_post_ids = array(); + + if (is_tax( 'product_cat' ) || is_post_type_archive('product') || is_page( get_option('woocommerce_shop_page_id') ) || is_tax( 'product_tag' )) : + + $all_post_ids = woocommerce_get_post_ids(); + + endif; + + $all_post_ids[] = 0; + +} + +add_action('wp_head', 'woocommerce_get_products_in_view', 0); + +/** + * Do Filters/Layered Nav + */ +function woocommerce_filter_loop() { + + global $wp_query, $all_post_ids; + + if (is_tax( 'product_cat' ) || is_post_type_archive('product') || is_page( get_option('woocommerce_shop_page_id') ) || is_tax( 'product_tag' )) : + + $filters = array(); + $filters = apply_filters('loop-shop-query', $filters); + + //$post_ids = woocommerce_get_post_ids(); + $post_ids = $all_post_ids; + $post_ids = apply_filters('loop-shop-posts-in', $post_ids); + $filters = array_merge($filters, array( + 'post__in' => $post_ids + )); + + $args = array_merge( $wp_query->query, $filters ); + + query_posts( $args ); + endif; +} + +add_action('wp_head', 'woocommerce_filter_loop'); + +/** + * Layered Nav Init + */ +function woocommerce_layered_nav_init() { + + global $_chosen_attributes, $wpdb; + + $attribute_taxonomies = woocommerce::$attribute_taxonomies; + if ( $attribute_taxonomies ) : + foreach ($attribute_taxonomies as $tax) : + + $attribute = strtolower(sanitize_title($tax->attribute_name)); + $taxonomy = 'product_attribute_' . $attribute; + $name = 'filter_' . $attribute; + + if (isset($_GET[$name]) && taxonomy_exists($taxonomy)) $_chosen_attributes[$taxonomy] = explode(',', $_GET[$name] ); + + endforeach; + endif; + +} +add_action('init', 'woocommerce_layered_nav_init', 1); + +/** + * Get post ID's to filter from + */ +function woocommerce_get_post_ids() { + + global $wpdb; + + $in = array('visible'); + if (is_search()) $in[] = 'search'; + if (!is_search()) $in[] = 'catalog'; + + // WP Query to get all queried post ids + + global $wp_query; + + $args = array_merge( + $wp_query->query, + array( + 'page_id' => '', + 'posts_per_page' => -1, + 'post_type' => 'product', + 'post_status' => 'publish', + 'meta_query' => array( + array( + 'key' => 'visibility', + 'value' => $in, + 'compare' => 'IN' + ) + ) + ) + ); + $custom_query = new WP_Query( $args ); + + $queried_post_ids = array(); + + foreach ($custom_query->posts as $p) $queried_post_ids[] = $p->ID; + + wp_reset_query(); + + return $queried_post_ids; +} + +/** + * Layered Nav + */ +function woocommerce_layered_nav_query( $filtered_posts ) { + + global $_chosen_attributes, $wpdb; + + if (sizeof($_chosen_attributes)>0) : + + $matched_products = array(); + $filtered = false; + + foreach ($_chosen_attributes as $attribute => $values) : + if (sizeof($values)>0) : + foreach ($values as $value) : + + $posts = get_objects_in_term( $value, $attribute ); + if (!is_wp_error($posts) && (sizeof($matched_products)>0 || $filtered)) : + $matched_products = array_intersect($posts, $matched_products); + elseif (!is_wp_error($posts)) : + $matched_products = $posts; + endif; + + $filtered = true; + + endforeach; + endif; + endforeach; + + if ($filtered) : + $matched_products[] = 0; + $filtered_posts = array_intersect($filtered_posts, $matched_products); + endif; + + endif; + + return $filtered_posts; +} + +add_filter('loop-shop-posts-in', 'woocommerce_layered_nav_query'); + + +/** + * Price Filtering + */ +function woocommerce_price_filter( $filtered_posts ) { + + if (isset($_GET['max_price']) && isset($_GET['min_price'])) : + + $matched_products = array( 0 ); + + $matched_products_query = get_posts(array( + 'post_type' => 'product', + 'post_status' => 'publish', + 'posts_per_page' => -1, + 'meta_query' => array( + array( + 'key' => 'price', + 'value' => array( $_GET['min_price'], $_GET['max_price'] ), + 'type' => 'NUMERIC', + 'compare' => 'BETWEEN' + ) + ), + 'tax_query' => array( + array( + 'taxonomy' => 'product_type', + 'field' => 'slug', + 'terms' => 'grouped', + 'operator' => 'NOT IN' + ) + ) + )); + + if ($matched_products_query) : + + foreach ($matched_products_query as $product) : + $matched_products[] = $product->ID; + endforeach; + + endif; + + // Get grouped product ids + $grouped_products = get_objects_in_term( get_term_by('slug', 'grouped', 'product_type')->term_id, 'product_type' ); + + if ($grouped_products) foreach ($grouped_products as $grouped_product) : + + $children = get_children( 'post_parent='.$grouped_product.'&post_type=product' ); + + if ($children) foreach ($children as $product) : + $price = get_post_meta( $product->ID, 'price', true); + + if ($price<=$_GET['max_price'] && $price>=$_GET['min_price']) : + + $matched_products[] = $grouped_product; + + break; + + endif; + endforeach; + + endforeach; + + $filtered_posts = array_intersect($matched_products, $filtered_posts); + + endif; + + return $filtered_posts; +} + +add_filter('loop-shop-posts-in', 'woocommerce_price_filter'); \ No newline at end of file diff --git a/woocommerce_taxonomy.php b/woocommerce_taxonomy.php new file mode 100644 index 00000000000..a248b01f662 --- /dev/null +++ b/woocommerce_taxonomy.php @@ -0,0 +1,419 @@ + true, + 'update_count_callback' => '_update_post_term_count', + 'labels' => array( + 'name' => __( 'Product Categories', 'woothemes'), + 'singular_name' => __( 'Product Category', 'woothemes'), + 'search_items' => __( 'Search Product Categories', 'woothemes'), + 'all_items' => __( 'All Product Categories', 'woothemes'), + 'parent_item' => __( 'Parent Product Category', 'woothemes'), + 'parent_item_colon' => __( 'Parent Product Category:', 'woothemes'), + 'edit_item' => __( 'Edit Product Category', 'woothemes'), + 'update_item' => __( 'Update Product Category', 'woothemes'), + 'add_new_item' => __( 'Add New Product Category', 'woothemes'), + 'new_item_name' => __( 'New Product Category Name', 'woothemes') + ), + 'show_ui' => true, + 'query_var' => true, + 'rewrite' => array( 'slug' => $category_base . _x('product-category', 'slug', 'woothemes'), 'with_front' => false ), + ) + ); + + register_taxonomy( 'product_tag', + array('product'), + array( + 'hierarchical' => false, + 'labels' => array( + 'name' => __( 'Product Tags', 'woothemes'), + 'singular_name' => __( 'Product Tag', 'woothemes'), + 'search_items' => __( 'Search Product Tags', 'woothemes'), + 'all_items' => __( 'All Product Tags', 'woothemes'), + 'parent_item' => __( 'Parent Product Tag', 'woothemes'), + 'parent_item_colon' => __( 'Parent Product Tag:', 'woothemes'), + 'edit_item' => __( 'Edit Product Tag', 'woothemes'), + 'update_item' => __( 'Update Product Tag', 'woothemes'), + 'add_new_item' => __( 'Add New Product Tag', 'woothemes'), + 'new_item_name' => __( 'New Product Tag Name', 'woothemes') + ), + 'show_ui' => true, + 'query_var' => true, + 'rewrite' => array( 'slug' => $category_base . _x('product-tag', 'slug', 'woothemes'), 'with_front' => false ), + ) + ); + + $attribute_taxonomies = woocommerce::$attribute_taxonomies; + if ( $attribute_taxonomies ) : + foreach ($attribute_taxonomies as $tax) : + + $name = 'product_attribute_'.strtolower(sanitize_title($tax->attribute_name)); + $hierarchical = true; + if ($name) : + + register_taxonomy( $name, + array('product'), + array( + 'hierarchical' => $hierarchical, + 'labels' => array( + 'name' => $tax->attribute_name, + 'singular_name' =>$tax->attribute_name, + 'search_items' => __( 'Search ', 'woothemes') . $tax->attribute_name, + 'all_items' => __( 'All ', 'woothemes') . $tax->attribute_name, + 'parent_item' => __( 'Parent ', 'woothemes') . $tax->attribute_name, + 'parent_item_colon' => __( 'Parent ', 'woothemes') . $tax->attribute_name . ':', + 'edit_item' => __( 'Edit ', 'woothemes') . $tax->attribute_name, + 'update_item' => __( 'Update ', 'woothemes') . $tax->attribute_name, + 'add_new_item' => __( 'Add New ', 'woothemes') . $tax->attribute_name, + 'new_item_name' => __( 'New ', 'woothemes') . $tax->attribute_name + ), + 'show_ui' => false, + 'query_var' => true, + 'show_in_nav_menus' => false, + 'rewrite' => array( 'slug' => $category_base . strtolower(sanitize_title($tax->attribute_name)), 'with_front' => false, 'hierarchical' => $hierarchical ), + ) + ); + + endif; + endforeach; + endif; + + register_post_type( "product", + array( + 'labels' => array( + 'name' => __( 'Products', 'woothemes' ), + 'singular_name' => __( 'Product', 'woothemes' ), + 'add_new' => __( 'Add Product', 'woothemes' ), + 'add_new_item' => __( 'Add New Product', 'woothemes' ), + 'edit' => __( 'Edit', 'woothemes' ), + 'edit_item' => __( 'Edit Product', 'woothemes' ), + 'new_item' => __( 'New Product', 'woothemes' ), + 'view' => __( 'View Product', 'woothemes' ), + 'view_item' => __( 'View Product', 'woothemes' ), + 'search_items' => __( 'Search Products', 'woothemes' ), + 'not_found' => __( 'No Products found', 'woothemes' ), + 'not_found_in_trash' => __( 'No Products found in trash', 'woothemes' ), + 'parent' => __( 'Parent Product', 'woothemes' ) + ), + 'description' => __( 'This is where you can add new products to your store.', 'woothemes' ), + 'public' => true, + 'show_ui' => true, + 'capability_type' => 'post', + 'publicly_queryable' => true, + 'exclude_from_search' => false, + 'menu_position' => 57, + 'hierarchical' => true, + 'rewrite' => array( 'slug' => $base_slug, 'with_front' => false ), + 'query_var' => true, + 'supports' => array( 'title', 'editor', 'thumbnail', 'comments'/*, 'page-attributes'*/ ), + 'has_archive' => $base_slug, + 'show_in_nav_menus' => false, + ) + ); + + register_post_type( "product_variation", + array( + 'labels' => array( + 'name' => __( 'Variations', 'woothemes' ), + 'singular_name' => __( 'Variation', 'woothemes' ), + 'add_new' => __( 'Add Variation', 'woothemes' ), + 'add_new_item' => __( 'Add New Variation', 'woothemes' ), + 'edit' => __( 'Edit', 'woothemes' ), + 'edit_item' => __( 'Edit Variation', 'woothemes' ), + 'new_item' => __( 'New Variation', 'woothemes' ), + 'view' => __( 'View Variation', 'woothemes' ), + 'view_item' => __( 'View Variation', 'woothemes' ), + 'search_items' => __( 'Search Variations', 'woothemes' ), + 'not_found' => __( 'No Variations found', 'woothemes' ), + 'not_found_in_trash' => __( 'No Variations found in trash', 'woothemes' ), + 'parent' => __( 'Parent Variation', 'woothemes' ) + ), + 'public' => true, + 'show_ui' => true, + 'capability_type' => 'post', + 'publicly_queryable' => true, + 'exclude_from_search' => true, + 'hierarchical' => false, + 'rewrite' => false, + 'query_var' => true, + 'supports' => array( 'title', 'editor', 'custom-fields' ), + 'show_in_nav_menus' => false, + 'show_in_menu' => 'edit.php?post_type=product' + ) + ); + + register_taxonomy( 'product_type', + array('product'), + array( + 'hierarchical' => false, + 'show_ui' => false, + 'query_var' => true, + 'show_in_nav_menus' => false, + ) + ); + + register_post_type( "shop_order", + array( + 'labels' => array( + 'name' => __( 'Orders', 'woothemes' ), + 'singular_name' => __( 'Order', 'woothemes' ), + 'add_new' => __( 'Add Order', 'woothemes' ), + 'add_new_item' => __( 'Add New Order', 'woothemes' ), + 'edit' => __( 'Edit', 'woothemes' ), + 'edit_item' => __( 'Edit Order', 'woothemes' ), + 'new_item' => __( 'New Order', 'woothemes' ), + 'view' => __( 'View Order', 'woothemes' ), + 'view_item' => __( 'View Order', 'woothemes' ), + 'search_items' => __( 'Search Orders', 'woothemes' ), + 'not_found' => __( 'No Orders found', 'woothemes' ), + 'not_found_in_trash' => __( 'No Orders found in trash', 'woothemes' ), + 'parent' => __( 'Parent Orders', 'woothemes' ) + ), + 'description' => __( 'This is where store orders are stored.', 'woothemes' ), + 'public' => true, + 'show_ui' => true, + 'capability_type' => 'post', + 'publicly_queryable' => false, + 'exclude_from_search' => true, + 'menu_position' => 58, + 'hierarchical' => false, + 'show_in_nav_menus' => false, + 'rewrite' => false, + 'query_var' => true, + 'supports' => array( 'title', 'comments' ), + 'has_archive' => false + ) + ); + + register_taxonomy( 'shop_order_status', + array('shop_order'), + array( + 'hierarchical' => true, + 'update_count_callback' => '_update_post_term_count', + 'labels' => array( + 'name' => __( 'Order statuses', 'woothemes'), + 'singular_name' => __( 'Order status', 'woothemes'), + 'search_items' => __( 'Search Order statuses', 'woothemes'), + 'all_items' => __( 'All Order statuses', 'woothemes'), + 'parent_item' => __( 'Parent Order status', 'woothemes'), + 'parent_item_colon' => __( 'Parent Order status:', 'woothemes'), + 'edit_item' => __( 'Edit Order status', 'woothemes'), + 'update_item' => __( 'Update Order status', 'woothemes'), + 'add_new_item' => __( 'Add New Order status', 'woothemes'), + 'new_item_name' => __( 'New Order status Name', 'woothemes') + ), + 'show_ui' => false, + 'show_in_nav_menus' => false, + 'query_var' => true, + 'rewrite' => false, + ) + ); + + if (get_option('woocommerce_update_rewrite_rules')=='1') : + // Re-generate rewrite rules + global $wp_rewrite; + $wp_rewrite->flush_rules(); + update_option('woocommerce_update_rewrite_rules', '0'); + endif; + +} + +/** + * Categories ordering + */ + +/** + * Add a table to $wpdb to benefit from wordpress meta api + */ +function taxonomy_metadata_wpdbfix() { + global $wpdb; + $wpdb->woocommerce_termmeta = "{$wpdb->prefix}woocommerce_termmeta"; +} +add_action('init','taxonomy_metadata_wpdbfix'); +add_action('switch_blog','taxonomy_metadata_wpdbfix'); + +/** + * Add product_cat ordering to get_terms + * + * It enables the support a 'menu_order' parameter to get_terms for the product_cat taxonomy. + * By default it is 'ASC'. It accepts 'DESC' too + * + * To disable it, set it ot false (or 0) + * + */ +function woocommerce_terms_clauses($clauses, $taxonomies, $args ) { + global $wpdb; + + // wordpress should give us the taxonomies asked when calling the get_terms function + if( !in_array('product_cat', (array)$taxonomies) ) return $clauses; + + // query order + if( isset($args['menu_order']) && !$args['menu_order']) return $clauses; // menu_order is false so we do not add order clause + + // query fields + if( strpos('COUNT(*)', $clauses['fields']) === false ) $clauses['fields'] .= ', tm.* '; + + //query join + $clauses['join'] .= " LEFT JOIN {$wpdb->woocommerce_termmeta} AS tm ON (t.term_id = tm.woocommerce_term_id AND tm.meta_key = 'order') "; + + // default to ASC + if( ! isset($args['menu_order']) || ! in_array( strtoupper($args['menu_order']), array('ASC', 'DESC')) ) $args['menu_order'] = 'ASC'; + + $order = "ORDER BY CAST(tm.meta_value AS SIGNED) " . $args['menu_order']; + + if ( $clauses['orderby'] ): + $clauses['orderby'] = str_replace ('ORDER BY', $order . ',', $clauses['orderby'] ); + else: + $clauses['orderby'] = $order; + endif; + + return $clauses; +} +add_filter( 'terms_clauses', 'woocommerce_terms_clauses', 10, 3); + +/** + * Reorder on category insertion + * + * @param int $term_id + */ +function woocommerce_create_product_cat ($term_id) { + + $next_id = null; + + $term = get_term($term_id, 'product_cat'); + + // gets the sibling terms + $siblings = get_terms('product_cat', "parent={$term->parent}&menu_order=ASC&hide_empty=0"); + + foreach ($siblings as $sibling) { + if( $sibling->term_id == $term_id ) continue; + $next_id = $sibling->term_id; // first sibling term of the hierachy level + break; + } + + // reorder + woocommerce_order_categories ( $term, $next_id ); + +} +add_action("create_product_cat", 'woocommerce_create_product_cat'); + +/** + * Delete terms metas on deletion + * + * @param int $term_id + */ +function woocommerce_delete_product_cat($term_id) { + + $term_id = (int) $term_id; + + if(!$term_id) return; + + global $wpdb; + $wpdb->query("DELETE FROM {$wpdb->woocommerce_termmeta} WHERE `woocommerce_term_id` = " . $term_id); + +} +add_action("delete_product_cat", 'woocommerce_delete_product_cat'); + +/** + * Move a category before the a given element of its hierarchy level + * + * @param object $the_term + * @param int $next_id the id of the next slibling element in save hierachy level + * @param int $index + * @param int $terms + */ +function woocommerce_order_categories ( $the_term, $next_id, $index=0, $terms=null ) { + + if( ! $terms ) $terms = get_terms('product_cat', 'menu_order=ASC&hide_empty=0&parent=0'); + if( empty( $terms ) ) return $index; + + $id = $the_term->term_id; + + $term_in_level = false; // flag: is our term to order in this level of terms + + foreach ($terms as $term) { + + if( $term->term_id == $id ) { // our term to order, we skip + $term_in_level = true; + continue; // our term to order, we skip + } + // the nextid of our term to order, lets move our term here + if(null !== $next_id && $term->term_id == $next_id) { + $index++; + $index = woocommerce_set_category_order($id, $index, true); + } + + // set order + $index++; + $index = woocommerce_set_category_order($term->term_id, $index); + + // if that term has children we walk through them + $children = get_terms('product_cat', "parent={$term->term_id}&menu_order=ASC&hide_empty=0"); + if( !empty($children) ) { + $index = woocommerce_order_categories ( $the_term, $next_id, $index, $children ); + } + } + + // no nextid meaning our term is in last position + if( $term_in_level && null === $next_id ) + $index = woocommerce_set_category_order($id, $index+1, true); + + return $index; + +} + +/** + * Set the sort order of a category + * + * @param int $term_id + * @param int $index + * @param bool $recursive + */ +function woocommerce_set_category_order ($term_id, $index, $recursive=false) { + global $wpdb; + + $term_id = (int) $term_id; + $index = (int) $index; + + update_metadata('woocommerce_term', $term_id, 'order', $index); + + if( ! $recursive ) return $index; + + $children = get_terms('product_cat', "parent=$term_id&menu_order=ASC&hide_empty=0"); + + foreach ( $children as $term ) { + $index ++; + $index = woocommerce_set_category_order ($term->term_id, $index, true); + } + + return $index; + +} diff --git a/woocommerce_template_actions.php b/woocommerce_template_actions.php new file mode 100644 index 00000000000..fa88b34e6a7 --- /dev/null +++ b/woocommerce_template_actions.php @@ -0,0 +1,84 @@ + '', 'post_type' => 'product', 'paged' => $paged ) ); + + define('SHOP_IS_ON_FRONT', true); + + endif; + } +} +add_action('wp_head', 'woocommerce_front_page_archive', 0); + + +/** + * Content Wrappers + **/ +if (!function_exists('woocommerce_output_content_wrapper')) { + function woocommerce_output_content_wrapper() { + if( get_option('template') === 'twentyeleven' ) echo '
    '; + else echo '
    '; + } +} +if (!function_exists('woocommerce_output_content_wrapper_end')) { + function woocommerce_output_content_wrapper_end() { + if( get_option('template') === 'twentyeleven' ) echo '
  • '; + else echo '
    '; + } +} + +/** + * Sale Flash + **/ +if (!function_exists('woocommerce_show_product_sale_flash')) { + function woocommerce_show_product_sale_flash( $post, $_product ) { + if ($_product->is_on_sale()) echo ''.__('Sale!', 'woothemes').''; + } +} + +/** + * Sidebar + **/ +if (!function_exists('woocommerce_get_sidebar')) { + function woocommerce_get_sidebar() { + get_sidebar('shop'); + } +} + +/** + * Products Loop + **/ +if (!function_exists('woocommerce_template_loop_add_to_cart')) { + function woocommerce_template_loop_add_to_cart( $post, $_product ) { + ?>get_price_html(); ?>is_visible() && $post->post_parent > 0) : wp_safe_redirect(get_permalink($post->post_parent)); exit; endif; + if (!$_product->is_visible()) : wp_safe_redirect(home_url()); exit; endif; + } +} + +/** + * Before Single Products Summary Div + **/ +if (!function_exists('woocommerce_show_product_images')) { + function woocommerce_show_product_images() { + + global $_product, $post; + + echo '
    '; + + $thumb_id = 0; + if (has_post_thumbnail()) : + $thumb_id = get_post_thumbnail_id(); + $large_thumbnail_size = apply_filters('single_product_large_thumbnail_size', 'shop_large'); + echo ''; + the_post_thumbnail($large_thumbnail_size); + echo ''; + else : + echo 'Placeholder'; + endif; + + do_action('woocommerce_product_thumbnails'); + + echo '
    '; + + } +} +if (!function_exists('woocommerce_show_product_thumbnails')) { + function woocommerce_show_product_thumbnails() { + + global $_product, $post; + + echo '
    '; + + $thumb_id = get_post_thumbnail_id(); + $small_thumbnail_size = apply_filters('single_product_small_thumbnail_size', 'shop_thumbnail'); + $args = array( 'post_type' => 'attachment', 'numberposts' => -1, 'post_status' => null, 'post_parent' => $post->ID ); + $attachments = get_posts($args); + if ($attachments) : + $loop = 0; + $columns = 3; + foreach ( $attachments as $attachment ) : + + if ($thumb_id==$attachment->ID) continue; + + $loop++; + + $_post = & get_post( $attachment->ID ); + $url = wp_get_attachment_url($_post->ID); + $post_title = esc_attr($_post->post_title); + $image = wp_get_attachment_image($attachment->ID, $small_thumbnail_size); + + echo ''.$image.''; + + endforeach; + endif; + wp_reset_query(); + + echo '
    '; + + } +} + +/** + * After Single Products Summary Div + **/ +if (!function_exists('woocommerce_output_product_data_tabs')) { + function woocommerce_output_product_data_tabs() { + + if (isset($_COOKIE["current_tab"])) $current_tab = $_COOKIE["current_tab"]; else $current_tab = '#tab-description'; + + ?> +
    +
      + + + +
    + + + +
    +

    get_price_html(); ?>

    post_excerpt) echo wpautop(wptexturize($post->post_excerpt)); + } +} + +if (!function_exists('woocommerce_template_single_meta')) { + function woocommerce_template_single_meta( $post, $_product ) { + + ?> +
    is_type('simple') && get_option('woocommerce_enable_sku')=='yes') : ?>SKU: sku; ?>.get_categories( ', ', ' Posted in ', '.'); ?>get_tags( ', ', ' Tagged as ', '.'); ?>
    + + + +
    '; + endif; + + } +} + +/** + * Product Add to cart buttons + **/ +if (!function_exists('woocommerce_template_single_add_to_cart')) { + function woocommerce_template_single_add_to_cart( $post, $_product ) { + do_action( $_product->product_type . '_add_to_cart' ); + } +} +if (!function_exists('woocommerce_simple_add_to_cart')) { + function woocommerce_simple_add_to_cart() { + + global $_product; $availability = $_product->get_availability(); + + if ($availability['availability']) : ?>

    +
    +
    + + +
    + get_availability(); + + if ($availability['availability']) : ?>

    +
    + + +
    + +
    + + + children as $child) : $child_product = &new woocommerce_product( $child->ID ); $cavailability = $child_product->get_availability(); ?> + + + + + + + +
    get_price_html(); ?>
    + + +
    + ID, 'product_attributes', true) ); + if (!isset($attributes)) $attributes = array(); + + ?> +
    + + + + '; + + endforeach; + ?> + +
    +
    + + +
    + max_num_pages > 1 ) : + ?> + + +
  • >
  • + has_attributes()) : ?>
  • >
  • >
  • '; + echo '

    ' . apply_filters('woocommerce_product_description_heading', __('Product Description', 'woothemes')) . '

    '; + the_content(); + echo '
    '; + } +} +if (!function_exists('woocommerce_product_attributes_panel')) { + function woocommerce_product_attributes_panel() { + global $_product; + echo '
    '; + echo '

    ' . apply_filters('woocommerce_product_description_heading', __('Additional Information', 'woothemes')) . '

    '; + $_product->list_attributes(); + echo '
    '; + } +} +if (!function_exists('woocommerce_product_reviews_panel')) { + function woocommerce_product_reviews_panel() { + echo '
    '; + comments_template(); + echo '
    '; + } +} + + + +/** + * WooCommerce Product Thumbnail + **/ +if (!function_exists('woocommerce_get_product_thumbnail')) { + function woocommerce_get_product_thumbnail( $size = 'shop_small', $placeholder_width = 0, $placeholder_height = 0 ) { + + global $post; + + if (!$placeholder_width) $placeholder_width = woocommerce::get_var('shop_small_w'); + if (!$placeholder_height) $placeholder_height = woocommerce::get_var('shop_small_h'); + + if ( has_post_thumbnail() ) return get_the_post_thumbnail($post->ID, $size); else return 'Placeholder'; + + } +} + +/** + * WooCommerce Related Products + **/ +if (!function_exists('woocommerce_output_related_products')) { + function woocommerce_output_related_products() { + // 4 Related Products in 4 columns + woocommerce_related_products( 2, 2 ); + } +} + +if (!function_exists('woocommerce_related_products')) { + function woocommerce_related_products( $posts_per_page = 4, $post_columns = 4, $orderby = 'rand' ) { + + global $_product, $columns, $per_page; + + // Pass vars to loop + $per_page = $posts_per_page; + $columns = $post_columns; + + $related = $_product->get_related(); + if (sizeof($related)>0) : + echo ''; + endif; + wp_reset_query(); + + } +} + +/** + * WooCommerce Shipping Calculator + **/ +if (!function_exists('woocommerce_shipping_calculator')) { + function woocommerce_shipping_calculator() { + if (woocommerce_shipping::$enabled && get_option('woocommerce_enable_shipping_calc')=='yes' && woocommerce_cart::needs_shipping()) : + ?> +
    +

    +
    +

    + +

    +
    +

    + + + + + + + +

    +

    + +

    +
    +

    + +
    +
    + + +

    ', $wrap_after = '
    ', $before = '', $after = '', $home = null ) { + + global $post, $wp_query, $author, $paged; + + if( !$home ) $home = _x('Home', 'breadcrumb', 'woothemes'); + + $home_link = home_url(); + + $prepend = ''; + + if ( get_option('woocommerce_prepend_shop_page_to_urls')=="yes" && get_option('woocommerce_shop_page_id') && get_option('page_on_front') !== get_option('woocommerce_shop_page_id') ) + $prepend = $before . '' . get_the_title( get_option('woocommerce_shop_page_id') ) . ' ' . $after . $delimiter; + + + if ( (!is_home() && !is_front_page() && !(is_post_type_archive() && get_option('page_on_front')==get_option('woocommerce_shop_page_id'))) || is_paged() ) : + + echo $wrap_before; + + echo $before . '' . $home . ' ' . $after . $delimiter ; + + if ( is_category() ) : + + $cat_obj = $wp_query->get_queried_object(); + $this_category = $cat_obj->term_id; + $this_category = get_category( $this_category ); + if ($thisCat->parent != 0) : + $parent_category = get_category( $this_category->parent ); + echo get_category_parents($parent_category, TRUE, $delimiter ); + endif; + echo $before . single_cat_title('', false) . $after; + + elseif ( is_tax('product_cat') ) : + + //echo $before . '' . ucwords(get_option('woocommerce_shop_slug')) . '' . $after . $delimiter; + + $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); + + $parents = array(); + $parent = $term->parent; + while ($parent): + $parents[] = $parent; + $new_parent = get_term_by( 'id', $parent, get_query_var( 'taxonomy' )); + $parent = $new_parent->parent; + endwhile; + if(!empty($parents)): + $parents = array_reverse($parents); + foreach ($parents as $parent): + $item = get_term_by( 'id', $parent, get_query_var( 'taxonomy' )); + echo $before . '' . $item->name . '' . $after . $delimiter; + endforeach; + endif; + + $queried_object = $wp_query->get_queried_object(); + echo $prepend . $before . $queried_object->name . $after; + + elseif ( is_tax('product_tag') ) : + + $queried_object = $wp_query->get_queried_object(); + echo $prepend . $before . __('Products tagged “', 'woothemes') . $queried_object->name . '”' . $after; + + elseif ( is_day() ) : + + echo $before . '' . get_the_time('Y') . '' . $after . $delimiter; + echo $before . '' . get_the_time('F') . '' . $after . $delimiter; + echo $before . get_the_time('d') . $after; + + elseif ( is_month() ) : + + echo $before . '' . get_the_time('Y') . '' . $after . $delimiter; + echo $before . get_the_time('F') . $after; + + elseif ( is_year() ) : + + echo $before . get_the_time('Y') . $after; + + elseif ( is_post_type_archive('product') && get_option('page_on_front') !== get_option('woocommerce_shop_page_id') ) : + + $_name = get_option('woocommerce_shop_page_id') ? get_the_title( get_option('woocommerce_shop_page_id') ) : ucwords(get_option('woocommerce_shop_slug')); + + if (is_search()) : + + echo $before . '' . $_name . '' . $delimiter . __('Search results for “', 'woothemes') . get_search_query() . '”' . $after; + + else : + + echo $before . '' . $_name . '' . $after; + + endif; + + elseif ( is_single() && !is_attachment() ) : + + if ( get_post_type() == 'product' ) : + + //echo $before . '' . ucwords(get_option('woocommerce_shop_slug')) . '' . $after . $delimiter; + echo $prepend; + + if ($terms = wp_get_object_terms( $post->ID, 'product_cat' )) : + $term = current($terms); + $parents = array(); + $parent = $term->parent; + while ($parent): + $parents[] = $parent; + $new_parent = get_term_by( 'id', $parent, 'product_cat'); + $parent = $new_parent->parent; + endwhile; + if(!empty($parents)): + $parents = array_reverse($parents); + foreach ($parents as $parent): + $item = get_term_by( 'id', $parent, 'product_cat'); + echo $before . '' . $item->name . '' . $after . $delimiter; + endforeach; + endif; + echo $before . '' . $term->name . '' . $after . $delimiter; + endif; + + echo $before . get_the_title() . $after; + + elseif ( get_post_type() != 'post' ) : + $post_type = get_post_type_object(get_post_type()); + $slug = $post_type->rewrite; + echo $before . '' . $post_type->labels->singular_name . '' . $after . $delimiter; + echo $before . get_the_title() . $after; + else : + $cat = current(get_the_category()); + echo get_category_parents($cat, TRUE, $delimiter); + echo $before . get_the_title() . $after; + endif; + + elseif ( is_404() ) : + + echo $before . __('Error 404', 'woothemes') . $after; + + elseif ( !is_single() && !is_page() && get_post_type() != 'post' ) : + + $post_type = get_post_type_object(get_post_type()); + if ($post_type) : echo $before . $post_type->labels->singular_name . $after; endif; + + elseif ( is_attachment() ) : + + $parent = get_post($post->post_parent); + $cat = get_the_category($parent->ID); $cat = $cat[0]; + echo get_category_parents($cat, TRUE, '' . $delimiter); + echo $before . '' . $parent->post_title . '' . $after . $delimiter; + echo $before . get_the_title() . $after; + + elseif ( is_page() && !$post->post_parent ) : + + echo $before . get_the_title() . $after; + + elseif ( is_page() && $post->post_parent ) : + + $parent_id = $post->post_parent; + $breadcrumbs = array(); + while ($parent_id) { + $page = get_page($parent_id); + $breadcrumbs[] = '' . get_the_title($page->ID) . ''; + $parent_id = $page->post_parent; + } + $breadcrumbs = array_reverse($breadcrumbs); + foreach ($breadcrumbs as $crumb) : + echo $crumb . '' . $delimiter; + endforeach; + echo $before . get_the_title() . $after; + + elseif ( is_search() ) : + + echo $before . __('Search results for “', 'woothemes') . get_search_query() . '”' . $after; + + elseif ( is_tag() ) : + + echo $before . __('Posts tagged “', 'woothemes') . single_tag_title('', false) . '”' . $after; + + elseif ( is_author() ) : + + $userdata = get_userdata($author); + echo $before . __('Author: ', 'woothemes') . $userdata->display_name . $after; + + endif; + + if ( get_query_var('paged') ) : + + echo ' (' . __('Page', 'woothemes') . ' ' . get_query_var('paged') .')'; + + endif; + + echo $wrap_after; + + endif; + + } +} + + +function woocommerce_body_classes ($classes) { + + if( ! is_singular('product') ) return $classes; + + $key = array_search('singular', $classes); + if ( $key !== false ) unset($classes[$key]); + return $classes; + +} diff --git a/woocommerce_templates.php b/woocommerce_templates.php new file mode 100644 index 00000000000..6434cd619fd --- /dev/null +++ b/woocommerce_templates.php @@ -0,0 +1,156 @@ +