CTX Feed – WooCommerce Product Feed Manager Plugin - Version 3.2.7

Version Description

(2020-01-02) = * Menu Icon Changed. * Update Feed Configuration without generating. * Fix Admin Notice UI.

Download this release

Release Info

Developer wahid0003
Plugin Icon 128x128 CTX Feed – WooCommerce Product Feed Manager Plugin
Version 3.2.7
Comparing to
See all releases

Code changes from version 3.2.6 to 3.2.7

README.txt CHANGED
@@ -5,7 +5,7 @@ Tags:woocommerce,google product feed,facebook product feed,woocommerce product f
5
  Requires at least: 3.6
6
  Tested Up To: 5.4-alpha-46743
7
  Requires PHP: 5.6
8
- Stable tag: 3.2.6
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -305,6 +305,11 @@ Using pro version:
305
 
306
  == Changelog ==
307
 
 
 
 
 
 
308
  = 3.2.6 (2019-12-25) =
309
  * New template structure implemented.
310
  * Merchant info metabox in feed template edit page.
5
  Requires at least: 3.6
6
  Tested Up To: 5.4-alpha-46743
7
  Requires PHP: 5.6
8
+ Stable tag: 3.2.7
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
305
 
306
  == Changelog ==
307
 
308
+ = 3.2.7 (2020-01-02) =
309
+ * Menu Icon Changed.
310
+ * Update Feed Configuration without generating.
311
+ * Fix Admin Notice UI.
312
+
313
  = 3.2.6 (2019-12-25) =
314
  * New template structure implemented.
315
  * Merchant info metabox in feed template edit page.
admin/class-woo-feed-admin.php CHANGED
@@ -127,9 +127,10 @@ class Woo_Feed_Admin
127
  wp_register_script($this->woo_feed, plugin_dir_url(__FILE__) . 'js/woo-feed-admin.js', $feedScriptDependency, $this->version, false);
128
 
129
  wp_localize_script($this->woo_feed, 'wpf_ajax_obj', array(
130
- 'wpf_ajax_url' => admin_url('admin-ajax.php'),
131
- 'nonce' => wp_create_nonce('wpf_feed_nonce'),
132
- 'na' => esc_html__( 'N/A', 'woo-feed' ),
 
133
  ));
134
 
135
  wp_enqueue_script($this->woo_feed);
@@ -173,7 +174,7 @@ class Woo_Feed_Admin
173
  add_submenu_page( 'webappick-manage-feeds', __('Make Feed', 'woo-feed'), __('Make Feed', 'woo-feed'), 'manage_woocommerce', 'webappick-new-feed', 'woo_feed_generate_feed' );
174
  add_submenu_page( 'webappick-manage-feeds', __('Settings', 'woo-feed'), __('Settings', 'woo-feed'), 'manage_woocommerce', 'webappick-feed-settings', 'woo_feed_config_feed' );
175
  add_submenu_page( 'webappick-manage-feeds', __('Documentation', 'woo-feed'), '<span class="woo-feed-docs">' . __('Docs', 'woo-feed') . '</span>', 'manage_woocommerce', 'webappick-feed-docs', array( WooFeedDocs::getInstance(), 'woo_feed_docs' ) );
176
- add_submenu_page( 'webappick-manage-feeds', __('Premium', 'woo-feed'), __('Premium', 'woo-feed'), 'manage_woocommerce', 'webappick-feed-pro-vs-free', 'woo_feed_pro_vs_free' );
177
  }
178
  }
179
 
127
  wp_register_script($this->woo_feed, plugin_dir_url(__FILE__) . 'js/woo-feed-admin.js', $feedScriptDependency, $this->version, false);
128
 
129
  wp_localize_script($this->woo_feed, 'wpf_ajax_obj', array(
130
+ 'wpf_ajax_url' => admin_url('admin-ajax.php'),
131
+ 'nonce' => wp_create_nonce('wpf_feed_nonce'),
132
+ 'na' => esc_html__( 'N/A', 'woo-feed' ),
133
+ 'regenerate' => esc_html__( 'Generating...', 'woo-feed' ),
134
  ));
135
 
136
  wp_enqueue_script($this->woo_feed);
174
  add_submenu_page( 'webappick-manage-feeds', __('Make Feed', 'woo-feed'), __('Make Feed', 'woo-feed'), 'manage_woocommerce', 'webappick-new-feed', 'woo_feed_generate_feed' );
175
  add_submenu_page( 'webappick-manage-feeds', __('Settings', 'woo-feed'), __('Settings', 'woo-feed'), 'manage_woocommerce', 'webappick-feed-settings', 'woo_feed_config_feed' );
176
  add_submenu_page( 'webappick-manage-feeds', __('Documentation', 'woo-feed'), '<span class="woo-feed-docs">' . __('Docs', 'woo-feed') . '</span>', 'manage_woocommerce', 'webappick-feed-docs', array( WooFeedDocs::getInstance(), 'woo_feed_docs' ) );
177
+ add_submenu_page( 'webappick-manage-feeds', __('Premium', 'woo-feed'), '<span class="woo-feed-premium">' . __('Premium', 'woo-feed') . '</span>', 'manage_woocommerce', 'webappick-feed-pro-vs-free', 'woo_feed_pro_vs_free' );
178
  }
179
  }
180
 
admin/class-woo-feed-manage-list.php CHANGED
@@ -69,10 +69,13 @@ class Woo_Feed_Manage_list extends Woo_Feed_List_Table
69
  $getItem = $item['option_name'];
70
  $statusId = $item['option_id'];
71
  $itemInfo = unserialize(get_option($getItem));
 
 
 
 
