Issues (1182)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

includes/admin/class-wc-admin-assets.php (2 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * Load assets
4
 *
5
 * @author      WooThemes
6
 * @category    Admin
7
 * @package     WooCommerce/Admin
8
 * @version     2.1.0
9
 */
10
11
if ( ! defined( 'ABSPATH' ) ) {
12
	exit;
13
}
14
15
if ( ! class_exists( 'WC_Admin_Assets' ) ) :
16
17
/**
18
 * WC_Admin_Assets Class.
19
 */
20
class WC_Admin_Assets {
21
22
	/**
23
	 * Hook in tabs.
24
	 */
25
	public function __construct() {
26
		add_action( 'admin_enqueue_scripts', array( $this, 'admin_styles' ) );
27
		add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
28
		add_action( 'admin_head',            array( $this, 'product_taxonomy_styles' ) );
29
	}
30
31
	/**
32
	 * Enqueue styles.
33
	 */
34
	public function admin_styles() {
35
		global $wp_scripts;
36
37
		$screen         = get_current_screen();
38
		$screen_id      = $screen ? $screen->id : '';
39
		$jquery_version = isset( $wp_scripts->registered['jquery-ui-core']->ver ) ? $wp_scripts->registered['jquery-ui-core']->ver : '1.9.2';
40
41
		// Register admin styles
42
		wp_register_style( 'woocommerce_admin_menu_styles', WC()->plugin_url() . '/assets/css/menu.css', array(), WC_VERSION );
43
		wp_register_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', array(), WC_VERSION );
44
		wp_register_style( 'jquery-ui-style', '//code.jquery.com/ui/' . $jquery_version . '/themes/smoothness/jquery-ui.css', array(), $jquery_version );
45
		wp_register_style( 'woocommerce_admin_dashboard_styles', WC()->plugin_url() . '/assets/css/dashboard.css', array(), WC_VERSION );
46
		wp_register_style( 'woocommerce_admin_print_reports_styles', WC()->plugin_url() . '/assets/css/reports-print.css', array(), WC_VERSION, 'print' );
47
48
		// Sitewide menu CSS
49
		wp_enqueue_style( 'woocommerce_admin_menu_styles' );
50
51
		// Admin styles for WC pages only
52
		if ( in_array( $screen_id, wc_get_screen_ids() ) ) {
53
			wp_enqueue_style( 'woocommerce_admin_styles' );
54
			wp_enqueue_style( 'jquery-ui-style' );
55
			wp_enqueue_style( 'wp-color-picker' );
56
		}
57
58
		if ( in_array( $screen_id, array( 'dashboard' ) ) ) {
59
			wp_enqueue_style( 'woocommerce_admin_dashboard_styles' );
60
		}
61
62
		if ( in_array( $screen_id, array( 'woocommerce_page_wc-reports', 'toplevel_page_wc-reports' ) ) ) {
63
			wp_enqueue_style( 'woocommerce_admin_print_reports_styles' );
64
		}
65
66
		/**
67
		 * @deprecated 2.3
68
		 */
69
70
		if ( has_action( 'woocommerce_admin_css' ) ) {
71
			do_action( 'woocommerce_admin_css' );
72
			_deprecated_function( 'The woocommerce_admin_css action', '2.3', 'admin_enqueue_scripts' );
73
		}
74
	}
75
76
77
	/**
78
	 * Enqueue scripts.
79
	 */
80
	public function admin_scripts() {
81
		global $wp_query, $post;
82
83
		$screen       = get_current_screen();
84
		$screen_id    = $screen ? $screen->id : '';
85
		$wc_screen_id = sanitize_title( __( 'WooCommerce', 'woocommerce' ) );
86
		$suffix       = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
87
88
		// Register scripts
89
		wp_register_script( 'woocommerce_admin', WC()->plugin_url() . '/assets/js/admin/woocommerce_admin' . $suffix . '.js', array( 'jquery', 'jquery-blockui', 'jquery-ui-sortable', 'jquery-ui-widget', 'jquery-ui-core', 'jquery-tiptip' ), WC_VERSION );
90
		wp_register_script( 'jquery-blockui', WC()->plugin_url() . '/assets/js/jquery-blockui/jquery.blockUI' . $suffix . '.js', array( 'jquery' ), '2.70', true );
91
		wp_register_script( 'jquery-tiptip', WC()->plugin_url() . '/assets/js/jquery-tiptip/jquery.tipTip' . $suffix . '.js', array( 'jquery' ), WC_VERSION, true );
92
		wp_register_script( 'accounting', WC()->plugin_url() . '/assets/js/accounting/accounting' . $suffix . '.js', array( 'jquery' ), '0.4.2' );
93
		wp_register_script( 'round', WC()->plugin_url() . '/assets/js/round/round' . $suffix . '.js', array( 'jquery' ), WC_VERSION );
94
		wp_register_script( 'wc-admin-meta-boxes', WC()->plugin_url() . '/assets/js/admin/meta-boxes' . $suffix . '.js', array( 'jquery', 'jquery-ui-datepicker', 'jquery-ui-sortable', 'accounting', 'round', 'wc-enhanced-select', 'plupload-all', 'stupidtable', 'jquery-tiptip' ), WC_VERSION );
95
		wp_register_script( 'zeroclipboard', WC()->plugin_url() . '/assets/js/zeroclipboard/jquery.zeroclipboard' . $suffix . '.js', array( 'jquery' ), WC_VERSION );
96
		wp_register_script( 'qrcode', WC()->plugin_url() . '/assets/js/jquery-qrcode/jquery.qrcode' . $suffix . '.js', array( 'jquery' ), WC_VERSION );
97
		wp_register_script( 'stupidtable', WC()->plugin_url() . '/assets/js/stupidtable/stupidtable' . $suffix . '.js', array( 'jquery' ), WC_VERSION );
98
		wp_register_script( 'serializejson', WC()->plugin_url() . '/assets/js/jquery-serializejson/jquery.serializejson' . $suffix . '.js', array( 'jquery' ), '2.6.1' );
99
		wp_register_script( 'flot', WC()->plugin_url() . '/assets/js/jquery-flot/jquery.flot' . $suffix . '.js', array( 'jquery' ), WC_VERSION );
100
		wp_register_script( 'flot-resize', WC()->plugin_url() . '/assets/js/jquery-flot/jquery.flot.resize' . $suffix . '.js', array( 'jquery', 'flot' ), WC_VERSION );
101
		wp_register_script( 'flot-time', WC()->plugin_url() . '/assets/js/jquery-flot/jquery.flot.time' . $suffix . '.js', array( 'jquery', 'flot' ), WC_VERSION );
102
		wp_register_script( 'flot-pie', WC()->plugin_url() . '/assets/js/jquery-flot/jquery.flot.pie' . $suffix . '.js', array( 'jquery', 'flot' ), WC_VERSION );
103
		wp_register_script( 'flot-stack', WC()->plugin_url() . '/assets/js/jquery-flot/jquery.flot.stack' . $suffix . '.js', array( 'jquery', 'flot' ), WC_VERSION );
104
		wp_register_script( 'wc-settings-tax', WC()->plugin_url() . '/assets/js/admin/settings-views-html-settings-tax' . $suffix . '.js', array( 'jquery', 'wp-util', 'underscore', 'backbone', 'jquery-blockui' ), WC_VERSION );
105
		wp_register_script( 'wc-backbone-modal', WC()->plugin_url() . '/assets/js/admin/backbone-modal' . $suffix . '.js', array( 'underscore', 'backbone', 'wp-util' ), WC_VERSION );
106
		wp_register_script( 'wc-shipping-zones', WC()->plugin_url() . '/assets/js/admin/wc-shipping-zones' . $suffix . '.js', array( 'jquery', 'wp-util', 'underscore', 'backbone', 'jquery-ui-sortable', 'wc-enhanced-select', 'wc-backbone-modal' ), WC_VERSION );
107
		wp_register_script( 'wc-shipping-zone-methods', WC()->plugin_url() . '/assets/js/admin/wc-shipping-zone-methods' . $suffix . '.js', array( 'jquery', 'wp-util', 'underscore', 'backbone', 'jquery-ui-sortable', 'wc-backbone-modal' ), WC_VERSION );
108
		wp_register_script( 'wc-shipping-classes', WC()->plugin_url() . '/assets/js/admin/wc-shipping-classes' . $suffix . '.js', array( 'jquery', 'wp-util', 'underscore', 'backbone' ), WC_VERSION );
109
		wp_register_script( 'select2', WC()->plugin_url() . '/assets/js/select2/select2' . $suffix . '.js', array( 'jquery' ), '3.5.4' );
110
		wp_register_script( 'wc-enhanced-select', WC()->plugin_url() . '/assets/js/admin/wc-enhanced-select' . $suffix . '.js', array( 'jquery', 'select2' ), WC_VERSION );
111
		wp_localize_script( 'wc-enhanced-select', 'wc_enhanced_select_params', array(
112
			'i18n_matches_1'            => _x( 'One result is available, press enter to select it.', 'enhanced select', 'woocommerce' ),
113
			'i18n_matches_n'            => _x( '%qty% results are available, use up and down arrow keys to navigate.', 'enhanced select', 'woocommerce' ),
114
			'i18n_no_matches'           => _x( 'No matches found', 'enhanced select', 'woocommerce' ),
115
			'i18n_ajax_error'           => _x( 'Loading failed', 'enhanced select', 'woocommerce' ),
116
			'i18n_input_too_short_1'    => _x( 'Please enter 1 or more characters', 'enhanced select', 'woocommerce' ),
117
			'i18n_input_too_short_n'    => _x( 'Please enter %qty% or more characters', 'enhanced select', 'woocommerce' ),
118
			'i18n_input_too_long_1'     => _x( 'Please delete 1 character', 'enhanced select', 'woocommerce' ),
119
			'i18n_input_too_long_n'     => _x( 'Please delete %qty% characters', 'enhanced select', 'woocommerce' ),
120
			'i18n_selection_too_long_1' => _x( 'You can only select 1 item', 'enhanced select', 'woocommerce' ),
121
			'i18n_selection_too_long_n' => _x( 'You can only select %qty% items', 'enhanced select', 'woocommerce' ),
122
			'i18n_load_more'            => _x( 'Loading more results&hellip;', 'enhanced select', 'woocommerce' ),
123
			'i18n_searching'            => _x( 'Searching&hellip;', 'enhanced select', 'woocommerce' ),
124
			'ajax_url'                  => admin_url( 'admin-ajax.php' ),
125
			'search_products_nonce'     => wp_create_nonce( 'search-products' ),
126
			'search_customers_nonce'    => wp_create_nonce( 'search-customers' )
127
		) );
128
129
		// Accounting
130
		wp_localize_script( 'accounting', 'accounting_params', array(
131
			'mon_decimal_point' => wc_get_price_decimal_separator()
132
		) );
133
134
		// WooCommerce admin pages
135
		if ( in_array( $screen_id, wc_get_screen_ids() ) ) {
136
			wp_enqueue_script( 'iris' );
137
			wp_enqueue_script( 'woocommerce_admin' );
138
			wp_enqueue_script( 'wc-enhanced-select' );
139
			wp_enqueue_script( 'jquery-ui-sortable' );
140
			wp_enqueue_script( 'jquery-ui-autocomplete' );
141
142
			$locale  = localeconv();
143
			$decimal = isset( $locale['decimal_point'] ) ? $locale['decimal_point'] : '.';
144
145
			$params = array(
146
				'i18n_decimal_error'                => sprintf( __( 'Please enter in decimal (%s) format without thousand separators.', 'woocommerce' ), $decimal ),
147
				'i18n_mon_decimal_error'            => sprintf( __( 'Please enter in monetary decimal (%s) format without thousand separators and currency symbols.', 'woocommerce' ), wc_get_price_decimal_separator() ),
148
				'i18n_country_iso_error'            => __( 'Please enter in country code with two capital letters.', 'woocommerce' ),
149
				'i18_sale_less_than_regular_error'  => __( 'Please enter in a value less than the regular price.', 'woocommerce' ),
150
				'decimal_point'                     => $decimal,
151
				'mon_decimal_point'                 => wc_get_price_decimal_separator()
152
			);
153
154
			wp_localize_script( 'woocommerce_admin', 'woocommerce_admin', $params );
155
		}
156
157
		// Edit product category pages
158
		if ( in_array( $screen_id, array( 'edit-product_cat' ) ) ) {
159
			wp_enqueue_media();
160
		}
161
162
		// Products
163 View Code Duplication
		if ( in_array( $screen_id, array( 'edit-product' ) ) ) {
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
164
			wp_register_script( 'woocommerce_quick-edit', WC()->plugin_url() . '/assets/js/admin/quick-edit' . $suffix . '.js', array( 'jquery', 'woocommerce_admin' ), WC_VERSION );
165
			wp_enqueue_script( 'woocommerce_quick-edit' );
166
		}
167
168
		// Meta boxes
169
		if ( in_array( $screen_id, array( 'product', 'edit-product' ) ) ) {
170
			wp_enqueue_media();
171
			wp_register_script( 'wc-admin-product-meta-boxes', WC()->plugin_url() . '/assets/js/admin/meta-boxes-product' . $suffix . '.js', array( 'wc-admin-meta-boxes', 'media-models' ), WC_VERSION );
172
			wp_register_script( 'wc-admin-variation-meta-boxes', WC()->plugin_url() . '/assets/js/admin/meta-boxes-product-variation' . $suffix . '.js', array( 'wc-admin-meta-boxes', 'serializejson', 'media-models' ), WC_VERSION );
173
174
			wp_enqueue_script( 'wc-admin-product-meta-boxes' );
175
			wp_enqueue_script( 'wc-admin-variation-meta-boxes' );
176
177
			$params = array(
178
				'post_id'                             => isset( $post->ID ) ? $post->ID : '',
179
				'plugin_url'                          => WC()->plugin_url(),
180
				'ajax_url'                            => admin_url( 'admin-ajax.php' ),
181
				'woocommerce_placeholder_img_src'     => wc_placeholder_img_src(),
182
				'add_variation_nonce'                 => wp_create_nonce( 'add-variation' ),
183
				'link_variation_nonce'                => wp_create_nonce( 'link-variations' ),
184
				'delete_variations_nonce'             => wp_create_nonce( 'delete-variations' ),
185
				'load_variations_nonce'               => wp_create_nonce( 'load-variations' ),
186
				'save_variations_nonce'               => wp_create_nonce( 'save-variations' ),
187
				'bulk_edit_variations_nonce'          => wp_create_nonce( 'bulk-edit-variations' ),
188
				'i18n_link_all_variations'            => esc_js( __( 'Are you sure you want to link all variations? This will create a new variation for each and every possible combination of variation attributes (max 50 per run).', 'woocommerce' ) ),
189
				'i18n_enter_a_value'                  => esc_js( __( 'Enter a value', 'woocommerce' ) ),
190
				'i18n_enter_menu_order'               => esc_js( __( 'Variation menu order (determines position in the list of variations)', 'woocommerce' ) ),
191
				'i18n_enter_a_value_fixed_or_percent' => esc_js( __( 'Enter a value (fixed or %)', 'woocommerce' ) ),
192
				'i18n_delete_all_variations'          => esc_js( __( 'Are you sure you want to delete all variations? This cannot be undone.', 'woocommerce' ) ),
193
				'i18n_last_warning'                   => esc_js( __( 'Last warning, are you sure?', 'woocommerce' ) ),
194
				'i18n_choose_image'                   => esc_js( __( 'Choose an image', 'woocommerce' ) ),
195
				'i18n_set_image'                      => esc_js( __( 'Set variation image', 'woocommerce' ) ),
196
				'i18n_variation_added'                => esc_js( __( "variation added", 'woocommerce' ) ),
197
				'i18n_variations_added'               => esc_js( __( "variations added", 'woocommerce' ) ),
198
				'i18n_no_variations_added'            => esc_js( __( "No variations added", 'woocommerce' ) ),
199
				'i18n_remove_variation'               => esc_js( __( 'Are you sure you want to remove this variation?', 'woocommerce' ) ),
200
				'i18n_scheduled_sale_start'           => esc_js( __( 'Sale start date (YYYY-MM-DD format or leave blank)', 'woocommerce' ) ),
201
				'i18n_scheduled_sale_end'             => esc_js( __( 'Sale end date (YYYY-MM-DD format or leave blank)', 'woocommerce' ) ),
202
				'i18n_edited_variations'              => esc_js( __( 'Save changes before changing page?', 'woocommerce' ) ),
203
				'i18n_variation_count_single'         => esc_js( __( '%qty% variation', 'woocommerce' ) ),
204
				'i18n_variation_count_plural'         => esc_js( __( '%qty% variations', 'woocommerce' ) ),
205
				'variations_per_page'                 => absint( apply_filters( 'woocommerce_admin_meta_boxes_variations_per_page', 15 ) )
206
			);
207
208
			wp_localize_script( 'wc-admin-variation-meta-boxes', 'woocommerce_admin_meta_boxes_variations', $params );
209
		}
210
		if ( in_array( str_replace( 'edit-', '', $screen_id ), wc_get_order_types( 'order-meta-boxes' ) ) ) {
211
			wp_register_script( 'wc-admin-order-meta-boxes', WC()->plugin_url() . '/assets/js/admin/meta-boxes-order' . $suffix . '.js', array( 'wc-admin-meta-boxes', 'wc-backbone-modal' ), WC_VERSION );
212
			wp_enqueue_script( 'wc-admin-order-meta-boxes' );
213
214
			$params = array(
215
				'countries'              => json_encode( array_merge( WC()->countries->get_allowed_country_states(), WC()->countries->get_shipping_country_states() ) ),
216
				'i18n_select_state_text' => esc_attr__( 'Select an option&hellip;', 'woocommerce' )
217
			);
218
219
			wp_localize_script( 'wc-admin-order-meta-boxes', 'woocommerce_admin_meta_boxes_order', $params );
220
		}
221 View Code Duplication
		if ( in_array( $screen_id, array( 'shop_coupon', 'edit-shop_coupon' ) ) ) {
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
222
			wp_register_script( 'wc-admin-coupon-meta-boxes', WC()->plugin_url() . '/assets/js/admin/meta-boxes-coupon' . $suffix . '.js', array( 'wc-admin-meta-boxes' ), WC_VERSION );
223
			wp_enqueue_script( 'wc-admin-coupon-meta-boxes' );
224
		}
225
		if ( in_array( str_replace( 'edit-', '', $screen_id ), array_merge( array( 'shop_coupon', 'product' ), wc_get_order_types( 'order-meta-boxes' ) ) ) ) {
226
			$post_id  = isset( $post->ID ) ? $post->ID : '';
227
			$currency = '';
228
229
			if ( $post_id && in_array( get_post_type( $post_id ), wc_get_order_types( 'order-meta-boxes' ) ) ) {
230
				$order    = wc_get_order( $post_id );
231
				$currency = $order->get_order_currency();
232
			}
233
234
			$params = array(
235
				'remove_item_notice'            => __( 'Are you sure you want to remove the selected items? If you have previously reduced this item\'s stock, or this order was submitted by a customer, you will need to manually restore the item\'s stock.', 'woocommerce' ),
236
				'i18n_select_items'             => __( 'Please select some items.', 'woocommerce' ),
237
				'i18n_do_refund'                => __( 'Are you sure you wish to process this refund? This action cannot be undone.', 'woocommerce' ),
238
				'i18n_delete_refund'            => __( 'Are you sure you wish to delete this refund? This action cannot be undone.', 'woocommerce' ),
239
				'i18n_delete_tax'               => __( 'Are you sure you wish to delete this tax column? This action cannot be undone.', 'woocommerce' ),
240
				'remove_item_meta'              => __( 'Remove this item meta?', 'woocommerce' ),
241
				'remove_attribute'              => __( 'Remove this attribute?', 'woocommerce' ),
242
				'name_label'                    => __( 'Name', 'woocommerce' ),
243
				'remove_label'                  => __( 'Remove', 'woocommerce' ),
244
				'click_to_toggle'               => __( 'Click to toggle', 'woocommerce' ),
245
				'values_label'                  => __( 'Value(s)', 'woocommerce' ),
246
				'text_attribute_tip'            => __( 'Enter some text, or some attributes by pipe (|) separating values.', 'woocommerce' ),
247
				'visible_label'                 => __( 'Visible on the product page', 'woocommerce' ),
248
				'used_for_variations_label'     => __( 'Used for variations', 'woocommerce' ),
249
				'new_attribute_prompt'          => __( 'Enter a name for the new attribute term:', 'woocommerce' ),
250
				'calc_totals'                   => __( 'Calculate totals based on order items, discounts, and shipping?', 'woocommerce' ),
251
				'calc_line_taxes'               => __( 'Calculate line taxes? This will calculate taxes based on the customers country. If no billing/shipping is set it will use the store base country.', 'woocommerce' ),
252
				'copy_billing'                  => __( 'Copy billing information to shipping information? This will remove any currently entered shipping information.', 'woocommerce' ),
253
				'load_billing'                  => __( 'Load the customer\'s billing information? This will remove any currently entered billing information.', 'woocommerce' ),
254
				'load_shipping'                 => __( 'Load the customer\'s shipping information? This will remove any currently entered shipping information.', 'woocommerce' ),
255
				'featured_label'                => __( 'Featured', 'woocommerce' ),
256
				'prices_include_tax'            => esc_attr( get_option( 'woocommerce_prices_include_tax' ) ),
257
				'tax_based_on'                  => esc_attr( get_option( 'woocommerce_tax_based_on' ) ),
258
				'round_at_subtotal'             => esc_attr( get_option( 'woocommerce_tax_round_at_subtotal' ) ),
259
				'no_customer_selected'          => __( 'No customer selected', 'woocommerce' ),
260
				'plugin_url'                    => WC()->plugin_url(),
261
				'ajax_url'                      => admin_url( 'admin-ajax.php' ),
262
				'order_item_nonce'              => wp_create_nonce( 'order-item' ),
263
				'add_attribute_nonce'           => wp_create_nonce( 'add-attribute' ),
264
				'save_attributes_nonce'         => wp_create_nonce( 'save-attributes' ),
265
				'calc_totals_nonce'             => wp_create_nonce( 'calc-totals' ),
266
				'get_customer_details_nonce'    => wp_create_nonce( 'get-customer-details' ),
267
				'search_products_nonce'         => wp_create_nonce( 'search-products' ),
268
				'grant_access_nonce'            => wp_create_nonce( 'grant-access' ),
269
				'revoke_access_nonce'           => wp_create_nonce( 'revoke-access' ),
270
				'add_order_note_nonce'          => wp_create_nonce( 'add-order-note' ),
271
				'delete_order_note_nonce'       => wp_create_nonce( 'delete-order-note' ),
272
				'calendar_image'                => WC()->plugin_url().'/assets/images/calendar.png',
273
				'post_id'                       => isset( $post->ID ) ? $post->ID : '',
274
				'base_country'                  => WC()->countries->get_base_country(),
275
				'currency_format_num_decimals'  => wc_get_price_decimals(),
276
				'currency_format_symbol'        => get_woocommerce_currency_symbol( $currency ),
277
				'currency_format_decimal_sep'   => esc_attr( wc_get_price_decimal_separator() ),
278
				'currency_format_thousand_sep'  => esc_attr( wc_get_price_thousand_separator() ),
279
				'currency_format'               => esc_attr( str_replace( array( '%1$s', '%2$s' ), array( '%s', '%v' ), get_woocommerce_price_format() ) ), // For accounting JS
280
				'rounding_precision'            => WC_ROUNDING_PRECISION,
281
				'tax_rounding_mode'             => WC_TAX_ROUNDING_MODE,
282
				'product_types'                 => array_map( 'sanitize_title', get_terms( 'product_type', array( 'hide_empty' => false, 'fields' => 'names' ) ) ),
283
				'i18n_download_permission_fail' => __( 'Could not grant access - the user may already have permission for this file or billing email is not set. Ensure the billing email is set, and the order has been saved.', 'woocommerce' ),
284
				'i18n_permission_revoke'        => __( 'Are you sure you want to revoke access to this download?', 'woocommerce' ),
285
				'i18n_tax_rate_already_exists'  => __( 'You cannot add the same tax rate twice!', 'woocommerce' ),
286
				'i18n_product_type_alert'       => __( 'Your product has variations! Before changing the product type, it is a good idea to delete the variations to avoid errors in the stock reports.', 'woocommerce' ),
287
				'i18n_delete_note'              => __( 'Are you sure you wish to delete this note? This action cannot be undone.', 'woocommerce' )
288
			);
289
290
			wp_localize_script( 'wc-admin-meta-boxes', 'woocommerce_admin_meta_boxes', $params );
291
		}
292
293
		// Term ordering - only when sorting by term_order
294
		if ( ( strstr( $screen_id, 'edit-pa_' ) || ( ! empty( $_GET['taxonomy'] ) && in_array( $_GET['taxonomy'], apply_filters( 'woocommerce_sortable_taxonomies', array( 'product_cat' ) ) ) ) ) && ! isset( $_GET['orderby'] ) ) {
295
296
			wp_register_script( 'woocommerce_term_ordering', WC()->plugin_url() . '/assets/js/admin/term-ordering' . $suffix . '.js', array( 'jquery-ui-sortable' ), WC_VERSION );
297
			wp_enqueue_script( 'woocommerce_term_ordering' );
298
299
			$taxonomy = isset( $_GET['taxonomy'] ) ? wc_clean( $_GET['taxonomy'] ) : '';
300
301
			$woocommerce_term_order_params = array(
302
				'taxonomy' => $taxonomy
303
			);
304
305
			wp_localize_script( 'woocommerce_term_ordering', 'woocommerce_term_ordering_params', $woocommerce_term_order_params );
306
		}
307
308
		// Product sorting - only when sorting by menu order on the products page
309
		if ( current_user_can( 'edit_others_pages' ) && $screen_id == 'edit-product' && isset( $wp_query->query['orderby'] ) && $wp_query->query['orderby'] == 'menu_order title' ) {
310
			wp_register_script( 'woocommerce_product_ordering', WC()->plugin_url() . '/assets/js/admin/product-ordering' . $suffix . '.js', array( 'jquery-ui-sortable' ), WC_VERSION, true );
311
			wp_enqueue_script( 'woocommerce_product_ordering' );
312
		}
313
314
		// Reports Pages
315
		if ( in_array( $screen_id, apply_filters( 'woocommerce_reports_screen_ids', array( $wc_screen_id . '_page_wc-reports', 'toplevel_page_wc-reports', 'dashboard' ) ) ) ) {
316
			wp_register_script( 'wc-reports', WC()->plugin_url() . '/assets/js/admin/reports' . $suffix . '.js', array( 'jquery', 'jquery-ui-datepicker' ), WC_VERSION );
317
318
			wp_enqueue_script( 'wc-reports' );
319
			wp_enqueue_script( 'flot' );
320
			wp_enqueue_script( 'flot-resize' );
321
			wp_enqueue_script( 'flot-time' );
322
			wp_enqueue_script( 'flot-pie' );
323
			wp_enqueue_script( 'flot-stack' );
324
		}
325
326
		// API settings
327
		if ( $wc_screen_id . '_page_wc-settings' === $screen_id && isset( $_GET['section'] ) && 'keys' == $_GET['section'] ) {
328
			wp_register_script( 'wc-api-keys', WC()->plugin_url() . '/assets/js/admin/api-keys' . $suffix . '.js', array( 'jquery', 'woocommerce_admin', 'underscore', 'backbone', 'wp-util', 'qrcode', 'zeroclipboard' ), WC_VERSION, true );
329
			wp_enqueue_script( 'wc-api-keys' );
330
			wp_localize_script(
331
				'wc-api-keys',
332
				'woocommerce_admin_api_keys',
333
				array(
334
					'ajax_url'         => admin_url( 'admin-ajax.php' ),
335
					'update_api_nonce' => wp_create_nonce( 'update-api-key' ),
336
					'clipboard_failed' => esc_html__( 'Copying to clipboard failed. Please press Ctrl/Cmd+C to copy.', 'woocommerce' ),
337
				)
338
			);
339
		}
340
341
		// System status
342
		if ( $wc_screen_id . '_page_wc-status' === $screen_id ) {
343
			wp_enqueue_script( 'zeroclipboard' );
344
		}
345
346
		if ( in_array( $screen_id, array( 'user-edit', 'profile' ) ) ) {
347
			wp_register_script( 'wc-users', WC()->plugin_url() . '/assets/js/admin/users' . $suffix . '.js', array( 'jquery', 'wc-enhanced-select' ), WC_VERSION, true );
348
			wp_enqueue_script( 'wc-users' );
349
			wp_localize_script(
350
				'wc-users',
351
				'wc_users_params',
352
				array(
353
					'countries'              => json_encode( array_merge( WC()->countries->get_allowed_country_states(), WC()->countries->get_shipping_country_states() ) ),
354
					'i18n_select_state_text' => esc_attr__( 'Select an option&hellip;', 'woocommerce' ),
355
				)
356
			);
357
		}
358
	}
359
360
	/**
361
	 * Admin Head.
362
	 *
363
	 * Outputs some styles in the admin <head> to show icons on the woocommerce admin pages.
364
	 */
365
	public function product_taxonomy_styles() {
366
367
		if ( ! current_user_can( 'manage_woocommerce' ) ) return;
368
		?>
369
		<style type="text/css">
370
			<?php if ( isset($_GET['taxonomy']) && $_GET['taxonomy']=='product_cat' ) : ?>
371
				.icon32-posts-product { background-position: -243px -5px !important; }
372
			<?php elseif ( isset($_GET['taxonomy']) && $_GET['taxonomy']=='product_tag' ) : ?>
373
				.icon32-posts-product { background-position: -301px -5px !important; }
374
			<?php endif; ?>
375
		</style>
376
		<?php
377
	}
378
}
379
380
endif;
381
382
return new WC_Admin_Assets();
383