/** Gets the country and state from the current session for cart shipping display */ public static function get_shipping_country_or_state() { $country = self::get_customer_session('shipping_country'); if ($country) { $state = trim(self::get_customer_session('shipping_state'), ':'); if ($state && jigoshop_countries::country_has_states($country)) { return jigoshop_countries::get_state($country, $state); } else { return jigoshop_countries::get_country($country); } } $country = jigoshop_countries::get_default_customer_country(); return jigoshop_countries::get_country($country); }
/** * When Options are saved, return the 'jigoshop_tax_rates' option values * * @return mixed false if not rax rates, array of tax rates otherwise * @since 1.3 */ function get_updated_tax_classes() { $tax_rates = array(); $tax_fields = array('tax_classes' => '', 'tax_country' => '', 'tax_rate' => '', 'tax_label' => '', 'tax_shipping' => '', 'tax_compound' => ''); /* Save each array key to a variable */ foreach ($tax_fields as $name => $val) { if (isset($_POST[$name])) { $tax_fields[$name] = $_POST[$name]; } } for ($i = 0; $i < sizeof($tax_fields['tax_classes']); $i++) { if (empty($tax_fields['tax_rate'][$i])) { continue; } $countries = $tax_fields['tax_country'][$i]; $label = trim($tax_fields['tax_label'][$i]); $rate = number_format(floatval($tax_fields['tax_rate'][$i]), 4); $class = jigowatt_clean($tax_fields['tax_classes'][$i]); $shipping = !empty($tax_fields['tax_shipping'][$i]) ? 'yes' : 'no'; $compound = !empty($tax_fields['tax_compound'][$i]) ? 'yes' : 'no'; /* Save the state & country separately from options eg US:OH */ $whole_countries_processed = array(); foreach ($countries as $country_code) { @(list($country, $state) = explode(':', $country_code, 2)); if (!in_array($country, $whole_countries_processed)) { if ($state === null && jigoshop_countries::country_has_states($country)) { $whole_countries_processed[] = $country; foreach (jigoshop_countries::get_states($country) as $state => $state_name) { $tax_rates[] = array('country' => $country, 'label' => $label, 'state' => $state, 'rate' => $rate, 'shipping' => $shipping, 'class' => $class, 'compound' => $compound, 'is_all_states' => true); } } else { $tax_rates[] = array('country' => $country, 'label' => $label, 'state' => $state, 'rate' => $rate, 'shipping' => $shipping, 'class' => $class, 'compound' => $compound, 'is_all_states' => false); } } } } usort($tax_rates, array($this, 'csort_tax_rates')); return $tax_rates; }
/** * Validate the checkout */ public function validate_checkout() { if (jigoshop_cart::is_empty()) { jigoshop::add_error(sprintf(__('Sorry, your session has expired. <a href="%s">Return to homepage →</a>', 'jigoshop'), home_url())); } // Process Discount Codes if (!empty($_POST['coupon_code'])) { $coupon = sanitize_title($_POST['coupon_code']); jigoshop_cart::add_discount($coupon); } foreach (jigoshop_cart::get_coupons() as $coupon) { jigoshop_cart::is_valid_coupon($coupon); } // Checkout fields $this->posted['shipping_method'] = ''; $this->posted['shipping_service'] = ''; if (isset($_POST['shipping_method'])) { $shipping_method = jigowatt_clean($_POST['shipping_method']); $shipping_data = explode(':', $shipping_method); $this->posted['shipping_method'] = $shipping_data[0]; $this->posted['shipping_service'] = $shipping_data[1]; } $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['order_comments'] = isset($_POST['order_comments']) ? jigowatt_clean($_POST['order_comments']) : ''; $this->posted['terms'] = isset($_POST['terms']) ? jigowatt_clean($_POST['terms']) : ''; $this->posted['create_account'] = isset($_POST['create_account']) ? jigowatt_clean($_POST['create_account']) : ''; $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']) : ''; if (jigoshop_cart::get_total(false) == 0) { $this->posted['payment_method'] = 'no_payment'; } // establish customer billing and shipping locations if (jigoshop_cart::ship_to_billing_address_only()) { $this->posted['shiptobilling'] = 'true'; } $country = isset($_POST['billing_country']) ? jigowatt_clean($_POST['billing_country']) : ''; $state = isset($_POST['billing_state']) ? jigowatt_clean($_POST['billing_state']) : ''; $allowed_countries = Jigoshop_Base::get_options()->get('jigoshop_allowed_countries'); if ($allowed_countries === 'specific') { $specific_countries = Jigoshop_Base::get_options()->get('jigoshop_specific_allowed_countries'); if (!in_array($country, $specific_countries)) { jigoshop::add_error(__('Invalid billing country.', 'jigoshop')); return; } } if (jigoshop_countries::country_has_states($country)) { $states = jigoshop_countries::get_states($country); if (!in_array($state, array_keys($states))) { jigoshop::add_error(__('Invalid billing state.', 'jigoshop')); return; } } $postcode = isset($_POST['billing_postcode']) ? jigowatt_clean($_POST['billing_postcode']) : ''; $ship_to_billing = Jigoshop_Base::get_options()->get('jigoshop_ship_to_billing_address_only') == 'yes'; jigoshop_customer::set_location($country, $state, $postcode); if (Jigoshop_Base::get_options()->get('jigoshop_calc_shipping') == 'yes') { if ($ship_to_billing || !empty($_POST['shiptobilling'])) { jigoshop_customer::set_shipping_location($country, $state, $postcode); } else { $country = isset($_POST['shipping_country']) ? jigowatt_clean($_POST['shipping_country']) : ''; $state = isset($_POST['shipping_state']) ? jigowatt_clean($_POST['shipping_state']) : ''; $postcode = isset($_POST['shipping_postcode']) ? jigowatt_clean($_POST['shipping_postcode']) : ''; if ($allowed_countries === 'specific') { $specific_countries = Jigoshop_Base::get_options()->get('jigoshop_specific_allowed_countries'); if (!in_array($country, $specific_countries)) { jigoshop::add_error(__('Invalid shipping country.', 'jigoshop')); return; } } if (jigoshop_countries::country_has_states($country)) { $states = jigoshop_countries::get_states($country); if (!in_array($state, array_keys($states))) { jigoshop::add_error(__('Invalid shipping state.', 'jigoshop')); return; } } jigoshop_customer::set_shipping_location($country, $state, $postcode); } } // Billing Information foreach ($this->billing_fields as $field) { $field = apply_filters('jigoshop_billing_field', $field); $this->posted[$field['name']] = isset($_POST[$field['name']]) ? jigowatt_clean($_POST[$field['name']]) : ''; // Format if (isset($field['format'])) { switch ($field['format']) { case 'postcode': $this->posted[$field['name']] = strtolower(str_replace(' ', '', $this->posted[$field['name']])); break; } } // Required if ($field['name'] == 'billing_state' && jigoshop_customer::has_valid_shipping_state()) { $field['required'] = false; } if (isset($field['required']) && $field['required'] && empty($this->posted[$field['name']])) { jigoshop::add_error($field['label'] . __(' (billing) is a required field.', 'jigoshop')); } if ($field['name'] == 'billing_euvatno') { $vatno = isset($this->posted['billing_euvatno']) ? $this->posted['billing_euvatno'] : ''; $vatno = str_replace(' ', '', $vatno); $country = jigoshop_tax::get_customer_country(); // strip any country code from the beginning of the number if (strpos($vatno, $country) === 0) { $vatno = substr($vatno, strlen($country)); } if ($vatno != '') { $url = 'http://isvat.appspot.com/' . $country . '/' . $vatno . '/'; $httpRequest = curl_init(); curl_setopt($httpRequest, CURLOPT_FAILONERROR, true); curl_setopt($httpRequest, CURLOPT_RETURNTRANSFER, true); curl_setopt($httpRequest, CURLOPT_HEADER, false); curl_setopt($httpRequest, CURLOPT_URL, $url); $result = curl_exec($httpRequest); curl_close($httpRequest); if ($result === 'false') { jigoshop_log('EU VAT validation error with URL: ' . $url); jigoshop::add_error($field['label'] . __(' (billing) is not a valid VAT Number. Leave it blank to disable VAT validation. (VAT may be charged depending on your location)', 'jigoshop')); } else { $this->valid_euvatno = jigoshop_countries::get_base_country() != jigoshop_tax::get_customer_country() && jigoshop_countries::is_eu_country(jigoshop_tax::get_customer_country()); } } } // 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')); } 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')); } 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')); } else { $this->posted[$field['name']] = jigoshop_validation::format_postcode($this->posted[$field['name']], $_POST['billing_country']); } break; } } } // Shipping Information if (jigoshop_shipping::is_enabled() && !jigoshop_cart::ship_to_billing_address_only() && empty($this->posted['shiptobilling'])) { foreach ($this->shipping_fields as $field) { $field = apply_filters('jigoshop_shipping_field', $field); if (isset($_POST[$field['name']])) { $this->posted[$field['name']] = jigowatt_clean($_POST[$field['name']]); } else { $this->posted[$field['name']] = ''; } // Format if (isset($field['format'])) { switch ($field['format']) { case 'postcode': $this->posted[$field['name']] = strtolower(str_replace(' ', '', $this->posted[$field['name']])); break; } } // Required if ($field['name'] == 'shipping_state' && jigoshop_customer::has_valid_shipping_state()) { $field['required'] = false; } if (isset($field['required']) && $field['required'] && empty($this->posted[$field['name']])) { jigoshop::add_error($field['label'] . __(' (shipping) is a required field.', 'jigoshop')); } // Validation if (isset($field['validate']) && !empty($this->posted[$field['name']])) { switch ($field['validate']) { case 'postcode': if (!jigoshop_validation::is_postcode($this->posted[$field['name']], $country)) { jigoshop::add_error($field['label'] . __(' (shipping) is not a valid postcode/ZIP.', 'jigoshop')); } else { $this->posted[$field['name']] = jigoshop_validation::format_postcode($this->posted[$field['name']], $country); } break; } } } } if ($this->must_register && empty($this->posted['create_account'])) { jigoshop::add_error(__('Sorry, you must agree to creating an account', 'jigoshop')); } if ($this->must_register || empty($user_id) && $this->posted['create_account']) { if (!$this->show_signup) { jigoshop::add_error(__('Sorry, the shop owner has disabled guest purchases.', 'jigoshop')); } 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')); } // Check the username if (!validate_username($this->posted['account_username'])) { jigoshop::add_error(__('Invalid email/username.', 'jigoshop')); } elseif (username_exists($this->posted['account_username'])) { jigoshop::add_error(__('An account is already registered with that username. Please choose another.', 'jigoshop')); } // 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')); } } // Terms if (!isset($_POST['update_totals']) && empty($this->posted['terms']) && jigoshop_get_page_id('terms') > 0) { jigoshop::add_error(__('You must accept our Terms & Conditions.', 'jigoshop')); } if (jigoshop_cart::needs_shipping()) { // Shipping Method $available_methods = jigoshop_shipping::get_available_shipping_methods(); if (!isset($available_methods[$this->posted['shipping_method']])) { jigoshop::add_error(__('Invalid shipping method.', 'jigoshop')); } } }
/** * Get the shop's taxation rate using find_rate() * * @param string $tax_class is the tax class (not object) * @param bool $rate_only * @return int */ public function get_shop_base_rate($tax_class = '*', $rate_only = true) { $country = jigoshop_countries::get_base_country(); $state = jigoshop_countries::get_base_state(); $state = $state && jigoshop_countries::country_has_states($country) ? $state : '*'; $rate = $this->find_rate($country, $state, $tax_class); return $rate_only ? $rate['rate'] : $rate; }
/** * Execute changes made in Jigoshop 1.0 * * @since 1.0.0 */ function jigoshop_upgrade_100() { global $wpdb; // Run upgrade // upgrade option jigoshop_tax_rates $jigoshop_tax_rates = get_site_option('jigoshop_tax_rates'); $tax_rates = array(); if ($jigoshop_tax_rates && is_array($jigoshop_tax_rates)) : foreach($jigoshop_tax_rates as $key) : $country = $key['country']; $state = $key['state']; // Change canadian province NF and PQ to NL and QC respectively if (isset($key['country']) && $key['country'] == 'CA') : if ($key['state'] == 'NF') : $state = 'NL'; elseif ($key['state'] == 'PQ') : $state = 'QC'; endif; endif; $rate = $key['rate']; $shipping = $key['shipping']; $class = $key['class']; // convert all-states if (jigoshop_countries::country_has_states($country) && $state == '*') : foreach (array_keys(jigoshop_countries::$states[$country]) as $st) : $tax_rates[] = array( 'country' => $country, 'label' => '', // no label created as of yet 'state' => $st, 'rate' => $rate, 'shipping' => $shipping, 'class' => $class, 'compound' => 'no', //no such thing as compound taxes, so value is no 'is_all_states'=> true //determines if admin panel should show 'all_states' ); endforeach; else : // do normal tax_rates array with the additional parameters $tax_rates[] = array( 'country' => $country, 'label' => '', // no label created as of yet 'state' => $state, 'rate' => $rate, 'shipping' => $shipping, 'class' => $class, 'compound' => 'no', //no such thing as compound taxes, so value is no 'is_all_states'=> false //determines if admin panel should show 'all_states' ); endif; endforeach; update_option('jigoshop_tax_rates', $tax_rates); endif; // convert products $args = array( 'post_type' => 'product', 'numberposts' => -1, 'post_status' => 'any', // Fixes draft products not being upgraded ); $posts = get_posts( $args ); foreach( $posts as $post ) { // Convert SKU key to lowercase $wpdb->update( $wpdb->postmeta, array('meta_key' => 'sku'), array('post_id' => $post->ID, 'meta_key' => 'sku') ); // Change redirect add to cart option name $checkoutValue = get_option( 'jigoshop_directly_to_checkout' ); if ($checkoutValue == "no" ) $checkoutValue = "same_page"; else if ($checkoutValue == "cart") $checkoutValue = "to_cart"; else if ($checkoutValue == "yes") $checkoutValue = "to_checkout"; update_option( 'jigoshop_redirect_add_to_cart' , $checkoutValue ); delete_option( 'jigoshop_directly_to_checkout' ); // Convert featured to true/false $featured = get_post_meta( $post->ID, 'featured', true); if ( $featured == 'yes' ) update_post_meta( $post->ID, 'featured', true ); else { update_post_meta( $post->ID, 'featured', false); } // Convert the filepath to url $file_path = get_post_meta( $post->ID, 'file_path', true ); update_post_meta( $post->ID, 'file_path', site_url().'/'.$file_path ); // Unserialize all product_data keys to individual key => value pairs $product_data = get_post_meta( $post->ID, 'product_data', true ); if ( is_array($product_data) ) { foreach( $product_data as $key => $value ) { // Convert all keys to lowercase // @todo: Needs testing especially with 3rd party plugins using product_data $key = strtolower($key); // We now call it tax_classes & its an array if ( $key == 'tax_class' ) { if ( $value ) $value = (array) $value; else $value = array('*'); $key = 'tax_classes'; } // Convert manage stock to true/false if ( $key == 'manage_stock' ) { $value = ( $value == 'yes' ) ? true : false; } // Create the meta update_post_meta( $post->ID, $key, $value ); // Remove the old meta delete_post_meta( $post->ID, 'product_data' ); } } $product_attributes = get_post_meta( $post->ID, 'product_attributes', true ); if ( is_array($product_attributes) ) { foreach( $product_attributes as $key => $attribute ) { // We use true/false for these now if ( isset( $attribute['visible'] ) ) $attribute['visible'] = ( $attribute['visible'] == 'yes' ) ? true : false; if ( isset( $attribute['variation'] ) ) $attribute['variation'] = ( $attribute['variation'] == 'yes' ) ? true : false; if ( isset( $attribute['is_taxonomy'] ) ) $attribute['is_taxonomy'] = ( $attribute['is_taxonomy'] == 'yes' ) ? true : false; $product_attributes[$key] = $attribute; } update_post_meta( $post->ID, 'product_attributes', $product_attributes ); } } // Variations $args = array( 'post_type' => 'product_variation', 'numberposts' => -1, 'post_status' => 'any', // Fixes draft products not being upgraded ); $posts = get_posts( $args ); foreach( $posts as $post ) { // Convert SKU key to lowercase $wpdb->update( $wpdb->postmeta, array('meta_key' => 'sku'), array('post_id' => $post->ID, 'meta_key' => 'sku') ); // Convert 'price' key to regular_price $wpdb->update( $wpdb->postmeta, array('meta_key' => 'regular_price'), array('post_id' => $post->ID, 'meta_key' => 'price') ); $taxes = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key LIKE %s", $post->ID, 'tax_%' ) ); // Update catch all prices, weights, and dimensions $parent_id = $post->post_parent; $parent_reg_price = get_post_meta( $parent_id, 'regular_price', true ); $parent_sale_price = get_post_meta( $parent_id, 'sale_price', true ); // weight and dimensions were in pre 1.0. Therefore, make sure all of this // data gets converted as well $parent_weight = get_post_meta( $parent_id, 'weight', true ); $parent_length = get_post_meta( $parent_id, 'length', true ); $parent_height = get_post_meta( $parent_id, 'height', true ); $parent_width = get_post_meta( $parent_id, 'width', true ); if ( ! get_post_meta( $post->ID, 'regular_price', true) && $parent_reg_price ) update_post_meta( $post->ID, 'regular_price', $parent_reg_price ); if( ! get_post_meta( $post->ID, 'sale_price', true) && $parent_sale_price ) update_post_meta( $post->ID, 'sale_price', $parent_sale_price ); if( ! get_post_meta( $post->ID, 'weight', true) && $parent_weight ) update_post_meta( $post->ID, 'weight', $parent_weight ); if( ! get_post_meta( $post->ID, 'length', true) && $parent_length ) update_post_meta( $post->ID, 'length', $parent_length ); if( ! get_post_meta( $post->ID, 'height', true) && $parent_height ) update_post_meta( $post->ID, 'height', $parent_height ); if( ! get_post_meta( $post->ID, 'width', true) && $parent_width ) update_post_meta( $post->ID, 'width', $parent_width ); $variation_data = array(); foreach( $taxes as $tax ) { $variation_data[$tax->meta_key] = $tax->meta_value; delete_post_meta( $post->ID, $tax->meta_key ); } update_post_meta( $post->ID, 'variation_data', $variation_data ); } // Update shop order comments type $wpdb->update( $wpdb->comments, array( 'comment_type' => 'jigoshop', 'comment_author' => 'Jigoshop', 'comment_author_email' => '', 'comment_author_IP' => '', ), array('user_id' => 0, 'comment_author' => 'JigoShop') ); }
function jigoshop_shipping_calculator() { if (jigoshop_shipping::show_shipping_calculator()) { ?> <form class="shipping_calculator" action="<?php echo esc_url(jigoshop_cart::get_cart_url()); ?> " method="post"> <h2><a href="#" class="shipping-calculator-button"><?php _e('Calculate Shipping', 'jigoshop'); ?> <span>↓</span></a></h2> <section class="shipping-calculator-form"> <p class="form-row"> <select name="calc_shipping_country" id="calc_shipping_country" class="country_to_state" rel="calc_shipping_state"> <?php foreach (jigoshop_countries::get_allowed_countries() as $key => $value) { ?> <option value="<?php echo esc_attr($key); ?> " <?php selected(jigoshop_customer::get_shipping_country(), $key); ?> ><?php echo $value; ?> </option> <?php } ?> </select> </p> <div class="col2-set"> <p class="form-row col-1"> <?php $current_cc = jigoshop_customer::get_shipping_country(); $current_r = jigoshop_customer::get_shipping_state(); $states = jigoshop_countries::$states; if (jigoshop_countries::country_has_states($current_cc)) { // Dropdown ?> <span> <select name="calc_shipping_state" id="calc_shipping_state"> <option value=""><?php _e('Select a state…', 'jigoshop'); ?> </option><?php foreach ($states[$current_cc] as $key => $value) { echo '<option value="' . esc_attr($key) . '"'; if ($current_r == $key) { echo 'selected="selected"'; } echo '>' . $value . '</option>'; } ?> </select> </span> <?php } else { // Input ?> <input type="text" class="input-text" value="<?php echo esc_attr($current_r); ?> " placeholder="<?php _e('state', 'jigoshop'); ?> " name="calc_shipping_state" id="calc_shipping_state" /> <?php } ?> </p> <p class="form-row col-2"> <input type="text" class="input-text" value="<?php echo esc_attr(jigoshop_customer::get_shipping_postcode()); ?> " placeholder="<?php _e('Postcode/Zip', 'jigoshop'); ?> " title="<?php _e('Postcode', 'jigoshop'); ?> " name="calc_shipping_postcode" id="calc_shipping_postcode" /> </p> <?php do_action('jigoshop_after_shipping_calculator_fields'); ?> </div> <p> <button type="submit" name="calc_shipping" value="1" class="button"><?php _e('Update Totals', 'jigoshop'); ?> </button> </p> <p> <?php $available_methods = jigoshop_shipping::get_available_shipping_methods(); foreach ($available_methods as $method) { for ($i = 0; $i < $method->get_rates_amount(); $i++) { ?> <div class="col2-set"> <p class="form-row col-1"> <?php echo '<input type="radio" name="shipping_rates" value="' . esc_attr($method->id . ':' . $i) . '"' . ' class="shipping_select"'; if ($method->get_cheapest_service() == $method->get_selected_service($i) && $method->is_chosen()) { echo ' checked>'; } else { echo '>'; } echo $method->get_selected_service($i); ?> <p class="form-row col-2"><?php if ($method->get_selected_price($i) > 0) { echo jigoshop_price($method->get_selected_price($i)); echo __(' (ex. tax)', 'jigoshop'); } else { echo __('Free', 'jigoshop'); } ?> </div> <?php } } ?> <input type="hidden" name="cart-url" value="<?php echo esc_attr(jigoshop_cart::get_cart_url()); ?> "> <?php jigoshop::nonce_field('cart'); ?> </section> </form> <?php } }
function jigoshop_admin_option_display($options) { if (empty($options)) { return false; } $counter = 1; foreach ($options as $value) { switch ($value['type']) { case 'string': ?> <tr> <th scope="row"><?php echo $value['name']; ?> </th> <td><?php echo $value['desc']; ?> </td> </tr><?php break; case 'tab': ?> <div id="<?php echo $value['type'] . $counter; ?> " class="panel"> <table class="form-table"><?php break; case 'title': ?> <thead> <tr> <th scope="col" colspan="2"> <h3 class="title"><?php echo $value['name']; ?> </h3> <?php if (!empty($value['desc'])) { ?> <p><?php echo $value['desc']; ?> </p> <?php } ?> </th> </tr> </thead><?php break; case 'button': ?> <tr> <th scope="row"<?php if (empty($value['name'])) { ?> style="padding-top:0px;"<?php } ?> > <?php if (!empty($value['tip'])) { ?> <a href="#" tip="<?php echo $value['tip']; ?> " class="tips" tabindex="99" ></a> <?php } ?> <?php if (!empty($value['name'])) { ?> <label for="<?php echo esc_attr($value['id']); ?> "><?php echo $value['name']; ?> </label> <?php } ?> </th> <td<?php if (empty($value['name'])) { ?> style="padding-top:0px;"<?php } ?> > <a id="<?php echo esc_attr($value['id']); ?> " class="button <?php if (!empty($value['class'])) { echo esc_attr($value['class']); } ?> " style="<?php if (!empty($value['css'])) { echo esc_attr($value['css']); } ?> " href="<?php if (!empty($value['href'])) { echo esc_attr($value['href']); } ?> " ><?php if (!empty($value['desc'])) { echo $value['desc']; } ?> </a> </td> </tr><?php break; case 'checkbox': ?> <tr> <th scope="row"<?php if (empty($value['name'])) { ?> style="padding-top:0px;"<?php } ?> > <?php if (!empty($value['tip'])) { ?> <a href="#" tip="<?php echo $value['tip']; ?> " class="tips" tabindex="99" ></a> <?php } ?> <?php if (!empty($value['name'])) { ?> <label for="<?php echo esc_attr($value['id']); ?> "><?php echo $value['name']; ?> </label> <?php } ?> </th> <td<?php if (empty($value['name'])) { ?> style="padding-top:0px;"<?php } ?> > <input id="<?php echo esc_attr($value['id']); ?> " type="checkbox" class="jigoshop-input jigoshop-checkbox <?php if (!empty($value['class'])) { echo esc_attr($value['class']); } ?> " style="<?php if (!empty($value['css'])) { echo esc_attr($value['css']); } ?> " name="<?php echo esc_attr($value['id']); ?> " <?php if (get_option($value['id']) !== false && get_option($value['id']) !== null) { echo checked(get_option($value['id']), 'yes', false); } else { if (isset($value['std'])) { echo checked($value['std'], 'yes', false); } } ?> /> <label for="<?php echo esc_attr($value['id']); ?> "><?php if (!empty($value['desc'])) { echo $value['desc']; } ?> </label> </td> </tr><?php break; case 'text': case 'number': ?> <tr> <th scope="row"<?php if (empty($value['name'])) { ?> style="padding-top:0px;"<?php } ?> > <?php if (!empty($value['tip'])) { ?> <a href="#" tip="<?php echo $value['tip']; ?> " class="tips" tabindex="99"></a> <?php } ?> <?php if (!empty($value['name'])) { ?> <label for="<?php echo esc_attr($value['id']); ?> "><?php echo $value['name']; ?> </label> <?php } ?> </th> <td<?php if (empty($value['name'])) { ?> style="padding-top:0px;"<?php } ?> > <input name="<?php echo esc_attr($value['id']); ?> " id="<?php echo esc_attr($value['id']); ?> " type="<?php echo $value['type']; ?> " <?php if ($value['type'] == 'number' && !empty($value['restrict']) && is_array($value['restrict'])) { ?> min="<?php echo isset($value['restrict']['min']) ? $value['restrict']['min'] : ''; ?> " max="<?php echo isset($value['restrict']['max']) ? $value['restrict']['max'] : ''; ?> " step="<?php echo isset($value['restrict']['step']) ? $value['restrict']['step'] : 'any'; ?> " <?php } ?> class="regular-text <?php if (!empty($value['class'])) { echo esc_attr($value['class']); } ?> " style="<?php if (!empty($value['css'])) { echo esc_attr($value['css']); } ?> " placeholder="<?php if (!empty($value['placeholder'])) { echo esc_attr($value['placeholder']); } ?> " value="<?php if (get_option($value['id']) !== false && get_option($value['id']) !== null) { echo esc_attr(get_option($value['id'])); } else { if (isset($value['std'])) { echo esc_attr($value['std']); } } ?> " /> <?php if (!empty($value['desc']) && (!empty($value['name']) && empty($value['group']))) { ?> <br /><small><?php echo $value['desc']; ?> </small> <?php } elseif (!empty($value['desc'])) { ?> <?php echo $value['desc']; ?> <?php } ?> </td> </tr><?php break; case 'select': ?> <tr> <th scope="row"<?php if (empty($value['name'])) { ?> style="padding-top:0px;"<?php } ?> > <?php if (!empty($value['tip'])) { ?> <a href="#" tip="<?php echo $value['tip']; ?> " class="tips" tabindex="99"></a> <?php } ?> <?php if (!empty($value['name'])) { ?> <label for="<?php echo esc_attr($value['id']); ?> "><?php echo $value['name']; ?> </label> <?php } ?> </th> <td> <select name="<?php echo esc_attr($value['id']); ?> " id="<?php echo esc_attr($value['id']); ?> " style="<?php if (isset($value['css'])) { echo esc_attr($value['css']); } ?> " class="<?php if (!empty($value['class'])) { echo esc_attr($value['class']); } ?> " <?php if (!empty($value['multiple'])) { echo 'multiple="multiple"'; } ?> <?php if (!empty($value['class']) && $value['class'] == 'chzn-select' && !empty($value['placeholder'])) { ?> data-placeholder="<?php _e(esc_attr($value['placeholder'])); ?> " <?php } ?> > <?php $selected = get_option($value['id']); $selected = !empty($selected) ? $selected : $value['std']; ?> <?php foreach ($value['options'] as $key => $val) { ?> <option value="<?php echo esc_attr($key); ?> " <?php if (!is_array($selected) && $selected == $key || is_array($selected) && in_array($key, $selected)) { ?> selected="selected" <?php } ?> > <?php echo ucfirst($val); ?> </option> <?php } ?> </select> <?php if (!empty($value['desc']) && (!empty($value['name']) && empty($value['group']))) { ?> <br /><small><?php echo $value['desc']; ?> </small> <?php } elseif (!empty($value['desc'])) { ?> <?php echo $value['desc']; ?> <?php } ?> </td> </tr><?php break; case 'radio': ?> <tr> <th scope="row"<?php if (empty($value['name'])) { ?> style="padding-top:0px;"<?php } ?> > <?php if (!empty($value['tip'])) { ?> <a href="#" tip="<?php echo $value['tip']; ?> " class="tips" tabindex="99"></a> <?php } ?> <?php echo $value['name']; ?> </th> <td<?php if (empty($value['name'])) { ?> style="padding-top:0px;"<?php } ?> > <?php foreach ($value['options'] as $key => $val) { ?> <label class="radio"> <input type="radio" name="<?php echo esc_attr($value['id']); ?> " id="<?php echo esc_attr($key); ?> " value="<?php echo esc_attr($key); ?> " class="<?php if (!empty($value['class'])) { echo esc_attr($value['class']); } ?> " <?php if (get_option($value['id']) == $key) { ?> checked="checked" <?php } ?> > <?php echo esc_attr(ucfirst($val)); ?> </label><br /> <?php } ?> </td> </tr><?php break; case 'image_size': $sizes = array('jigoshop_shop_tiny' => 'jigoshop_use_wordpress_tiny_crop', 'jigoshop_shop_thumbnail' => 'jigoshop_use_wordpress_thumbnail_crop', 'jigoshop_shop_small' => 'jigoshop_use_wordpress_catalog_crop', 'jigoshop_shop_large' => 'jigoshop_use_wordpress_featured_crop'); $altSize = $sizes[$value['id']]; ?> <tr> <th scope="row"><?php echo $value['name']; ?> </label></th> <td valign="top" style="line-height:25px;height:25px;"> <input name="<?php echo esc_attr($value['id']); ?> _w" id="<?php echo esc_attr($value['id']); ?> _w" type="number" min="0" style="width:60px;" placeholder=<?php if (!empty($value['placeholder'])) { echo $value['placeholder']; } ?> value="<?php if ($size = get_option($value['id'] . '_w')) { echo $size; } else { echo $value['std']; } ?> " /> <label for="<?php echo esc_attr($value['id']); ?> _h">x</label> <input name="<?php echo esc_attr($value['id']); ?> _h" id="<?php echo esc_attr($value['id']); ?> _h" type="number" min="0" style="width:60px;" placeholder=<?php if (!empty($value['placeholder'])) { echo $value['placeholder']; } ?> value="<?php if ($size = get_option($value['id'] . '_h')) { echo $size; } else { echo $value['std']; } ?> " /> <input id="<?php echo esc_attr($altSize); ?> " type="checkbox" class="jigoshop-input jigoshop-checkbox" name="<?php echo esc_attr($altSize); ?> " <?php if (get_option($altSize) !== false && get_option($altSize) !== null) { echo checked(get_option($altSize), 'yes', false); } ?> /> <label for="<?php echo esc_attr($altSize); ?> "> <?php echo __('Crop', 'jigoshop'); ?> </label> <br /><small><?php echo $value['desc']; ?> </small> </td> </tr><?php break; case 'textarea': ?> <tr> <th scope="row"><?php if ($value['tip']) { ?> <a href="#" tip="<?php echo $value['tip']; ?> " class="tips" tabindex="99"></a><?php } ?> <label for="<?php echo esc_attr($value['id']); ?> "><?php echo $value['name']; ?> </label></th> <td> <textarea <?php if (isset($value['args'])) { echo $value['args'] . ' '; } ?> name="<?php echo esc_attr($value['id']); ?> " id="<?php echo esc_attr($value['id']); ?> " class="large-text <?php if (!empty($value['class'])) { echo esc_attr($value['class']); } ?> " style="<?php echo esc_attr($value['css']); ?> " placeholder="<?php if (!empty($value['placeholder'])) { echo esc_attr($value['placeholder']); } ?> " ><?php echo esc_textarea(get_option($value['id']) ? stripslashes(get_option($value['id'])) : $value['std']); ?> </textarea> <br /><small><?php echo $value['desc']; ?> </small> </td> </tr><?php break; case 'tabend': ?> </table></div><?php $counter = $counter + 1; break; case 'single_select_page': $args = array('name' => $value['id'], 'id' => $value['id'] . '" style="width: 200px;', 'sort_column' => 'menu_order', 'sort_order' => 'ASC', 'selected' => (int) get_option($value['id'])); if (!empty($value['args'])) { $args = wp_parse_args($value['args'], $args); } ?> <tr class="single_select_page"> <th scope="row"><?php if ($value['tip']) { ?> <a href="#" tip="<?php echo $value['tip']; ?> " class="tips" tabindex="99"></a><?php } ?> <label for="<?php echo esc_attr($value['id']); ?> "><?php echo $value['name']; ?> </label></th> <td> <?php wp_dropdown_pages($args); ?> <br /><small><?php echo $value['desc']; ?> </small> </td> </tr><?php break; case 'single_select_country': $countries = jigoshop_countries::$countries; $country_setting = (string) get_option($value['id']); if (strstr($country_setting, ':')) { $country = current(explode(':', $country_setting)); $state = end(explode(':', $country_setting)); } else { $country = $country_setting; $state = '*'; } ?> <tr class="multi_select_countries"> <th scope="row"><?php if ($value['tip']) { ?> <a href="#" tip="<?php echo $value['tip']; ?> " class="tips" tabindex="99"></a><?php } ?> <label for="<?php echo esc_attr($value['id']); ?> "><?php echo $value['name']; ?> </label></th> <td> <select id="<?php echo esc_attr($value['id']); ?> " name="<?php echo esc_attr($value['id']); ?> " title="Country" style="width: 150px;"> <?php $show_all = $value['id'] != 'jigoshop_default_country'; echo jigoshop_countries::country_dropdown_options($country, $state, false, $show_all); ?> </select> </td> </tr><?php if (!$show_all && jigoshop_countries::country_has_states($country) && $state == '*') { jigoshop_countries::base_country_notice(); } break; case 'multi_select_countries': $countries = jigoshop_countries::$countries; asort($countries); $selections = (array) get_option($value['id']); ?> <tr class="multi_select_countries"> <th scope="row"><?php if ($value['tip']) { ?> <a href="#" tip="<?php echo $value['tip']; ?> " class="tips" tabindex="99"></a><?php } ?> <label><?php echo $value['name']; ?> </label></th> <td> <div class="multi_select_countries"> <ul><?php if ($countries) { foreach ($countries as $key => $val) { ?> <li><label> <input type="checkbox" name="<?php echo esc_attr($value['id']) . '[]'; ?> " value="<?php echo esc_attr($key); ?> " <?php if (in_array($key, $selections)) { ?> checked="checked" <?php } ?> /> <?php echo $val; ?> </label></li><?php } } ?> </ul> </div> </td> </tr><?php break; case 'coupons': _deprecated_argument('jigoshop_admin_option_display', '1.3', 'The coupons type has no alternative. Use the new custom post Coupons Menu item under Jigoshop.'); $coupons = new jigoshop_coupons(); $coupon_codes = $coupons->get_coupons(); ?> <style> table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;} .table{width:100%;margin-bottom:18px;} .table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} .table thead th{vertical-align:bottom;} .table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;} .table tbody+tbody{border-top:2px solid #dddddd;} .table-condensed th,.table-condensed td{padding:4px 5px;} .coupon-table th,.coupon-table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:0px;} </style> <tr><td><a href="#" class="add button" id="add_coupon"><?php _e('+ Add Coupon', 'jigoshop'); ?> </a></td></tr> <table class="coupons table"> <thead> <tr> <th>Coupon</th> <th>Type</th> <th>Amount</th> <th>Usage</th> <th>Controls</th> </tr> </thead> <tbody> <?php /* Payment methods. */ $payment_methods = array(); $available_gateways = jigoshop_payment_gateways::get_available_payment_gateways(); if (!empty($available_gateways)) { foreach ($available_gateways as $id => $info) { $payment_methods[$id] = $info->title; } } /* Coupon types. */ $discount_types = jigoshop_coupons::get_coupon_types(); /* Product categories. */ $categories = get_terms('product_cat', array('hide_empty' => false)); $coupon_cats = array(); foreach ($categories as $category) { $coupon_cats[$category->term_id] = $category->name; } $i = -1; if ($coupon_codes && is_array($coupon_codes) && sizeof($coupon_codes) > 0) { foreach ($coupon_codes as $coupon) { $i++; ?> <tr> <td style="width:500px;"> <table class="coupon-table form-table" id="coupons_table_<?php echo $i; ?> "> <?php echo $coupon['code']; ?> <tbody class="couponDisplay" id="coupons_rows_<?php echo $i; ?> "> <?php $selected_type = ''; foreach ($discount_types as $type => $label) { if ($coupon['type'] == $type) { $selected_type = $type; } } $options3 = array(array('name' => __('Code', 'jigoshop'), 'tip' => __('The coupon code a customer enters on the cart or checkout page.', 'jigoshop'), 'id' => 'coupon_code[' . esc_attr($i) . ']', 'css' => 'width:150px;', 'class' => 'coupon_code', 'type' => 'text', 'std' => esc_attr($coupon['code'])), array('name' => __('Type', 'jigoshop'), 'tip' => __('Cart - Applies to whole cart<br/>Product - Applies to individual products only. You must specify individual products.', 'jigoshop'), 'id' => 'coupon_type[' . esc_attr($i) . ']', 'css' => 'width:200px;', 'type' => 'select', 'std' => $selected_type, 'options' => $discount_types), array('name' => __('Amount', 'jigoshop'), 'tip' => __('Amount this coupon is worth. If it is a percentange, just include the number without the percentage sign.', 'jigoshop'), 'id' => 'coupon_amount[' . esc_attr($i) . ']', 'css' => 'width:60px;', 'type' => 'number', 'restrict' => array('min' => 0), 'std' => esc_attr($coupon['amount'])), array('name' => __('Usage limit', 'jigoshop'), 'desc' => __(sprintf('Times used: %s', !empty($coupon['usage']) ? $coupon['usage'] : '0'), 'jigoshop'), 'placeholder' => __('No limit', 'jigoshop'), 'tip' => __('Control how many times this coupon may be used.', 'jigoshop'), 'id' => 'usage_limit[' . esc_attr($i) . ']', 'css' => 'width:60px;', 'type' => 'number', 'restrict' => array('min' => 0), 'std' => !empty($coupon['usage_limit']) ? $coupon['usage_limit'] : ''), array('name' => __('Order subtotal', 'jigoshop'), 'placeholder' => __('No min', 'jigoshop'), 'desc' => __('Min', 'jigoshop'), 'tip' => __('Set the required subtotal for this coupon to be valid on an order.', 'jigoshop'), 'id' => 'order_total_min[' . esc_attr($i) . ']', 'css' => 'width:60px;', 'type' => 'number', 'restrict' => array('min' => 0), 'std' => !empty($coupon['order_total_min']) ? $coupon['order_total_min'] : '', 'group' => true), array('desc' => __('Max', 'jigoshop'), 'placeholder' => __('No max', 'jigoshop'), 'id' => 'order_total_max[' . esc_attr($i) . ']', 'css' => 'width:60px;', 'type' => 'number', 'restrict' => array('min' => 0), 'std' => !empty($coupon['order_total_max']) ? $coupon['order_total_max'] : '', 'group' => true), array('name' => __('Payment methods', 'jigoshop'), 'tip' => __('Which payment methods are allowed for this coupon to be effective?', 'jigoshop'), 'id' => 'coupon_pay_methods[' . esc_attr($i) . '][]', 'css' => 'width:200px;', 'class' => 'chzn-select', 'type' => 'select', 'placeholder' => 'Any method', 'multiple' => true, 'std' => !empty($coupon['coupon_pay_methods']) ? $coupon['coupon_pay_methods'] : '', 'options' => $payment_methods)); jigoshop_admin_option_display($options3); ?> <tr> <th scope="row"> <a href="#" tip="<?php _e('Control which products this coupon can apply to.', 'jigoshop'); ?> " class="tips" tabindex="99"></a> <label for="product_ids_<?php echo esc_attr($i); ?> "><?php _e('Products', 'jigoshop'); ?> </label> </th> <td> <select id="product_ids_<?php echo esc_attr($i); ?> " style="width:200px;" name="product_ids[<?php echo esc_attr($i); ?> ][]" style="width:100px" class="ajax_chosen_select_products_and_variations" multiple="multiple" data-placeholder="<?php _e('Any product', 'jigoshop'); ?> "> <?php $product_ids = $coupon['products']; if ($product_ids) { foreach ($product_ids as $product_id) { $title = get_the_title($product_id); $sku = get_post_meta($product_id, '_sku', true); if (!$title) { continue; } if (isset($sku) && $sku) { $sku = ' (SKU: ' . $sku . ')'; } echo '<option value="' . $product_id . '" selected="selected">' . $title . $sku . '</option>'; } } ?> </select> <?php _e('Include', 'jigoshop'); ?> </td> </tr> <tr> <th scope="row"></th> <td style="padding-top:0px;"> <select id="exclude_product_ids_<?php echo esc_attr($i); ?> " style="width:200px;" name="exclude_product_ids[<?php echo esc_attr($i); ?> ][]" style="width:100px" class="ajax_chosen_select_products_and_variations" multiple="multiple" data-placeholder="<?php _e('Any product', 'jigoshop'); ?> "> <?php if (!empty($coupon['exclude_products'])) { foreach ($coupon['exclude_products'] as $product_id) { $title = get_the_title($product_id); $sku = get_post_meta($product_id, '_sku', true); if (!$title) { continue; } if (isset($sku) && $sku) { $sku = ' (SKU: ' . $sku . ')'; } echo '<option value="' . $product_id . '" selected="selected">' . $title . $sku . '</option>'; } } ?> </select> <?php _e('Exclude', 'jigoshop'); ?> </td> </tr> <?php $options2 = array(array('name' => __('Categories', 'jigoshop'), 'desc' => __('Include', 'jigoshop'), 'tip' => __('Control which categories this coupon can apply to.', 'jigoshop'), 'id' => 'coupon_category[' . esc_attr($i) . '][]', 'type' => 'select', 'multiple' => true, 'std' => !empty($coupon['coupon_category']) ? $coupon['coupon_category'] : '', 'options' => $coupon_cats, 'class' => 'chzn-select', 'css' => 'width:200px;', 'placeholder' => 'Any category', 'group' => true), array('desc' => __('Exclude', 'jigoshop'), 'id' => 'exclude_categories[' . esc_attr($i) . '][]', 'type' => 'select', 'multiple' => true, 'std' => !empty($coupon['exclude_categories']) ? $coupon['exclude_categories'] : '', 'options' => $coupon_cats, 'class' => 'chzn-select', 'css' => 'width:200px;', 'placeholder' => 'Any category', 'group' => true), array('name' => __('Dates allowed', 'jigoshop'), 'desc' => __('From', 'jigoshop'), 'placeholder' => __('Any date', 'jigoshop'), 'tip' => __('Choose between which dates this coupon is enabled.', 'jigoshop'), 'id' => 'coupon_date_from[' . esc_attr($i) . ']', 'css' => 'width:150px;', 'type' => 'text', 'class' => 'date-pick', 'std' => !empty($coupon['date_from']) ? date('Y-m-d', $coupon['date_from']) : '', 'group' => true), array('desc' => __('To', 'jigoshop'), 'placeholder' => __('Any date', 'jigoshop'), 'id' => 'coupon_date_to[' . esc_attr($i) . ']', 'css' => 'width:150px;', 'type' => 'text', 'class' => 'date-pick', 'std' => !empty($coupon['date_to']) ? date('Y-m-d', $coupon['date_to']) : '', 'group' => true), array('name' => __('Misc. settings', 'jigoshop'), 'desc' => 'Prevent other coupons', 'tip' => __('Prevent other coupons from being used while this one is applied to a cart.', 'jigoshop'), 'id' => 'individual[' . esc_attr($i) . ']', 'type' => 'checkbox', 'std' => isset($coupon['individual_use']) && $coupon['individual_use'] == 'yes' ? 'yes' : 'no'), array('desc' => 'Free shipping', 'tip' => __('Show the Free Shipping method on checkout with this enabled.', 'jigoshop'), 'id' => 'coupon_free_shipping[' . esc_attr($i) . ']', 'type' => 'checkbox', 'std' => isset($coupon['coupon_free_shipping']) && $coupon['coupon_free_shipping'] == 'yes' ? 'yes' : 'no')); jigoshop_admin_option_display($options2); ?> </tbody> </table> <script type="text/javascript"> /* <![CDATA[ */ jQuery(function() { jQuery("select#product_ids_<?php echo esc_attr($i); ?> ").ajaxChosen({ method: 'GET', url: '<?php echo !is_ssl() ? str_replace('https', 'http', admin_url('admin-ajax.php')) : admin_url('admin-ajax.php'); ?> ', dataType: 'json', afterTypeDelay: 100, data: { action: 'jigoshop_json_search_products_and_variations', security: '<?php echo wp_create_nonce("search-products"); ?> ' } }, function (data) { var terms = {}; jQuery.each(data, function (i, val) { terms[i] = val; }); return terms; }); jQuery("select#exclude_product_ids_<?php echo esc_attr($i); ?> ").ajaxChosen({ method: 'GET', url: '<?php echo !is_ssl() ? str_replace('https', 'http', admin_url('admin-ajax.php')) : admin_url('admin-ajax.php'); ?> ', dataType: 'json', afterTypeDelay: 100, data: { action: 'jigoshop_json_search_products_and_variations', security: '<?php echo wp_create_nonce("search-products"); ?> ' } }, function (data) { var terms = {}; jQuery.each(data, function (i, val) { terms[i] = val; }); return terms; }); jQuery('.date-pick').datepicker( {dateFormat: 'yy-mm-dd', gotoCurrent: true} ); }); /* ]]> */ </script> </td> <td><?php echo $discount_types[$selected_type]; ?> </td> <td><?php echo !empty($coupon['amount']) ? $coupon['amount'] : ''; ?> </td> <td><?php echo !empty($coupon['usage']) ? $coupon['usage'] : '0'; ?> </td> <td> <a class="toggleCoupon" href="#coupons_rows_<?php echo $i; ?> "><?php _e('Show', 'jigoshop'); ?> </a> / <a href="#" id="remove_coupon_<?php echo esc_attr($i); ?> " class="remove_coupon" title="<?php _e('Delete this Coupon', 'jigoshop'); ?> "><?php _e('Delete', 'jigoshop'); ?> </a> </td> </tr> <?php } } ?> <script type="text/javascript"> jQuery('.couponDisplay').hide(); /* <![CDATA[ */ jQuery(function() { function toggle_coupons() { jQuery('a.toggleCoupon').click(function(e) { e.preventDefault(); jQuery(this).text(jQuery(this).text() == '<?php _e('Show', 'jigoshop'); ?> ' ? '<?php _e('Hide', 'jigoshop'); ?> ' : '<?php _e('Show', 'jigoshop'); ?> '); var id = jQuery(this).attr('href').substr(1); jQuery('#' + id).toggle('slow'); }); } toggle_coupons(); jQuery('#add_coupon').live('click', function(e){ e.preventDefault(); var size = jQuery('.couponDisplay').size(); var new_coupon = '\ <table class="coupon-table form-table" id="coupons_table_' + size + '">\ <tbody class="couponDisplay" id="coupons_rows_[' + size + ']">\ <tr>\ <th scope="row">\ <a href="#" tip="<?php _e('The coupon code a customer enters on the cart or checkout page.', 'jigoshop'); ?> "\ class="tips" tabindex="99"></a>\ <label for="coupon_code[' + size + ']"><?php _e('Code', 'jigoshop'); ?> </label>\ </th>\ <td>\ <input name="coupon_code[' + size + ']" id="coupon_code[' + size + ']" type="text" class="regular-text coupon_code"\ style="width:150px;" placeholder="" value="" />\ <br />\ <small></small>\ </td>\ </tr>\ <tr>\ <th scope="row">\ <a href="#" tip="<?php _e('Cart - Applies to whole cart<br/>Product - Applies to individual products only. You must specify individual products.', 'jigoshop'); ?> "\ class="tips" tabindex="99"></a>\ <label for="coupon_type[' + size + ']"><?php _e('Type', 'jigoshop'); ?> </label>\ </th>\ <td>\ <select name="coupon_type[' + size + ']" id="coupon_type[' + size + ']" style="width:150px;">\ <option value="fixed_cart"><?php _e('Cart Discount', 'jigoshop'); ?> </option>\ <option value="percent"><?php _e('Cart % Discount', 'jigoshop'); ?> </option>\ <option value="fixed_product"><?php _e('Product Discount', 'jigoshop'); ?> </option>\ <option value="percent_product"><?php _e('Product % Discount', 'jigoshop'); ?> </option>\ </select>\ <br />\ <small></small>\ </td>\ </tr>\ <tr>\ <th scope="row">\ <a href="#" tip="<?php _e('Amount this coupon is worth. If it is a percentange, just include the number without the percentage sign.', 'jigoshop'); ?> "\ class="tips" tabindex="99"></a>\ <label for="coupon_amount[' + size + ']"><?php _e('Amount', 'jigoshop'); ?> </label>\ </th>\ <td>\ <input name="coupon_amount[' + size + ']" id="coupon_amount[' + size + ']" type="number" min="0"\ max="" class="regular-text " style="width:60px;" value=""\ />\ <br />\ <small></small>\ </td>\ </tr>\ <tr>\ <th scope="row">\ <a href="#" tip="<?php _e('Control how many times this coupon may be used.', 'jigoshop'); ?> " class="tips"\ tabindex="99"></a>\ <label for="usage_limit[' + size + ']"><?php _e('Usage limit', 'jigoshop'); ?> </label>\ </th>\ <td>\ <input name="usage_limit[' + size + ']" id="usage_limit[' + size + ']" type="number" min="0"\ max="" class="regular-text " style="width:60px;" placeholder="<?php _e('No limit', 'jigoshop'); ?> "\ value="" />\ </td>\ </tr>\ <tr>\ <th scope="row">\ <a href="#" tip="<?php _e('Set the required subtotal for this coupon to be valid on an order.', 'jigoshop'); ?> "\ class="tips" tabindex="99"></a>\ <label for="order_total_min[' + size + ']"><?php _e('Order subtotal', 'jigoshop'); ?> </label>\ </th>\ <td>\ <input name="order_total_min[' + size + ']" id="order_total_min[' + size + ']" type="number"\ min="0" max="" class="regular-text " style="width:60px;" placeholder="<?php _e('No min', 'jigoshop'); ?> "\ value="" /><?php _e('Min', 'jigoshop'); ?> </td>\ </tr>\ <tr>\ <th scope="row" style="padding-top:0px;"></th>\ <td style="padding-top:0px;">\ <input name="order_total_max[' + size + ']" id="order_total_max[' + size + ']" type="number"\ min="0" max="" class="regular-text " style="width:60px;" placeholder="<?php _e('No max', 'jigoshop'); ?> "\ value="" /><?php _e('Max', 'jigoshop'); ?> </td>\ </tr>\ <tr>\ <th scope="row">\ <a href="#" tip="<?php _e('Which payment methods are allowed for this coupon to be effective?', 'jigoshop'); ?> "\ class="tips" tabindex="99"></a>\ <label for="coupon_pay_methods[' + size + '][]"><?php _e('Payment methods', 'jigoshop'); ?> </label>\ </th>\ <td>\ <select name="coupon_pay_methods[' + size + '][]" id="coupon_pay_methods[' + size + '][]" style="width:200px;"\ class="chzn-select" multiple="multiple">\ <?php foreach ($payment_methods as $id => $label) { echo '<option value="' . $id . '">' . $label . '</option>'; } ?> \ </select>\ <br />\ <small></small>\ </td>\ </tr>\ <tr>\ <th scope="row">\ <a href="#" tip="<?php _e('Control which products this coupon can apply to.', 'jigoshop'); ?> " class="tips"\ tabindex="99"></a>\ <label for="product_ids_' + size + '"><?php _e('Products', 'jigoshop'); ?> </label>\ </th>\ <td>\ <select id="product_ids_' + size + '" style="width:200px;" name="product_ids[' + size + '][]"\ style="width:100px" class="ajax_chosen_select_products_and_variations"\ multiple="multiple" data-placeholder="<?php _e('Any product', 'jigoshop'); ?> "></select><?php _e('Include', 'jigoshop'); ?> </td>\ </tr>\ <tr>\ <th scope="row"></th>\ <td style="padding-top:0px;">\ <select id="exclude_product_ids_' + size + '" style="width:200px;" name="exclude_product_ids[' + size + '][]"\ style="width:100px" class="ajax_chosen_select_products_and_variations"\ multiple="multiple" data-placeholder="<?php _e('Any product', 'jigoshop'); ?> "></select><?php _e('Exclude', 'jigoshop'); ?> </td>\ </tr>\ <tr>\ <th scope="row">\ <a href="#" tip="<?php _e('Control which categories this coupon can apply to.', 'jigoshop'); ?> " class="tips"\ tabindex="99"></a>\ <label for="coupon_category[' + size + '][]"><?php _e('Categories', 'jigoshop'); ?> </label>\ </th>\ <td>\ <select name="coupon_category[' + size + '][]" id="coupon_category_' + size + '" style="width:200px;"\ class="chzn-select" multiple="multiple">\ <?php $categories = get_terms('product_cat', array('hide_empty' => false)); foreach ($categories as $category) { echo '<option value="' . $category->term_id . '">' . $category->name . '</option>'; } ?> \ </select><?php _e('Include', 'jigoshop'); ?> </td>\ </tr>\ <tr>\ <th scope="row">\ <label for="exclude_categories[' + size + '][]"></label>\ </th>\ <td>\ <select name="exclude_categories[' + size + '][]" id="exclude_categories_' + size + '" style="width:200px;"\ class="chzn-select" multiple="multiple">\ <?php $categories = get_terms('product_cat', array('hide_empty' => false)); foreach ($categories as $category) { echo '<option value="' . $category->term_id . '">' . $category->name . '</option>'; } ?> \ </select><?php _e('Exclude', 'jigoshop'); ?> </td>\ </tr>\ <tr>\ <th scope="row">\ <a href="#" tip="<?php _e('Choose between which dates this coupon is enabled.', 'jigoshop'); ?> " class="tips"\ tabindex="99"></a>\ <label for="coupon_date_from[' + size + ']"><?php _e('Dates allowed', 'jigoshop'); ?> </label>\ </th>\ <td>\ <input name="coupon_date_from[' + size + ']" id="coupon_date_from[' + size + ']" type="text"\ class="regular-text date-pick" style="width:150px;" placeholder="<?php _e('Any date', 'jigoshop'); ?> "\ value="" /><?php _e('From', 'jigoshop'); ?> </td>\ </tr>\ <tr>\ <th scope="row" style="padding-top:0px;"></th>\ <td style="padding-top:0px;">\ <input name="coupon_date_to[' + size + ']" id="coupon_date_to[' + size + ']" type="text" class="regular-text date-pick"\ style="width:150px;" placeholder="<?php _e('Any date', 'jigoshop'); ?> " value="" /><?php _e('To', 'jigoshop'); ?> </td>\ </tr>\ <tr>\ <th scope="row">\ <a href="#" tip="<?php _e('Prevent other coupons from being used while this one is applied to a cart.', 'jigoshop'); ?> "\ class="tips" tabindex="99"></a>\ <label for="individual[' + size + ']"><?php _e('Misc. settings', 'jigoshop'); ?> </label>\ </th>\ <td>\ <input id="individual[' + size + ']" type="checkbox" class="jigoshop-input jigoshop-checkbox "\ style="" name="individual[' + size + ']" />\ <label for="individual[' + size + ']"><?php _e('Prevent other coupons', 'jigoshop'); ?> </label>\ </td>\ </tr>\ <tr>\ <th scope="row" style="padding-top:0px;">\ <a href="#" tip="<?php _e('Show the Free Shipping method on checkout with this enabled.', 'jigoshop'); ?> "\ class="tips" tabindex="99"></a>\ </th>\ <td style="padding-top:0px;">\ <input id="coupon_free_shipping[' + size + ']" type="checkbox" class="jigoshop-input jigoshop-checkbox "\ style="" name="coupon_free_shipping[' + size + ']" />\ <label for="coupon_free_shipping[' + size + ']"><?php _e('Free shipping', 'jigoshop'); ?> </label>\ </td>\ </tr>\ </tbody>\ </table>\ '; /* Add the table */ jQuery('.coupons.table').before(new_coupon); jQuery('#coupons_table_' + size).hide().fadeIn('slow'); jQuery("select#product_ids_" + size).ajaxChosen({ method: 'GET', url: '<?php echo !is_ssl() ? str_replace('https', 'http', admin_url('admin-ajax.php')) : admin_url('admin-ajax.php'); ?> ', dataType: 'json', afterTypeDelay: 100, data: { action: 'jigoshop_json_search_products_and_variations', security: '<?php echo wp_create_nonce("search-products"); ?> ' } }, function (data) { var terms = {}; jQuery.each(data, function (i, val) { terms[i] = val; }); return terms; }); jQuery("select#exclude_product_ids_" + size).ajaxChosen({ method: 'GET', url: '<?php echo !is_ssl() ? str_replace('https', 'http', admin_url('admin-ajax.php')) : admin_url('admin-ajax.php'); ?> ', dataType: 'json', afterTypeDelay: 100, data: { action: 'jigoshop_json_search_products_and_variations', security: '<?php echo wp_create_nonce("search-products"); ?> ' } }, function (data) { var terms = {}; jQuery.each(data, function (i, val) { terms[i] = val; }); return terms; }); jQuery('a[href="#coupons_rows_'+size+'"]').click(function(e) { e.preventDefault(); jQuery('#coupons_rows_'+size).toggle('slow', function() { // Stuff later? }); }); jQuery(".chzn-select").chosen(); jQuery(".tips").tooltip(); jQuery('.date-pick').datepicker( {dateFormat: 'yy-mm-dd', gotoCurrent: true} ); return false; }); jQuery('a.remove_coupon').live('click', function(){ var answer = confirm("<?php _e('Delete this coupon?', 'jigoshop'); ?> ") if (answer) { jQuery('input', jQuery(this).parent().parent().children()).val(''); jQuery(this).parent().parent().fadeOut(); } return false; }); }); /* ]]> */ </script> <?php break; case 'tax_rates': $_tax = new jigoshop_tax(); $tax_classes = $_tax->get_tax_classes(); $tax_rates = get_option('jigoshop_tax_rates'); $applied_all_states = array(); ?> <tr> <th><?php if ($value['tip']) { ?> <a href="#" tip="<?php echo $value['tip']; ?> " class="tips" tabindex="99"></a><?php } ?> <label><?php echo $value['name']; ?> </label></th> <td id="tax_rates"> <div class="taxrows"> <?php $i = -1; if ($tax_rates && is_array($tax_rates) && sizeof($tax_rates) > 0) { function array_find($needle, $haystack) { foreach ($haystack as $key => $val) { if ($needle == array("label" => $val['label'], "compound" => $val['compound'], 'rate' => $val['rate'], 'shipping' => $val['shipping'], 'is_all_states' => $val['is_all_states'], 'class' => $val['class'])) { return $key; } } return false; } function array_compare($tax_rates) { $after = array(); foreach ($tax_rates as $key => $val) { $first_two = array("label" => $val['label'], "compound" => $val['compound'], 'rate' => $val['rate'], 'shipping' => $val['shipping'], 'is_all_states' => $val['is_all_states'], 'class' => $val['class']); $found = array_find($first_two, $after); if ($found !== false) { $combined = $after[$found]["state"]; $combined2 = $after[$found]["country"]; $combined = !is_array($combined) ? array($combined) : $combined; $combined2 = !is_array($combined2) ? array($combined2) : $combined2; $after[$found] = array_merge($first_two, array("state" => array_merge($combined, array($val['state'])), "country" => array_merge($combined2, array($val['country'])))); } else { $after = array_merge($after, array(array_merge($first_two, array("state" => $val['state'], "country" => $val['country'])))); } } return $after; } $tax_rates = array_compare($tax_rates); foreach ($tax_rates as $rate) { if ($rate['is_all_states'] && in_array(get_all_states_key($rate), $applied_all_states)) { continue; } $i++; // increment counter after check for all states having been applied echo '<p class="taxrow"> <select name="tax_classes[' . esc_attr($i) . ']" title="Tax Classes"> <option value="*">' . __('Standard Rate', 'jigoshop') . '</option>'; if ($tax_classes) { foreach ($tax_classes as $class) { echo '<option value="' . sanitize_title($class) . '"'; if ($rate['class'] == sanitize_title($class)) { echo 'selected="selected"'; } echo '>' . $class . '</option>'; } } echo '</select> <input type="text" class="text" value="' . esc_attr($rate['label']) . '" name="tax_label[' . esc_attr($i) . ']" title="' . __('Online Label', 'jigoshop') . '" placeholder="' . __('Online Label', 'jigoshop') . '" maxlength="15" />'; echo '<select name="tax_country[' . esc_attr($i) . '][]" title="Country" multiple="multiple" style="width:250px;">'; if ($rate['is_all_states']) { if (is_array($applied_all_states) && !in_array(get_all_states_key($rate), $applied_all_states)) { $applied_all_states[] = get_all_states_key($rate); jigoshop_countries::country_dropdown_options($rate['country'], '*'); //all-states } else { continue; } } else { jigoshop_countries::country_dropdown_options($rate['country'], $rate['state']); } echo '</select> <input type="text" class="text" value="' . esc_attr($rate['rate']) . '" name="tax_rate[' . esc_attr($i) . ']" title="' . __('Rate', 'jigoshop') . '" placeholder="' . __('Rate', 'jigoshop') . '" maxlength="8" />% <label><input type="checkbox" name="tax_shipping[' . esc_attr($i) . ']" '; if (isset($rate['shipping']) && $rate['shipping'] == 'yes') { echo 'checked="checked"'; } echo ' /> ' . __('Apply to shipping', 'jigoshop') . '</label> <label><input type="checkbox" name="tax_compound[' . esc_attr($i) . ']" '; if (isset($rate['compound']) && $rate['compound'] == 'yes') { echo 'checked="checked"'; } echo ' /> ' . __('Compound', 'jigoshop') . '</label> <a href="#" class="remove button">×</a></p>'; } } ?> </div> <p><a href="#" class="add button"><?php _e('+ Add Tax Rule', 'jigoshop'); ?> </a></p> </td> </tr> <script type="text/javascript"> /* <![CDATA[ */ jQuery(function() { jQuery('#tax_rates a.add').live('click', function(){ var size = jQuery('.taxrows .taxrow').size(); // Add the row jQuery('<p class="taxrow"> \ <select name="tax_classes[' + size + ']" title="Tax Classes"> \ <option value="*"><?php _e('Standard Rate', 'jigoshop'); ?> </option><?php $tax_classes = $_tax->get_tax_classes(); if ($tax_classes) { foreach ($tax_classes as $class) { echo '<option value="' . sanitize_title($class) . '">' . $class . '</option>'; } } ?> </select><input type="text" class="text" name="tax_label[' + size + ']" title="<?php _e('Online Label', 'jigoshop'); ?> " placeholder="<?php _e('Online Label', 'jigoshop'); ?> " maxlength="15" />\ </select><select name="tax_country[' + size + '][]" title="Country" multiple="multiple"><?php jigoshop_countries::country_dropdown_options('', '', true); ?> </select><input type="text" class="text" name="tax_rate[' + size + ']" title="<?php _e('Rate', 'jigoshop'); ?> " placeholder="<?php _e('Rate', 'jigoshop'); ?> " maxlength="8" />%\ <label><input type="checkbox" name="tax_shipping[' + size + ']" /> <?php _e('Apply to shipping', 'jigoshop'); ?> </label>\ <label><input type="checkbox" name="tax_compound[' + size + ']" /> <?php _e('Compound', 'jigoshop'); ?> </label><a href="#" class="remove button">×</a>\ </p>').appendTo('#tax_rates div.taxrows'); return false; }); jQuery('#tax_rates a.remove').live('click', function(){ var answer = confirm("<?php _e('Delete this rule?', 'jigoshop'); ?> "); if (answer) { jQuery('input', jQuery(this).parent()).val(''); jQuery(this).parent().hide(); } return false; }); }); /* ]]> */ </script> <?php break; case "shipping_options": foreach (jigoshop_shipping::get_all_methods() as $method) { $method->admin_options(); } break; case "gateway_options": foreach (jigoshop_payment_gateways::payment_gateways() as $gateway) { $gateway->admin_options(); } break; } } }