2013-07-24 16:01:36 +00:00
< ? php
/**
2015-11-03 13:53:50 +00:00
* WooCommerce Admin Functions
2013-07-24 16:01:36 +00:00
*
2015-06-16 16:08:30 +00:00
* @ author WooThemes
* @ category Core
* @ package WooCommerce / Admin / Functions
* @ version 2.4 . 0
2013-07-24 16:01:36 +00:00
*/
2014-09-20 19:52:30 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
exit ; // Exit if accessed directly
}
2013-07-24 16:01:36 +00:00
/**
2015-11-03 13:31:20 +00:00
* Get all WooCommerce screen ids .
2013-07-24 16:01:36 +00:00
*
* @ return array
*/
2013-07-25 15:29:25 +00:00
function wc_get_screen_ids () {
2014-11-30 06:52:32 +00:00
2014-02-14 10:57:48 +00:00
$wc_screen_id = sanitize_title ( __ ( 'WooCommerce' , 'woocommerce' ) );
2014-07-20 23:53:43 +00:00
$screen_ids = array (
'toplevel_page_' . $wc_screen_id ,
$wc_screen_id . '_page_wc-reports' ,
2015-12-08 12:45:18 +00:00
$wc_screen_id . '_page_wc-shipping' ,
2014-07-20 23:53:43 +00:00
$wc_screen_id . '_page_wc-settings' ,
$wc_screen_id . '_page_wc-status' ,
$wc_screen_id . '_page_wc-addons' ,
2015-02-24 12:29:03 +00:00
'toplevel_page_wc-reports' ,
2014-07-20 23:53:43 +00:00
'product_page_product_attributes' ,
'edit-product' ,
'product' ,
'edit-shop_coupon' ,
'shop_coupon' ,
'edit-product_cat' ,
'edit-product_tag' ,
2015-02-15 20:36:18 +00:00
'profile' ,
'user-edit'
2014-07-20 23:53:43 +00:00
);
foreach ( wc_get_order_types () as $type ) {
$screen_ids [] = $type ;
$screen_ids [] = 'edit-' . $type ;
}
return apply_filters ( 'woocommerce_screen_ids' , $screen_ids );
2013-07-25 15:29:25 +00:00
}
/**
* Create a page and store the ID in an option .
*
* @ param mixed $slug Slug for the new page
2014-09-07 23:37:55 +00:00
* @ param string $option Option name to store the page ' s ID
2013-07-25 15:29:25 +00:00
* @ param string $page_title ( default : '' ) Title for the new page
* @ param string $page_content ( default : '' ) Content for the new page
* @ param int $post_parent ( default : 0 ) Parent for the new page
* @ return int page ID
*/
function wc_create_page ( $slug , $option = '' , $page_title = '' , $page_content = '' , $post_parent = 0 ) {
2014-07-20 23:53:43 +00:00
global $wpdb ;
2013-07-25 15:29:25 +00:00
2015-06-16 16:08:30 +00:00
$option_value = get_option ( $option );
2015-06-16 11:31:15 +00:00
2015-09-07 13:17:22 +00:00
if ( $option_value > 0 ) {
$page_object = get_post ( $option_value );
if ( 'page' === $page_object -> post_type && ! in_array ( $page_object -> post_status , array ( 'pending' , 'trash' , 'future' , 'auto-draft' ) ) ) {
// Valid page is already in place
return $page_object -> ID ;
2015-06-16 11:31:15 +00:00
}
2014-09-22 18:30:07 +00:00
}
2015-06-16 16:08:30 +00:00
2014-07-20 23:53:43 +00:00
if ( strlen ( $page_content ) > 0 ) {
// Search for an existing page with the specified page content (typically a shortcode)
2015-09-07 13:17:22 +00:00
$valid_page_found = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_type='page' AND post_status NOT IN ( 'pending', 'trash', 'future', 'auto-draft' ) AND post_content LIKE %s LIMIT 1; " , " % { $page_content } % " ) );
2014-07-20 23:53:43 +00:00
} else {
// Search for an existing page with the specified page slug
2015-09-07 13:17:22 +00:00
$valid_page_found = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_type='page' AND post_status NOT IN ( 'pending', 'trash', 'future', 'auto-draft' ) AND post_name = %s LIMIT 1; " , $slug ) );
2014-07-20 23:53:43 +00:00
}
2013-07-25 15:29:25 +00:00
2015-09-07 13:17:22 +00:00
$valid_page_found = apply_filters ( 'woocommerce_create_page_id' , $valid_page_found , $slug , $page_content );
2015-06-16 11:31:15 +00:00
2015-09-07 13:17:22 +00:00
if ( $valid_page_found ) {
if ( $option ) {
update_option ( $option , $valid_page_found );
2014-08-13 09:59:37 +00:00
}
2015-09-07 13:17:22 +00:00
return $valid_page_found ;
2014-07-20 23:53:43 +00:00
}
2015-09-07 13:17:22 +00:00
// Search for a matching valid trashed page
if ( strlen ( $page_content ) > 0 ) {
// Search for an existing page with the specified page content (typically a shortcode)
$trashed_page_found = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_type='page' AND post_status = 'trash' AND post_content LIKE %s LIMIT 1; " , " % { $page_content } % " ) );
} else {
// Search for an existing page with the specified page slug
$trashed_page_found = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_type='page' AND post_status = 'trash' AND post_name = %s LIMIT 1; " , $slug ) );
2015-06-16 11:31:15 +00:00
}
2014-07-20 23:53:43 +00:00
2015-09-07 13:17:22 +00:00
if ( $trashed_page_found ) {
$page_id = $trashed_page_found ;
$page_data = array (
'ID' => $page_id ,
'post_status' => 'publish' ,
);
wp_update_post ( $page_data );
} else {
2015-06-16 11:31:15 +00:00
$page_data = array (
'post_status' => 'publish' ,
'post_type' => 'page' ,
'post_author' => 1 ,
'post_name' => $slug ,
'post_title' => $page_title ,
'post_content' => $page_content ,
'post_parent' => $post_parent ,
'comment_status' => 'closed'
);
2015-09-07 13:17:22 +00:00
$page_id = wp_insert_post ( $page_data );
2015-06-16 11:31:15 +00:00
}
2014-07-20 23:53:43 +00:00
2014-08-13 09:59:37 +00:00
if ( $option ) {
2014-07-20 23:53:43 +00:00
update_option ( $option , $page_id );
2014-08-13 09:59:37 +00:00
}
2014-07-20 23:53:43 +00:00
return $page_id ;
2013-07-26 14:36:28 +00:00
}
/**
* Output admin fields .
*
* Loops though the woocommerce options array and outputs each field .
*
* @ param array $options Opens array to output
*/
function woocommerce_admin_fields ( $options ) {
2014-11-30 06:52:32 +00:00
2014-09-22 18:30:07 +00:00
if ( ! class_exists ( 'WC_Admin_Settings' ) ) {
2014-07-20 23:53:43 +00:00
include 'class-wc-admin-settings.php' ;
2014-09-22 18:30:07 +00:00
}
2013-07-26 14:36:28 +00:00
2014-07-20 23:53:43 +00:00
WC_Admin_Settings :: output_fields ( $options );
2013-07-26 14:36:28 +00:00
}
/**
* Update all settings which are passed .
*
* @ param array $options
*/
function woocommerce_update_options ( $options ) {
2014-11-30 06:52:32 +00:00
2014-09-22 18:30:07 +00:00
if ( ! class_exists ( 'WC_Admin_Settings' ) ) {
2014-07-20 23:53:43 +00:00
include 'class-wc-admin-settings.php' ;
2014-09-22 18:30:07 +00:00
}
2013-07-26 14:36:28 +00:00
2014-07-20 23:53:43 +00:00
WC_Admin_Settings :: save_fields ( $options );
2013-07-26 14:36:28 +00:00
}
/**
* Get a setting from the settings API .
*
2014-09-07 23:37:55 +00:00
* @ param mixed $option_name
2016-01-05 15:49:41 +00:00
* @ param mixed $default
2013-07-26 14:36:28 +00:00
* @ return string
*/
function woocommerce_settings_get_option ( $option_name , $default = '' ) {
2014-11-30 06:52:32 +00:00
2014-09-22 18:30:07 +00:00
if ( ! class_exists ( 'WC_Admin_Settings' ) ) {
2014-07-20 23:53:43 +00:00
include 'class-wc-admin-settings.php' ;
2014-09-22 18:30:07 +00:00
}
2013-07-26 14:36:28 +00:00
2014-07-20 23:53:43 +00:00
return WC_Admin_Settings :: get_option ( $option_name , $default );
2013-08-06 15:56:15 +00:00
}
2014-07-17 20:17:54 +00:00
/**
2015-11-03 13:31:20 +00:00
* Save order items .
2014-07-17 20:17:54 +00:00
*
* @ since 2.2
* @ param int $order_id Order ID
* @ param array $items Order items to save
*/
function wc_save_order_items ( $order_id , $items ) {
global $wpdb ;
// Order items + fees
2014-11-25 13:05:03 +00:00
$subtotal = 0 ;
$total = 0 ;
$subtotal_tax = 0 ;
$total_tax = 0 ;
$taxes = array ( 'items' => array (), 'shipping' => array () );
2014-07-17 20:17:54 +00:00
if ( isset ( $items [ 'order_item_id' ] ) ) {
2014-12-01 23:55:48 +00:00
$line_total = $line_subtotal = $line_tax = $line_subtotal_tax = array ();
2014-07-17 20:17:54 +00:00
2014-12-01 23:55:48 +00:00
foreach ( $items [ 'order_item_id' ] as $item_id ) {
2014-07-17 20:17:54 +00:00
$item_id = absint ( $item_id );
2014-12-01 23:55:48 +00:00
if ( isset ( $items [ 'order_item_name' ][ $item_id ] ) ) {
2014-07-17 20:17:54 +00:00
$wpdb -> update (
$wpdb -> prefix . 'woocommerce_order_items' ,
2015-11-12 21:19:57 +00:00
array ( 'order_item_name' => wc_clean ( wp_unslash ( $items [ 'order_item_name' ][ $item_id ] ) ) ),
2014-07-17 20:17:54 +00:00
array ( 'order_item_id' => $item_id ),
array ( '%s' ),
array ( '%d' )
);
}
2014-12-01 23:55:48 +00:00
if ( isset ( $items [ 'order_item_qty' ][ $item_id ] ) ) {
wc_update_order_item_meta ( $item_id , '_qty' , wc_stock_amount ( $items [ 'order_item_qty' ][ $item_id ] ) );
2014-07-17 20:17:54 +00:00
}
2014-12-01 23:55:48 +00:00
if ( isset ( $items [ 'order_item_tax_class' ][ $item_id ] ) ) {
wc_update_order_item_meta ( $item_id , '_tax_class' , wc_clean ( $items [ 'order_item_tax_class' ][ $item_id ] ) );
2014-07-17 20:17:54 +00:00
}
// Get values. Subtotals might not exist, in which case copy value from total field
2014-12-01 23:55:48 +00:00
$line_total [ $item_id ] = isset ( $items [ 'line_total' ][ $item_id ] ) ? $items [ 'line_total' ][ $item_id ] : 0 ;
$line_subtotal [ $item_id ] = isset ( $items [ 'line_subtotal' ][ $item_id ] ) ? $items [ 'line_subtotal' ][ $item_id ] : $line_total [ $item_id ];
$line_tax [ $item_id ] = isset ( $items [ 'line_tax' ][ $item_id ] ) ? $items [ 'line_tax' ][ $item_id ] : array ();
$line_subtotal_tax [ $item_id ] = isset ( $items [ 'line_subtotal_tax' ][ $item_id ] ) ? $items [ 'line_subtotal_tax' ][ $item_id ] : $line_tax [ $item_id ];
2014-07-17 20:17:54 +00:00
2014-10-14 11:20:38 +00:00
// Format taxes
$line_taxes = array_map ( 'wc_format_decimal' , $line_tax [ $item_id ] );
$line_subtotal_taxes = array_map ( 'wc_format_decimal' , $line_subtotal_tax [ $item_id ] );
2014-07-17 20:17:54 +00:00
// Update values
wc_update_order_item_meta ( $item_id , '_line_subtotal' , wc_format_decimal ( $line_subtotal [ $item_id ] ) );
wc_update_order_item_meta ( $item_id , '_line_total' , wc_format_decimal ( $line_total [ $item_id ] ) );
2014-10-14 11:20:38 +00:00
wc_update_order_item_meta ( $item_id , '_line_subtotal_tax' , array_sum ( $line_subtotal_taxes ) );
wc_update_order_item_meta ( $item_id , '_line_tax' , array_sum ( $line_taxes ) );
2014-07-20 03:21:33 +00:00
// Save line tax data - Since 2.2
2014-10-14 11:20:38 +00:00
wc_update_order_item_meta ( $item_id , '_line_tax_data' , array ( 'total' => $line_taxes , 'subtotal' => $line_subtotal_taxes ) );
$taxes [ 'items' ][] = $line_taxes ;
2014-07-17 20:17:54 +00:00
// Total up
2015-02-23 17:39:54 +00:00
$subtotal += wc_format_decimal ( $line_subtotal [ $item_id ] );
$total += wc_format_decimal ( $line_total [ $item_id ] );
2014-11-25 13:05:03 +00:00
$subtotal_tax += array_sum ( $line_subtotal_taxes );
$total_tax += array_sum ( $line_taxes );
2014-07-17 20:17:54 +00:00
// Clear meta cache
wp_cache_delete ( $item_id , 'order_item_meta' );
}
}
// Save meta
$meta_keys = isset ( $items [ 'meta_key' ] ) ? $items [ 'meta_key' ] : array ();
$meta_values = isset ( $items [ 'meta_value' ] ) ? $items [ 'meta_value' ] : array ();
foreach ( $meta_keys as $id => $meta_key ) {
$meta_value = ( empty ( $meta_values [ $id ] ) && ! is_numeric ( $meta_values [ $id ] ) ) ? '' : $meta_values [ $id ];
2015-06-15 15:22:53 +00:00
// Delele blank item meta entries
2015-06-15 16:06:02 +00:00
if ( $meta_key === '' && $meta_value === '' ) {
2015-06-15 15:22:53 +00:00
$wpdb -> query ( $wpdb -> prepare ( " DELETE FROM { $wpdb -> prefix } woocommerce_order_itemmeta WHERE meta_id = %d " , $id ) );
2015-09-18 15:28:13 +00:00
} else {
2015-06-15 15:22:53 +00:00
$wpdb -> update (
$wpdb -> prefix . 'woocommerce_order_itemmeta' ,
array (
'meta_key' => wp_unslash ( $meta_key ),
'meta_value' => wp_unslash ( $meta_value )
),
array ( 'meta_id' => $id ),
array ( '%s' , '%s' ),
array ( '%d' )
);
}
2014-07-17 20:17:54 +00:00
}
// Shipping Rows
$order_shipping = 0 ;
if ( isset ( $items [ 'shipping_method_id' ] ) ) {
2014-12-01 23:55:48 +00:00
foreach ( $items [ 'shipping_method_id' ] as $item_id ) {
2014-07-20 04:28:16 +00:00
$item_id = absint ( $item_id );
2014-12-01 23:55:48 +00:00
$method_id = isset ( $items [ 'shipping_method' ][ $item_id ] ) ? wc_clean ( $items [ 'shipping_method' ][ $item_id ] ) : '' ;
2015-09-18 15:28:13 +00:00
$method_title = isset ( $items [ 'shipping_method_title' ][ $item_id ] ) ? wc_clean ( wp_unslash ( $items [ 'shipping_method_title' ][ $item_id ] ) ) : '' ;
2014-12-01 23:55:48 +00:00
$cost = isset ( $items [ 'shipping_cost' ][ $item_id ] ) ? wc_format_decimal ( $items [ 'shipping_cost' ][ $item_id ] ) : '' ;
$ship_taxes = isset ( $items [ 'shipping_taxes' ][ $item_id ] ) ? array_map ( 'wc_format_decimal' , $items [ 'shipping_taxes' ][ $item_id ] ) : array ();
2014-07-20 04:28:16 +00:00
$wpdb -> update (
$wpdb -> prefix . 'woocommerce_order_items' ,
array ( 'order_item_name' => $method_title ),
array ( 'order_item_id' => $item_id ),
array ( '%s' ),
array ( '%d' )
);
wc_update_order_item_meta ( $item_id , 'method_id' , $method_id );
wc_update_order_item_meta ( $item_id , 'cost' , $cost );
wc_update_order_item_meta ( $item_id , 'taxes' , $ship_taxes );
2014-07-20 23:53:43 +00:00
$taxes [ 'shipping' ][] = $ship_taxes ;
2014-07-20 04:28:16 +00:00
$order_shipping += $cost ;
2014-07-17 20:17:54 +00:00
}
}
2014-07-20 23:53:43 +00:00
// Taxes
$order_taxes = isset ( $items [ 'order_taxes' ] ) ? $items [ 'order_taxes' ] : array ();
$taxes_items = array ();
$taxes_shipping = array ();
$total_tax = 0 ;
$total_shipping_tax = 0 ;
// Sum items taxes
foreach ( $taxes [ 'items' ] as $rates ) {
2014-11-30 06:52:32 +00:00
2014-07-20 23:53:43 +00:00
foreach ( $rates as $id => $value ) {
2014-11-30 06:52:32 +00:00
2014-07-20 23:53:43 +00:00
if ( isset ( $taxes_items [ $id ] ) ) {
$taxes_items [ $id ] += $value ;
} else {
$taxes_items [ $id ] = $value ;
}
}
}
// Sum shipping taxes
foreach ( $taxes [ 'shipping' ] as $rates ) {
2014-11-30 06:52:32 +00:00
2014-07-20 23:53:43 +00:00
foreach ( $rates as $id => $value ) {
2014-11-30 06:52:32 +00:00
2014-07-20 23:53:43 +00:00
if ( isset ( $taxes_shipping [ $id ] ) ) {
$taxes_shipping [ $id ] += $value ;
} else {
$taxes_shipping [ $id ] = $value ;
}
}
}
// Update order taxes
foreach ( $order_taxes as $item_id => $rate_id ) {
2014-11-30 06:52:32 +00:00
2014-07-20 23:53:43 +00:00
if ( isset ( $taxes_items [ $rate_id ] ) ) {
$_total = wc_format_decimal ( $taxes_items [ $rate_id ] );
wc_update_order_item_meta ( $item_id , 'tax_amount' , $_total );
$total_tax += $_total ;
}
if ( isset ( $taxes_shipping [ $rate_id ] ) ) {
$_total = wc_format_decimal ( $taxes_shipping [ $rate_id ] );
wc_update_order_item_meta ( $item_id , 'shipping_tax_amount' , $_total );
$total_shipping_tax += $_total ;
}
}
2014-07-17 20:17:54 +00:00
// Update order shipping total
update_post_meta ( $order_id , '_order_shipping' , $order_shipping );
// Update cart discount from item totals
update_post_meta ( $order_id , '_cart_discount' , $subtotal - $total );
2014-11-25 13:05:03 +00:00
update_post_meta ( $order_id , '_cart_discount_tax' , $subtotal_tax - $total_tax );
2014-07-18 20:24:34 +00:00
// Update totals
update_post_meta ( $order_id , '_order_total' , wc_format_decimal ( $items [ '_order_total' ] ) );
2014-07-20 23:53:43 +00:00
// Update tax
update_post_meta ( $order_id , '_order_tax' , wc_format_decimal ( $total_tax ) );
update_post_meta ( $order_id , '_order_shipping_tax' , wc_format_decimal ( $total_shipping_tax ) );
2014-07-18 20:24:34 +00:00
// Remove old values
delete_post_meta ( $order_id , '_shipping_method' );
delete_post_meta ( $order_id , '_shipping_method_title' );
// Set the currency
add_post_meta ( $order_id , '_order_currency' , get_woocommerce_currency (), true );
2014-09-19 15:57:02 +00:00
2015-03-16 12:17:09 +00:00
// Update version after saving
update_post_meta ( $order_id , '_order_version' , WC_VERSION );
2014-09-19 15:57:02 +00:00
// inform other plugins that the items have been saved
2014-09-19 16:08:54 +00:00
do_action ( 'woocommerce_saved_order_items' , $order_id , $items );
2014-07-17 20:17:54 +00:00
}
2015-10-23 03:40:52 +00:00
/**
* Display a WooCommerce help tip .
*
* @ since 2.5 . 0
*
2015-11-10 01:28:53 +00:00
* @ param string $tip Help tip text
* @ param bool $allow_html Allow sanitized HTML if true or escape
2015-10-23 03:40:52 +00:00
* @ return string
*/
2015-10-23 15:09:08 +00:00
function wc_help_tip ( $tip , $allow_html = false ) {
2015-10-23 03:40:52 +00:00
if ( $allow_html ) {
$tip = wc_sanitize_tooltip ( $tip );
} else {
$tip = esc_attr ( $tip );
}
2015-10-23 15:17:35 +00:00
return '<span class="woocommerce-help-tip" data-tip="' . $tip . '"></span>' ;
2015-10-23 03:40:52 +00:00
}