PluginProbe ʕ •ᴥ•ʔ
WooCommerce / 8.6.1
WooCommerce v8.6.1
10.9.1 10.9.0 10.9.0-rc.1 10.9.0-beta.2 10.9.0-beta.1 10.8.1 10.8.0 10.8.0-rc.1 10.8.0-beta.2 10.8.0-beta.1 7.8.0-beta.1 7.8.0-beta.2 7.8.0-rc.1 7.8.0-rc.2 7.8.1 7.8.2 7.8.3 7.8.4 7.9.0 7.9.0-beta.1 7.9.0-beta.2 7.9.0-rc.2 7.9.0-rc.3 7.9.1 7.9.2 8.0.0 8.0.0-beta.1 8.0.0-beta.2 8.0.0-rc.1 8.0.0-rc.2 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.1.0 8.1.0-beta.1 8.1.0-rc.1 8.1.0-rc.2 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 8.2.0-beta.1 8.2.0-rc.1 8.2.0-rc.2 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.3.0 8.3.0-beta.1 8.3.0-rc.1 8.3.0-rc.2 8.3.1 8.3.2 8.3.3 8.3.4 8.4.0 8.4.0-beta.1 8.4.0-rc.1 8.4.1 8.4.2 8.4.3 8.5.0 8.5.0-beta.1 8.5.0-rc.1 8.5.1 8.5.2 8.5.3 8.5.4 8.5.5 8.6.0 8.6.0-beta.1 8.6.0-rc.1 8.6.1 8.6.2 8.6.3 8.6.4 8.7.0 8.7.0-beta.1 8.7.0-beta.2 8.7.0-rc.1 8.7.1 8.7.2 8.7.3 8.8.0 8.8.0-beta.1 8.8.0-rc.1 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.8.6 8.8.7 8.9.0 8.9.0-beta.1 8.9.0-rc.1 8.9.1 8.9.2 8.9.3 8.9.4 8.9.5 9.0.0 9.0.0-beta.1 9.0.0-beta.2 9.0.0-rc.1 9.0.1 9.0.2 9.0.3 9.0.4 9.1.0 9.1.0-beta.1 9.1.0-rc.1 9.1.1 9.1.2 9.1.3 9.1.4 9.1.5 9.1.6 9.2.0 9.2.0-beta.1 9.2.0-rc.1 9.2.1 9.2.2 9.2.3 9.2.4 9.2.5 9.3.0 9.3.0-beta.1 9.3.0-rc.1 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.3.6 9.4.0 9.4.0-beta.1 9.4.0-beta.2 9.4.0-rc.1 9.4.0-rc.2 9.4.0-rc.3 9.4.0-rc.4 9.4.1 9.4.2 9.4.3 9.4.4 9.4.5 9.5.0 9.5.0-beta.1 9.5.0-beta.2 9.5.0-rc.1 9.5.1 9.5.2 9.5.3 9.5.4 9.6.0 9.6.0-beta.1 9.6.0-beta.2 9.6.0-rc.1 9.6.1 9.6.2 9.6.3 9.6.4 9.7.0 9.7.0-beta.1 9.7.0-rc.1 9.7.1 9.7.2 9.7.3 9.8.0 9.8.0-beta.1 9.8.0-rc.1 9.8.1 9.8.2 9.8.3 9.8.4 9.8.5 9.8.6 9.8.7 9.9.0 9.9.0-beta.1 9.9.0-rc.1 9.9.1 9.9.2 9.9.3 9.9.4 9.9.5 9.9.6 9.9.7 3.7.3 7.1.2 3.8.0 7.2.0 3.8.0-beta.1 7.2.0-beta.1 3.8.0-rc.1 7.2.0-beta.2 3.8.0-rc.2 7.2.0-rc.1 3.8.1 7.2.0-rc.2 3.8.2 7.2.1 3.8.3 7.2.2 3.9.0 7.2.3 3.9.0-beta.1 7.2.4 3.9.0-beta.2 7.3.0 3.9.0-rc.1 7.3.0-beta.1 3.9.0-rc.2 7.3.0-beta.2 3.9.0-rc.3 7.3.0-rc.1 3.9.0-rc.4 7.3.0-rc.2 3.9.1 7.3.1 3.9.2 7.4.0 3.9.3 7.4.0-beta.1 3.9.4 7.4.0-beta.2 3.9.5 7.4.0-rc.1 4.0.0 7.4.0-rc.2 4.0.0-beta.1 7.4.1 4.0.0-rc.1 7.4.2 4.0.0-rc.2 7.5.0 4.0.1 7.5.0-beta.1 4.0.2 7.5.0-beta.2 4.0.3 7.5.0-rc.1 4.0.4 7.5.1 4.1.0 7.5.2 4.1.0-beta.1 7.6.0 4.1.0-beta.2 7.6.0-beta.1 4.1.0-rc.1 7.6.0-beta.2 4.1.0-rc.2 7.6.0-rc.1 4.1.1 7.6.0-rc.2 4.1.2 7.6.0-rc.3 4.1.3 7.6.1 4.1.4 7.6.2 4.2.0 7.7.0 4.2.0-RC.1 7.7.0-beta.1 4.2.0-RC.2 7.7.0-beta.2 4.2.0-beta.1 7.7.0-rc.1 4.2.1 7.7.1 4.2.2 7.7.2 4.2.3 7.7.3 4.2.4 7.8.0 4.2.5 4.3.0 4.3.0-beta.1 4.3.0-rc.1 4.3.0-rc.2 4.3.0-rc.3 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 4.4.0 4.4.0-beta.1 4.4.0-rc.1 4.4.1 4.4.2 4.4.3 4.4.4 4.5.0 4.5.0-beta.1 4.5.0-rc.1 4.5.0-rc.3 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.6.0-beta.1 4.6.0-rc.1 4.6.1 4.6.2 4.6.3 4.6.4 4.6.5 4.7.0 4.7.0-beta.1 4.7.0-beta.2 4.7.0-rc.1 4.7.1 4.7.1-beta.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.0-beta.1 4.8.0-rc.1 4.8.0-rc.2 4.8.1 4.8.2 4.8.3 4.9.0 4.9.0-beta.1 4.9.0-rc.1 4.9.0-rc.2 4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 5.0.0 5.0.0-beta.1 5.0.0-beta.2 5.0.0-rc.1 5.0.0-rc.2 5.0.0-rc.3 5.0.1 5.0.2 5.0.3 5.1.0 5.1.0-beta.1 5.1.0-rc.1 trunk 5.1.1 10.0.0 5.1.2 10.0.0-rc.1 5.1.3 10.0.0-rc.2 5.2.0 10.0.1 5.2.0-beta.1 10.0.2 5.2.0-rc.1 10.0.3 5.2.0-rc.2 10.0.4 5.2.1 10.0.5 5.2.2 10.0.6 5.2.3 10.1.0 5.2.4 10.1.0-rc.1 5.2.5 10.1.0-rc.2 5.3.0 10.1.0-rc.3 5.3.0-beta.1 10.1.0-rc.4 5.3.0-rc.1 10.1.1 5.3.0-rc.2 10.1.2 5.3.1 10.1.3 5.3.2 10.1.4 5.3.3 10.2.0 5.4.0 10.2.0-beta.1 5.4.0-beta.1 10.2.0-beta.2 5.4.0-rc.1 10.2.0-rc.1 5.4.1 10.2.1 5.4.2 10.2.2 5.4.3 10.2.3 5.4.4 10.2.4 5.4.5 10.3.0 5.5.0 10.3.0-beta.1 5.5.0-beta.1 10.3.0-beta.2 5.5.0-rc.1 10.3.0-rc.1 5.5.0-rc.2 10.3.0-rc.2 5.5.1 10.3.1 5.5.2 10.3.2 5.5.3 10.3.3 5.5.4 10.3.4 5.5.5 10.3.5 5.6.0 10.3.6 5.6.0-beta.1 10.3.7 5.6.0-rc.1 10.3.8 5.6.0-rc.2 10.4.0 5.6.1 10.4.0-beta.1 5.6.2 10.4.0-beta.2 5.6.3 10.4.0-rc.1 5.7.0 10.4.1 5.7.0-beta.1 10.4.2 5.7.0-rc.1 10.4.3 5.7.1 10.4.4 5.7.2 10.5.0 5.7.3 10.5.0-beta.1 5.8.0 10.5.0-beta.2 5.8.0-beta.1 10.5.0-rc.1 5.8.0-beta.2 10.5.0-rc.2 5.8.0-rc.1 10.5.0-rc.3 5.8.1 10.5.1 5.8.2 10.5.2 5.9.0 10.5.3 5.9.0-beta.1 10.6.0 5.9.0-rc.1 10.6.0-beta.1 5.9.0-rc.2 10.6.0-beta.2 5.9.1 10.6.0-rc.1 5.9.2 10.6.1 6.0.0 10.6.2 6.0.0-beta.1 10.7.0 6.0.0-rc.1 10.7.0-beta.1 6.0.1 10.7.0-beta.2 6.0.2 10.7.0-rc.1 6.1.0 3.0.0 6.1.0-beta.1 3.0.1 6.1.0-rc.1 3.0.2 6.1.0-rc.2 3.0.3 6.1.1 3.0.4 6.1.2 3.0.5 6.1.3 3.0.6 6.2.0 3.0.7 6.2.0-beta.1 3.0.8 6.2.0-rc.1 3.0.9 6.2.0-rc.2 3.1.0 6.2.1 3.1.1 6.2.2 3.1.2 6.2.3 3.2.0 6.3.0 3.2.1 6.3.0-beta.1 3.2.2 6.3.0-rc.1 3.2.3 6.3.0-rc.2 3.2.4 6.3.1 3.2.5 6.3.2 3.2.6 6.4.0 3.3.0 6.4.0-beta.1 3.3.1 6.4.0-rc.1 3.3.2 6.4.1 3.3.2-rc.1 6.4.2 3.3.3 6.5.0 3.3.4 6.5.0-beta.1 3.3.5 6.5.0-rc.1 3.3.6 6.5.0-rc.2 3.4.0 6.5.1 3.4.0-beta.1 6.5.2 3.4.0-rc.2 6.6.0 3.4.1 6.6.0-beta.1 3.4.2 6.6.0-rc.1 3.4.3 6.6.0-rc.2 3.4.4 6.6.1 3.4.5 6.6.2 3.4.6 6.7.0 3.4.7 6.7.0-beta.1 3.4.8 6.7.0-beta.2 3.5.0 6.7.0-rc.1 3.5.0-beta.1 6.7.1 3.5.0-rc.1 6.8.0 3.5.0-rc.2 6.8.0-beta.1 3.5.1 6.8.0-beta.2 3.5.10 6.8.0-rc.1 3.5.2 6.8.1 3.5.3 6.8.2 3.5.4 6.8.3 3.5.5 6.9.0 3.5.6 6.9.0-beta.1 3.5.7 6.9.0-beta.2 3.5.8 6.9.0-rc.1 3.5.9 6.9.1 3.6.0 6.9.2 3.6.0-beta.1 6.9.3 3.6.0-rc.1 6.9.4 3.6.0-rc.2 6.9.5 3.6.0-rc.3 7.0.0 3.6.1 7.0.0-beta.1 3.6.2 7.0.0-beta.2 3.6.3 7.0.0-beta.3 3.6.4 7.0.0-rc.1 3.6.5 7.0.0-rc.2 3.6.6 7.0.1 3.6.7 7.0.2 3.7.0 7.1.0 3.7.0-beta.1 7.1.0-beta.1 3.7.0-rc.1 7.1.0-beta.2 3.7.0-rc.2 7.1.0-rc.1 3.7.1 7.1.0-rc.2 3.7.2 7.1.1
woocommerce / assets / js / admin / wc-shipping-zones.js
woocommerce / assets / js / admin Last commit date
api-keys.js 5 years ago api-keys.min.js 2 years ago backbone-modal.js 2 years ago backbone-modal.min.js 2 years ago marketplace-suggestions.js 4 years ago marketplace-suggestions.min.js 2 years ago meta-boxes-coupon.js 5 years ago meta-boxes-coupon.min.js 2 years ago meta-boxes-order.js 2 years ago meta-boxes-order.min.js 2 years ago meta-boxes-product-variation.js 2 years ago meta-boxes-product-variation.min.js 2 years ago meta-boxes-product.js 2 years ago meta-boxes-product.min.js 2 years ago meta-boxes.js 2 years ago meta-boxes.min.js 2 years ago network-orders.js 8 years ago network-orders.min.js 2 years ago order-attribution-admin.js 2 years ago order-attribution-admin.min.js 2 years ago product-editor.js 3 years ago product-editor.min.js 2 years ago product-ordering.js 3 years ago product-ordering.min.js 2 years ago quick-edit.js 4 years ago quick-edit.min.js 2 years ago reports.js 5 years ago reports.min.js 2 years ago settings-views-html-settings-tax.js 3 years ago settings-views-html-settings-tax.min.js 2 years ago settings.js 4 years ago settings.min.js 2 years ago system-status.js 3 years ago system-status.min.js 2 years ago term-ordering.js 4 years ago term-ordering.min.js 2 years ago users.js 5 years ago users.min.js 2 years ago wc-clipboard.js 5 years ago wc-clipboard.min.js 5 years ago wc-enhanced-select.js 2 years ago wc-enhanced-select.min.js 2 years ago wc-orders.js 3 years ago wc-orders.min.js 2 years ago wc-product-export.js 5 years ago wc-product-export.min.js 2 years ago wc-product-import.js 3 years ago wc-product-import.min.js 2 years ago wc-setup.js 5 years ago wc-setup.min.js 2 years ago wc-shipping-classes.js 2 years ago wc-shipping-classes.min.js 2 years ago wc-shipping-zone-methods.js 2 years ago wc-shipping-zone-methods.min.js 2 years ago wc-shipping-zones.js 2 years ago wc-shipping-zones.min.js 2 years ago wc-status-widget.js 3 years ago wc-status-widget.min.js 3 years ago woocommerce_admin.js 2 years ago woocommerce_admin.min.js 2 years ago
wc-shipping-zones.js
279 lines
1 /* global shippingZonesLocalizeScript, ajaxurl */
2 ( function( $, data, wp, ajaxurl ) {
3 $( function() {
4 var $table = $( '.wc-shipping-zones' ),
5 $tbody = $( '.wc-shipping-zone-rows' ),
6 $save_button = $( '.wc-shipping-zone-save' ),
7 $row_template = wp.template( 'wc-shipping-zone-row' ),
8 $blank_template = wp.template( 'wc-shipping-zone-row-blank' ),
9
10 // Backbone model
11 ShippingZone = Backbone.Model.extend({
12 changes: {},
13 logChanges: function( changedRows ) {
14 var changes = this.changes || {};
15
16 _.each( changedRows, function( row, id ) {
17 changes[ id ] = _.extend( changes[ id ] || { zone_id : id }, row );
18 } );
19
20 this.changes = changes;
21 this.trigger( 'change:zones' );
22 },
23 discardChanges: function( id ) {
24 var changes = this.changes || {},
25 set_position = null,
26 zones = _.indexBy( this.get( 'zones' ), 'zone_id' );
27
28 // Find current set position if it has moved since last save
29 if ( changes[ id ] && changes[ id ].zone_order !== undefined ) {
30 set_position = changes[ id ].zone_order;
31 }
32
33 // Delete all changes
34 delete changes[ id ];
35
36 // If the position was set, and this zone does exist in DB, set the position again so the changes are not lost.
37 if ( set_position !== null && zones[ id ] && zones[ id ].zone_order !== set_position ) {
38 changes[ id ] = _.extend( changes[ id ] || {}, { zone_id : id, zone_order : set_position } );
39 }
40
41 this.changes = changes;
42
43 // No changes? Disable save button.
44 if ( 0 === _.size( this.changes ) ) {
45 shippingZoneView.clearUnloadConfirmation();
46 }
47 },
48 save: function() {
49 if ( _.size( this.changes ) ) {
50 $.post( ajaxurl + ( ajaxurl.indexOf( '?' ) > 0 ? '&' : '?' ) + 'action=woocommerce_shipping_zones_save_changes', {
51 wc_shipping_zones_nonce : data.wc_shipping_zones_nonce,
52 changes : this.changes
53 }, this.onSaveResponse, 'json' );
54 } else {
55 shippingZone.trigger( 'saved:zones' );
56 }
57 },
58 onSaveResponse: function( response, textStatus ) {
59 if ( 'success' === textStatus ) {
60 if ( response.success ) {
61 shippingZone.set( 'zones', response.data.zones );
62 shippingZone.trigger( 'change:zones' );
63 shippingZone.changes = {};
64 shippingZone.trigger( 'saved:zones' );
65 } else {
66 window.alert( data.strings.save_failed );
67 }
68 }
69 }
70 } ),
71
72 // Backbone view
73 ShippingZoneView = Backbone.View.extend({
74 rowTemplate: $row_template,
75 initialize: function() {
76 this.listenTo( this.model, 'change:zones', this.setUnloadConfirmation );
77 this.listenTo( this.model, 'saved:zones', this.clearUnloadConfirmation );
78 this.listenTo( this.model, 'saved:zones', this.render );
79 $tbody.on( 'change', { view: this }, this.updateModelOnChange );
80 $tbody.on( 'sortupdate', { view: this }, this.updateModelOnSort );
81 $( window ).on( 'beforeunload', { view: this }, this.unloadConfirmation );
82 $( document.body ).on( 'click', '.wc-shipping-zone-add', { view: this }, this.onAddNewRow );
83 },
84 onAddNewRow: function() {
85 var $link = $( this );
86 window.location.href = $link.attr( 'href' );
87 },
88 block: function() {
89 $( this.el ).block({
90 message: null,
91 overlayCSS: {
92 background: '#fff',
93 opacity: 0.6
94 }
95 });
96 },
97 unblock: function() {
98 $( this.el ).unblock();
99 },
100 render: function() {
101 var zones = _.indexBy( this.model.get( 'zones' ), 'zone_id' ),
102 view = this;
103
104 view.$el.empty();
105 view.unblock();
106
107 if ( _.size( zones ) ) {
108 // Sort zones
109 zones = _( zones )
110 .chain()
111 .sortBy( function ( zone ) { return parseInt( zone.zone_id, 10 ); } )
112 .sortBy( function ( zone ) { return parseInt( zone.zone_order, 10 ); } )
113 .value();
114
115 // Populate $tbody with the current zones
116 $.each( zones, function( id, rowData ) {
117 view.renderRow( rowData );
118 } );
119 } else {
120 view.$el.append( $blank_template );
121 }
122
123 view.initRows();
124 },
125 renderRow: function( rowData ) {
126 var view = this;
127 view.$el.append( view.rowTemplate( rowData ) );
128 view.initRow( rowData );
129 },
130 initRow: function( rowData ) {
131 var view = this;
132 var $tr = view.$el.find( 'tr[data-id="' + rowData.zone_id + '"]');
133
134 // List shipping methods
135 view.renderShippingMethods( rowData.zone_id, rowData.shipping_methods );
136 $tr.find( '.wc-shipping-zone-delete' ).on( 'click', { view: this }, this.onDeleteRow );
137 },
138 initRows: function() {
139 const isEven = 0 !== ( $( 'tbody.wc-shipping-zone-rows tr' ).length % 2 );
140 const tfoot = $( 'tfoot.wc-shipping-zone-rows-tfoot' );
141
142 // Stripe
143 if ( isEven ) {
144 tfoot.find( 'tr' ).addClass( 'even' );
145 } else {
146 tfoot.find( 'tr' ).removeClass( 'even' );
147 }
148 // Tooltips
149 $( '#tiptip_holder' ).removeAttr( 'style' );
150 $( '#tiptip_arrow' ).removeAttr( 'style' );
151 $( '.tips' ).tipTip({ 'attribute': 'data-tip', 'fadeIn': 50, 'fadeOut': 50, 'delay': 50 });
152 },
153 renderShippingMethods: function( zone_id, shipping_methods ) {
154 var $tr = $( '.wc-shipping-zones tr[data-id="' + zone_id + '"]');
155 var $method_list = $tr.find('.wc-shipping-zone-methods ul');
156
157 $method_list.find( '.wc-shipping-zone-method' ).remove();
158
159 if ( _.size( shipping_methods ) ) {
160 shipping_methods = _.sortBy( shipping_methods, function( method ) {
161 return parseInt( method.method_order, 10 );
162 } );
163
164 _.each( shipping_methods, function( shipping_method ) {
165 var class_name = 'method_disabled';
166
167 if ( 'yes' === shipping_method.enabled ) {
168 class_name = 'method_enabled';
169 }
170
171 $method_list.append(
172 '<li class="wc-shipping-zone-method ' + class_name + '">' + shipping_method.title + '</li>'
173 );
174 } );
175 } else {
176 $method_list.append( '<li class="wc-shipping-zone-method">' + data.strings.no_shipping_methods_offered + '</li>' );
177 }
178 },
179 onDeleteRow: function( event ) {
180 var view = event.data.view,
181 model = view.model,
182 zones = _.indexBy( model.get( 'zones' ), 'zone_id' ),
183 changes = {},
184 row = $( this ).closest('tr'),
185 zone_id = row.data('id');
186
187 event.preventDefault();
188
189 if ( window.confirm( data.strings.delete_confirmation_msg ) ) {
190 if ( zones[ zone_id ] ) {
191 delete zones[ zone_id ];
192 changes[ zone_id ] = _.extend( changes[ zone_id ] || {}, { deleted : 'deleted' } );
193 model.set( 'zones', zones );
194 model.logChanges( changes );
195 event.data.view.block();
196 event.data.view.model.save();
197 }
198 }
199 },
200 setUnloadConfirmation: function() {
201 this.needsUnloadConfirm = true;
202 $save_button.prop( 'disabled', false );
203 },
204 clearUnloadConfirmation: function() {
205 this.needsUnloadConfirm = false;
206 $save_button.prop( 'disabled', true );
207 },
208 unloadConfirmation: function( event ) {
209 if ( event.data.view.needsUnloadConfirm ) {
210 event.returnValue = data.strings.unload_confirmation_msg;
211 window.event.returnValue = data.strings.unload_confirmation_msg;
212 return data.strings.unload_confirmation_msg;
213 }
214 },
215 updateModelOnChange: function( event ) {
216 var model = event.data.view.model,
217 $target = $( event.target ),
218 zone_id = $target.closest( 'tr' ).data( 'id' ),
219 attribute = $target.data( 'attribute' ),
220 value = $target.val(),
221 zones = _.indexBy( model.get( 'zones' ), 'zone_id' ),
222 changes = {};
223
224 if ( ! zones[ zone_id ] || zones[ zone_id ][ attribute ] !== value ) {
225 changes[ zone_id ] = {};
226 changes[ zone_id ][ attribute ] = value;
227 }
228
229 model.logChanges( changes );
230 },
231 updateModelOnSort: function( event ) {
232 var view = event.data.view,
233 model = view.model,
234 zones = _.indexBy( model.get( 'zones' ), 'zone_id' ),
235 rows = $( 'tbody.wc-shipping-zone-rows tr' ),
236 changes = {};
237
238 // Update sorted row position
239 _.each( rows, function( row ) {
240 var zone_id = $( row ).data( 'id' ),
241 old_position = null,
242 new_position = parseInt( $( row ).index(), 10 );
243
244 if ( zones[ zone_id ] ) {
245 old_position = parseInt( zones[ zone_id ].zone_order, 10 );
246 }
247
248 if ( old_position !== new_position ) {
249 changes[ zone_id ] = _.extend( changes[ zone_id ] || {}, { zone_order : new_position } );
250 }
251 } );
252
253 if ( _.size( changes ) ) {
254 model.logChanges( changes );
255 event.data.view.block();
256 event.data.view.model.save();
257 }
258 }
259 } ),
260 shippingZone = new ShippingZone({
261 zones: data.zones
262 } ),
263 shippingZoneView = new ShippingZoneView({
264 model: shippingZone,
265 el: $tbody
266 } );
267
268 shippingZoneView.render();
269
270 $tbody.sortable({
271 items: 'tr',
272 cursor: 'move',
273 axis: 'y',
274 handle: 'td.wc-shipping-zone-sort',
275 scrollSensitivity: 40
276 });
277 });
278 })( jQuery, shippingZonesLocalizeScript, wp, ajaxurl );
279