72
  switch ($column_name) {
73
  case 'option_name':
74
- $name = $item[$column_name];
75
- return str_replace("wf_feed_", "", $name);
76
  case 'status':
77
  if(!isset($itemInfo['status']) || $itemInfo['status'] == 1){
78
  return ' <div class="wf_status_wrap"><input style="display: none;" data-index='.$statusId.' id='.$statusId.' checked class="woo_feed_status_input" type="checkbox" value="'.$getItem.'"/>
@@ -101,11 +104,11 @@ class Woo_Feed_Manage_list extends Woo_Feed_List_Table
101
  case 'view':
102
  $view = $itemInfo['url'];
103
  /** @noinspection HtmlUnknownTarget */
104
- return sprintf(
105
- '<a href="%1$s" class="button" target="_blank">%2$s</a>&nbsp;
106
- <input type="button" id="%3$s" value="%4$s" class="button wpf_regenerate">&nbsp;
107
- <a href="%1$s" class="button" target="_blank" download>%5$s</a>',
108
- $view, __( 'View' ), $getItem, __( 'Regenerate' ), __( 'Download' ) );
109
  default:
110
  return false;
111
  }
@@ -333,20 +336,22 @@ class Woo_Feed_Manage_list extends Woo_Feed_List_Table
333
  public function process_bulk_action()
334
  {
335
  //Detect when a bulk action is being triggered...
336
- if ('delete-feed' === $this->current_action()) {
337
  // In our file that handles the request, verify the nonce.
338
  $nonce = esc_attr($_REQUEST['_wpnonce']);
339
  if (!wp_verify_nonce($nonce, 'wf_delete_feed')) {
340
- update_option('wpf_message', 'Failed To Delete Feed. You do not have sufficient permission to delete.');
341
- wp_redirect(admin_url("admin.php?page=woo_feed_manage_feed&wpf_message=error"));
 
342
  } else {
343
  if (self::delete_feed(absint($_GET['feed']))) {
344
-
345
- update_option('wpf_message', 'Feed Deleted Successfully');
346
- wp_redirect(admin_url("admin.php?page=woo_feed_manage_feed&wpf_message=success"));
347
  } else {
348
- update_option('wpf_message', 'Failed To Delete Feed');
349
- wp_redirect(admin_url("admin.php?page=woo_feed_manage_feed&wpf_message=error"));
 
350
  }
351
 
352
  }
@@ -354,9 +359,9 @@ class Woo_Feed_Manage_list extends Woo_Feed_List_Table
354
  //Detect when a bulk action is being triggered...
355
  if ('edit-feed' === $this->current_action()) {
356
  // In our file that handles the request, verify the nonce.
357
- $nonce = esc_attr($_REQUEST['_wpnonce']);
358
- if (!wp_verify_nonce($nonce, 'wf_edit_feed')) {
359
- die(_e('You do not have sufficient permission to delete!'));
360
  }
361
  }
362
 
@@ -368,17 +373,24 @@ class Woo_Feed_Manage_list extends Woo_Feed_List_Table
368
  if ('bulk-delete' === $this->current_action()) {
369
  $nonce = esc_attr($_REQUEST['_wpnonce']);
370
  if (!wp_verify_nonce($nonce, "bulk-" . $this->_args['plural'])) {
371
- die(_e('You do not have sufficient permission to delete!'));
372
  } else {
373
- $delete_ids = esc_sql($_POST['feed']);
374
- // loop over the array of record IDs and delete them
375
- if (count($delete_ids)) {
376
- foreach ($delete_ids as $id) {
377
- self::delete_feed($id);
 
 
378
 
379
  }
380
- update_option('wpf_message', 'Feed Deleted Successfully');
381
- wp_redirect(admin_url("admin.php?page=woo_feed_manage_feed&wpf_message=success"));
 
 
 
 
 
382
  }
383
  }
384
  }
@@ -532,6 +544,4 @@ class Woo_Feed_Manage_list extends Woo_Feed_List_Table
532
  */
533
  $this->items = $data;
534
  }
535
-
536
-
537
  }
69
  $getItem = $item['option_name'];
70
  $statusId = $item['option_id'];
71
  $itemInfo = unserialize(get_option($getItem));
72
+ global $regenerating, $regeneratingName;
73
+ $optionName = str_replace("wf_feed_", "", $getItem );
74
+ $spinIcon = ( $regenerating === true && $optionName === $regeneratingName ) ? ' wpf_spin_reverse' : '';
75
+ $disableBtn = $regenerating === true ? ' disabled' : '';
76
  switch ($column_name) {
77
  case 'option_name':
78
+ return $optionName;
 
79
  case 'status':
80
  if(!isset($itemInfo['status']) || $itemInfo['status'] == 1){
81
  return ' <div class="wf_status_wrap"><input style="display: none;" data-index='.$statusId.' id='.$statusId.' checked class="woo_feed_status_input" type="checkbox" value="'.$getItem.'"/>
104
  case 'view':
105
  $view = $itemInfo['url'];
106
  /** @noinspection HtmlUnknownTarget */
107
+ return sprintf(
108
+ '<a href="%1$s" title="%2$s" aria-label="%2$s" target="_blank"><span class="dashicons dashicons-external" aria-hidden="true"></span></a>
109
+ <a id="%3$s" class="wpf_regenerate%6$s" href="#" title="%4$s" aria-label="%4$s"><span class="dashicons dashicons-update-alt%7$s" aria-hidden="true"></span></a>
110
+ <a href="%1$s" title="%5$s" aria-label="%5$s" download><span class="dashicons dashicons-download" aria-hidden="true"></span></a>',
111
+ $view, __( 'View' ), $getItem, __( 'Regenerate' ), __( 'Download' ), $disableBtn, $spinIcon );
112
  default:
113
  return false;
114
  }
336
  public function process_bulk_action()
337
  {
338
  //Detect when a bulk action is being triggered...
339
+ if ( 'delete-feed' === $this->current_action() ) {
340
  // In our file that handles the request, verify the nonce.
341
  $nonce = esc_attr($_REQUEST['_wpnonce']);
342
  if (!wp_verify_nonce($nonce, 'wf_delete_feed')) {
343
+ update_option('wpf_message', esc_html__( 'Failed To Delete Feed. You do not have sufficient permission to delete.', 'woo-feed' ), false );
344
+ wp_redirect(admin_url("admin.php?page=webappick-manage-feeds&wpf_message=error"));
345
+ wp_die();
346
  } else {
347
  if (self::delete_feed(absint($_GET['feed']))) {
348
+ update_option( 'wpf_message', esc_html__( 'Feed Deleted Successfully', 'woo-feed' ), false );
349
+ wp_redirect(admin_url("admin.php?page=webappick-manage-feeds&wpf_message=success"));
350
+ wp_die();
351
  } else {
352
+ update_option( 'wpf_message', esc_html__( 'Failed To Delete Feed', 'woo-feed' ), false );
353
+ wp_redirect(admin_url("admin.php?page=webappick-manage-feeds&wpf_message=error"));
354
+ wp_die();
355
  }
356
 
357
  }
359
  //Detect when a bulk action is being triggered...
360
  if ('edit-feed' === $this->current_action()) {
361
  // In our file that handles the request, verify the nonce.
362
+ $nonce = esc_attr( $_REQUEST['_wpnonce'] );
363
+ if ( ! wp_verify_nonce( $nonce, 'wf_edit_feed' ) ) {
364
+ wp_die( esc_html__( 'You do not have sufficient permission to delete!', 'woo-feed' ) );
365
  }
366
  }
367
 
373
  if ('bulk-delete' === $this->current_action()) {
374
  $nonce = esc_attr($_REQUEST['_wpnonce']);
375
  if (!wp_verify_nonce($nonce, "bulk-" . $this->_args['plural'])) {
376
+ wp_die( esc_html__( 'You do not have sufficient permission to delete!', 'woo-feed' ) );
377
  } else {
378
+ $delete_ids = array_map( 'absint', $_POST['feed'] );
379
+ $delete_ids = array_filter( $delete_ids );
380
+ // loop over the array of record IDs and delete them
381
+ if ( ! empty( $delete_ids ) ) {
382
+ $count = count( $delete_ids );
383
+ foreach ( $delete_ids as $id ) {
384
+ self::delete_feed( $id );
385
 
386
  }
387
+ $message = sprintf(
388
+ esc_html( _n( '%d Feed Successfully Deleted.', '%d Feeds Successfully Deleted.', $count, 'woo-feed' ) ),
389
+ $count
390
+ );
391
+ update_option( 'wpf_message', $message );
392
+ wp_redirect(admin_url("admin.php?page=webappick-manage-feeds&wpf_message=success"));
393
+ wp_die();
394
  }
395
  }
396
  }
544
  */
545
  $this->items = $data;
546
  }
 
 
547
  }
admin/css/woo-feed-admin.css CHANGED
@@ -2,10 +2,18 @@
2
  * All of the CSS for your admin-specific functionality should be
3
  * included in this file.
4
  */
5
- .wpf_sos{
6
  -webkit-animation: spin 1000ms infinite linear;
7
  animation: spin 1000ms infinite linear;
8
  }
 
 
 
 
 
 
 
 
9
  @-webkit-keyframes spin {
10
  0% {
11
  -webkit-transform: rotate(0deg);
@@ -285,25 +293,23 @@ p {
285
  color: white;
286
  }
287
 
 
 
 
 
 
288
  .wf_tabs .wf-tab-content {
289
  z-index: 2;
290
  display: none;
291
  overflow: hidden;
292
  width: 100%;
293
  font-size: 0.9rem;
294
- /*line-height: 5px;*/
295
- /*padding: 5px;*/
296
  position: absolute;
297
  left: 0;
298
  background: #fff;
299
  border: 2px solid #CCC;
300
  }
301
 
302
- .wf_tabs [id^="tab"]:checked + label {
303
- background: #2CC185;
304
- color: white;
305
- }
306
-
307
  .wf_tabs [id^="tab"]:checked ~ [id^="wf-tab-content"] {
308
  display: block;
309
  }
@@ -367,7 +373,7 @@ input[class=woo_feed_status_input]:checked + label:before{
367
  .widefat td.column-url, .widefat th.column-url,
368
  .column-url { color: #008779; font-weight: bold; }
369
 
370
- /* Feed Progress */
371
  .feed-progress-container {
372
  width:100%;
373
  color: white;
@@ -625,6 +631,33 @@ input[class=woo_feed_status_input]:checked + label:before{
625
  ul.tracker_collection_list { list-style: initial; padding: initial; margin: -10px 0 0 30px; font-size: 11px !important; }
626
  ul.tracker_collection_list li { margin: 0; }
627
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
628
  /** Admin Page Wrapper **/
629
  .wapk-admin, .wapk-admin * {
630
  -webkit-box-sizing: border-box;
@@ -676,7 +709,7 @@ ul.tracker_collection_list li { margin: 0; }
676
  line-height: 1.3;
677
  }
678
  .wapk-admin .wapk-section,
679
- .wapk-admin .notice {
680
  /* Restore .warp margin */
681
  margin: 15px 20px 0 20px;
682
  position: relative;
@@ -702,7 +735,7 @@ ul.tracker_collection_list li { margin: 0; }
702
  vertical-align: middle;
703
  }
704
  /** Extend WP Core UI PostBox For Docs **/
705
- +.wapk-feed-docs .postbox { width: 355px; margin-right: 20px; display: inline-block; vertical-align: top; }
706
  @media only screen and (max-width: 850px) {
707
  .wapk-feed-docs .postbox { display: block; width: auto; float: none; margin-right: auto; }
708
  }
@@ -713,7 +746,9 @@ ul.tracker_collection_list li { margin: 0; }
713
  .wapk-feed-docs .postbox ul { margin-bottom: 0; }
714
  .wapk-feed-docs .postbox .toggle-indicator:before { content: "\F142"; display: inline-block; font: 400 20px/1 dashicons; speak: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-decoration: none!important; }
715
  .wapk-feed-docs .postbox.closed .toggle-indicator:before { content: "\F140"; }
716
-
 
 
717
  #poststuff #feed_merchant_info .inside { margin: 0; padding: 0; }
718
  #feed_merchant_info ul.data { margin-left: 24px; margin-top: 5px; }
719
  #feed_merchant_info ul.data li { margin-bottom: 5px; }
@@ -726,13 +761,14 @@ ul.tracker_collection_list li { margin: 0; }
726
  .wp-submenu li.current span.woo-feed-docs { color: #ce7304; }
727
  .wapk-admin .wapk-feed-docs .postbox .hndle { cursor: default; }
728
 
 
729
  /** Admin Call-To-Action **/
730
  .wapk-cta { position: relative; display: flex; width: 100%; padding: 100px 15px; background: linear-gradient(45deg, #6CD5FF 33%, #c2efef 100%); justify-content: center; align-items: center; }
731
  .wapk-cta-icon .dashicons { font-size: 100px; width: 100px; height: auto; margin: 0 10px -8px 0; color: #02658c; }
732
  .wapk-cta-content {width: 50%;}
733
  .wapk-cta-content h2 { font-size: 2em; margin: 0.5em 0; }
734
  .wapk-cta-action {}
735
- .wapk-cta-action a.button { font-size: 24px; height: auto !important; padding: 10px 20px; }
736
  @media (max-width: 600px) {
737
  .wapk-cta { display: block; text-align: center; padding: 4em 0; }
738
  .wapk-cta-content { width: 100%; margin: 2em 0; }
@@ -741,160 +777,215 @@ ul.tracker_collection_list li { margin: 0; }
741
  /** Override .wp-core-ui .button styles with prefix .wapk-admin **/
742
  /* @TODO refactor with scss */
743
  /* Button Skin */
744
- .wapk-admin .button,
745
- .wapk-admin .button-secondary {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
746
  color: #00D4D4;
747
  border-color: #00D4D4;
 
748
  }
749
- .wapk-admin .button > svg,
750
- .wapk-admin .button-secondary > svg {
751
  width: 15px;
752
  margin-left: 5px;
753
  fill: #00D4D4;
754
  }
755
- .wapk-admin .button > .dashicons,
756
- .wapk-admin .button-secondary > .dashicons {
757
  color: #00D4D4;
758
  }
759
- .wapk-admin .button.hover,
760
- .wapk-admin .button:hover,
761
- .wapk-admin .button-secondary:hover,
762
- .wapk-admin .button.focus,
763
- .wapk-admin .button:focus,
764
- .wapk-admin .button-secondary:focus {
765
  border-color: #00bbbb;
766
  color: #00bbbb;
767
  }
768
- .wapk-admin .button.hover > svg,
769
- .wapk-admin .button:hover > svg,
770
- .wapk-admin .button-secondary:hover > svg,
771
- .wapk-admin .button.focus > svg,
772
- .wapk-admin .button:focus > svg,
773
- .wapk-admin .button-secondary:focus > svg {
774
  fill: #00bbbb;
775
  }
776
- .wapk-admin .button.hover > .dashicons,
777
- .wapk-admin .button:hover > .dashicons,
778
- .wapk-admin .button-secondary:hover > .dashicons,
779
- .wapk-admin .button.focus > .dashicons,
780
- .wapk-admin .button:focus > .dashicons,
781
- .wapk-admin .button-secondary:focus > .dashicons {
782
  color: #00bbbb;
783
  }
784
- .wapk-admin .button.focus,
785
- .wapk-admin .button:focus,
786
- .wapk-admin .button-secondary:focus {
787
  border-color: #00D4D4;
788
  color: #00bbbb;
789
  box-shadow: 0 0 0 1px #00D4D4;
790
  }
791
- .wapk-admin .button.focus > svg,
792
- .wapk-admin .button:focus > svg,
793
- .wapk-admin .button-secondary:focus > svg {
794
  fill: #00bbbb;
795
  }
796
- .wapk-admin .button.focus > .dashicons,
797
- .wapk-admin .button:focus > .dashicons,
798
- .wapk-admin .button-secondary:focus > .dashicons {
799
  color: #00bbbb;
800
  }
801
- .wapk-admin .button:active {
802
  background: #00bbbb;
803
  border-color: #00bbbb;
804
  }
805
- .wapk-admin .button.active,
806
- .wapk-admin .button.active:focus,
807
- .wapk-admin .button.active:hover {
808
  border-color: #00bbbb;
809
  color: #00bbbb;
810
  box-shadow: inset 0 2px 5px -3px #00bbbb;
811
  }
812
- .wapk-admin .button.active > svg,
813
- .wapk-admin .button.active:focus > svg,
814
- .wapk-admin .button.active:hover > svg {
815
  fill: #00bbbb;
816
  }
817
- .wapk-admin .button.active > .dashicons,
818
- .wapk-admin .button.active:focus > .dashicons,
819
- .wapk-admin .button.active:hover > .dashicons {
820
  color: #00bbbb;
821
  }
822
- .wapk-admin .button-primary {
823
  background: #00D4D4;
824
  border-color: #00D4D4;
825
  color: #fff;
 
826
  box-shadow: 0 1px 0 #00bbbb;
827
  text-shadow: 0 -1px 1px #00bbbb, 1px 0 1px #00bbbb, 0 1px 1px #00bbbb, -1px 0 1px #00bbbb;
828
  }
829
- .wapk-admin .button-primary > svg {
830
  fill: #fff;
831
  }
832
- .wapk-admin .button-primary:hover, .wapk-admin .button-primary:focus {
 
833
  background: #00e3e3;
834
  border-color: #00c5c5;
835
  color: #fff;
836
  }
837
- .wapk-admin .button-primary:hover > svg, .wapk-admin .button-primary:focus > svg {
 
838
  fill: #fff;
839
  }
840
- .wapk-admin .button-primary:focus {
841
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00D4D4;
842
  }
843
- .wapk-admin .button-primary:active {
844
  background: #00bbbb;
845
  border-color: #00bbbb;
846
  color: #fff;
847
  }
848
- .wapk-admin .button-primary:active > svg {
849
  fill: #fff;
850
  }
851
- .wapk-admin .button-primary.active, .wapk-admin .button-primary.active:focus, .wapk-admin .button-primary.active:hover {
 
 
852
  background: #00D4D4;
853
  color: #fff;
854
  border-color: #008888;
855
  box-shadow: inset 0 2px 5px -3px black;
856
  }
857
- .wapk-admin .button-primary.active > svg, .wapk-admin .button-primary.active:focus > svg, .wapk-admin .button-primary.active:hover > svg {
 
 
858
  fill: #fff;
859
  }
860
- .wapk-admin .button-primary[disabled], .wapk-admin .button-primary:disabled, .wapk-admin .button-primary.button-primary-disabled, .wapk-admin .button-primary.disabled {
 
 
 
861
  color: #c7d1d1 !important;
862
  background: #22ffff !important;
863
  border-color: #22ffff !important;
864
  text-shadow: none !important;
865
  }
866
- .wapk-admin .button-primary[disabled] > svg, .wapk-admin .button-primary:disabled > svg, .wapk-admin .button-primary.button-primary-disabled > svg, .wapk-admin .button-primary.disabled > svg {
 
 
 
867
  fill: #c7d1d1 !important;
868
  }
869
- .wapk-admin .button.button-primary.button-hero {
870
  box-shadow: 0 2px 0 #00bbbb;
871
  }
872
- .wapk-admin .button.button-primary.button-hero:focus {
873
  box-shadow: 0 2px 0 #00bbbb, 0 1px 0 #00c5c5, 0 0 2px 1px #00eeee;
874
  }
875
- .wapk-admin .button.button-primary.button-hero.active, .wapk-admin .button.button-primary.button-hero.active:hover, .wapk-admin .button.button-primary.button-hero.active:focus, .wapk-admin .button.button-primary.button-hero:active {
 
 
 
876
  box-shadow: inset 0 3px 0 #00a1a1;
877
  }
878
- .wapk-admin .button-group > .button.active {
879
  border-color: #00D4D4;
880
  }
881
 
882
  /* Button Sizes */
883
- .wapk-admin .button.button-xl,
884
- .wapk-admin .button-group.button-xl .button {
885
  height: 30px;
886
  line-height: 28px;
887
  padding: 0 12px 2px;
888
  }
889
- .wapk-admin .button.button-hero,
890
- .wapk-admin .button-group.button-hero .button {
891
  font-size: 18px;
892
  height: 50px;
893
  line-height: 48px;
894
  padding: 0 36px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
895
  }
896
  @media screen and (max-width: 782px) {
897
- .wapk-admin .button.button-xl {
 
 
 
898
  padding: 6px 14px;
899
  line-height: normal;
900
  font-size: 14px;
@@ -918,6 +1009,9 @@ ul.tracker_collection_list li { margin: 0; }
918
  /**
919
  * Premium Page Design
920
  */
 
 
 
921
  .woo_feed_free_manage_attribute {
922
  margin: 0 auto;
923
  width: 100%;
@@ -1297,7 +1391,6 @@ span.wapk-price__table__feature span.dashicons {
1297
  font-size: 14px;
1298
  text-transform: uppercase;
1299
  letter-spacing: 3px;
1300
- background-color: #23d378;
1301
  border-radius: 100px 100px 100px 100px;
1302
  padding: 16px 42px;
1303
  transition: all 250ms;
@@ -1305,7 +1398,6 @@ span.wapk-price__table__feature span.dashicons {
1305
  .wapk-price__table__footer a:hover,
1306
  .wapk-price__table__footer a:focus,
1307
  .wapk-price__table__footer a:active {
1308
- background-color: #ef2e5e;
1309
  transform: scale(1.02) !important;
1310
  }
1311
  .wapk-price__table__ribbon {
2
  * All of the CSS for your admin-specific functionality should be
3
  * included in this file.
4
  */
5
+ .wpf_spin, .wpf_spin_reverse {
6
  -webkit-animation: spin 1000ms infinite linear;
7
  animation: spin 1000ms infinite linear;
8
  }
9
+ .wpf_spin_reverse {
10
+ animation-direction: reverse;
11
+ }
12
+ .wpf_regenerate.disabled {
13
+ color: #737373;
14
+ box-shadow: none;
15
+ cursor: not-allowed;
16
+ }
17
  @-webkit-keyframes spin {
18
  0% {
19
  -webkit-transform: rotate(0deg);
293
  color: white;
294
  }
295
 
296
+ .wf_tabs [id^="tab"]:checked + label {
297
+ background: #2CC185;
298
+ color: white;
299
+ }
300
+
301
  .wf_tabs .wf-tab-content {
302
  z-index: 2;
303
  display: none;
304
  overflow: hidden;
305
  width: 100%;
306
  font-size: 0.9rem;
 
 
307
  position: absolute;
308
  left: 0;
309
  background: #fff;
310
  border: 2px solid #CCC;
311
  }
312
 
 
 
 
 
 
313
  .wf_tabs [id^="tab"]:checked ~ [id^="wf-tab-content"] {
314
  display: block;
315
  }
373
  .widefat td.column-url, .widefat th.column-url,
374
  .column-url { color: #008779; font-weight: bold; }
375
 
376
+ /** Feed Progress **/
377
  .feed-progress-container {
378
  width:100%;
379
  color: white;
631
  ul.tracker_collection_list { list-style: initial; padding: initial; margin: -10px 0 0 30px; font-size: 11px !important; }
632
  ul.tracker_collection_list li { margin: 0; }
633
 
634
+ /** Info Message Table **/
635
+ table.wf-info-table th,
636
+ table.wf-rate-table th { vertical-align: middle; text-align: center; max-width: 100%; font-weight: 500; }
637
+ table.wf-info-table th strong,
638
+ table.wf-rate-table th strong { font-weight: bold; }
639
+ table.wf-info-table th:first-child img { margin: 0 0 -5px 5px; }
640
+ table.wf-rate-table a { color:#0073aa; }
641
+ table.wf-rate-table a.review-star:after {
642
+ content: "\f155\f155\f155\f155\f155" !important;
643
+ font-family: dashicons;
644
+ font-size: 10px;
645
+ font-weight: 100;
646
+ text-rendering: auto;
647
+ -webkit-font-smoothing: antialiased;
648
+ -moz-osx-font-smoothing: grayscale;
649
+ /*content: '★★★★★'; /*&#x2605;&#x2605;&#x2605;&#x2605;&#x2605;*/
650
+ /*content: '\2605\2605\2605\2605\2605';*/
651
+ color:#0073aa;text-decoration: underline;
652
+ }
653
+
654
+ /** Admin Menu Icon **/
655
+ #adminmenu #toplevel_page_webappick-manage-feeds div.wp-menu-image::before {
656
+ content: "";
657
+ background: url(../images/woo-feed-icon.svg) no-repeat center center;
658
+ background-size: 20px 20px;
659
+ }
660
+
661
  /** Admin Page Wrapper **/
662
  .wapk-admin, .wapk-admin * {
663
  -webkit-box-sizing: border-box;
709
  line-height: 1.3;
710
  }
711
  .wapk-admin .wapk-section,
712
+ .wapk-admin >.notice {
713
  /* Restore .warp margin */
714
  margin: 15px 20px 0 20px;
715
  position: relative;
735
  vertical-align: middle;
736
  }
737
  /** Extend WP Core UI PostBox For Docs **/
738
+ .wapk-admin .wapk-section.wapk-feed-docs .postbox { width: 355px; margin-right: 20px; display: inline-block; vertical-align: top; }
739
  @media only screen and (max-width: 850px) {
740
  .wapk-feed-docs .postbox { display: block; width: auto; float: none; margin-right: auto; }
741
  }
746
  .wapk-feed-docs .postbox ul { margin-bottom: 0; }
747
  .wapk-feed-docs .postbox .toggle-indicator:before { content: "\F142"; display: inline-block; font: 400 20px/1 dashicons; speak: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-decoration: none!important; }
748
  .wapk-feed-docs .postbox.closed .toggle-indicator:before { content: "\F140"; }
749
+ .wapk-section #post-body.columns-2 #side-sortables {
750
+ min-height: 196px;
751
+ }
752
  #poststuff #feed_merchant_info .inside { margin: 0; padding: 0; }
753
  #feed_merchant_info ul.data { margin-left: 24px; margin-top: 5px; }
754
  #feed_merchant_info ul.data li { margin-bottom: 5px; }
761
  .wp-submenu li.current span.woo-feed-docs { color: #ce7304; }
762
  .wapk-admin .wapk-feed-docs .postbox .hndle { cursor: default; }
763
 
764
+
765
  /** Admin Call-To-Action **/
766
  .wapk-cta { position: relative; display: flex; width: 100%; padding: 100px 15px; background: linear-gradient(45deg, #6CD5FF 33%, #c2efef 100%); justify-content: center; align-items: center; }
767
  .wapk-cta-icon .dashicons { font-size: 100px; width: 100px; height: auto; margin: 0 10px -8px 0; color: #02658c; }
768
  .wapk-cta-content {width: 50%;}
769
  .wapk-cta-content h2 { font-size: 2em; margin: 0.5em 0; }
770
  .wapk-cta-action {}
771
+ .wapk-cta-action a.wapk-button { font-size: 24px; height: auto !important; padding: 10px 20px; }
772
  @media (max-width: 600px) {
773
  .wapk-cta { display: block; text-align: center; padding: 4em 0; }
774
  .wapk-cta-content { width: 100%; margin: 2em 0; }
777
  /** Override .wp-core-ui .button styles with prefix .wapk-admin **/
778
  /* @TODO refactor with scss */
779
  /* Button Skin */
780
+ .wapk-button,
781
+ .wapk-button-primary,
782
+ .wapk-button-secondary {
783
+ display: inline-block;
784
+ text-decoration: none;
785
+ font-size: 13px;
786
+ line-height: 2.15384615;
787
+ min-height: 30px;
788
+ margin: 0;
789
+ padding: 0 10px;
790
+ cursor: pointer;
791
+ border-width: 1px;
792
+ border-style: solid;
793
+ -webkit-appearance: none;
794
+ border-radius: 3px;
795
+ white-space: nowrap;
796
+ box-sizing: border-box;
797
+ }
798
+ .wapk-button,
799
+ .wapk-button-secondary {
800
  color: #00D4D4;
801
  border-color: #00D4D4;
802
+ text-decoration: none;
803
  }
804
+ .wapk-button > svg,
805
+ .wapk-button-secondary > svg {
806
  width: 15px;
807
  margin-left: 5px;
808
  fill: #00D4D4;
809
  }
810
+ .wapk-button > .dashicons,
811
+ .wapk-button-secondary > .dashicons {
812
  color: #00D4D4;
813
  }
814
+ .wapk-button.hover,
815
+ .wapk-button:hover,
816
+ .wapk-button-secondary:hover,
817
+ .wapk-button.focus,
818
+ .wapk-button:focus,
819
+ .wapk-button-secondary:focus {
820
  border-color: #00bbbb;
821
  color: #00bbbb;
822
  }
823
+ .wapk-button.hover > svg,
824
+ .wapk-button:hover > svg,
825
+ .wapk-button-secondary:hover > svg,
826
+ .wapk-button.focus > svg,
827
+ .wapk-button:focus > svg,
828
+ .wapk-button-secondary:focus > svg {
829
  fill: #00bbbb;
830
  }
831
+ .wapk-button.hover > .dashicons,
832
+ .wapk-button:hover > .dashicons,
833
+ .wapk-button-secondary:hover > .dashicons,
834
+ .wapk-button.focus > .dashicons,
835
+ .wapk-button:focus > .dashicons,
836
+ .wapk-button-secondary:focus > .dashicons {
837
  color: #00bbbb;
838
  }
839
+ .wapk-button.focus,
840
+ .wapk-button:focus,
841
+ .wapk-button-secondary:focus {
842
  border-color: #00D4D4;
843
  color: #00bbbb;
844
  box-shadow: 0 0 0 1px #00D4D4;
845
  }
846
+ .wapk-button.focus > svg,
847
+ .wapk-button:focus > svg,
848
+ .wapk-button-secondary:focus > svg {
849
  fill: #00bbbb;
850
  }
851
+ .wapk-button.focus > .dashicons,
852
+ .wapk-button:focus > .dashicons,
853
+ .wapk-button-secondary:focus > .dashicons {
854
  color: #00bbbb;
855
  }
856
+ .wapk-button:active {
857
  background: #00bbbb;
858
  border-color: #00bbbb;
859
  }
860
+ .wapk-button.active,
861
+ .wapk-button.active:focus,
862
+ .wapk-button.active:hover {
863
  border-color: #00bbbb;
864
  color: #00bbbb;
865
  box-shadow: inset 0 2px 5px -3px #00bbbb;
866
  }
867
+ .wapk-button.active > svg,
868
+ .wapk-button.active:focus > svg,
869
+ .wapk-button.active:hover > svg {
870
  fill: #00bbbb;
871
  }
872
+ .wapk-button.active > .dashicons,
873
+ .wapk-button.active:focus > .dashicons,
874
+ .wapk-button.active:hover > .dashicons {
875
  color: #00bbbb;
876
  }
877
+ .wapk-button-primary {
878
  background: #00D4D4;
879
  border-color: #00D4D4;
880
  color: #fff;
881
+ text-decoration: none;
882
  box-shadow: 0 1px 0 #00bbbb;
883
  text-shadow: 0 -1px 1px #00bbbb, 1px 0 1px #00bbbb, 0 1px 1px #00bbbb, -1px 0 1px #00bbbb;
884
  }
885
+ .wapk-button-primary > svg {
886
  fill: #fff;
887
  }
888
+ .wapk-button-primary:hover,
889
+ .wapk-button-primary:focus {
890
  background: #00e3e3;
891
  border-color: #00c5c5;
892
  color: #fff;
893
  }
894
+ .wapk-button-primary:hover > svg,
895
+ .wapk-button-primary:focus > svg {
896
  fill: #fff;
897
  }
898
+ .wapk-button-primary:focus {
899
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00D4D4;
900
  }
901
+ .wapk-button-primary:active {
902
  background: #00bbbb;
903
  border-color: #00bbbb;
904
  color: #fff;
905
  }
906
+ .wapk-button-primary:active > svg {
907
  fill: #fff;
908
  }
909
+ .wapk-button-primary.active,
910
+ .wapk-button-primary.active:focus,
911
+ .wapk-button-primary.active:hover {
912
  background: #00D4D4;
913
  color: #fff;
914
  border-color: #008888;
915
  box-shadow: inset 0 2px 5px -3px black;
916
  }
917
+ .wapk-button-primary.active > svg,
918
+ .wapk-button-primary.active:focus > svg,
919
+ .wapk-button-primary.active:hover > svg {
920
  fill: #fff;
921
  }
922
+ .wapk-button-primary[disabled],
923
+ .wapk-button-primary:disabled,
924
+ .wapk-button-primary.wapk-button-primary-disabled,
925
+ .wapk-button-primary.disabled {
926
  color: #c7d1d1 !important;
927
  background: #22ffff !important;
928
  border-color: #22ffff !important;
929
  text-shadow: none !important;
930
  }
931
+ .wapk-button-primary[disabled] > svg,
932
+ .wapk-button-primary:disabled > svg,
933
+ .wapk-button-primary.wapk-button-primary-disabled > svg,
934
+ .wapk-button-primary.disabled > svg {
935
  fill: #c7d1d1 !important;
936
  }
937
+ .wapk-button.wapk-button-primary.wapk-button-hero {
938
  box-shadow: 0 2px 0 #00bbbb;
939
  }
940
+ .wapk-button.wapk-button-primary.wapk-button-hero:focus {
941
  box-shadow: 0 2px 0 #00bbbb, 0 1px 0 #00c5c5, 0 0 2px 1px #00eeee;
942
  }
943
+ .wapk-button.wapk-button-primary.wapk-button-hero.active,
944
+ .wapk-button.wapk-button-primary.wapk-button-hero.active:hover,
945
+ .wapk-button.wapk-button-primary.wapk-button-hero.active:focus,
946
+ .wapk-button.wapk-button-primary.wapk-button-hero:active {
947
  box-shadow: inset 0 3px 0 #00a1a1;
948
  }
949
+ .wapk-button-group > .wapk-button.active {
950
  border-color: #00D4D4;
951
  }
952
 
953
  /* Button Sizes */
954
+ .wapk-button.wapk-button-xl,
955
+ .wapk-button-group.wapk-button-xl .wapk-button {
956
  height: 30px;
957
  line-height: 28px;
958
  padding: 0 12px 2px;
959
  }
960
+ .wapk-button.wapk-button-hero,
961
+ .wapk-button-group.wapk-button-hero .wapk-button {
962
  font-size: 18px;
963
  height: 50px;
964
  line-height: 48px;
965
  padding: 0 36px;
966
+ min-height: 46px;
967
+ }
968
+
969
+ @media screen and (min-width: 782px) {
970
+ th#status { width: 80px; }
971
+ th#provider { width: 80px; }
972
+ th#type { width: 50px; }
973
+ th#option_name { width: 100px; }
974
+ td.option_name.column-option_name >span:first-child { display: none; }
975
+ th#last_updated { width: 90px; }
976
+ th#view { width: 90px; }
977
+ }
978
+ @media screen and (min-width: 960px) {
979
+ th#status, th#provider, th#view { width: 100px; }
980
+ th#type { width: 80px; }
981
+ th#option_name { width: 150px; }
982
+ th#last_updated { width: 140px; }
983
  }
984
  @media screen and (max-width: 782px) {
985
+ table.wf-info-table { margin-top: 10px; }
986
+ table.wf-info-table th:first-child img { margin: 0 auto; display: block; }
987
+
988
+ .wapk-button.wapk-button-xl {
989
  padding: 6px 14px;
990
  line-height: normal;
991
  font-size: 14px;
1009
  /**
1010
  * Premium Page Design
1011
  */
1012
+ .wp-submenu li span.woo-feed-premium { font-weight: bold; color: #28e499; }
1013
+ .wp-submenu li:hover span.woo-feed-premium,
1014
+ .wp-submenu li.current span.woo-feed-premium { color: #1dc381; }
1015
  .woo_feed_free_manage_attribute {
1016
  margin: 0 auto;
1017
  width: 100%;
1391
  font-size: 14px;
1392
  text-transform: uppercase;
1393
  letter-spacing: 3px;
 
1394
  border-radius: 100px 100px 100px 100px;
1395
  padding: 16px 42px;
1396
  transition: all 250ms;
1398
  .wapk-price__table__footer a:hover,
1399
  .wapk-price__table__footer a:focus,
1400
  .wapk-price__table__footer a:active {
 
1401
  transform: scale(1.02) !important;
1402
  }
1403
  .wapk-price__table__ribbon {
admin/images/woo-feed-icon.svg ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="58px" height="75px" viewBox="0 0 58 75" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!-- Generator: Sketch 61 (89581) - https://sketch.com -->
4
+ <title>file-icon copy</title>
5
+ <desc>Created with Sketch.</desc>
6
+ <g id="Wordpress-Banner_design" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
7
+ <g id="icon-128x128-" transform="translate(-35.000000, -10.000000)" fill-rule="nonzero">
8
+ <g id="file-icon-copy" transform="translate(35.000000, 10.000000)">
9
+ <path d="M6.8377752,4 L47.8644264,4 C52.9098644,4 57,8.10494903 57,13.1686603 L57,68.138756 C57,71.3758317 54.3853014,74 51.1599073,74 L8.48551564,74 C5.45594901,74 3,71.5351562 3,68.4946172 L3,7.7888756 C3.03416325,5.68621911 4.74242801,4 6.8377752,4 Z" id="Path" fill="#0088F7"></path>
10
+ <path d="M56,15 L49.5105348,15 C45.9148657,15 43,12.0851343 43,8.48946515 L43,2 C50.1748912,2.01160049 55.9883995,7.82510883 56,15 Z" id="Path" fill="#FFFFFF"></path>
11
+ <path d="M36.7494904,13 L21.3399131,13 C20.3533288,13.1044429 19.603851,13.9499622 19.603851,14.9585292 C19.603851,15.9670962 20.3533288,16.8126155 21.3399131,16.9170584 L36.7494904,16.9170584 C37.7360747,16.8126155 38.4855525,15.9670962 38.4855525,14.9585292 C38.4855525,13.9499622 37.7360747,13.1044429 36.7494904,13 Z M44.5167503,49.523923 C44.0595474,49.0728946 43.4117619,48.882439 42.7883788,49.0157641 C42.6634363,49.0157641 42.5384937,49.0157641 42.3927275,49.1428038 L42.0803712,49.3333634 C41.9644511,49.4018595 41.859183,49.4874875 41.7680149,49.5874429 C41.3837972,49.9364937 41.1704713,50.440027 41.1849498,50.9637066 C41.1849498,51.0907464 41.1849498,51.2177861 41.1849498,51.3659991 C41.1849498,51.5142121 41.1849498,51.6200786 41.3098923,51.7682916 C41.4348348,51.9165046 41.4348348,51.9588512 41.4973061,52.0858909 C41.57128,52.2050279 41.6625482,52.3121051 41.7680149,52.4034903 C42.1095704,52.7965966 42.6059714,53.0140202 43.1215588,52.9963423 C43.63752,53.0337477 44.132485,52.7821111 44.4126315,52.3399704 C44.5161224,52.2523054 44.6011192,52.1442761 44.6625166,52.0223711 C44.7387767,51.9255745 44.8018187,51.8187409 44.8499303,51.7047717 C44.9227107,51.5828055 44.965564,51.4448256 44.9748728,51.3024793 C45.0083757,51.1705452 45.0083757,51.0321208 44.9748728,50.9001868 C45.0092361,50.3976096 44.8442498,49.9019678 44.5167503,49.523923 L44.5167503,49.523923 Z M33.4801611,49.0792839 L14.9261972,49.0792839 C13.8623878,49.0792839 13,49.9561473 13,51.0378131 C13,52.119479 13.8623878,52.9963423 14.9261972,52.9963423 L33.4801611,52.9963423 C34.5439705,52.9963423 35.4063583,52.119479 35.4063583,51.0378131 C35.4063583,49.9561473 34.5439705,49.0792839 33.4801611,49.0792839 L33.4801611,49.0792839 Z M43.1007351,40.9487411 L14.9261972,40.9487411 C13.9396128,41.0531839 13.190135,41.8987033 13.190135,42.9072703 C13.190135,43.9158373 13.9396128,44.7613566 14.9261972,44.8657995 L43.1632063,44.8657995 C44.1497907,44.7613566 44.8992685,43.9158373 44.8992685,42.9072703 C44.8992685,41.8987033 44.1497907,41.0531839 43.1632063,40.9487411 L43.1007351,40.9487411 Z M43.1007351,32.585292 L14.9261972,32.585292 C13.9396128,32.6897349 13.190135,33.5352543 13.190135,34.5438212 C13.190135,35.5523882 13.9396128,36.3979076 14.9261972,36.5023505 L43.1632063,36.5023505 C44.1497907,36.3979076 44.8992685,35.5523882 44.8992685,34.5438212 C44.8992685,33.5352543 44.1497907,32.6897349 43.1632063,32.585292 L43.1007351,32.585292 Z" id="Shape" fill="#FFFFFF"></path>
12
+ <path d="M49.5829713,16.7343226 L56.0158084,16.7343226 C56.784191,16.7046708 57.4742187,16.2529667 57.8119901,15.5585108 C57.9367201,15.3188338 58.0012521,15.052128 57.9999816,14.7816351 L57.9999816,14.6346586 C57.9170055,11.5427931 56.8887567,8.55164981 55.05506,6.06802925 L55.05506,5.92105277 L54.7000008,5.48012332 L54.7000008,5.48012332 C54.4075991,5.12318043 54.0734257,4.76623754 53.7392524,4.40929465 C50.9890207,1.58861139 47.2252375,0 43.2963351,0 L8.35433383,0 C3.76472159,0 0.03442209,3.72183462 0,8.33566643 L0,66.6013438 C0,71.3255879 3.80122189,75 7.08029792,75 L48.1627346,75 C53.7601382,75 57.8119901,71.4515678 57.8119901,66.6013438 L57.8119901,44.218925 L57.8119901,23.2222845 C57.8175599,22.7155279 57.6226399,22.2273055 57.2701166,21.8650365 C56.9175932,21.5027674 56.436348,21.2961318 55.932265,21.2905936 L55.932265,21.2905936 C55.4209411,21.2849131 54.9289109,21.4866054 54.5673283,21.8501064 C54.2057456,22.2136074 54.0051177,22.7082479 54.0107682,23.2222845 L54.0107682,44.218925 L54.0107682,66.5803472 C54.0107682,69.2889138 51.6924406,71.0946249 48.2253921,71.0946249 L7.08029792,71.0946249 C5.12773818,70.4779266 3.81629757,68.6373057 3.8638794,66.5803472 L3.8638794,8.33566643 C3.85829314,7.13669274 4.32959915,5.98520271 5.1729367,5.13739099 C6.01627426,4.28957926 7.16168751,3.81577283 8.35433383,3.82138872 L41.2077516,3.82138872 L41.2077516,8.33566643 C41.2077447,10.5667712 42.0907974,12.7061904 43.662059,14.281849 C45.2333206,15.8575075 47.3636477,16.7399004 49.5829713,16.7343226 Z M49.5829713,12.8499441 C48.3867178,12.8611973 47.2359054,12.3898809 46.388029,11.5414525 C45.5401526,10.693024 45.0659885,9.53830569 45.0715812,8.33566643 L45.0715812,4.01035848 C49.5649482,4.81782831 53.0822447,8.35378511 53.8854532,12.8709408 L49.5829713,12.8499441 Z" id="Shape" fill="#2E3B50"></path>
13
+ </g>
14
+ </g>
15
+ </g>
16
+ </svg>
admin/images/woo-feed-pro-horizontal-logo.svg ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="123px" height="25px" viewBox="0 0 123 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!-- Generator: Sketch 61 (89581) - https://sketch.com -->
4
+ <title>Group 3</title>
5
+ <desc>Created with Sketch.</desc>
6
+ <g id="Wordpress-Banner_design" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
7
+ <g id="icon-128x128-" transform="translate(-2.000000, -49.000000)">
8
+ <g id="Group-3" transform="translate(2.000000, 49.000000)">
9
+ <g id="Group" fill-rule="nonzero">
10
+ <g id="file-icon-copy">
11
+ <path d="M2.20818849,1 L15.1239861,1 C16.7123647,1 18,2.34876897 18,4.01255981 L18,22.0741627 C18,23.1377733 17.1768542,24 16.1614523,24 L2.72692159,24 C1.77316913,24 1,23.1901227 1,22.1910885 L1,2.24491627 C1.0107551,1.55404342 1.54854215,1 2.20818849,1 Z" id="Path" fill="#0088F7"></path>
12
+ <path d="M18,5 L16.0032415,5 C14.8968818,5 14,4.10311823 14,2.99675851 L14,1 C16.2076588,1.00356938 17.9964306,2.79234118 18,5 Z" id="Path" fill="#FFFFFF"></path>
13
+ <path d="M12.4217157,4 L7.60622285,4 C7.29791524,4.03394393 7.06370343,4.30873772 7.06370343,4.63652199 C7.06370343,4.96430626 7.29791524,5.23910005 7.60622285,5.27304398 L12.4217157,5.27304398 C12.7300234,5.23910005 12.9642352,4.96430626 12.9642352,4.63652199 C12.9642352,4.30873772 12.7300234,4.03394393 12.4217157,4 Z M14.8489845,15.870275 C14.7061086,15.7236907 14.5036756,15.6617927 14.3088684,15.7051233 C14.2698238,15.7051233 14.2307793,15.7051233 14.1852273,15.7464112 L14.087616,15.8083431 C14.051391,15.8306043 14.0184947,15.8584334 13.9900046,15.8909189 C13.8699366,16.0043604 13.8032723,16.1680088 13.8077968,16.3382047 C13.8077968,16.3794926 13.8077968,16.4207805 13.8077968,16.4689497 C13.8077968,16.5171189 13.8077968,16.5515255 13.8468413,16.5996948 C13.8858859,16.647864 13.8858859,16.6616266 13.9054082,16.7029146 C13.928525,16.7416341 13.9570463,16.7764341 13.9900046,16.8061343 C14.0967407,16.9338939 14.2518661,17.0045566 14.4129871,16.9988113 C14.574225,17.010968 14.7289016,16.9291861 14.8164473,16.7854904 C14.8487882,16.7569993 14.8753497,16.7218897 14.8945364,16.6822706 C14.9183677,16.6508117 14.9380683,16.6160908 14.9531032,16.5790508 C14.9758471,16.5394118 14.9892388,16.4945683 14.9921478,16.4483058 C15.0026174,16.4054272 15.0026174,16.3604393 14.9921478,16.3175607 C15.0028863,16.1542231 14.951328,15.9931395 14.8489845,15.870275 L14.8489845,15.870275 Z M11.4000504,15.7257673 L5.60193661,15.7257673 C5.2694962,15.7257673 5,16.0107479 5,16.3622893 C5,16.7138307 5.2694962,16.9988113 5.60193661,16.9988113 L11.4000504,16.9988113 C11.7324908,16.9988113 12.001987,16.7138307 12.001987,16.3622893 C12.001987,16.0107479 11.7324908,15.7257673 11.4000504,15.7257673 L11.4000504,15.7257673 Z M14.4064797,13.0833409 L5.60193661,13.0833409 C5.29362901,13.1172848 5.0594172,13.3920786 5.0594172,13.7198628 C5.0594172,14.0476471 5.29362901,14.3224409 5.60193661,14.3563848 L14.426002,14.3563848 C14.7343096,14.3224409 14.9685214,14.0476471 14.9685214,13.7198628 C14.9685214,13.3920786 14.7343096,13.1172848 14.426002,13.0833409 L14.4064797,13.0833409 Z M14.4064797,10.3652199 L5.60193661,10.3652199 C5.29362901,10.3991638 5.0594172,10.6739576 5.0594172,11.0017419 C5.0594172,11.3295262 5.29362901,11.60432 5.60193661,11.6382639 L14.426002,11.6382639 C14.7343096,11.60432 14.9685214,11.3295262 14.9685214,11.0017419 C14.9685214,10.6739576 14.7343096,10.3991638 14.426002,10.3652199 L14.4064797,10.3652199 Z" id="Shape" fill="#FFFFFF"></path>
14
+ <path d="M16.2426925,5.57810754 L18.3500005,5.57810754 C18.601712,5.56822361 18.8277555,5.41765557 18.9384047,5.18617025 C18.9792645,5.10627795 19.0004043,5.01737599 18.9999881,4.92721169 L18.9999881,4.87821953 C18.9728063,3.84759771 18.6359663,2.85054994 18.0352727,2.02267642 L18.0352727,1.97368426 L17.9189602,1.82670777 L17.9189602,1.82670777 C17.8231735,1.70772681 17.713703,1.58874585 17.6042324,1.46976488 C16.7032947,0.529537129 15.4703317,0 14.1832778,0 L2.73676369,0 C1.23327049,0 0.0112761984,1.24061154 0,2.77855548 L0,22.2004479 C0,23.775196 1.24522748,25 2.31940723,25 L15.7774427,25 C17.6110743,25 18.9384047,23.8171893 18.9384047,22.2004479 L18.9384047,14.7396417 L18.9384047,7.74076151 C18.9402293,7.57184262 18.8763762,7.40910183 18.7608945,7.28834549 C18.6454127,7.16758914 18.4877635,7.09871059 18.3226329,7.09686454 L18.3226329,7.09686454 C18.1551303,7.09497104 17.993948,7.16220179 17.8754986,7.28336879 C17.7570491,7.40453579 17.6913262,7.56941596 17.6931772,7.74076151 L17.6931772,14.7396417 L17.6931772,22.1934491 C17.6931772,23.0963046 16.9337253,23.6982083 15.7979684,23.6982083 L2.31940723,23.6982083 C1.67977578,23.4926422 1.25016606,22.8791019 1.26575321,22.1934491 L1.26575321,2.77855548 C1.26392323,2.37889758 1.41831653,1.99506757 1.69458219,1.71246366 C1.97084786,1.42985975 2.34606932,1.27192428 2.73676369,1.27379624 L13.4990869,1.27379624 L13.4990869,2.77855548 C13.4990846,3.52225707 13.7883604,4.23539681 14.3030839,4.76061632 C14.8178074,5.28583583 15.5156729,5.5799668 16.2426925,5.57810754 Z M16.2426925,4.28331471 C15.8508165,4.28706575 15.4738263,4.12996031 15.1960738,3.84715082 C14.9183213,3.56434134 14.7629917,3.17943523 14.7648238,2.77855548 L14.7648238,1.33678616 C16.2367884,1.60594277 17.3890058,2.78459504 17.6521258,4.29031359 L16.2426925,4.28331471 Z" id="Shape" fill="#2E3B50"></path>
15
+ </g>
16
+ <g id="text-copy" transform="translate(25.000000, 5.000000)">
17
+ <path d="M9.02369668,2.46990881 C9.2107425,3.14427558 9.41295419,3.84761905 9.63033175,4.57993921 C9.84770932,5.31225937 10.0701422,6.04457953 10.2976303,6.7768997 C10.5301738,7.50921986 10.7601896,8.22836879 10.9876777,8.9343465 C11.2151659,9.64032421 11.4375987,10.3067882 11.6549763,10.9337386 C11.8369668,10.2593718 12.0139021,9.52705167 12.185782,8.73677812 C12.3576619,7.94650456 12.5295419,7.12198582 12.7014218,6.26322188 C12.8733017,5.40972644 13.042654,4.53779129 13.2094787,3.64741641 C13.3763033,2.75704154 13.5279621,1.8745694 13.664455,1 L16,1 C15.5703002,3.34974671 15.0951027,5.60729483 14.5744076,7.77264438 C14.0537125,9.93799392 13.4698262,12.0058764 12.8227488,13.9762918 L10.6464455,13.9762918 C9.72638231,11.4684904 8.83917852,8.72360689 7.98483412,5.74164134 C7.53491311,7.25369807 7.07993681,8.6893617 6.61990521,10.0486322 C6.15987362,11.4079027 5.69731438,12.7250253 5.23222749,14 L3.06350711,14 C2.42654028,12.0243161 1.85781991,9.95116515 1.35734597,7.78054711 C0.856872038,5.60992908 0.404423381,3.34974671 0,1 L2.40379147,1 C2.54533965,1.84822695 2.69447077,2.71752786 2.85118483,3.60790274 C3.00789889,4.49827761 3.17219589,5.37021277 3.34407583,6.22370821 C3.51595577,7.08247214 3.69036335,7.91225937 3.86729858,8.71306991 C4.04423381,9.51388045 4.22116904,10.2514691 4.39810427,10.9258359 C4.63064771,10.2883485 4.86319115,9.61661601 5.0957346,8.9106383 C5.32827804,8.20466059 5.56082148,7.4881459 5.79336493,6.76109422 C6.02590837,6.02877406 6.24834123,5.30172239 6.46066351,4.57993921 C6.67298578,3.85815603 6.87014218,3.16008105 7.0521327,2.48571429 L9.02369668,2.46990881 Z" id="Path" fill="#2E3B50"></path>
18
+ <path d="M26.9996531,8.47024937 C27.0074002,9.24137774 26.885323,10.0082129 26.6386532,10.737891 C26.4183769,11.3854613 26.0698643,11.9807813 25.6144208,12.4874572 C25.1707559,12.9715337 24.6297019,13.3538098 24.0277001,13.6085384 C23.3812481,13.8785504 22.6869098,14.0115185 21.9876306,13.9992183 C21.2898029,14.007172 20.5979545,13.868349 19.9559565,13.5915524 C19.354251,13.3251484 18.8160351,12.9312701 18.3776312,12.4364989 C17.9336031,11.9420954 17.5886161,11.3652334 17.3617941,10.737891 C17.1110599,10.0063108 16.9888819,9.23596797 17.0007942,8.46175633 C16.99351,7.68924891 17.1214122,6.92153209 17.3785848,6.19411471 C17.6113591,5.56394749 17.9651704,4.98664352 18.4196079,4.49550675 C18.8642722,4.0146967 19.4052194,3.63539151 20.0063286,3.38291854 C20.6454978,3.1189924 21.3309469,2.98897514 22.021212,3.00073175 C22.7152838,2.99508464 23.4033775,3.1308387 24.0444908,3.39990462 C24.6451553,3.65262047 25.1838678,4.03526684 25.6228161,4.52098587 C26.0719328,5.0308693 26.4171431,5.62542172 26.6386532,6.27055206 C26.8822542,6.97755454 27.0043528,7.72154353 26.9996531,8.47024937 Z M24.531421,8.47024937 C24.5822345,7.59121999 24.3526877,6.71891431 23.8765838,5.98178871 C23.4278306,5.4022344 22.7405392,5.06366156 22.0128167,5.06366156 C21.2850942,5.06366156 20.5978027,5.4022344 20.1490495,5.98178871 C19.6640801,6.71586733 19.4256406,7.58840701 19.4690264,8.47024937 C19.4114356,9.36863088 19.6410211,10.2619275 20.1238635,11.0181613 C20.568813,11.60379 21.257496,11.9470101 21.9876306,11.9470101 C22.7177653,11.9470101 23.4064482,11.60379 23.8513978,11.0181613 C24.3448474,10.2625994 24.583402,9.36580325 24.531421,8.46175633 L24.531421,8.47024937 Z" id="Shape" fill="#2E3B50"></path>
19
+ <path d="M37.9992565,8.49997514 C38.0052591,9.27027664 37.8803324,10.0359406 37.6298759,10.7638742 C37.3983877,11.4076815 37.0384122,11.9970095 36.5721041,12.495588 C36.1284568,12.9770623 35.5874243,13.3572835 34.9854463,13.6106428 C34.3390199,13.8792033 33.6447091,14.0114565 32.9454577,13.9992225 C32.2476577,14.0071334 31.5558367,13.8690567 30.9138642,13.593748 C30.3167471,13.3326772 29.7816246,12.9468283 29.3439965,12.4617985 C28.9034894,11.9446538 28.5696061,11.3445091 28.3617798,10.6962951 C28.1110555,9.96864757 27.9888823,9.20244585 28.0007942,8.43239606 C27.9935103,7.66404135 28.1214073,6.90045147 28.3785698,6.1769444 C28.6113348,5.55016471 28.9651321,4.9759641 29.4195516,4.48746749 C29.8641983,4.00924209 30.405124,3.6319759 31.0062094,3.38086012 C31.6453532,3.11835275 32.3307752,2.98903441 33.0210129,3.00072782 C33.7150572,2.99511106 34.4031235,3.13013536 35.0442114,3.39775489 C35.6448521,3.64911224 36.1835432,4.02970165 36.6224741,4.51280965 C37.0715729,5.01995214 37.4167696,5.61130848 37.6382709,6.25297086 C37.8885761,6.9748872 38.0107654,7.73547146 37.9992565,8.49997514 L37.9992565,8.49997514 Z M35.5311222,8.49997514 C35.5905548,7.62186647 35.3667935,6.74790114 34.8931011,6.00799671 C34.4443657,5.43155785 33.7571015,5.09480505 33.0294079,5.09480505 C32.3017143,5.09480505 31.6144501,5.43155785 31.1657147,6.00799671 C30.6807644,6.7381292 30.4423344,7.60597846 30.4857185,8.48308037 C30.42813,9.37663254 30.6577064,10.2651271 31.1405296,11.0172957 C31.5854615,11.5997763 32.2741172,11.9411514 33.0042228,11.9411514 C33.7343285,11.9411514 34.4229842,11.5997763 34.8679161,11.0172957 C35.3536877,10.2661327 35.5862271,9.37756277 35.5311222,8.48308037 L35.5311222,8.49997514 Z" id="Shape" fill="#2E3B50"></path>
20
+ <polygon id="Path" fill="#0088F7" points="40 13.9684466 40.0687023 1 48 1.0473301 48 3.05097087 42.351145 3.05097087 42.2900763 6.34830097 47.3053435 6.34830097 47.3053435 8.35194175 42.2900763 8.35194175 42.2900763 14"></polygon>
21
+ <path d="M49.0054054,9.54891633 C48.9931281,8.72371947 49.1293347,7.90349841 49.4068813,7.13127314 C49.6438401,6.50205059 49.9987995,5.92914093 50.4507186,5.44650437 C50.874418,4.99794323 51.3832446,4.64780662 51.9442089,4.41879542 C52.4788002,4.16944986 53.0538158,4.02935761 53.6384371,4.00602707 C54.8473249,3.93889362 56.0227721,4.43524572 56.8502442,5.36226593 C57.6882209,6.50223635 58.0918031,7.92859041 57.9824062,9.36359176 C57.9824062,9.49837327 57.9824062,9.64719451 57.9824062,9.81005549 C57.9824062,9.97291647 57.9824062,10.1217377 57.9824062,10.2565192 L51.4142607,10.2565192 C51.4215515,10.994507 51.7108168,11.6985597 52.2172125,12.210851 C52.8368925,12.7147273 53.6108485,12.9634102 54.3932118,12.91003 C54.9081338,12.9174758 55.4223195,12.8666388 55.9268497,12.7584008 C56.3025333,12.6814039 56.6707399,12.5686188 57.0268936,12.4214471 L57.3239858,14.4010504 C57.1553967,14.4851344 56.9809129,14.5555393 56.8020671,14.6116465 C56.5380564,14.6918333 56.2699899,14.7565165 55.9991154,14.8053949 C55.7154057,14.8615539 55.4076075,14.909289 55.0757208,14.9486002 C54.7396884,14.9858483 54.4018872,15.002724 54.0640016,14.9991433 C53.2852337,15.0125012 52.5112122,14.8695376 51.7836185,14.5779511 C51.1711715,14.3312964 50.6215055,13.9391677 50.177715,13.4323084 C49.7604372,12.9450715 49.4457929,12.3709908 49.2543204,11.7475396 C49.0609684,11.0331023 48.9769511,10.2909922 49.0054054,9.54891633 L49.0054054,9.54891633 Z M55.6939937,8.50435969 C55.6974617,8.18206038 55.6541414,7.86108529 55.5655214,7.55246533 C55.486599,7.26761403 55.3557042,7.00155076 55.1801045,6.76904785 C55.0100379,6.54922961 54.7962989,6.37099103 54.5538022,6.24676953 C54.277217,6.11270217 53.975171,6.04644558 53.6705552,6.05302113 C53.3493104,6.04340229 53.0303642,6.11263184 52.7391311,6.25519338 C52.4785052,6.38712229 52.2462685,6.57343657 52.0566221,6.80274323 C51.8691199,7.03182457 51.7222673,7.29430469 51.6230282,7.57773686 C51.5192832,7.86887489 51.4465748,8.17116599 51.4062312,8.47908816 L55.6939937,8.50435969 Z" id="Shape" fill="#0088F7"></path>
22
+ <path d="M60.0050243,9.47310173 C59.9927794,8.64790487 60.1286279,7.82768382 60.4054449,7.05545855 C60.6417808,6.426236 60.9958071,5.85332633 61.4465382,5.37068977 C61.8691239,4.92212864 62.3766129,4.57199203 62.9361026,4.34298082 C63.4816487,4.11649258 64.0634138,4.00211054 64.6499024,4.00602707 C65.8556124,3.93889362 67.0279697,4.43524572 67.8532666,5.36226593 C68.6890404,6.50223635 69.0915617,7.92859041 68.9824525,9.36359176 C68.9824525,9.49837327 68.9824525,9.64719451 68.9824525,9.81005549 C68.9824525,9.97853237 68.9824525,10.1301616 68.9824525,10.2565192 L62.4315727,10.2565192 C62.4388443,10.994507 62.7273492,11.6985597 63.2324138,12.210851 C63.8504648,12.7147273 64.6223863,12.9634102 65.402693,12.91003 C65.9162639,12.9175414 66.4291047,12.8667037 66.9322994,12.7584008 C67.3069955,12.6814039 67.6742341,12.5686188 68.0294516,12.4214471 L68.3257628,14.4010504 C68.1576293,14.4851649 67.9836019,14.5555707 67.8052161,14.6116465 C67.5418828,14.6917659 67.2745246,14.7564482 67.0043751,14.8053949 C66.7214113,14.8615539 66.4144222,14.909289 66.0834079,14.9486002 C65.7482601,14.985867 65.411346,15.0027428 65.0743482,14.9991433 C64.2976275,15.0125012 63.5256406,14.8695376 62.7999596,14.5779511 C62.1891225,14.3312964 61.6409015,13.9391677 61.1982775,13.4323084 C60.7822919,12.9449228 60.4684998,12.3708881 60.2773103,11.7475396 C60.0686341,11.0102194 59.9766449,10.2418219 60.0050243,9.47310173 Z M66.6760303,8.4285451 C66.6792414,8.10626272 66.6360402,7.78532678 66.5478957,7.47665074 C66.4689918,7.19187879 66.3384591,6.9258522 66.163492,6.69323326 C65.9938724,6.47341502 65.7806953,6.29517643 65.538836,6.17095494 C65.2629778,6.03688757 64.9617259,5.97063099 64.6579108,5.97720653 C64.3375105,5.9675877 64.0194027,6.03681724 63.7289352,6.17937878 C63.4689944,6.3113077 63.2373682,6.49762197 63.0482203,6.72692863 C62.8612109,6.95600997 62.7147444,7.21849009 62.6157662,7.50192227 C62.5122939,7.7930603 62.4397767,8.0953514 62.3995391,8.40327356 L66.6760303,8.4285451 Z" id="Shape" fill="#0088F7"></path>
23
+ <path d="M78.9519219,13.5051782 C78.3862429,13.6547831 77.8107644,13.7698782 77.2291217,13.8497363 C76.5082085,13.9552705 75.7792523,14.0053743 75.0495792,13.9995442 C74.3298235,14.005418 73.6151833,13.8860363 72.9421539,13.6474957 C72.3379434,13.4368504 71.7907808,13.1043915 71.3395491,12.6737446 C70.8974095,12.2452579 70.5562049,11.7349374 70.3379211,11.1756661 C70.0999147,10.5277398 69.9859883,9.84565938 70.0013741,9.1607504 C69.9956862,8.48364594 70.0983188,7.8095509 70.305869,7.16081552 C70.4890015,6.61270899 70.7857852,6.10366927 71.1792886,5.66273696 C71.5541354,5.21392394 72.0374419,4.85455041 72.5895808,4.61408197 C73.1841814,4.37690263 73.8263689,4.26195113 74.4726415,4.27701429 C74.9037576,4.27207957 75.3332267,4.32762721 75.7467123,4.44180294 C76.0727361,4.53503689 76.3891777,4.65536331 76.6922491,4.80134179 L76.6922491,0.307106105 L79,0 L78.9519219,13.5051782 Z M72.3812422,9.08584648 C72.3214361,9.88959129 72.5715928,10.686776 73.0863883,11.3329643 C73.5775864,11.8783651 74.3116281,12.1799459 75.0736182,12.1494171 C75.3866427,12.1542194 75.6996971,12.1417136 76.0111421,12.1119652 C76.226472,12.0898337 76.440437,12.0573321 76.652184,12.0145901 L76.652184,6.68143038 C76.4024939,6.52834302 76.1333047,6.40504336 75.8508816,6.31440114 C75.5063502,6.1992465 75.1430269,6.14095243 74.7771364,6.1421221 C74.0577886,6.08414974 73.3585015,6.38256782 72.9341408,6.92861335 C72.525183,7.58057088 72.3327361,8.33143666 72.3812422,9.08584648 L72.3812422,9.08584648 Z" id="Shape" fill="#0088F7"></path>
24
+ </g>
25
+ </g>
26
+ <g id="Group-2" transform="translate(107.000000, 0.000000)">
27
+ <rect id="Rectangle" fill="#0088F7" x="0" y="0" width="16" height="8" rx="2"></rect>
28
+ <path d="M3.789,6 L3.789,4.166 L4.601,4.166 C5.16566667,4.166 5.60083333,4.026 5.9065,3.746 C6.21216667,3.466 6.365,3.09033333 6.365,2.619 C6.365,2.13833333 6.21683333,1.758 5.9205,1.478 C5.62416667,1.198 5.18433333,1.058 4.601,1.058 L4.601,1.058 L2.802,1.058 L2.802,6 L3.789,6 Z M4.496,3.375 L3.789,3.375 L3.789,1.856 L4.496,1.856 C4.804,1.856 5.02566667,1.92133333 5.161,2.052 C5.29633333,2.18266667 5.364,2.37166667 5.364,2.619 C5.364,3.123 5.07466667,3.375 4.496,3.375 L4.496,3.375 Z M8.22933333,6 L8.22933333,4.131 C8.22933333,3.459 8.591,3.123 9.31433333,3.123 L9.31433333,3.123 L9.60133333,3.123 L9.60133333,2.066 C9.30733333,2.066 9.04133333,2.13716667 8.80333333,2.2795 C8.56533333,2.42183333 8.374,2.61666667 8.22933333,2.864 L8.22933333,2.864 L8.22933333,2.122 L7.24233333,2.122 L7.24233333,6 L8.22933333,6 Z M12.1726667,6.049 C12.5506667,6.049 12.8901667,5.9685 13.1911667,5.8075 C13.4921667,5.6465 13.729,5.41666667 13.9016667,5.118 C14.0743333,4.81933333 14.1606667,4.467 14.1606667,4.061 C14.1606667,3.655 14.0743333,3.3015 13.9016667,3.0005 C13.729,2.6995 13.4921667,2.46966667 13.1911667,2.311 C12.8901667,2.15233333 12.5506667,2.073 12.1726667,2.073 C11.7946667,2.073 11.4551667,2.15233333 11.1541667,2.311 C10.8531667,2.46966667 10.6163333,2.6995 10.4436667,3.0005 C10.271,3.3015 10.1846667,3.655 10.1846667,4.061 C10.1846667,4.467 10.271,4.81933333 10.4436667,5.118 C10.6163333,5.41666667 10.8531667,5.6465 11.1541667,5.8075 C11.4551667,5.9685 11.7946667,6.049 12.1726667,6.049 Z M12.1726667,5.195 C11.8973333,5.195 11.664,5.09816667 11.4726667,4.9045 C11.2813333,4.71083333 11.1856667,4.42966667 11.1856667,4.061 C11.1856667,3.69233333 11.2813333,3.41116667 11.4726667,3.2175 C11.664,3.02383333 11.8973333,2.927 12.1726667,2.927 C12.448,2.927 12.6813333,3.02383333 12.8726667,3.2175 C13.064,3.41116667 13.1596667,3.69233333 13.1596667,4.061 C13.1596667,4.42966667 13.064,4.71083333 12.8726667,4.9045 C12.6813333,5.09816667 12.448,5.195 12.1726667,5.195 Z" id="Pro" fill="#FFFFFF" fill-rule="nonzero"></path>
29
+ </g>
30
+ </g>
31
+ </g>
32
+ </g>
33
+ </svg>
admin/js/woo-feed-admin.js CHANGED
@@ -18,9 +18,20 @@
18
  */
19
  $.fn.disabled = function( status ) {
20
  $(this).each( function(){
21
- $(this).prop( 'disabled', status === void 0 || status === true );
 
 
 
 
 
 
22
  } );
23
- return $(this); // method chaining
 
 
 
 
 
24
  };
25
 
26
  function clearTooltip( event ) {
@@ -226,7 +237,7 @@
226
  $(this).validate();
227
  if ($(this).valid()) {
228
  // noinspection SpellCheckingInspection
229
- $(".makeFeedResponse").show().html("<b style='color: darkblue;'><i class='dashicons dashicons-sos wpf_sos'></i> Delivering Configuration...</b>");
230
  }
231
  });
232
 
@@ -239,7 +250,7 @@
239
  $(this).validate();
240
  if ($(this).valid()) {
241
  // noinspection SpellCheckingInspection
242
- $(".makeFeedResponse").show().html("<b style='color: darkblue;'><i class='dashicons dashicons-sos wpf_sos'></i> Delivering Configuration...</b>");
243
  }
244
  });
245
 
18
  */
19
  $.fn.disabled = function( status ) {
20
  $(this).each( function(){
21
+ // noinspection ES6ConvertVarToLetConst
22
+ var self = $(this), prop = 'disabled';
23
+ if( typeof( self.prop( prop ) ) !== 'undefined' ) {
24
+ self.prop( prop, status === void 0 || status === true );
25
+ } else {
26
+ !0===status?self.addClass( prop ):self.removeClass( prop );
27
+ }
28
  } );
29
+ return self; // method chaining
30
+ };
31
+ $.fn.isDisabled = function() {
32
+ // noinspection ES6ConvertVarToLetConst
33
+ var self = $(this), prop = 'disabled';
34
+ return ( typeof( self.prop( prop ) ) !== 'undefined' )? self.prop( prop ) : self.hasClass( prop );
35
  };
36
 
37
  function clearTooltip( event ) {
237
  $(this).validate();
238
  if ($(this).valid()) {
239
  // noinspection SpellCheckingInspection
240
+ $(".makeFeedResponse").show().html("<b style='color: darkblue;'><i class='dashicons dashicons-sos wpf_spin'></i> Delivering Configuration...</b>");
241
  }
242
  });
243
 
250
  $(this).validate();
251
  if ($(this).valid()) {
252
  // noinspection SpellCheckingInspection
253
+ $(".makeFeedResponse").show().html("<b style='color: darkblue;'><i class='dashicons dashicons-sos wpf_spin'></i> Delivering Configuration...</b>");
254
  }
255
  });
256
 
admin/partials/woo-feed-admin-display.php CHANGED
@@ -45,7 +45,7 @@ register_and_do_woo_feed_meta_boxes( $current_screen, $feedRules );
45
  <hr class="wp-header-end">
46
  <div class="wapk-section">
47
  <form action="" name="feed" id="generateFeed" class="generateFeed add-new" method="post" autocomplete="off">
48
- <input type="hidden" name="feed_name" value="">
49
  <input type="hidden" name="feed_id" value="">
50
  <?php
51
  wp_nonce_field('woo_feed_form_nonce');
@@ -61,7 +61,6 @@ register_and_do_woo_feed_meta_boxes( $current_screen, $feedRules );
61
  </div>
62
  </div>
63
  <div class="clear"></div>
64
- <br/><br/>
65
  <div id="providerPage"></div>
66
  </div>
67
  </form>
45
  <hr class="wp-header-end">
46
  <div class="wapk-section">
47
  <form action="" name="feed" id="generateFeed" class="generateFeed add-new" method="post" autocomplete="off">
48
+ <input type="hidden" name="original_feed_name" value="">
49
  <input type="hidden" name="feed_id" value="">
50
  <?php
51
  wp_nonce_field('woo_feed_form_nonce');
61
  </div>
62
  </div>
63
  <div class="clear"></div>
 
64
  <div id="providerPage"></div>
65
  </div>
66
  </form>
admin/partials/woo-feed-edit-template.php CHANGED
@@ -33,7 +33,7 @@ register_and_do_woo_feed_meta_boxes( $current_screen, $feedRules );
33
  <div class="wapk-section"><?php echo WPFFWMessage()->infoMessage1(); ?></div>
34
  <div class="wapk-section">
35
  <form action="" name="feed" id="updatefeed" class="generateFeed" method="post" autocomplete="off">
36
- <input type="hidden" name="feed_name" value="<?php echo esc_attr( $fname ); ?>">
37
  <input type="hidden" name="feed_id" value="<?php echo esc_attr( $feedId ); ?>">
38
  <?php
39
  wp_nonce_field('wf_edit_feed');
@@ -49,7 +49,6 @@ register_and_do_woo_feed_meta_boxes( $current_screen, $feedRules );
49
  </div>
50
  </div>
51
  <div class="clear"></div>
52
- <br/><br/>
53
  <ul class="wf_tabs">
54
  <li>
55
  <input type="radio" name="wf_tabs" id="tab1" checked/>
@@ -179,6 +178,7 @@ register_and_do_woo_feed_meta_boxes( $current_screen, $feedRules );
179
  <div class="makeFeedComplete"></div>
180
  </td>
181
  <td align="right">
 
182
  <button name="<?php echo isset($_GET['action']) ? esc_attr($_GET['action']) : ''; ?>" type="submit" class="wfbtn updatefeed"><?php _e('Update and Generate Feed', 'woo-feed'); ?></button>
183
  </td>
184
  </tr>
@@ -257,6 +257,7 @@ register_and_do_woo_feed_meta_boxes( $current_screen, $feedRules );
257
  <div class="makeFeedComplete"></div>
258
  </td>
259
  <td align="right">
 
260
  <button name="<?php echo isset($_GET['action']) ? esc_attr($_GET['action']) : ''; ?>" type="submit" class="wfbtn updatefeed"><?php _e('Update and Generate Feed', 'woo-feed'); ?></button>
261
  </td>
262
  </tr>
33
  <div class="wapk-section"><?php echo WPFFWMessage()->infoMessage1(); ?></div>
34
  <div class="wapk-section">
35
  <form action="" name="feed" id="updatefeed" class="generateFeed" method="post" autocomplete="off">
36
+ <input type="hidden" name="original_feed_name" value="<?php echo esc_attr( str_replace( [ 'wf_feed_', 'wf_config' ], '', $fname ) ); ?>">
37
  <input type="hidden" name="feed_id" value="<?php echo esc_attr( $feedId ); ?>">
38
  <?php
39
  wp_nonce_field('wf_edit_feed');
49
  </div>
50
  </div>
51
  <div class="clear"></div>
 
52
  <ul class="wf_tabs">
53
  <li>
54
  <input type="radio" name="wf_tabs" id="tab1" checked/>
178
  <div class="makeFeedComplete"></div>
179
  </td>
180
  <td align="right">
181
+ <button name="save_feed_config" type="submit" class="wfbtn updatefeed"><?php _e('Save', 'woo-feed'); ?></button>
182
  <button name="<?php echo isset($_GET['action']) ? esc_attr($_GET['action']) : ''; ?>" type="submit" class="wfbtn updatefeed"><?php _e('Update and Generate Feed', 'woo-feed'); ?></button>
183
  </td>
184
  </tr>
257
  <div class="makeFeedComplete"></div>
258
  </td>
259
  <td align="right">
260
+ <button name="save_feed_config" type="submit" class="wfbtn updatefeed"><?php _e('Save', 'woo-feed'); ?></button>
261
  <button name="<?php echo isset($_GET['action']) ? esc_attr($_GET['action']) : ''; ?>" type="submit" class="wfbtn updatefeed"><?php _e('Update and Generate Feed', 'woo-feed'); ?></button>
262
  </td>
263
  </tr>
admin/partials/woo-feed-manage-list.php CHANGED
@@ -11,372 +11,476 @@
11
  */
12
  $myListTable = new Woo_Feed_Manage_list();
13
  $limit = get_option( "woo_feed_per_batch", 200 );
14
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  # Checking woo version to run different version of feed processing
16
  $woo32 = "no";
17
  if (woo_feed_wc_version_check(3.2)) {
18
  $woo32 = 'yes';
19
  }
20
  ?>
21
- <div class="wrap">
22
- <h2><?php _e('Manage Feed', 'woo-feed'); ?>
23
- <a href="<?php echo admin_url('admin.php?page=webappick-product-feed-for-woocommerce/admin/class-woo-feed-admin.php'); ?>"
24
- class="page-title-action"><?php _e('New Feed', 'woo-feed'); ?></a>
25
- </h2>
26
- <?php echo WPFFWMessage()->infoMessage1(); ?>
27
- <table class="table widefat fixed" id="feedprogresstable" style="display: none;">
28
- <thead>
29
- <tr>
30
- <th><b>Generating Product Feed</b></th>
31
- </tr>
32
- </thead>
33
- <tbody>
34
- <tr>
35
- <td>
36
- <div class="feed-progress-container">
37
- <div class="feed-progress-bar" >
38
- <span class="feed-progress-bar-fill"></span>
39
- </div>
40
- </div>
41
- </td>
42
- </tr>
43
- <tr>
44
- <td>
45
- <div style="float: left;"><b style='color: darkblue;'><i class='dashicons dashicons-sos wpf_sos'></i></b>&nbsp;&nbsp;&nbsp;</div>
46
- <div class="feed-progress-status"></div>
47
- <div class="feed-progress-percentage"></div>
48
- </td>
49
- </tr>
50
- </tbody>
51
- </table>
52
- <br><br>
53
- <?php
54
- $link = filter_input( INPUT_GET, 'link', FILTER_VALIDATE_URL );
55
- /**
56
- * @TODO use gettext functions
57
- * @TODO use session/cookies/localstorage or transient api for this message
58
- * @see settings_errors()
59
- */
60
- if (isset($link) && !empty($link)) {
61
- $message="<b style='color: #008779;'>Feed Generated Successfully. Feed URL: <a href=".esc_url($link)." target='_blank'>".esc_url($link)."</a></b>";
62
- if (isset($_GET['cat']) && $_GET['cat']=='no') {
63
- $message.="<br/><br/><b style='color: #f49242;'>Warning:</b><ul>Google Product category is not selected. Your AdWords CPC rate will be high. Add proper Google Product Category to each product & reduce CPC rate. <a target='_blank' href='https://webappick.helpscoutdocs.com/article/19-how-to-map-store-category-with-merchant-category'>Learn more...</a> </li></ul>";
64
- }
65
- echo "<div class='updated'><p>" . __($message, 'woo-feed') . "</p></div>";
66
- } elseif (isset($_GET['wpf_message']) && $_GET['wpf_message'] === 'error') {
67
- $dir=get_option("WPF_DIRECTORY_PERMISSION_CHECK");
68
- if($dir && !empty($dir)){
69
- echo "<div class='error'><p>" . __(get_option('wpf_message').$dir, 'woo-feed') . "</p></div>";
70
- }else{
71
- echo "<div class='error'><p>" . __(get_option('wpf_message'), 'woo-feed') . "</p></div>";
72
- }
73
- }
74
- $myListTable->prepare_items();
75
- ?>
76
- <table class=" widefat fixed">
77
- <thead>
78
- <tr>
79
- <th><b><?php _e('Auto Update Feed Interval'); ?></b></th>
80
- </tr>
81
- </thead>
82
- <tbody>
83
- <tr>
84
- <td>
85
- <form action="" method="post">
86
- <label for="wf_schedule"><b><?php _e('Interval', 'woo-feed'); ?></b></label>
87
- <select name="wf_schedule" id="wf_schedule"><?php
88
- $interval = get_option('wf_schedule');
89
- foreach( woo_feed_get_schedule_interval_options() as $k=>$v ) {
90
- printf( '<option value="%s"%s>%s</option>', $k, selected( $interval, $k, false ), $v );
91
- }
92
- ?></select>
93
- <button type="submit" class="button button-primary"><?php _e('Update Interval'); ?></button>
94
- </form>
95
- </td>
96
- </tr>
97
- </tbody>
98
- </table>
99
- <form id="contact-filter" method="post">
100
- <!-- For plugins, we also need to ensure that the form posts back to our current page -->
101
- <input type="hidden" name="page" value="<?php echo esc_attr( $_REQUEST['page'] ); ?>"/>
102
- <?php //$myListTable->search_box('search', 'search_id'); ?>
103
- <!-- Now we can render the completed list table -->
104
- <?php $myListTable->display() ?>
105
- </form>
106
- </div>
107
-
108
- <script type="text/javascript">
109
- (function( $, window, document, opts ) {
110
- 'use strict';
111
- /**
112
- * All of the code for your admin-facing JavaScript source
113
- * should reside in this file.
114
- *
115
- * Note: It has been assumed you will write jQuery code here, so the
116
- * $ function reference has been prepared for usage within the scope
117
- * of this function.
118
- *
119
- * This enables you to define handlers, for when the DOM is ready:
120
- *
121
- * $(function() {
122
- * });
123
- *
124
- */
125
- /**
126
- * On Window Load
127
- * @TODO move this to js file so we can minify this.
128
- */
129
- $( window ).load(function() {
130
- var feedProgress = {
131
- table: $( '#feedprogresstable' ),
132
- status: $( '.feed-progress-status' ),
133
- percentage: $( '.feed-progress-percentage' ),
134
- bar: $( '.feed-progress-bar-fill' ),
135
- barProgress: 10, // Variable responsible to hold progress bar width
136
- },
137
- regenerateBtn = $( '.wpf_regenerate' ),
138
- fileName = "<?php echo isset( $fileName )? $fileName : ''; ?>", // wf_config+xxxx
139
- limit = <?php echo ( $limit ) ? $limit : 200; ?>;
140
  let woo32 = "<?php echo $woo32; ?>";
141
- // feed delete alert
142
- $( '.single-feed-delete' ).click( function ( event ) {
143
- event.preventDefault();
144
- if ( confirm( '<?php _e('Are You Sure to Delete?','woo-feed');?>' ) ) {
145
- var url = jQuery(this).attr('val');
146
- window.location.href = url;
147
- }
148
- });
 
149
 
150
- // bulk delete alert
151
- $('#doaction, #doaction2').click(function () {
152
- return confirm('<?php _e('Are You Sure to Delete?','woo-feed'); ?>');
153
- });
154
- // generate feed
155
- if( fileName !== "" ) {
156
- feedProgress.table.show();
157
- generate_feed();
158
- }
159
- //==================Manage Feed==============================
160
- // Feed Regenerate
161
- regenerateBtn.on( "click", function () {
162
- var el = $( this );
163
- regenerateBtn.disabled();
164
- fileName = el.attr( 'id' ).replace( "wf_feed_", "wf_config" );
165
- el.val( 'Generating...' );
166
- if( fileName ) {
167
  feedProgress.table.show();
168
  generate_feed();
169
  }
170
- });
171
-
172
- /*#######################################################
173
- #######-------------------------------------------#######
174
- ####### Ajax Feed Making Functions Start #######
175
- #######-------------------------------------------#######
176
- #########################################################
177
- */
178
-
179
- function showFeedProgress( color ){
180
- feedProgress.bar.css( {
181
- width: feedProgress.barProgress + '%',
182
- background: color || "#3DC264",
183
- } );
184
- feedProgress.percentage.text( Math.round( feedProgress.barProgress ) + '%' );
185
- }
186
-
187
- function generate_feed() {
188
- console.log( "Counting Total Products" );
189
- feedProgress.status.text( "Fetching products." );
190
- showFeedProgress();
191
- $.ajax({
192
- url : opts.wpf_ajax_url,
193
- type : 'post',
194
- data : {
195
- _ajax_nonce: opts.nonce,
196
- action: "get_product_information",
197
- feed: fileName,
198
- limit: limit,
199
- },
200
- success : function(response) {
201
- console.log( response );
202
- if(response.success) {
203
- if (woo32 === 'yes') {
204
- processFeed_v3(response.data.product);
205
- let total = response.data.total;
206
- console.log("Total " + total + " Products found.");
207
- feedProgress.status.text( "Processing Products..." );
208
- } else {
209
- feedProgress.status.text( "Delivering Feed Configuration." );
210
- processFeed( parseInt( response.data.product ) );
211
- //feedProgress.status.text("Total "+products+" products found.");
212
- feedProgress.status.text( "Processing Products..." );
213
- }
214
-
215
- }else{
216
- feedProgress.status.text(response.data.message);
217
- showFeedProgress( 'red' );
218
- }
219
  }
220
  });
221
- }
222
- function processFeed_v3(batches, n) {
223
- let totalBatch = batches.length;
224
- let progressBatch = 90 / totalBatch;
225
- if (typeof(n) === 'undefined') n = 0;
226
-
227
- let batch = batches[n];
228
- let pbatch = n + 1;
229
- feedProgress.status.text( "Processing Batch " + pbatch + " of " + totalBatch);
230
- showFeedProgress();
231
- console.log( "Processing Batch " + pbatch + " of " + totalBatch );
232
 
233
- $.ajax({
234
- url: opts.wpf_ajax_url,
235
- type: 'post',
236
- data: {
237
- _ajax_nonce: opts.nonce,
238
- action: "make_batch_feed",
239
- feed: fileName,
240
- products: batch,
241
- loop: n,
242
- },
243
- success: function (response) {
244
- console.log( "Batch "+ pbatch +" Completed.");
245
- console.log(response);
246
 
247
- if (pbatch < totalBatch) {
248
- n = n + 1;
249
- processFeed_v3(batches, n);
250
-
251
- feedProgress.barProgress = feedProgress.barProgress + progressBatch;
252
- showFeedProgress();
253
- }
254
 
255
- if (pbatch == totalBatch) {
256
- console.log( "Saving feed file.");
257
- feedProgress.status.text("Saving feed file.");
258
- save_feed_file();
259
- }
260
- },
261
- error: function (response) {
262
- console.log(response);
263
- }
264
- });
265
- }
266
- function processFeed( n, offset, batch ) {
267
- if ( typeof( offset ) === 'undefined' ) offset = 0;
268
- if ( typeof( batch ) === 'undefined' ) batch = 0;
269
- var batches = Math.ceil( n/limit ),
270
- progressBatch = 90 / batches;
271
- console.log( ( limit*batch ) + " out of " + n + " products processed." );
272
- feedProgress.status.text( "Processing products..." + Math.round( feedProgress.barProgress ) + "%" );
273
- if( batch < batches ) {
274
- console.log( "Processing Batch " + batch + " of " + batches );
275
  $.ajax({
276
  url : opts.wpf_ajax_url,
277
  type : 'post',
278
  data : {
279
  _ajax_nonce: opts.nonce,
280
- action: "make_batch_feed",
 
281
  limit: limit,
282
- offset: offset,
283
- feed: fileName
284
  },
285
  success : function(response) {
286
  console.log( response );
287
- if( response.success ) {
288
- if( response.data.products === "yes" ) {
289
- offset = offset+limit;
290
- batch++;
291
- setTimeout( function(){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
292
  processFeed( n, offset, batch );
293
- }, 2000 );
294
- feedProgress.barProgress = feedProgress.barProgress + progressBatch;
295
- showFeedProgress();
296
- } else if( n > offset ) {
297
- offset = offset+limit;
 
 
 
 
 
 
298
  batch++;
299
  processFeed( n, offset, batch );
300
  feedProgress.barProgress = feedProgress.barProgress + progressBatch;
301
  showFeedProgress();
302
- }else{
303
- feedProgress.status.text( "Saving feed file." );
304
- save_feed_file();
305
  }
 
306
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
307
  },
308
- error:function (response) {
309
- if( response.status !== "200" ) {
310
- offset = (offset-limit)+10;
311
- batch++;
312
- processFeed( n, offset, batch );
313
- feedProgress.barProgress = feedProgress.barProgress + progressBatch;
314
  showFeedProgress();
 
 
 
 
 
 
 
 
 
 
315
  }
316
- console.log(response);
 
 
 
317
  }
318
  });
319
- }else{
320
- feedProgress.status.text("Saving feed file.");
321
- save_feed_file();
322
  }
323
- }
324
 
 
 
 
 
 
 
 
325
  /**
326
- * Save feed file into WordPress upload directory
327
- * after successfully processing the feed
328
- */
329
- function save_feed_file(){
330
- // Polylang codes
331
- // var params = window.location.search.slice(1);
332
- // var searchParam = new URLSearchParams(params);
333
- // var old_lang = searchParam.get('old_lang');
334
- $.ajax({
335
- url : opts.wpf_ajax_url,
336
- type : 'post',
337
- data : {
338
- _ajax_nonce: opts.nonce,
339
- action: "save_feed_file",
340
- feed: fileName
341
- },
342
- success : function( response ) {
343
- console.log( response );
344
- if( response.success ) {
345
- feedProgress.barProgress = 100;
346
- showFeedProgress();
347
- feedProgress.status.text( response.data.message );
348
- regenerateBtn.val( 'Regenerate' );
349
- regenerateBtn.disabled( false );
350
- // var default_polylang = (response.data.default_polylang) ? response.data.default_polylang : '';
351
- window.location.href = "<?php echo admin_url( 'admin.php?WPFP_WPML_CURLANG=yes&page=webappick-manage-feeds&link=' ); ?>" + response.data.url + "&cat=" + response.data.cat;
352
- // Polylang code
353
- // window.location.href = "<?php // echo admin_url('admin.php?WPFP_WPML_CURLANG=yes&page=webappick-manage-feeds&link='); ?>"+url+"&cat="+cat + "&lang=" + old_lang;
354
- }else{
355
- showFeedProgress( "red" );
356
- feedProgress.status.text( response.data.message );
357
- }
358
- },
359
- error:function ( response ) {
360
- console.log( response );
361
- feedProgress.status.text( "Failed to save feed file." );
362
- }
363
- });
364
- }
365
-
366
- /*########################################################
367
- #######-------------------------------------------#######
368
- ####### Ajax Feed Making Functions End #######
369
- #######-------------------------------------------#######
370
- #########################################################
371
  */
372
- });
373
- /**
374
- * ...and/or other possibilities.
375
- *
376
- * Ideally, it is not considered best practise to attach more than a
377
- * single DOM-ready or window-load handler for a particular page.
378
- * Although scripts in the WordPress core, Plugins and Themes may be
379
- * practising this, we should strive to set a better example in our own work.
380
- */
381
- })( jQuery, window, document, wpf_ajax_obj );
382
- </script>
11
  */
12
  $myListTable = new Woo_Feed_Manage_list();
13
  $limit = get_option( "woo_feed_per_batch", 200 );
14
+ $fileName = '';
15
+ $message = [];
16
+ global $regenerating, $regeneratingName;
17
+ $regenerating = false;
18
+ if( ( isset( $_GET['feed_updated'] ) || isset( $_GET['feed_created'] ) ) && isset( $_GET['feed_regenerate'], $_GET['feed_name'] ) ) {
19
+ $canBeRegenerated = false;
20
+ if( isset( $_GET['feed_created'] ) ) {
21
+ $message[] = [
22
+ 'notice' => esc_html__( 'Feed Config Created Successfully.', 'woo-feed' ),
23
+ 'type' => 'success',
24
+ 'dismissible' => true,
25
+ ];
26
+ $canBeRegenerated = true;
27
+ }
28
+ if( isset( $_GET['feed_updated'] ) ) {
29
+ $message[] = [
30
+ 'notice' => esc_html__( 'Feed Config Updated Successfully.', 'woo-feed' ),
31
+ 'type' => 'updated',
32
+ 'dismissible' => true,
33
+ ];
34
+ $canBeRegenerated = true;
35
+ }
36
+ if( $canBeRegenerated && $_GET['feed_regenerate'] == 1 ) {
37
+ // filename must be wf_config+xxxx format
38
+ $fileName = sanitize_text_field( $_GET['feed_name'] ); //trigger feed regenerate...
39
+ $fileName = str_replace( [ 'wf_feed_', 'wf_config' ], '', $fileName );
40
+ $regeneratingName = $fileName;
41
+ $fileName = 'wf_config' . $fileName; // to be safe...
42
+ $regenerating = true;
43
+ }
44
+ }
45
+ // schedule updated
46
+ if( isset( $_GET['schedule_updated'] ) && ! empty( $_GET['schedule_updated'] ) ) {
47
+ if( $_GET['schedule_updated'] == 1 ) {
48
+ $message[] = [
49
+ 'notice' => esc_html__( 'Feed auto update interval updated.', 'woo-feed' ),
50
+ 'type' => 'updated',
51
+ 'dismissible' => true,
52
+ ];
53
+ }
54
+ if( $_GET['schedule_updated'] == 2 ) {
55
+ $message[] = [
56
+ 'notice' => esc_html__( 'Unable to save auto update interval.', 'woo-feed' ),
57
+ 'type' => 'warning',
58
+ 'dismissible' => true,
59
+ ];
60
+ }
61
+ if( $_GET['schedule_updated'] == 3 ) {
62
+ $message[] = [
63
+ 'notice' => esc_html__( 'Invalid interval value.', 'woo-feed' ),
64
+ 'type' => 'error',
65
+ 'dismissible' => true,
66
+ ];
67
+ }
68
+ if( $_GET['schedule_updated'] == 4 ) {
69
+ $message[] = [
70
+ 'notice' => esc_html__( 'Invalid request.', 'woo-feed' ),
71
+ 'type' => 'error',
72
+ 'dismissible' => true,
73
+ ];
74
+ }
75
+ }
76
+ // get updated link
77
+ if( isset( $_GET['link'] ) && ! empty( $_GET['link'] ) ) {
78
+ $link = filter_input( INPUT_GET, 'link', FILTER_VALIDATE_URL );
79
+ /**
80
+ * @TODO use session/cookies/localstorage or transient api for this message
81
+ * @see settings_errors()
82
+ */
83
+ if( isset( $link ) && ! empty( $link ) ) {
84
+ /** @noinspection HtmlUnknownTarget */
85
+ $link = sprintf( '<a href="%1$s" target="_blank">%1$s</a>', esc_url( $link ) );
86
+ $notice = sprintf( esc_html__( 'Feed Generated Successfully. Feed URL: %s', 'woo-feed' ), $link );
87
+ $notice = '<b style="color: #008779;">' . $notice . '</b>';
88
+ if ( isset( $_GET['cat'] ) && $_GET['cat'] == 'no' ) {
89
+ $notice .= sprintf( '<br/><br/><b style="color: #f49242;">%s</b>', esc_html__( 'Warning:', 'woo-feed' ) );
90
+ $link = 'https://webappick.helpscoutdocs.com/article/19-how-to-map-store-category-with-merchant-category';
91
+ $link = sprintf( '<a href="%s" target="_blank">%s</a>', esc_url( $link ), esc_html__( 'Learn more...', 'woo-feed' ) );
92
+ $notice .= sprintf( '<ul><li>%s %s</li></ul>', esc_html__( 'Google Product category is not selected. Your AdWords CPC rate will be high. Add proper Google Product Category to each product & reduce CPC rate.', 'woo-feed' ), $link );
93
+ }
94
+ $message[] = [
95
+ 'notice' => $notice,
96
+ 'type' => 'updated',
97
+ 'dismissible' => true,
98
+ ];
99
+ }
100
+ }
101
+ // get error messages
102
+ if ( isset( $_GET['wpf_message'] ) && ! empty( $_GET['wpf_message'] ) ) {
103
+ $type = sanitize_text_field( $_GET['wpf_message'] );
104
+ $error = esc_html( get_option('wpf_message') );
105
+ delete_option( 'wpf_message' ); // empty message cache
106
+ if( $dir = get_option("WPF_DIRECTORY_PERMISSION_CHECK", false ) ) {
107
+ $error .= ' ' . esc_html( $dir );
108
+ delete_option( 'WPF_DIRECTORY_PERMISSION_CHECK' ); // empty message cache
109
+ }
110
+ $error = trim( $error );
111
+ if( ! empty( $error ) ) {
112
+ $message[] = [
113
+ 'notice' => $error,
114
+ 'type' => $type,
115
+ 'dismissible' => true,
116
+ ];
117
+ }
118
+ }
119
  # Checking woo version to run different version of feed processing
120
  $woo32 = "no";
121
  if (woo_feed_wc_version_check(3.2)) {
122
  $woo32 = 'yes';
123
  }
124
  ?>
125
+ <div class="wrap wapk-admin">
126
+ <div class="wapk-section">
127
+ <h1 class="wp-heading-inline"><?php _e('Manage Feed', 'woo-feed'); ?></h1>
128
+ <a href="<?php echo admin_url('admin.php?page=webappick-new-feed'); ?>" class="page-title-action"><?php _e('New Feed', 'woo-feed'); ?></a>
129
+ <hr class="wp-header-end">
130
+ <?php echo WPFFWMessage()->infoMessage1(); ?>
131
+ <div id="feed_progress_table" style="display: none;">
132
+ <table class="table widefat fixed">
133
+ <thead>
134
+ <tr>
135
+ <th><b><?php esc_html_e( 'Generating Product Feed', 'woo-feed' ); ?></b></th>
136
+ </tr>
137
+ </thead>
138
+ <tbody>
139
+ <tr>
140
+ <td>
141
+ <div class="feed-progress-container">
142
+ <div class="feed-progress-bar" >
143
+ <span class="feed-progress-bar-fill"></span>
144
+ </div>
145
+ </div>
146
+ </td>
147
+ </tr>
148
+ <tr>
149
+ <td>
150
+ <div style="float: left;"><b style='color: darkblue;'><i class='dashicons dashicons-sos wpf_spin'></i></b>&nbsp;&nbsp;&nbsp;</div>
151
+ <div class="feed-progress-status"></div>
152
+ <div class="feed-progress-percentage"></div>
153
+ </td>
154
+ </tr>
155
+ </tbody>
156
+ </table>
157
+ <br>
158
+ </div>
159
+ <?php
160
+ if( ! empty( $message ) ) {
161
+ foreach ( $message as $notice ) {
162
+ if( ! isset( $notice['notice'] ) || ! isset( $notice['type'] ) ) {continue;}
163
+ $isDismissible = isset( $notice['dismissible'] ) && $notice['dismissible'] == true ? ' is-dismissible' : '';
164
+ printf( '<div class="notice notice-%1$s %1$s%3$s"><p>%2$s</p></div>', $notice['type'], $notice['notice'], $isDismissible );
165
+ }
166
+ }
167
+ $myListTable->prepare_items();
168
+ ?>
169
+ <table class=" widefat fixed">
170
+ <thead>
171
+ <tr>
172
+ <th><b><?php esc_html_e( 'Auto Update Feed Interval', 'woo-feed' ); ?></b></th>
173
+ </tr>
174
+ </thead>
175
+ <tbody>
176
+ <tr>
177
+ <td>
178
+ <form action="" method="post">
179
+ <?php wp_nonce_field( 'wf_schedule', 'wf_schedule_nonce' ); ?>
180
+ <label for="wf_schedule"><b><?php esc_html_e( 'Interval', 'woo-feed' ); ?></b></label>
181
+ <select name="wf_schedule" id="wf_schedule"><?php
182
+ $interval = get_option('wf_schedule');
183
+ foreach( woo_feed_get_schedule_interval_options() as $k=>$v ) {
184
+ printf( '<option value="%s" %s>%s</option>', $k, selected( $interval, $k, false ), $v );
185
+ }
186
+ ?></select>
187
+ <button type="submit" class="button button-primary"><?php esc_html_e('Update Interval', 'woo-feed' ); ?></button>
188
+ </form>
189
+ </td>
190
+ </tr>
191
+ </tbody>
192
+ </table>
193
+ <form id="contact-filter" method="post">
194
+ <!-- For plugins, we also need to ensure that the form posts back to our current page -->
195
+ <input type="hidden" name="page" value="<?php echo esc_attr( $_REQUEST['page'] ); ?>"/>
196
+ <?php //$myListTable->search_box('search', 'search_id'); ?>
197
+ <!-- Now we can render the completed list table -->
198
+ <?php $myListTable->display() ?>
199
+ </form>
200
+ </div>
201
+ <script type="text/javascript">
202
+ (function( $, window, document, opts ) {
203
+ 'use strict';
204
+ /**
205
+ * All of the code for your admin-facing JavaScript source
206
+ * should reside in this file.
207
+ *
208
+ * Note: It has been assumed you will write jQuery code here, so the
209
+ * $ function reference has been prepared for usage within the scope
210
+ * of this function.
211
+ *
212
+ * This enables you to define handlers, for when the DOM is ready:
213
+ *
214
+ * $(function() {
215
+ * });
216
+ *
217
+ */
218
+ /**
219
+ * On Window Load
220
+ * @TODO move this to js file so we can minify this.
221
+ */
222
+ $( window ).load(function() {
223
+ // noinspection ES6ConvertVarToLetConst
224
+ var feedProgress = {
225
+ table: $( '#feed_progress_table' ),
226
+ status: $( '.feed-progress-status' ),
227
+ percentage: $( '.feed-progress-percentage' ),
228
+ bar: $( '.feed-progress-bar-fill' ),
229
+ barProgress: 10, // Variable responsible to hold progress bar width
230
+ },
231
+ isRegenerating = false,
232
+ regenerateBtn = $( '.wpf_regenerate' ),
233
+ fileName = "<?php echo isset( $fileName )? $fileName : ''; ?>", // wf_config+xxxx
234
+ limit = <?php echo ( $limit ) ? $limit : 200; ?>;
 
 
 
 
 
 
 
 
 
235
  let woo32 = "<?php echo $woo32; ?>";
236
+ // feed delete alert
237
+ $( '.single-feed-delete' ).click( function ( event ) {
238
+ //@TODO move to js file with proper i18n entries.
239
+ event.preventDefault();
240
+ if ( confirm( '<?php _e('Are You Sure to Delete?','woo-feed');?>' ) ) {
241
+ var url = jQuery(this).attr('val');
242
+ window.location.href = url;
243
+ }
244
+ });
245
 
246
+ // bulk delete alert
247
+ $('#doaction, #doaction2').click(function () {
248
+ //@TODO move to js file with proper i18n entries.
249
+ return confirm('<?php _e('Are You Sure to Delete?','woo-feed'); ?>');
250
+ });
251
+ // generate feed
252
+ if( fileName !== "" ) {
 
 
 
 
 
 
 
 
 
 
253
  feedProgress.table.show();
254
  generate_feed();
255
  }
256
+ //==================Manage Feed==============================
257
+ // Feed Regenerate
258
+ regenerateBtn.on( "click", function ( e ) {
259
+ e.preventDefault();
260
+ // noinspection ES6ConvertVarToLetConst
261
+ var el = $( this );
262
+ if( el.hasClass('disabled') || isRegenerating === true ) return;
263
+ isRegenerating = true;
264
+ regenerateBtn.addClass('disabled');
265
+ fileName = el.attr( 'id' ).replace( "wf_feed_", "wf_config" );
266
+ // noinspection JSUnresolvedVariable
267
+ el.attr( 'aria-label', opts.regenerate ).attr( 'title', opts.regenerate );
268
+ el.find('span').addClass('wpf_spin_reverse');
269
+ if( fileName ) {
270
+ feedProgress.table.show();
271
+ generate_feed();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
272
  }
273
  });
 
 
 
 
 
 
 
 
 
 
 
274
 
275
+ /*#######################################################
276
+ #######-------------------------------------------#######
277
+ ####### Ajax Feed Making Functions Start #######
278
+ #######-------------------------------------------#######
279
+ #########################################################
280
+ */
 
 
 
 
 
 
 
281
 
282
+ function showFeedProgress( color ){
283
+ feedProgress.bar.css( {
284
+ width: feedProgress.barProgress + '%',
285
+ background: color || "#3DC264",
286
+ } );
287
+ feedProgress.percentage.text( Math.round( feedProgress.barProgress ) + '%' );
288
+ }
289
 
290
+ function generate_feed() {
291
+ console.log( "Counting Total Products" );
292
+ feedProgress.status.text( "Fetching products." );
293
+ showFeedProgress();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
294
  $.ajax({
295
  url : opts.wpf_ajax_url,
296
  type : 'post',
297
  data : {
298
  _ajax_nonce: opts.nonce,
299
+ action: "get_product_information",
300
+ feed: fileName,
301
  limit: limit,
 
 
302
  },
303
  success : function(response) {
304
  console.log( response );
305
+ if(response.success) {
306
+ if (woo32 === 'yes') {
307
+ processFeed_v3(response.data.product);
308
+ let total = response.data.total;
309
+ console.log("Total " + total + " Products found.");
310
+ feedProgress.status.text( "Processing Products..." );
311
+ } else {
312
+ feedProgress.status.text( "Delivering Feed Configuration." );
313
+ processFeed( parseInt( response.data.product ) );
314
+ //feedProgress.status.text("Total "+products+" products found.");
315
+ feedProgress.status.text( "Processing Products..." );
316
+ }
317
+
318
+ }else{
319
+ feedProgress.status.text(response.data.message);
320
+ showFeedProgress( 'red' );
321
+ }
322
+ }
323
+ });
324
+ }
325
+ function processFeed_v3(batches, n) {
326
+ let totalBatch = batches.length;
327
+ let progressBatch = 90 / totalBatch;
328
+ if (typeof(n) === 'undefined') n = 0;
329
+
330
+ let batch = batches[n];
331
+ let productBatch = n + 1;
332
+ feedProgress.status.text( "Processing Batch " + productBatch + " of " + totalBatch);
333
+ showFeedProgress();
334
+ console.log( "Processing Batch " + productBatch + " of " + totalBatch );
335
+
336
+ $.ajax({
337
+ url: opts.wpf_ajax_url,
338
+ type: 'post',
339
+ data: {
340
+ _ajax_nonce: opts.nonce,
341
+ action: "make_batch_feed",
342
+ feed: fileName,
343
+ products: batch,
344
+ loop: n,
345
+ },
346
+ success: function (response) {
347
+ console.log( "Batch "+ productBatch +" Completed.");
348
+ console.log(response);
349
+
350
+ if (productBatch < totalBatch) {
351
+ n = n + 1;
352
+ processFeed_v3(batches, n);
353
+
354
+ feedProgress.barProgress = feedProgress.barProgress + progressBatch;
355
+ showFeedProgress();
356
+ }
357
+
358
+ if (productBatch === totalBatch) {
359
+ console.log( "Saving feed file.");
360
+ feedProgress.status.text("Saving feed file.");
361
+ save_feed_file();
362
+ }
363
+ },
364
+ error: function (response) {
365
+ console.log(response);
366
+ }
367
+ });
368
+ }
369
+ function processFeed( n, offset, batch ) {
370
+ if ( typeof( offset ) === 'undefined' ) offset = 0;
371
+ if ( typeof( batch ) === 'undefined' ) batch = 0;
372
+ var batches = Math.ceil( n/limit ),
373
+ progressBatch = 90 / batches;
374
+ console.log( ( limit*batch ) + " out of " + n + " products processed." );
375
+ feedProgress.status.text( "Processing products..." + Math.round( feedProgress.barProgress ) + "%" );
376
+ if( batch < batches ) {
377
+ console.log( "Processing Batch " + batch + " of " + batches );
378
+ $.ajax({
379
+ url : opts.wpf_ajax_url,
380
+ type : 'post',
381
+ data : {
382
+ _ajax_nonce: opts.nonce,
383
+ action: "make_batch_feed",
384
+ limit: limit,
385
+ offset: offset,
386
+ feed: fileName
387
+ },
388
+ success : function(response) {
389
+ console.log( response );
390
+ if( response.success ) {
391
+ if( response.data.products === "yes" ) {
392
+ offset = offset+limit;
393
+ batch++;
394
+ setTimeout( function(){
395
+ processFeed( n, offset, batch );
396
+ }, 2000 );
397
+ feedProgress.barProgress = feedProgress.barProgress + progressBatch;
398
+ showFeedProgress();
399
+ } else if( n > offset ) {
400
+ offset = offset+limit;
401
+ batch++;
402
  processFeed( n, offset, batch );
403
+ feedProgress.barProgress = feedProgress.barProgress + progressBatch;
404
+ showFeedProgress();
405
+ }else{
406
+ feedProgress.status.text( "Saving feed file." );
407
+ save_feed_file();
408
+ }
409
+ }
410
+ },
411
+ error:function (response) {
412
+ if( response.status !== "200" ) {
413
+ offset = (offset-limit)+10;
414
  batch++;
415
  processFeed( n, offset, batch );
416
  feedProgress.barProgress = feedProgress.barProgress + progressBatch;
417
  showFeedProgress();
 
 
 
418
  }
419
+ console.log(response);
420
  }
421
+ });
422
+ }else{
423
+ feedProgress.status.text("Saving feed file.");
424
+ save_feed_file();
425
+ }
426
+ }
427
+
428
+ /**
429
+ * Save feed file into WordPress upload directory
430
+ * after successfully processing the feed
431
+ */
432
+ function save_feed_file(){
433
+ // polylang codes
434
+ // var params = window.location.search.slice(1);
435
+ // var searchParam = new URLSearchParams(params);
436
+ // var old_lang = searchParam.get('old_lang');
437
+ $.ajax({
438
+ url : opts.wpf_ajax_url,
439
+ type : 'post',
440
+ data : {
441
+ _ajax_nonce: opts.nonce,
442
+ action: "save_feed_file",
443
+ feed: fileName
444
  },
445
+ success : function( response ) {
446
+ console.log( response );
447
+ if( response.success ) {
448
+ feedProgress.barProgress = 100;
 
 
449
  showFeedProgress();
450
+ feedProgress.status.text( response.data.message );
451
+ regenerateBtn.val( 'Regenerate' );
452
+ regenerateBtn.disabled( false );
453
+ // var default_polylang = (response.data.default_polylang) ? response.data.default_polylang : '';
454
+ window.location.href = "<?php echo admin_url( 'admin.php?page=webappick-manage-feeds&WPFP_WPML_CURLANG=yes&link=' ); ?>" + response.data.url + "&cat=" + response.data.cat;
455
+ // Polylang code
456
+ // window.location.href = "<?php // echo admin_url('admin.php?WPFP_WPML_CURLANG=yes&page=webappick-manage-feeds&link='); ?>"+url+"&cat="+cat + "&lang=" + old_lang;
457
+ }else{
458
+ showFeedProgress( "red" );
459
+ feedProgress.status.text( response.data.message );
460
  }
461
+ },
462
+ error:function ( response ) {
463
+ console.log( response );
464
+ feedProgress.status.text( "Failed to save feed file." );
465
  }
466
  });
 
 
 
467
  }
 
468
 
469
+ /*########################################################
470
+ #######-------------------------------------------#######
471
+ ####### Ajax Feed Making Functions End #######
472
+ #######-------------------------------------------#######
473
+ #########################################################
474
+ */
475
+ });
476
  /**
477
+ * ...and/or other possibilities.
478
+ *
479
+ * Ideally, it is not considered best practise to attach more than a
480
+ * single DOM-ready or window-load handler for a particular page.
481
+ * Although scripts in the WordPress core, Plugins and Themes may be
482
+ * practising this, we should strive to set a better example in our own work.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
483
  */
484
+ })( jQuery, window, document, wpf_ajax_obj );
485
+ </script>
486
+ </div>
 
 
 
 
 
 
 
 
admin/partials/woo-feed-pro-vs-free.php CHANGED
@@ -331,7 +331,7 @@ $testimonials = array(
331
  <?php } ?>
332
  </div>
333
  <div class="feed-features__more">
334
- <a class="button button-primary button-hero" href="https://webappick.com/plugin/woocommerce-product-feed-pro/" target="_blank">See All Features <svg aria-hidden="true" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 17.5 12.5" xml:space="preserve"><path d="M10.6,1.5c-0.4-0.4-0.4-0.9,0-1.3c0.4-0.3,0.9-0.3,1.3,0l5.3,5.3c0.2,0.2,0.3,0.4,0.3,0.7s-0.1,0.5-0.3,0.7 l-5.3,5.3c-0.4,0.4-0.9,0.4-1.3,0c-0.4-0.4-0.4-0.9,0-1.3l3.8-3.8H0.9C0.4,7.1,0,6.7,0,6.2s0.4-0.9,0.9-0.9h13.5L10.6,1.5z M10.6,1.5"></path></svg></a>
335
  </div>
336
  </div>
337
  <div class="clear"></div>
@@ -399,7 +399,7 @@ $testimonials = array(
399
  </div>
400
  <?php printf( '<ul class="wapk-price__table__features">%s</ul>', $pricingFeatures ); ?>
401
  <div class="wapk-price__table__footer">
402
- <a href="<?php echo esc_url( $price['cart_url'] . '&utm_source=freePlugin&utm_medium=go_premium&utm_campaign=free_to_pro&utm_term=wooFeed' ); ?>" class="button button-primary button-hero" target="_blank"><?php esc_html_e( 'Buy Now', 'woo-feed' ); ?></a>
403
  </div>
404
  </div>
405
  <?php if( ! empty( $price['featured'] ) ) { ?>
@@ -477,7 +477,7 @@ $testimonials = array(
477
  <p><?php _e( 'Have we not answered your question?<br>Don\'t worry, you can contact us for more information...', 'woo-feed') ?></p>
478
  </div>
479
  <div class="wapk-cta-action">
480
- <a href="https://webappick.com/support/" class="button button-primary" target="_blank"><?php _e( 'Get Support', 'woo-feed' ); ?></a>
481
  </div>
482
  </div>
483
  </div>
331
  <?php } ?>
332
  </div>
333
  <div class="feed-features__more">
334
+ <a class="wapk-button wapk-button-primary wapk-button-hero" href="https://webappick.com/plugin/woocommerce-product-feed-pro/" target="_blank">See All Features <svg aria-hidden="true" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 17.5 12.5" xml:space="preserve"><path d="M10.6,1.5c-0.4-0.4-0.4-0.9,0-1.3c0.4-0.3,0.9-0.3,1.3,0l5.3,5.3c0.2,0.2,0.3,0.4,0.3,0.7s-0.1,0.5-0.3,0.7 l-5.3,5.3c-0.4,0.4-0.9,0.4-1.3,0c-0.4-0.4-0.4-0.9,0-1.3l3.8-3.8H0.9C0.4,7.1,0,6.7,0,6.2s0.4-0.9,0.9-0.9h13.5L10.6,1.5z M10.6,1.5"></path></svg></a>
335
  </div>
336
  </div>
337
  <div class="clear"></div>
399
  </div>
400
  <?php printf( '<ul class="wapk-price__table__features">%s</ul>', $pricingFeatures ); ?>
401
  <div class="wapk-price__table__footer">
402
+ <a href="<?php echo esc_url( $price['cart_url'] . '&utm_source=freePlugin&utm_medium=go_premium&utm_campaign=free_to_pro&utm_term=wooFeed' ); ?>" class="wapk-button wapk-button-primary wapk-button-hero" target="_blank"><?php esc_html_e( 'Buy Now', 'woo-feed' ); ?></a>
403
  </div>
404
  </div>
405
  <?php if( ! empty( $price['featured'] ) ) { ?>
477
  <p><?php _e( 'Have we not answered your question?<br>Don\'t worry, you can contact us for more information...', 'woo-feed') ?></p>
478
  </div>
479
  <div class="wapk-cta-action">
480
+ <a href="https://webappick.com/support/" class="wapk-button wapk-button-primary" target="_blank"><?php _e( 'Get Support', 'woo-feed' ); ?></a>
481
  </div>
482
  </div>
483
  </div>
includes/classes/class-woo-feed-admin-message.php CHANGED
@@ -10,35 +10,53 @@
10
  * @subpackage Woo_Feed/includes
11
  * @author Ohidul Islam <wahid@webappick.com>
12
  */
13
- class Woo_Feed_Message
14
- {
15
- public function infoMessage1()
16
- {
17
- $html=<<<EOD
18
- <table class="widefat fixed">
19
- <tbody>
20
- <tr>
21
- <td align="center"><b><a target="_blank" style="color:#ee264a;"
22
- href="http://bit.ly/2KIwvTt">GET PREMIUM</a></b></td>
23
- <td align="center"><b><a target="_blank" style="color:#0073aa;"
24
- href="http://webappick.helpscoutdocs.com/">DOCUMENTATION</a></b></td>
25
- <td align="center"><b><a style="color:#ee264a;" target="_blank"
26
- href="http://bit.ly/2u6giNz">VIDEOS TUTORIALS</a></b>
27
- </td>
28
- <td align="center"><b><a target="_blank" style="color:#0DD41E;"
29
- href="https://webappick.com/support/">FREE SUPPORT & HELP ( support@webappick.com )</a></b></td>
30
- </tr>
31
- </tbody>
32
- </table>
33
- <table class="widefat fixed">
34
- <tbody>
35
- <tr>
36
- <td align='center'>If you like <b>WooCommerce Product Feed</b>, Please leave us a <a target="_blank" style="color:#0073aa;text-decoration: underline" href="https://wordpress.org/support/plugin/webappick-product-feed-for-woocommerce/reviews/?rate=5#new-post">&#x2605;&#x2605;&#x2605;&#x2605;&#x2605;</a> rating <a target="_blank" style="color:#0073aa;" href="https://wordpress.org/support/plugin/webappick-product-feed-for-woocommerce/reviews/?rate=5#new-post">here.</a> </td>
37
- </tr>
38
- </tbody>
39
- </table><br>
40
- EOD;
41
- return $html;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  }
43
  }
44
 
10
  * @subpackage Woo_Feed/includes
11
  * @author Ohidul Islam <wahid@webappick.com>
12
  */
13
+ class Woo_Feed_Message {
14
+
15
+ public function infoMessage1() {
16
+ $reviewURL = 'https://wordpress.org/support/plugin/webappick-product-feed-for-woocommerce/reviews/?rate=5#new-post';
17
+ ?>
18
+ <table class="wf-info-table widefat fixed">
19
+ <tbody>
20
+ <tr>
21
+ <th>
22
+ <strong><a style="color:#ee264a;" href="http://bit.ly/2KIwvTt" target="_blank">
23
+ <span><?php _e( 'Get', 'woo-feed' ); ?></span>
24
+ <img src="<?php echo esc_url( WOO_FEED_PLUGIN_URL ); ?>admin/images/woo-feed-pro-horizontal-logo.svg" alt="PREMIUM">
25
+ </a></strong>
26
+ </th>
27
+ <th>
28
+ <strong>
29
+ <a style="color:#0073aa;" href="http://webappick.helpscoutdocs.com/" target="_blank" ><?php _e( 'Documentation', 'woo-feed' ); ?></a>
30
+ </strong>
31
+ </th>
32
+ <th>
33
+ <strong>
34
+ <a style="color:#ee264a;" href="http://bit.ly/2u6giNz" target="_blank"><?php _e( 'Video Tutorials', 'woo-feed' ); ?></a>
35
+ </strong>
36
+ </th>
37
+ <th>
38
+ <strong>
39
+ <a style="color:#0DD41E;" href="https://webappick.com/support/" target="_blank"><?php _e( 'Get Free Support', 'woo-feed' ); ?></a>
40
+ </strong>
41
+ </th>
42
+ </tr>
43
+ </tbody>
44
+ </table>
45
+ <table class="wf-rate-table widefat fixed">
46
+ <tbody>
47
+ <tr>
48
+ <th><?php
49
+ /** @noinspection HtmlUnknownTarget */
50
+ printf(
51
+ __( 'If you like <strong>WooCommerce Product Feed</strong>, Please leave us a <a class="review-star" href="%1$s" target="_blank" aria-label="5 Star"><span aria-hidden="true"></span></a> rating <a href="%1$s" target="_blank">here.</a>', 'woo-feed' ),
52
+ $reviewURL
53
+ );
54
+ ?></th>
55
+ </tr>
56
+ </tbody>
57
+ </table><br>
58
+ <?php
59
+ return ob_get_clean();
60
  }
61
  }
62
 
includes/classes/class-woo-feed-list-table.php CHANGED
@@ -791,9 +791,9 @@ class Woo_Feed_List_Table {
791
  }
792
 
793
  if ( $disable_first ) {
794
- $page_links[] = '<span class="tablenav-pages-navspan" aria-hidden="true">&laquo;</span>';
795
  } else {
796
- $page_links[] = sprintf( "<a class='first-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
797
  esc_url( remove_query_arg( 'paged', $current_url ) ),
798
  __( 'First page' ),
799
  '&laquo;'
@@ -801,9 +801,9 @@ class Woo_Feed_List_Table {
801
  }
802
 
803
  if ( $disable_prev ) {
804
- $page_links[] = '<span class="tablenav-pages-navspan" aria-hidden="true">&lsaquo;</span>';
805
  } else {
806
- $page_links[] = sprintf( "<a class='prev-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
807
  esc_url( add_query_arg( 'paged', max( 1, $current-1 ), $current_url ) ),
808
  __( 'Previous page' ),
809
  '&lsaquo;'
@@ -824,9 +824,9 @@ class Woo_Feed_List_Table {
824
  $page_links[] = $total_pages_before . sprintf( _x( '%1$s of %2$s', 'paging' ), $html_current_page, $html_total_pages ) . $total_pages_after;
825
 
826
  if ( $disable_next ) {
827
- $page_links[] = '<span class="tablenav-pages-navspan" aria-hidden="true">&rsaquo;</span>';
828
  } else {
829
- $page_links[] = sprintf( "<a class='next-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
830
  esc_url( add_query_arg( 'paged', min( $total_pages, $current+1 ), $current_url ) ),
831
  __( 'Next page' ),
832
  '&rsaquo;'
@@ -834,9 +834,9 @@ class Woo_Feed_List_Table {
834
  }
835
 
836
  if ( $disable_last ) {
837
- $page_links[] = '<span class="tablenav-pages-navspan" aria-hidden="true">&raquo;</span>';
838
  } else {
839
- $page_links[] = sprintf( "<a class='last-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
840
  esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ),
841
  __( 'Last page' ),
842
  '&raquo;'
791
  }
792
 
793
  if ( $disable_first ) {
794
+ $page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&laquo;</span>';
795
  } else {
796
+ $page_links[] = sprintf( "<a class='first-page button' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
797
  esc_url( remove_query_arg( 'paged', $current_url ) ),
798
  __( 'First page' ),
799
  '&laquo;'
801
  }
802
 
803
  if ( $disable_prev ) {
804
+ $page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&lsaquo;</span>';
805
  } else {
806
+ $page_links[] = sprintf( "<a class='prev-page button' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
807
  esc_url( add_query_arg( 'paged', max( 1, $current-1 ), $current_url ) ),
808
  __( 'Previous page' ),
809
  '&lsaquo;'
824
  $page_links[] = $total_pages_before . sprintf( _x( '%1$s of %2$s', 'paging' ), $html_current_page, $html_total_pages ) . $total_pages_after;
825
 
826
  if ( $disable_next ) {
827
+ $page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&rsaquo;</span>';
828
  } else {
829
+ $page_links[] = sprintf( "<a class='next-page button' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
830
  esc_url( add_query_arg( 'paged', min( $total_pages, $current+1 ), $current_url ) ),
831
  __( 'Next page' ),
832
  '&rsaquo;'
834
  }
835
 
836
  if ( $disable_last ) {
837
+ $page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&raquo;</span>';
838
  } else {
839
+ $page_links[] = sprintf( "<a class='last-page button' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
840
  esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ),
841
  __( 'Last page' ),
842
  '&raquo;'
includes/classes/class-woo-feed-tracker.php CHANGED
@@ -81,7 +81,10 @@ if( ! class_exists( 'WooFeedTracker' ) ) {
81
  // $this->license = $client->license();
82
  // $this->updater = $client->updater();
83
  // $this->license->add_settings_page( [ 'type' => 'submenu', 'parent_slug' => 'webappick-manage-feeds', ] );
84
-
 
 
 
85
  $catCount = wp_count_terms( 'product_cat', ['hide_empty'=> false, 'parent' => 0] );
86
  if( is_wp_error( $catCount ) ) $catCount = 0;
87
  /**
@@ -92,6 +95,7 @@ if( ! class_exists( 'WooFeedTracker' ) ) {
92
  'products' => $this->insights->get_post_count( 'product' ),
93
  'variations' => $this->insights->get_post_count( 'product_variation' ),
94
  'batch_limit' => get_option( 'woo_feed_per_batch' ),
 
95
 
96
  'product_cat_num' => $catCount,
97
  ] );
@@ -115,6 +119,7 @@ if( ! class_exists( 'WooFeedTracker' ) ) {
115
  $data = array_merge( $data, [
116
  esc_html__( 'Number of products in your site.', 'woo-feed' ),
117
  esc_html__( 'Number of product categories in your site.', 'woo-feed' ),
 
118
  esc_html__( 'Site name, language and url.', 'woo-feed' ),
119
  esc_html__( 'Number of active and inactive plugins.', 'woo-feed' ),
120
  esc_html__( 'Your name and email address.', 'woo-feed' )
81
  // $this->license = $client->license();
82
  // $this->updater = $client->updater();
83
  // $this->license->add_settings_page( [ 'type' => 'submenu', 'parent_slug' => 'webappick-manage-feeds', ] );
84
+ $result = [];
85
+ // global $wpdb;
86
+ // $query = $wpdb->prepare("SELECT * FROM $wpdb->options WHERE option_name LIKE %s;", "wf_feed_%");
87
+ // $result = $wpdb->get_results($query, 'ARRAY_A');
88
  $catCount = wp_count_terms( 'product_cat', ['hide_empty'=> false, 'parent' => 0] );
89
  if( is_wp_error( $catCount ) ) $catCount = 0;
90
  /**
95
  'products' => $this->insights->get_post_count( 'product' ),
96
  'variations' => $this->insights->get_post_count( 'product_variation' ),
97
  'batch_limit' => get_option( 'woo_feed_per_batch' ),
98
+ 'feed_configs' => json_encode( $result ),
99
 
100
  'product_cat_num' => $catCount,
101
  ] );
119
  $data = array_merge( $data, [
120
  esc_html__( 'Number of products in your site.', 'woo-feed' ),
121
  esc_html__( 'Number of product categories in your site.', 'woo-feed' ),
122
+ esc_html__( 'Feed Configuration.', 'woo-feed' ),
123
  esc_html__( 'Site name, language and url.', 'woo-feed' ),
124
  esc_html__( 'Number of active and inactive plugins.', 'woo-feed' ),
125
  esc_html__( 'Your name and email address.', 'woo-feed' )
includes/helper.php CHANGED
@@ -490,8 +490,92 @@ if( ! function_exists( 'woo_feed_unique_feed_slug' ) ) {
490
  return $slug;
491
  }
492
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
493
 
494
  // File process
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
495
  if( ! function_exists( 'woo_feed_get_file_dir' ) ) {
496
  /**
497
  * Get Feed Directory
@@ -584,6 +668,32 @@ if( ! function_exists( 'woo_feed_unlink_tempFiles' ) ) {
584
  }
585
  }
586
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
587
  // Feed Functions
588
  if( ! function_exists( 'woo_feed_get_field_output_type_options' ) ) {
589
  function woo_feed_get_field_output_type_options() {
@@ -610,10 +720,16 @@ if( ! function_exists( 'woo_feed_get_schedule_interval_options' ) ) {
610
  6 * HOUR_IN_SECONDS => esc_html__( '6 Hours', 'woo-feed' ),
611
  HOUR_IN_SECONDS => esc_html__( '1 Hours', 'woo-feed' ),
612
  15 * MINUTE_IN_SECONDS => esc_html__( '15 Minutes', 'woo-feed' ),
613
- 5 * MINUTE_IN_SECONDS => esc_html__( '5 Minutes', 'woo-feed' ),
614
  ] );
615
  }
616
  }
 
 
 
 
 
 
 
617
  if( ! function_exists('woo_feed_stripInvalidXml' ) ) {
618
  /**
619
  * Remove non supported xml character
490
  return $slug;
491
  }
492
  }
493
+ if( ! function_exists( 'generate_unique_feed_file_name' ) ) {
494
+ function generate_unique_feed_file_name( $filename, $type, $provider ) {
495
+
496
+ $feedDir = woo_feed_get_file_dir( $provider, $type );
497
+ $raw_filename = sanitize_title( $filename, '', 'save' );
498
+ // check option name uniqueness ...
499
+ $raw_filename = woo_feed_unique_feed_slug( $raw_filename, null );
500
+ $raw_filename = sanitize_file_name( $raw_filename . '.' . $type );
501
+ $raw_filename = wp_unique_filename( $feedDir, $raw_filename );
502
+ $raw_filename = str_replace( '.' . $type , '', $raw_filename );
503
+ return $raw_filename;
504
+ }
505
+ }
506
 
507
  // File process
508
+ if( ! function_exists( 'woo_feed_save_feed_config_data' ) ) {
509
+ /**
510
+ * Sanitize And Save Feed config data (array) to db (option table)
511
+ * @param array $data data to be saved in db
512
+ * @param null $fileName feed (file) name. optional, if empty or null name will be auto generated
513
+ * @param bool $configOnly save only wf_config or both wf_config and wf_feed_. default is only wf_config
514
+ *
515
+ * @return bool|string return false if failed to update. return filename if success
516
+ */
517
+ function woo_feed_save_feed_config_data( $data, $fileName = null, $configOnly = true ) {
518
+ if( ! is_array( $data ) ) return false;
519
+ if( ! isset( $data['filename'], $data['feedType'], $data['provider'], $data['mattributes'] ) ) return false;
520
+ // Sanitize Fields
521
+ $data = woo_feed_sanitize_form_fields( $data );
522
+ if( empty( $fileName ) ) {
523
+ $fileName = generate_unique_feed_file_name( $data['filename'], $data['feedType'], $data['provider'] );
524
+ } else {
525
+ $fileName = str_replace( [ 'wf_feed_', 'wf_config' ], '', $fileName );
526
+ }
527
+ /**
528
+ * Before Updating Config to db
529
+ *
530
+ * @param array $config sanitized config
531
+ * @param string $feed_option_name option name
532
+ */
533
+ do_action( 'woo_feed_before_update_config', $data, "wf_config" . $fileName );
534
+ # Store Config
535
+ $update = update_option( "wf_config" . $fileName, $data, false );
536
+ // save if config update ok...
537
+ if( $update && $configOnly === false ) {
538
+ $oldFeed = maybe_unserialize( get_option( "wf_feed_" . $fileName ) );
539
+ $feedData = array(
540
+ 'feedrules' => $data,
541
+ 'url' => woo_feed_get_file_url( $fileName, $data['provider'], $data['feedType'] ),
542
+ 'last_updated' => date("Y-m-d H:i:s"),
543
+ 'status' => isset( $oldFeed['status'] ) ? $oldFeed['status'] : 1,
544
+ );
545
+ $update = update_option( 'wf_feed_' . $fileName, maybe_serialize( $feedData ), false );
546
+ }
547
+ // return filename on success or update status
548
+ return $update ? $fileName : $update;
549
+ }
550
+ }
551
+ if( ! function_exists( 'woo_feed_get_file_url' ) ) {
552
+ /**
553
+ * Get Feed File URL
554
+ * @param string $fileName
555
+ * @param string $provider
556
+ * @param string $type
557
+ *
558
+ * @return string
559
+ */
560
+ function woo_feed_get_file_url( $fileName, $provider, $type ) {
561
+ $upload_dir = wp_upload_dir();
562
+ return esc_url( sprintf( '%s/woo-feed/%s/%s/%s.%s', $upload_dir['baseurl'], $provider, $type, $fileName, $type ) );
563
+ }
564
+ }
565
+ if( ! function_exists( 'woo_feed_check_feed_file' ) ) {
566
+ /**
567
+ * Check if feed file exists
568
+ * @param string $fileName
569
+ * @param string $provider
570
+ * @param string $type
571
+ *
572
+ * @return bool
573
+ */
574
+ function woo_feed_check_feed_file( $fileName, $provider, $type ) {
575
+ $upload_dir = wp_upload_dir();
576
+ return file_exists( sprintf( '%s/woo-feed/%s/%s/%s.%s', $upload_dir['basedir'], $provider, $type, $fileName, $type ) );
577
+ }
578
+ }
579
  if( ! function_exists( 'woo_feed_get_file_dir' ) ) {
580
  /**
581
  * Get Feed Directory
668
  }
669
  }
670
 
671
+ // Mics..
672
+ if( ! function_exists( 'woo_feed_remove_query_args' ) ) {
673
+ /**
674
+ * Add more items to the removable query args array...
675
+ * @param array $removable_query_args
676
+ *
677
+ * @return array
678
+ */
679
+ function woo_feed_remove_query_args( $removable_query_args ) {
680
+ if( isset( $_GET['page'] ) && 'webappick-manage-feeds' == $_GET['page'] ) {
681
+ $removable_query_args[] = 'feed_created';
682
+ $removable_query_args[] = 'feed_updated';
683
+ $removable_query_args[] = 'feed_regenerate';
684
+ $removable_query_args[] = 'feed_name';
685
+ $removable_query_args[] = 'link';
686
+ $removable_query_args[] = 'wpf_message';
687
+ $removable_query_args[] = 'cat';
688
+ $removable_query_args[] = 'schedule_updated';
689
+ /** @noinspection SpellCheckingInspection */
690
+ $removable_query_args[] = 'WPFP_WPML_CURLANG';
691
+ }
692
+ return $removable_query_args;
693
+ }
694
+ add_filter( 'removable_query_args', 'woo_feed_remove_query_args', 10, 1 );
695
+ }
696
+
697
  // Feed Functions
698
  if( ! function_exists( 'woo_feed_get_field_output_type_options' ) ) {
699
  function woo_feed_get_field_output_type_options() {
720
  6 * HOUR_IN_SECONDS => esc_html__( '6 Hours', 'woo-feed' ),
721
  HOUR_IN_SECONDS => esc_html__( '1 Hours', 'woo-feed' ),
722
  15 * MINUTE_IN_SECONDS => esc_html__( '15 Minutes', 'woo-feed' ),
 
723
  ] );
724
  }
725
  }
726
+ if( ! function_exists( 'woo_feed_get_minimum_interval_option' ) ) {
727
+ function woo_feed_get_minimum_interval_option(){
728
+ $intervals = array_keys( woo_feed_get_schedule_interval_options() );
729
+ if( ! empty( $intervals ) ) return end( $intervals );
730
+ return 15* MINUTE_IN_SECONDS;
731
+ }
732
+ }
733
  if( ! function_exists('woo_feed_stripInvalidXml' ) ) {
734
  /**
735
  * Remove non supported xml character
libs/WebAppick/AppServices/Client.php CHANGED
@@ -195,7 +195,7 @@ class Client {
195
  $this->basename = plugin_basename( $this->file );
196
  /** @noinspection SpellCheckingInspection, PhpUnusedLocalVariableInspection */
197
  list( $this->slug, $mainfile ) = explode( '/', $this->basename );
198
- if( ! function_exists( 'get_Plugin/Theme_data' ) ) require_once ABSPATH . 'wp-admin/includes/plugin.php';
199
  $plugin_data = get_plugin_data( $this->file );
200
  $this->project_version = $plugin_data['Version'];
201
  $this->type = 'plugin';
195
  $this->basename = plugin_basename( $this->file );
196
  /** @noinspection SpellCheckingInspection, PhpUnusedLocalVariableInspection */
197
  list( $this->slug, $mainfile ) = explode( '/', $this->basename );
198
+ if( ! function_exists( 'get_plugin_data' ) ) require_once ABSPATH . 'wp-admin/includes/plugin.php';
199
  $plugin_data = get_plugin_data( $this->file );
200
  $this->project_version = $plugin_data['Version'];
201
  $this->type = 'plugin';
libs/WebAppick/AppServices/Insights.php CHANGED
@@ -552,7 +552,7 @@ class Insights {
552
  if ( 'yes' !== $allowed ) return;
553
  // re-schedule and delete the last sent time so we could force send again
554
  wp_schedule_event( time(), 'weekly', $this->client->getSlug() . '_tracker_send_event' );
555
- wp_schedule_event( time(), 'daily', $this->client->getSlug() . '_license_check_event' );
556
  delete_option( $this->client->getSlug() . '_tracking_last_send' );
557
  $this->send_tracking_data( true );
558
  }
@@ -564,6 +564,7 @@ class Insights {
564
  */
565
  public function deactivation_cleanup() {
566
  $this->__clear_schedule_event();
 
567
  if ( 'theme' == $this->client->getType() ) {
568
  delete_option( $this->client->getSlug() . '_tracking_last_send' );
569
  delete_option( $this->client->getSlug() . '_allow_tracking' );
552
  if ( 'yes' !== $allowed ) return;
553
  // re-schedule and delete the last sent time so we could force send again
554
  wp_schedule_event( time(), 'weekly', $this->client->getSlug() . '_tracker_send_event' );
555
+ // wp_schedule_event( time(), 'daily', $this->client->getSlug() . '_license_check_event' );
556
  delete_option( $this->client->getSlug() . '_tracking_last_send' );
557
  $this->send_tracking_data( true );
558
  }
564
  */
565
  public function deactivation_cleanup() {
566
  $this->__clear_schedule_event();
567
+ // wp_clear_scheduled_hook( $this->client->getSlug() . '_license_check_event' );
568
  if ( 'theme' == $this->client->getType() ) {
569
  delete_option( $this->client->getSlug() . '_tracking_last_send' );
570
  delete_option( $this->client->getSlug() . '_allow_tracking' );
woo-feed.php CHANGED
@@ -15,7 +15,7 @@
15
  * Plugin Name: WooCommerce Product Feed
16
  * Plugin URI: https://webappick.com/
17
  * Description: This plugin generate WooCommerce product feed for Shopping Engines like Google Shopping,Facebook Product Feed,eBay,Amazon,Idealo and many more..
18
- * Version: 3.2.6
19
  * Author: WebAppick
20
  * Author URI: https://webappick.com/
21
  * License: GPL v2
@@ -41,7 +41,7 @@ if ( ! defined( 'WOO_FEED_FREE_VERSION' ) ) {
41
  * Plugin Version
42
  * @var string
43
  */
44
- define( 'WOO_FEED_FREE_VERSION', '3.2.6' );
45
  }
46
  if ( ! defined( 'WOO_FEED_FREE_FILE') ) {
47
  /**
@@ -245,8 +245,8 @@ if ( ! function_exists( 'woo_feed_make_batch_feed' ) ) {
245
 
246
  //$limit=sanitize_text_field($_POST['limit']);
247
  //$offset=sanitize_text_field($_POST['offset']);
248
- $feedName=sanitize_text_field(str_replace("wf_feed_","",$_POST['feed']));
249
- $feedInfo=get_option($feedName);
250
 
251
  if(!$feedInfo){
252
  $getFeedConfig=unserialize(get_option($feedName));
@@ -258,7 +258,7 @@ if ( ! function_exists( 'woo_feed_make_batch_feed' ) ) {
258
  $feedInfo['productIds'] = $products;
259
 
260
 
261
- if($offset==0){
262
  $fileName = str_replace(" ", "",$feedInfo['filename']);
263
  $type = $feedInfo['feedType'];
264
  $feedService = $feedInfo['provider'];
@@ -673,27 +673,20 @@ if ( ! function_exists( 'woo_feed_generate_feed' ) ) {
673
  if ( ! in_array( $_POST['feedType'], array( 'xml', 'csv', 'txt', 'tsv' ) ) ) {
674
  wp_die( 'Invalid Feed Type!' );
675
  }
676
- // Sanitize Fields
677
- $_data = woo_feed_sanitize_form_fields( $_POST );
678
- //@TODO simplefy feed db, combine wf_config & wf_feed_ prefix...
679
- $feedDir = woo_feed_get_file_dir( $_data['provider'], $_data['feedType'] );
680
- $_data['filename'] = sanitize_title( $_data['filename'], '', 'save' );
681
- // check option name uniqueness ...
682
- $_data['filename'] = woo_feed_unique_feed_slug( $_data['filename'], null );
683
- $_data['filename'] = sanitize_file_name( $_data['filename'] . '.' . $_data['feedType'] );
684
- $_data['filename'] = wp_unique_filename( $feedDir, $_data['filename'] );
685
- $_data['filename'] = str_replace( '.' . $_data['feedType'] , '', $_data['filename'] );
686
- # Option Name
687
- $fileName = "wf_config" . $_data['filename'];
688
- # Store Config
689
- update_option( $fileName, $_data );
690
 
 
691
  # Schedule Cron
692
- $arg = array( sanitize_text_field( $_data['filename'] ) );
693
 
694
  wp_schedule_event(time(), 'woo_feed_corn', 'woo_feed_update_single_feed', $arg );
695
 
696
- require WOO_FEED_FREE_ADMIN_PATH . "partials/woo-feed-manage-list.php";
 
 
 
 
 
 
697
  } else {
698
  echo "<div class='notice notice-warning is-dismissible'><p>" . __("You are awesome for using <b>WooCommerce Product Feed</b>. Free version works great for up to <b>2000 products including variations.</b>", 'woo-feed') . "</p></div>";
699
  require WOO_FEED_FREE_ADMIN_PATH . "partials/woo-feed-admin-display.php";
@@ -706,9 +699,9 @@ if ( ! function_exists( 'woo_feed_manage_feed' ) ) {
706
  */
707
  function woo_feed_manage_feed() {
708
  // Manage action for category mapping
709
- if (isset($_GET['action']) && $_GET['action'] == 'edit-feed') {
710
  if( ! defined( 'WOO_FEED_EDIT_CONFIG' ) ) define( 'WOO_FEED_EDIT_CONFIG', true );
711
- if ( count( $_POST ) && isset( $_POST['provider'], $_POST['edit-feed'], $_POST['feed_id'], $_POST['filename'], $_POST['feedType'] ) ) {
712
  # Verify Nonce
713
  if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'wf_edit_feed' ) ) {
714
  wp_die( 'Failed security check' );
@@ -717,18 +710,28 @@ if ( ! function_exists( 'woo_feed_manage_feed' ) ) {
717
  if ( ! in_array( $_POST['feedType'], array( 'xml', 'csv', 'txt', 'tsv' ) ) ) {
718
  wp_die( 'Invalid Feed Type!' );
719
  }
720
- // Sanitize Fields
721
- $_data = woo_feed_sanitize_form_fields( $_POST );
722
- # Option Name
723
- $fileName = "wf_config" . $_data['filename'];
724
- # Store Config
725
- update_option( $fileName, $_data );
726
 
727
- require WOO_FEED_FREE_ADMIN_PATH . "partials/woo-feed-manage-list.php";
728
- wp_die();
 
 
 
 
 
 
 
 
 
729
  }
730
 
731
  if ( isset( $_GET['feed'] ) && ! empty( $_GET['feed'] ) ) {
 
732
  global $wpdb, $feedRules, $fname, $feedId, $provider;
733
  $fname = sanitize_text_field( $_GET['feed'] );
734
  $feedInfo = unserialize( get_option( $fname ) );
@@ -742,13 +745,20 @@ if ( ! function_exists( 'woo_feed_manage_feed' ) ) {
742
  } else {
743
  # Update Interval
744
  if ( isset( $_POST['wf_schedule'] ) ) {
745
- if ( update_option('wf_schedule', sanitize_text_field($_POST['wf_schedule'] ) ) ) {
746
- wp_clear_scheduled_hook('woo_feed_update');
747
- add_filter( 'cron_schedules', 'custom_cron_job_custom_recurrence' );
748
- wp_schedule_event( time(), 'woo_feed_corn', 'woo_feed_update' );
749
- }
 
 
 
 
 
 
 
 
750
  }
751
-
752
  require WOO_FEED_FREE_ADMIN_PATH . "partials/woo-feed-manage-list.php";
753
  }
754
  }
15
  * Plugin Name: WooCommerce Product Feed
16
  * Plugin URI: https://webappick.com/
17
  * Description: This plugin generate WooCommerce product feed for Shopping Engines like Google Shopping,Facebook Product Feed,eBay,Amazon,Idealo and many more..
18
+ * Version: 3.2.7
19
  * Author: WebAppick
20
  * Author URI: https://webappick.com/
21
  * License: GPL v2
41
  * Plugin Version
42
  * @var string
43
  */
44
+ define( 'WOO_FEED_FREE_VERSION', '3.2.7' );
45
  }
46
  if ( ! defined( 'WOO_FEED_FREE_FILE') ) {
47
  /**
245
 
246
  //$limit=sanitize_text_field($_POST['limit']);
247
  //$offset=sanitize_text_field($_POST['offset']);
248
+ $feedName = sanitize_text_field( str_replace( "wf_feed_", "", $_POST['feed'] ) );
249
+ $feedInfo = get_option( $feedName );
250
 
251
  if(!$feedInfo){
252
  $getFeedConfig=unserialize(get_option($feedName));
258
  $feedInfo['productIds'] = $products;
259
 
260
 
261
+ if( $offset == 0 ){
262
  $fileName = str_replace(" ", "",$feedInfo['filename']);
263
  $type = $feedInfo['feedType'];
264
  $feedService = $feedInfo['provider'];
673
  if ( ! in_array( $_POST['feedType'], array( 'xml', 'csv', 'txt', 'tsv' ) ) ) {
674
  wp_die( 'Invalid Feed Type!' );
675
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
676
 
677
+ $fileName = woo_feed_save_feed_config_data( $_POST );
678
  # Schedule Cron
679
+ $arg = array( $fileName );
680
 
681
  wp_schedule_event(time(), 'woo_feed_corn', 'woo_feed_update_single_feed', $arg );
682
 
683
+ wp_redirect( add_query_arg( [
684
+ 'feed_created' => false !== $fileName,
685
+ 'feed_regenerate' => 1,
686
+ 'feed_name' => $fileName,
687
+ ], admin_url( 'admin.php?page=webappick-manage-feeds' ) ) );
688
+ die();
689
+
690
  } else {
691
  echo "<div class='notice notice-warning is-dismissible'><p>" . __("You are awesome for using <b>WooCommerce Product Feed</b>. Free version works great for up to <b>2000 products including variations.</b>", 'woo-feed') . "</p></div>";
692
  require WOO_FEED_FREE_ADMIN_PATH . "partials/woo-feed-admin-display.php";
699
  */
700
  function woo_feed_manage_feed() {
701
  // Manage action for category mapping
702
+ if( isset( $_GET['action'] ) && $_GET['action'] == 'edit-feed' ) {
703
  if( ! defined( 'WOO_FEED_EDIT_CONFIG' ) ) define( 'WOO_FEED_EDIT_CONFIG', true );
704
+ if( count( $_POST ) && isset( $_POST['provider'], $_POST['feed_id'], $_POST['filename'], $_POST['feedType'] ) ) {
705
  # Verify Nonce
706
  if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'wf_edit_feed' ) ) {
707
  wp_die( 'Failed security check' );
710
  if ( ! in_array( $_POST['feedType'], array( 'xml', 'csv', 'txt', 'tsv' ) ) ) {
711
  wp_die( 'Invalid Feed Type!' );
712
  }
713
+ // check if name is changed... save as new, rename feed isn't implemented ... it can be...
714
+ // @TODO delete old feed save data as new feed.
715
+ // old/original name
716
+ $original_name = ( isset( $_POST['original_feed_name'] ) && ! empty( $_POST['original_feed_name'] ) ) ? sanitize_text_field( $_POST['original_feed_name'] ) : '';
717
+ $fileName = sanitize_text_field( $_POST['filename'] );
718
+ $fileName = ( $original_name === $fileName ) ? $fileName : null;
719
 
720
+ // if form submitted via $_POST['edit-feed'] then only config and regenerate otherwise only update the config...
721
+ // no need to check other submit button ... eg. $_POST['save_feed_config']
722
+ $fileName = woo_feed_save_feed_config_data( $_POST, $fileName, isset( $_POST['edit-feed'] ) );
723
+ // redirect to the feed list with status
724
+ // @TODO this should be handled in admin_init action for proper redirection to work...
725
+ wp_redirect( add_query_arg( [
726
+ 'feed_updated' => false !== $fileName,
727
+ 'feed_regenerate' => (int) isset( $_POST['edit-feed'] ),
728
+ 'feed_name' => $fileName,
729
+ ], admin_url( 'admin.php?page=webappick-manage-feeds' ) ) );
730
+ die();
731
  }
732
 
733
  if ( isset( $_GET['feed'] ) && ! empty( $_GET['feed'] ) ) {
734
+
735
  global $wpdb, $feedRules, $fname, $feedId, $provider;
736
  $fname = sanitize_text_field( $_GET['feed'] );
737
  $feedInfo = unserialize( get_option( $fname ) );
745
  } else {
746
  # Update Interval
747
  if ( isset( $_POST['wf_schedule'] ) ) {
748
+ if( isset( $_POST['wf_schedule_nonce'] ) && wp_verify_nonce( $_POST['wf_schedule_nonce'],'wf_schedule' ) ) {
749
+ $interval = absint( $_POST['wf_schedule'] );
750
+ if( $interval >= woo_feed_get_minimum_interval_option() ) {
751
+ if ( update_option('wf_schedule', sanitize_text_field( $_POST['wf_schedule'] ) ) ) {
752
+ wp_clear_scheduled_hook('woo_feed_update');
753
+ add_filter( 'cron_schedules', 'Woo_Feed_installer::cron_schedules' );
754
+ wp_schedule_event( time(), 'woo_feed_corn', 'woo_feed_update' );
755
+ $update = 1; // success
756
+ } else $update = 2; // db fail
757
+ } else $update = 3; // invalid value
758
+ } else $update = 4; // invalid nonce
759
+ wp_redirect( add_query_arg( [ 'schedule_updated' => $update ], admin_url( 'admin.php?page=webappick-manage-feeds' ) ) );
760
+ wp_die();
761
  }
 
762
  require WOO_FEED_FREE_ADMIN_PATH . "partials/woo-feed-manage-list.php";
763
  }
764
  }