CTX Feed – WooCommerce Product Feed Manager Plugin - Version 3.3.8

Version Description

(2020-03-16) = * Compatibility: Tested Upto WooCommerce 4.0 * Improve: Cleanup and minify assets (CSS & JS) * Improve: Add nice ui dropdown for Output Type Select * Fix: Return empty (previously returning zero) value if sale price is 0 * Fix: Support link on doc page * Fix: Default Output type for price attribute on Google, Facebook and Pinterest feed

Download this release

Release Info

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

Code changes from version 3.3.4 to 3.3.8

Files changed (48) hide show
  1. README.txt +9 -1
  2. admin/class-woo-feed-admin.php +25 -18
  3. admin/css/fancy-select.css +187 -0
  4. admin/css/fancy-select.min.css +1 -0
  5. admin/css/selectize.css +0 -1
  6. admin/css/selectize.min.css +16 -0
  7. admin/css/slick-theme.min.css +1 -0
  8. admin/css/slick.min.css +1 -0
  9. admin/css/woo-feed-admin-pro.css +742 -0
  10. admin/css/woo-feed-admin-pro.min.css +1 -0
  11. admin/css/woo-feed-admin.css +612 -864
  12. admin/css/woo-feed-admin.min.css +1 -0
  13. admin/js/fancy-select.js +442 -0
  14. admin/js/fancy-select.min.js +7 -0
  15. admin/js/jquery-sortable.js +1 -1
  16. admin/js/jquery-sortable.min.js +29 -0
  17. admin/js/woo-feed-admin-pro.js +8 -0
  18. admin/js/woo-feed-admin-pro.min.js +8 -0
  19. admin/js/woo-feed-admin.js +184 -200
  20. admin/js/woo-feed-admin.min.js +8 -0
  21. admin/partials/templates/common_add-feed.php +10 -12
  22. admin/partials/templates/custom_add-feed.php +1 -3
  23. admin/partials/templates/facebook_add-feed.php +28 -54
  24. admin/partials/templates/google_add-feed.php +15 -41
  25. admin/partials/templates/pinterest_add-feed.php +28 -54
  26. admin/partials/woo-feed-edit-config.php +2 -4
  27. admin/partials/woo-feed-edit-tabs.php +1 -1
  28. includes/class-woo-feed-activator.php +0 -42
  29. includes/class-woo-feed-deactivator.php +0 -36
  30. includes/class-woo-feed-docs.php +59 -95
  31. includes/class-woo-feed-i18n.php +1 -1
  32. includes/class-woo-feed-loader.php +18 -18
  33. includes/class-woo-feed.php +231 -236
  34. includes/classes/class-woo-feed-admin-message.php +1 -0
  35. includes/classes/class-woo-feed-dropdown.php +10 -2
  36. includes/classes/class-woo-feed-list-table.php +11 -6
  37. includes/classes/class-woo-feed-products-v3.php +604 -465
  38. includes/classes/class-woo-feed-savefile.php +13 -13
  39. includes/feeds/class-woo-feed-custom.php +3 -10
  40. includes/feeds/class-woo-feed-facebook.php +1 -1
  41. includes/feeds/class-woo-feed-google.php +1 -2
  42. includes/feeds/class-woo-feed-pinterest.php +1 -1
  43. includes/helper.php +109 -69
  44. includes/hooks.php +2 -2
  45. libs/WebAppick/AppServices/License.php +42 -1
  46. libs/WebAppick/AppServices/Updater.php +14 -43
  47. uninstall.php +15 -15
  48. woo-feed.php +3 -3
README.txt CHANGED
@@ -5,7 +5,7 @@ Tags:product feed,woocommerce product feed,google shopping feed,google shopping,
5
  Requires at least: 3.6
6
  Tested Up To: 5.3.2
7
  Requires PHP: 5.6
8
- Stable tag: 3.3.4
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -305,6 +305,14 @@ Using pro version:
305
 
306
  == Changelog ==
307
 
 
 
 
 
 
 
 
 
308
  = 3.3.4 (2020-03-10) =
309
  * Template: Separate template for Trovaprezzi.it
310
  * Fix: Dropdown on Facebook and Pinterest feed edit page.
5
  Requires at least: 3.6
6
  Tested Up To: 5.3.2
7
  Requires PHP: 5.6
8
+ Stable tag: 3.3.8
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
305
 
306
  == Changelog ==
307
 
308
+ = 3.3.8 (2020-03-16) =
309
+ * Compatibility: Tested Upto WooCommerce 4.0
310
+ * Improve: Cleanup and minify assets (CSS & JS)
311
+ * Improve: Add nice ui dropdown for Output Type Select
312
+ * Fix: Return empty (previously returning zero) value if sale price is 0
313
+ * Fix: Support link on doc page
314
+ * Fix: Default Output type for price attribute on Google, Facebook and Pinterest feed
315
+
316
  = 3.3.4 (2020-03-10) =
317
  * Template: Separate template for Trovaprezzi.it
318
  * Fix: Dropdown on Facebook and Pinterest feed edit page.
admin/class-woo-feed-admin.php CHANGED
@@ -66,17 +66,21 @@ class Woo_Feed_Admin {
66
  * class.
67
  */
68
  $mainDeps = array();
 
69
  if ( false !== strpos( $hook, 'webappick' ) && false !== strpos( $hook, 'feed' ) ) {
70
- wp_register_style( 'selectize', plugin_dir_url( __FILE__ ) . 'css/selectize.css', array(), $this->version );
71
- wp_register_style( 'slick', plugin_dir_url( __FILE__ ) . 'css/slick.css', array(), $this->version );
72
- wp_register_style( 'slick-theme', plugin_dir_url( __FILE__ ) . 'css/slick-theme.css', array(), $this->version );
73
- $mainDeps = array( 'selectize', 'list-tables', 'edit' );
 
74
  if ( 'woo-feed_page_webappick-feed-pro-vs-free' == $hook ) {
75
  $mainDeps = array_merge( $mainDeps, array( 'slick', 'slick-theme' ) );
76
  }
77
  }
78
- wp_register_style( $this->woo_feed, plugin_dir_url( __FILE__ ) . 'css/woo-feed-admin.css', $mainDeps, $this->version, 'all' );
 
79
  wp_enqueue_style( $this->woo_feed );
 
80
  }
81
 
82
  /**
@@ -98,13 +102,13 @@ class Woo_Feed_Admin {
98
  * between the defined hooks and the functions defined in this
99
  * class.
100
  */
101
- wp_enqueue_script( 'jquery' );
102
- wp_enqueue_script( 'wp-util' );
103
  if ( false !== strpos( $hook, 'webappick' ) && false !== strpos( $hook, 'feed' ) ) {
104
  wp_register_script( 'jquery-selectize', plugin_dir_url( __FILE__ ) . 'js/selectize.min.js', array( 'jquery' ), $this->version, false );
 
105
  wp_register_script( 'jquery-validate', plugin_dir_url( __FILE__ ) . 'js/jquery.validate.min.js', array( 'jquery' ), $this->version, false );
106
  wp_register_script( 'jquery-validate-additional-methods', plugin_dir_url( __FILE__ ) . 'js/additional-methods.min.js', array( 'jquery', 'jquery-validate' ), $this->version, false );
107
- wp_register_script( 'jquery-sortable', plugin_dir_url( __FILE__ ) . 'js/jquery-sortable.js', array( 'jquery' ), $this->version, false );
108
 
109
  if ( ! wp_script_is( 'clipboard', 'registered' ) ) {
110
  wp_register_script( 'clipboard', plugin_dir_url( __FILE__ ) . 'js/clipboard.min.js', [], '2.0.4', false );
@@ -124,9 +128,10 @@ class Woo_Feed_Admin {
124
  'tags-box',
125
  // 'underscore', 'word-count', 'jquery-ui-autocomplete',
126
  'jquery-touch-punch',
 
127
  ];
128
 
129
- wp_register_script( $this->woo_feed, plugin_dir_url( __FILE__ ) . 'js/woo-feed-admin.js', $feedScriptDependency, $this->version, false );
130
  wp_localize_script(
131
  $this->woo_feed,
132
  'wpf_ajax_obj',
@@ -139,12 +144,14 @@ class Woo_Feed_Admin {
139
  'regenerate' => esc_html__( 'Generating...', 'woo-feed' ),
140
  'learn_more' => esc_html__( 'Learn More..', 'woo-feed' ),
141
  'form' => array(
142
- 'loading_tmpl' => esc_html__( 'Loading Template...', 'woo-feed' ),
143
- 'generate' => esc_html__( 'Delivering Configuration...', 'woo-feed' ),
144
- 'save' => esc_html__( 'Saving Configuration...', 'woo-feed' ),
145
- 'sftp_checking' => esc_html__( 'Wait! Checking Extensions ...', 'woo-feed' ),
146
- 'sftp_warning' => esc_html__( 'Warning! Enable PHP ssh2 extension to use SFTP. Contact your server administrator.', 'woo-feed' ),
147
- 'sftp_available' => esc_html__( 'SFTP Available!', 'woo-feed' ),
 
 
148
  ),
149
  'ajax' => [
150
  'url' => admin_url( 'admin-ajax.php' ),
@@ -156,9 +163,9 @@ class Woo_Feed_Admin {
156
  wp_enqueue_script( $this->woo_feed );
157
 
158
  if ( 'woo-feed_page_webappick-feed-pro-vs-free' === $hook ) {
159
- wp_register_script( 'jquery-slick', plugin_dir_url( __FILE__ ) . 'js/slick.js', array( 'jquery' ), $this->version, false );
160
- wp_register_script( 'feed-pro', plugin_dir_url( __FILE__ ) . 'js/woo-feed-admin-pro.js', [ $this->woo_feed, 'jquery-slick' ], $this->version, false );
161
- wp_enqueue_script( 'feed-pro' );
162
  }
163
  }
164
  }
66
  * class.
67
  */
68
  $mainDeps = array();
69
+ $ext = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '.css' : '.min.css';
70
  if ( false !== strpos( $hook, 'webappick' ) && false !== strpos( $hook, 'feed' ) ) {
71
+ wp_register_style( 'selectize', plugin_dir_url( __FILE__ ) . 'css/selectize' . $ext, array(), $this->version );
72
+ wp_enqueue_style( 'fancy-select', plugin_dir_url( __FILE__ ) . 'css/fancy-select' . $ext, array(), $this->version );
73
+ wp_register_style( 'slick', plugin_dir_url( __FILE__ ) . 'css/slick' . $ext, array(), $this->version );
74
+ wp_register_style( 'slick-theme', plugin_dir_url( __FILE__ ) . 'css/slick-theme' . $ext, array(), $this->version );
75
+ $mainDeps = array( 'selectize', 'fancy-select', 'list-tables', 'edit' );
76
  if ( 'woo-feed_page_webappick-feed-pro-vs-free' == $hook ) {
77
  $mainDeps = array_merge( $mainDeps, array( 'slick', 'slick-theme' ) );
78
  }
79
  }
80
+ wp_register_style( $this->woo_feed, plugin_dir_url( __FILE__ ) . 'css/woo-feed-admin' . $ext, $mainDeps, $this->version, 'all' );
81
+ wp_register_style( $this->woo_feed . '-pro', plugin_dir_url( __FILE__ ) . 'css/woo-feed-admin-pro' . $ext, [ $this->woo_feed ], $this->version, 'all' );
82
  wp_enqueue_style( $this->woo_feed );
83
+ wp_enqueue_style( $this->woo_feed . '-pro' );
84
  }
85
 
86
  /**
102
  * between the defined hooks and the functions defined in this
103
  * class.
104
  */
105
+ $ext = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '.js' : '.min.js';
 
106
  if ( false !== strpos( $hook, 'webappick' ) && false !== strpos( $hook, 'feed' ) ) {
107
  wp_register_script( 'jquery-selectize', plugin_dir_url( __FILE__ ) . 'js/selectize.min.js', array( 'jquery' ), $this->version, false );
108
+ wp_register_script( 'fancy-select', plugin_dir_url( __FILE__ ) . 'js/fancy-select' . $ext, array( 'jquery' ), $this->version, false );
109
  wp_register_script( 'jquery-validate', plugin_dir_url( __FILE__ ) . 'js/jquery.validate.min.js', array( 'jquery' ), $this->version, false );
110
  wp_register_script( 'jquery-validate-additional-methods', plugin_dir_url( __FILE__ ) . 'js/additional-methods.min.js', array( 'jquery', 'jquery-validate' ), $this->version, false );
111
+ wp_register_script( 'jquery-sortable', plugin_dir_url( __FILE__ ) . 'js/jquery-sortable' . $ext, array( 'jquery' ), $this->version, false );
112
 
113
  if ( ! wp_script_is( 'clipboard', 'registered' ) ) {
114
  wp_register_script( 'clipboard', plugin_dir_url( __FILE__ ) . 'js/clipboard.min.js', [], '2.0.4', false );
128
  'tags-box',
129
  // 'underscore', 'word-count', 'jquery-ui-autocomplete',
130
  'jquery-touch-punch',
131
+ 'fancy-select',
132
  ];
133
 
134
+ wp_register_script( $this->woo_feed, plugin_dir_url( __FILE__ ) . 'js/woo-feed-admin' . $ext, $feedScriptDependency, $this->version, false );
135
  wp_localize_script(
136
  $this->woo_feed,
137
  'wpf_ajax_obj',
144
  'regenerate' => esc_html__( 'Generating...', 'woo-feed' ),
145
  'learn_more' => esc_html__( 'Learn More..', 'woo-feed' ),
146
  'form' => array(
147
+ 'select_category' => esc_attr__( 'Select A Category', 'woo-feed' ),
148
+ 'loading_tmpl' => esc_html__( 'Loading Template...', 'woo-feed' ),
149
+ 'generate' => esc_html__( 'Delivering Configuration...', 'woo-feed' ),
150
+ 'save' => esc_html__( 'Saving Configuration...', 'woo-feed' ),
151
+ 'sftp_checking' => esc_html__( 'Wait! Checking Extensions ...', 'woo-feed' ),
152
+ 'sftp_warning' => esc_html__( 'Warning! Enable PHP ssh2 extension to use SFTP. Contact your server administrator.', 'woo-feed' ),
153
+ 'sftp_available' => esc_html__( 'SFTP Available!', 'woo-feed' ),
154
+ 'one_item_required' => esc_html__( 'Please add one or more items to continue.', 'woo-feed' ),
155
  ),
156
  'ajax' => [
157
  'url' => admin_url( 'admin-ajax.php' ),
163
  wp_enqueue_script( $this->woo_feed );
164
 
165
  if ( 'woo-feed_page_webappick-feed-pro-vs-free' === $hook ) {
166
+ wp_register_script( 'jquery-slick', plugin_dir_url( __FILE__ ) . 'js/slick' . $ext, array( 'jquery' ), $this->version, false );
167
+ wp_register_script( $this->woo_feed . '-pro', plugin_dir_url( __FILE__ ) . 'js/woo-feed-admin-pro' . $ext, [ $this->woo_feed, 'jquery-slick' ], $this->version, false );
168
+ wp_enqueue_script( $this->woo_feed . '-pro' );
169
  }
170
  }
171
  }
admin/css/fancy-select.css ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**!
2
+ * WooFeed Fancy Select
3
+ * @version 1.0.0
4
+ * @copyright 2020 Webappick
5
+ * @author Kudratullah <mhamudul.hk@gmail.com>
6
+ */
7
+ .fancy-picker, .fancy-picker * {
8
+ box-sizing: border-box;
9
+ cursor: default;
10
+ user-select: none;
11
+ }
12
+
13
+ .fancy-picker {
14
+ position: relative;
15
+ display: block;
16
+ width: 100%;
17
+ height: 30px;
18
+ margin: 0 !important;
19
+ padding: 0 !important;
20
+ }
21
+
22
+ .fancy-picker-picked {
23
+ width: 100%;
24
+ height: 100%;
25
+ overflow: hidden;
26
+ display: block;
27
+ position: relative;
28
+ border: 1px solid #7e8993;
29
+ border-radius: 4px;
30
+ padding: 3.5px 0;
31
+ box-shadow: 0 0 4px -1px rgba(0, 0, 0, 0.45);
32
+ }
33
+ .fancy-picker-placeholder:empty,
34
+ .fancy-picker-count:empty {
35
+ display: none;
36
+ }
37
+ .fancy-picker-placeholder, .fancy-picker-data {
38
+ position: relative;
39
+ display: block;
40
+ width: calc( 100% - 25px );
41
+ float: left;
42
+ font-weight: 500;
43
+ padding: 1px 5px;
44
+ overflow: hidden;
45
+ text-overflow: ellipsis;
46
+ white-space: pre;
47
+ }
48
+ .fancy-picker-placeholder,
49
+ .fancy-picker-data > span {
50
+ display: inline;
51
+ top: -1px;
52
+ position: relative;
53
+ }
54
+
55
+ .fancy-picker-count:not(:empty) {
56
+ position: absolute;
57
+ display: block;
58
+ top: 50%;
59
+ transform: translateY(-50%);
60
+ right: 21px;
61
+ color: #ffffff;
62
+ background: #23282d;
63
+ z-index: 1;
64
+ padding: 1px 3px;
65
+ font-size: 12px;
66
+ line-height: normal;
67
+ border-radius: 5px;
68
+ opacity: 0.7;
69
+ }
70
+ .fancy-picker-option {
71
+ font-weight: 500;
72
+ width: 100%;
73
+ display: block;
74
+ float: left;
75
+ cursor: default;
76
+ padding: 2px 8px;
77
+ transition: background 300ms linear;
78
+ }
79
+
80
+ .fancy-picker-option.selected {
81
+ color: #000;
82
+ background: #acf;
83
+ font-weight: 700;
84
+ }
85
+ .fancy-picker-option.disabled {
86
+ color: #464646;
87
+ background: #e8e8e8;
88
+ font-weight: 700;
89
+ cursor: not-allowed;
90
+ }
91
+ .fancy-picker-option:not(.disabled):hover {
92
+ background: #00a1ff;
93
+ color: #FFF;
94
+ font-weight: 600;
95
+ }
96
+ .fancy-picker-option.disabled:hover,
97
+ .fancy-picker-option.selected:hover {
98
+ font-weight: 700;
99
+ }
100
+
101
+ .fancy-picker-ui {
102
+ position: absolute;
103
+ display: none;
104
+ background: #FFF;
105
+ z-index: 999;
106
+ border: 1px solid #7e8993;
107
+ top: 36px;
108
+ padding: 0;
109
+ margin: 0;
110
+ box-shadow: 0 0 10px -1px rgba(0, 0, 0, 0.96);
111
+ }
112
+
113
+ .fancy-picker.active .fancy-picker-ui {
114
+ display: block;
115
+ }
116
+
117
+ .fancy-picker-content {
118
+ overflow-y: auto;
119
+ overflow-x: hidden;
120
+ max-height: 200px;
121
+ width: 100%;
122
+ -webkit-overflow-scrolling: touch;
123
+ padding: 0;
124
+ background: #FFF;
125
+ }
126
+
127
+ .fancy-picker-ui:before {
128
+ content: "";
129
+ position: absolute;
130
+ width: 10px;
131
+ height: 10px;
132
+ border-top: 1px solid #4f555a;
133
+ border-left: 1px solid #4f555a;
134
+ top: -6px;
135
+ left: 10px;
136
+ transform: rotate(45deg);
137
+ z-index: -1;background: #4f555a;
138
+ }
139
+
140
+ .fancy-picker.active .fancy-picker-picked {
141
+ box-shadow: 0 0 3px -1px rgba(0, 0, 0, 0.45),
142
+ inset 0 0 4px -1px rgba(0, 0, 0, 0.27);
143
+ }
144
+
145
+ .fancy-picker-picked:after {
146
+ content: "";
147
+ display: block;
148
+ position: absolute;
149
+ width: 0;
150
+ height: 0;
151
+ float: right;
152
+ background: transparent;
153
+ border-style: solid;
154
+ border-color: #7e8993 transparent;
155
+ border-width: 7px 5px 0 5px;
156
+ top: 50%;
157
+ transform: translateY(-50%) rotate(0deg);
158
+ right: 5px;
159
+ transition: all 350ms linear;
160
+ cursor: pointer;
161
+ }
162
+
163
+ .fancy-picker-picked:before {
164
+ position: relative;
165
+ display: block;
166
+ content: "";
167
+ width: 5px;
168
+ height: 15px;
169
+ padding: 1px 0;
170
+ background: transparent;
171
+ border-left-width: 4px;
172
+ border-left-color: #7e8993;
173
+ border-left-style: dotted;
174
+ float: left;
175
+ left: 5px;
176
+ top: 2px;
177
+ transition: all 350ms linear;
178
+ }
179
+ .fancy-picker.active .fancy-picker-picked:after {
180
+ border-color: #31363a transparent;
181
+ transform:translateY(-50%) rotate3d(1, 0, 0, 180deg);
182
+ }
183
+
184
+ .fancy-picker.active .fancy-picker-picked:before,
185
+ .fancy-picker:hover .fancy-picker-picked:before {
186
+ border-left-color: #31363a;
187
+ }
admin/css/fancy-select.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .fancy-picker,.fancy-picker *{box-sizing:border-box;cursor:default;user-select:none}.fancy-picker{position:relative;display:block;width:100%;height:30px;margin:0!important;padding:0!important}.fancy-picker-picked{width:100%;height:100%;overflow:hidden;display:block;position:relative;border:1px solid #7e8993;border-radius:4px;padding:3.5px 0;box-shadow:0 0 4px -1px rgba(0,0,0,0.45)}.fancy-picker-placeholder:empty,.fancy-picker-count:empty{display:none}.fancy-picker-placeholder,.fancy-picker-data{position:relative;display:block;width:calc(100% - 25px);float:left;font-weight:500;padding:1px 5px;overflow:hidden;text-overflow:ellipsis;white-space:pre}.fancy-picker-placeholder,.fancy-picker-data > span{display:inline;top:-1px;position:relative}.fancy-picker-count:not(:empty){position:absolute;display:block;top:50%;transform:translateY(-50%);right:21px;color:#fff;background:#23282d;z-index:1;padding:1px 3px;font-size:12px;line-height:normal;border-radius:5px;opacity:.7}.fancy-picker-option{font-weight:500;width:100%;display:block;float:left;cursor:default;padding:2px 8px;transition:background 300ms linear}.fancy-picker-option.selected{color:#000;background:#acf;font-weight:700}.fancy-picker-option.disabled{color:#464646;background:#e8e8e8;font-weight:700;cursor:not-allowed}.fancy-picker-option:not(.disabled):hover{background:#00a1ff;color:#FFF;font-weight:600}.fancy-picker-option.disabled:hover,.fancy-picker-option.selected:hover{font-weight:700}.fancy-picker-ui{position:absolute;display:none;background:#FFF;z-index:999;border:1px solid #7e8993;top:36px;padding:0;margin:0;box-shadow:0 0 10px -1px rgba(0,0,0,0.96)}.fancy-picker.active .fancy-picker-ui{display:block}.fancy-picker-content{overflow-y:auto;overflow-x:hidden;max-height:200px;width:100%;-webkit-overflow-scrolling:touch;padding:0;background:#FFF}.fancy-picker-ui:before{content:"";position:absolute;width:10px;height:10px;border-top:1px solid #4f555a;border-left:1px solid #4f555a;top:-6px;left:10px;transform:rotate(45deg);z-index:-1;background:#4f555a}.fancy-picker.active .fancy-picker-picked{box-shadow:0 0 3px -1px rgba(0,0,0,0.45),inset 0 0 4px -1px rgba(0,0,0,0.27)}.fancy-picker-picked:after{content:"";display:block;position:absolute;width:0;height:0;float:right;background:transparent;border-style:solid;border-color:#7e8993 transparent;border-width:7px 5px 0;top:50%;transform:translateY(-50%) rotate(0deg);right:5px;transition:all 350ms linear;cursor:pointer}.fancy-picker-picked:before{position:relative;display:block;content:"";width:5px;height:15px;padding:1px 0;background:transparent;border-left-width:4px;border-left-color:#7e8993;border-left-style:dotted;float:left;left:5px;top:2px;transition:all 350ms linear}.fancy-picker.active .fancy-picker-picked:after{border-color:#31363a transparent;transform:translateY(-50%) rotate3d(1,0,0,180deg)}.fancy-picker.active .fancy-picker-picked:before,.fancy-picker:hover .fancy-picker-picked:before{border-left-color:#31363a}
admin/css/selectize.css CHANGED
@@ -1,4 +1,3 @@
1
-
2
  /**
3
  * selectize.css (v0.12.6)
4
  * Copyright (c) 2013–2015 Brian Reavis & contributors
 
1
  /**
2
  * selectize.css (v0.12.6)
3
  * Copyright (c) 2013–2015 Brian Reavis & contributors
admin/css/selectize.min.css ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * selectize.css (v0.12.6)
3
+ * Copyright (c) 2013–2015 Brian Reavis & contributors
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6
+ * file except in compliance with the License. You may obtain a copy of the License at:
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under
10
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ * ANY KIND, either express or implied. See the License for the specific language
12
+ * governing permissions and limitations under the License.
13
+ *
14
+ * @author Brian Reavis <brian@thirdroute.com>
15
+ */
16
+ .selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder{visibility:visible!important;background:#f2f2f2!important;background:rgba(0,0,0,0.06)!important;border:0 none!important;-webkit-box-shadow:inset 0 0 12px 4px #fff;box-shadow:inset 0 0 12px 4px #fff}.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after{content:'!';visibility:hidden}.selectize-control.plugin-drag_drop .ui-sortable-helper{-webkit-box-shadow:0 2px 5px rgba(0,0,0,0.2);box-shadow:0 2px 5px rgba(0,0,0,0.2)}.selectize-dropdown-header{position:relative;padding:5px 8px;border-bottom:1px solid #d0d0d0;background:#f8f8f8;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-dropdown-header-close{position:absolute;right:8px;top:50%;color:#303030;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px!important}.selectize-dropdown-header-close:hover{color:#000}.selectize-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.selectize-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.selectize-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.selectize-control.plugin-remove_button [data-value]{position:relative;padding-right:24px!important}.selectize-control.plugin-remove_button [data-value] .remove{z-index:1;position:absolute;top:0;right:0;bottom:0;width:17px;text-align:center;font-weight:700;font-size:12px;color:inherit;text-decoration:none;vertical-align:middle;display:inline-block;padding:2px 0 0;border-left:1px solid #d0d0d0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.selectize-control.plugin-remove_button [data-value] .remove:hover{background:rgba(0,0,0,0.05)}.selectize-control.plugin-remove_button [data-value].active .remove{border-left-color:#cacaca}.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover{background:none}.selectize-control.plugin-remove_button .disabled [data-value] .remove{border-left-color:#fff}.selectize-control.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.selectize-control{position:relative}.selectize-dropdown,.selectize-input,.selectize-input input{color:#303030;font-family:inherit;font-size:13px;line-height:18px;-webkit-font-smoothing:inherit}.selectize-input,.selectize-control.single .selectize-input.input-active{background:#fff;cursor:text;display:inline-block}.selectize-input{border:1px solid #d0d0d0;padding:8px;display:inline-block;width:100%;overflow:hidden;position:relative;z-index:1;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.1);box-shadow:inset 0 1px 1px rgba(0,0,0,0.1);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.selectize-control.multi .selectize-input.has-items{padding:6px 8px 3px}.selectize-input.full{background-color:#fff}.selectize-input.disabled,.selectize-input.disabled *{cursor:default!important}.selectize-input.focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.15)}.selectize-input.dropdown-active{-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-input > *{vertical-align:baseline;display:-moz-inline-stack;display:inline-block;zoom:1;*display:inline}.selectize-control.multi .selectize-input > div{cursor:pointer;margin:0 3px 3px 0;padding:2px 6px;background:#f2f2f2;color:#303030;border:0 solid #d0d0d0}.selectize-control.multi .selectize-input > div.active{background:#e8e8e8;color:#303030;border:0 solid #cacaca}.selectize-control.multi .selectize-input.disabled > div,.selectize-control.multi .selectize-input.disabled > div.active{color:#7d7d7d;background:#fff;border:0 solid #fff}.selectize-input > input{display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0 2px 0 0 !important;text-indent:0!important;border:0 none!important;background:none!important;line-height:inherit!important;-webkit-user-select:auto!important;-webkit-box-shadow:none!important;box-shadow:none!important}.selectize-input > input::-ms-clear{display:none}.selectize-input > input:focus{outline:none!important}.selectize-input::after{content:' ';display:block;clear:left}.selectize-input.dropdown-active::before{content:' ';display:block;position:absolute;background:#f0f0f0;height:1px;bottom:0;left:0;right:0}.selectize-dropdown{position:absolute;z-index:10;border:1px solid #d0d0d0;background:#fff;margin:-1px 0 0;border-top:0 none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1);-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.selectize-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.selectize-dropdown [data-selectable] .highlight{background:rgba(125,168,208,0.2);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.selectize-dropdown .option,.selectize-dropdown .optgroup-header{padding:5px 8px}.selectize-dropdown .option,.selectize-dropdown [data-disabled],.selectize-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.selectize-dropdown [data-selectable].option{opacity:1}.selectize-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.selectize-dropdown .optgroup-header{color:#303030;background:#fff;cursor:default}.selectize-dropdown .active{background-color:#f5fafd;color:#495c68}.selectize-dropdown .active.create{color:#495c68}.selectize-dropdown .create{color:rgba(48,48,48,0.5)}.selectize-dropdown-content{overflow-y:auto;overflow-x:hidden;max-height:200px;-webkit-overflow-scrolling:touch}.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.single .selectize-input:after{content:' ';display:block;position:absolute;top:50%;right:15px;margin-top:-3px;width:0;height:0;border-style:solid;border-width:5px 5px 0;border-color:gray transparent transparent}.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px;border-color:transparent transparent gray}.selectize-control.rtl.single .selectize-input:after{left:15px;right:auto}.selectize-control.rtl .selectize-input > input{margin:0 4px 0 -2px !important}.selectize-control .selectize-input.disabled{opacity:.5;background-color:#fafafa}
admin/css/slick-theme.min.css ADDED
@@ -0,0 +1 @@
 
1
+ @charset "UTF-8";.slick-loading .slick-list{background:#fff url(../images/ajax-loader.gif) center center no-repeat}@font-face{font-family:'slick';font-weight:400;font-style:normal;src:url(../fonts/slick.eot);src:url(../fonts/slick.eot?#iefix) format("embedded-opentype"),url(../fonts/slick.woff) format("woff"),url(../fonts/slick.ttf) format("truetype"),url(../fonts/slick.svg#slick) format("svg")}.slick-prev,.slick-next{font-size:0;line-height:0;position:absolute;top:50%;display:block;width:20px;height:20px;padding:0;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%);cursor:pointer;color:transparent;border:none;outline:none;background:transparent}.slick-prev:hover,.slick-prev:focus,.slick-next:hover,.slick-next:focus{color:transparent;outline:none;background:transparent}.slick-prev:hover:before,.slick-prev:focus:before,.slick-next:hover:before,.slick-next:focus:before{opacity:1}.slick-prev.slick-disabled:before,.slick-next.slick-disabled:before{opacity:.25}.slick-prev:before,.slick-next:before{font-family:'slick';font-size:20px;line-height:1;opacity:.75;color:#fff;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-prev{left:-25px}[dir='rtl'] .slick-prev{right:-25px;left:auto}.slick-prev:before{content:'←'}[dir='rtl'] .slick-prev:before{content:'→'}.slick-next{right:-25px}[dir='rtl'] .slick-next{right:auto;left:-25px}.slick-next:before{content:'→'}[dir='rtl'] .slick-next:before{content:'←'}.slick-dotted.slick-slider{margin-bottom:30px}.slick-dots{position:absolute;bottom:-25px;display:block;width:100%;padding:0;margin:0;list-style:none;text-align:center}.slick-dots li{position:relative;display:inline-block;width:20px;height:20px;margin:0 5px;padding:0;cursor:pointer}.slick-dots li button{font-size:0;line-height:0;display:block;width:20px;height:20px;padding:5px;cursor:pointer;color:transparent;border:0;outline:none;background:transparent}.slick-dots li button:hover,.slick-dots li button:focus{outline:none}.slick-dots li button:hover:before,.slick-dots li button:focus:before{opacity:1}.slick-dots li button:before{font-family:'slick';font-size:6px;line-height:20px;position:absolute;top:0;left:0;width:20px;height:20px;content:'•';text-align:center;opacity:.25;color:#000;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-dots li.slick-active button:before{opacity:.75;color:#000}
admin/css/slick.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .slick-slider{position:relative;display:block;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-khtml-user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.slick-list{position:relative;display:block;overflow:hidden;margin:0;padding:0}.slick-list:focus{outline:none}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-track,.slick-slider .slick-list{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slick-track{position:relative;top:0;left:0;display:block;margin-left:auto;margin-right:auto}.slick-track:before,.slick-track:after{display:table;content:''}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{display:none;float:left;height:100%;min-height:1px}[dir='rtl'] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.slick-arrow.slick-hidden{display:none}
admin/css/woo-feed-admin-pro.css ADDED
@@ -0,0 +1,742 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ table.wf-info-table th a,
2
+ table.wf-rate-table th strong {
3
+ font-weight: bold;
4
+ }
5
+
6
+ table.wf-info-table th a,
7
+ table.wf-rate-table a {
8
+ color: #0073aa;
9
+ }
10
+
11
+ table.wf-info-table th a.get-woo-feed-pro {
12
+ display: inline-block;
13
+ text-decoration: none;
14
+ background: #f3f5f6;
15
+ color: #ff3355;
16
+ vertical-align: top;
17
+ font-size: 14px;
18
+ line-height: 3.14285714;
19
+ box-sizing: border-box;
20
+ margin: 0;
21
+ border-radius: 35px;
22
+ box-shadow: 1px 2px 10px 1px rgba(255, 51, 85, 0.5);
23
+ }
24
+
25
+ table.wf-info-table th a.get-woo-feed-pro img {
26
+ display: block;
27
+ position: relative;
28
+ margin: -2px;
29
+ width: 180px;
30
+ height: auto;
31
+ }
32
+
33
+ table.wf-info-table th a.button {
34
+ border-color: #0073aa;
35
+ border-radius: 35px;
36
+ }
37
+
38
+ table.wf-info-table th a.documentation {
39
+ color: #0073aa;
40
+ }
41
+
42
+ table.wf-info-table th a.tutorial {
43
+ color: #ee264a;
44
+ }
45
+
46
+ table.wf-info-table th a.support {
47
+ color: #0DD41E;
48
+ }
49
+
50
+ /**
51
+ * Premium Page Design
52
+ */
53
+ .wp-submenu li span.woo-feed-premium {
54
+ font-weight: bold;
55
+ color: #28e499;
56
+ }
57
+
58
+ .wp-submenu li:hover span.woo-feed-premium,
59
+ .wp-submenu li.current span.woo-feed-premium {
60
+ color: #1dc381;
61
+ }
62
+
63
+ .woo_feed_free_manage_attribute {
64
+ margin: 0 auto;
65
+ width: 100%;
66
+ }
67
+
68
+ .woo_feed_screenshort {
69
+ max-width: 100%;
70
+ width: 1000px;
71
+ border: 3px solid #00b9eb;
72
+ display: block;
73
+ margin: 0 auto;
74
+ }
75
+
76
+ .woo-feed-screen-shot-title {
77
+ font-size: 36px;
78
+ text-align: center;
79
+ box-sizing: content-box;
80
+ color: #00b9eb;
81
+ }
82
+
83
+ .woo_feed_screen {
84
+ background: #fff;
85
+ padding: 25px 20px;
86
+ margin-bottom: 20px;
87
+ }
88
+
89
+ .woo_feed_screen_des {
90
+ text-align: center;
91
+ margin: 20px 50px 20px 50px;
92
+ font-size: 16px;
93
+ color: #666;
94
+ }
95
+
96
+ .woo_feed_screen_des_2 {
97
+ text-align: center;
98
+ margin: 20px 50px 5px 50px;
99
+ font-size: 14px;
100
+ color: #32373c;
101
+ }
102
+
103
+
104
+ .wapk-admin .wapk-feed-upgrade {
105
+ font-family: 'Open Sans', sans-serif;
106
+ margin: -10px -20px 0 -22px;
107
+ }
108
+
109
+ .wapk-admin .wapk-feed-upgrade a {
110
+ transition: all 0.2s ease;
111
+ }
112
+
113
+ .wapk-admin .section-title {
114
+ text-align: center;
115
+ font-size: 30px;
116
+ line-height: 1.5em;
117
+ font-weight: 400;
118
+ position: relative;
119
+ margin: 0 0 58px;
120
+ }
121
+
122
+ .wapk-admin .section-title:after {
123
+ content: '';
124
+ position: absolute;
125
+ bottom: -21px;
126
+ left: 50%;
127
+ transform: translateX(-50%);
128
+ width: 38px;
129
+ height: 5px;
130
+ border-radius: 3px;
131
+ background-color: #00D4D4;
132
+ }
133
+
134
+ .wapk-admin .section-title .section-sub-title {
135
+ font-size: 22px;
136
+ font-weight: 300;
137
+ }
138
+
139
+ .wapk-admin .wapk-banner {
140
+ background-color: #f2f2f2;
141
+ font-size: 16px;
142
+ display: flex;
143
+ align-items: center;
144
+ padding: 50px 8%;
145
+ border-bottom: 1px solid #eee;
146
+ }
147
+
148
+ .wapk-admin .wapk-banner .wapk-banner__graphics {
149
+ width: 100%;
150
+ }
151
+
152
+ .wapk-admin .wapk-banner .wapk-banner__content h1 {
153
+ font-size: 27px;
154
+ line-height: 1.5em;
155
+ }
156
+
157
+ .wapk-admin .wapk-banner .wapk-banner__content p {
158
+ font-size: 16px;
159
+ line-height: 1.5em;
160
+ font-weight: 300;
161
+ margin: 0;
162
+ /*noinspection CssFloatPxLength*/
163
+ letter-spacing: 0.5px;
164
+ }
165
+
166
+ .wapk-admin .feed-features,
167
+ .wapk-admin .wapk-testimonial,
168
+ .wapk-admin .feed-pricing {
169
+ text-align: center;
170
+ padding: 75px 30px 85px;
171
+ background-color: #f7f8f9;
172
+ }
173
+
174
+ .wapk-admin .feed-features .feed-feature__list {
175
+ display: flex;
176
+ flex-wrap: wrap;
177
+ align-items: flex-start;
178
+ justify-content: center;
179
+ }
180
+
181
+ .wapk-admin .feed-features .feed-features__more {
182
+ margin-top: 25px;
183
+ }
184
+
185
+ .feed-feature__item {
186
+ flex: 0 0 28.9%;
187
+ margin: 0 2.2% 4.4% 2.2%;
188
+ text-align: center;
189
+ border-radius: 5px;
190
+ background-color: #ffffff;
191
+ transition: all 100ms linear;
192
+ overflow: hidden;
193
+ }
194
+
195
+ .feed-feature__item:hover {
196
+ box-shadow: 5px 4px 32px -16px rgba(0, 0, 0, 0.63);
197
+ }
198
+
199
+ .feed-feature__thumb {
200
+ overflow: hidden;
201
+ }
202
+
203
+ .feed-feature__item .feed-feature__thumb img {
204
+ border-radius: 5px 5px 0 0;
205
+ max-width: 100%;
206
+ width: 100%;
207
+ -webkit-transition: all 100ms linear;
208
+ -moz-transition: all 100ms linear;
209
+ -ms-transition: all 100ms linear;
210
+ -o-transition: all 100ms linear;
211
+ transition: all 100ms linear;
212
+ }
213
+
214
+ .feed-feature__item:hover .feed-feature__thumb img {
215
+ transform: scale(1.05);
216
+ }
217
+
218
+ .feed-feature__item .feed-feature__description {
219
+ padding: 20px 15px 25px;
220
+ }
221
+
222
+ .feed-feature__item .feed-feature__description h3 {
223
+ font-size: 15px;
224
+ line-height: 1.5em;
225
+ font-weight: 300;
226
+ margin: 0;
227
+ }
228
+
229
+ .wapk-admin .feed-pro-comparison {
230
+ background-color: #f1f1f1;
231
+ padding: 75px;
232
+ }
233
+
234
+ .wapk-admin .feed-features .section-title h2,
235
+ .wapk-admin .wapk-testimonial .section-title h2,
236
+ .wapk-admin .feed-pro-comparison .section-title h2,
237
+ .wapk-admin .feed-pricing .section-title h2 {
238
+ margin-top: 0;
239
+ margin-bottom: 0;
240
+ }
241
+
242
+ .wapk-admin .comparison-table {
243
+ display: flex;
244
+ justify-content: space-between;
245
+ }
246
+
247
+ .wapk-admin .comparison-table .comparison {
248
+ flex: 0 0 48%;
249
+ background-color: #fff;
250
+ border: 1px solid #e0e9ec;
251
+ border-radius: 5px;
252
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .05);
253
+ padding: 50px;
254
+ box-sizing: border-box;
255
+ }
256
+
257
+ .wapk-admin .comparison .product-header {
258
+ margin-bottom: 58px;
259
+ position: relative;
260
+ }
261
+
262
+ .wapk-admin .comparison .product-header:after {
263
+ content: "";
264
+ position: absolute;
265
+ bottom: -23px;
266
+ left: 0;
267
+ width: 38px;
268
+ height: 5px;
269
+ border-radius: 3px;
270
+ background-color: #d7d7d7;
271
+ }
272
+
273
+ .wapk-admin .comparison .product-header img {
274
+ max-width: 160px;
275
+ width: 100%;
276
+ }
277
+
278
+ .wapk-admin .comparison .product-features {
279
+ margin: 0;
280
+ }
281
+
282
+ .wapk-admin .comparison li {
283
+ position: relative;
284
+ display: flex;
285
+ margin-bottom: 15px;
286
+ padding-left: 30px;
287
+ font-size: 14px;
288
+ line-height: 1.3em;
289
+ font-weight: 300;
290
+ align-items: center;
291
+ }
292
+
293
+ .wapk-admin .comparison li.unavailable {
294
+ color: #CED2D6;
295
+ }
296
+
297
+ .wapk-admin .comparison li span.dashicons {
298
+ position: absolute;
299
+ top: 1px;
300
+ left: 6px;
301
+ width: 18px;
302
+ height: 18px;
303
+ border-radius: 100%;
304
+ background: #00D4D4;
305
+ color: #FFF;
306
+ line-height: 22px;
307
+ font-size: 14px;
308
+ text-align: center;
309
+ }
310
+
311
+ .wapk-admin .comparison li.unavailable {
312
+ color: #CED2D6;
313
+ }
314
+
315
+ .wapk-admin .comparison li.unavailable span.dashicons {
316
+ background: #CED2D6;
317
+ }
318
+
319
+ .wapk-admin .comparison li span.dashicons-no {
320
+ font-size: 12px;
321
+ }
322
+
323
+ .wapk-admin .comparison li span.dashicons-no:before {
324
+ left: 0;
325
+ }
326
+
327
+ .wapk-admin .comparison li span.dashicons:before {
328
+ position: relative;
329
+ left: -0.5px;
330
+ top: -2px;
331
+ }
332
+
333
+ .wapk-admin .comparison li img {
334
+ width: 18px;
335
+ margin-right: 12px;
336
+ }
337
+
338
+ .wapk-admin .feed-pricing {
339
+ }
340
+
341
+ .wapk-pricing__table {
342
+ width: 100%;
343
+ display: -webkit-box;
344
+ display: -webkit-flex;
345
+ display: -ms-flexbox;
346
+ display: flex;
347
+ -webkit-flex-wrap: wrap;
348
+ -ms-flex-wrap: wrap;
349
+ flex-wrap: wrap;
350
+ -webkit-align-content: flex-start;
351
+ -ms-flex-line-pack: start;
352
+ align-content: flex-start;
353
+ justify-content: center;
354
+ }
355
+
356
+ .wapk-pricing__table__item {
357
+ position: relative;
358
+ flex: 0 0 23%;
359
+ }
360
+
361
+ .wapk-price__table__wrapper {
362
+ position: relative;
363
+ padding: 10px;
364
+ }
365
+
366
+ .wapk-price__table {
367
+ text-align: center;
368
+ display: block;
369
+ width: 100%;
370
+ padding: 10px;
371
+ background-color: #fff;
372
+ border-radius: 8px 8px 8px 8px;
373
+ box-shadow: 0 0 25px 0 rgba(0, 0, 0, .1);
374
+ overflow: hidden;
375
+ -webkit-transition: background .3s, border .3s, -webkit-border-radius .3s, -webkit-box-shadow .3s;
376
+ transition: background .3s, border .3s, -webkit-border-radius .3s, -webkit-box-shadow .3s;
377
+ -o-transition: background .3s, border .3s, border-radius .3s, box-shadow .3s;
378
+ transition: background .3s, border .3s, border-radius .3s, box-shadow .3s;
379
+ transition: background .3s, border .3s, border-radius .3s, box-shadow .3s, -webkit-border-radius .3s, -webkit-box-shadow .3s;
380
+ }
381
+
382
+ .wapk-price__table__header {
383
+ background-color: #fff;
384
+ padding: 40px 0 0;
385
+ }
386
+
387
+ .wapk-price__table__heading {
388
+ color: #6d7882;
389
+ font-size: 17px;
390
+ font-weight: 500;
391
+ text-transform: uppercase;
392
+ letter-spacing: 10px;
393
+ font-family: sans-serif;
394
+ margin: 0;
395
+ padding: 0;
396
+ line-height: 1.2;
397
+ }
398
+
399
+ .wapk-price__table__price {
400
+ font-family: sans-serif;
401
+ font-weight: 600;
402
+ padding: 30px 0 10px;
403
+ display: -webkit-box;
404
+ display: -ms-flexbox;
405
+ display: flex;
406
+ -webkit-box-pack: center;
407
+ -ms-flex-pack: center;
408
+ justify-content: center;
409
+ -webkit-box-align: center;
410
+ -ms-flex-align: center;
411
+ align-items: center;
412
+ -ms-flex-wrap: wrap;
413
+ flex-wrap: wrap;
414
+ -webkit-box-orient: horizontal;
415
+ -webkit-box-direction: normal;
416
+ -ms-flex-direction: row;
417
+ flex-direction: row;
418
+ color: #434363;
419
+ font-size: 45px;
420
+ }
421
+
422
+ .wapk-price__table__amount {
423
+ }
424
+
425
+ .wapk-price__table__currency {
426
+ align-self: flex-start;
427
+ color: #434363;
428
+ line-height: 1;
429
+ font-size: .3em;
430
+ margin-right: 3px;
431
+ }
432
+
433
+ .wapk-price__table__amount .free,
434
+ .wapk-price__table__amount .integer-part {
435
+ color: #434363;
436
+ line-height: .8;
437
+ }
438
+
439
+ .wapk-price__table__amount .decimal-part {
440
+ font-size: 14px;
441
+ font-weight: 400;
442
+ }
443
+
444
+ .wapk-price__table__amount .period {
445
+ font-size: 14px;
446
+ font-weight: 400;
447
+ }
448
+
449
+ .wapk-price__table__amount___legend {
450
+ width: 100%;
451
+ color: #FF4B4B;
452
+ font-size: 18px;
453
+ font-weight: 500;
454
+ line-height: 2.5em;
455
+ }
456
+
457
+ .wapk-price__table__features {
458
+ list-style-type: none;
459
+ margin: 0;
460
+ padding: 0;
461
+ line-height: 1;
462
+ color: #697279;
463
+ text-align: left;
464
+ }
465
+
466
+ .wapk-price__table__features li.item {
467
+ list-style-type: none;
468
+ margin: 0;
469
+ padding: 0;
470
+ font-size: 13px;
471
+ line-height: 1.5em;
472
+ }
473
+
474
+ .wapk-price__table__features li:not(:first-child):before {
475
+ content: "";
476
+ display: block;
477
+ /* border: 0 solid hsla(0,0%,48%,.3); */
478
+ margin: 10px 12.5%;
479
+ }
480
+
481
+ .wapk-price__table__feature {
482
+ display: block;
483
+ margin-left: calc(((100% - 80%) / 2) + 20px);
484
+ margin-right: calc((100% - 80%) / 2);
485
+ }
486
+
487
+ span.wapk-price__table__feature span.dashicons {
488
+ margin-left: -20px;
489
+ top: 2px;
490
+ position: relative;
491
+ }
492
+
493
+ .wapk-price__table__footer {
494
+ padding: 40px 0;
495
+ }
496
+
497
+ .wapk-price__table__footer a {
498
+ font-size: 14px;
499
+ text-transform: uppercase;
500
+ letter-spacing: 3px;
501
+ border-radius: 100px 100px 100px 100px;
502
+ padding: 16px 42px;
503
+ transition: all 250ms;
504
+ }
505
+
506
+ .wapk-price__table__footer a:hover,
507
+ .wapk-price__table__footer a:focus,
508
+ .wapk-price__table__footer a:active {
509
+ transform: scale(1.02) !important;
510
+ }
511
+
512
+ .wapk-price__table__ribbon {
513
+ pointer-events: none;
514
+ touch-action: none;
515
+ -webkit-user-select: none;
516
+ -moz-user-select: none;
517
+ -ms-user-select: none;
518
+ user-select: none;
519
+ position: absolute;
520
+ top: 10px;
521
+ left: auto;
522
+ right: 10px;
523
+ -webkit-transform: rotate(90deg);
524
+ -ms-transform: rotate(90deg);
525
+ transform: rotate(90deg);
526
+ width: 150px;
527
+ overflow: hidden;
528
+ height: 150px;
529
+ }
530
+
531
+ .wapk-price__table__ribbon__inner {
532
+ background: #FF4B4B;
533
+ font-family: sans-serif;
534
+ font-weight: 500;
535
+ color: #fff;
536
+ font-size: 11px;
537
+ /*noinspection CssFloatPxLength*/
538
+ letter-spacing: 1.1px;
539
+ box-shadow: 0 0 30px 0 rgba(0, 0, 0, .21);
540
+ text-align: center;
541
+ left: 0;
542
+ width: 200%;
543
+ -webkit-transform: translateY(-50%) translateX(-50%) translateX(35px) rotate(-45deg);
544
+ -ms-transform: translateY(-50%) translateX(-50%) translateX(35px) rotate(-45deg);
545
+ transform: translateY(-50%) translateX(-50%) translateX(35px) rotate(-45deg);
546
+ margin-top: 35px;
547
+ line-height: 2;
548
+ text-transform: uppercase;
549
+ }
550
+
551
+ .wapk-admin .wapk-payment {
552
+ display: flex;
553
+ background: #fff;
554
+ justify-content: space-between;
555
+ padding: 85px 65px 85px;
556
+ align-items: center;
557
+ }
558
+
559
+ .wapk-payment .payment-guarantee {
560
+ display: flex;
561
+ flex: 0 0 63%;
562
+ align-content: center;
563
+ align-items: center;
564
+ position: relative;
565
+ }
566
+
567
+ .wapk-payment .payment-guarantee:after {
568
+ content: "";
569
+ position: absolute;
570
+ right: -18px;
571
+ top: 50%;
572
+ transform: translateY(-50%);
573
+ width: 5px;
574
+ height: 38px;
575
+ border-radius: 3px;
576
+ background: #00D4D4;
577
+ }
578
+
579
+ .wapk-payment .payment-guarantee .guarantee-seal img {
580
+ max-width: 100%;
581
+ width: 280px;
582
+ }
583
+
584
+ .wapk-payment .payment-guarantee .guarantee-detail {
585
+ padding-left: 25px;
586
+ }
587
+
588
+ .wapk-payment .payment-guarantee .guarantee-detail h2 {
589
+ font-size: 24px;
590
+ line-height: 1.5em;
591
+ font-weight: 400;
592
+ margin: 0;
593
+ }
594
+
595
+ .wapk-payment .payment-guarantee .guarantee-detail p {
596
+ font-size: 15px;
597
+ line-height: 1.5em;
598
+ font-weight: 300;
599
+ margin: 5px 0 20px;
600
+ }
601
+
602
+ .wapk-payment .payment-guarantee .guarantee-detail a {
603
+ color: #00D4D4;
604
+ font-size: 15px;
605
+ line-height: 1.5em;
606
+ text-decoration: none;
607
+ }
608
+
609
+ .wapk-payment .payment-guarantee .guarantee-detail a span.dashicons,
610
+ .wapk-payment .payment-guarantee .guarantee-detail a img {
611
+ width: 18px;
612
+ margin-right: 4px;
613
+ margin-top: 1px;
614
+ }
615
+
616
+ .wapk-payment .payment-options {
617
+ flex-grow: 0.5;
618
+ }
619
+
620
+ .wapk-payment .payment-options h3 {
621
+ font-size: 15px;
622
+ font-weight: 300;
623
+ margin: 0 0 17px;
624
+ }
625
+
626
+ .wapk-payment .payment-options .options {
627
+ }
628
+
629
+ .wapk-payment .payment-options .options h4 {
630
+ color: #CED2D6;
631
+ }
632
+
633
+ .wapk-payment .payment-options .options li {
634
+ float: left;
635
+ overflow: hidden;
636
+ }
637
+
638
+ .wapk-payment .payment-options .options li img {
639
+ height: 20px;
640
+ margin-right: 5px;
641
+ }
642
+
643
+ /** Testimonial **/
644
+ .wapk-admin .wapk-testimonials {
645
+ }
646
+
647
+ .wapk-admin .wapk-testimonial-wrapper:before {
648
+ content: '';
649
+ position: absolute;
650
+ left: 79px;
651
+ top: -15px;
652
+ width: 80px;
653
+ height: 56px;
654
+ border-radius: 3px;
655
+ background: transparent url(../images/block-quote.svg) no-repeat;
656
+ background-size: cover;
657
+ }
658
+
659
+ .wapk-admin .wapk-testimonial-wrapper {
660
+ position: relative;
661
+ display: block;
662
+ width: 80%;
663
+ margin: 0 auto;
664
+ padding: 0;
665
+ text-align: center;
666
+ }
667
+
668
+ .testimonial-item__user .avatar {
669
+ width: 100px;
670
+ height: 100px;
671
+ margin: 0 auto;
672
+ border-radius: 100%;
673
+ border: 3px solid #efefef;
674
+ overflow: hidden;
675
+ }
676
+
677
+ .testimonial-item {
678
+ margin-bottom: 25px;
679
+ }
680
+
681
+ .testimonial-item__user .avatar img {
682
+ max-width: 100%;
683
+ width: 100%;
684
+ margin: 0 auto;
685
+ padding: 0;
686
+ display: block;
687
+ }
688
+
689
+ .testimonial-item__comment {
690
+ position: relative;
691
+ display: block;
692
+ width: 70%;
693
+ margin: 0 auto 30px;
694
+ }
695
+
696
+ .testimonial-item__user h4.author-name {
697
+ font-size: 25px;
698
+ font-weight: 300;
699
+ margin: 10px auto;
700
+ }
701
+
702
+ .testimonial-item__user span.author-meta {
703
+ font-size: 16px;
704
+ font-weight: 300;
705
+ }
706
+
707
+ @media screen and (min-width: 1281px) {
708
+ .wapk-admin .wapk-banner,
709
+ .wapk-admin .feed-features {
710
+ padding-left: 20%;
711
+ padding-right: 20%;
712
+ }
713
+
714
+ .wapk-admin .wapk-payment {
715
+ padding-left: 15%;
716
+ padding-right: 15%;
717
+ }
718
+
719
+ .wapk-admin .feed-pro-comparison {
720
+ padding-left: 21.2%;
721
+ padding-right: 21.2%;
722
+ }
723
+
724
+ .wapk-admin .wapk-testimonial-wrapper {
725
+ width: 55%;
726
+ }
727
+ }
728
+
729
+ .wapk-feed-pro-upgrade .wapk-feed-cta,
730
+ .wapk-feed-docs .wapk-feed-cta,
731
+ .wapk-admin .feed-pro-comparison,
732
+ .wapk-admin .wapk-payment,
733
+ .wapk-admin .feed-features,
734
+ .wapk-admin .wapk-testimonial,
735
+ .wapk-admin .wapk-feed-banner {
736
+ margin: 0;
737
+ }
738
+
739
+ .wapk-feed-banner .wapk-banner {
740
+ margin: 0;
741
+ padding: 0;
742
+ }
admin/css/woo-feed-admin-pro.min.css ADDED
@@ -0,0 +1 @@
 
1
+ table.wf-info-table th a,table.wf-rate-table th strong{font-weight:700}table.wf-info-table th a,table.wf-rate-table a{color:#0073aa}table.wf-info-table th a.get-woo-feed-pro{display:inline-block;text-decoration:none;background:#f3f5f6;color:#f35;vertical-align:top;font-size:14px;line-height:3.14285714;box-sizing:border-box;margin:0;border-radius:35px;box-shadow:1px 2px 10px 1px rgba(255,51,85,0.5)}table.wf-info-table th a.get-woo-feed-pro img{display:block;position:relative;margin:-2px;width:180px;height:auto}table.wf-info-table th a.button{border-color:#0073aa;border-radius:35px}table.wf-info-table th a.documentation{color:#0073aa}table.wf-info-table th a.tutorial{color:#ee264a}table.wf-info-table th a.support{color:#0DD41E}.wp-submenu li span.woo-feed-premium{font-weight:700;color:#28e499}.wp-submenu li:hover span.woo-feed-premium,.wp-submenu li.current span.woo-feed-premium{color:#1dc381}.woo_feed_free_manage_attribute{margin:0 auto;width:100%}.woo_feed_screenshort{max-width:100%;width:1000px;border:3px solid #00b9eb;display:block;margin:0 auto}.woo-feed-screen-shot-title{font-size:36px;text-align:center;box-sizing:content-box;color:#00b9eb}.woo_feed_screen{background:#fff;padding:25px 20px;margin-bottom:20px}.woo_feed_screen_des{text-align:center;margin:20px 50px;font-size:16px;color:#666}.woo_feed_screen_des_2{text-align:center;margin:20px 50px 5px;font-size:14px;color:#32373c}.wapk-admin .wapk-feed-upgrade{font-family:'Open Sans',sans-serif;margin:-10px -20px 0 -22px}.wapk-admin .wapk-feed-upgrade a{transition:all .2s ease}.wapk-admin .section-title{text-align:center;font-size:30px;line-height:1.5em;font-weight:400;position:relative;margin:0 0 58px}.wapk-admin .section-title:after{content:'';position:absolute;bottom:-21px;left:50%;transform:translateX(-50%);width:38px;height:5px;border-radius:3px;background-color:#00D4D4}.wapk-admin .section-title .section-sub-title{font-size:22px;font-weight:300}.wapk-admin .wapk-banner{background-color:#f2f2f2;font-size:16px;display:flex;align-items:center;padding:50px 8%;border-bottom:1px solid #eee}.wapk-admin .wapk-banner .wapk-banner__graphics{width:100%}.wapk-admin .wapk-banner .wapk-banner__content h1{font-size:27px;line-height:1.5em}.wapk-admin .wapk-banner .wapk-banner__content p{font-size:16px;line-height:1.5em;font-weight:300;margin:0;letter-spacing:.5px}.wapk-admin .feed-features,.wapk-admin .wapk-testimonial,.wapk-admin .feed-pricing{text-align:center;padding:75px 30px 85px;background-color:#f7f8f9}.wapk-admin .feed-features .feed-feature__list{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:center}.wapk-admin .feed-features .feed-features__more{margin-top:25px}.feed-feature__item{flex:0 0 28.9%;margin:0 2.2% 4.4%;text-align:center;border-radius:5px;background-color:#fff;transition:all 100ms linear;overflow:hidden}.feed-feature__item:hover{box-shadow:5px 4px 32px -16px rgba(0,0,0,0.63)}.feed-feature__thumb{overflow:hidden}.feed-feature__item .feed-feature__thumb img{border-radius:5px 5px 0 0;max-width:100%;width:100%;-webkit-transition:all 100ms linear;-moz-transition:all 100ms linear;-ms-transition:all 100ms linear;-o-transition:all 100ms linear;transition:all 100ms linear}.feed-feature__item:hover .feed-feature__thumb img{transform:scale(1.05)}.feed-feature__item .feed-feature__description{padding:20px 15px 25px}.feed-feature__item .feed-feature__description h3{font-size:15px;line-height:1.5em;font-weight:300;margin:0}.wapk-admin .feed-pro-comparison{background-color:#f1f1f1;padding:75px}.wapk-admin .feed-features .section-title h2,.wapk-admin .wapk-testimonial .section-title h2,.wapk-admin .feed-pro-comparison .section-title h2,.wapk-admin .feed-pricing .section-title h2{margin-top:0;margin-bottom:0}.wapk-admin .comparison-table{display:flex;justify-content:space-between}.wapk-admin .comparison-table .comparison{flex:0 0 48%;background-color:#fff;border:1px solid #e0e9ec;border-radius:5px;box-shadow:0 1px 2px 0 rgba(0,0,0,.05);padding:50px;box-sizing:border-box}.wapk-admin .comparison .product-header{margin-bottom:58px;position:relative}.wapk-admin .comparison .product-header:after{content:"";position:absolute;bottom:-23px;left:0;width:38px;height:5px;border-radius:3px;background-color:#d7d7d7}.wapk-admin .comparison .product-header img{max-width:160px;width:100%}.wapk-admin .comparison .product-features{margin:0}.wapk-admin .comparison li{position:relative;display:flex;margin-bottom:15px;padding-left:30px;font-size:14px;line-height:1.3em;font-weight:300;align-items:center}.wapk-admin .comparison li.unavailable{color:#CED2D6}.wapk-admin .comparison li span.dashicons{position:absolute;top:1px;left:6px;width:18px;height:18px;border-radius:100%;background:#00D4D4;color:#FFF;line-height:22px;font-size:14px;text-align:center}.wapk-admin .comparison li.unavailable{color:#CED2D6}.wapk-admin .comparison li.unavailable span.dashicons{background:#CED2D6}.wapk-admin .comparison li span.dashicons-no{font-size:12px}.wapk-admin .comparison li span.dashicons-no:before{left:0}.wapk-admin .comparison li span.dashicons:before{position:relative;left:-.5px;top:-2px}.wapk-admin .comparison li img{width:18px;margin-right:12px}.wapk-pricing__table{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;justify-content:center}.wapk-pricing__table__item{position:relative;flex:0 0 23%}.wapk-price__table__wrapper{position:relative;padding:10px}.wapk-price__table{text-align:center;display:block;width:100%;padding:10px;background-color:#fff;border-radius:8px 8px 8px 8px;box-shadow:0 0 25px 0 rgba(0,0,0,.1);overflow:hidden;-webkit-transition:background .3s,border .3s,-webkit-border-radius .3s,-webkit-box-shadow .3s;transition:background .3s,border .3s,-webkit-border-radius .3s,-webkit-box-shadow .3s;-o-transition:background .3s,border .3s,border-radius .3s,box-shadow .3s;transition:background .3s,border .3s,border-radius .3s,box-shadow .3s;transition:background .3s,border .3s,border-radius .3s,box-shadow .3s,-webkit-border-radius .3s,-webkit-box-shadow .3s}.wapk-price__table__header{background-color:#fff;padding:40px 0 0}.wapk-price__table__heading{color:#6d7882;font-size:17px;font-weight:500;text-transform:uppercase;letter-spacing:10px;font-family:sans-serif;margin:0;padding:0;line-height:1.2}.wapk-price__table__price{font-family:sans-serif;font-weight:600;padding:30px 0 10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;color:#434363;font-size:45px}.wapk-price__table__currency{align-self:flex-start;color:#434363;line-height:1;font-size:.3em;margin-right:3px}.wapk-price__table__amount .free,.wapk-price__table__amount .integer-part{color:#434363;line-height:.8}.wapk-price__table__amount .decimal-part{font-size:14px;font-weight:400}.wapk-price__table__amount .period{font-size:14px;font-weight:400}.wapk-price__table__amount___legend{width:100%;color:#FF4B4B;font-size:18px;font-weight:500;line-height:2.5em}.wapk-price__table__features{list-style-type:none;margin:0;padding:0;line-height:1;color:#697279;text-align:left}.wapk-price__table__features li.item{list-style-type:none;margin:0;padding:0;font-size:13px;line-height:1.5em}.wapk-price__table__features li:not(:first-child):before{content:"";display:block;margin:10px 12.5%}.wapk-price__table__feature{display:block;margin-left:calc(((100% - 80%) / 2) + 20px);margin-right:calc((100% - 80%) / 2)}span.wapk-price__table__feature span.dashicons{margin-left:-20px;top:2px;position:relative}.wapk-price__table__footer{padding:40px 0}.wapk-price__table__footer a{font-size:14px;text-transform:uppercase;letter-spacing:3px;border-radius:100px 100px 100px 100px;padding:16px 42px;transition:all 250ms}.wapk-price__table__footer a:hover,.wapk-price__table__footer a:focus,.wapk-price__table__footer a:active{transform:scale(1.02)!important}.wapk-price__table__ribbon{pointer-events:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;top:10px;left:auto;right:10px;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);width:150px;overflow:hidden;height:150px}.wapk-price__table__ribbon__inner{background:#FF4B4B;font-family:sans-serif;font-weight:500;color:#fff;font-size:11px;letter-spacing:1.1px;box-shadow:0 0 30px 0 rgba(0,0,0,.21);text-align:center;left:0;width:200%;-webkit-transform:translateY(-50%) translateX(-50%) translateX(35px) rotate(-45deg);-ms-transform:translateY(-50%) translateX(-50%) translateX(35px) rotate(-45deg);transform:translateY(-50%) translateX(-50%) translateX(35px) rotate(-45deg);margin-top:35px;line-height:2;text-transform:uppercase}.wapk-admin .wapk-payment{display:flex;background:#fff;justify-content:space-between;padding:85px 65px;align-items:center}.wapk-payment .payment-guarantee{display:flex;flex:0 0 63%;align-content:center;align-items:center;position:relative}.wapk-payment .payment-guarantee:after{content:"";position:absolute;right:-18px;top:50%;transform:translateY(-50%);width:5px;height:38px;border-radius:3px;background:#00D4D4}.wapk-payment .payment-guarantee .guarantee-seal img{max-width:100%;width:280px}.wapk-payment .payment-guarantee .guarantee-detail{padding-left:25px}.wapk-payment .payment-guarantee .guarantee-detail h2{font-size:24px;line-height:1.5em;font-weight:400;margin:0}.wapk-payment .payment-guarantee .guarantee-detail p{font-size:15px;line-height:1.5em;font-weight:300;margin:5px 0 20px}.wapk-payment .payment-guarantee .guarantee-detail a{color:#00D4D4;font-size:15px;line-height:1.5em;text-decoration:none}.wapk-payment .payment-guarantee .guarantee-detail a span.dashicons,.wapk-payment .payment-guarantee .guarantee-detail a img{width:18px;margin-right:4px;margin-top:1px}.wapk-payment .payment-options{flex-grow:.5}.wapk-payment .payment-options h3{font-size:15px;font-weight:300;margin:0 0 17px}.wapk-payment .payment-options .options h4{color:#CED2D6}.wapk-payment .payment-options .options li{float:left;overflow:hidden}.wapk-payment .payment-options .options li img{height:20px;margin-right:5px}.wapk-admin .wapk-testimonial-wrapper:before{content:'';position:absolute;left:79px;top:-15px;width:80px;height:56px;border-radius:3px;background:transparent url(../images/block-quote.svg) no-repeat;background-size:cover}.wapk-admin .wapk-testimonial-wrapper{position:relative;display:block;width:80%;margin:0 auto;padding:0;text-align:center}.testimonial-item__user .avatar{width:100px;height:100px;margin:0 auto;border-radius:100%;border:3px solid #efefef;overflow:hidden}.testimonial-item{margin-bottom:25px}.testimonial-item__user .avatar img{max-width:100%;width:100%;margin:0 auto;padding:0;display:block}.testimonial-item__comment{position:relative;display:block;width:70%;margin:0 auto 30px}.testimonial-item__user h4.author-name{font-size:25px;font-weight:300;margin:10px auto}.testimonial-item__user span.author-meta{font-size:16px;font-weight:300}@media screen and (min-width: 1281px){.wapk-admin .wapk-banner,.wapk-admin .feed-features{padding-left:20%;padding-right:20%}.wapk-admin .wapk-payment{padding-left:15%;padding-right:15%}.wapk-admin .feed-pro-comparison{padding-left:21.2%;padding-right:21.2%}.wapk-admin .wapk-testimonial-wrapper{width:55%}}.wapk-feed-pro-upgrade .wapk-feed-cta,.wapk-feed-docs .wapk-feed-cta,.wapk-admin .feed-pro-comparison,.wapk-admin .wapk-payment,.wapk-admin .feed-features,.wapk-admin .wapk-testimonial,.wapk-admin .wapk-feed-banner{margin:0}.wapk-feed-banner .wapk-banner{margin:0;padding:0}
admin/css/woo-feed-admin.css CHANGED
@@ -6,14 +6,17 @@
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);
@@ -24,6 +27,7 @@
24
  transform: rotate(359deg);
25
  }
26
  }
 
27
  @keyframes spin {
28
  0% {
29
  -webkit-transform: rotate(0deg);
@@ -34,6 +38,7 @@
34
  transform: rotate(359deg);
35
  }
36
  }
 
37
  /*noinspection SpellCheckingInspection */
38
  .wfbtn {
39
  background: #3498db;
@@ -55,17 +60,19 @@
55
  border: solid #2b698f 3px;
56
  text-decoration: none;
57
  }
 
58
  /*noinspection SpellCheckingInspection */
59
  .wftooltip {
60
- display:none;
61
- position:absolute;
62
- border:1px solid #333;
63
- background-color:#161616;
64
- border-radius:5px;
65
- padding:10px;
66
- color:#fff;
67
- font-size:12px;
68
  }
 
69
  /*noinspection SpellCheckingInspection */
70
  .wfbtn:hover {
71
  background: #3cb0fd;
@@ -77,7 +84,7 @@
77
  text-decoration: none;
78
  }
79
 
80
- .makeFeedResponse{
81
  width: 70%;
82
  color: green;
83
  }
@@ -94,6 +101,10 @@
94
  width: 200px;
95
  }
96
 
 
 
 
 
97
  .error {
98
  color: red;
99
  }
@@ -106,6 +117,7 @@
106
  #wf_newRow {
107
  margin-left: 0;
108
  }
 
109
  /*noinspection SpellCheckingInspection */
110
  .mtable tbody tr {
111
  height: 25px;
@@ -114,42 +126,52 @@
114
  align-items: baseline;
115
  font-weight: bold;
116
  }
 
117
  /*noinspection SpellCheckingInspection */
118
  .mtable th:nth-child(1) {
119
  width: 17px;
120
  }
 
121
  /*noinspection SpellCheckingInspection */
122
  .mtable th:nth-child(2) {
123
  width: 160px;
124
  }
 
125
  /*noinspection SpellCheckingInspection */
126
  .mtable th:nth-child(3) {
127
  width: 100px;
128
  }
 
129
  /*noinspection SpellCheckingInspection */
130
  .mtable th:nth-child(4) {
131
  width: 100px;
132
  }
 
133
  /*noinspection SpellCheckingInspection */
134
  .mtable th:nth-child(5) {
135
  width: 150px;
136
  }
 
137
  /*noinspection SpellCheckingInspection */
138
  .mtable th:nth-child(6) {
139
  width: 100px;
140
  }
 
141
  /*noinspection SpellCheckingInspection */
142
  .mtable th:nth-child(7) {
143
  width: 150px;
144
  }
 
145
  /*noinspection SpellCheckingInspection */
146
  .mtable th:nth-child(8) {
147
  width: 90px;
148
  }
 
149
  /*noinspection SpellCheckingInspection */
150
  .mtable th:nth-child(9) {
151
  width: 29px;
152
  }
 
153
  /*noinspection SpellCheckingInspection */
154
  .wp-admin select.wf_mattributes, .wf_mattributes {
155
  width: 150px;
@@ -160,6 +182,7 @@
160
  div#wf-tab-content1 select:not([name^="output_type"]), div#wf-tab-content1 input {
161
  width: 100%;
162
  }
 
163
  div#wf-tab-content1 .dashicons {
164
  vertical-align: middle;
165
  }
@@ -168,6 +191,7 @@ div#wf-tab-content1 .dashicons {
168
  width: 150px;
169
  left: 0
170
  }
 
171
  .wf_compare {
172
  max-width: 245px;
173
  left: 0
@@ -177,23 +201,30 @@ div#wf-tab-content1 .dashicons {
177
  width: 100px;
178
  left: 0
179
  }
 
180
  /*noinspection SpellCheckingInspection */
181
  .wf_sortedtable {
182
  cursor: move;
183
  }
184
 
 
 
 
 
185
  .sorted_table .dragged {
186
  position: absolute;
187
  opacity: 0.8;
188
  z-index: 9999;
189
  background: #fff;
190
- height: 48px;
 
191
  }
192
 
193
  .sorted_table tbody tr.placeholder td {
194
  border: 1px dashed #2cc185;
195
- height: 28px;
196
  }
 
197
  /*noinspection SpellCheckingInspection */
198
  .mtable2 tbody tr {
199
  height: 25px;
@@ -202,37 +233,45 @@ div#wf-tab-content1 .dashicons {
202
  align-items: baseline;
203
  font-weight: bold;
204
  }
 
205
  /*noinspection SpellCheckingInspection */
206
  .mtable2 th:nth-child(1) {
207
  width: 30px;
208
  }
 
209
  /*noinspection SpellCheckingInspection */
210
  .mtable2 th:nth-child(2) {
211
  width: 150px;
212
  }
 
213
  /*noinspection SpellCheckingInspection */
214
  .mtable2 th:nth-child(3) {
215
  width: 230px;
216
  }
 
217
  /*noinspection SpellCheckingInspection */
218
  .mtable2 th:nth-child(4) {
219
  width: 220px;
220
  }
 
221
  /*noinspection SpellCheckingInspection */
222
  .mtable2 th:nth-child(7) {
223
  width: 50px;
224
  }
 
225
  /*noinspection SpellCheckingInspection */
226
  .mtable2 th:nth-child(8) {
227
  width: 50px;
228
  }
 
229
  /*noinspection SpellCheckingInspection */
230
  .mtable2 th:nth-child(9) {
231
  width: 29px;
232
  }
 
233
  /*noinspection SpellCheckingInspection */
234
- .wfnoempty{
235
- width:120px;
236
  }
237
 
238
  /*==================Tab Design=======================*/
@@ -263,11 +302,10 @@ p {
263
  border: 2px solid #CCC;
264
  }
265
 
266
- .wf_tabs input[type="radio"] {
267
  position: absolute;
268
- top:auto;
269
  left: -9999px;
270
- /*overflow: hidden;*/
271
  }
272
 
273
  .wf-tab-name {
@@ -297,7 +335,6 @@ p {
297
  .wf_tabs .wf-tab-content {
298
  z-index: 2;
299
  display: none;
300
- overflow: hidden;
301
  width: 100%;
302
  font-size: 0.9rem;
303
  position: absolute;
@@ -310,115 +347,145 @@ p {
310
  display: block;
311
  }
312
 
313
- .wf_tabs [id^="tab"]:checked ~ [id^="wf-tab-content"] { display: block; }
314
- [id^="wf-tab-content"] { margin-bottom: 40px; }
 
 
 
 
 
 
 
 
 
315
 
316
- div#wf-tab-content2 table:first-child { padding: 10px 0; }
317
- div#wf-tab-content2 table:first-child td:nth-child(1) { width: 260px; }
318
- div#wf-tab-content2 table:first-child td:nth-child(2) { width: 260px; }
319
 
320
  table.feed-actions tr td:last-child {
321
  text-align: right;
322
  }
323
 
324
- .webappick_selector{
325
- background: #0073aa !important;
326
- color: #f1f1f1 !important;
327
- font-weight: bold !important;
328
- border-color:#0073aa !important ;
329
  }
330
- /*noinspection SpellCheckingInspection */
331
- .selectize-input.full #googleTaxonomyId-selectized { opacity: 0; position: absolute; left: -10000px; }
332
- /*noinspection SpellCheckingInspection */
333
- .selectize-dropdown [data-selectable].option { cursor: default; }
334
- /*noinspection SpellCheckingInspection */
335
- .selectize-control.plugin-remove_button [data-value] .remove{
336
- border-left: 1px solid #0073aa !important;
337
  }
338
 
 
 
 
 
339
 
340
- /* list table style */
341
- /*noinspection SpellCheckingInspection */
342
- .widefat td.column-url, .widefat th.column-url,
343
- .column-url { color: #008779; font-weight: bold; }
344
 
345
- /* Selectize */
346
- select.selectize { display: none; }
347
- body.no-js select.selectize { display: block !important; } /* fallback combat */
348
- .selectize-dropdown .active { background-color: #edf9ff; }
349
  .wapk-selectize-item {
350
  background: #0073aa !important;
351
  color: #f1f1f1 !important;
352
  font-weight: bold !important;
353
- border-color:#0073aa !important ;
 
 
 
 
 
 
 
 
 
 
 
 
354
  }
355
- .selectize-input.full #googleTaxonomyId-selectized { opacity: 0; position: absolute; left: -10000px; }
356
- .selectize-dropdown [data-selectable].option { cursor: default; }
357
- .selectize-control.plugin-remove_button [data-value] .remove{
358
  border-left: 1px solid #f1f1f1 !important;
359
  }
360
 
 
 
 
 
 
 
 
 
 
 
361
  /* Feed active and inactive button CSS */
362
- .wf_status_wrap label{
363
- width:50px;
364
- height:25px;
365
- box-sizing:border-box;
366
- border :1px solid;
367
- float:left;
368
- border-radius:100px;
369
- position:relative;
370
- cursor:pointer;
371
- transition:.3s ease;
372
- }
373
- input[class=woo_feed_status_input]:checked + label{
374
- background:#55e868;
375
- }
376
- input[class=woo_feed_status_input]:checked + label:before{
377
- left:25px;
378
- }
379
- .wf_status_wrap label:before{
380
- transition:.3s ease;
381
- content:'';
382
- width:20px;
383
- height:20px;
384
- position:absolute;
385
- background:white;
386
- left:2px;
387
- top:2px;
388
- box-sizing:border-box;
389
- border:1px solid;
390
- color:black;
391
- border-radius:100px;
 
 
 
392
  }
 
393
  /* list table style */
394
  /*noinspection SpellCheckingInspection */
395
  .widefat td.column-url, .widefat th.column-url,
396
- .column-url { color: #008779; font-weight: bold; }
 
 
 
397
 
398
  /** Feed Progress **/
399
  .feed-progress-container {
400
- width:100%;
401
  color: white;
402
  text-align: center;
403
  font-weight: 300;
404
  }
405
 
406
  .feed-progress-bar {
407
- width:100%;
408
- background:#eee;
409
- padding:3px;
410
- border-radius:3px;
411
- box-shadow:inset 0 1px 3px rgba(0,0,0,.2);
412
  }
413
 
414
  .feed-progress-bar-fill {
415
- height:20px;
416
- display:block;
417
- background:#3DC264;
418
- width:0;
419
- border-radius:3px;
420
- -webkit-transition:width 0.8s ease;
421
- transition:width 0.8s ease;
422
  }
423
 
424
  .feed-progress-status {
@@ -428,7 +495,7 @@ input[class=woo_feed_status_input]:checked + label:before{
428
  }
429
 
430
  .feed-progress-percentage {
431
- text-align:right;
432
  font-weight: bolder;
433
  color: #41f49d;
434
  font-family: 'Arial Black', sans-serif;
@@ -436,9 +503,10 @@ input[class=woo_feed_status_input]:checked + label:before{
436
  }
437
 
438
  /*noinspection SpellCheckingInspection */
439
- #wpbody-content.woofeed-body-content{
440
- overflow:visible!important;
441
  }
 
442
  /*noinspection SpellCheckingInspection */
443
  .clippy {
444
  position: relative;
@@ -447,10 +515,17 @@ input[class=woo_feed_status_input]:checked + label:before{
447
  margin-left: 3px;
448
  top: 3px;
449
  }
 
450
  /*noinspection SpellCheckingInspection */
451
- .column-url .clippy { display: none; }
 
 
 
452
  /*noinspection SpellCheckingInspection */
453
- .column-url:hover .clippy { display: inline-block; }
 
 
 
454
  /**
455
  * Primer Tooltip
456
  * @TODO use node module
@@ -460,13 +535,14 @@ input[class=woo_feed_status_input]:checked + label:before{
460
  .tooltipped {
461
  position: relative
462
  }
 
463
  /*noinspection SpellCheckingInspection */
464
  .tooltipped:after {
465
  position: absolute;
466
  z-index: 1000000;
467
  display: none;
468
  padding: 5px 8px;
469
- font: normal normal 11px/1.5 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";
470
  color: #fff;
471
  text-align: center;
472
  text-decoration: none;
@@ -477,10 +553,11 @@ input[class=woo_feed_status_input]:checked + label:before{
477
  white-space: pre;
478
  pointer-events: none;
479
  content: attr(aria-label);
480
- background: rgba(0,0,0,.8);
481
  border-radius: 3px;
482
  -webkit-font-smoothing: subpixel-antialiased
483
  }
 
484
  /*noinspection SpellCheckingInspection */
485
  .tooltipped:before {
486
  position: absolute;
@@ -488,74 +565,86 @@ input[class=woo_feed_status_input]:checked + label:before{
488
  display: none;
489
  width: 0;
490
  height: 0;
491
- color: rgba(0,0,0,.8);
492
  pointer-events: none;
493
  content: "";
494
  border: 5px solid transparent
495
  }
 
496
  /*noinspection SpellCheckingInspection */
497
- .tooltipped:hover:before,.tooltipped:hover:after,.tooltipped:active:before,.tooltipped:active:after,.tooltipped:focus:before,.tooltipped:focus:after {
498
  display: inline-block;
499
  text-decoration: none
500
  }
 
501
  /*noinspection SpellCheckingInspection */
502
- .tooltipped-multiline:hover:after,.tooltipped-multiline:active:after,.tooltipped-multiline:focus:after {
503
  display: table-cell
504
  }
 
505
  /*noinspection SpellCheckingInspection */
506
- .tooltipped-s:after,.tooltipped-se:after,.tooltipped-sw:after {
507
  top: 100%;
508
  right: 50%;
509
  margin-top: 5px
510
  }
 
511
  /*noinspection SpellCheckingInspection */
512
- .tooltipped-s:before,.tooltipped-se:before,.tooltipped-sw:before {
513
  top: auto;
514
  right: 50%;
515
  bottom: -5px;
516
  margin-right: -5px;
517
- border-bottom-color: rgba(0,0,0,.8)
518
  }
 
519
  /*noinspection SpellCheckingInspection */
520
  .tooltipped-se:after {
521
  right: auto;
522
  left: 50%;
523
  margin-left: -15px
524
  }
 
525
  /*noinspection SpellCheckingInspection */
526
  .tooltipped-sw:after {
527
  margin-right: -15px
528
  }
 
529
  /*noinspection SpellCheckingInspection */
530
- .tooltipped-n:after,.tooltipped-ne:after,.tooltipped-nw:after {
531
  right: 50%;
532
  bottom: 100%;
533
  margin-bottom: 5px
534
  }
 
535
  /*noinspection SpellCheckingInspection */
536
- .tooltipped-n:before,.tooltipped-ne:before,.tooltipped-nw:before {
537
  top: -5px;
538
  right: 50%;
539
  bottom: auto;
540
  margin-right: -5px;
541
- border-top-color: rgba(0,0,0,.8)
542
  }
 
543
  /*noinspection SpellCheckingInspection */
544
  .tooltipped-ne:after {
545
  right: auto;
546
  left: 50%;
547
  margin-left: -15px
548
  }
 
549
  /*noinspection SpellCheckingInspection */
550
  .tooltipped-nw:after {
551
  margin-right: -15px
552
  }
 
553
  /*noinspection SpellCheckingInspection */
554
- .tooltipped-s:after,.tooltipped-n:after {
555
  -webkit-transform: translateX(50%);
556
  -ms-transform: translateX(50%);
557
  transform: translateX(50%)
558
  }
 
559
  /*noinspection SpellCheckingInspection */
560
  .tooltipped-w:after {
561
  right: 100%;
@@ -565,14 +654,16 @@ input[class=woo_feed_status_input]:checked + label:before{
565
  -ms-transform: translateY(50%);
566
  transform: translateY(50%)
567
  }
 
568
  /*noinspection SpellCheckingInspection */
569
  .tooltipped-w:before {
570
  top: 50%;
571
  bottom: 50%;
572
  left: -5px;
573
  margin-top: -5px;
574
- border-left-color: rgba(0,0,0,.8)
575
  }
 
576
  /*noinspection SpellCheckingInspection */
577
  .tooltipped-e:after {
578
  bottom: 50%;
@@ -582,13 +673,14 @@ input[class=woo_feed_status_input]:checked + label:before{
582
  -ms-transform: translateY(50%);
583
  transform: translateY(50%)
584
  }
 
585
  /*noinspection SpellCheckingInspection */
586
  .tooltipped-e:before {
587
  top: 50%;
588
  right: -5px;
589
  bottom: 50%;
590
  margin-top: -5px;
591
- border-right-color: rgba(0,0,0,.8)
592
  }
593
 
594
  /*noinspection SpellCheckingInspection,CssInvalidPropertyValue*/
@@ -602,74 +694,102 @@ input[class=woo_feed_status_input]:checked + label:before{
602
  white-space: pre-line;
603
  border-collapse: separate
604
  }
 
605
  /*noinspection SpellCheckingInspection */
606
- .tooltipped-multiline.tooltipped-s:after,.tooltipped-multiline.tooltipped-n:after {
607
  right: auto;
608
  left: 50%;
609
  -webkit-transform: translateX(-50%);
610
  -ms-transform: translateX(-50%);
611
  transform: translateX(-50%)
612
  }
 
613
  /*noinspection SpellCheckingInspection */
614
- .tooltipped-multiline.tooltipped-w:after,.tooltipped-multiline.tooltipped-e:after {
615
  right: 100%
616
  }
617
- @media screen and (min-width:0\0) {
 
 
618
  /*noinspection SpellCheckingInspection */
619
  .tooltipped-multiline:after {
620
  width: 250px
621
  }
622
  }
 
623
  /*noinspection SpellCheckingInspection */
624
- .tooltipped-sticky:before,.tooltipped-sticky:after {
625
  display: inline-block
626
  }
 
627
  /*noinspection SpellCheckingInspection */
628
  .tooltipped-sticky.tooltipped-multiline:after {
629
  display: table-cell
630
  }
 
631
  /*noinspection SpellCheckingInspection */
632
  .fullscreen-overlay-enabled.dark-theme .tooltipped:after {
633
  color: #000;
634
- background: rgba(255,255,255,.8)
635
  }
 
636
  /*noinspection SpellCheckingInspection */
637
- .fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-s:before,.fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-se:before,.fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-sw:before {
638
- border-bottom-color: rgba(255,255,255,.8)
639
  }
 
640
  /*noinspection SpellCheckingInspection */
641
- .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-n:before,.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-ne:before,.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-nw:before {
642
- border-top-color: rgba(255,255,255,.8)
643
  }
 
644
  /*noinspection SpellCheckingInspection */
645
  .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-e:before {
646
- border-right-color: rgba(255,255,255,.8)
647
  }
 
648
  /*noinspection SpellCheckingInspection */
649
  .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-w:before {
650
- border-left-color: rgba(255,255,255,.8)
651
  }
652
 
653
- ul.tracker_collection_list { list-style: initial; padding: initial; margin: -10px 0 0 30px; font-size: 11px !important; }
654
- ul.tracker_collection_list li { margin: 0; }
 
 
 
 
 
 
 
 
655
 
656
  /** Info Message Table **/
657
  table.wf-info-table th,
658
- table.wf-rate-table th { vertical-align: middle; text-align: center; max-width: 100%; font-weight: 500; }
659
- table.wf-info-table th a,
660
- table.wf-rate-table th strong { font-weight: bold; }
661
- table.wf-info-table th a,
662
- table.wf-rate-table a { color: #0073aa; }
663
- table.wf-info-table th a.get-woo-feed-pro { display: inline-block; text-decoration: none; background: #f3f5f6; color: #ff3355; vertical-align: top; font-size: 14px; line-height: 3.14285714; box-sizing: border-box; margin: 0; border-radius: 35px; box-shadow: 1px 2px 10px 1px rgba(255, 51, 85, 0.5); }
664
- table.wf-info-table th a.get-woo-feed-pro img { display: block; position: relative; margin: -2px; width: 180px; height: auto; }
665
- table.wf-info-table th a.button { border-color: #0073aa; border-radius: 35px; }
666
- table.wf-info-table th a.documentation { color: #0073aa;}
667
- table.wf-info-table th a.tutorial { color: #ee264a; }
668
- table.wf-info-table th a.support { color: #0DD41E; }
 
 
 
 
 
 
 
 
 
669
  table.wf-rate-table a.review-star:after {
 
670
  /*noinspection CssNoGenericFontName*/
671
  font-family: dashicons;
672
- content: "\f155\f155\f155\f155\f155" !important;
673
  font-size: 10px;
674
  font-weight: 100;
675
  text-rendering: auto;
@@ -677,24 +797,8 @@ table.wf-rate-table a.review-star:after {
677
  -moz-osx-font-smoothing: grayscale;
678
  /*content: '★★★★★'; /*&#x2605;&#x2605;&#x2605;&#x2605;&#x2605;*/
679
  /*content: '\2605\2605\2605\2605\2605';*/
680
- color:#0073aa;text-decoration: underline;
681
- }
682
-
683
- /** Admin Notices **/
684
-
685
- .woo-feed-notice[data-which="rating"] [data-response] {
686
- border-width: 2px;
687
- font-weight: 600;
688
- text-transform: capitalize;
689
- }
690
- .woo-feed-notice[data-which="rating"] [data-response="given"] {
691
- background: #FFEB3B;
692
- border-color: #464646;
693
- color: #000000;
694
- }
695
- .woo-feed-notice[data-which="rating"] [data-response="given"]:hover {
696
- background: #f6de09;
697
- border-color: #2e2e2e;
698
  }
699
 
700
  /** Admin Menu Icon **/
@@ -705,6 +809,7 @@ table.wf-rate-table a.review-star:after {
705
  opacity: 0.6;
706
  filter: alpha(opacity=60);
707
  }
 
708
  #adminmenu #toplevel_page_webappick-manage-feeds:hover div.wp-menu-image::before,
709
  #adminmenu #toplevel_page_webappick-manage-feeds.wp-has-current-submenu div.wp-menu-image::before {
710
  opacity: 1;
@@ -717,6 +822,7 @@ table.wf-rate-table a.review-star:after {
717
  -moz-box-sizing: border-box;
718
  box-sizing: border-box;
719
  }
 
720
  .wapk-admin {
721
  position: relative;
722
  display: block;
@@ -727,60 +833,71 @@ table.wf-rate-table a.review-star:after {
727
  /* reset .warp margin to use full width except menu area */
728
  margin: 0 0 0 -10px;
729
  }
 
730
  @media screen and (min-width: 783px) {
731
  .wapk-admin {
732
  margin: 0 0 0 -20px;
733
  }
734
  }
735
- .wapk-admin h1,
736
- .wapk-admin h2,
737
- .wapk-admin h3,
738
- .wapk-admin h4,
739
- .wapk-admin h5,
740
- .wapk-admin h6,
741
  .wapk-admin p {
742
  color: #1B2730;
743
  }
 
 
 
 
 
744
  .wapk-admin sup {
745
  vertical-align: baseline;
746
  position: relative;
747
  top: -6px;
748
  }
 
749
  .wapk-admin sub {
750
  vertical-align: baseline;
751
  position: relative;
752
  top: 4px;
753
  }
 
754
  /* WP.Core.UI Compat */
755
- .wapk-admin .wapk-section [class$=icon32]+h2,
756
  .wapk-admin .wapk-section h1,
757
- .wapk-admin .wapk-section>h2:first-child {
758
  font-size: 23px;
759
  font-weight: 400;
760
  margin: 0;
761
  padding: 9px 0 4px 0;
762
  line-height: 1.3;
763
  }
 
764
  .wapk-admin .wapk-section,
765
- .wapk-admin >.notice {
766
  /* Restore .warp margin */
767
- margin: 15px 20px 0 20px !important;
768
  position: relative;
769
  display: block;
770
  }
 
771
  .clear:after {
772
  content: "";
773
  display: table;
774
  clear: both;
775
  }
 
776
  .wapk-admin span.help {
777
- font-family: inherit;
778
- /*unicode-bidi: embed;*/
 
779
  font-size: 0.9em;
780
  color: #636363;
781
- display: block;
782
- /*background: rgba(0,0,0,.07);*/
783
  }
 
784
  .wapk-admin span.help .dashicons {
785
  width: 11px;
786
  height: 12px;
@@ -790,100 +907,232 @@ table.wf-rate-table a.review-star:after {
790
 
791
  /*.wapk-admin .help a { color: inherit; text-decoration: underline; }*/
792
  /** Extend WP Core UI PostBox For Docs **/
793
- .wapk-feed-docs .postbox { width: 355px; margin-right: 20px; display: inline-block; vertical-align: top; }
 
 
 
 
 
 
794
  @media only screen and (max-width: 850px) {
795
- .wapk-feed-docs .postbox { display: block; width: auto; float: none; margin-right: auto; }
 
 
 
 
 
796
  }
797
- .wapk-feed-docs .postbox .hndle { font-size: 14px; padding: 8px 12px; margin: 0; line-height: 1.4; }
798
- .wapk-feed-docs .postbox .dashicons { color: #ccc }
799
- .wapk-feed-docs .postbox a { text-decoration: none; }
800
- .wapk-feed-docs .postbox .inside,
801
- .wapk-feed-docs .postbox ul { margin-bottom: 0; }
802
- .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; }
803
- .wapk-feed-docs .postbox.closed .toggle-indicator:before { content: "\F140"; }
804
 
805
- .wapk-section #post-body.columns-2 #side-sortables {
806
- min-height: 196px;
 
 
 
 
807
  }
808
- #poststuff #feed_merchant_info .inside { margin: 0; padding: 0; }
809
- #feed_merchant_info ul.data { margin-left: 24px; margin-top: 5px; }
810
- #feed_merchant_info ul.data li { margin-bottom: 5px; }
811
- .merchant-info-section { padding: 6px 10px 8px; }
812
- .generateFeed table th { font-weight: bold; }
813
 
814
- /** Admin Feed Help Docs **/
815
- .wp-submenu li span.woo-feed-docs { font-weight: bold; color: #f18500; }
816
- .wp-submenu li:hover span.woo-feed-docs,
817
- .wp-submenu li.current span.woo-feed-docs { color: #ce7304; }
818
- .wapk-admin .wapk-feed-docs .postbox .hndle { cursor: default; }
819
 
 
 
 
820
 
821
- /** Admin Call-To-Action **/
822
- .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; }
823
- .wapk-cta-icon .dashicons { font-size: 100px; width: 100px; height: auto; margin: 0 10px -8px 0; color: #02658c; }
824
- .wapk-cta-content {width: 50%;}
825
- .wapk-cta-content h2 { font-size: 2em; margin: 0.5em 0; }
826
- .wapk-cta-action {}
827
- .wapk-cta-action a.wapk-button { font-size: 24px; height: auto !important; padding: 10px 20px; }
828
- @media (max-width: 600px) {
829
- .wapk-cta { display: block; text-align: center; padding: 4em 0; }
830
- .wapk-cta-content { width: 100%; margin: 2em 0; }
831
  }
832
 
833
- /** Override .wp-core-ui .button styles with prefix .wapk-admin **/
834
- /* @TODO refactor with scss */
835
- /* Button Skin */
836
- .wapk-button,
837
- .wapk-button-primary,
838
- .wapk-button-secondary {
839
  display: inline-block;
840
- text-decoration: none;
841
- font-size: 13px;
842
- line-height: 2.15384615;
843
- min-height: 30px;
844
- margin: 0;
845
- padding: 0 10px;
846
- cursor: pointer;
847
- border-width: 1px;
848
- border-style: solid;
849
- -webkit-appearance: none;
850
- border-radius: 3px;
851
- white-space: nowrap;
852
- box-sizing: border-box;
853
  }
854
- .wapk-button,
855
- .wapk-button-secondary {
856
- color: #00D4D4;
857
- border-color: #00D4D4;
858
- text-decoration: none;
859
  }
860
- .wapk-button > svg,
861
- .wapk-button-secondary > svg {
862
- width: 15px;
863
- margin-left: 5px;
864
- fill: #00D4D4;
865
  }
866
- .wapk-button > .dashicons,
867
- .wapk-button-secondary > .dashicons {
868
- color: #00D4D4;
 
869
  }
870
- .wapk-button.hover,
871
- .wapk-button:hover,
872
- .wapk-button-secondary:hover,
873
- .wapk-button.focus,
874
- .wapk-button:focus,
875
- .wapk-button-secondary:focus {
876
- border-color: #00bbbb;
877
- color: #00bbbb;
878
  }
879
- .wapk-button.hover > svg,
880
- .wapk-button:hover > svg,
881
- .wapk-button-secondary:hover > svg,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
882
  .wapk-button.focus > svg,
883
  .wapk-button:focus > svg,
884
  .wapk-button-secondary:focus > svg {
885
  fill: #00bbbb;
886
  }
 
887
  .wapk-button.hover > .dashicons,
888
  .wapk-button:hover > .dashicons,
889
  .wapk-button-secondary:hover > .dashicons,
@@ -892,6 +1141,7 @@ table.wf-rate-table a.review-star:after {
892
  .wapk-button-secondary:focus > .dashicons {
893
  color: #00bbbb;
894
  }
 
895
  .wapk-button.focus,
896
  .wapk-button:focus,
897
  .wapk-button-secondary:focus {
@@ -899,20 +1149,24 @@ table.wf-rate-table a.review-star:after {
899
  color: #00bbbb;
900
  box-shadow: 0 0 0 1px #00D4D4;
901
  }
 
902
  .wapk-button.focus > svg,
903
  .wapk-button:focus > svg,
904
  .wapk-button-secondary:focus > svg {
905
  fill: #00bbbb;
906
  }
 
907
  .wapk-button.focus > .dashicons,
908
  .wapk-button:focus > .dashicons,
909
  .wapk-button-secondary:focus > .dashicons {
910
  color: #00bbbb;
911
  }
 
912
  .wapk-button:active {
913
  background: #00bbbb;
914
  border-color: #00bbbb;
915
  }
 
916
  .wapk-button.active,
917
  .wapk-button.active:focus,
918
  .wapk-button.active:hover {
@@ -920,88 +1174,89 @@ table.wf-rate-table a.review-star:after {
920
  color: #00bbbb;
921
  box-shadow: inset 0 2px 5px -3px #00bbbb;
922
  }
 
923
  .wapk-button.active > svg,
924
  .wapk-button.active:focus > svg,
925
  .wapk-button.active:hover > svg {
926
  fill: #00bbbb;
927
  }
 
928
  .wapk-button.active > .dashicons,
929
  .wapk-button.active:focus > .dashicons,
930
  .wapk-button.active:hover > .dashicons {
931
  color: #00bbbb;
932
  }
 
933
  .wapk-button-primary {
934
  background: #00D4D4;
935
  border-color: #00D4D4;
936
  color: #fff;
937
- text-decoration: none;
938
  box-shadow: 0 1px 0 #00bbbb;
939
  text-shadow: 0 -1px 1px #00bbbb, 1px 0 1px #00bbbb, 0 1px 1px #00bbbb, -1px 0 1px #00bbbb;
940
  }
 
941
  .wapk-button-primary > svg {
942
  fill: #fff;
943
  }
944
- .wapk-button-primary:hover,
945
- .wapk-button-primary:focus {
946
  background: #00e3e3;
947
  border-color: #00c5c5;
948
  color: #fff;
949
  }
950
- .wapk-button-primary:hover > svg,
951
- .wapk-button-primary:focus > svg {
952
  fill: #fff;
953
  }
 
954
  .wapk-button-primary:focus {
955
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00D4D4;
956
  }
 
957
  .wapk-button-primary:active {
958
  background: #00bbbb;
959
  border-color: #00bbbb;
960
  color: #fff;
961
  }
 
962
  .wapk-button-primary:active > svg {
963
  fill: #fff;
964
  }
965
- .wapk-button-primary.active,
966
- .wapk-button-primary.active:focus,
967
- .wapk-button-primary.active:hover {
968
  background: #00D4D4;
969
  color: #fff;
970
  border-color: #008888;
971
  box-shadow: inset 0 2px 5px -3px black;
972
  }
973
- .wapk-button-primary.active > svg,
974
- .wapk-button-primary.active:focus > svg,
975
- .wapk-button-primary.active:hover > svg {
976
  fill: #fff;
977
  }
978
- .wapk-button-primary[disabled],
979
- .wapk-button-primary:disabled,
980
- .wapk-button-primary.wapk-button-primary-disabled,
981
- .wapk-button-primary.disabled {
982
  color: #c7d1d1 !important;
983
  background: #22ffff !important;
984
  border-color: #22ffff !important;
985
  text-shadow: none !important;
986
  }
987
- .wapk-button-primary[disabled] > svg,
988
- .wapk-button-primary:disabled > svg,
989
- .wapk-button-primary.wapk-button-primary-disabled > svg,
990
- .wapk-button-primary.disabled > svg {
991
  fill: #c7d1d1 !important;
992
  }
 
993
  .wapk-button.wapk-button-primary.wapk-button-hero {
994
  box-shadow: 0 2px 0 #00bbbb;
995
  }
 
996
  .wapk-button.wapk-button-primary.wapk-button-hero:focus {
997
  box-shadow: 0 2px 0 #00bbbb, 0 1px 0 #00c5c5, 0 0 2px 1px #00eeee;
998
  }
999
- .wapk-button.wapk-button-primary.wapk-button-hero.active,
1000
- .wapk-button.wapk-button-primary.wapk-button-hero.active:hover,
1001
- .wapk-button.wapk-button-primary.wapk-button-hero.active:focus,
1002
- .wapk-button.wapk-button-primary.wapk-button-hero:active {
1003
  box-shadow: inset 0 3px 0 #00a1a1;
1004
  }
 
1005
  .wapk-button-group > .wapk-button.active {
1006
  border-color: #00D4D4;
1007
  }
@@ -1013,6 +1268,7 @@ table.wf-rate-table a.review-star:after {
1013
  line-height: 28px;
1014
  padding: 0 12px 2px;
1015
  }
 
1016
  .wapk-button.wapk-button-hero,
1017
  .wapk-button-group.wapk-button-hero .wapk-button {
1018
  font-size: 18px;
@@ -1023,641 +1279,133 @@ table.wf-rate-table a.review-star:after {
1023
  }
1024
 
1025
  @media screen and (min-width: 782px) {
1026
- th#status { width: 80px; }
1027
- th#provider { width: 80px; }
1028
- th#type { width: 50px; }
1029
- th#option_name { width: 100px; }
1030
- td.option_name.column-option_name >span:first-child { display: none; }
1031
- th#last_updated { width: 90px; }
1032
- th#view { width: 90px; }
1033
- }
1034
- @media screen and (min-width: 960px) {
1035
- th#status, th#provider, th#view { width: 100px; }
1036
- th#type { width: 80px; }
1037
- th#option_name { width: 150px; }
1038
- th#last_updated { width: 140px; }
1039
- }
1040
- @media screen and (max-width: 782px) {
1041
- table.wf-info-table { margin-top: 10px; }
1042
- table.wf-info-table th:first-child img { margin: 0 auto; display: block; }
1043
-
1044
- .wapk-button.wapk-button-xl {
1045
- padding: 6px 14px;
1046
- line-height: normal;
1047
- font-size: 14px;
1048
- vertical-align: middle;
1049
- height: auto;
1050
- margin-bottom: 4px;
1051
  }
1052
- }
1053
-
1054
-
1055
 
 
 
 
1056
 
 
 
 
1057
 
 
 
 
1058
 
 
 
 
1059
 
 
 
 
1060
 
 
 
 
 
1061
 
 
 
 
 
1062
 
 
 
 
1063
 
 
 
 
1064
 
1065
- /**
1066
- * Premium Page Design
1067
- */
1068
- .wp-submenu li span.woo-feed-premium { font-weight: bold; color: #28e499; }
1069
- .wp-submenu li:hover span.woo-feed-premium,
1070
- .wp-submenu li.current span.woo-feed-premium { color: #1dc381; }
1071
- .woo_feed_free_manage_attribute {
1072
- margin: 0 auto;
1073
- width: 100%;
1074
- }
1075
- .woo_feed_screenshort{
1076
- max-width: 100%;
1077
- width: 1000px;
1078
- border: 3px solid #00b9eb;
1079
- display: block;
1080
- margin: 0 auto;
1081
- }
1082
- .woo-feed-screen-shot-title{
1083
- font-size: 36px;
1084
- text-align: center;
1085
- box-sizing: content-box;
1086
- color: #00b9eb;
1087
- }
1088
- .woo_feed_screen {
1089
- background: #fff;
1090
- padding: 25px 20px;
1091
- margin-bottom: 20px;
1092
- }
1093
- .woo_feed_screen_des{
1094
- text-align: center;
1095
- margin: 20px 50px 20px 50px;
1096
- font-size: 16px;
1097
- color: #666;
1098
- }
1099
- .woo_feed_screen_des_2{
1100
- text-align: center;
1101
- margin: 20px 50px 5px 50px;
1102
- font-size: 14px;
1103
- color: #32373c;
1104
  }
1105
 
 
 
 
 
1106
 
1107
- .wapk-admin .wapk-feed-upgrade {
1108
- font-family: 'Open Sans', sans-serif;
1109
- margin: -10px -20px 0 -22px;
1110
- }
1111
- .wapk-admin .wapk-feed-upgrade a {
1112
- transition: all 0.2s ease;
1113
- }
1114
- .wapk-admin .section-title {
1115
- text-align: center;
1116
- font-size: 30px;
1117
- line-height: 1.5em;
1118
- font-weight: 400;
1119
- position: relative;
1120
- margin: 0 0 58px;
1121
- }
1122
- .wapk-admin .section-title:after {
1123
- content: '';
1124
- position: absolute;
1125
- bottom: -21px;
1126
- left: 50%;
1127
- transform: translateX(-50%);
1128
- width: 38px;
1129
- height: 5px;
1130
- border-radius: 3px;
1131
- background-color: #00D4D4;
1132
- }
1133
- .wapk-admin .section-title .section-sub-title {
1134
- font-size: 22px;
1135
- font-weight: 300;
1136
- }
1137
 
1138
- .wapk-admin .wapk-banner {
1139
- background-color: #f2f2f2;
1140
- font-size: 16px;
1141
- display: flex;
1142
- align-items: center;
1143
- padding: 50px 8%;
1144
- border-bottom: 1px solid #eee;
1145
- }
1146
- .wapk-admin .wapk-banner .wapk-banner__graphics {
1147
- width: 100%;
1148
- }
1149
- .wapk-admin .wapk-banner .wapk-banner__content h1 {
1150
- font-size: 27px;
1151
- line-height: 1.5em;
1152
- }
1153
- .wapk-admin .wapk-banner .wapk-banner__content p {
1154
- font-size: 16px;
1155
- line-height: 1.5em;
1156
- font-weight: 300;
1157
- margin: 0;
1158
- /*noinspection CssFloatPxLength*/
1159
- letter-spacing: 0.5px;
1160
  }
1161
 
1162
- .wapk-admin .feed-features,
1163
- .wapk-admin .wapk-testimonial,
1164
- .wapk-admin .feed-pricing {
1165
- text-align: center;
1166
- padding: 75px 30px 85px;
1167
- background-color: #f7f8f9;
1168
- }
1169
- .wapk-admin .feed-features .feed-feature__list {
1170
- display: flex;
1171
- flex-wrap: wrap;
1172
- align-items: flex-start;
1173
- justify-content: center;
1174
- }
1175
- .wapk-admin .feed-features .feed-features__more {
1176
- margin-top: 25px;
1177
- }
1178
- .feed-feature__item {
1179
- flex: 0 0 28.9%;
1180
- margin: 0 2.2% 4.4% 2.2%;
1181
- text-align: center;
1182
- border-radius: 5px;
1183
- background-color: #ffffff;
1184
- transition: all 100ms linear;
1185
- overflow: hidden;
1186
- }
1187
- .feed-feature__item:hover {
1188
- box-shadow: 5px 4px 32px -16px rgba(0, 0, 0, 0.63 );
1189
- }
1190
- .feed-feature__thumb {
1191
- overflow: hidden;
1192
- }
1193
- .feed-feature__item .feed-feature__thumb img {
1194
- border-radius: 5px 5px 0 0;
1195
- max-width: 100%;
1196
- width: 100%;
1197
- -webkit-transition: all 100ms linear;
1198
- -moz-transition: all 100ms linear;
1199
- -ms-transition: all 100ms linear;
1200
- -o-transition: all 100ms linear;
1201
- transition: all 100ms linear;
1202
- }
1203
- .feed-feature__item:hover .feed-feature__thumb img {
1204
- transform: scale( 1.05 );
1205
- }
1206
- .feed-feature__item .feed-feature__description {
1207
- padding: 20px 15px 25px;
1208
- }
1209
- .feed-feature__item .feed-feature__description h3 {
1210
- font-size: 15px;
1211
- line-height: 1.5em;
1212
- font-weight: 300;
1213
  margin: 0;
1214
  }
1215
 
1216
- .wapk-admin .feed-pro-comparison {
1217
- background-color: #f1f1f1;
1218
- padding: 75px;
1219
- }
1220
- .wapk-admin .feed-features .section-title h2,
1221
- .wapk-admin .wapk-testimonial .section-title h2,
1222
- .wapk-admin .feed-pro-comparison .section-title h2,
1223
- .wapk-admin .feed-pricing .section-title h2 {
1224
- margin-top: 0;
1225
- margin-bottom: 0;
1226
- }
1227
- .wapk-admin .comparison-table {
1228
- display: flex;
1229
- justify-content: space-between;
1230
- }
1231
- .wapk-admin .comparison-table .comparison {
1232
- flex: 0 0 48%;
1233
- background-color: #fff;
1234
- border: 1px solid #e0e9ec;
1235
- border-radius: 5px;
1236
- box-shadow: 0 1px 2px 0 rgba(0,0,0,.05);
1237
- padding: 50px;
1238
- box-sizing: border-box;
1239
- }
1240
- .wapk-admin .comparison .product-header {
1241
- margin-bottom: 58px;
1242
- position: relative;
1243
- }
1244
- .wapk-admin .comparison .product-header:after {
1245
- content: "";
1246
- position: absolute;
1247
- bottom: -23px;
1248
- left: 0;
1249
- width: 38px;
1250
- height: 5px;
1251
- border-radius: 3px;
1252
- background-color: #d7d7d7;
1253
- }
1254
- .wapk-admin .comparison .product-header img {
1255
- max-width: 160px;
1256
- width: 100%;
1257
- }
1258
- .wapk-admin .comparison .product-features {
1259
- margin: 0;
1260
- }
1261
- .wapk-admin .comparison li {
1262
- position: relative;
1263
- display: flex;
1264
- margin-bottom: 15px;
1265
- padding-left: 30px;
1266
- font-size: 14px;
1267
- line-height: 1.3em;
1268
- font-weight: 300;
1269
- align-items: center;
1270
- }
1271
- .wapk-admin .comparison li.unavailable {
1272
- color: #CED2D6;
1273
- }
1274
- .wapk-admin .comparison li span.dashicons {
1275
- position: absolute;
1276
- top: 1px;
1277
- left: 6px;
1278
- width: 18px;
1279
- height: 18px;
1280
- border-radius: 100%;
1281
- background: #00D4D4;
1282
- color: #FFF;
1283
- line-height: 22px;
1284
- font-size: 14px;
1285
- text-align: center;
1286
- }
1287
- .wapk-admin .comparison li.unavailable {
1288
- color: #CED2D6;
1289
- }
1290
- .wapk-admin .comparison li.unavailable span.dashicons {
1291
- background: #CED2D6;
1292
- }
1293
- .wapk-admin .comparison li span.dashicons-no {
1294
- font-size: 12px;
1295
- }
1296
- .wapk-admin .comparison li span.dashicons-no:before {
1297
- left: 0;
1298
- }
1299
- .wapk-admin .comparison li span.dashicons:before {
1300
- position: relative;
1301
- left: -0.5px;
1302
- top: -2px;
1303
- }
1304
- .wapk-admin .comparison li img {
1305
- width: 18px;
1306
- margin-right: 12px;
1307
- }
1308
- .wapk-admin .feed-pricing {}
1309
- .wapk-pricing__table {
1310
- width: 100%;
1311
- display: -webkit-box;
1312
- display: -webkit-flex;
1313
- display: -ms-flexbox;
1314
- display: flex;
1315
- -webkit-flex-wrap: wrap;
1316
- -ms-flex-wrap: wrap;
1317
- flex-wrap: wrap;
1318
- -webkit-align-content: flex-start;
1319
- -ms-flex-line-pack: start;
1320
- align-content: flex-start;
1321
- justify-content: center;
1322
- }
1323
- .wapk-pricing__table__item {
1324
- position: relative;
1325
- flex: 0 0 23%;
1326
- }
1327
- .wapk-price__table__wrapper {
1328
- position: relative;
1329
- padding: 10px;
1330
- }
1331
- .wapk-price__table {
1332
- text-align: center;
1333
- display: block;
1334
- width: 100%;
1335
- padding: 10px;
1336
- background-color: #fff;
1337
- border-radius: 8px 8px 8px 8px;
1338
- box-shadow: 0 0 25px 0 rgba(0,0,0,.1);
1339
- overflow: hidden;
1340
- -webkit-transition: background .3s,border .3s,-webkit-border-radius .3s,-webkit-box-shadow .3s;
1341
- transition: background .3s,border .3s,-webkit-border-radius .3s,-webkit-box-shadow .3s;
1342
- -o-transition: background .3s,border .3s,border-radius .3s,box-shadow .3s;
1343
- transition: background .3s,border .3s,border-radius .3s,box-shadow .3s;
1344
- transition: background .3s,border .3s,border-radius .3s,box-shadow .3s,-webkit-border-radius .3s,-webkit-box-shadow .3s;
1345
- }
1346
- .wapk-price__table__header {
1347
- background-color: #fff;
1348
- padding: 40px 0 0;
1349
- }
1350
- .wapk-price__table__heading {
1351
- color: #6d7882;
1352
- font-size: 17px;
1353
- font-weight: 500;
1354
- text-transform: uppercase;
1355
- letter-spacing: 10px;
1356
- font-family: sans-serif;
1357
- margin: 0;
1358
- padding: 0;
1359
- line-height: 1.2;
1360
- }
1361
- .wapk-price__table__price {
1362
- font-family: sans-serif;
1363
- font-weight: 600;
1364
- padding: 30px 0 10px;
1365
- display: -webkit-box;
1366
- display: -ms-flexbox;
1367
- display: flex;
1368
- -webkit-box-pack: center;
1369
- -ms-flex-pack: center;
1370
- justify-content: center;
1371
- -webkit-box-align: center;
1372
- -ms-flex-align: center;
1373
- align-items: center;
1374
- -ms-flex-wrap: wrap;
1375
- flex-wrap: wrap;
1376
- -webkit-box-orient: horizontal;
1377
- -webkit-box-direction: normal;
1378
- -ms-flex-direction: row;
1379
- flex-direction: row;
1380
- color: #434363;
1381
- font-size: 45px;
1382
- }
1383
- .wapk-price__table__amount {}
1384
- .wapk-price__table__currency {
1385
- align-self: flex-start;
1386
- color: #434363;
1387
- line-height: 1;
1388
- font-size: .3em;
1389
- margin-right: 3px;
1390
- }
1391
- .wapk-price__table__amount .free,
1392
- .wapk-price__table__amount .integer-part {
1393
- color: #434363;
1394
- line-height: .8;
1395
- }
1396
- .wapk-price__table__amount .decimal-part {
1397
- font-size: 14px;
1398
- font-weight: 400;
1399
- }
1400
- .wapk-price__table__amount .period {
1401
- font-size: 14px;
1402
- font-weight: 400;
1403
- }
1404
- .wapk-price__table__amount___legend {
1405
- width: 100%;
1406
- color: #FF4B4B;
1407
- font-size: 18px;
1408
- font-weight: 500;
1409
- line-height: 2.5em;
1410
- }
1411
- .wapk-price__table__features {
1412
- list-style-type: none;
1413
- margin: 0;
1414
- padding: 0;
1415
- line-height: 1;
1416
- color: #697279;
1417
- text-align: left;
1418
- }
1419
- .wapk-price__table__features li.item {
1420
- list-style-type: none;
1421
- margin: 0;
1422
- padding: 0;
1423
- font-size: 13px;
1424
- line-height: 1.5em;
1425
- }
1426
- .wapk-price__table__features li:not(:first-child):before {
1427
- content: "";
1428
- display: block;
1429
- /* border: 0 solid hsla(0,0%,48%,.3); */
1430
- margin: 10px 12.5%;
1431
- }
1432
- .wapk-price__table__feature {
1433
- display: block;
1434
- margin-left: calc(((100% - 80%)/2) + 20px );
1435
- margin-right: calc((100% - 80%)/2);
1436
- }
1437
- span.wapk-price__table__feature span.dashicons {
1438
- margin-left: -20px;
1439
- top: 2px;
1440
- position: relative;
1441
  }
1442
 
1443
- .wapk-price__table__footer {
1444
- padding: 40px 0;
1445
- }
1446
- .wapk-price__table__footer a {
1447
- font-size: 14px;
1448
- text-transform: uppercase;
1449
- letter-spacing: 3px;
1450
- border-radius: 100px 100px 100px 100px;
1451
- padding: 16px 42px;
1452
- transition: all 250ms;
1453
- }
1454
- .wapk-price__table__footer a:hover,
1455
- .wapk-price__table__footer a:focus,
1456
- .wapk-price__table__footer a:active {
1457
- transform: scale(1.02) !important;
1458
- }
1459
- .wapk-price__table__ribbon {
1460
- pointer-events: none;
1461
- touch-action: none;
1462
- -webkit-user-select: none;
1463
- -moz-user-select: none;
1464
- -ms-user-select: none;
1465
- user-select: none;
1466
- position: absolute;
1467
- top: 10px;
1468
- left: auto;
1469
- right: 10px;
1470
- -webkit-transform: rotate(90deg);
1471
- -ms-transform: rotate(90deg);
1472
- transform: rotate(90deg);
1473
- width: 150px;
1474
- overflow: hidden;
1475
- height: 150px;
1476
- }
1477
- .wapk-price__table__ribbon__inner {
1478
- background: #FF4B4B;
1479
- font-family: sans-serif;
1480
- font-weight: 500;
1481
- color: #fff;
1482
- font-size: 11px;
1483
- /*noinspection CssFloatPxLength*/
1484
- letter-spacing: 1.1px;
1485
- box-shadow: 0 0 30px 0 rgba(0,0,0,.21);
1486
- text-align: center;
1487
- left: 0;
1488
- width: 200%;
1489
- -webkit-transform: translateY(-50%) translateX(-50%) translateX(35px) rotate(-45deg);
1490
- -ms-transform: translateY(-50%) translateX(-50%) translateX(35px) rotate(-45deg);
1491
- transform: translateY(-50%) translateX(-50%) translateX(35px) rotate(-45deg);
1492
- margin-top: 35px;
1493
- line-height: 2;
1494
- text-transform: uppercase;
1495
  }
1496
 
1497
- .wapk-admin .wapk-payment {
1498
- display: flex;
1499
- background: #fff;
1500
- justify-content: space-between;
1501
- padding: 85px 65px 85px;
1502
- align-items: center;
1503
- }
1504
- .wapk-payment .payment-guarantee {
1505
- display: flex;
1506
- flex: 0 0 63%;
1507
- align-content: center;
1508
- align-items: center;
1509
- position: relative;
1510
- }
1511
- .wapk-payment .payment-guarantee:after {
1512
- content: "";
1513
- position: absolute;
1514
- right: -18px;
1515
- top: 50%;
1516
- transform: translateY(-50%);
1517
- width: 5px;
1518
- height: 38px;
1519
- border-radius: 3px;
1520
- background: #00D4D4;
1521
- }
1522
- .wapk-payment .payment-guarantee .guarantee-seal img {
1523
- max-width: 100%;
1524
- width: 280px;
1525
- }
1526
- .wapk-payment .payment-guarantee .guarantee-detail {
1527
- padding-left: 25px;
1528
- }
1529
- .wapk-payment .payment-guarantee .guarantee-detail h2 {
1530
- font-size: 24px;
1531
- line-height: 1.5em;
1532
- font-weight: 400;
1533
- margin: 0;
1534
- }
1535
- .wapk-payment .payment-guarantee .guarantee-detail p {
1536
- font-size: 15px;
1537
- line-height: 1.5em;
1538
- font-weight: 300;
1539
- margin: 5px 0 20px;
1540
- }
1541
- .wapk-payment .payment-guarantee .guarantee-detail a {
1542
- color: #00D4D4;
1543
- font-size: 15px;
1544
- line-height: 1.5em;
1545
- text-decoration: none;
1546
- }
1547
- .wapk-payment .payment-guarantee .guarantee-detail a span.dashicons,
1548
- .wapk-payment .payment-guarantee .guarantee-detail a img {
1549
- width: 18px;
1550
- margin-right: 4px;
1551
- margin-top: 1px;
1552
- }
1553
- .wapk-payment .payment-options {
1554
- flex-grow: 0.5;
1555
- }
1556
- .wapk-payment .payment-options h3 {
1557
- font-size: 15px;
1558
- font-weight: 300;
1559
- margin: 0 0 17px;
1560
- }
1561
- .wapk-payment .payment-options .options {}
1562
- .wapk-payment .payment-options .options h4{
1563
- color: #CED2D6;
1564
- }
1565
- .wapk-payment .payment-options .options li {
1566
- float: left;
1567
- overflow: hidden;
1568
- }
1569
- .wapk-payment .payment-options .options li img {
1570
- height: 20px;
1571
- margin-right: 5px;
1572
  }
1573
 
1574
- /** Testimonial **/
1575
- .wapk-admin .wapk-testimonials {}
1576
- .wapk-admin .wapk-testimonial-wrapper:before {
1577
- content: '';
1578
- position: absolute;
1579
- left: 79px;
1580
- top: -15px;
1581
- width: 80px;
1582
- height: 56px;
1583
- border-radius: 3px;
1584
- background: transparent url(../images/block-quote.svg) no-repeat;
1585
- background-size: cover;
1586
- }
1587
- .wapk-admin .wapk-testimonial-wrapper {
1588
- position: relative;
1589
- display: block;
1590
- width: 80%;
1591
- margin: 0 auto;
1592
- padding: 0;
1593
- text-align: center;
1594
- }
1595
- .testimonial-item__user .avatar {
1596
- width: 100px;
1597
- height: 100px;
1598
- margin: 0 auto;
1599
- border-radius: 100%;
1600
- border: 3px solid #efefef;
1601
- overflow: hidden;
1602
- }
1603
- .testimonial-item {
1604
- margin-bottom: 25px;
1605
- }
1606
- .testimonial-item__user .avatar img {
1607
- max-width: 100%;
1608
- width: 100%;
1609
- margin: 0 auto;
1610
- padding: 0;
1611
- display: block;
1612
- }
1613
 
1614
- .testimonial-item__comment {
1615
- position: relative;
1616
- display: block;
1617
- width: 70%;
1618
- margin: 0 auto 30px;
 
 
 
 
1619
  }
1620
 
1621
- .testimonial-item__user h4.author-name {
1622
- font-size: 25px;
1623
- font-weight: 300;
1624
- margin: 10px auto;
 
1625
  }
1626
 
1627
- .testimonial-item__user span.author-meta {
1628
- font-size: 16px;
1629
- font-weight: 300;
1630
  }
1631
 
1632
- @media screen and (min-width: 1281px) {
1633
- .wapk-admin .wapk-banner,
1634
- .wapk-admin .feed-features {
1635
- padding-left: 20%;
1636
- padding-right: 20%;
1637
- }
1638
- .wapk-admin .wapk-payment {
1639
- padding-left: 15%;
1640
- padding-right: 15%;
1641
- }
1642
- .wapk-admin .feed-pro-comparison {
1643
- padding-left: 21.2%;
1644
- padding-right: 21.2%;
1645
- }
1646
- .wapk-admin .wapk-testimonial-wrapper {
1647
- width: 55%;
1648
- }
1649
  }
1650
 
1651
- .wapk-feed-pro-upgrade .wapk-feed-cta,
1652
- .wapk-feed-docs .wapk-feed-cta,
1653
- .wapk-admin .feed-pro-comparison,
1654
- .wapk-admin .wapk-payment,
1655
- .wapk-admin .feed-features,
1656
- .wapk-admin .wapk-testimonial,
1657
- .wapk-admin .wapk-feed-banner {
1658
- margin: 0;
1659
  }
1660
- .wapk-feed-banner .wapk-banner {
1661
- margin: 0;
1662
- padding: 0;
 
1663
  }
6
  -webkit-animation: spin 1000ms infinite linear;
7
  animation: spin 1000ms infinite linear;
8
  }
9
+
10
  .wpf_spin_reverse {
11
  animation-direction: reverse;
12
  }
13
+
14
  .wpf_regenerate.disabled {
15
  color: #737373;
16
  box-shadow: none;
17
  cursor: not-allowed;
18
  }
19
+
20
  @-webkit-keyframes spin {
21
  0% {
22
  -webkit-transform: rotate(0deg);
27
  transform: rotate(359deg);
28
  }
29
  }
30
+
31
  @keyframes spin {
32
  0% {
33
  -webkit-transform: rotate(0deg);
38
  transform: rotate(359deg);
39
  }
40
  }
41
+
42
  /*noinspection SpellCheckingInspection */
43
  .wfbtn {
44
  background: #3498db;
60
  border: solid #2b698f 3px;
61
  text-decoration: none;
62
  }
63
+
64
  /*noinspection SpellCheckingInspection */
65
  .wftooltip {
66
+ display: none;
67
+ position: absolute;
68
+ border: 1px solid #333;
69
+ background-color: #161616;
70
+ border-radius: 5px;
71
+ padding: 10px;
72
+ color: #fff;
73
+ font-size: 12px;
74
  }
75
+
76
  /*noinspection SpellCheckingInspection */
77
  .wfbtn:hover {
78
  background: #3cb0fd;
84
  text-decoration: none;
85
  }
86
 
87
+ .makeFeedResponse {
88
  width: 70%;
89
  color: green;
90
  }
101
  width: 200px;
102
  }
103
 
104
+ .generalInput:not(.selectize-control) {
105
+ margin: 5px auto;
106
+ }
107
+
108
  .error {
109
  color: red;
110
  }
117
  #wf_newRow {
118
  margin-left: 0;
119
  }
120
+
121
  /*noinspection SpellCheckingInspection */
122
  .mtable tbody tr {
123
  height: 25px;
126
  align-items: baseline;
127
  font-weight: bold;
128
  }
129
+
130
  /*noinspection SpellCheckingInspection */
131
  .mtable th:nth-child(1) {
132
  width: 17px;
133
  }
134
+
135
  /*noinspection SpellCheckingInspection */
136
  .mtable th:nth-child(2) {
137
  width: 160px;
138
  }
139
+
140
  /*noinspection SpellCheckingInspection */
141
  .mtable th:nth-child(3) {
142
  width: 100px;
143
  }
144
+
145
  /*noinspection SpellCheckingInspection */
146
  .mtable th:nth-child(4) {
147
  width: 100px;
148
  }
149
+
150
  /*noinspection SpellCheckingInspection */
151
  .mtable th:nth-child(5) {
152
  width: 150px;
153
  }
154
+
155
  /*noinspection SpellCheckingInspection */
156
  .mtable th:nth-child(6) {
157
  width: 100px;
158
  }
159
+
160
  /*noinspection SpellCheckingInspection */
161
  .mtable th:nth-child(7) {
162
  width: 150px;
163
  }
164
+
165
  /*noinspection SpellCheckingInspection */
166
  .mtable th:nth-child(8) {
167
  width: 90px;
168
  }
169
+
170
  /*noinspection SpellCheckingInspection */
171
  .mtable th:nth-child(9) {
172
  width: 29px;
173
  }
174
+
175
  /*noinspection SpellCheckingInspection */
176
  .wp-admin select.wf_mattributes, .wf_mattributes {
177
  width: 150px;
182
  div#wf-tab-content1 select:not([name^="output_type"]), div#wf-tab-content1 input {
183
  width: 100%;
184
  }
185
+
186
  div#wf-tab-content1 .dashicons {
187
  vertical-align: middle;
188
  }
191
  width: 150px;
192
  left: 0
193
  }
194
+
195
  .wf_compare {
196
  max-width: 245px;
197
  left: 0
201
  width: 100px;
202
  left: 0
203
  }
204
+
205
  /*noinspection SpellCheckingInspection */
206
  .wf_sortedtable {
207
  cursor: move;
208
  }
209
 
210
+ .sorted_table {
211
+ position: relative;
212
+ }
213
+
214
  .sorted_table .dragged {
215
  position: absolute;
216
  opacity: 0.8;
217
  z-index: 9999;
218
  background: #fff;
219
+ width: 100%;
220
+ display: table;
221
  }
222
 
223
  .sorted_table tbody tr.placeholder td {
224
  border: 1px dashed #2cc185;
225
+ height: 46px;
226
  }
227
+
228
  /*noinspection SpellCheckingInspection */
229
  .mtable2 tbody tr {
230
  height: 25px;
233
  align-items: baseline;
234
  font-weight: bold;
235
  }
236
+
237
  /*noinspection SpellCheckingInspection */
238
  .mtable2 th:nth-child(1) {
239
  width: 30px;
240
  }
241
+
242
  /*noinspection SpellCheckingInspection */
243
  .mtable2 th:nth-child(2) {
244
  width: 150px;
245
  }
246
+
247
  /*noinspection SpellCheckingInspection */
248
  .mtable2 th:nth-child(3) {
249
  width: 230px;
250
  }
251
+
252
  /*noinspection SpellCheckingInspection */
253
  .mtable2 th:nth-child(4) {
254
  width: 220px;
255
  }
256
+
257
  /*noinspection SpellCheckingInspection */
258
  .mtable2 th:nth-child(7) {
259
  width: 50px;
260
  }
261
+
262
  /*noinspection SpellCheckingInspection */
263
  .mtable2 th:nth-child(8) {
264
  width: 50px;
265
  }
266
+
267
  /*noinspection SpellCheckingInspection */
268
  .mtable2 th:nth-child(9) {
269
  width: 29px;
270
  }
271
+
272
  /*noinspection SpellCheckingInspection */
273
+ .wfnoempty {
274
+ width: 120px;
275
  }
276
 
277
  /*==================Tab Design=======================*/
302
  border: 2px solid #CCC;
303
  }
304
 
305
+ .wf_tabs li > input[type="radio"][name="wf_tabs"] {
306
  position: absolute;
307
+ top: auto;
308
  left: -9999px;
 
309
  }
310
 
311
  .wf-tab-name {
335
  .wf_tabs .wf-tab-content {
336
  z-index: 2;
337
  display: none;
 
338
  width: 100%;
339
  font-size: 0.9rem;
340
  position: absolute;
347
  display: block;
348
  }
349
 
350
+ [id^="wf-tab-content"] {
351
+ margin-bottom: 40px;
352
+ }
353
+
354
+ div#wf-tab-content2 table:first-child {
355
+ padding: 10px 0;
356
+ }
357
+
358
+ div#wf-tab-content2 table:first-child td:nth-child(1) {
359
+ width: 260px;
360
+ }
361
 
362
+ div#wf-tab-content2 table:first-child td:nth-child(2) {
363
+ width: 260px;
364
+ }
365
 
366
  table.feed-actions tr td:last-child {
367
  text-align: right;
368
  }
369
 
370
+ /* Selectize */
371
+ select.selectize {
372
+ display: none;
 
 
373
  }
374
+
375
+ body.no-js select.selectize {
376
+ display: block !important;
 
 
 
 
377
  }
378
 
379
+ /* fallback combat */
380
+ .selectize-dropdown .active {
381
+ background-color: #edf9ff;
382
+ }
383
 
384
+ .selectize-dropdown .create {
385
+ padding: 5px 8px;
386
+ }
 
387
 
 
 
 
 
388
  .wapk-selectize-item {
389
  background: #0073aa !important;
390
  color: #f1f1f1 !important;
391
  font-weight: bold !important;
392
+ border-color: #0073aa !important;
393
+ padding-left: 5px;
394
+ padding-right: 5px;
395
+ }
396
+
397
+ .selectize-input.full #googleTaxonomyId-selectized {
398
+ opacity: 0;
399
+ position: absolute;
400
+ left: -10000px;
401
+ }
402
+
403
+ .selectize-dropdown [data-selectable].option {
404
+ cursor: default;
405
  }
406
+
407
+ .selectize-control.plugin-remove_button [data-value] .remove {
 
408
  border-left: 1px solid #f1f1f1 !important;
409
  }
410
 
411
+ .selectize-dropdown .optgroup-header {
412
+ font-weight: 700;
413
+ background: #efefef;
414
+ color: #5a5a5a;
415
+ }
416
+
417
+ .selectize-dropdown [data-selectable].option {
418
+ cursor: pointer;
419
+ }
420
+
421
  /* Feed active and inactive button CSS */
422
+ .wf_status_wrap label {
423
+ width: 50px;
424
+ height: 25px;
425
+ box-sizing: border-box;
426
+ border: 1px solid;
427
+ float: left;
428
+ border-radius: 100px;
429
+ position: relative;
430
+ cursor: pointer;
431
+ transition: .3s ease;
432
+ }
433
+
434
+ input[class=woo_feed_status_input]:checked + label {
435
+ background: #55e868;
436
+ }
437
+
438
+ input[class=woo_feed_status_input]:checked + label:before {
439
+ left: 25px;
440
+ }
441
+
442
+ .wf_status_wrap label:before {
443
+ transition: .3s ease;
444
+ content: '';
445
+ width: 20px;
446
+ height: 20px;
447
+ position: absolute;
448
+ background: white;
449
+ left: 2px;
450
+ top: 2px;
451
+ box-sizing: border-box;
452
+ border: 1px solid;
453
+ color: black;
454
+ border-radius: 100px;
455
  }
456
+
457
  /* list table style */
458
  /*noinspection SpellCheckingInspection */
459
  .widefat td.column-url, .widefat th.column-url,
460
+ .column-url {
461
+ color: #008779;
462
+ font-weight: bold;
463
+ }
464
 
465
  /** Feed Progress **/
466
  .feed-progress-container {
467
+ width: 100%;
468
  color: white;
469
  text-align: center;
470
  font-weight: 300;
471
  }
472
 
473
  .feed-progress-bar {
474
+ width: 100%;
475
+ background: #eee;
476
+ padding: 3px;
477
+ border-radius: 3px;
478
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, .2);
479
  }
480
 
481
  .feed-progress-bar-fill {
482
+ height: 20px;
483
+ display: block;
484
+ background: #3DC264;
485
+ width: 0;
486
+ border-radius: 3px;
487
+ -webkit-transition: width 0.8s ease;
488
+ transition: width 0.8s ease;
489
  }
490
 
491
  .feed-progress-status {
495
  }
496
 
497
  .feed-progress-percentage {
498
+ text-align: right;
499
  font-weight: bolder;
500
  color: #41f49d;
501
  font-family: 'Arial Black', sans-serif;
503
  }
504
 
505
  /*noinspection SpellCheckingInspection */
506
+ #wpbody-content.woofeed-body-content {
507
+ overflow: visible !important;
508
  }
509
+
510
  /*noinspection SpellCheckingInspection */
511
  .clippy {
512
  position: relative;
515
  margin-left: 3px;
516
  top: 3px;
517
  }
518
+
519
  /*noinspection SpellCheckingInspection */
520
+ .column-url .clippy {
521
+ display: none;
522
+ }
523
+
524
  /*noinspection SpellCheckingInspection */
525
+ .column-url:hover .clippy {
526
+ display: inline-block;
527
+ }
528
+
529
  /**
530
  * Primer Tooltip
531
  * @TODO use node module
535
  .tooltipped {
536
  position: relative
537
  }
538
+
539
  /*noinspection SpellCheckingInspection */
540
  .tooltipped:after {
541
  position: absolute;
542
  z-index: 1000000;
543
  display: none;
544
  padding: 5px 8px;
545
+ font: normal normal 11px/1.5 Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
546
  color: #fff;
547
  text-align: center;
548
  text-decoration: none;
553
  white-space: pre;
554
  pointer-events: none;
555
  content: attr(aria-label);
556
+ background: rgba(0, 0, 0, .8);
557
  border-radius: 3px;
558
  -webkit-font-smoothing: subpixel-antialiased
559
  }
560
+
561
  /*noinspection SpellCheckingInspection */
562
  .tooltipped:before {
563
  position: absolute;
565
  display: none;
566
  width: 0;
567
  height: 0;
568
+ color: rgba(0, 0, 0, .8);
569
  pointer-events: none;
570
  content: "";
571
  border: 5px solid transparent
572
  }
573
+
574
  /*noinspection SpellCheckingInspection */
575
+ .tooltipped:hover:before, .tooltipped:hover:after, .tooltipped:active:before, .tooltipped:active:after, .tooltipped:focus:before, .tooltipped:focus:after {
576
  display: inline-block;
577
  text-decoration: none
578
  }
579
+
580
  /*noinspection SpellCheckingInspection */
581
+ .tooltipped-multiline:hover:after, .tooltipped-multiline:active:after, .tooltipped-multiline:focus:after {
582
  display: table-cell
583
  }
584
+
585
  /*noinspection SpellCheckingInspection */
586
+ .tooltipped-s:after, .tooltipped-se:after, .tooltipped-sw:after {
587
  top: 100%;
588
  right: 50%;
589
  margin-top: 5px
590
  }
591
+
592
  /*noinspection SpellCheckingInspection */
593
+ .tooltipped-s:before, .tooltipped-se:before, .tooltipped-sw:before {
594
  top: auto;
595
  right: 50%;
596
  bottom: -5px;
597
  margin-right: -5px;
598
+ border-bottom-color: rgba(0, 0, 0, .8)
599
  }
600
+
601
  /*noinspection SpellCheckingInspection */
602
  .tooltipped-se:after {
603
  right: auto;
604
  left: 50%;
605
  margin-left: -15px
606
  }
607
+
608
  /*noinspection SpellCheckingInspection */
609
  .tooltipped-sw:after {
610
  margin-right: -15px
611
  }
612
+
613
  /*noinspection SpellCheckingInspection */
614
+ .tooltipped-n:after, .tooltipped-ne:after, .tooltipped-nw:after {
615
  right: 50%;
616
  bottom: 100%;
617
  margin-bottom: 5px
618
  }
619
+
620
  /*noinspection SpellCheckingInspection */
621
+ .tooltipped-n:before, .tooltipped-ne:before, .tooltipped-nw:before {
622
  top: -5px;
623
  right: 50%;
624
  bottom: auto;
625
  margin-right: -5px;
626
+ border-top-color: rgba(0, 0, 0, .8)
627
  }
628
+
629
  /*noinspection SpellCheckingInspection */
630
  .tooltipped-ne:after {
631
  right: auto;
632
  left: 50%;
633
  margin-left: -15px
634
  }
635
+
636
  /*noinspection SpellCheckingInspection */
637
  .tooltipped-nw:after {
638
  margin-right: -15px
639
  }
640
+
641
  /*noinspection SpellCheckingInspection */
642
+ .tooltipped-s:after, .tooltipped-n:after {
643
  -webkit-transform: translateX(50%);
644
  -ms-transform: translateX(50%);
645
  transform: translateX(50%)
646
  }
647
+
648
  /*noinspection SpellCheckingInspection */
649
  .tooltipped-w:after {
650
  right: 100%;
654
  -ms-transform: translateY(50%);
655
  transform: translateY(50%)
656
  }
657
+
658
  /*noinspection SpellCheckingInspection */
659
  .tooltipped-w:before {
660
  top: 50%;
661
  bottom: 50%;
662
  left: -5px;
663
  margin-top: -5px;
664
+ border-left-color: rgba(0, 0, 0, .8)
665
  }
666
+
667
  /*noinspection SpellCheckingInspection */
668
  .tooltipped-e:after {
669
  bottom: 50%;
673
  -ms-transform: translateY(50%);
674
  transform: translateY(50%)
675
  }
676
+
677
  /*noinspection SpellCheckingInspection */
678
  .tooltipped-e:before {
679
  top: 50%;
680
  right: -5px;
681
  bottom: 50%;
682
  margin-top: -5px;
683
+ border-right-color: rgba(0, 0, 0, .8)
684
  }
685
 
686
  /*noinspection SpellCheckingInspection,CssInvalidPropertyValue*/
694
  white-space: pre-line;
695
  border-collapse: separate
696
  }
697
+
698
  /*noinspection SpellCheckingInspection */
699
+ .tooltipped-multiline.tooltipped-s:after, .tooltipped-multiline.tooltipped-n:after {
700
  right: auto;
701
  left: 50%;
702
  -webkit-transform: translateX(-50%);
703
  -ms-transform: translateX(-50%);
704
  transform: translateX(-50%)
705
  }
706
+
707
  /*noinspection SpellCheckingInspection */
708
+ .tooltipped-multiline.tooltipped-w:after, .tooltipped-multiline.tooltipped-e:after {
709
  right: 100%
710
  }
711
+
712
+ @media screen and (min-width: 0\0
713
+ ) {
714
  /*noinspection SpellCheckingInspection */
715
  .tooltipped-multiline:after {
716
  width: 250px
717
  }
718
  }
719
+
720
  /*noinspection SpellCheckingInspection */
721
+ .tooltipped-sticky:before, .tooltipped-sticky:after {
722
  display: inline-block
723
  }
724
+
725
  /*noinspection SpellCheckingInspection */
726
  .tooltipped-sticky.tooltipped-multiline:after {
727
  display: table-cell
728
  }
729
+
730
  /*noinspection SpellCheckingInspection */
731
  .fullscreen-overlay-enabled.dark-theme .tooltipped:after {
732
  color: #000;
733
+ background: rgba(255, 255, 255, .8)
734
  }
735
+
736
  /*noinspection SpellCheckingInspection */
737
+ .fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-s:before, .fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-se:before, .fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-sw:before {
738
+ border-bottom-color: rgba(255, 255, 255, .8)
739
  }
740
+
741
  /*noinspection SpellCheckingInspection */
742
+ .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-n:before, .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-ne:before, .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-nw:before {
743
+ border-top-color: rgba(255, 255, 255, .8)
744
  }
745
+
746
  /*noinspection SpellCheckingInspection */
747
  .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-e:before {
748
+ border-right-color: rgba(255, 255, 255, .8)
749
  }
750
+
751
  /*noinspection SpellCheckingInspection */
752
  .fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-w:before {
753
+ border-left-color: rgba(255, 255, 255, .8)
754
  }
755
 
756
+ ul.tracker_collection_list {
757
+ list-style: initial;
758
+ padding: initial;
759
+ margin: -10px 0 0 30px;
760
+ font-size: 11px !important;
761
+ }
762
+
763
+ ul.tracker_collection_list li {
764
+ margin: 0;
765
+ }
766
 
767
  /** Info Message Table **/
768
  table.wf-info-table th,
769
+ table.wf-rate-table th {
770
+ vertical-align: middle;
771
+ text-align: center;
772
+ max-width: 100%;
773
+ font-weight: 500;
774
+ }
775
+
776
+ table.wf-info-table th strong,
777
+ table.wf-rate-table th strong {
778
+ font-weight: bold;
779
+ }
780
+
781
+ table.wf-info-table th:first-child img {
782
+ margin: 0 0 -5px 5px;
783
+ }
784
+
785
+ table.wf-rate-table a {
786
+ color: #0073aa;
787
+ }
788
+
789
  table.wf-rate-table a.review-star:after {
790
+ content: "\f155\f155\f155\f155\f155" !important;
791
  /*noinspection CssNoGenericFontName*/
792
  font-family: dashicons;
 
793
  font-size: 10px;
794
  font-weight: 100;
795
  text-rendering: auto;
797
  -moz-osx-font-smoothing: grayscale;
798
  /*content: '★★★★★'; /*&#x2605;&#x2605;&#x2605;&#x2605;&#x2605;*/
799
  /*content: '\2605\2605\2605\2605\2605';*/
800
+ color: #0073aa;
801
+ text-decoration: underline;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
802
  }
803
 
804
  /** Admin Menu Icon **/
809
  opacity: 0.6;
810
  filter: alpha(opacity=60);
811
  }
812
+
813
  #adminmenu #toplevel_page_webappick-manage-feeds:hover div.wp-menu-image::before,
814
  #adminmenu #toplevel_page_webappick-manage-feeds.wp-has-current-submenu div.wp-menu-image::before {
815
  opacity: 1;
822
  -moz-box-sizing: border-box;
823
  box-sizing: border-box;
824
  }
825
+
826
  .wapk-admin {
827
  position: relative;
828
  display: block;
833
  /* reset .warp margin to use full width except menu area */
834
  margin: 0 0 0 -10px;
835
  }
836
+
837
  @media screen and (min-width: 783px) {
838
  .wapk-admin {
839
  margin: 0 0 0 -20px;
840
  }
841
  }
842
+
843
+ .wapk-admin h1, .wapk-admin h2,
844
+ .wapk-admin h3, .wapk-admin h4,
845
+ .wapk-admin h5, .wapk-admin h6,
 
 
846
  .wapk-admin p {
847
  color: #1B2730;
848
  }
849
+
850
+ .text-center {
851
+ text-align: center;
852
+ }
853
+
854
  .wapk-admin sup {
855
  vertical-align: baseline;
856
  position: relative;
857
  top: -6px;
858
  }
859
+
860
  .wapk-admin sub {
861
  vertical-align: baseline;
862
  position: relative;
863
  top: 4px;
864
  }
865
+
866
  /* WP.Core.UI Compat */
867
+ .wapk-admin .wapk-section [class$=icon32] + h2,
868
  .wapk-admin .wapk-section h1,
869
+ .wapk-admin .wapk-section > h2:first-child {
870
  font-size: 23px;
871
  font-weight: 400;
872
  margin: 0;
873
  padding: 9px 0 4px 0;
874
  line-height: 1.3;
875
  }
876
+
877
  .wapk-admin .wapk-section,
878
+ .wapk-admin > .notice {
879
  /* Restore .warp margin */
880
+ margin: 10px 20px 0 22px;
881
  position: relative;
882
  display: block;
883
  }
884
+
885
  .clear:after {
886
  content: "";
887
  display: table;
888
  clear: both;
889
  }
890
+
891
  .wapk-admin span.help {
892
+ display: block;
893
+ float: left;
894
+ width: 100%;
895
  font-size: 0.9em;
896
  color: #636363;
897
+ margin-top: 5px;
898
+ font-weight: 500;
899
  }
900
+
901
  .wapk-admin span.help .dashicons {
902
  width: 11px;
903
  height: 12px;
907
 
908
  /*.wapk-admin .help a { color: inherit; text-decoration: underline; }*/
909
  /** Extend WP Core UI PostBox For Docs **/
910
+ .wapk-feed-docs .postbox {
911
+ width: 355px;
912
+ margin-right: 20px;
913
+ display: inline-block;
914
+ vertical-align: top;
915
+ }
916
+
917
  @media only screen and (max-width: 850px) {
918
+ .wapk-feed-docs .postbox {
919
+ display: block;
920
+ width: auto;
921
+ float: none;
922
+ margin-right: auto;
923
+ }
924
  }
 
 
 
 
 
 
 
925
 
926
+ .wapk-feed-docs .postbox .hndle {
927
+ font-size: 14px;
928
+ padding: 8px 12px;
929
+ margin: 0;
930
+ line-height: 1.4;
931
+ cursor: pointer;
932
  }
 
 
 
 
 
933
 
934
+ .wapk-feed-docs .postbox .dashicons {
935
+ color: #ccc
936
+ }
 
 
937
 
938
+ .wapk-feed-docs .postbox a {
939
+ text-decoration: none;
940
+ }
941
 
942
+ .wapk-feed-docs .postbox .inside,
943
+ .wapk-feed-docs .postbox ul {
944
+ margin-bottom: 0;
 
 
 
 
 
 
 
945
  }
946
 
947
+ .wapk-feed-docs .postbox .toggle-indicator:before {
948
+ content: "\F142";
 
 
 
 
949
  display: inline-block;
950
+ font: 400 20px/1 dashicons;
951
+ speak: none;
952
+ -webkit-font-smoothing: antialiased;
953
+ -moz-osx-font-smoothing: grayscale;
954
+ text-decoration: none !important;
 
 
 
 
 
 
 
 
955
  }
956
+
957
+ .wapk-feed-docs .postbox.closed .toggle-indicator:before {
958
+ content: "\F140";
 
 
959
  }
960
+
961
+ .wapk-feed-docs .postbox li {
962
+ width: 100%;
963
+ display: block;
964
+ float: left;
965
  }
966
+
967
+ .wapk-feed-docs .postbox li span, .wapk-feed-docs .postbox li a {
968
+ display: inline-block;
969
+ float: left;
970
  }
971
+
972
+ .wapk-feed-docs .postbox li span {
973
+ margin-right: 4px;
 
 
 
 
 
974
  }
975
+
976
+ .wapk-feed-docs .postbox li a {
977
+ width: calc(100% - 24px);
978
+ }
979
+
980
+ .wapk-section #post-body.columns-2 #side-sortables {
981
+ min-height: 196px;
982
+ }
983
+
984
+ #poststuff #feed_merchant_info .inside {
985
+ margin: 0;
986
+ padding: 0;
987
+ }
988
+
989
+ #feed_merchant_info ul.data {
990
+ margin-left: 24px;
991
+ margin-top: 5px;
992
+ }
993
+
994
+ #feed_merchant_info ul.data li {
995
+ margin-bottom: 5px;
996
+ }
997
+
998
+ .merchant-info-section {
999
+ padding: 6px 10px 8px;
1000
+ }
1001
+
1002
+ .generateFeed .wf-tab-content table:first-child {
1003
+ border: none;
1004
+ box-shadow: none;
1005
+ }
1006
+
1007
+ .generateFeed table th {
1008
+ font-weight: bold;
1009
+ }
1010
+
1011
+ /** Admin Feed Help Docs **/
1012
+ .wp-submenu li span.woo-feed-docs {
1013
+ font-weight: bold;
1014
+ color: #f18500;
1015
+ }
1016
+
1017
+ .wp-submenu li:hover span.woo-feed-docs,
1018
+ .wp-submenu li.current span.woo-feed-docs {
1019
+ color: #ce7304;
1020
+ }
1021
+
1022
+ .wapk-admin .wapk-feed-docs .postbox .hndle {
1023
+ cursor: default;
1024
+ }
1025
+
1026
+
1027
+ /** Admin Call-To-Action **/
1028
+ .wapk-cta {
1029
+ position: relative;
1030
+ display: flex;
1031
+ width: 100%;
1032
+ padding: 100px 15px;
1033
+ background: linear-gradient(45deg, #6CD5FF 33%, #c2efef 100%);
1034
+ justify-content: center;
1035
+ align-items: center;
1036
+ }
1037
+
1038
+ .wapk-cta-icon .dashicons {
1039
+ font-size: 100px;
1040
+ width: 100px;
1041
+ height: auto;
1042
+ margin: 0 10px -8px 0;
1043
+ color: #02658c;
1044
+ }
1045
+
1046
+ .wapk-cta-content {
1047
+ width: 50%;
1048
+ }
1049
+
1050
+ .wapk-cta-content h2 {
1051
+ font-size: 2em;
1052
+ margin: 0.5em 0;
1053
+ }
1054
+
1055
+ .wapk-cta-action {
1056
+ }
1057
+
1058
+ .wapk-cta-action a.wapk-button {
1059
+ font-size: 24px;
1060
+ height: auto !important;
1061
+ padding: 10px 20px;
1062
+ }
1063
+
1064
+ @media (max-width: 600px) {
1065
+ .wapk-cta {
1066
+ display: block;
1067
+ text-align: center;
1068
+ padding: 4em 0;
1069
+ }
1070
+
1071
+ .wapk-cta-content {
1072
+ width: 100%;
1073
+ margin: 2em 0;
1074
+ }
1075
+ }
1076
+
1077
+ /** Override .wp-core-ui .wapk-button styles with prefix .wapk-admin **/
1078
+ /* @TODO refactor with scss */
1079
+ /* Button Skin */
1080
+ .wapk-button,
1081
+ .wapk-button-secondary {
1082
+ color: #00D4D4;
1083
+ border-color: #00D4D4;
1084
+ }
1085
+
1086
+ .wapk-button,
1087
+ .wapk-button-primary,
1088
+ .wapk-button-secondary {
1089
+ display: inline-block;
1090
+ text-decoration: none;
1091
+ font-size: 13px;
1092
+ line-height: 2.15384615;
1093
+ min-height: 30px;
1094
+ margin: 0;
1095
+ padding: 0 10px;
1096
+ cursor: pointer;
1097
+ border-width: 1px;
1098
+ border-style: solid;
1099
+ -webkit-appearance: none;
1100
+ border-radius: 3px;
1101
+ white-space: nowrap;
1102
+ box-sizing: border-box;
1103
+ }
1104
+
1105
+ .wapk-button > svg,
1106
+ .wapk-button-secondary > svg {
1107
+ width: 15px;
1108
+ margin-left: 5px;
1109
+ fill: #00D4D4;
1110
+ }
1111
+
1112
+ .wapk-button > .dashicons,
1113
+ .wapk-button-secondary > .dashicons {
1114
+ color: #00D4D4;
1115
+ }
1116
+
1117
+ .wapk-button.hover,
1118
+ .wapk-button:hover,
1119
+ .wapk-button-secondary:hover,
1120
+ .wapk-button.focus,
1121
+ .wapk-button:focus,
1122
+ .wapk-button-secondary:focus {
1123
+ border-color: #00bbbb;
1124
+ color: #00bbbb;
1125
+ }
1126
+
1127
+ .wapk-button.hover > svg,
1128
+ .wapk-button:hover > svg,
1129
+ .wapk-button-secondary:hover > svg,
1130
  .wapk-button.focus > svg,
1131
  .wapk-button:focus > svg,
1132
  .wapk-button-secondary:focus > svg {
1133
  fill: #00bbbb;
1134
  }
1135
+
1136
  .wapk-button.hover > .dashicons,
1137
  .wapk-button:hover > .dashicons,
1138
  .wapk-button-secondary:hover > .dashicons,
1141
  .wapk-button-secondary:focus > .dashicons {
1142
  color: #00bbbb;
1143
  }
1144
+
1145
  .wapk-button.focus,
1146
  .wapk-button:focus,
1147
  .wapk-button-secondary:focus {
1149
  color: #00bbbb;
1150
  box-shadow: 0 0 0 1px #00D4D4;
1151
  }
1152
+
1153
  .wapk-button.focus > svg,
1154
  .wapk-button:focus > svg,
1155
  .wapk-button-secondary:focus > svg {
1156
  fill: #00bbbb;
1157
  }
1158
+
1159
  .wapk-button.focus > .dashicons,
1160
  .wapk-button:focus > .dashicons,
1161
  .wapk-button-secondary:focus > .dashicons {
1162
  color: #00bbbb;
1163
  }
1164
+
1165
  .wapk-button:active {
1166
  background: #00bbbb;
1167
  border-color: #00bbbb;
1168
  }
1169
+
1170
  .wapk-button.active,
1171
  .wapk-button.active:focus,
1172
  .wapk-button.active:hover {
1174
  color: #00bbbb;
1175
  box-shadow: inset 0 2px 5px -3px #00bbbb;
1176
  }
1177
+
1178
  .wapk-button.active > svg,
1179
  .wapk-button.active:focus > svg,
1180
  .wapk-button.active:hover > svg {
1181
  fill: #00bbbb;
1182
  }
1183
+
1184
  .wapk-button.active > .dashicons,
1185
  .wapk-button.active:focus > .dashicons,
1186
  .wapk-button.active:hover > .dashicons {
1187
  color: #00bbbb;
1188
  }
1189
+
1190
  .wapk-button-primary {
1191
  background: #00D4D4;
1192
  border-color: #00D4D4;
1193
  color: #fff;
 
1194
  box-shadow: 0 1px 0 #00bbbb;
1195
  text-shadow: 0 -1px 1px #00bbbb, 1px 0 1px #00bbbb, 0 1px 1px #00bbbb, -1px 0 1px #00bbbb;
1196
  }
1197
+
1198
  .wapk-button-primary > svg {
1199
  fill: #fff;
1200
  }
1201
+
1202
+ .wapk-button-primary:hover, .wapk-button-primary:focus {
1203
  background: #00e3e3;
1204
  border-color: #00c5c5;
1205
  color: #fff;
1206
  }
1207
+
1208
+ .wapk-button-primary:hover > svg, .wapk-button-primary:focus > svg {
1209
  fill: #fff;
1210
  }
1211
+
1212
  .wapk-button-primary:focus {
1213
  box-shadow: 0 0 0 1px #fff, 0 0 0 3px #00D4D4;
1214
  }
1215
+
1216
  .wapk-button-primary:active {
1217
  background: #00bbbb;
1218
  border-color: #00bbbb;
1219
  color: #fff;
1220
  }
1221
+
1222
  .wapk-button-primary:active > svg {
1223
  fill: #fff;
1224
  }
1225
+
1226
+ .wapk-button-primary.active, .wapk-button-primary.active:focus, .wapk-button-primary.active:hover {
 
1227
  background: #00D4D4;
1228
  color: #fff;
1229
  border-color: #008888;
1230
  box-shadow: inset 0 2px 5px -3px black;
1231
  }
1232
+
1233
+ .wapk-button-primary.active > svg, .wapk-button-primary.active:focus > svg, .wapk-button-primary.active:hover > svg {
 
1234
  fill: #fff;
1235
  }
1236
+
1237
+ .wapk-button-primary[disabled], .wapk-button-primary:disabled, .wapk-button-primary.wapk-button-primary-disabled, .wapk-button-primary.disabled {
 
 
1238
  color: #c7d1d1 !important;
1239
  background: #22ffff !important;
1240
  border-color: #22ffff !important;
1241
  text-shadow: none !important;
1242
  }
1243
+
1244
+ .wapk-button-primary[disabled] > svg, .wapk-button-primary:disabled > svg, .wapk-button-primary.wapk-button-primary-disabled > svg, .wapk-button-primary.disabled > svg {
 
 
1245
  fill: #c7d1d1 !important;
1246
  }
1247
+
1248
  .wapk-button.wapk-button-primary.wapk-button-hero {
1249
  box-shadow: 0 2px 0 #00bbbb;
1250
  }
1251
+
1252
  .wapk-button.wapk-button-primary.wapk-button-hero:focus {
1253
  box-shadow: 0 2px 0 #00bbbb, 0 1px 0 #00c5c5, 0 0 2px 1px #00eeee;
1254
  }
1255
+
1256
+ .wapk-button.wapk-button-primary.wapk-button-hero.active, .wapk-button.wapk-button-primary.wapk-button-hero.active:hover, .wapk-button.wapk-button-primary.wapk-button-hero.active:focus, .wapk-button.wapk-button-primary.wapk-button-hero:active {
 
 
1257
  box-shadow: inset 0 3px 0 #00a1a1;
1258
  }
1259
+
1260
  .wapk-button-group > .wapk-button.active {
1261
  border-color: #00D4D4;
1262
  }
1268
  line-height: 28px;
1269
  padding: 0 12px 2px;
1270
  }
1271
+
1272
  .wapk-button.wapk-button-hero,
1273
  .wapk-button-group.wapk-button-hero .wapk-button {
1274
  font-size: 18px;
1279
  }
1280
 
1281
  @media screen and (min-width: 782px) {
1282
+ th#status {
1283
+ width: 80px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1284
  }
 
 
 
1285
 
1286
+ th#provider {
1287
+ width: 80px;
1288
+ }
1289
 
1290
+ th#type {
1291
+ width: 50px;
1292
+ }
1293
 
1294
+ th#option_name {
1295
+ width: 100px;
1296
+ }
1297
 
1298
+ td.option_name.column-option_name > span:first-child {
1299
+ display: none;
1300
+ }
1301
 
1302
+ th#last_updated {
1303
+ width: 90px;
1304
+ }
1305
 
1306
+ th#view {
1307
+ width: 90px;
1308
+ }
1309
+ }
1310
 
1311
+ @media screen and (min-width: 960px) {
1312
+ th#status, th#provider, th#view {
1313
+ width: 100px;
1314
+ }
1315
 
1316
+ th#type {
1317
+ width: 80px;
1318
+ }
1319
 
1320
+ th#option_name {
1321
+ width: 150px;
1322
+ }
1323
 
1324
+ th#last_updated {
1325
+ width: 140px;
1326
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1327
  }
1328
 
1329
+ @media screen and (max-width: 782px) {
1330
+ table.wf-info-table {
1331
+ margin-top: 10px;
1332
+ }
1333
 
1334
+ table.wf-info-table th:first-child img {
1335
+ margin: 0 auto;
1336
+ display: block;
1337
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1338
 
1339
+ .wapk-button.wapk-button-xl {
1340
+ padding: 6px 14px;
1341
+ line-height: normal;
1342
+ font-size: 14px;
1343
+ vertical-align: middle;
1344
+ height: auto;
1345
+ margin-bottom: 4px;
1346
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1347
  }
1348
 
1349
+ .wapk-feed-docs .wapk-feed-cta {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1350
  margin: 0;
1351
  }
1352
 
1353
+ form.campaign_configurator {
1354
+ background: #FFF;
1355
+ padding: 20px 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1356
  }
1357
 
1358
+ .campaign_configurator table {
1359
+ margin: 0 auto;
1360
+ width: 51%;
1361
+ min-width: 574px;
1362
+ border: none;
1363
+ box-shadow: none;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1364
  }
1365
 
1366
+ .campaign_configurator th {
1367
+ min-width: 120px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1368
  }
1369
 
1370
+ @media screen and (max-width: 782px) {
1371
+ form.campaign_configurator {
1372
+ padding: 0;
1373
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1374
 
1375
+ .campaign_configurator table {
1376
+ width: auto;
1377
+ min-width: auto;
1378
+ max-width: 100%;
1379
+ }
1380
+
1381
+ .campaign_configurator th {
1382
+ min-width: auto;
1383
+ }
1384
  }
1385
 
1386
+
1387
+ #wf-tab-content-config td > input:not([type="checkbox"]):not([type="radio"]),
1388
+ #wf-tab-content-config td > select,
1389
+ #wf-tab-content-config td > textarea {
1390
+ width: 100% !important;
1391
  }
1392
 
1393
+ .woo-feed-filters td > div:nth-child(2n):not(.clear):not(.selectize) {
1394
+ width: 120px;
1395
+ display: block;
1396
  }
1397
 
1398
+ .woo-feed-filters,
1399
+ .woo-feed-ftp {
1400
+ margin: 15px auto 25px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1401
  }
1402
 
1403
+ .woo-feed-filters tr > td:first-child {
1404
+ width: 290px;
1405
+ padding-left: 40px;
 
 
 
 
 
1406
  }
1407
+
1408
+ .woo-feed-filters td > div:not(.clear) {
1409
+ float: left;
1410
+ margin-right: 10px;
1411
  }
admin/css/woo-feed-admin.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .wpf_spin,.wpf_spin_reverse{-webkit-animation:spin 1000ms infinite linear;animation:spin 1000ms infinite linear}.wpf_spin_reverse{animation-direction:reverse}.wpf_regenerate.disabled{color:#737373;box-shadow:none;cursor:not-allowed}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.wfbtn{background:#3498db;background-image:-webkit-linear-gradient(top,#3498db,#2980b9);background-image:-moz-linear-gradient(top,#3498db,#2980b9);background-image:-ms-linear-gradient(top,#3498db,#2980b9);background-image:-o-linear-gradient(top,#3498db,#2980b9);background-image:linear-gradient(to bottom,#3498db,#2980b9);-webkit-border-radius:17px;-moz-border-radius:17px;border-radius:17px;-webkit-box-shadow:0 1px 3px #666;-moz-box-shadow:0 1px 3px #666;box-shadow:0 1px 3px #666;font-family:Arial,sans-serif;color:#fff;font-size:20px;padding:10px 20px;border:solid #2b698f 3px;text-decoration:none}.wftooltip{display:none;position:absolute;border:1px solid #333;background-color:#161616;border-radius:5px;padding:10px;color:#fff;font-size:12px}.wfbtn:hover{background:#3cb0fd;background-image:-webkit-linear-gradient(top,#3cb0fd,#3498db);background-image:-moz-linear-gradient(top,#3cb0fd,#3498db);background-image:-ms-linear-gradient(top,#3cb0fd,#3498db);background-image:-o-linear-gradient(top,#3cb0fd,#3498db);background-image:linear-gradient(to bottom,#3cb0fd,#3498db);text-decoration:none}.makeFeedResponse{width:70%;color:green}.woo-feed-mapping-input{width:100%}.requiredIn{color:red}.generalInput{width:200px}.generalInput:not(.selectize-control){margin:5px auto}.error{color:red}.widefat td select,.widefat td input{max-width:100%}#wf_newRow{margin-left:0}.mtable tbody tr{height:25px;border:1px solid #CCC;text-align:left;align-items:baseline;font-weight:700}.mtable th:nth-child(1){width:17px}.mtable th:nth-child(2){width:160px}.mtable th:nth-child(3){width:100px}.mtable th:nth-child(4){width:100px}.mtable th:nth-child(5){width:150px}.mtable th:nth-child(6){width:100px}.mtable th:nth-child(7){width:150px}.mtable th:nth-child(8){width:90px}.mtable th:nth-child(9){width:29px}.wp-admin select.wf_mattributes,.wf_mattributes{width:150px;left:0;height:25px}div#wf-tab-content1 select:not([name^="output_type"]),div#wf-tab-content1 input{width:100%}div#wf-tab-content1 .dashicons{vertical-align:middle}.wf_attributes{width:150px;left:0}.wf_compare{max-width:245px;left:0}.wf_ps{width:100px;left:0}.wf_sortedtable{cursor:move}.sorted_table{position:relative}.sorted_table .dragged{position:absolute;opacity:.8;z-index:9999;background:#fff;width:100%;display:table}.sorted_table tbody tr.placeholder td{border:1px dashed #2cc185;height:46px}.mtable2 tbody tr{height:25px;border:1px solid #CCC;text-align:left;align-items:baseline;font-weight:700}.mtable2 th:nth-child(1){width:30px}.mtable2 th:nth-child(2){width:150px}.mtable2 th:nth-child(3){width:230px}.mtable2 th:nth-child(4){width:220px}.mtable2 th:nth-child(7){width:50px}.mtable2 th:nth-child(8){width:50px}.mtable2 th:nth-child(9){width:29px}.wfnoempty{width:120px}p{color:#222}.wf_tabs{position:relative;margin:0 auto;width:100%;list-style:none}.wf_tabs:after{display:table;clear:both;content:""}.wf_tabs li{float:left;width:20%;display:block;border:2px solid #CCC}.wf_tabs li > input[type="radio"][name="wf_tabs"]{position:absolute;top:auto;left:-9999px}.wf-tab-name{display:block;padding:15px;font-size:15px;font-weight:700;line-height:1;background:#fff;cursor:pointer;position:relative;text-align:center;text-transform:uppercase;color:#2CC185}.wf-tab-name:hover{background:#2CC185;color:#fff}.wf_tabs [id^="tab"]:checked + label{background:#2CC185;color:#fff}.wf_tabs .wf-tab-content{z-index:2;display:none;width:100%;font-size:.9rem;position:absolute;left:0;background:#fff;border:2px solid #CCC}.wf_tabs [id^="tab"]:checked ~ [id^="wf-tab-content"]{display:block}[id^="wf-tab-content"]{margin-bottom:40px}div#wf-tab-content2 table:first-child{padding:10px 0}div#wf-tab-content2 table:first-child td:nth-child(1){width:260px}div#wf-tab-content2 table:first-child td:nth-child(2){width:260px}table.feed-actions tr td:last-child{text-align:right}select.selectize{display:none}body.no-js select.selectize{display:block!important}.selectize-dropdown .active{background-color:#edf9ff}.selectize-dropdown .create{padding:5px 8px}.wapk-selectize-item{background:#0073aa!important;color:#f1f1f1!important;font-weight:700!important;border-color:#0073aa!important;padding-left:5px;padding-right:5px}.selectize-input.full #googleTaxonomyId-selectized{opacity:0;position:absolute;left:-10000px}.selectize-dropdown [data-selectable].option{cursor:default}.selectize-control.plugin-remove_button [data-value] .remove{border-left:1px solid #f1f1f1!important}.selectize-dropdown .optgroup-header{font-weight:700;background:#efefef;color:#5a5a5a}.selectize-dropdown [data-selectable].option{cursor:pointer}.wf_status_wrap label{width:50px;height:25px;box-sizing:border-box;border:1px solid;float:left;border-radius:100px;position:relative;cursor:pointer;transition:.3s ease}input[class=woo_feed_status_input]:checked + label{background:#55e868}input[class=woo_feed_status_input]:checked + label:before{left:25px}.wf_status_wrap label:before{transition:.3s ease;content:'';width:20px;height:20px;position:absolute;background:#fff;left:2px;top:2px;box-sizing:border-box;border:1px solid;color:#000;border-radius:100px}.widefat td.column-url,.widefat th.column-url,.column-url{color:#008779;font-weight:700}.feed-progress-container{width:100%;color:#fff;text-align:center;font-weight:300}.feed-progress-bar{width:100%;background:#eee;padding:3px;border-radius:3px;box-shadow:inset 0 1px 3px rgba(0,0,0,.2)}.feed-progress-bar-fill{height:20px;display:block;background:#3DC264;width:0;border-radius:3px;-webkit-transition:width .8s ease;transition:width .8s ease}.feed-progress-status{float:left;font-weight:700;color:#00008b}.feed-progress-percentage{text-align:right;font-weight:bolder;color:#41f49d;font-family:'Arial Black',sans-serif;font-size:large}#wpbody-content.woofeed-body-content{overflow:visible!important}.clippy{position:relative;width:13px;margin-top:-3px;margin-left:3px;top:3px}.column-url .clippy{display:none}.column-url:hover .clippy{display:inline-block}.tooltipped{position:relative}.tooltipped:after{position:absolute;z-index:1000000;display:none;padding:5px 8px;font:normal normal 11px/1.5 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";color:#fff;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:rgba(0,0,0,.8);border-radius:3px;-webkit-font-smoothing:subpixel-antialiased}.tooltipped:before{position:absolute;z-index:1000001;display:none;width:0;height:0;color:rgba(0,0,0,.8);pointer-events:none;content:"";border:5px solid transparent}.tooltipped:hover:before,.tooltipped:hover:after,.tooltipped:active:before,.tooltipped:active:after,.tooltipped:focus:before,.tooltipped:focus:after{display:inline-block;text-decoration:none}.tooltipped-multiline:hover:after,.tooltipped-multiline:active:after,.tooltipped-multiline:focus:after{display:table-cell}.tooltipped-s:after,.tooltipped-se:after,.tooltipped-sw:after{top:100%;right:50%;margin-top:5px}.tooltipped-s:before,.tooltipped-se:before,.tooltipped-sw:before{top:auto;right:50%;bottom:-5px;margin-right:-5px;border-bottom-color:rgba(0,0,0,.8)}.tooltipped-se:after{right:auto;left:50%;margin-left:-15px}.tooltipped-sw:after{margin-right:-15px}.tooltipped-n:after,.tooltipped-ne:after,.tooltipped-nw:after{right:50%;bottom:100%;margin-bottom:5px}.tooltipped-n:before,.tooltipped-ne:before,.tooltipped-nw:before{top:-5px;right:50%;bottom:auto;margin-right:-5px;border-top-color:rgba(0,0,0,.8)}.tooltipped-ne:after{right:auto;left:50%;margin-left:-15px}.tooltipped-nw:after{margin-right:-15px}.tooltipped-s:after,.tooltipped-n:after{-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%)}.tooltipped-w:after{right:100%;bottom:50%;margin-right:5px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%)}.tooltipped-w:before{top:50%;bottom:50%;left:-5px;margin-top:-5px;border-left-color:rgba(0,0,0,.8)}.tooltipped-e:after{bottom:50%;left:100%;margin-left:5px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%)}.tooltipped-e:before{top:50%;right:-5px;bottom:50%;margin-top:-5px;border-right-color:rgba(0,0,0,.8)}.tooltipped-multiline:after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-break:break-word;word-wrap:normal;white-space:pre-line;border-collapse:separate}.tooltipped-multiline.tooltipped-s:after,.tooltipped-multiline.tooltipped-n:after{right:auto;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltipped-multiline.tooltipped-w:after,.tooltipped-multiline.tooltipped-e:after{right:100%}@media screen and (min-width: 0\0){.tooltipped-multiline:after{width:250px}}.tooltipped-sticky:before,.tooltipped-sticky:after{display:inline-block}.tooltipped-sticky.tooltipped-multiline:after{display:table-cell}.fullscreen-overlay-enabled.dark-theme .tooltipped:after{color:#000;background:rgba(255,255,255,.8)}.fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-s:before,.fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-se:before,.fullscreen-overlay-enabled.dark-theme .tooltipped .tooltipped-sw:before{border-bottom-color:rgba(255,255,255,.8)}.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-n:before,.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-ne:before,.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-nw:before{border-top-color:rgba(255,255,255,.8)}.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-e:before{border-right-color:rgba(255,255,255,.8)}.fullscreen-overlay-enabled.dark-theme .tooltipped.tooltipped-w:before{border-left-color:rgba(255,255,255,.8)}ul.tracker_collection_list{list-style:initial;padding:initial;margin:-10px 0 0 30px;font-size:11px!important}ul.tracker_collection_list li{margin:0}table.wf-info-table th,table.wf-rate-table th{vertical-align:middle;text-align:center;max-width:100%;font-weight:500}table.wf-info-table th strong,table.wf-rate-table th strong{font-weight:700}table.wf-info-table th:first-child img{margin:0 0 -5px 5px}table.wf-rate-table a{color:#0073aa}table.wf-rate-table a.review-star:after{content:"\f155\f155\f155\f155\f155"!important;font-family:dashicons;font-size:10px;font-weight:100;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#0073aa;text-decoration:underline}#adminmenu #toplevel_page_webappick-manage-feeds div.wp-menu-image::before{content:"";background:url(../images/woo-feed-icon.svg) no-repeat center center;background-size:20px 20px;opacity:.6;filter:alpha(opacity=60)}#adminmenu #toplevel_page_webappick-manage-feeds:hover div.wp-menu-image::before,#adminmenu #toplevel_page_webappick-manage-feeds.wp-has-current-submenu div.wp-menu-image::before{opacity:1;filter:alpha(opacity=100)}.wapk-admin,.wapk-admin *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.wapk-admin{position:relative;display:block;-webkit-hyphens:manual;-ms-hyphens:manual;hyphens:manual;color:#1B2730;margin:0 0 0 -10px}@media screen and (min-width: 783px){.wapk-admin{margin:0 0 0 -20px}}.wapk-admin h1,.wapk-admin h2,.wapk-admin h3,.wapk-admin h4,.wapk-admin h5,.wapk-admin h6,.wapk-admin p{color:#1B2730}.text-center{text-align:center}.wapk-admin sup{vertical-align:baseline;position:relative;top:-6px}.wapk-admin sub{vertical-align:baseline;position:relative;top:4px}.wapk-admin .wapk-section [class$=icon32] + h2,.wapk-admin .wapk-section h1,.wapk-admin .wapk-section > h2:first-child{font-size:23px;font-weight:400;margin:0;padding:9px 0 4px;line-height:1.3}.wapk-admin .wapk-section,.wapk-admin > .notice{margin:10px 20px 0 22px;position:relative;display:block}.clear:after{content:"";display:table;clear:both}.wapk-admin span.help{display:block;float:left;width:100%;font-size:.9em;color:#636363;margin-top:5px;font-weight:500}.wapk-admin span.help .dashicons{width:11px;height:12px;font-size:inherit;vertical-align:middle}.wapk-feed-docs .postbox{width:355px;margin-right:20px;display:inline-block;vertical-align:top}@media only screen and (max-width: 850px){.wapk-feed-docs .postbox{display:block;width:auto;float:none;margin-right:auto}}.wapk-feed-docs .postbox .hndle{font-size:14px;padding:8px 12px;margin:0;line-height:1.4;cursor:pointer}.wapk-feed-docs .postbox .dashicons{color:#ccc}.wapk-feed-docs .postbox a{text-decoration:none}.wapk-feed-docs .postbox .inside,.wapk-feed-docs .postbox ul{margin-bottom:0}.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}.wapk-feed-docs .postbox.closed .toggle-indicator:before{content:"\F140"}.wapk-feed-docs .postbox li{width:100%;display:block;float:left}.wapk-feed-docs .postbox li span,.wapk-feed-docs .postbox li a{display:inline-block;float:left}.wapk-feed-docs .postbox li span{margin-right:4px}.wapk-feed-docs .postbox li a{width:calc(100% - 24px)}.wapk-section #post-body.columns-2 #side-sortables{min-height:196px}#poststuff #feed_merchant_info .inside{margin:0;padding:0}#feed_merchant_info ul.data{margin-left:24px;margin-top:5px}#feed_merchant_info ul.data li{margin-bottom:5px}.merchant-info-section{padding:6px 10px 8px}.generateFeed .wf-tab-content table:first-child{border:none;box-shadow:none}.generateFeed table th{font-weight:700}.wp-submenu li span.woo-feed-docs{font-weight:700;color:#f18500}.wp-submenu li:hover span.woo-feed-docs,.wp-submenu li.current span.woo-feed-docs{color:#ce7304}.wapk-admin .wapk-feed-docs .postbox .hndle{cursor:default}.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}.wapk-cta-icon .dashicons{font-size:100px;width:100px;height:auto;margin:0 10px -8px 0;color:#02658c}.wapk-cta-content{width:50%}.wapk-cta-content h2{font-size:2em;margin:.5em 0}.wapk-cta-action a.wapk-button{font-size:24px;height:auto!important;padding:10px 20px}@media (max-width: 600px){.wapk-cta{display:block;text-align:center;padding:4em 0}.wapk-cta-content{width:100%;margin:2em 0}}.wapk-button,.wapk-button-secondary{color:#00D4D4;border-color:#00D4D4}.wapk-button,.wapk-button-primary,.wapk-button-secondary{display:inline-block;text-decoration:none;font-size:13px;line-height:2.15384615;min-height:30px;margin:0;padding:0 10px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box}.wapk-button > svg,.wapk-button-secondary > svg{width:15px;margin-left:5px;fill:#00D4D4}.wapk-button > .dashicons,.wapk-button-secondary > .dashicons{color:#00D4D4}.wapk-button.hover,.wapk-button:hover,.wapk-button-secondary:hover,.wapk-button.focus,.wapk-button:focus,.wapk-button-secondary:focus{border-color:#0bb;color:#0bb}.wapk-button.hover > svg,.wapk-button:hover > svg,.wapk-button-secondary:hover > svg,.wapk-button.focus > svg,.wapk-button:focus > svg,.wapk-button-secondary:focus > svg{fill:#0bb}.wapk-button.hover > .dashicons,.wapk-button:hover > .dashicons,.wapk-button-secondary:hover > .dashicons,.wapk-button.focus > .dashicons,.wapk-button:focus > .dashicons,.wapk-button-secondary:focus > .dashicons{color:#0bb}.wapk-button.focus,.wapk-button:focus,.wapk-button-secondary:focus{border-color:#00D4D4;color:#0bb;box-shadow:0 0 0 1px #00D4D4}.wapk-button.focus > svg,.wapk-button:focus > svg,.wapk-button-secondary:focus > svg{fill:#0bb}.wapk-button.focus > .dashicons,.wapk-button:focus > .dashicons,.wapk-button-secondary:focus > .dashicons{color:#0bb}.wapk-button:active{background:#0bb;border-color:#0bb}.wapk-button.active,.wapk-button.active:focus,.wapk-button.active:hover{border-color:#0bb;color:#0bb;box-shadow:inset 0 2px 5px -3px #0bb}.wapk-button.active > svg,.wapk-button.active:focus > svg,.wapk-button.active:hover > svg{fill:#0bb}.wapk-button.active > .dashicons,.wapk-button.active:focus > .dashicons,.wapk-button.active:hover > .dashicons{color:#0bb}.wapk-button-primary{background:#00D4D4;border-color:#00D4D4;color:#fff;box-shadow:0 1px 0 #0bb;text-shadow:0 -1px 1px #00bbbb,1px 0 1px #00bbbb,0 1px 1px #00bbbb,-1px 0 1px #0bb}.wapk-button-primary > svg{fill:#fff}.wapk-button-primary:hover,.wapk-button-primary:focus{background:#00e3e3;border-color:#00c5c5;color:#fff}.wapk-button-primary:hover > svg,.wapk-button-primary:focus > svg{fill:#fff}.wapk-button-primary:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px #00D4D4}.wapk-button-primary:active{background:#0bb;border-color:#0bb;color:#fff}.wapk-button-primary:active > svg{fill:#fff}.wapk-button-primary.active,.wapk-button-primary.active:focus,.wapk-button-primary.active:hover{background:#00D4D4;color:#fff;border-color:#088;box-shadow:inset 0 2px 5px -3px #000}.wapk-button-primary.active > svg,.wapk-button-primary.active:focus > svg,.wapk-button-primary.active:hover > svg{fill:#fff}.wapk-button-primary[disabled],.wapk-button-primary:disabled,.wapk-button-primary.wapk-button-primary-disabled,.wapk-button-primary.disabled{color:#c7d1d1!important;background:#2ff!important;border-color:#2ff!important;text-shadow:none!important}.wapk-button-primary[disabled] > svg,.wapk-button-primary:disabled > svg,.wapk-button-primary.wapk-button-primary-disabled > svg,.wapk-button-primary.disabled > svg{fill:#c7d1d1!important}.wapk-button.wapk-button-primary.wapk-button-hero{box-shadow:0 2px 0 #0bb}.wapk-button.wapk-button-primary.wapk-button-hero:focus{box-shadow:0 2px 0 #00bbbb,0 1px 0 #00c5c5,0 0 2px 1px #0ee}.wapk-button.wapk-button-primary.wapk-button-hero.active,.wapk-button.wapk-button-primary.wapk-button-hero.active:hover,.wapk-button.wapk-button-primary.wapk-button-hero.active:focus,.wapk-button.wapk-button-primary.wapk-button-hero:active{box-shadow:inset 0 3px 0 #00a1a1}.wapk-button-group > .wapk-button.active{border-color:#00D4D4}.wapk-button.wapk-button-xl,.wapk-button-group.wapk-button-xl .wapk-button{height:30px;line-height:28px;padding:0 12px 2px}.wapk-button.wapk-button-hero,.wapk-button-group.wapk-button-hero .wapk-button{font-size:18px;height:50px;line-height:48px;padding:0 36px;min-height:46px}@media screen and (min-width: 782px){th#status{width:80px}th#provider{width:80px}th#type{width:50px}th#option_name{width:100px}td.option_name.column-option_name > span:first-child{display:none}th#last_updated{width:90px}th#view{width:90px}}@media screen and (min-width: 960px){th#status,th#provider,th#view{width:100px}th#type{width:80px}th#option_name{width:150px}th#last_updated{width:140px}}@media screen and (max-width: 782px){table.wf-info-table{margin-top:10px}table.wf-info-table th:first-child img{margin:0 auto;display:block}.wapk-button.wapk-button-xl{padding:6px 14px;line-height:normal;font-size:14px;vertical-align:middle;height:auto;margin-bottom:4px}}.wapk-feed-docs .wapk-feed-cta{margin:0}form.campaign_configurator{background:#FFF;padding:20px 0}.campaign_configurator table{margin:0 auto;width:51%;min-width:574px;border:none;box-shadow:none}.campaign_configurator th{min-width:120px}@media screen and (max-width: 782px){form.campaign_configurator{padding:0}.campaign_configurator table{width:auto;min-width:auto;max-width:100%}.campaign_configurator th{min-width:auto}}#wf-tab-content-config td > input:not([type="checkbox"]):not([type="radio"]),#wf-tab-content-config td > select,#wf-tab-content-config td > textarea{width:100%!important}.woo-feed-filters td > div:nth-child(2n):not(.clear):not(.selectize){width:120px;display:block}.woo-feed-filters,.woo-feed-ftp{margin:15px auto 25px}.woo-feed-filters tr > td:first-child{width:290px;padding-left:40px}.woo-feed-filters td > div:not(.clear){float:left;margin-right:10px}
admin/js/fancy-select.js ADDED
@@ -0,0 +1,442 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**!
2
+ * WooFeed Fancy Select
3
+ * @version 1.0.0
4
+ * @copyright 2020 WebAppick
5
+ * @author Kudratullah <mhamudul.hk@gmail.com>
6
+ */
7
+ (function ($, window, document ) {
8
+ "use strict";
9
+ /**
10
+ * FancySelect Constructor
11
+ * @param {jQuery|HTMLElement} $select
12
+ * @param {Object} [options]
13
+ * @constructor
14
+ */
15
+ let FancySelect = function ( $select, options ) {
16
+ let self = this,
17
+ defaults = {
18
+ options: [],
19
+ optgroups: [],
20
+ items: [],
21
+ placeholder: '',
22
+ delimiter: ',',
23
+ splitOn: null,
24
+ persist: !0,
25
+ diacritics: !0,
26
+ create: !1,
27
+ createOnBlur: !1,
28
+ createFilter: null,
29
+ highlight: !0,
30
+ openOnFocus: !0,
31
+ maxOptions: 1e3,
32
+ maxItems: null,
33
+ maxItemShow: 3,
34
+ hideSelected: null,
35
+ addPrecedence: !1,
36
+ selectOnTab: !1,
37
+ preload: !1,
38
+ allowEmptyOption: !1,
39
+ closeAfterSelect: !1,
40
+ scrollDuration: 60,
41
+ loadThrottle: 300,
42
+ loadingClass: "loading",
43
+ dataAttr: "data-data",
44
+ optgroupField: "optgroup",
45
+ valueField: "value",
46
+ labelField: "text",
47
+ disabledField: "disabled",
48
+ optgroupLabelField: "label",
49
+ optgroupValueField: "value",
50
+ lockOptgroupOrder: !1,
51
+ sortField: "$order",
52
+ searchField: ["text"],
53
+ searchConjunction: "and",
54
+ mode: null,
55
+ wrapperClass: "selectize-control",
56
+ inputClass: "selectize-input",
57
+ dropdownClass: "selectize-dropdown",
58
+ dropdownContentClass: "selectize-dropdown-content",
59
+ dropdownParent: null,
60
+ copyClassesToDropdown: !0,
61
+ render: {}
62
+ },
63
+ settings = $.extend( true, {}, defaults, options ),
64
+ select = $select[0];
65
+ select.fancySelect = self;
66
+ self.order = 0;
67
+ let computedStyle = window.getComputedStyle && window.getComputedStyle( select, null );
68
+ let dir = computedStyle ? computedStyle.getPropertyValue('direction') : input.currentStyle && input.currentStyle.direction;
69
+ dir = dir || $select.parents('[dir]:first').attr('dir') || '';
70
+ self.computedStyle = computedStyle;
71
+ // for now, android support in general is too spotty to support validity
72
+ const SUPPORTS_VALIDITY_API = !/android/i.test(window.navigator.userAgent) && !!document.createElement('input').validity;
73
+ // helper (private) methods
74
+ const debounce = function(fn, delay) {
75
+ let timeout;
76
+ return function() {
77
+ let self = this;
78
+ let args = arguments;
79
+ window.clearTimeout(timeout);
80
+ timeout = window.setTimeout(function() {
81
+ fn.apply(self, args);
82
+ }, delay);
83
+ };
84
+ };
85
+ const hash_key = ( str ) => str + '';
86
+ let optionsMap = {};
87
+ const optHelper = {
88
+ readData: function($el) {
89
+ const data = self.dataAttr && $el.attr(self.dataAttr);
90
+ if (typeof data === 'string' && data.length) {
91
+ return JSON.parse(data);
92
+ }
93
+ return null;
94
+ },
95
+ addOption: function($option, group) {
96
+ $option = $($option);
97
+
98
+ const value = hash_key($option.val());
99
+ if (!value && !settings.allowEmptyOption) return;
100
+
101
+ // if the option already exists, it's probably been
102
+ // duplicated in another optgroup. in this case, push
103
+ // the current group to the "optgroup" property on the
104
+ // existing option so that it's rendered in both places.
105
+ if (optionsMap.hasOwnProperty(value)) {
106
+ if (group) {
107
+ const arr = optionsMap[value][field_optgroup];
108
+ if (!arr) {
109
+ optionsMap[value][field_optgroup] = group;
110
+ } else if (!$.isArray(arr)) {
111
+ optionsMap[value][field_optgroup] = [arr, group];
112
+ } else {
113
+ arr.push(group);
114
+ }
115
+ }
116
+ return;
117
+ }
118
+
119
+ var option = optHelper.readData($option) || {};
120
+ option[self.settings.labelField] = option[self.settings.labelField] || $option.text();
121
+ option[self.settings.valueField] = option[self.settings.valueField] || value;
122
+ option[self.settings.disabledField] = option[self.settings.disabledField] || $option.prop('disabled');
123
+ option[self.settings.optgroupField] = option[self.settings.optgroupField] || group;
124
+ option.$order = ++self.order;
125
+
126
+ optionsMap[value] = option;
127
+ self.settings.options.push(option);
128
+
129
+ if ($option.is(':selected')) {
130
+ self.settings.items.push(value);
131
+ }
132
+ },
133
+ addGroup: function($optgroup) {
134
+ var i, n, id, optgroup, $options;
135
+
136
+ $optgroup = $($optgroup);
137
+ id = $optgroup.attr('label');
138
+
139
+ if (id) {
140
+ optgroup = optHelper.readData($optgroup) || {};
141
+ optgroup[self.settings.optgroupLabelField] = id;
142
+ optgroup[self.settings.optgroupValueField] = id;
143
+ optgroup[self.settings.disabledField] = $optgroup.prop('disabled');
144
+ optgroup.$order = ++self.order;
145
+ self.settings.optgroups.push(optgroup);
146
+ }
147
+
148
+ $options = $('option', $optgroup);
149
+ for (i = 0, n = $options.length; i < n; i++) {
150
+ optHelper.addOption($options[i], id);
151
+ }
152
+ },
153
+ };
154
+ // setup default state
155
+ $.extend(self, {
156
+ settings : settings,
157
+ $select : $select,
158
+ tabIndex : $select.attr('tabindex') || '',
159
+ tagType : 1,
160
+ rtl : /rtl/i.test(dir),
161
+ multiple : $select.attr('multiple'),
162
+ eventNS : '.FancySelect' + (++FancySelect.count),
163
+ highlightedValue : null,
164
+ isBlurring : false,
165
+ isOpen : false,
166
+ isDisabled : false,
167
+ isRequired : $select.is('[required]'),
168
+ isInvalid : false,
169
+ isLocked : false,
170
+ isFocused : false,
171
+ isInputHidden : false,
172
+ isSetup : false,
173
+ isRendered : false,
174
+ isShiftDown : false,
175
+ isCmdDown : false,
176
+ isCtrlDown : false,
177
+ ignoreFocus : false,
178
+ ignoreBlur : false,
179
+ ignoreHover : false,
180
+ hasOptions : false,
181
+ currentResults : null,
182
+ lastValue : '',
183
+ caretPos : 0,
184
+ loading : 0,
185
+ loadedSearches : {},
186
+
187
+ $activeOption : null,
188
+ $activeItems : [],
189
+
190
+ optgroups : {},
191
+ options : {},
192
+ userOptions : {},
193
+ items : {},
194
+ renderCache : {},
195
+ onSearchChange : settings.loadThrottle === null ? self.onSearchChange : debounce(self.onSearchChange, settings.loadThrottle)
196
+ });
197
+
198
+ if ( '' === self.settings.placeholder ) {
199
+ self.settings.placeholder = $select.attr('placeholder') || $select.attr('data-placeholder');
200
+ if (!self.settings.placeholder && !self.settings.allowEmptyOption) {
201
+ self.settings.placeholder = $select.children('option[value=""]').text();
202
+ }
203
+ }
204
+
205
+ self.settings.maxItems = self.multiple ? null : 1;
206
+
207
+ for (let i = 0, n = self.$select.children().length; i < n; i++) {
208
+ let tagName = self.$select.children()[i].tagName.toLowerCase();
209
+ if (tagName === 'optgroup') {
210
+ optHelper.addGroup(self.$select.children()[i]);
211
+ } else if (tagName === 'option') {
212
+ optHelper.addOption(self.$select.children()[i]);
213
+ }
214
+ }
215
+
216
+ self.$wrapper = $('<div class="fancy-picker">').addClass( $select.attr('class') );
217
+ if ( self.computedStyle.hasOwnProperty('width') ) {
218
+ self.$wrapper.css( { width: self.computedStyle.width } );
219
+ }
220
+ self.$outputWrapper = $('<div class="fancy-picker-picked">').appendTo( self.$wrapper );
221
+ self.originalPlaceholder = $('<span class="fancy-picker-placeholder">').appendTo( self.$outputWrapper );
222
+ self.dataPlaceholder = $('<span class="fancy-picker-data">').appendTo( self.$outputWrapper );
223
+ self.dataCountPlaceholder = $('<span class="fancy-picker-count">').appendTo( self.$outputWrapper );
224
+ self.$dropdown = $('<div class="fancy-picker-ui">').appendTo( self.$wrapper );
225
+ self.$dropdownContent = $('<div class="fancy-picker-content">').appendTo( self.$dropdown );
226
+
227
+ self.setup();
228
+ };
229
+ FancySelect.count = 0;
230
+
231
+ // public methods
232
+ $.extend(FancySelect.prototype, {
233
+ /**
234
+ * Creates all elements and sets up event bindings.
235
+ */
236
+ setup: function() {
237
+ let self = this;
238
+ self.revertSettings = {
239
+ $children : self.$select.children().detach(),
240
+ tabindex : self.$select.attr('tabindex')
241
+ };
242
+ self.$select.attr('tabindex', -1).hide().after(self.$wrapper);
243
+ self.$select.data('FancySelect', self);
244
+ self.$select.addClass('FancySelectInit');
245
+ self.settings.items.sort();
246
+ if ( self.preload ) {
247
+ self.render();
248
+ }
249
+ self.updatePlaceholder();
250
+ self.updateOriginalInput();
251
+ self.$wrapper.on( 'click'+ self.eventNS, '.fancy-picker-picked', function( e ) {
252
+ self.$select.trigger( 'show' );
253
+ if ( ! self.isRendered ) {
254
+ self.render();
255
+ }
256
+ self.$wrapper.toggleClass('active');
257
+ self.$select.trigger( 'shown' );
258
+ } );
259
+ $(document).on( 'click' + self.eventNS, function( e ) {
260
+ if(!$(e.target).closest(self.$wrapper).length) {
261
+ self.$select.trigger( 'hide' );
262
+ self.$wrapper.removeClass('active');
263
+ self.$select.trigger( 'hidden' );
264
+ }
265
+ });
266
+ self.$wrapper.on( 'click' + self.eventNS, '.fancy-picker-option:not(.disabled)', function( e ) {
267
+ e.preventDefault();
268
+ let current = $(this), selected = false, value = current.data('value');
269
+ if ( self.multiple ) {
270
+ if ( !current.hasClass( 'selected' ) ) {
271
+ selected = true;
272
+ current.addClass( 'selected' )
273
+ } else current.removeClass( 'selected' );
274
+
275
+ if ( selected ) {
276
+ self.settings.items.push( value );
277
+ } else {
278
+ self.settings.items = self.settings.items.filter( x => x != value );
279
+ }
280
+ self.settings.items.sort();
281
+ } else {
282
+ self.$dropdownContent.find('.fancy-picker-option').not(current).removeClass('selected');
283
+ current.addClass('selected');
284
+ selected = true;
285
+ self.settings.items = [ value ];
286
+ self.$wrapper.removeClass('active');
287
+ }
288
+ self.updatePlaceholder();
289
+ self.updateOriginalInput();
290
+ });
291
+ self.$select.trigger('initialize' );
292
+ },
293
+ updateOriginalInput: function( silent ) {
294
+ let self = this, options = [], changed = false;
295
+ silent = ( true === silent ) ? true : false;
296
+ for ( let i = 0, n = self.settings.items.length; i < n; i++) {
297
+ let selected = self.getSelectedOptionData( self.settings.items[i] );
298
+ if ( selected ) {
299
+ options.push('<option value="' + self.settings.items[i] + '" selected="selected">' + selected[self.settings.labelField] || '' + '</option>');
300
+ changed = true;
301
+ }
302
+ }
303
+ self.$select.html( options.join('') );
304
+ if ( ! silent && changed ) {
305
+ self.$select.trigger( 'change' );
306
+ }
307
+ },
308
+ render: function() {
309
+ let self = this;
310
+ let dropdownItems = [];
311
+ for ( let i = 0, n = self.settings.options.length; i < n; i++) {
312
+ let option = self.settings.options[i],
313
+ classes = self.isSelected( option[self.settings.valueField] ) ? 'fancy-picker-option selected' : 'fancy-picker-option';
314
+ dropdownItems.push( `<div class="${classes}" data-value="${option[self.settings.valueField]}">${option[self.settings.labelField]}</div>` );
315
+ }
316
+ self.$dropdownContent.html(dropdownItems.join(''));
317
+ self.$select.trigger( 'rendered' );
318
+ self.isRendered = true;
319
+ },
320
+ updatePlaceholder: function() {
321
+ let self = this;
322
+
323
+ self.originalPlaceholder.text( self.settings.placeholder );
324
+ if ( self.settings.items.length ) {
325
+ self.originalPlaceholder.hide();
326
+ } else {
327
+ self.originalPlaceholder.show();
328
+ }
329
+ let placeholderData = [];
330
+ let maxItemShow = self.settings.items.length > self.settings.maxItemShow ? self.settings.maxItemShow - 1 : self.settings.maxItemShow;
331
+ self.settings.items.slice( 0, maxItemShow ).forEach( item => {
332
+ let data = self.getSelectedOptionData( item );
333
+ if( data ) placeholderData.push( `<span>${data[self.settings.labelField]}</span>` );
334
+ });
335
+ self.dataPlaceholder.html(placeholderData.join( `<span class="fancy-picker-separator">${self.settings.delimiter}</span> ` ));
336
+ if( self.settings.items.length > self.settings.maxItemShow ) {
337
+ let title = [];
338
+ self.settings.items.forEach( item => {
339
+ let data = self.getSelectedOptionData( item );
340
+ if( data ) title.push( data[self.settings.labelField] );
341
+ });
342
+ self.dataCountPlaceholder.attr('title', title.join( self.settings.delimiter.trim() + ' ' ) );
343
+ self.dataCountPlaceholder.html( '+' + ( self.settings.items.length - maxItemShow ) + ' More &hellip;' )
344
+ } else {
345
+ self.dataCountPlaceholder.removeAttr( 'title' );
346
+ self.dataCountPlaceholder.html('');
347
+ }
348
+ self.$select.trigger( 'placeholderChanged' )
349
+ },
350
+ getSelectedOptionData: function( has_key ) {
351
+ let self = this;
352
+ let selected = self.settings.options.filter( (x)=> x[self.settings.valueField] == has_key );
353
+ return selected.length ? selected[0]: false;
354
+ },
355
+ isSelected: function( has_key ) {
356
+ let self = this;
357
+ return self.settings.items.filter( x => x == has_key ).length > 0;
358
+ },
359
+ /**
360
+ * Completely destroys the control and
361
+ * unbinds all event listeners so that it can
362
+ * be garbage collected.
363
+ */
364
+ destroy: function() {
365
+ let self = this;
366
+ self.$select.trigger('destroy');
367
+ self.trigger('destroy');
368
+ self.off();
369
+
370
+ self.$select
371
+ .html('')
372
+ .append(self.revertSettings.$children)
373
+ .removeAttr('tabindex')
374
+ .removeClass('selectized')
375
+ .attr({tabindex: self.revertSettings.tabindex})
376
+ .show();
377
+
378
+ self.$control_input.removeData('grow');
379
+ self.$select.removeData('selectize');
380
+
381
+ if (--FancySelect.count == 0 && FancySelect.$testInput) {
382
+ FancySelect.$testInput.remove();
383
+ FancySelect.$testInput = undefined;
384
+ }
385
+
386
+ // this doesn't fire on create feed. as fields are loaded via ajax.
387
+ // add custom event with the form object (with namespace)
388
+ // trigger event on form.init()
389
+ // remove previous listener on from.init(). first. so multiple listener not executed.
390
+ // see selectize https://github.com/selectize/selectize.js/blob/master/src/selectize.js#L2097
391
+ // add event listener here...
392
+
393
+ $(window).off(self.eventNS);
394
+ $(document).off(self.eventNS);
395
+ $(document.body).off(self.eventNS);
396
+ delete self.$select[0].fancySelect;
397
+ },
398
+
399
+ /**
400
+ * MicroEvent - to make any js object an event emitter
401
+ *
402
+ * - pure javascript - server compatible, browser compatible
403
+ * - dont rely on the browser doms
404
+ * - super simple - you get it immediatly, no mistery, no magic involved
405
+ *
406
+ * @author Jerome Etienne (https://github.com/jeromeetienne)
407
+ */
408
+ on: function(event, fct){
409
+ this._events = this._events || {};
410
+ this._events[event] = this._events[event] || [];
411
+ this._events[event].push(fct);
412
+ },
413
+ off: function(event, fct){
414
+ const n = arguments.length;
415
+ if (n === 0) return delete this._events;
416
+ if (n === 1) return delete this._events[event];
417
+
418
+ this._events = this._events || {};
419
+ if (event in this._events === false) return;
420
+ this._events[event].splice(this._events[event].indexOf(fct), 1);
421
+ },
422
+ trigger: function(event /* , args... */){
423
+ this._events = this._events || {};
424
+ if (event in this._events === false) return;
425
+ for (let i = 0; i < this._events[event].length; i++){
426
+ this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));
427
+ }
428
+ }
429
+ });
430
+ /**
431
+ * jQuery Wrapper
432
+ * @param {Object} [user_options]
433
+ * @returns {jquery|HTMLElement}
434
+ */
435
+ $.fn.fancySelect = function( user_options ) {
436
+ return this.each(function() {
437
+ if (this.fancySelect) return;
438
+ if ( 'select' !== this.tagName.toLowerCase() ) return;
439
+ new FancySelect( $(this), user_options )
440
+ });
441
+ };
442
+ })(jQuery, window, document);
admin/js/fancy-select.min.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ /**!
2
+ * WooFeed Fancy Select
3
+ * @version 1.0.0
4
+ * @copyright 2020 WebAppick
5
+ * @author Kudratullah <mhamudul.hk@gmail.com>
6
+ */
7
+ !function(v,f,m){"use strict";function $(e,t){var r=this,l=v.extend(!0,{},{options:[],optgroups:[],items:[],placeholder:"",delimiter:",",splitOn:null,persist:!0,diacritics:!0,create:!1,createOnBlur:!1,createFilter:null,highlight:!0,openOnFocus:!0,maxOptions:1e3,maxItems:null,maxItemShow:3,hideSelected:null,addPrecedence:!1,selectOnTab:!1,preload:!1,allowEmptyOption:!1,closeAfterSelect:!1,scrollDuration:60,loadThrottle:300,loadingClass:"loading",dataAttr:"data-data",optgroupField:"optgroup",valueField:"value",labelField:"text",disabledField:"disabled",optgroupLabelField:"label",optgroupValueField:"value",lockOptgroupOrder:!1,sortField:"$order",searchField:["text"],searchConjunction:"and",mode:null,wrapperClass:"selectize-control",inputClass:"selectize-input",dropdownClass:"selectize-dropdown",dropdownContentClass:"selectize-dropdown-content",dropdownParent:null,copyClassesToDropdown:!0,render:{}},t),i=e[0];(i.fancySelect=r).order=0;var s=f.getComputedStyle&&f.getComputedStyle(i,null),n=s?s.getPropertyValue("direction"):input.currentStyle&&input.currentStyle.direction;n=n||e.parents("[dir]:first").attr("dir")||"",r.computedStyle=s,/android/i.test(f.navigator.userAgent)||m.createElement("input").validity;var a,o,d,p={},c={readData:function(e){var t=r.dataAttr&&e.attr(r.dataAttr);return"string"==typeof t&&t.length?JSON.parse(t):null},addOption:function(e,t){e=v(e);var i=e.val()+"";if(i||l.allowEmptyOption)if(p.hasOwnProperty(i)){if(t){var s=p[i][field_optgroup];s?v.isArray(s)?s.push(t):p[i][field_optgroup]=[s,t]:p[i][field_optgroup]=t}}else{var n=c.readData(e)||{};n[r.settings.labelField]=n[r.settings.labelField]||e.text(),n[r.settings.valueField]=n[r.settings.valueField]||i,n[r.settings.disabledField]=n[r.settings.disabledField]||e.prop("disabled"),n[r.settings.optgroupField]=n[r.settings.optgroupField]||t,n.$order=++r.order,p[i]=n,r.settings.options.push(n),e.is(":selected")&&r.settings.items.push(i)}},addGroup:function(e){var t,i,s,n,l;for((s=(e=v(e)).attr("label"))&&((n=c.readData(e)||{})[r.settings.optgroupLabelField]=s,n[r.settings.optgroupValueField]=s,n[r.settings.disabledField]=e.prop("disabled"),n.$order=++r.order,r.settings.optgroups.push(n)),t=0,i=(l=v("option",e)).length;t<i;t++)c.addOption(l[t],s)}};v.extend(r,{settings:l,$select:e,tabIndex:e.attr("tabindex")||"",tagType:1,rtl:/rtl/i.test(n),multiple:e.attr("multiple"),eventNS:".FancySelect"+ ++$.count,highlightedValue:null,isBlurring:!1,isOpen:!1,isDisabled:!1,isRequired:e.is("[required]"),isInvalid:!1,isLocked:!1,isFocused:!1,isInputHidden:!1,isSetup:!1,isRendered:!1,isShiftDown:!1,isCmdDown:!1,isCtrlDown:!1,ignoreFocus:!1,ignoreBlur:!1,ignoreHover:!1,hasOptions:!1,currentResults:null,lastValue:"",caretPos:0,loading:0,loadedSearches:{},$activeOption:null,$activeItems:[],optgroups:{},options:{},userOptions:{},items:{},renderCache:{},onSearchChange:null===l.loadThrottle?r.onSearchChange:(a=r.onSearchChange,o=l.loadThrottle,function(){var e=this,t=arguments;f.clearTimeout(d),d=f.setTimeout(function(){a.apply(e,t)},o)})}),""===r.settings.placeholder&&(r.settings.placeholder=e.attr("placeholder")||e.attr("data-placeholder"),r.settings.placeholder||r.settings.allowEmptyOption||(r.settings.placeholder=e.children('option[value=""]').text())),r.settings.maxItems=r.multiple?null:1;for(var u=0,g=r.$select.children().length;u<g;u++){var h=r.$select.children()[u].tagName.toLowerCase();"optgroup"===h?c.addGroup(r.$select.children()[u]):"option"===h&&c.addOption(r.$select.children()[u])}r.$wrapper=v('<div class="fancy-picker">').addClass(e.attr("class")),r.computedStyle.hasOwnProperty("width")&&r.$wrapper.css({width:r.computedStyle.width}),r.$outputWrapper=v('<div class="fancy-picker-picked">').appendTo(r.$wrapper),r.originalPlaceholder=v('<span class="fancy-picker-placeholder">').appendTo(r.$outputWrapper),r.dataPlaceholder=v('<span class="fancy-picker-data">').appendTo(r.$outputWrapper),r.dataCountPlaceholder=v('<span class="fancy-picker-count">').appendTo(r.$outputWrapper),r.$dropdown=v('<div class="fancy-picker-ui">').appendTo(r.$wrapper),r.$dropdownContent=v('<div class="fancy-picker-content">').appendTo(r.$dropdown),r.setup()}$.count=0,v.extend($.prototype,{setup:function(){var n=this;n.revertSettings={$children:n.$select.children().detach(),tabindex:n.$select.attr("tabindex")},n.$select.attr("tabindex",-1).hide().after(n.$wrapper),n.$select.data("FancySelect",n),n.$select.addClass("FancySelectInit"),n.settings.items.sort(),n.preload&&n.render(),n.updatePlaceholder(),n.updateOriginalInput(),n.$wrapper.on("click"+n.eventNS,".fancy-picker-picked",function(e){n.$select.trigger("show"),n.isRendered||n.render(),n.$wrapper.toggleClass("active"),n.$select.trigger("shown")}),v(m).on("click"+n.eventNS,function(e){v(e.target).closest(n.$wrapper).length||(n.$select.trigger("hide"),n.$wrapper.removeClass("active"),n.$select.trigger("hidden"))}),n.$wrapper.on("click"+n.eventNS,".fancy-picker-option:not(.disabled)",function(e){e.preventDefault();var t=v(this),i=!1,s=t.data("value");n.multiple?(t.hasClass("selected")?t.removeClass("selected"):(i=!0,t.addClass("selected")),i?n.settings.items.push(s):n.settings.items=n.settings.items.filter(function(e){return e!=s}),n.settings.items.sort()):(n.$dropdownContent.find(".fancy-picker-option").not(t).removeClass("selected"),t.addClass("selected"),i=!0,n.settings.items=[s],n.$wrapper.removeClass("active")),n.updatePlaceholder(),n.updateOriginalInput()}),n.$select.trigger("initialize")},updateOriginalInput:function(e){var t=this,i=[],s=!1;e=!0===e;for(var n=0,l=t.settings.items.length;n<l;n++){var r=t.getSelectedOptionData(t.settings.items[n]);r&&(i.push('<option value="'+t.settings.items[n]+'" selected="selected">'+r[t.settings.labelField]||"</option>"),s=!0)}t.$select.html(i.join("")),!e&&s&&t.$select.trigger("change")},render:function(){for(var e=this,t=[],i=0,s=e.settings.options.length;i<s;i++){var n=e.settings.options[i],l=e.isSelected(n[e.settings.valueField])?"fancy-picker-option selected":"fancy-picker-option";t.push('<div class="'+l+'" data-value="'+n[e.settings.valueField]+'">'+n[e.settings.labelField]+"</div>")}e.$dropdownContent.html(t.join("")),e.$select.trigger("rendered"),e.isRendered=!0},updatePlaceholder:function(){var i=this;i.originalPlaceholder.text(i.settings.placeholder),i.settings.items.length?i.originalPlaceholder.hide():i.originalPlaceholder.show();var s=[],e=i.settings.items.length>i.settings.maxItemShow?i.settings.maxItemShow-1:i.settings.maxItemShow;if(i.settings.items.slice(0,e).forEach(function(e){var t=i.getSelectedOptionData(e);t&&s.push("<span>"+t[i.settings.labelField]+"</span>")}),i.dataPlaceholder.html(s.join('<span class="fancy-picker-separator">'+i.settings.delimiter+"</span> ")),i.settings.items.length>i.settings.maxItemShow){var n=[];i.settings.items.forEach(function(e){var t=i.getSelectedOptionData(e);t&&n.push(t[i.settings.labelField])}),i.dataCountPlaceholder.attr("title",n.join(i.settings.delimiter.trim()+" ")),i.dataCountPlaceholder.html("+"+(i.settings.items.length-e)+" More &hellip;")}else i.dataCountPlaceholder.removeAttr("title"),i.dataCountPlaceholder.html("");i.$select.trigger("placeholderChanged")},getSelectedOptionData:function(t){var i=this,e=i.settings.options.filter(function(e){return e[i.settings.valueField]==t});return!!e.length&&e[0]},isSelected:function(t){return 0<this.settings.items.filter(function(e){return e==t}).length},destroy:function(){var e=this;e.$select.trigger("destroy"),e.trigger("destroy"),e.off(),e.$select.html("").append(e.revertSettings.$children).removeAttr("tabindex").removeClass("selectized").attr({tabindex:e.revertSettings.tabindex}).show(),e.$control_input.removeData("grow"),e.$select.removeData("selectize"),0==--$.count&&$.$testInput&&($.$testInput.remove(),$.$testInput=void 0),v(f).off(e.eventNS),v(m).off(e.eventNS),v(m.body).off(e.eventNS),delete e.$select[0].fancySelect},on:function(e,t){this._events=this._events||{},this._events[e]=this._events[e]||[],this._events[e].push(t)},off:function(e,t){var i=arguments.length;return 0===i?delete this._events:1===i?delete this._events[e]:(this._events=this._events||{},void(e in this._events!=!1&&this._events[e].splice(this._events[e].indexOf(t),1)))},trigger:function(e){if(this._events=this._events||{},e in this._events!=!1)for(var t=0;t<this._events[e].length;t++)this._events[e][t].apply(this,Array.prototype.slice.call(arguments,1))}}),v.fn.fancySelect=function(e){return this.each(function(){this.fancySelect||"select"===this.tagName.toLowerCase()&&new $(v(this),e)})}}(jQuery,window,document);
admin/js/jquery-sortable.js CHANGED
@@ -690,4 +690,4 @@
690
  });
691
  };
692
 
693
- }(jQuery, window, 'sortablesd');
690
  });
691
  };
692
 
693
+ }(jQuery, window, 'wf_sortable');
admin/js/jquery-sortable.min.js ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ===================================================
2
+ * jquery-sortable.js v0.9.13
3
+ * http://johnny.github.com/jquery-sortable/
4
+ * ===================================================
5
+ * Copyright (c) 2012 Jonas von Andrian
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above copyright
13
+ * notice, this list of conditions and the following disclaimer in the
14
+ * documentation and/or other materials provided with the distribution.
15
+ * * The name of the author may not be used to endorse or promote products
16
+ * derived from this software without specific prior written permission.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ * ========================================================== */
29
+ !function(u,s,a){var o={drag:!0,drop:!0,exclude:"",nested:!0,vertical:!0},n={afterMove:function(t,e,i){},containerPath:"",containerSelector:"ol, ul",distance:0,delay:0,handle:"",itemPath:"",itemSelector:"li",bodyClass:"dragging",draggedClass:"dragged",isValidTarget:function(t,e){return!0},onCancel:function(t,e,i,o){},onDrag:function(t,e,i,o){t.css(e)},onDragStart:function(t,e,i,o){t.css({height:t.outerHeight(),width:t.outerWidth()}),t.addClass(e.group.options.draggedClass),u("body").addClass(e.group.options.bodyClass)},onDrop:function(t,e,i,o){t.removeClass(e.group.options.draggedClass).removeAttr("style"),u("body").removeClass(e.group.options.bodyClass)},onMousedown:function(t,e,i){if(!i.target.nodeName.match(/^(input|select|textarea)$/i))return i.preventDefault(),!0},placeholderClass:"placeholder",placeholder:'<li class="placeholder"></li>',pullPlaceholder:!0,serialize:function(t,e,i){var o=u.extend({},t.data());return i?[e]:(e[0]&&(o.children=e),delete o.subContainers,delete o.sortable,o)},tolerance:0},e={},r=0,p={left:0,top:0,bottom:0,right:0},h={start:"touchstart.sortable mousedown.sortable",drop:"touchend.sortable touchcancel.sortable mouseup.sortable",drag:"touchmove.sortable mousemove.sortable",scroll:"scroll.sortable"},l="subContainers";function c(t,e){return Math.max(0,t[0]-e[0],e[0]-t[1])+Math.max(0,t[2]-e[1],e[1]-t[3])}function t(t,e,i,o){var s=t.length,n=o?"offset":"position";for(i=i||0;s--;){var r=t[s].el?t[s].el:u(t[s]),a=r[n]();a.left+=parseInt(r.css("margin-left"),10),a.top+=parseInt(r.css("margin-top"),10),e[s]=[a.left-i,a.left+r.outerWidth()+i,a.top-i,a.top+r.outerHeight()+i]}}function f(t,e){var i=e.offset();return{left:t.left-i.left,top:t.top-i.top}}function d(t,e,i){e=[e.left,e.top],i=i&&[i.left,i.top];for(var o,s=t.length,n=[];s--;)o=t[s],n[s]=[s,c(o,e),i&&c(o,i)];return n=n.sort(function(t,e){return e[1]-t[1]||e[2]-t[2]||e[0]-t[0]})}function g(t){this.options=u.extend({},n,t),this.containers=[],this.options.rootGroup||(this.scrollProxy=u.proxy(this.scroll,this),this.dragProxy=u.proxy(this.drag,this),this.dropProxy=u.proxy(this.drop,this),this.placeholder=u(this.options.placeholder),t.isValidTarget||(this.options.isValidTarget=a))}function m(t,e){this.el=t,this.options=u.extend({},o,e),this.group=g.get(this.options),this.rootGroup=this.options.rootGroup||this.group,this.handle=this.rootGroup.options.handle||this.rootGroup.options.itemSelector;var i=this.rootGroup.options.itemPath;this.target=i?this.el.find(i):this.el,this.target.on(h.start,this.handle,u.proxy(this.dragInit,this)),this.options.drop&&this.group.containers.push(this)}g.get=function(t){return e[t.group]||(t.group===a&&(t.group=r++),e[t.group]=new g(t)),e[t.group]},g.prototype={dragInit:function(t,e){this.$document=u(e.el[0].ownerDocument);var i=u(t.target).closest(this.options.itemSelector);if(i.length){if(this.item=i,this.itemContainer=e,this.item.is(this.options.exclude)||!this.options.onMousedown(this.item,n.onMousedown,t))return;this.setPointer(t),this.toggleListeners("on"),this.setupDelayTimer(),this.dragInitDone=!0}},drag:function(t){if(!this.dragging){if(!this.distanceMet(t)||!this.delayMet)return;this.options.onDragStart(this.item,this.itemContainer,n.onDragStart,t),this.item.before(this.placeholder),this.dragging=!0}this.setPointer(t),this.options.onDrag(this.item,f(this.pointer,this.item.offsetParent()),n.onDrag,t);var e=this.getPointer(t),i=this.sameResultBox,o=this.options.tolerance;(!i||i.top-o>e.top||i.bottom+o<e.top||i.left-o>e.left||i.right+o<e.left)&&(this.searchValidTarget()||(this.placeholder.detach(),this.lastAppendedItem=a))},drop:function(t){this.toggleListeners("off"),this.dragInitDone=!1,this.dragging&&(this.placeholder.closest("html")[0]?this.placeholder.before(this.item).detach():this.options.onCancel(this.item,this.itemContainer,n.onCancel,t),this.options.onDrop(this.item,this.getContainer(this.item),n.onDrop,t),this.clearDimensions(),this.clearOffsetParent(),this.lastAppendedItem=this.sameResultBox=a,this.dragging=!1)},searchValidTarget:function(t,e){t||(t=this.relativePointer||this.pointer,e=this.lastRelativePointer||this.lastPointer);for(var i=d(this.getContainerDimensions(),t,e),o=i.length;o--;){var s=i[o][0];if(!i[o][1]||this.options.pullPlaceholder){var n=this.containers[s];if(!n.disabled){if(!this.$getOffsetParent()){var r=n.getItemOffsetParent();t=f(t,r),e=f(e,r)}if(n.searchValidTarget(t,e))return!0}}}this.sameResultBox&&(this.sameResultBox=a)},movePlaceholder:function(t,e,i,o){var s=this.lastAppendedItem;!o&&s&&s[0]===e[0]||(e[i](this.placeholder),this.lastAppendedItem=e,this.sameResultBox=o,this.options.afterMove(this.placeholder,t,e))},getContainerDimensions:function(){return this.containerDimensions||t(this.containers,this.containerDimensions=[],this.options.tolerance,!this.$getOffsetParent()),this.containerDimensions},getContainer:function(t){return t.closest(this.options.containerSelector).data(s)},$getOffsetParent:function(){if(this.offsetParent===a){var t=this.containers.length-1,e=this.containers[t].getItemOffsetParent();if(!this.options.rootGroup)for(;t--;)if(e[0]!=this.containers[t].getItemOffsetParent()[0]){e=!1;break}this.offsetParent=e}return this.offsetParent},setPointer:function(t){var e=this.getPointer(t);if(this.$getOffsetParent()){var i=f(e,this.$getOffsetParent());this.lastRelativePointer=this.relativePointer,this.relativePointer=i}this.lastPointer=this.pointer,this.pointer=e},distanceMet:function(t){var e=this.getPointer(t);return Math.max(Math.abs(this.pointer.left-e.left),Math.abs(this.pointer.top-e.top))>=this.options.distance},getPointer:function(t){var e=t.originalEvent||t.originalEvent.touches&&t.originalEvent.touches[0];return{left:t.pageX||e.pageX,top:t.pageY||e.pageY}},setupDelayTimer:function(){var t=this;this.delayMet=!this.options.delay,this.delayMet||(clearTimeout(this._mouseDelayTimer),this._mouseDelayTimer=setTimeout(function(){t.delayMet=!0},this.options.delay))},scroll:function(t){this.clearDimensions(),this.clearOffsetParent()},toggleListeners:function(i){var o=this;u.each(["drag","drop","scroll"],function(t,e){o.$document[i](h[e],o[e+"Proxy"])})},clearOffsetParent:function(){this.offsetParent=a},clearDimensions:function(){this.traverse(function(t){t._clearDimensions()})},traverse:function(t){t(this);for(var e=this.containers.length;e--;)this.containers[e].traverse(t)},_clearDimensions:function(){this.containerDimensions=a},_destroy:function(){e[this.options.group]=a}},m.prototype={dragInit:function(t){var e=this.rootGroup;!this.disabled&&!e.dragInitDone&&this.options.drag&&this.isValidDrag(t)&&e.dragInit(t,this)},isValidDrag:function(t){return 1==t.which||"touchstart"==t.type&&1==t.originalEvent.touches.length},searchValidTarget:function(t,e){var i=d(this.getItemDimensions(),t,e),o=i.length,s=this.rootGroup,n=!s.options.isValidTarget||s.options.isValidTarget(s.item,this);if(!o&&n)return s.movePlaceholder(this,this.target,"append"),!0;for(;o--;){var r=i[o][0];if(!i[o][1]&&this.hasChildGroup(r)){if(this.getContainerGroup(r).searchValidTarget(t,e))return!0}else if(n)return this.movePlaceholder(r,t),!0}},movePlaceholder:function(t,e){var i=u(this.items[t]),o=this.itemDimensions[t],s="after",n=i.outerWidth(),r=i.outerHeight(),a=i.offset(),h={left:a.left,right:a.left+n,top:a.top,bottom:a.top+r};if(this.options.vertical){var l=(o[2]+o[3])/2;e.top<=l?(s="before",h.bottom-=r/2):h.top+=r/2}else{var c=(o[0]+o[1])/2;e.left<=c?(s="before",h.right-=n/2):h.left+=n/2}this.hasChildGroup(t)&&(h=p),this.rootGroup.movePlaceholder(this,i,s,h)},getItemDimensions:function(){return this.itemDimensions||(this.items=this.$getChildren(this.el,"item").filter(":not(."+this.group.options.placeholderClass+", ."+this.group.options.draggedClass+")").get(),t(this.items,this.itemDimensions=[],this.options.tolerance)),this.itemDimensions},getItemOffsetParent:function(){var t=this.el;return"relative"===t.css("position")||"absolute"===t.css("position")||"fixed"===t.css("position")?t:t.offsetParent()},hasChildGroup:function(t){return this.options.nested&&this.getContainerGroup(t)},getContainerGroup:function(t){var e=u.data(this.items[t],l);if(e===a){var i=this.$getChildren(this.items[t],"container");if(e=!1,i[0]){var o=u.extend({},this.options,{rootGroup:this.rootGroup,group:r++});e=i[s](o).data(s).group}u.data(this.items[t],l,e)}return e},$getChildren:function(t,e){var i=this.rootGroup.options,o=i[e+"Path"],s=i[e+"Selector"];return t=u(t),o&&(t=t.find(o)),t.children(s)},_serialize:function(t,e){var i=this,o=e?"item":"container",s=this.$getChildren(t,o).not(this.options.exclude).map(function(){return i._serialize(u(this),!e)}).get();return this.rootGroup.options.serialize(t,s,e)},traverse:function(i){u.each(this.items||[],function(t){var e=u.data(this,l);e&&e.traverse(i)}),i(this)},_clearDimensions:function(){this.itemDimensions=a},_destroy:function(){var e=this;this.target.off(h.start,this.handle),this.el.removeData(s),this.options.drop&&(this.group.containers=u.grep(this.group.containers,function(t){return t!=e})),u.each(this.items||[],function(){u.removeData(this,l)})}};var v={enable:function(){this.traverse(function(t){t.disabled=!1})},disable:function(){this.traverse(function(t){t.disabled=!0})},serialize:function(){return this._serialize(this.el,!0)},refresh:function(){this.traverse(function(t){t._clearDimensions()})},destroy:function(){this.traverse(function(t){t._destroy()})}};u.extend(m.prototype,v),u.fn[s]=function(i){var o=Array.prototype.slice.call(arguments,1);return this.map(function(){var t=u(this),e=t.data(s);return e&&v[i]?v[i].apply(e,o)||this:(e||i!==a&&"object"!=typeof i||t.data(s,new m(t,i)),this)})}}(jQuery,(window,"wf_sortable"));
admin/js/woo-feed-admin-pro.js CHANGED
@@ -1,5 +1,13 @@
1
  // noinspection JSUnresolvedVariable,ES6ConvertVarToLetConst,SpellCheckingInspection
 
 
 
 
 
 
 
2
  (function ($, window, document, wpAjax, opts) {
 
3
  /* global ajaxurl, wpAjax, postboxes, pagenow, alert, deleteUserSetting, typenow, adminpage, thousandsSeparator, decimalPoint, isRtl */
4
  $(window).load(function () {
5
  // noinspection ES6ConvertVarToLetConst,SpellCheckingInspection
1
  // noinspection JSUnresolvedVariable,ES6ConvertVarToLetConst,SpellCheckingInspection
2
+ /**!
3
+ * WooFeed Pro Scripts
4
+ * @version 1.0.0
5
+ * @package WooFeed
6
+ * @copyright 2020 WebAppick
7
+ *
8
+ */
9
  (function ($, window, document, wpAjax, opts) {
10
+ "use strict";
11
  /* global ajaxurl, wpAjax, postboxes, pagenow, alert, deleteUserSetting, typenow, adminpage, thousandsSeparator, decimalPoint, isRtl */
12
  $(window).load(function () {
13
  // noinspection ES6ConvertVarToLetConst,SpellCheckingInspection
admin/js/woo-feed-admin-pro.min.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ /**!
2
+ * WooFeed Pro Scripts
3
+ * @version 1.0.0
4
+ * @package WooFeed
5
+ * @copyright 2020 WebAppick
6
+ *
7
+ */
8
+ !function(a,o){"use strict";a(o).load(function(){var o=a(".wapk-slider");o.length&&o.slick({autoplay:!0,dots:!0,centerMode:!0,arrows:!1,slidesToShow:1,slidesToScroll:1,lazyLoad:"progressive"})})}(jQuery,window,(document,wp.ajax,wpf_ajax_obj));
admin/js/woo-feed-admin.js CHANGED
@@ -76,60 +76,80 @@
76
  }
77
 
78
  /* global ajaxurl, wpAjax, postboxes, pagenow, alert, deleteUserSetting, typenow, adminpage, thousandsSeparator, decimalPoint, isRtl */
79
- $(window).load(function () {
80
- // noinspection ES6ConvertVarToLetConst
81
- var $copyBtn = $('.toClipboard'), clipboard,
82
- googleCategories,
83
- helper = {
84
- in_array: function( needle, haystack ) {
85
- try {
86
- return haystack.indexOf( needle ) !== -1;
87
- } catch( e ) {
88
- return false;
89
- }
90
- },
91
- selectize_render_item: function( data, escape ) {
92
- return '<div class="item wapk-selectize-item">' + escape(data.text) + '</div>'; // phpcs:ignore WordPressVIPMinimum.JS.StringConcat.Found
93
- },
94
- ajax_fail: function ( e ) {
95
- console.log( e );
96
- alert( ( e.hasOwnProperty( 'statusText' ) && e.hasOwnProperty( 'status' ) ) ? opts.ajax.error + '\n' + e.statusText + ' (' + e.status + ')' : e );
97
  }
98
- }, // helper functions
99
- feedEditor = {
100
- /**
101
- * Initialize The Feed Editor {Tabs...}
102
- * @returns {void}
103
- */
104
- init: function() {
105
- // noinspection ES6ConvertVarToLetConst
106
- var outOfStockVisibilityRow = $('.out-of-stock-visibility');
107
- // Initialize Table Sorting
108
- // noinspection JSUnresolvedFunction
109
- $('.sorted_table').sortablesd({
110
- containerSelector: 'table',
111
- itemPath: '> tbody',
112
- itemSelector: 'tr',
113
- handle: 'i.wf_sortedtable',
114
- placeholder: '<tr class="placeholder"><td colspan="9"></td></tr>',
115
- });
116
- $('select.selectize').not('.selectized').each(function(){
117
- // noinspection ES6ConvertVarToLetConst
118
- var self = $(this), plugins = self.data('plugins');
119
- self.selectize({
120
- plugins: plugins ? plugins.split(',').map( function( s ) { return s.trim(); } ) : [],//['remove_button'],
121
- render: { item: helper.selectize_render_item, }
122
- });
123
- });
124
- $('[name="is_outOfStock"], [name="product_visibility"]').on( 'change', function(){
125
- if( $('[name="is_outOfStock"]:checked').val() === 'n' && $('[name="product_visibility"]:checked').val() === '1' ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  outOfStockVisibilityRow.show();
127
  } else {
128
  outOfStockVisibilityRow.hide();
129
  }
130
- } ).trigger( 'change' );
131
- // Attribute type selection
132
- $(document).on('change', '.attr_type', function () {
133
  // noinspection ES6ConvertVarToLetConst
134
  var type = $(this).val(), row = $(this).closest('tr');
135
  if (type === 'pattern') {
@@ -141,153 +161,145 @@
141
  row.find('.wf_default').hide();
142
  row.find('.wf_default').val('');
143
  }
144
- });
145
- $(document).on( 'change', '.wf_mattributes, .attr_type', function() {
146
  // noinspection ES6ConvertVarToLetConst
147
- var row = $(this).closest( 'tr' ),
148
- attribute = row.find( '.wf_mattributes' ),
149
  type = row.find('.attr_type'),
150
  valueColumn = row.find('td:eq(4)'),
151
  provider = $('#provider').val();
152
- if( attribute.val() === 'current_category' && type.val() === 'pattern' && helper.in_array( provider, [ 'google', 'facebook', 'pinterest' ] ) ) {
153
- if( valueColumn.find('select.selectize').length === 0 ) {
154
  // noinspection ES6ConvertVarToLetConst
155
  var selectizeOpts = {
156
  options: googleCategories,
157
- config: { render: { item: helper.selectize_render_item, } },
158
  };
159
  valueColumn.find('input.wf_default').remove();
160
  valueColumn.append('<span class="wf_default wf_attributes"><select name="default[]" class="selectize"></select></span>');
161
- valueColumn.find('.wf_attributes select').selectize({render: {item: helper.selectize_render_item,}});
162
  // noinspection JSUnresolvedVariable
163
- valueColumn.append('<span style="font-size:x-small;"><a style="color: red" href="http://webappick.helpscoutdocs.com/article/19-how-to-map-store-category-with-merchant-category" target="_blank">'+ opts.learn_more +'</a></span>');
164
- valueColumn.append('<span class="spinner is-active" style="margin: 0;"></span>');
165
- // noinspection ES6ConvertVarToLetConst
166
- var select = valueColumn.find('.wf_attributes select');
167
  if( ! googleCategories ) {
168
- wpAjax.send( 'get_google_categories', {
169
- type: 'GET',
170
- data: { _ajax_nonce: opts.nonce, action: "get_google_categories", provider: provider }
171
- } ).then( function( r ) {
172
- googleCategories = r;
173
- selectizeOpts.options = r;
174
- feedEditor.renderSelectize( select, selectizeOpts );
175
- valueColumn.find('.spinner').remove();
176
- } ).fail( helper.ajax_fail );
177
- } else {
178
- feedEditor.renderSelectize( select, selectizeOpts );
179
- valueColumn.find('.spinner').remove();
180
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  }
182
  } else {
183
- if( attribute.val() !== 'current_category' && valueColumn.find('input.wf_default').length === 0 ) {
184
  valueColumn.find('span').remove();
185
- valueColumn.append( '<input autocomplete="off" class="wf_default wf_attributes" type="text" name="default[]" value="">' );
186
- if( type.val() !== 'pattern' ) {
187
  valueColumn.find('input.wf_default').hide();
188
  }
189
  }
190
  }
191
- } );
192
- },
193
- /**
194
- * Selectize Helper.
195
- * Initialize Selectize Dropdown
196
- * @param {jQuery|HTMLElement} el
197
- * @param {Object} config
198
- * @returns {jQuery|HTMLElement}
199
- */
200
- renderSelectize: function( el, config ) {
201
- // noinspection ES6ConvertVarToLetConst
202
- var c = $.extend({}, {
203
- options: {},
204
- settings: {render: {item: helper.selectize_render_item,}}
205
- }, config);
206
- // noinspection JSUnresolvedFunction
207
- el.selectize(c.settings);
208
- // noinspection ES6ConvertVarToLetConst
209
- var s = el[0].selectize;
210
- s.clearOptions();
211
- if( Object.keys(c.options).length ) {
212
- // noinspection ES6ConvertVarToLetConst
213
- for( var i in c.options ) {
214
- if( c.options.hasOwnProperty( i ) ) {
215
- s.addOption( c.options[i] );
216
- }
217
- }
218
- }
219
- s.refreshOptions( true );
220
- return el;
221
- },
222
- /**
223
- * Render Merchant info ajax response and handle allowed feed type for selected merchant
224
- * @param {jQuery|HTMLElement} merchantInfo jQuery dom object
225
- * @param {jQuery|HTMLElement} feedType jQuery dom object
226
- * @param {Object} r ajax response object
227
- */
228
- renderMerchantInfo: function( merchantInfo, feedType, r ) {
229
- // noinspection ES6ConvertVarToLetConst
230
- for( var k in r ) {
231
- if( r.hasOwnProperty( k ) ) {
232
- merchantInfo.find( '.merchant-info-section.' + k + ' .data' ).html( r[k] ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
233
- if( 'feed_file_type' === k ) {
234
- // noinspection ES6ConvertVarToLetConst,JSUnresolvedVariable
235
- var types = r[k].split(",").map(function(t){return t.trim().toLowerCase()}).filter(function(t){
236
- // noinspection JSUnresolvedVariable
237
- return t !== '' && t !== opts.na.toLowerCase()
238
- });
239
- if( types.length ) {
240
- feedType.find('option').removeAttr('selected').each( function(){
241
- // noinspection ES6ConvertVarToLetConst
242
- var opt = $(this);
243
- opt.val() && ! helper.in_array(opt.val(),types) ? opt.disabled( ! 0) : opt.disabled( ! 1);
244
- } );
245
- if( types.length === 1 ) feedType.find('option[value="' + types[0] + '"]').attr( 'selected', 'selected' );
246
- } else feedType.find('option').disabled( ! 1 );
247
- }
248
  }
249
  }
250
- merchantInfo.find( '.spinner' ).removeClass( 'is-active' );
251
- feedType.disabled( ! 1 );
252
- feedType.trigger('change');
253
- feedType.parent().find('.spinner').removeClass( 'is-active' );
254
- },
255
- /**
256
- * Render Feed Template Tabs and settings while creating new feed.
257
- * @param {jQuery|HTMLElement} feedForm feed from query dom object
258
- * @param {object} r merchant template ajax response object
259
- */
260
- renderMerchantTemplate: function( feedForm, r ) {
261
- // noinspection ES6ConvertVarToLetConst
262
- for ( var k in r ) {
263
- if ( r.hasOwnProperty( k ) ) {
264
- if ( 'tabs' === k ) {
265
- feedForm.html( r[k]); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
266
- } else {
267
- // noinspection ES6ConvertVarToLetConst
268
- var contentSettings = $('[name="'+k+'"]');
269
- if ( contentSettings.length ) {
270
- contentSettings.each( function() {
271
- // noinspection ES6ConvertVarToLetConst
272
- var elem = $(this);
273
- if ( elem.is( 'select' ) ) {
274
- elem.find( '[value="'+r[k]+'"]').prop( 'selected', true );
275
- } else if ( ( elem.is('[type=checkbox]') || elem.is('[type=radio]') ) && elem.val() === r[k] ) {
276
- elem.prop( 'checked', true )
277
- } else {
278
- elem.val( r[k] ); // type=text
279
- }
280
- } ).trigger('change');
281
- }
282
  }
283
  }
284
  }
285
- feedEditor.init();
286
  }
287
- }, // Feed Editor Table
288
- merchantInfoCache = [],
289
- merchantTemplateCache = [];
 
 
 
 
 
 
290
 
 
 
 
 
291
 
292
  $('[data-toggle_slide]').on('click', function(e) {
293
  e.preventDefault();
@@ -306,10 +318,7 @@
306
  }
307
  // initialize editor
308
  feedEditor.init();
309
- // Template loading ui conflict
310
- if( $(location). attr("href").match( /webappick.*feed/g ) != null ) {
311
- $('#wpbody-content').addClass('woofeed-body-content');
312
- }
313
 
314
  // Generate Feed Add Table Row
315
  $(document).on('click', '#wf_newRow', function () {
@@ -373,36 +382,11 @@
373
  });
374
 
375
  // Generate Feed Table Row Delete
376
- $(document).on('click', '.delRow', function () {
 
377
  $(this).closest('tr').remove();
378
  });
379
 
380
- //Expand output type
381
- $(document).on('click', '.expandType', function () {
382
- // noinspection ES6ConvertVarToLetConst
383
- var row = $(this).closest('tr');
384
- $('.outputType').each(function (index) {
385
- //do stuff to each individually.
386
- $(this).attr('name', "output_type[" + index + "][]");
387
- });
388
- row.find('.outputType').attr('multiple', 'multiple');
389
- row.find('.contractType').show();
390
- $(this).hide();
391
- });
392
-
393
- //Contract output type
394
- $(document).on('click', '.contractType', function () {
395
- // noinspection ES6ConvertVarToLetConst
396
- var row = $(this).closest('tr');
397
- $('.outputType').each(function (index) {
398
- //do stuff to each individually.
399
- $(this).attr('name', "output_type[" + index + "][]");
400
- });
401
- row.find('.outputType').removeAttr('multiple');
402
- row.find('.expandType').show();
403
- $(this).hide();
404
- });
405
-
406
  // Generate Feed Form Submit
407
  $(".generateFeed").validate();
408
  $(document).on('submit', '#generateFeed', function () {
76
  }
77
 
78
  /* global ajaxurl, wpAjax, postboxes, pagenow, alert, deleteUserSetting, typenow, adminpage, thousandsSeparator, decimalPoint, isRtl */
79
+ /**
80
+ * Alias of jQuery.extend()
81
+ * @param {Object} _default
82
+ * @param {Object} _args
83
+ */
84
+ const extend = ( _default, _args ) => $.extend( true, {}, _default, _args );
85
+ // noinspection ES6ConvertVarToLetConst
86
+ var $copyBtn, clipboard, googleCategories,
87
+ helper = {
88
+ in_array: function( needle, haystack ) {
89
+ try {
90
+ return haystack.indexOf( needle ) !== -1;
91
+ } catch( e ) {
92
+ return false;
 
 
 
 
93
  }
94
+ },
95
+ selectize_render_item: function( data, escape ) {
96
+ return '<div class="item wapk-selectize-item">' + escape(data.text) + '</div>'; // phpcs:ignore WordPressVIPMinimum.JS.StringConcat.Found
97
+ },
98
+ ajax_fail: function ( e ) {
99
+ console.warn( e );
100
+ alert( ( e.hasOwnProperty( 'statusText' ) && e.hasOwnProperty( 'status' ) ) ? opts.ajax.error + '\n' + e.statusText + ' (' + e.status + ')' : e );
101
+ },
102
+ sortable: function( el, config ) {
103
+ console.log( ( el || $('.sorted_table') ) );
104
+ ( el || $('.sorted_table') ).wf_sortable( extend( {
105
+ containerSelector: 'table',
106
+ itemPath: '> tbody',
107
+ itemSelector: 'tr',
108
+ handle: 'i.wf_sortedtable',
109
+ placeholder: '<tr class="placeholder"><td colspan="9"></td></tr>',
110
+ }, config ));
111
+ },
112
+ selectize: function( el, config ) {
113
+ return ( el || $('select.selectize') ).not('.selectized').each(function(){
114
+ let self = $(this);
115
+ self.selectize( extend( {
116
+ create: self.data('create') || false,
117
+ plugins: self.data('plugins') ? self.data('plugins').split(',').map( s => s.trim() ): [],//['remove_button'],
118
+ render: {item: helper.selectize_render_item,}
119
+ }, config ) );
120
+ } );
121
+ }
122
+ }, // helper functions
123
+ feedEditor = {
124
+ /**
125
+ * The Editor Form Elem.
126
+ * @type {jQuery|HTMLElement}
127
+ */
128
+ form: null,
129
+ /**
130
+ * Initialize The Feed Editor {Tabs...}
131
+ * @returns {void}
132
+ */
133
+ init: function() {
134
+ let self = this;
135
+ self.form = $('.generateFeed');
136
+ if( ! self.form.length ) return;
137
+ // noinspection ES6ConvertVarToLetConst
138
+ var outOfStockVisibilityRow = $('.out-of-stock-visibility');
139
+ // Initialize Table Sorting
140
+ // noinspection JSUnresolvedFunction
141
+ helper.sortable();
142
+ helper.selectize();
143
+ $(document)
144
+ .on('change', '[name="is_outOfStock"], [name="product_visibility"]', function () {
145
+ if ($('[name="is_outOfStock"]:checked').val() === 'n' && $('[name="product_visibility"]:checked').val() === '1') {
146
  outOfStockVisibilityRow.show();
147
  } else {
148
  outOfStockVisibilityRow.hide();
149
  }
150
+ })
151
+ .on('change', '.attr_type', function () {
152
+ // Attribute type selection
153
  // noinspection ES6ConvertVarToLetConst
154
  var type = $(this).val(), row = $(this).closest('tr');
155
  if (type === 'pattern') {
161
  row.find('.wf_default').hide();
162
  row.find('.wf_default').val('');
163
  }
164
+ })
165
+ .on('change', '.wf_mattributes, .attr_type', function () {
166
  // noinspection ES6ConvertVarToLetConst
167
+ var row = $(this).closest('tr'),
168
+ attribute = row.find('.wf_mattributes'),
169
  type = row.find('.attr_type'),
170
  valueColumn = row.find('td:eq(4)'),
171
  provider = $('#provider').val();
172
+ if (attribute.val() === 'current_category' && type.val() === 'pattern' && helper.in_array(provider, ['google', 'facebook', 'pinterest'])) {
173
+ if (valueColumn.find('select.selectize').length === 0) {
174
  // noinspection ES6ConvertVarToLetConst
175
  var selectizeOpts = {
176
  options: googleCategories,
177
+ config: {render: {item: helper.selectize_render_item,}},
178
  };
179
  valueColumn.find('input.wf_default').remove();
180
  valueColumn.append('<span class="wf_default wf_attributes"><select name="default[]" class="selectize"></select></span>');
181
+ // valueColumn.find('.wf_attributes select').selectize({render: {item: helper.selectize_render_item,}});
182
  // noinspection JSUnresolvedVariable
183
+ valueColumn.append('<span style="font-size:x-small;"><a style="color: red" href="http://webappick.helpscoutdocs.com/article/19-how-to-map-store-category-with-merchant-category" target="_blank">' + opts.learn_more + '</a></span>');
 
 
 
184
  if( ! googleCategories ) {
185
+ valueColumn.append('<span class="spinner is-active" style="margin: 0;"></span>');
 
 
 
 
 
 
 
 
 
 
 
186
  }
187
+ // noinspection ES6ConvertVarToLetConst
188
+ var select = valueColumn.find('.wf_attributes select');
189
+ helper.selectize( select, {
190
+ preload: true,
191
+ placeholder: opts.form.select_category,
192
+ load: function( query, cb ) {
193
+ if( ! googleCategories ) {
194
+ wpAjax.send('get_google_categories', {
195
+ type: 'GET',
196
+ data: {
197
+ _ajax_nonce: opts.nonce,
198
+ action: "get_google_categories",
199
+ provider: provider
200
+ }
201
+ }).then(function (r) {
202
+ googleCategories = r;
203
+ cb( googleCategories );
204
+ valueColumn.find('.spinner').remove();
205
+ }).fail(helper.ajax_fail);
206
+ } else {
207
+ cb( googleCategories );
208
+ }
209
+ }
210
+ } );
211
  }
212
  } else {
213
+ if (attribute.val() !== 'current_category' && valueColumn.find('input.wf_default').length === 0) {
214
  valueColumn.find('span').remove();
215
+ valueColumn.append('<input autocomplete="off" class="wf_default wf_attributes" type="text" name="default[]" value="">');
216
+ if (type.val() !== 'pattern') {
217
  valueColumn.find('input.wf_default').hide();
218
  }
219
  }
220
  }
221
+ })
222
+ .trigger('change');
223
+ $('.outputType').fancySelect();
224
+ $(document).trigger(new jQuery.Event('feedEditor.init', {target: this.form}));
225
+ },
226
+ /**
227
+ * Render Merchant info ajax response and handle allowed feed type for selected merchant
228
+ * @param {jQuery|HTMLElement} merchantInfo jQuery dom object
229
+ * @param {jQuery|HTMLElement} feedType jQuery dom object
230
+ * @param {Object} r ajax response object
231
+ */
232
+ renderMerchantInfo: function( merchantInfo, feedType, r ) {
233
+ // noinspection ES6ConvertVarToLetConst
234
+ for( var k in r ) {
235
+ if( r.hasOwnProperty( k ) ) {
236
+ merchantInfo.find( '.merchant-info-section.' + k + ' .data' ).html( r[k] ); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
237
+ if( 'feed_file_type' === k ) {
238
+ // noinspection ES6ConvertVarToLetConst,JSUnresolvedVariable
239
+ var types = r[k].split(",").map(function(t){return t.trim().toLowerCase()}).filter(function(t){
240
+ // noinspection JSUnresolvedVariable
241
+ return t !== '' && t !== opts.na.toLowerCase()
242
+ });
243
+ if( types.length ) {
244
+ feedType.find('option').removeAttr('selected').each( function(){
245
+ // noinspection ES6ConvertVarToLetConst
246
+ var opt = $(this);
247
+ opt.val() && ! helper.in_array(opt.val(),types) ? opt.disabled( ! 0) : opt.disabled( ! 1);
248
+ } );
249
+ if( types.length === 1 ) feedType.find('option[value="' + types[0] + '"]').attr( 'selected', 'selected' );
250
+ } else feedType.find('option').disabled( ! 1 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  }
252
  }
253
+ }
254
+ merchantInfo.find( '.spinner' ).removeClass( 'is-active' );
255
+ feedType.disabled( ! 1 );
256
+ feedType.trigger('change');
257
+ feedType.parent().find('.spinner').removeClass( 'is-active' );
258
+ },
259
+ /**
260
+ * Render Feed Template Tabs and settings while creating new feed.
261
+ * @param {jQuery|HTMLElement} feedForm feed from query dom object
262
+ * @param {object} r merchant template ajax response object
263
+ */
264
+ renderMerchantTemplate: function( feedForm, r ) {
265
+ // noinspection ES6ConvertVarToLetConst
266
+ for ( var k in r ) {
267
+ if ( r.hasOwnProperty( k ) ) {
268
+ if ( 'tabs' === k ) {
269
+ feedForm.html( r[k]); // phpcs:ignore WordPressVIPMinimum.JS.HTMLExecutingFunctions.html
270
+ } else {
271
+ // noinspection ES6ConvertVarToLetConst
272
+ var contentSettings = $('[name="'+k+'"]');
273
+ if ( contentSettings.length ) {
274
+ contentSettings.each( function() {
275
+ // noinspection ES6ConvertVarToLetConst
276
+ var elem = $(this);
277
+ if ( elem.is( 'select' ) ) {
278
+ elem.find( '[value="'+r[k]+'"]').prop( 'selected', true );
279
+ } else if ( ( elem.is('[type=checkbox]') || elem.is('[type=radio]') ) && elem.val() === r[k] ) {
280
+ elem.prop( 'checked', true )
281
+ } else {
282
+ elem.val( r[k] ); // type=text
283
+ }
284
+ } ).trigger('change');
285
  }
286
  }
287
  }
 
288
  }
289
+ feedEditor.init();
290
+ }
291
+ }, // Feed Editor Table
292
+ merchantInfoCache = [],
293
+ merchantTemplateCache = [];
294
+ // expose to the global scope
295
+ window.wf = { helper, feedEditor };
296
+ $(window).load(function () {
297
+ $copyBtn = $('.toClipboard');
298
 
299
+ // Template loading ui conflict
300
+ if( $(location). attr("href").match( /webappick.*feed/g ) != null ) {
301
+ $('#wpbody-content').addClass('woofeed-body-content');
302
+ }
303
 
304
  $('[data-toggle_slide]').on('click', function(e) {
305
  e.preventDefault();
318
  }
319
  // initialize editor
320
  feedEditor.init();
321
+ helper.selectize(); // render all other selectize
 
 
 
322
 
323
  // Generate Feed Add Table Row
324
  $(document).on('click', '#wf_newRow', function () {
382
  });
383
 
384
  // Generate Feed Table Row Delete
385
+ $(document).on('click', '.delRow', function ( e ) {
386
+ e.preventDefault();
387
  $(this).closest('tr').remove();
388
  });
389
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
390
  // Generate Feed Form Submit
391
  $(".generateFeed").validate();
392
  $(document).on('submit', '#generateFeed', function () {
admin/js/woo-feed-admin.min.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ /**!
2
+ * WooFeed Scripts
3
+ * @version 3.3.6
4
+ * @package WooFeed
5
+ * @copyright 2020 WebAppick
6
+ *
7
+ */
8
+ !function(r,e,t,s,l){"use strict";function n(e){r(e.currentTarget).removeClass(function(e,t){return(t.match(/\btooltipped-\S+/g)||[]).join(" ")}).removeClass("tooltipped").removeAttr("aria-label")}function a(e,t){r(e).addClass("tooltipped tooltipped-s").attr("aria-label",t)}r.fn.disabled=function(n){return r(this).each(function(){var e=r(this),t="disabled";void 0!==e.prop(t)?e.prop(t,void 0===n||!0===n):!0===n?e.addClass(t):e.removeClass(t)}),self},r.fn.isDisabled=function(){var e=r(this),t="disabled";return void 0!==e.prop(t)?e.prop(t):e.hasClass(t)};function i(e,t){return r.extend(!0,{},e,t)}var o,c,d={in_array:function(e,t){try{return-1!==t.indexOf(e)}catch(e){return!1}},selectize_render_item:function(e,t){return'<div class="item wapk-selectize-item">'+t(e.text)+"</div>"},ajax_fail:function(e){console.warn(e),alert(e.hasOwnProperty("statusText")&&e.hasOwnProperty("status")?l.ajax.error+"\n"+e.statusText+" ("+e.status+")":e)},sortable:function(e,t){console.log(e||r(".sorted_table")),(e||r(".sorted_table")).wf_sortable(i({containerSelector:"table",itemPath:"> tbody",itemSelector:"tr",handle:"i.wf_sortedtable",placeholder:'<tr class="placeholder"><td colspan="9"></td></tr>'},t))},selectize:function(e,t){return(e||r("select.selectize")).not(".selectized").each(function(){var e=r(this);e.selectize(i({create:e.data("create")||!1,plugins:e.data("plugins")?e.data("plugins").split(",").map(function(e){return e.trim()}):[],render:{item:d.selectize_render_item}},t))})}},f={form:null,init:function(){if(this.form=r(".generateFeed"),this.form.length){var e=r(".out-of-stock-visibility");d.sortable(),d.selectize(),r(t).on("change",'[name="is_outOfStock"], [name="product_visibility"]',function(){"n"===r('[name="is_outOfStock"]:checked').val()&&"1"===r('[name="product_visibility"]:checked').val()?e.show():e.hide()}).on("change",".attr_type",function(){var e=r(this).val(),t=r(this).closest("tr");"pattern"===e?(t.find(".wf_attr").hide(),t.find(".wf_attr").val(""),t.find(".wf_default").show()):(t.find(".wf_attr").show(),t.find(".wf_default").hide(),t.find(".wf_default").val(""))}).on("change",".wf_mattributes, .attr_type",function(){var e=r(this).closest("tr"),t=e.find(".wf_mattributes"),n=e.find(".attr_type"),a=e.find("td:eq(4)"),i=r("#provider").val();if("current_category"===t.val()&&"pattern"===n.val()&&d.in_array(i,["google","facebook","pinterest"])){if(0===a.find("select.selectize").length){d.selectize_render_item;a.find("input.wf_default").remove(),a.append('<span class="wf_default wf_attributes"><select name="default[]" class="selectize"></select></span>'),a.append('<span style="font-size:x-small;"><a style="color: red" href="http://webappick.helpscoutdocs.com/article/19-how-to-map-store-category-with-merchant-category" target="_blank">'+l.learn_more+"</a></span>"),c||a.append('<span class="spinner is-active" style="margin: 0;"></span>');var o=a.find(".wf_attributes select");d.selectize(o,{preload:!0,placeholder:l.form.select_category,load:function(e,t){c?t(c):s.send("get_google_categories",{type:"GET",data:{_ajax_nonce:l.nonce,action:"get_google_categories",provider:i}}).then(function(e){t(c=e),a.find(".spinner").remove()}).fail(d.ajax_fail)}})}}else"current_category"!==t.val()&&0===a.find("input.wf_default").length&&(a.find("span").remove(),a.append('<input autocomplete="off" class="wf_default wf_attributes" type="text" name="default[]" value="">'),"pattern"!==n.val()&&a.find("input.wf_default").hide())}).trigger("change"),r(".outputType").fancySelect(),r(t).trigger(new jQuery.Event("feedEditor.init",{target:this.form}))}},renderMerchantInfo:function(e,t,n){for(var a in n)if(n.hasOwnProperty(a)&&(e.find(".merchant-info-section."+a+" .data").html(n[a]),"feed_file_type"===a)){var i=n[a].split(",").map(function(e){return e.trim().toLowerCase()}).filter(function(e){return""!==e&&e!==l.na.toLowerCase()});i.length?(t.find("option").removeAttr("selected").each(function(){var e=r(this);e.val()&&!d.in_array(e.val(),i)?e.disabled(!0):e.disabled(!1)}),1===i.length&&t.find('option[value="'+i[0]+'"]').attr("selected","selected")):t.find("option").disabled(!1)}e.find(".spinner").removeClass("is-active"),t.disabled(!1),t.trigger("change"),t.parent().find(".spinner").removeClass("is-active")},renderMerchantTemplate:function(e,t){for(var n in t)if(t.hasOwnProperty(n))if("tabs"===n)e.html(t[n]);else{var a=r('[name="'+n+'"]');a.length&&a.each(function(){var e=r(this);e.is("select")?e.find('[value="'+t[n]+'"]').prop("selected",!0):(e.is("[type=checkbox]")||e.is("[type=radio]"))&&e.val()===t[n]?e.prop("checked",!0):e.val(t[n])}).trigger("change")}f.init()}},p=[],u=[];e.wf={helper:d,feedEditor:f},r(e).load(function(){o=r(".toClipboard"),null!=r(location).attr("href").match(/webappick.*feed/g)&&r("#wpbody-content").addClass("woofeed-body-content"),r("[data-toggle_slide]").on("click",function(e){e.preventDefault(),r(r(this).data("toggle_slide")).slideToggle("fast")}),postboxes.add_postbox_toggles(pagenow),!ClipboardJS.isSupported()||/iPhone|iPad/i.test(navigator.userAgent)?o.find("img").hide(0):(o.each(function(){r(this).on("mouseleave",n).on("blur",n)}),new ClipboardJS(".toClipboard").on("error",function(e){var t,n;a(e.trigger,(t=e.action,n="cut"===t?"X":"C",/iPhone|iPad/i.test(navigator.userAgent)?"No support :(":/Mac/i.test(navigator.userAgent)?"Press ⌘-"+n+" to "+t:"Press Ctrl-"+n+" to "+t))}).on("success",function(e){a(e.trigger,"Copied!")})),f.init(),d.selectize(),r(t).on("click","#wf_newRow",function(){r("#table-1 tbody tr:first").clone().find("input").val("").end().find("select:not('.wfnoempty')").val("").end().insertAfter("#table-1 tbody tr:last"),r(".outputType").each(function(e){r(this).attr("name","output_type["+e+"][]")})}),r("#feedType,#provider").on("change",function(){var e=r("#feedType").val(),t=r("#provider").val(),n=r(".itemWrapper"),a=r(".wf_csvtxt");"xml"===e?(n.show(),a.hide()):"csv"===e||"txt"===e?(n.hide(),a.show()):""===e&&(n.hide(),a.hide()),""!==e&&d.in_array(t,["google","facebook","pinterest"])&&n.hide()}).trigger("change"),r(".wfmasterTooltip").hover(function(){var e=r(this).attr("wftitle");r(this).data("tipText",e).removeAttr("wftitle"),r('<p class="wftooltip"></p>').text(e).appendTo("body").fadeIn("slow")},function(){r(this).attr("wftitle",r(this).data("tipText")),r(".wftooltip").remove()}).mousemove(function(e){r(".wftooltip").css({top:e.pageY+10,left:e.pageX+20})}),r(t).on("change",".dType",function(){var e=r(this).val(),t=r(this).closest("tr");"pattern"===e?(t.find(".value_attribute").hide(),t.find(".value_pattern").show()):"attribute"===e?(t.find(".value_attribute").show(),t.find(".value_pattern").hide()):"remove"===e&&(t.find(".value_attribute").hide(),t.find(".value_pattern").hide())}),r(t).on("click",".delRow",function(e){e.preventDefault(),r(this).closest("tr").remove()}),r(".generateFeed").validate(),r(t).on("submit","#generateFeed",function(){r(this).validate(),r(this).valid()&&r(".makeFeedResponse").show().html('<b style="color: darkblue;"><i class="dashicons dashicons-sos wpf_spin"></i> '+l.form.generate+"</b>")}),r(".updatefeed").validate(),r('[name="save_feed_config"]').on("click",function(e){e.preventDefault(),r("#updatefeed").trigger("submit",{save:!0})}),r(t).on("submit","#updatefeed",function(e,t){r(this).validate(),r(this).valid()&&r(".makeFeedResponse").show().html('<b style="color: darkblue;"><i class="dashicons dashicons-sos wpf_spin"></i> '+(t&&t.save?l.form.save:l.form.generate)+"</b>")}),r("#provider").on("change",function(e){if(e.preventDefault(),r(this).closest(".generateFeed").hasClass("add-new")){var t=r(this).val(),n=r("#feedType"),a=r("#providerPage"),i=r("#feed_merchant_info");a.html('<h3><span style="float:none;margin: -3px 0 0;" class="spinner is-active"></span> '+l.form.loading_tmpl+"</h3>"),i.find(".spinner").addClass("is-active"),n.disabled(!0),n.parent().find(".spinner").addClass("is-active"),i.find(".merchant-info-section .data").html(""),p.hasOwnProperty(t)?f.renderMerchantInfo(i,n,p[t]):s.send("woo_feed_get_merchant_info",{type:"GET",data:{nonce:l.nonce,provider:t}}).then(function(e){p[t]=e,f.renderMerchantInfo(i,n,e)}).fail(d.ajax_fail),u.hasOwnProperty(t)?f.renderMerchantTemplate(a,u[t]):s.post("get_feed_merchant",{_ajax_nonce:l.nonce,merchant:t}).then(function(e){u[t]=e,f.renderMerchantTemplate(a,e)}).fail(d.ajax_fail)}}),r(".woo_feed_status_input").on("change",function(){var e=r(this).val(),t=r(this)[0].checked?1:0;s.post("update_feed_status",{_ajax_nonce:l.nonce,feedName:e,status:t})}),r("#woo_feed_settings_error_copy_clipboard_button").on("click",function(){r("#woo_feed_settings_error_report").select(),t.execCommand("copy"),e.getSelection?e.getSelection().removeAllRanges():t.selection&&t.selection.empty()}),r(t).on("change",".ftporsftp",function(){var e=r(this).val(),t=r(".ssh2_status");"sftp"===e?(t.show().css("color","dodgerblue").text(l.form.sftp_checking),s.post("get_ssh2_status",{_ajax_nonce:l.nonce,server:e}).then(function(e){"exists"===e?(t.css("color","#2CC185").text(l.form.sftp_available),setTimeout(function(){t.hide()},1500)):t.show().css("color","red").text(l.form.sftp_warning)}).fail(function(e){t.hide(),d.ajax_fail(e)})):t.hide()})})}(jQuery,window,document,wp.ajax,wpf_ajax_obj);
admin/partials/templates/common_add-feed.php CHANGED
@@ -25,14 +25,14 @@ global $provider, $feedRules;
25
  <?php
26
 
27
  foreach ( $feedRules['mattributes'] as $key => $value ) {
28
- $prefix = $feedRules['prefix'][ $key ];
29
- $attrSelected = ( 'attribute' == $feedRules['type'][ $key ] ) ? 'selected' : '';
30
- $patternSelected = ( 'pattern' == $feedRules['type'][ $key ] ) ? 'selected' : '';
31
- $attribute = $feedRules['attributes'][ $key ];
32
- $pattern = $feedRules['default'][ $key ];
33
- $suffix = $feedRules['suffix'][ $key ];
34
- $outputType = $feedRules['output_type'][ $key ];
35
- $limit = $feedRules['limit'][ $key ];
36
  ?>
37
  <tr>
38
  <td><i class="wf_sortedtable dashicons dashicons-menu"></i></td>
@@ -61,14 +61,12 @@ global $provider, $feedRules;
61
  <input type="text" name="suffix[]" autocomplete="off" value="<?php echo esc_attr( $suffix ); ?>" class="wf_ps">
62
  </td>
63
  <td>
64
- <select name="output_type[][]" class="outputType wfnoempty">
65
  <?php
66
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
67
- echo $wooFeedDropDown->outputTypes( $outputType );
68
  ?>
69
  </select>
70
- <i class="dashicons dashicons-editor-expand expandType"></i>
71
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
72
  </td>
73
  <td>
74
  <input type="text" value="<?php echo esc_attr( $limit ); ?>" name="limit[]" class="wf_ps">
25
  <?php
26
 
27
  foreach ( $feedRules['mattributes'] as $key => $value ) {
28
+ $prefix = $feedRules['prefix'][ $key ];
29
+ $attrSelected = ( 'attribute' == $feedRules['type'][ $key ] ) ? 'selected' : '';
30
+ $patternSelected = ( 'pattern' == $feedRules['type'][ $key ] ) ? 'selected' : '';
31
+ $attribute = $feedRules['attributes'][ $key ];
32
+ $pattern = $feedRules['default'][ $key ];
33
+ $suffix = $feedRules['suffix'][ $key ];
34
+ $outputType = $feedRules['output_type'][ $key ];
35
+ $limit = $feedRules['limit'][ $key ];
36
  ?>
37
  <tr>
38
  <td><i class="wf_sortedtable dashicons dashicons-menu"></i></td>
61
  <input type="text" name="suffix[]" autocomplete="off" value="<?php echo esc_attr( $suffix ); ?>" class="wf_ps">
62
  </td>
63
  <td>
64
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
65
  <?php
66
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
67
+ echo $wooFeedDropDown->outputTypes( $outputType );
68
  ?>
69
  </select>
 
 
70
  </td>
71
  <td>
72
  <input type="text" value="<?php echo esc_attr( $limit ); ?>" name="limit[]" class="wf_ps">
admin/partials/templates/custom_add-feed.php CHANGED
@@ -50,14 +50,12 @@ if ( ! defined( 'ABSPATH' ) ) {
50
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
51
  </td>
52
  <td>
53
- <select name="output_type[][]" class="outputType wfnoempty">
54
  <?php
55
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
56
  echo $wooFeedDropDown->outputTypes();
57
  ?>
58
  </select>
59
- <i class="dashicons dashicons-editor-expand expandType"></i>
60
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
61
  </td>
62
  <td>
63
  <input type="text" name="limit[]" class="wf_ps">
50
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
51
  </td>
52
  <td>
53
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
54
  <?php
55
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
56
  echo $wooFeedDropDown->outputTypes();
57
  ?>
58
  </select>
 
 
59
  </td>
60
  <td>
61
  <input type="text" name="limit[]" class="wf_ps">
admin/partials/templates/facebook_add-feed.php CHANGED
@@ -30,7 +30,7 @@ global $provider;
30
  <select name="mattributes[]" required class="wf_mattributes">
31
  <?php
32
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
33
- echo $wooFeedDropDown->googleAttributesDropdown( 'id' );
34
  ?>
35
  </select>
36
  </td>
@@ -56,14 +56,12 @@ global $provider;
56
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
57
  </td>
58
  <td>
59
- <select name="output_type[][]" class="outputType wfnoempty">
60
  <?php
61
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
62
  echo $wooFeedDropDown->outputTypes();
63
  ?>
64
  </select>
65
- <i class="dashicons dashicons-editor-expand expandType"></i>
66
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
67
  </td>
68
  <td>
69
  <input type="text" name="limit[]" class="wf_ps">
@@ -80,7 +78,7 @@ global $provider;
80
  <select name="mattributes[]" required class="wf_mattributes">
81
  <?php
82
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
83
- echo $wooFeedDropDown->googleAttributesDropdown( 'title' );
84
  ?>
85
  </select>
86
  </td>
@@ -106,14 +104,12 @@ global $provider;
106
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
107
  </td>
108
  <td>
109
- <select name="output_type[][]" class="outputType wfnoempty">
110
  <?php
111
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
112
  echo $wooFeedDropDown->outputTypes();
113
  ?>
114
  </select>
115
- <i class="dashicons dashicons-editor-expand expandType"></i>
116
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
117
  </td>
118
  <td>
119
  <input type="text" name="limit[]" class="wf_ps">
@@ -130,7 +126,7 @@ global $provider;
130
  <select name="mattributes[]" required class="wf_mattributes">
131
  <?php
132
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
133
- echo $wooFeedDropDown->googleAttributesDropdown( 'description' );
134
  ?>
135
  </select>
136
  </td>
@@ -156,14 +152,12 @@ global $provider;
156
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
157
  </td>
158
  <td>
159
- <select name="output_type[][]" class="outputType wfnoempty">
160
  <?php
161
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
162
  echo $wooFeedDropDown->outputTypes();
163
  ?>
164
  </select>
165
- <i class="dashicons dashicons-editor-expand expandType"></i>
166
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
167
  </td>
168
  <td>
169
  <input type="text" name="limit[]" class="wf_ps">
@@ -180,7 +174,7 @@ global $provider;
180
  <select name="mattributes[]" required class="wf_mattributes">
181
  <?php
182
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
183
- echo $wooFeedDropDown->googleAttributesDropdown( 'item_group_id' );
184
  ?>
185
  </select>
186
  </td>
@@ -206,14 +200,12 @@ global $provider;
206
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
207
  </td>
208
  <td>
209
- <select name="output_type[][]" class="outputType wfnoempty">
210
  <?php
211
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
212
  echo $wooFeedDropDown->outputTypes();
213
  ?>
214
  </select>
215
- <i class="dashicons dashicons-editor-expand expandType"></i>
216
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
217
  </td>
218
  <td>
219
  <input type="text" name="limit[]" class="wf_ps">
@@ -230,7 +222,7 @@ global $provider;
230
  <select name="mattributes[]" required class="wf_mattributes">
231
  <?php
232
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
233
- echo $wooFeedDropDown->googleAttributesDropdown( 'link' );
234
  ?>
235
  </select>
236
  </td>
@@ -256,14 +248,12 @@ global $provider;
256
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
257
  </td>
258
  <td>
259
- <select name="output_type[][]" class="outputType wfnoempty">
260
  <?php
261
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
262
  echo $wooFeedDropDown->outputTypes();
263
  ?>
264
  </select>
265
- <i class="dashicons dashicons-editor-expand expandType"></i>
266
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
267
  </td>
268
  <td>
269
  <input type="text" name="limit[]" class="wf_ps">
@@ -280,7 +270,7 @@ global $provider;
280
  <select name="mattributes[]" required class="wf_mattributes">
281
  <?php
282
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
283
- echo $wooFeedDropDown->googleAttributesDropdown( 'product_type' );
284
  ?>
285
  </select>
286
  </td>
@@ -306,14 +296,12 @@ global $provider;
306
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
307
  </td>
308
  <td>
309
- <select name="output_type[][]" class="outputType wfnoempty">
310
  <?php
311
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
312
  echo $wooFeedDropDown->outputTypes();
313
  ?>
314
  </select>
315
- <i class="dashicons dashicons-editor-expand expandType"></i>
316
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
317
  </td>
318
  <td>
319
  <input type="text" name="limit[]" class="wf_ps">
@@ -330,7 +318,7 @@ global $provider;
330
  <select name="mattributes[]" required class="wf_mattributes">
331
  <?php
332
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
333
- echo $wooFeedDropDown->googleAttributesDropdown( 'current_category' );
334
  ?>
335
  </select>
336
  </td>
@@ -351,7 +339,7 @@ global $provider;
351
  ?>
352
  </select>
353
  <span class="wf_default wf_attributes">
354
- <select name="default[]" class="selectize">
355
  <?php
356
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
357
  echo $wooFeedDropDown->googleTaxonomy();
@@ -364,14 +352,12 @@ global $provider;
364
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
365
  </td>
366
  <td>
367
- <select name="output_type[][]" class="outputType wfnoempty">
368
  <?php
369
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
370
  echo $wooFeedDropDown->outputTypes();
371
  ?>
372
  </select>
373
- <i class="dashicons dashicons-editor-expand expandType"></i>
374
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
375
  </td>
376
  <td>
377
  <input type="text" name="limit[]" class="wf_ps">
@@ -388,7 +374,7 @@ global $provider;
388
  <select name="mattributes[]" required class="wf_mattributes">
389
  <?php
390
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
391
- echo $wooFeedDropDown->googleAttributesDropdown( 'image' );
392
  ?>
393
  </select>
394
  </td>
@@ -414,14 +400,12 @@ global $provider;
414
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
415
  </td>
416
  <td>
417
- <select name="output_type[][]" class="outputType wfnoempty">
418
  <?php
419
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
420
  echo $wooFeedDropDown->outputTypes();
421
  ?>
422
  </select>
423
- <i class="dashicons dashicons-editor-expand expandType"></i>
424
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
425
  </td>
426
  <td>
427
  <input type="text" name="limit[]" class="wf_ps">
@@ -438,7 +422,7 @@ global $provider;
438
  <select name="mattributes[]" required class="wf_mattributes">
439
  <?php
440
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
441
- echo $wooFeedDropDown->googleAttributesDropdown( 'condition' );
442
  ?>
443
  </select>
444
  </td>
@@ -465,14 +449,12 @@ global $provider;
465
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
466
  </td>
467
  <td>
468
- <select name="output_type[][]" class="outputType wfnoempty">
469
  <?php
470
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
471
  echo $wooFeedDropDown->outputTypes();
472
  ?>
473
  </select>
474
- <i class="dashicons dashicons-editor-expand expandType"></i>
475
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
476
  </td>
477
  <td>
478
  <input type="text" name="limit[]" class="wf_ps">
@@ -489,7 +471,7 @@ global $provider;
489
  <select name="mattributes[]" required class="wf_mattributes">
490
  <?php
491
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
492
- echo $wooFeedDropDown->googleAttributesDropdown( 'availability' );
493
  ?>
494
  </select>
495
  </td>
@@ -515,14 +497,12 @@ global $provider;
515
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
516
  </td>
517
  <td>
518
- <select name="output_type[][]" class="outputType wfnoempty">
519
  <?php
520
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
521
  echo $wooFeedDropDown->outputTypes();
522
  ?>
523
  </select>
524
- <i class="dashicons dashicons-editor-expand expandType"></i>
525
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
526
  </td>
527
  <td>
528
  <input type="text" name="limit[]" class="wf_ps">
@@ -539,7 +519,7 @@ global $provider;
539
  <select name="mattributes[]" required class="wf_mattributes">
540
  <?php
541
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
542
- echo $wooFeedDropDown->googleAttributesDropdown( 'price' );
543
  ?>
544
  </select>
545
  </td>
@@ -565,14 +545,12 @@ global $provider;
565
  <input type="text" name="suffix[]" value="<?php echo esc_attr( get_woocommerce_currency() ); ?>" autocomplete="off" class="wf_ps">
566
  </td>
567
  <td>
568
- <select name="output_type[][]" class="outputType wfnoempty">
569
  <?php
570
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
571
- echo $wooFeedDropDown->outputTypes();
572
  ?>
573
  </select>
574
- <i class="dashicons dashicons-editor-expand expandType"></i>
575
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
576
  </td>
577
  <td>
578
  <input type="text" name="limit[]" class="wf_ps">
@@ -589,7 +567,7 @@ global $provider;
589
  <select name="mattributes[]" required class="wf_mattributes">
590
  <?php
591
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
592
- echo $wooFeedDropDown->googleAttributesDropdown( 'sku' );
593
  ?>
594
  </select>
595
  </td>
@@ -615,14 +593,12 @@ global $provider;
615
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
616
  </td>
617
  <td>
618
- <select name="output_type[][]" class="outputType wfnoempty">
619
  <?php
620
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
621
  echo $wooFeedDropDown->outputTypes();
622
  ?>
623
  </select>
624
- <i class="dashicons dashicons-editor-expand expandType"></i>
625
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
626
  </td>
627
  <td>
628
  <input type="text" name="limit[]" class="wf_ps">
@@ -639,7 +615,7 @@ global $provider;
639
  <select name="mattributes[]" required class="wf_mattributes">
640
  <?php
641
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
642
- echo $wooFeedDropDown->googleAttributesDropdown( 'brand' );
643
  ?>
644
  </select>
645
  </td>
@@ -666,14 +642,12 @@ global $provider;
666
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
667
  </td>
668
  <td>
669
- <select name="output_type[][]" class="outputType wfnoempty">
670
  <?php
671
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
672
  echo $wooFeedDropDown->outputTypes();
673
  ?>
674
  </select>
675
- <i class="dashicons dashicons-editor-expand expandType"></i>
676
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
677
  </td>
678
  <td>
679
  <input type="text" name="limit[]" class="wf_ps">
30
  <select name="mattributes[]" required class="wf_mattributes">
31
  <?php
32
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
33
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'id' );
34
  ?>
35
  </select>
36
  </td>
56
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
57
  </td>
58
  <td>
59
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
60
  <?php
61
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
62
  echo $wooFeedDropDown->outputTypes();
63
  ?>
64
  </select>
 
 
65
  </td>
66
  <td>
67
  <input type="text" name="limit[]" class="wf_ps">
78
  <select name="mattributes[]" required class="wf_mattributes">
79
  <?php
80
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
81
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'title' );
82
  ?>
83
  </select>
84
  </td>
104
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
105
  </td>
106
  <td>
107
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
108
  <?php
109
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
110
  echo $wooFeedDropDown->outputTypes();
111
  ?>
112
  </select>
 
 
113
  </td>
114
  <td>
115
  <input type="text" name="limit[]" class="wf_ps">
126
  <select name="mattributes[]" required class="wf_mattributes">
127
  <?php
128
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
129
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'description' );
130
  ?>
131
  </select>
132
  </td>
152
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
153
  </td>
154
  <td>
155
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
156
  <?php
157
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
158
  echo $wooFeedDropDown->outputTypes();
159
  ?>
160
  </select>
 
 
161
  </td>
162
  <td>
163
  <input type="text" name="limit[]" class="wf_ps">
174
  <select name="mattributes[]" required class="wf_mattributes">
175
  <?php
176
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
177
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'item_group_id' );
178
  ?>
179
  </select>
180
  </td>
200
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
201
  </td>
202
  <td>
203
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
204
  <?php
205
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
206
  echo $wooFeedDropDown->outputTypes();
207
  ?>
208
  </select>
 
 
209
  </td>
210
  <td>
211
  <input type="text" name="limit[]" class="wf_ps">
222
  <select name="mattributes[]" required class="wf_mattributes">
223
  <?php
224
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
225
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'link' );
226
  ?>
227
  </select>
228
  </td>
248
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
249
  </td>
250
  <td>
251
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
252
  <?php
253
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
254
  echo $wooFeedDropDown->outputTypes();
255
  ?>
256
  </select>
 
 
257
  </td>
258
  <td>
259
  <input type="text" name="limit[]" class="wf_ps">
270
  <select name="mattributes[]" required class="wf_mattributes">
271
  <?php
272
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
273
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'product_type' );
274
  ?>
275
  </select>
276
  </td>
296
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
297
  </td>
298
  <td>
299
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
300
  <?php
301
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
302
  echo $wooFeedDropDown->outputTypes();
303
  ?>
304
  </select>
 
 
305
  </td>
306
  <td>
307
  <input type="text" name="limit[]" class="wf_ps">
318
  <select name="mattributes[]" required class="wf_mattributes">
319
  <?php
320
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
321
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'current_category' );
322
  ?>
323
  </select>
324
  </td>
339
  ?>
340
  </select>
341
  <span class="wf_default wf_attributes">
342
+ <select name="default[]" class="selectize" data-placeholder="<?php esc_attr_e( 'Select A Category', 'woo-feed' ); ?>">
343
  <?php
344
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
345
  echo $wooFeedDropDown->googleTaxonomy();
352
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
353
  </td>
354
  <td>
355
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
356
  <?php
357
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
358
  echo $wooFeedDropDown->outputTypes();
359
  ?>
360
  </select>
 
 
361
  </td>
362
  <td>
363
  <input type="text" name="limit[]" class="wf_ps">
374
  <select name="mattributes[]" required class="wf_mattributes">
375
  <?php
376
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
377
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'image' );
378
  ?>
379
  </select>
380
  </td>
400
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
401
  </td>
402
  <td>
403
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
404
  <?php
405
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
406
  echo $wooFeedDropDown->outputTypes();
407
  ?>
408
  </select>
 
 
409
  </td>
410
  <td>
411
  <input type="text" name="limit[]" class="wf_ps">
422
  <select name="mattributes[]" required class="wf_mattributes">
423
  <?php
424
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
425
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'condition' );
426
  ?>
427
  </select>
428
  </td>
449
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
450
  </td>
451
  <td>
452
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
453
  <?php
454
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
455
  echo $wooFeedDropDown->outputTypes();
456
  ?>
457
  </select>
 
 
458
  </td>
459
  <td>
460
  <input type="text" name="limit[]" class="wf_ps">
471
  <select name="mattributes[]" required class="wf_mattributes">
472
  <?php
473
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
474
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'availability' );
475
  ?>
476
  </select>
477
  </td>
497
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
498
  </td>
499
  <td>
500
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
501
  <?php
502
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
503
  echo $wooFeedDropDown->outputTypes();
504
  ?>
505
  </select>
 
 
506
  </td>
507
  <td>
508
  <input type="text" name="limit[]" class="wf_ps">
519
  <select name="mattributes[]" required class="wf_mattributes">
520
  <?php
521
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
522
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'price' );
523
  ?>
524
  </select>
525
  </td>
545
  <input type="text" name="suffix[]" value="<?php echo esc_attr( get_woocommerce_currency() ); ?>" autocomplete="off" class="wf_ps">
546
  </td>
547
  <td>
548
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
549
  <?php
550
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
551
+ echo $wooFeedDropDown->outputTypes( 6 );
552
  ?>
553
  </select>
 
 
554
  </td>
555
  <td>
556
  <input type="text" name="limit[]" class="wf_ps">
567
  <select name="mattributes[]" required class="wf_mattributes">
568
  <?php
569
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
570
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'sku' );
571
  ?>
572
  </select>
573
  </td>
593
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
594
  </td>
595
  <td>
596
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
597
  <?php
598
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
599
  echo $wooFeedDropDown->outputTypes();
600
  ?>
601
  </select>
 
 
602
  </td>
603
  <td>
604
  <input type="text" name="limit[]" class="wf_ps">
615
  <select name="mattributes[]" required class="wf_mattributes">
616
  <?php
617
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
618
+ echo $wooFeedDropDown->facebookAttributesDropdown( 'brand' );
619
  ?>
620
  </select>
621
  </td>
642
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
643
  </td>
644
  <td>
645
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
646
  <?php
647
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
648
  echo $wooFeedDropDown->outputTypes();
649
  ?>
650
  </select>
 
 
651
  </td>
652
  <td>
653
  <input type="text" name="limit[]" class="wf_ps">
admin/partials/templates/google_add-feed.php CHANGED
@@ -56,14 +56,12 @@ global $provider;
56
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
57
  </td>
58
  <td>
59
- <select name="output_type[][]" class="outputType wfnoempty">
60
  <?php
61
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
62
  echo $wooFeedDropDown->outputTypes();
63
  ?>
64
  </select>
65
- <i class="dashicons dashicons-editor-expand expandType"></i>
66
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
67
  </td>
68
  <td>
69
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -106,14 +104,12 @@ global $provider;
106
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
107
  </td>
108
  <td>
109
- <select name="output_type[][]" class="outputType wfnoempty">
110
  <?php
111
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
112
  echo $wooFeedDropDown->outputTypes();
113
  ?>
114
  </select>
115
- <i class="dashicons dashicons-editor-expand expandType"></i>
116
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
117
  </td>
118
  <td>
119
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -156,14 +152,12 @@ global $provider;
156
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
157
  </td>
158
  <td>
159
- <select name="output_type[][]" class="outputType wfnoempty">
160
  <?php
161
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
162
  echo $wooFeedDropDown->outputTypes();
163
  ?>
164
  </select>
165
- <i class="dashicons dashicons-editor-expand expandType"></i>
166
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
167
  </td>
168
  <td>
169
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -206,14 +200,12 @@ global $provider;
206
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
207
  </td>
208
  <td>
209
- <select name="output_type[][]" class="outputType wfnoempty">
210
  <?php
211
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
212
  echo $wooFeedDropDown->outputTypes();
213
  ?>
214
  </select>
215
- <i class="dashicons dashicons-editor-expand expandType"></i>
216
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
217
  </td>
218
  <td>
219
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -256,14 +248,12 @@ global $provider;
256
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
257
  </td>
258
  <td>
259
- <select name="output_type[][]" class="outputType wfnoempty">
260
  <?php
261
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
262
  echo $wooFeedDropDown->outputTypes();
263
  ?>
264
  </select>
265
- <i class="dashicons dashicons-editor-expand expandType"></i>
266
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
267
  </td>
268
  <td>
269
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -306,14 +296,12 @@ global $provider;
306
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
307
  </td>
308
  <td>
309
- <select name="output_type[][]" class="outputType wfnoempty">
310
  <?php
311
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
312
  echo $wooFeedDropDown->outputTypes();
313
  ?>
314
  </select>
315
- <i class="dashicons dashicons-editor-expand expandType"></i>
316
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
317
  </td>
318
  <td>
319
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -352,7 +340,7 @@ global $provider;
352
  <!-- </td>-->
353
  <td>
354
  <span class="wf_default wf_attributes">
355
- <select name="default[]" class="selectize">
356
  <?php
357
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
358
  echo $wooFeedDropDown->googleTaxonomy();
@@ -371,14 +359,12 @@ global $provider;
371
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
372
  </td>
373
  <td>
374
- <select name="output_type[][]" class="outputType wfnoempty">
375
  <?php
376
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
377
  echo $wooFeedDropDown->outputTypes();
378
  ?>
379
  </select>
380
- <i class="dashicons dashicons-editor-expand expandType"></i>
381
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
382
  </td>
383
  <td>
384
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -421,14 +407,12 @@ global $provider;
421
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
422
  </td>
423
  <td>
424
- <select name="output_type[][]" class="outputType wfnoempty">
425
  <?php
426
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
427
  echo $wooFeedDropDown->outputTypes();
428
  ?>
429
  </select>
430
- <i class="dashicons dashicons-editor-expand expandType"></i>
431
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
432
  </td>
433
  <td>
434
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -472,14 +456,12 @@ global $provider;
472
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
473
  </td>
474
  <td>
475
- <select name="output_type[][]" class="outputType wfnoempty">
476
  <?php
477
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
478
  echo $wooFeedDropDown->outputTypes();
479
  ?>
480
  </select>
481
- <i class="dashicons dashicons-editor-expand expandType"></i>
482
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
483
  </td>
484
  <td>
485
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -522,14 +504,12 @@ global $provider;
522
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
523
  </td>
524
  <td>
525
- <select name="output_type[][]" class="outputType wfnoempty">
526
  <?php
527
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
528
  echo $wooFeedDropDown->outputTypes();
529
  ?>
530
  </select>
531
- <i class="dashicons dashicons-editor-expand expandType"></i>
532
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
533
  </td>
534
  <td>
535
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -572,14 +552,12 @@ global $provider;
572
  <input type="text" name="suffix[]" value="<?php echo esc_attr( get_woocommerce_currency() ); ?>" autocomplete="off" class="wf_ps">
573
  </td>
574
  <td>
575
- <select name="output_type[][]" class="outputType wfnoempty">
576
  <?php
577
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
578
- echo $wooFeedDropDown->outputTypes();
579
  ?>
580
  </select>
581
- <i class="dashicons dashicons-editor-expand expandType"></i>
582
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
583
  </td>
584
  <td>
585
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -622,14 +600,12 @@ global $provider;
622
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
623
  </td>
624
  <td>
625
- <select name="output_type[][]" class="outputType wfnoempty">
626
  <?php
627
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
628
  echo $wooFeedDropDown->outputTypes();
629
  ?>
630
  </select>
631
- <i class="dashicons dashicons-editor-expand expandType"></i>
632
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
633
  </td>
634
  <td>
635
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -672,14 +648,12 @@ global $provider;
672
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
673
  </td>
674
  <td>
675
- <select name="output_type[][]" class="outputType wfnoempty">
676
  <?php
677
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
678
  echo $wooFeedDropDown->outputTypes();
679
  ?>
680
  </select>
681
- <i class="dashicons dashicons-editor-expand expandType"></i>
682
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
683
  </td>
684
  <td>
685
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
56
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
57
  </td>
58
  <td>
59
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
60
  <?php
61
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
62
  echo $wooFeedDropDown->outputTypes();
63
  ?>
64
  </select>
 
 
65
  </td>
66
  <td>
67
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
104
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
105
  </td>
106
  <td>
107
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
108
  <?php
109
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
110
  echo $wooFeedDropDown->outputTypes();
111
  ?>
112
  </select>
 
 
113
  </td>
114
  <td>
115
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
152
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
153
  </td>
154
  <td>
155
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
156
  <?php
157
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
158
  echo $wooFeedDropDown->outputTypes();
159
  ?>
160
  </select>
 
 
161
  </td>
162
  <td>
163
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
200
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
201
  </td>
202
  <td>
203
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
204
  <?php
205
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
206
  echo $wooFeedDropDown->outputTypes();
207
  ?>
208
  </select>
 
 
209
  </td>
210
  <td>
211
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
248
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
249
  </td>
250
  <td>
251
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
252
  <?php
253
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
254
  echo $wooFeedDropDown->outputTypes();
255
  ?>
256
  </select>
 
 
257
  </td>
258
  <td>
259
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
296
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
297
  </td>
298
  <td>
299
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
300
  <?php
301
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
302
  echo $wooFeedDropDown->outputTypes();
303
  ?>
304
  </select>
 
 
305
  </td>
306
  <td>
307
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
340
  <!-- </td>-->
341
  <td>
342
  <span class="wf_default wf_attributes">
343
+ <select name="default[]" class="selectize" data-placeholder="<?php esc_attr_e( 'Select A Category', 'woo-feed' ); ?>">
344
  <?php
345
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
346
  echo $wooFeedDropDown->googleTaxonomy();
359
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
360
  </td>
361
  <td>
362
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
363
  <?php
364
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
365
  echo $wooFeedDropDown->outputTypes();
366
  ?>
367
  </select>
 
 
368
  </td>
369
  <td>
370
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
407
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
408
  </td>
409
  <td>
410
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
411
  <?php
412
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
413
  echo $wooFeedDropDown->outputTypes();
414
  ?>
415
  </select>
 
 
416
  </td>
417
  <td>
418
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
456
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
457
  </td>
458
  <td>
459
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
460
  <?php
461
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
462
  echo $wooFeedDropDown->outputTypes();
463
  ?>
464
  </select>
 
 
465
  </td>
466
  <td>
467
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
504
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
505
  </td>
506
  <td>
507
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
508
  <?php
509
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
510
  echo $wooFeedDropDown->outputTypes();
511
  ?>
512
  </select>
 
 
513
  </td>
514
  <td>
515
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
552
  <input type="text" name="suffix[]" value="<?php echo esc_attr( get_woocommerce_currency() ); ?>" autocomplete="off" class="wf_ps">
553
  </td>
554
  <td>
555
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
556
  <?php
557
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
558
+ echo $wooFeedDropDown->outputTypes( 6 );
559
  ?>
560
  </select>
 
 
561
  </td>
562
  <td>
563
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
600
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
601
  </td>
602
  <td>
603
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
604
  <?php
605
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
606
  echo $wooFeedDropDown->outputTypes();
607
  ?>
608
  </select>
 
 
609
  </td>
610
  <td>
611
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
648
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
649
  </td>
650
  <td>
651
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
652
  <?php
653
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
654
  echo $wooFeedDropDown->outputTypes();
655
  ?>
656
  </select>
 
 
657
  </td>
658
  <td>
659
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
admin/partials/templates/pinterest_add-feed.php CHANGED
@@ -30,7 +30,7 @@ global $provider;
30
  <select name="mattributes[]" required class="wf_mattributes">
31
  <?php
32
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
33
- echo $wooFeedDropDown->googleAttributesDropdown( 'id' );
34
  ?>
35
  </select>
36
  </td>
@@ -56,14 +56,12 @@ global $provider;
56
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
57
  </td>
58
  <td>
59
- <select name="output_type[][]" class="outputType wfnoempty">
60
  <?php
61
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
62
  echo $wooFeedDropDown->outputTypes();
63
  ?>
64
  </select>
65
- <i class="dashicons dashicons-editor-expand expandType"></i>
66
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
67
  </td>
68
  <td>
69
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -80,7 +78,7 @@ global $provider;
80
  <select name="mattributes[]" required class="wf_mattributes">
81
  <?php
82
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
83
- echo $wooFeedDropDown->googleAttributesDropdown( 'title' );
84
  ?>
85
  </select>
86
  </td>
@@ -106,14 +104,12 @@ global $provider;
106
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
107
  </td>
108
  <td>
109
- <select name="output_type[][]" class="outputType wfnoempty">
110
  <?php
111
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
112
  echo $wooFeedDropDown->outputTypes();
113
  ?>
114
  </select>
115
- <i class="dashicons dashicons-editor-expand expandType"></i>
116
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
117
  </td>
118
  <td>
119
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -130,7 +126,7 @@ global $provider;
130
  <select name="mattributes[]" required class="wf_mattributes">
131
  <?php
132
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
133
- echo $wooFeedDropDown->googleAttributesDropdown( 'description' );
134
  ?>
135
  </select>
136
  </td>
@@ -156,14 +152,12 @@ global $provider;
156
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
157
  </td>
158
  <td>
159
- <select name="output_type[][]" class="outputType wfnoempty">
160
  <?php
161
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
162
  echo $wooFeedDropDown->outputTypes();
163
  ?>
164
  </select>
165
- <i class="dashicons dashicons-editor-expand expandType"></i>
166
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
167
  </td>
168
  <td>
169
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -180,7 +174,7 @@ global $provider;
180
  <select name="mattributes[]" required class="wf_mattributes">
181
  <?php
182
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
183
- echo $wooFeedDropDown->googleAttributesDropdown( 'item_group_id' );
184
  ?>
185
  </select>
186
  </td>
@@ -206,14 +200,12 @@ global $provider;
206
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
207
  </td>
208
  <td>
209
- <select name="output_type[][]" class="outputType wfnoempty">
210
  <?php
211
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
212
  echo $wooFeedDropDown->outputTypes();
213
  ?>
214
  </select>
215
- <i class="dashicons dashicons-editor-expand expandType"></i>
216
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
217
  </td>
218
  <td>
219
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -230,7 +222,7 @@ global $provider;
230
  <select name="mattributes[]" required class="wf_mattributes">
231
  <?php
232
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
233
- echo $wooFeedDropDown->googleAttributesDropdown( 'link' );
234
  ?>
235
  </select>
236
  </td>
@@ -256,14 +248,12 @@ global $provider;
256
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
257
  </td>
258
  <td>
259
- <select name="output_type[][]" class="outputType wfnoempty">
260
  <?php
261
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
262
  echo $wooFeedDropDown->outputTypes();
263
  ?>
264
  </select>
265
- <i class="dashicons dashicons-editor-expand expandType"></i>
266
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
267
  </td>
268
  <td>
269
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -280,7 +270,7 @@ global $provider;
280
  <select name="mattributes[]" required class="wf_mattributes">
281
  <?php
282
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
283
- echo $wooFeedDropDown->googleAttributesDropdown( 'product_type' );
284
  ?>
285
  </select>
286
  </td>
@@ -306,14 +296,12 @@ global $provider;
306
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
307
  </td>
308
  <td>
309
- <select name="output_type[][]" class="outputType wfnoempty">
310
  <?php
311
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
312
  echo $wooFeedDropDown->outputTypes();
313
  ?>
314
  </select>
315
- <i class="dashicons dashicons-editor-expand expandType"></i>
316
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
317
  </td>
318
  <td>
319
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -330,7 +318,7 @@ global $provider;
330
  <select name="mattributes[]" required class="wf_mattributes">
331
  <?php
332
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
333
- echo $wooFeedDropDown->googleAttributesDropdown( 'current_category' );
334
  ?>
335
  </select>
336
  </td>
@@ -352,7 +340,7 @@ global $provider;
352
  <!-- </td>-->
353
  <td>
354
  <span class="wf_default wf_attributes">
355
- <select name="default[]" class="selectize">
356
  <?php
357
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
358
  echo $wooFeedDropDown->googleTaxonomy();
@@ -371,14 +359,12 @@ global $provider;
371
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
372
  </td>
373
  <td>
374
- <select name="output_type[][]" class="outputType wfnoempty">
375
  <?php
376
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
377
  echo $wooFeedDropDown->outputTypes();
378
  ?>
379
  </select>
380
- <i class="dashicons dashicons-editor-expand expandType"></i>
381
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
382
  </td>
383
  <td>
384
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -395,7 +381,7 @@ global $provider;
395
  <select name="mattributes[]" required class="wf_mattributes">
396
  <?php
397
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
398
- echo $wooFeedDropDown->googleAttributesDropdown( 'image' );
399
  ?>
400
  </select>
401
  </td>
@@ -421,14 +407,12 @@ global $provider;
421
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
422
  </td>
423
  <td>
424
- <select name="output_type[][]" class="outputType wfnoempty">
425
  <?php
426
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
427
  echo $wooFeedDropDown->outputTypes();
428
  ?>
429
  </select>
430
- <i class="dashicons dashicons-editor-expand expandType"></i>
431
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
432
  </td>
433
  <td>
434
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -445,7 +429,7 @@ global $provider;
445
  <select name="mattributes[]" required class="wf_mattributes">
446
  <?php
447
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
448
- echo $wooFeedDropDown->googleAttributesDropdown( 'condition' );
449
  ?>
450
  </select>
451
  </td>
@@ -472,14 +456,12 @@ global $provider;
472
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
473
  </td>
474
  <td>
475
- <select name="output_type[][]" class="outputType wfnoempty">
476
  <?php
477
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
478
  echo $wooFeedDropDown->outputTypes();
479
  ?>
480
  </select>
481
- <i class="dashicons dashicons-editor-expand expandType"></i>
482
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
483
  </td>
484
  <td>
485
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -496,7 +478,7 @@ global $provider;
496
  <select name="mattributes[]" required class="wf_mattributes">
497
  <?php
498
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
499
- echo $wooFeedDropDown->googleAttributesDropdown( 'availability' );
500
  ?>
501
  </select>
502
  </td>
@@ -522,14 +504,12 @@ global $provider;
522
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
523
  </td>
524
  <td>
525
- <select name="output_type[][]" class="outputType wfnoempty">
526
  <?php
527
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
528
  echo $wooFeedDropDown->outputTypes();
529
  ?>
530
  </select>
531
- <i class="dashicons dashicons-editor-expand expandType"></i>
532
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
533
  </td>
534
  <td>
535
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -546,7 +526,7 @@ global $provider;
546
  <select name="mattributes[]" required class="wf_mattributes">
547
  <?php
548
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
549
- echo $wooFeedDropDown->googleAttributesDropdown( 'price' );
550
  ?>
551
  </select>
552
  </td>
@@ -572,14 +552,12 @@ global $provider;
572
  <input type="text" name="suffix[]" value="<?php echo esc_attr( get_woocommerce_currency() ); ?>" autocomplete="off" class="wf_ps">
573
  </td>
574
  <td>
575
- <select name="output_type[][]" class="outputType wfnoempty">
576
  <?php
577
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
578
- echo $wooFeedDropDown->outputTypes();
579
  ?>
580
  </select>
581
- <i class="dashicons dashicons-editor-expand expandType"></i>
582
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
583
  </td>
584
  <td>
585
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -596,7 +574,7 @@ global $provider;
596
  <select name="mattributes[]" required class="wf_mattributes">
597
  <?php
598
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
599
- echo $wooFeedDropDown->googleAttributesDropdown( 'sku' );
600
  ?>
601
  </select>
602
  </td>
@@ -622,14 +600,12 @@ global $provider;
622
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
623
  </td>
624
  <td>
625
- <select name="output_type[][]" class="outputType wfnoempty">
626
  <?php
627
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
628
  echo $wooFeedDropDown->outputTypes();
629
  ?>
630
  </select>
631
- <i class="dashicons dashicons-editor-expand expandType"></i>
632
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
633
  </td>
634
  <td>
635
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
@@ -646,7 +622,7 @@ global $provider;
646
  <select name="mattributes[]" required class="wf_mattributes">
647
  <?php
648
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
649
- echo $wooFeedDropDown->googleAttributesDropdown( 'brand' );
650
  ?>
651
  </select>
652
  </td>
@@ -672,14 +648,12 @@ global $provider;
672
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
673
  </td>
674
  <td>
675
- <select name="output_type[][]" class="outputType wfnoempty">
676
  <?php
677
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
678
  echo $wooFeedDropDown->outputTypes();
679
  ?>
680
  </select>
681
- <i class="dashicons dashicons-editor-expand expandType"></i>
682
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
683
  </td>
684
  <td>
685
  <input type="text" name="limit[]" class="wf_ps">
30
  <select name="mattributes[]" required class="wf_mattributes">
31
  <?php
32
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
33
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'id' );
34
  ?>
35
  </select>
36
  </td>
56
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
57
  </td>
58
  <td>
59
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
60
  <?php
61
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
62
  echo $wooFeedDropDown->outputTypes();
63
  ?>
64
  </select>
 
 
65
  </td>
66
  <td>
67
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
78
  <select name="mattributes[]" required class="wf_mattributes">
79
  <?php
80
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
81
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'title' );
82
  ?>
83
  </select>
84
  </td>
104
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
105
  </td>
106
  <td>
107
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
108
  <?php
109
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
110
  echo $wooFeedDropDown->outputTypes();
111
  ?>
112
  </select>
 
 
113
  </td>
114
  <td>
115
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
126
  <select name="mattributes[]" required class="wf_mattributes">
127
  <?php
128
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
129
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'description' );
130
  ?>
131
  </select>
132
  </td>
152
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
153
  </td>
154
  <td>
155
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
156
  <?php
157
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
158
  echo $wooFeedDropDown->outputTypes();
159
  ?>
160
  </select>
 
 
161
  </td>
162
  <td>
163
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
174
  <select name="mattributes[]" required class="wf_mattributes">
175
  <?php
176
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
177
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'item_group_id' );
178
  ?>
179
  </select>
180
  </td>
200
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
201
  </td>
202
  <td>
203
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
204
  <?php
205
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
206
  echo $wooFeedDropDown->outputTypes();
207
  ?>
208
  </select>
 
 
209
  </td>
210
  <td>
211
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
222
  <select name="mattributes[]" required class="wf_mattributes">
223
  <?php
224
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
225
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'link' );
226
  ?>
227
  </select>
228
  </td>
248
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
249
  </td>
250
  <td>
251
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
252
  <?php
253
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
254
  echo $wooFeedDropDown->outputTypes();
255
  ?>
256
  </select>
 
 
257
  </td>
258
  <td>
259
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
270
  <select name="mattributes[]" required class="wf_mattributes">
271
  <?php
272
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
273
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'product_type' );
274
  ?>
275
  </select>
276
  </td>
296
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
297
  </td>
298
  <td>
299
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
300
  <?php
301
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
302
  echo $wooFeedDropDown->outputTypes();
303
  ?>
304
  </select>
 
 
305
  </td>
306
  <td>
307
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
318
  <select name="mattributes[]" required class="wf_mattributes">
319
  <?php
320
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
321
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'current_category' );
322
  ?>
323
  </select>
324
  </td>
340
  <!-- </td>-->
341
  <td>
342
  <span class="wf_default wf_attributes">
343
+ <select name="default[]" class="selectize" data-placeholder="<?php esc_attr_e( 'Select A Category', 'woo-feed' ); ?>">
344
  <?php
345
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
346
  echo $wooFeedDropDown->googleTaxonomy();
359
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
360
  </td>
361
  <td>
362
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
363
  <?php
364
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
365
  echo $wooFeedDropDown->outputTypes();
366
  ?>
367
  </select>
 
 
368
  </td>
369
  <td>
370
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
381
  <select name="mattributes[]" required class="wf_mattributes">
382
  <?php
383
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
384
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'image' );
385
  ?>
386
  </select>
387
  </td>
407
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
408
  </td>
409
  <td>
410
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
411
  <?php
412
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
413
  echo $wooFeedDropDown->outputTypes();
414
  ?>
415
  </select>
 
 
416
  </td>
417
  <td>
418
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
429
  <select name="mattributes[]" required class="wf_mattributes">
430
  <?php
431
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
432
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'condition' );
433
  ?>
434
  </select>
435
  </td>
456
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
457
  </td>
458
  <td>
459
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
460
  <?php
461
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
462
  echo $wooFeedDropDown->outputTypes();
463
  ?>
464
  </select>
 
 
465
  </td>
466
  <td>
467
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
478
  <select name="mattributes[]" required class="wf_mattributes">
479
  <?php
480
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
481
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'availability' );
482
  ?>
483
  </select>
484
  </td>
504
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
505
  </td>
506
  <td>
507
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
508
  <?php
509
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
510
  echo $wooFeedDropDown->outputTypes();
511
  ?>
512
  </select>
 
 
513
  </td>
514
  <td>
515
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
526
  <select name="mattributes[]" required class="wf_mattributes">
527
  <?php
528
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
529
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'price' );
530
  ?>
531
  </select>
532
  </td>
552
  <input type="text" name="suffix[]" value="<?php echo esc_attr( get_woocommerce_currency() ); ?>" autocomplete="off" class="wf_ps">
553
  </td>
554
  <td>
555
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
556
  <?php
557
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
558
+ echo $wooFeedDropDown->outputTypes( 6 );
559
  ?>
560
  </select>
 
 
561
  </td>
562
  <td>
563
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
574
  <select name="mattributes[]" required class="wf_mattributes">
575
  <?php
576
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
577
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'sku' );
578
  ?>
579
  </select>
580
  </td>
600
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
601
  </td>
602
  <td>
603
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
604
  <?php
605
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
606
  echo $wooFeedDropDown->outputTypes();
607
  ?>
608
  </select>
 
 
609
  </td>
610
  <td>
611
  <input type="text" name="limit[]" autocomplete="off" class="wf_ps">
622
  <select name="mattributes[]" required class="wf_mattributes">
623
  <?php
624
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
625
+ echo $wooFeedDropDown->pinterestAttributesDropdown( 'brand' );
626
  ?>
627
  </select>
628
  </td>
648
  <input type="text" name="suffix[]" autocomplete="off" class="wf_ps">
649
  </td>
650
  <td>
651
+ <select name="output_type[][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
652
  <?php
653
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
654
  echo $wooFeedDropDown->outputTypes();
655
  ?>
656
  </select>
 
 
657
  </td>
658
  <td>
659
  <input type="text" name="limit[]" class="wf_ps">
admin/partials/woo-feed-edit-config.php CHANGED
@@ -62,7 +62,7 @@ if ( ! defined( 'ABSPATH' ) ) {
62
  </select>
63
  <?php if ( in_array( $feedRules['provider'], array( 'google', 'facebook', 'pinterest' ) ) && 'current_category' == $mAttribute ) { ?>
64
  <span <?php echo ( 'pattern' == $type[ $merchant ] ) ? '' : 'style=" display: none;" '; ?>class="wf_default wf_attributes">
65
- <select name="default[]" class="selectize">
66
  <?php
67
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
68
  echo $wooFeedDropDown->googleTaxonomy( esc_attr( $default[ $merchant ] ) );
@@ -78,7 +78,7 @@ if ( ! defined( 'ABSPATH' ) ) {
78
  <input type="text" name="suffix[]" value="<?php echo esc_attr( stripslashes( $suffix[ $merchant ] ) ); ?>" autocomplete="off" class="wf_ps"/>
79
  </td>
80
  <td>
81
- <select name="output_type[<?php echo esc_attr( $counter ); ?>][]" class="outputType wfnoempty" <?php echo ( isset( $outputType[ $counter ] ) && is_array( $outputType[ $counter ] ) && count( $outputType[ $counter ] ) > 1 ) ? 'multiple="multiple"' : ''; ?>>
82
  <?php
83
  foreach ( woo_feed_get_field_output_type_options() as $key => $option ) {
84
  if ( isset( $outputType[ $counter ] ) ) {
@@ -94,8 +94,6 @@ if ( ! defined( 'ABSPATH' ) ) {
94
  }
95
  ?>
96
  </select>
97
- <i class="dashicons dashicons-editor-expand expandType"></i>
98
- <i style="display: none;" class="dashicons dashicons-editor-contract contractType"></i>
99
  </td>
100
  <td>
101
  <input type="text" name="limit[]" value="<?php echo esc_attr( $limit[ $merchant ] ); ?>" autocomplete="off" class="wf_ps"/>
62
  </select>
63
  <?php if ( in_array( $feedRules['provider'], array( 'google', 'facebook', 'pinterest' ) ) && 'current_category' == $mAttribute ) { ?>
64
  <span <?php echo ( 'pattern' == $type[ $merchant ] ) ? '' : 'style=" display: none;" '; ?>class="wf_default wf_attributes">
65
+ <select name="default[]" class="selectize" data-placeholder="<?php esc_attr_e( 'Select A Category', 'woo-feed' ); ?>">
66
  <?php
67
  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
68
  echo $wooFeedDropDown->googleTaxonomy( esc_attr( $default[ $merchant ] ) );
78
  <input type="text" name="suffix[]" value="<?php echo esc_attr( stripslashes( $suffix[ $merchant ] ) ); ?>" autocomplete="off" class="wf_ps"/>
79
  </td>
80
  <td>
81
+ <select name="output_type[<?php echo esc_attr( $counter ); ?>][]" class="outputType wfnoempty" data-placeholder="<?php esc_attr_e( 'Select Output Type', 'woo-feed' ); ?>" multiple>
82
  <?php
83
  foreach ( woo_feed_get_field_output_type_options() as $key => $option ) {
84
  if ( isset( $outputType[ $counter ] ) ) {
94
  }
95
  ?>
96
  </select>
 
 
97
  </td>
98
  <td>
99
  <input type="text" name="limit[]" value="<?php echo esc_attr( $limit[ $merchant ] ); ?>" autocomplete="off" class="wf_ps"/>
admin/partials/woo-feed-edit-tabs.php CHANGED
@@ -16,7 +16,7 @@ $editorTabs = array(
16
  'label' => __( 'Feed Config', 'woo-feed' ),
17
  'callback' => 'render_feed_config',
18
  ),
19
- 'filter' => array(
20
  'label' => __( 'Filter', 'woo-feed' ),
21
  'callback' => 'render_filter_config',
22
  ),
16
  'label' => __( 'Feed Config', 'woo-feed' ),
17
  'callback' => 'render_feed_config',
18
  ),
19
+ 'filter' => array(
20
  'label' => __( 'Filter', 'woo-feed' ),
21
  'callback' => 'render_filter_config',
22
  ),
includes/class-woo-feed-activator.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Fired during plugin activation
5
- *
6
- * @link http://example.com
7
- * @since 1.0.0
8
- *
9
- * @package Woo_Feed
10
- * @subpackage Woo_Feed/includes
11
- */
12
-
13
- /**
14
- * Fired during plugin activation.
15
- *
16
- * This class defines all code necessary to run during the plugin's activation.
17
- *
18
- * @since 1.0.0
19
- * @package Woo_Feed
20
- * @subpackage Woo_Feed/includes
21
- * @author Your Name <email@example.com>
22
- */
23
- class Woo_Feed_Activator
24
- {
25
-
26
- /**
27
- * Short Description. (use period)
28
- *
29
- * Long Description.
30
- *
31
- * @since 1.0.0
32
- */
33
- public static function activate() {
34
- # Schedule Update Interval
35
- update_option('wf_schedule', '86400');
36
- # Schedule Cron
37
- wp_schedule_event(time(), 'woo_feed_corn', 'woo_feed_update');
38
-
39
-
40
- }
41
-
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/class-woo-feed-deactivator.php DELETED
@@ -1,36 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Fired during plugin deactivation
5
- *
6
- * @link http://example.com
7
- * @since 1.0.0
8
- *
9
- * @package Woo_Feed
10
- * @subpackage Woo_Feed/includes
11
- */
12
-
13
- /**
14
- * Fired during plugin deactivation.
15
- *
16
- * This class defines all code necessary to run during the plugin's deactivation.
17
- *
18
- * @since 1.0.0
19
- * @package Woo_Feed
20
- * @subpackage Woo_Feed/includes
21
- * @author Ohidul Islam <wahid@webappick.com>
22
- */
23
- class Woo_Feed_Deactivator {
24
-
25
- /**
26
- * Short Description. (use period)
27
- *
28
- * Long Description.
29
- *
30
- * @since 1.0.0
31
- */
32
- public static function deactivate() {
33
- wp_clear_scheduled_hook('woo_feed_update');
34
- }
35
-
36
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/class-woo-feed-docs.php CHANGED
@@ -50,105 +50,72 @@ if ( ! class_exists( 'WooFeedDocs' ) ) {
50
  <div class="wrap wapk-admin wapk-feed-docs">
51
  <div class="wapk-section">
52
  <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
53
- </div>
54
- <?php if ( ! empty( $faqs ) ) { ?>
55
- <div class="wapk-section">
56
- <?php
57
- foreach ( $faqs as $faq ) {
58
- $boxId = ( isset( $faq->id ) ) ? $faq->id : sanitize_title( $faq->title );
59
- ?>
60
- <div id="<?php echo esc_attr( $boxId ); ?>" class="postbox <?php echo esc_attr( postbox_classes( $boxId, $current_screen->id ) ); ?>">
61
- <button type="button" class="handlediv" aria-expanded="true">
62
- <span class="screen-reader-text">
 
 
 
 
 
 
 
 
 
 
 
63
  <?php
64
- /* translators: %s: FAQ Title */
65
- printf( esc_html__( 'Toggle panel: %s', 'woo-feed' ), esc_html( $faq->title ) )
66
- ?>
67
- </span>
68
- <span class="toggle-indicator" aria-hidden="true"></span>
69
- </button>
70
- <h2 class="hndle">
71
- <?php
72
- if ( isset( $faq->icon ) && ! empty( $faq->icon ) ) {
73
  ?>
74
- <span class="<?php printf( '%s%s', ( strpos( $faq->icon, 'dashicons' ) !== false ) ? 'dashicons ' : '', esc_attr( $faq->icon ) ); ?>" aria-hidden="true"></span>
75
- <?php
76
- }
77
- ?>
78
- <span><?php echo esc_html( $faq->title ); ?></span></h2>
79
- <div class="inside">
80
- <div class="main">
81
- <ul>
82
- <?php foreach ( $faq->questions as $qa ) { ?>
83
- <li>
84
- <span class="
85
- <?php
86
- if ( isset( $qa->icon ) ) {
87
- printf( '%s%s', ( strpos( $qa->icon, 'dashicons' ) !== false ) ? 'dashicons ' : '', esc_attr( $qa->icon ) );
88
- } else {
89
- ?>dashicons dashicons-media-text<?php
90
- } ?>" aria-hidden="true"></span>
91
- <a href="<?php echo esc_url( $qa->link ); ?>" target="_blank"><?php echo esc_html( $qa->title ); ?></a>
92
- </li>
93
- <?php } ?>
94
- </ul>
95
- </div>
96
- </div>
97
- </div>
98
- <?php } ?>
99
- </div>
100
- <div class="clear"></div>
101
- <div class="wapk-section wapk-feed-cta">
102
- <div class="wapk-cta">
103
- <div class="wapk-cta-icon">
104
- <span class="dashicons dashicons-editor-help" aria-hidden="true"></span>
105
- </div>
106
- <div class="wapk-cta-content">
107
- <h2><?php _e( 'Still need help?', 'woo-feed' ); ?></h2>
108
- <p>
109
- <?php
110
- _e(
111
- 'Have we not answered your question?<br>Don\'t worry, you can contact us for more information...',
112
- 'woo-feed'
113
- )
114
- ?>
115
- </p>
116
- </div>
117
- <div class="wapk-cta-action">
118
- <a href="https://webappick.com/support/" class="button button-primary button-hero" target="_blank"><?php _e( 'Get Support', 'woo-feed' ); ?></a>
119
  </div>
120
  </div>
121
  </div>
122
- <?php } else { ?>
 
123
  <div class="notice notice-warning">
124
- <p>
125
- <?php
126
- printf(
127
  /* translators: %s: Reload Button */
128
- esc_html__( 'There\'s some problem loading the docs. Please Click %s To Fetch Again.', 'woo-feed' ),
129
- sprintf(
130
- '<a href="%s">%s</a>',
131
- esc_url( admin_url( 'admin.php?page=webappick-feed-docs&reload=1&_nonce=' . wp_create_nonce( 'webappick-feed-docs' ) ) ),
132
- esc_html__( 'Here', 'woo-feed' )
133
- )
134
- );
135
- ?>
136
- </p>
137
- <p>
138
- <?php
139
- printf(
140
- /* translators: %s: Support Button */
141
- esc_html__( 'If the problem persist please contact %s.', 'woo-feed' ),
142
- sprintf(
143
- '<a href="%s">%s</a>',
144
- 'https://webappick.com/support/',
145
- esc_html__( 'our support', 'woo-feed' )
146
- )
147
- );
148
- ?>
149
- </p>
150
  </div>
151
- <?php } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  </div>
153
  <?php
154
  }
@@ -160,10 +127,7 @@ if ( ! class_exists( 'WooFeedDocs' ) ) {
160
  */
161
  private function __get_feed_help() {
162
  // force fetch docs json.
163
- if ( isset( $_GET['reload'], $_GET['_nonce'] ) && wp_verify_nonce(
164
- sanitize_text_field( $_GET['_nonce'] ),
165
- 'webappick-feed-docs'
166
- ) ) {
167
  $help_docs = false;
168
  } else {
169
  $help_docs = get_transient( 'webappick_feed_help_docs' );
50
  <div class="wrap wapk-admin wapk-feed-docs">
51
  <div class="wapk-section">
52
  <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
53
+ <?php if ( ! empty( $faqs ) ) { ?>
54
+ <?php
55
+ foreach ( $faqs as $faq ) {
56
+ $boxId = ( isset( $faq->id ) ) ? $faq->id : sanitize_title( $faq->title );
57
+ if ( ! isset( $faq->icon ) ) $faq->icon = 'dashicons-admin-generic';
58
+ ?>
59
+ <div id="<?php echo esc_attr( $boxId ); ?>" class="postbox <?php echo esc_attr( postbox_classes( $boxId, $current_screen->id ) ); ?>">
60
+ <button type="button" class="handlediv" aria-expanded="true">
61
+ <span class="screen-reader-text"><?php
62
+ /* translators: %s: FAQ Title */
63
+ printf( esc_html__( 'Toggle panel: %s', 'woo-feed' ), esc_html( $faq->title ) )
64
+ ?></span>
65
+ <span class="toggle-indicator" aria-hidden="true"></span>
66
+ </button>
67
+ <h2 class="hndle">
68
+ <span class="<?php printf( '%s%s', ( strpos( $faq->icon, 'dashicons' ) !== false ) ? 'dashicons ' : '', esc_attr( $faq->icon ) ); ?>" aria-hidden="true"></span>
69
+ <span><?php echo esc_html( $faq->title ); ?></span>
70
+ </h2>
71
+ <div class="inside">
72
+ <div class="main">
73
+ <ul>
74
  <?php
75
+ foreach ( $faq->questions as $qa ) {
76
+ if ( ! isset( $qa->icon ) ) $qa->icon = 'dashicons-media-text';
 
 
 
 
 
 
 
77
  ?>
78
+ <li>
79
+ <span class="<?php printf( '%s%s', ( strpos( $qa->icon, 'dashicons' ) !== false ) ? 'dashicons ' : '', esc_attr( $qa->icon ) ); ?>" aria-hidden="true"></span>
80
+ <a href="<?php echo esc_url( $qa->link ); ?>" target="_blank"><?php echo esc_html( $qa->title ); ?></a>
81
+ </li>
82
+ <?php } ?>
83
+ </ul>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  </div>
85
  </div>
86
  </div>
87
+ <?php } ?>
88
+ <?php } else { ?>
89
  <div class="notice notice-warning">
90
+ <p><?php
91
+ printf(
 
92
  /* translators: %s: Reload Button */
93
+ esc_html__( 'There\'s some problem loading the docs. Please Click %s To Fetch Again.', 'woo-feed' ),
94
+ sprintf(
95
+ '<a href="%s">%s</a>',
96
+ esc_url( admin_url( 'admin.php?page=webappick-feed-docs&reload=1&_nonce=' . wp_create_nonce( 'webappick-feed-docs' ) ) ),
97
+ esc_html__( 'Here', 'woo-feed' )
98
+ )
99
+ );
100
+ ?></p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  </div>
102
+ <?php } ?>
103
+ </div>
104
+ <div class="clear"></div>
105
+ <div class="wapk-section wapk-feed-cta">
106
+ <div class="wapk-cta">
107
+ <div class="wapk-cta-icon">
108
+ <span class="dashicons dashicons-editor-help" aria-hidden="true"></span>
109
+ </div>
110
+ <div class="wapk-cta-content">
111
+ <h2><?php _e( 'Still need help?', 'woo-feed' ); ?></h2>
112
+ <p><?php _e( 'Have we not answered your question?<br>Don\'t worry, you can contact us for more information...', 'woo-feed' ); ?></p>
113
+ </div>
114
+ <div class="wapk-cta-action">
115
+ <a href="https://wordpress.org/support/plugin/webappick-product-feed-for-woocommerce/#new-topic-0" class="wapk-button wapk-button-primary wapk-button-hero" rel="noopener" target="_blank"><?php _e( 'Get Support', 'woo-feed' ); ?></a>
116
+ </div>
117
+ </div>
118
+ </div>
119
  </div>
120
  <?php
121
  }
127
  */
128
  private function __get_feed_help() {
129
  // force fetch docs json.
130
+ if ( isset( $_GET['reload'], $_GET['_nonce'] ) && wp_verify_nonce( sanitize_text_field( $_GET['_nonce'] ), 'webappick-feed-docs' ) ) {
 
 
 
131
  $help_docs = false;
132
  } else {
133
  $help_docs = get_transient( 'webappick_feed_help_docs' );
includes/class-woo-feed-i18n.php CHANGED
@@ -53,7 +53,7 @@ class Woo_Feed_i18n {
53
  * Set the domain equal to that of the specified domain.
54
  *
55
  * @since 1.0.0
56
- * @param string $domain The domain that represents the locale of this plugin.
57
  */
58
  public function set_domain( $domain ) {
59
  $this->domain = $domain;
53
  * Set the domain equal to that of the specified domain.
54
  *
55
  * @since 1.0.0
56
+ * @param string $domain The domain that represents the locale of this plugin.
57
  */
58
  public function set_domain( $domain ) {
59
  $this->domain = $domain;
includes/class-woo-feed-loader.php CHANGED
@@ -57,11 +57,11 @@ class Woo_Feed_Loader {
57
  * Add a new action to the collection to be registered with WordPress.
58
  *
59
  * @since 1.0.0
60
- * @param string $hook The name of the WordPress action that is being registered.
61
- * @param object $component A reference to the instance of the object on which the action is defined.
62
- * @param string $callback The name of the function definition on the $component.
63
- * @param int $priority Optional. he priority at which the function should be fired. Default is 10.
64
- * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1.
65
  */
66
  public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
67
  $this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args );
@@ -71,14 +71,15 @@ class Woo_Feed_Loader {
71
  * Add a new filter to the collection to be registered with WordPress.
72
  *
73
  * @since 1.0.0
74
- * @param string $hook The name of the WordPress filter that is being registered.
75
- * @param object $component A reference to the instance of the object on which the filter is defined.
76
- * @param string $callback The name of the function definition on the $component.
77
- * @param int $priority Optional. he priority at which the function should be fired. Default is 10.
78
- * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1
79
  */
80
  public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
81
  $this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args );
 
82
  }
83
 
84
  /**
@@ -87,12 +88,12 @@ class Woo_Feed_Loader {
87
  *
88
  * @since 1.0.0
89
  * @access private
90
- * @param array $hooks The collection of hooks that is being registered (that is, actions or filters).
91
- * @param string $hook The name of the WordPress filter that is being registered.
92
- * @param object $component A reference to the instance of the object on which the filter is defined.
93
- * @param string $callback The name of the function definition on the $component.
94
- * @param int $priority The priority at which the function should be fired.
95
- * @param int $accepted_args The number of arguments that should be passed to the $callback.
96
  * @return array The collection of actions and filters registered with WordPress.
97
  */
98
  private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) {
@@ -125,5 +126,4 @@ class Woo_Feed_Loader {
125
  }
126
 
127
  }
128
-
129
- }
57
  * Add a new action to the collection to be registered with WordPress.
58
  *
59
  * @since 1.0.0
60
+ * @param string $hook The name of the WordPress action that is being registered.
61
+ * @param object $component A reference to the instance of the object on which the action is defined.
62
+ * @param string $callback The name of the function definition on the $component.
63
+ * @param int $priority Optional. he priority at which the function should be fired. Default is 10.
64
+ * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1.
65
  */
66
  public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
67
  $this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args );
71
  * Add a new filter to the collection to be registered with WordPress.
72
  *
73
  * @since 1.0.0
74
+ * @param string $hook The name of the WordPress filter that is being registered.
75
+ * @param object $component A reference to the instance of the object on which the filter is defined.
76
+ * @param string $callback The name of the function definition on the $component.
77
+ * @param int $priority Optional. he priority at which the function should be fired. Default is 10.
78
+ * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1
79
  */
80
  public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
81
  $this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args );
82
+
83
  }
84
 
85
  /**
88
  *
89
  * @since 1.0.0
90
  * @access private
91
+ * @param array $hooks The collection of hooks that is being registered (that is, actions or filters).
92
+ * @param string $hook The name of the WordPress filter that is being registered.
93
+ * @param object $component A reference to the instance of the object on which the filter is defined.
94
+ * @param string $callback The name of the function definition on the $component.
95
+ * @param int $priority The priority at which the function should be fired.
96
+ * @param int $accepted_args The number of arguments that should be passed to the $callback.
97
  * @return array The collection of actions and filters registered with WordPress.
98
  */
99
  private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) {
126
  }
127
 
128
  }
129
+ }
 
includes/class-woo-feed.php CHANGED
@@ -13,6 +13,7 @@
13
  * @subpackage Woo_Feed/includes
14
  */
15
  /** @define "WOO_FEED_FREE_PATH''./../" */
 
16
  /**
17
  * The core plugin class.
18
  *
@@ -27,240 +28,234 @@
27
  * @subpackage Woo_Feed/includes
28
  * @author Wahid <wahid0003@gmail.com.com>
29
  */
30
- class Woo_Feed
31
- {
32
-
33
- /**
34
- * The loader that's responsible for maintaining and registering all hooks that power
35
- * the plugin.
36
- *
37
- * @since 1.0.0
38
- * @access protected
39
- * @var Woo_Feed_Loader $loader Maintains and registers all hooks for the plugin.
40
- */
41
- protected $loader;
42
-
43
- /**
44
- * The unique identifier of this plugin.
45
- *
46
- * @since 1.0.0
47
- * @access protected
48
- * @var string $woo_feed The string used to uniquely identify this plugin.
49
- */
50
- protected $woo_feed;
51
-
52
- /**
53
- * The current version of the plugin.
54
- *
55
- * @since 1.0.0
56
- * @access protected
57
- * @var string $version The current version of the plugin.
58
- */
59
- protected $version;
60
-
61
- /**
62
- * Define the core functionality of the plugin.
63
- *
64
- * Set the plugin name and the plugin version that can be used throughout the plugin.
65
- * Load the dependencies, define the locale, and set the hooks for the admin area and
66
- * the public-facing side of the site.
67
- *
68
- * @since 1.0.0
69
- */
70
- public function __construct() {
71
- $this->woo_feed = 'woo-feed';
72
- $this->version = WOO_FEED_FREE_VERSION;
73
- }
74
-
75
-
76
-
77
- /**
78
- * Load the required dependencies for this plugin.
79
- *
80
- * Include the following files that make up the plugin:
81
- *
82
- * - Woo_Feed_Loader. Orchestrates the hooks of the plugin.
83
- * - Woo_Feed_i18n. Defines internationalization functionality.
84
- * - Woo_Feed_Admin. Defines all hooks for the admin area.
85
- * - Woo_Feed_Public. Defines all hooks for the public side of the site.
86
- *
87
- * Create an instance of the loader which will be used to register the hooks
88
- * with WordPress.
89
- *
90
- * @since 1.0.0
91
- * @access private
92
- */
93
- private function load_dependencies() {
94
- /**
95
- * Load Error Logger File Handler
96
- */
97
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-log-handler-file.php';
98
- /**
99
- * Support for older version of WooCommerce
100
- */
101
- require_once WOO_FEED_FREE_PATH . 'includes/wc-legacy-support.php';
102
- /**
103
- * The class responsible for orchestrating the actions and filters of the
104
- * core plugin.
105
- */
106
- require_once WOO_FEED_FREE_PATH . 'includes/class-woo-feed-loader.php';
107
-
108
- /**
109
- * The class responsible for defining internationalization functionality
110
- * of the plugin.
111
- */
112
- require_once WOO_FEED_FREE_PATH . 'includes/class-woo-feed-i18n.php';
113
-
114
- /**
115
- * The class responsible for getting all product information
116
- * of the plugin.
117
- */
118
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-products.php';
119
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-products-v3.php';
120
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-merchant.php';
121
-
122
- /**
123
- * The class responsible for processing feed
124
- */
125
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-engine.php';
126
-
127
- /**
128
- * The class contain all merchants attribute dropdown
129
- */
130
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-dropdown.php';
131
-
132
- /**
133
- * The class contain merchant attributes
134
- */
135
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-default-attributes.php';
136
-
137
- /**
138
- * The class responsible for generating feed
139
- */
140
- require_once WOO_FEED_FREE_PATH . 'includes/feeds/class-woo-feed-generate.php';
141
-
142
- /**
143
- * The class is a FTP library
144
- */
145
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-ftp.php';
146
-
147
- /**
148
- * The class responsible for save feed
149
- */
150
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-savefile.php';
151
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-admin-message.php';
152
- /**
153
- * Merchant classes
154
- */
155
- require_once WOO_FEED_FREE_PATH . 'includes/feeds/class-woo-feed-google.php';
156
- require_once WOO_FEED_FREE_PATH . 'includes/feeds/class-woo-feed-facebook.php';
157
- require_once WOO_FEED_FREE_PATH . 'includes/feeds/class-woo-feed-pinterest.php';
158
- require_once WOO_FEED_FREE_PATH . 'includes/feeds/class-woo-feed-custom.php';
159
- /**
160
- * Docs Page Class
161
- */
162
- require_once WOO_FEED_FREE_PATH . 'includes/class-woo-feed-docs.php';
163
- /**
164
- * The class responsible for defining all actions that occur in the admin area.
165
- */
166
- require_once WOO_FEED_FREE_PATH . 'admin/class-woo-feed-admin.php';
167
-
168
- /**
169
- * The class responsible for making list table
170
- */
171
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-list-table.php';
172
-
173
-
174
- /**
175
- * The class responsible for making feed list
176
- */
177
- require_once WOO_FEED_FREE_PATH . 'admin/class-woo-feed-manage-list.php';
178
-
179
- require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-sftp.php';
180
-
181
- $this->loader = new Woo_Feed_Loader();
182
-
183
- }
184
-
185
- /**
186
- * Define the locale for this plugin for internationalization.
187
- *
188
- * Uses the Woo_Feed_i18n class in order to set the domain and to register the hook
189
- * with WordPress.
190
- *
191
- * @since 1.0.0
192
- * @access private
193
- */
194
- private function set_locale() {
195
-
196
- $plugin_i18n = new Woo_Feed_i18n();
197
- $plugin_i18n->set_domain($this->get_woo_feed());
198
-
199
- $this->loader->add_action('plugins_loaded', $plugin_i18n, 'load_plugin_textdomain');
200
-
201
- }
202
-
203
- /**
204
- * Register all of the hooks related to the admin area functionality
205
- * of the plugin.
206
- *
207
- * @since 1.0.0
208
- * @access private
209
- */
210
- private function define_admin_hooks() {
211
-
212
- $plugin_admin = new Woo_Feed_Admin($this->get_woo_feed(), $this->get_version());
213
-
214
- $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_styles');
215
- $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts');
216
- $this->loader->add_action('admin_menu', $plugin_admin, 'load_admin_pages');
217
- $this->loader->add_action( 'admin_page_access_denied', $plugin_admin, 'handle_old_menu_slugs' );
218
- $this->loader->add_filter( 'plugin_action_links_' . WOO_FEED_PLUGIN_BASE_NAME, $plugin_admin, 'woo_feed_plugin_action_links' );
219
- }
220
-
221
- /**
222
- * Run the loader to execute all of the hooks with WordPress.
223
- *
224
- * @since 1.0.0
225
- */
226
- public function run() {
227
- if ( wooFeed_check_WC() && wooFeed_is_WC_supported() ) {
228
- $this->load_dependencies();
229
- $this->set_locale();
230
- $this->define_admin_hooks();
231
- $this->loader->run();
232
- }
233
- }
234
-
235
- /**
236
- * The name of the plugin used to uniquely identify it within the context of
237
- * WordPress and to define internationalization functionality.
238
- *
239
- * @since 1.0.0
240
- * @return string The name of the plugin.
241
- */
242
- public function get_woo_feed() {
243
- return $this->woo_feed;
244
- }
245
-
246
- /**
247
- * The reference to the class that orchestrates the hooks with the plugin.
248
- *
249
- * @since 1.0.0
250
- * @return Woo_Feed_Loader Orchestrates the hooks of the plugin.
251
- */
252
- public function get_loader() {
253
- return $this->loader;
254
- }
255
-
256
- /**
257
- * Retrieve the version number of the plugin.
258
- *
259
- * @since 1.0.0
260
- * @return string The version number of the plugin.
261
- */
262
- public function get_version() {
263
- return $this->version;
264
- }
265
-
266
  }
13
  * @subpackage Woo_Feed/includes
14
  */
15
  /** @define "WOO_FEED_FREE_PATH''./../" */
16
+
17
  /**
18
  * The core plugin class.
19
  *
28
  * @subpackage Woo_Feed/includes
29
  * @author Wahid <wahid0003@gmail.com.com>
30
  */
31
+ class Woo_Feed {
32
+
33
+ /**
34
+ * The loader that's responsible for maintaining and registering all hooks that power
35
+ * the plugin.
36
+ *
37
+ * @since 1.0.0
38
+ * @access protected
39
+ * @var Woo_Feed_Loader $loader Maintains and registers all hooks for the plugin.
40
+ */
41
+ protected $loader;
42
+
43
+ /**
44
+ * The unique identifier of this plugin.
45
+ *
46
+ * @since 1.0.0
47
+ * @access protected
48
+ * @var string $woo_feed The string used to uniquely identify this plugin.
49
+ */
50
+ protected $woo_feed;
51
+
52
+ /**
53
+ * The current version of the plugin.
54
+ *
55
+ * @since 1.0.0
56
+ * @access protected
57
+ * @var string $version The current version of the plugin.
58
+ */
59
+ protected $version;
60
+
61
+ /**
62
+ * Define the core functionality of the plugin.
63
+ *
64
+ * Set the plugin name and the plugin version that can be used throughout the plugin.
65
+ * Load the dependencies, define the locale, and set the hooks for the admin area and
66
+ * the public-facing side of the site.
67
+ *
68
+ * @since 1.0.0
69
+ */
70
+ public function __construct() {
71
+ $this->woo_feed = 'woo-feed';
72
+ $this->version = WOO_FEED_FREE_VERSION;
73
+ }
74
+
75
+
76
+ /**
77
+ * Load the required dependencies for this plugin.
78
+ *
79
+ * Include the following files that make up the plugin:
80
+ *
81
+ * - Woo_Feed_Loader. Orchestrates the hooks of the plugin.
82
+ * - Woo_Feed_i18n. Defines internationalization functionality.
83
+ * - Woo_Feed_Admin. Defines all hooks for the admin area.
84
+ * - Woo_Feed_Public. Defines all hooks for the public side of the site.
85
+ *
86
+ * Create an instance of the loader which will be used to register the hooks
87
+ * with WordPress.
88
+ *
89
+ * @since 1.0.0
90
+ * @access private
91
+ */
92
+ private function load_dependencies() {
93
+
94
+ /**
95
+ * Load Error Logger File Handler
96
+ */
97
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-log-handler-file.php';
98
+ /**
99
+ * Support for older version of WooCommerce
100
+ */
101
+ require_once WOO_FEED_FREE_PATH . 'includes/wc-legacy-support.php';
102
+ /**
103
+ * The class responsible for orchestrating the actions and filters of the
104
+ * core plugin.
105
+ */
106
+ require_once WOO_FEED_FREE_PATH . 'includes/class-woo-feed-loader.php';
107
+
108
+ /**
109
+ * The class responsible for defining internationalization functionality
110
+ * of the plugin.
111
+ */
112
+ require_once WOO_FEED_FREE_PATH . 'includes/class-woo-feed-i18n.php';
113
+
114
+ /**
115
+ * The class responsible for getting all product information
116
+ * of the plugin.
117
+ */
118
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-products.php';
119
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-products-v3.php';
120
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-merchant.php';
121
+
122
+ /**
123
+ * The class responsible for processing feed
124
+ */
125
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-engine.php';
126
+
127
+ /**
128
+ * The class contain all merchants attribute dropdown
129
+ */
130
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-dropdown.php';
131
+
132
+ /**
133
+ * The class contain merchant attributes
134
+ */
135
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-default-attributes.php';
136
+
137
+ /**
138
+ * The class responsible for generating feed
139
+ */
140
+ require_once WOO_FEED_FREE_PATH . 'includes/feeds/class-woo-feed-generate.php';
141
+
142
+ /**
143
+ * The class is a FTP library
144
+ */
145
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-ftp.php';
146
+
147
+ /**
148
+ * The class responsible for save feed
149
+ */
150
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-savefile.php';
151
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-admin-message.php';
152
+ /**
153
+ * Merchant classes
154
+ */
155
+ require_once WOO_FEED_FREE_PATH . 'includes/feeds/class-woo-feed-google.php';
156
+ require_once WOO_FEED_FREE_PATH . 'includes/feeds/class-woo-feed-facebook.php';
157
+ require_once WOO_FEED_FREE_PATH . 'includes/feeds/class-woo-feed-pinterest.php';
158
+ require_once WOO_FEED_FREE_PATH . 'includes/feeds/class-woo-feed-custom.php';
159
+ /**
160
+ * Docs Page Class
161
+ */
162
+ require_once WOO_FEED_FREE_PATH . 'includes/class-woo-feed-docs.php';
163
+ /**
164
+ * The class responsible for defining all actions that occur in the admin area.
165
+ */
166
+ require_once WOO_FEED_FREE_PATH . 'admin/class-woo-feed-admin.php';
167
+
168
+ /**
169
+ * The class responsible for making list table
170
+ */
171
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-list-table.php';
172
+
173
+
174
+ /**
175
+ * The class responsible for making feed list
176
+ */
177
+ require_once WOO_FEED_FREE_PATH . 'admin/class-woo-feed-manage-list.php';
178
+
179
+ require_once WOO_FEED_FREE_PATH . 'includes/classes/class-woo-feed-sftp.php';
180
+
181
+ $this->loader = new Woo_Feed_Loader();
182
+ }
183
+
184
+ /**
185
+ * Define the locale for this plugin for internationalization.
186
+ *
187
+ * Uses the Woo_Feed_i18n class in order to set the domain and to register the hook
188
+ * with WordPress.
189
+ *
190
+ * @since 1.0.0
191
+ * @access private
192
+ */
193
+ private function set_locale() {
194
+ $plugin_i18n = new Woo_Feed_i18n();
195
+ $plugin_i18n->set_domain( $this->get_woo_feed() );
196
+ $this->loader->add_action( 'plugins_loaded', $plugin_i18n, 'load_plugin_textdomain' );
197
+ }
198
+
199
+ /**
200
+ * Register all of the hooks related to the admin area functionality
201
+ * of the plugin.
202
+ *
203
+ * @since 1.0.0
204
+ * @access private
205
+ */
206
+ private function define_admin_hooks() {
207
+
208
+ $plugin_admin = new Woo_Feed_Admin( $this->get_woo_feed(), $this->get_version() );
209
+
210
+ $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
211
+ $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );
212
+ $this->loader->add_action( 'admin_menu', $plugin_admin, 'load_admin_pages' );
213
+ $this->loader->add_action( 'admin_page_access_denied', $plugin_admin, 'handle_old_menu_slugs' );
214
+ $this->loader->add_filter( 'plugin_action_links_' . WOO_FEED_PLUGIN_BASE_NAME, $plugin_admin, 'woo_feed_plugin_action_links' );
215
+ }
216
+
217
+ /**
218
+ * Run the loader to execute all of the hooks with WordPress.
219
+ *
220
+ * @since 1.0.0
221
+ */
222
+ public function run() {
223
+ if ( wooFeed_check_WC() && wooFeed_is_WC_supported() ) {
224
+ $this->load_dependencies();
225
+ $this->set_locale();
226
+ $this->define_admin_hooks();
227
+ $this->loader->run();
228
+ }
229
+ }
230
+
231
+ /**
232
+ * The name of the plugin used to uniquely identify it within the context of
233
+ * WordPress and to define internationalization functionality.
234
+ *
235
+ * @return string The name of the plugin.
236
+ * @since 1.0.0
237
+ */
238
+ public function get_woo_feed() {
239
+ return $this->woo_feed;
240
+ }
241
+
242
+ /**
243
+ * The reference to the class that orchestrates the hooks with the plugin.
244
+ *
245
+ * @return Woo_Feed_Loader Orchestrates the hooks of the plugin.
246
+ * @since 1.0.0
247
+ */
248
+ public function get_loader() {
249
+ return $this->loader;
250
+ }
251
+
252
+ /**
253
+ * Retrieve the version number of the plugin.
254
+ *
255
+ * @return string The version number of the plugin.
256
+ * @since 1.0.0
257
+ */
258
+ public function get_version() {
259
+ return $this->version;
260
+ }
 
 
 
 
 
 
261
  }
includes/classes/class-woo-feed-admin-message.php CHANGED
@@ -93,6 +93,7 @@ final class Woo_Feed_Message {
93
  */
94
  private function display_support_links() {
95
  ?>
 
96
  <table class="wf-info-table widefat fixed">
97
  <tbody>
98
  <tr>
93
  */
94
  private function display_support_links() {
95
  ?>
96
+ <br>
97
  <table class="wf-info-table widefat fixed">
98
  <tbody>
99
  <tr>
includes/classes/class-woo-feed-dropdown.php CHANGED
@@ -59,10 +59,18 @@ class Woo_Feed_Dropdown {
59
  return $str;
60
  }
61
 
62
- public function outputTypes( $selected = '' ) {
 
 
 
 
 
63
  $output_types = '';
 
 
 
64
  foreach ( $this->output_types as $key => $value ) {
65
- $output_types .= "<option value=\"{$key}\"".selected( $selected, $key, false ).">{$value}</option>";
66
  }
67
  // @TODO remove update_option( 'woo_feed_output_type_options', $output_types, false );
68
 
59
  return $str;
60
  }
61
 
62
+ /**
63
+ * @param int|int[] $selected
64
+ *
65
+ * @return string
66
+ */
67
+ public function outputTypes( $selected = 1 ) {
68
  $output_types = '';
69
+ if ( ! is_array( $selected ) ) {
70
+ $selected = (array) $selected;
71
+ }
72
  foreach ( $this->output_types as $key => $value ) {
73
+ $output_types .= "<option value=\"{$key}\"".selected( in_array( $key, $selected ), true, false ).">{$value}</option>";
74
  }
75
  // @TODO remove update_option( 'woo_feed_output_type_options', $output_types, false );
76
 
includes/classes/class-woo-feed-list-table.php CHANGED
@@ -1,4 +1,4 @@
1
- <?php
2
  /**
3
  * Administration API: WP_List_Table class
4
  *
@@ -10,6 +10,8 @@
10
  /**
11
  * Base class for displaying a list of items in an ajaxified HTML table.
12
  *
 
 
13
  * @since 3.1.0
14
  * @access private
15
  */
@@ -190,7 +192,7 @@ class Woo_Feed_List_Table {
190
  * @access public
191
  *
192
  * @param string $name Property to get.
193
- * @return mixed Property.
194
  */
195
  public function __get( $name ) {
196
  if ( in_array( $name, $this->compat_fields ) ) {
@@ -206,7 +208,7 @@ class Woo_Feed_List_Table {
206
  *
207
  * @param string $name Property to check if set.
208
  * @param mixed $value Property value.
209
- * @return mixed Newly-set property.
210
  */
211
  public function __set( $name, $value ) {
212
  if ( in_array( $name, $this->compat_fields ) ) {
@@ -227,6 +229,7 @@ class Woo_Feed_List_Table {
227
  if ( in_array( $name, $this->compat_fields ) ) {
228
  return isset( $this->$name );
229
  }
 
230
  }
231
 
232
  /**
@@ -323,7 +326,7 @@ class Woo_Feed_List_Table {
323
  *
324
  * @param string $key Pagination argument to retrieve. Common values include 'total_items',
325
  * 'total_pages', 'per_page', or 'infinite_scroll'.
326
- * @return int Number of items that correspond to the given pagination argument.
327
  */
328
  public function get_pagination_arg( $key ) {
329
  if ( 'page' === $key ) {
@@ -496,7 +499,7 @@ class Woo_Feed_List_Table {
496
  foreach ( $this->_actions as $name => $title ) {
497
  $class = 'edit' === $name ? ' class="hide-if-no-js"' : '';
498
 
499
- echo "\t" . '<option value="' . $name . '"' . $class . '>' . $title . "</option>\n";
500
  }
501
 
502
  echo "</select>\n";
@@ -938,7 +941,7 @@ class Woo_Feed_List_Table {
938
  * @access public
939
  * @abstract
940
  *
941
- * @return array
942
  */
943
  public function get_columns() {
944
  die( 'function WP_List_Table::get_columns() must be over-ridden in a sub-class.' );
@@ -1327,12 +1330,14 @@ class Woo_Feed_List_Table {
1327
  *
1328
  * @param object $item
1329
  * @param string $column_name
 
1330
  */
1331
  protected function column_default( $item, $column_name ) {}
1332
 
1333
  /**
1334
  *
1335
  * @param object $item
 
1336
  */
1337
  protected function column_cb( $item ) {}
1338
 
1
+ <?php /** @noinspection PhpUnusedLocalVariableInspection, PhpUnused, PhpUnusedParameterInspection, DuplicatedCode, HtmlUnknownTarget */
2
  /**
3
  * Administration API: WP_List_Table class
4
  *
10
  /**
11
  * Base class for displaying a list of items in an ajaxified HTML table.
12
  *
13
+ * @see WP_List_Table
14
+ *
15
  * @since 3.1.0
16
  * @access private
17
  */
192
  * @access public
193
  *
194
  * @param string $name Property to get.
195
+ * @return mixed|void Property.
196
  */
197
  public function __get( $name ) {
198
  if ( in_array( $name, $this->compat_fields ) ) {
208
  *
209
  * @param string $name Property to check if set.
210
  * @param mixed $value Property value.
211
+ * @return mixed|void Newly-set property.
212
  */
213
  public function __set( $name, $value ) {
214
  if ( in_array( $name, $this->compat_fields ) ) {
229
  if ( in_array( $name, $this->compat_fields ) ) {
230
  return isset( $this->$name );
231
  }
232
+ return false;
233
  }
234
 
235
  /**
326
  *
327
  * @param string $key Pagination argument to retrieve. Common values include 'total_items',
328
  * 'total_pages', 'per_page', or 'infinite_scroll'.
329
+ * @return int|void Number of items that correspond to the given pagination argument.
330
  */
331
  public function get_pagination_arg( $key ) {
332
  if ( 'page' === $key ) {
499
  foreach ( $this->_actions as $name => $title ) {
500
  $class = 'edit' === $name ? ' class="hide-if-no-js"' : '';
501
 
502
+ echo "\t" . '<option value="' . $name . '" ' . $class . '>' . $title . "</option>\n";
503
  }
504
 
505
  echo "</select>\n";
941
  * @access public
942
  * @abstract
943
  *
944
+ * @return void|array
945
  */
946
  public function get_columns() {
947
  die( 'function WP_List_Table::get_columns() must be over-ridden in a sub-class.' );
1330
  *
1331
  * @param object $item
1332
  * @param string $column_name
1333
+ * @return void|string
1334
  */
1335
  protected function column_default( $item, $column_name ) {}
1336
 
1337
  /**
1338
  *
1339
  * @param object $item
1340
+ * @return void|string
1341
  */
1342
  protected function column_cb( $item ) {}
1343
 
includes/classes/class-woo-feed-products-v3.php CHANGED
@@ -1,4 +1,5 @@
1
  <?php /** @noinspection PhpUnusedPrivateMethodInspection, PhpUnused, PhpUnusedLocalVariableInspection, DuplicatedCode */
 
2
  /**
3
  * Created by PhpStorm.
4
  * User: wahid
@@ -6,18 +7,69 @@
6
  * Time: 5:10 PM
7
  */
8
 
 
 
 
 
 
 
 
9
  class Woo_Feed_Products_v3 {
10
- private $pi = 0;
 
 
 
 
 
 
 
 
11
  public $feedHeader;
 
 
 
 
12
  public $feedBody;
 
 
 
 
13
  public $feedFooter;
14
- private $enclosure;
15
- private $delimiter;
16
- private $config;
17
- private $post_status = 'publish';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  public $products = [];
19
- private $queryType = 'wp';
20
- private $google_shipping_tax = array(
 
 
 
 
 
 
 
 
21
  'shipping_country',
22
  'shipping_region',
23
  'shipping_service',
@@ -26,14 +78,24 @@ class Woo_Feed_Products_v3 {
26
  'tax_region',
27
  'tax_rate',
28
  'tax_ship',
 
 
 
 
 
29
  );
30
- private $product_types = array(
 
 
 
 
31
  'simple',
32
  'variable',
33
  'variation',
34
  'grouped',
35
  'external',
36
  );
 
37
  // TODO check if product is in those above types.
38
  /**
39
  * Post meta prefix for dropdown item
@@ -53,17 +115,17 @@ class Woo_Feed_Products_v3 {
53
  * @var string
54
  */
55
  const PRODUCT_TAXONOMY_PREFIX = 'wf_taxo_';
56
-
57
  public function __construct( $config ) {
58
  $this->config = woo_feed_parse_feed_rules( $config );
59
  $this->queryType = strtolower( get_option( 'woo_feed_product_query_type', 'wc' ) );
60
  if ( ! in_array( $this->queryType, [ 'wc', 'wp', 'both' ] ) ) {
61
  $this->queryType = 'wc';
62
  }
63
-
64
  // woo_feed_log_feed_process( $this->config['filename'], sprintf( 'Current Query Type is %s', $this->queryType ) );
65
  }
66
-
67
  /**
68
  * Get Products using WC_Product_Query
69
  *
@@ -89,7 +151,7 @@ class Woo_Feed_Products_v3 {
89
  // }
90
  return $query->get_products();
91
  }
92
-
93
  /**
94
  * Get Products using WP_Query
95
  *
@@ -108,7 +170,7 @@ class Woo_Feed_Products_v3 {
108
  'update_post_term_cache' => false,
109
  'suppress_filters' => false,
110
  );
111
-
112
  $query = new WP_Query( $args );
113
  // if( woo_feed_is_debugging_enabled() ) {
114
  // woo_feed_log_feed_process( $this->config['filename'], sprintf( 'WP_Query Args ::'.PHP_EOL.'%s', print_r( $args, true ) ) );
@@ -116,11 +178,11 @@ class Woo_Feed_Products_v3 {
116
  // }
117
  return $query->get_posts();
118
  }
119
-
120
  /**
121
- * Get products by limit and offset
122
  *
123
- * @return array|object
124
  */
125
  public function query_products() {
126
  $products = [];
@@ -129,33 +191,65 @@ class Woo_Feed_Products_v3 {
129
  } elseif ( 'wp' == $this->queryType ) {
130
  $products = $this->get_wp_query_products();
131
  } elseif ( 'both' == $this->queryType ) {
132
- $wc = $this->get_wc_query_products();
133
- $wp = $this->get_wp_query_products();
134
  $products = array_unique( array_merge( $wc, $wp ) );
135
  }
 
136
  return $products;
137
  }
138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  /**
140
  * Get Product Information according to feed config
141
  *
142
- * @since 3.2.0
143
- *
144
  * @param int[] $productIds
145
  *
146
  * @return array
 
 
147
  */
148
  public function get_products( $productIds ) {
149
-
150
  if ( empty( $productIds ) ) {
151
  return [];
152
  }
153
 
154
  /**
155
  * Fires before looping through request product for getting product data
156
- * @since 3.2.10
157
  * @param int[] $productIds
158
  * @param array $feedConfig
 
 
159
  */
160
  do_action( 'woo_feed_before_product_loop', $productIds, $this->config );
161
 
@@ -170,19 +264,19 @@ class Woo_Feed_Products_v3 {
170
  continue;
171
  }
172
  }
173
-
174
  // Skip for invalid products
175
  if ( ! is_object( $product ) ) {
176
  // woo_feed_log_feed_process( $this->config['filename'], 'Skipping Product :: Product data is not a valid WC_Product object.' );
177
  continue;
178
  }
179
-
180
  // Skip for invisible products
181
  if ( ! $product->is_visible() ) {
182
  // woo_feed_log_feed_process( $this->config['filename'], 'Skipping Product :: Product is not visible.' );
183
  continue;
184
  }
185
-
186
  // Apply variable and variation settings
187
  if ( $product->is_type( 'variable' ) && $product->has_child() ) {
188
  $this->pi ++;
@@ -192,7 +286,6 @@ class Woo_Feed_Products_v3 {
192
  }
193
  }
194
 
195
-
196
  // Add Single item wrapper before product info loop start
197
  if ( 'xml' == $this->config['feedType'] ) {
198
  $this->feedBody .= "\n";
@@ -204,7 +297,7 @@ class Woo_Feed_Products_v3 {
204
  $mAttributes = array();
205
  // Get Product Attribute values by type and assign to product array
206
  foreach ( $this->config['attributes'] as $attr_key => $attribute ) {
207
-
208
  // Continue for Google Shipping and Tax attributes
209
  $skipFor = array( 'google', 'facebook' );
210
  if (
@@ -214,41 +307,39 @@ class Woo_Feed_Products_v3 {
214
  ) {
215
  continue;
216
  }
217
-
218
- if ( in_array( $this->config['mattributes'][ $attr_key ],$mAttributes ) ) {
219
  continue;
220
  }
221
 
222
  if ( 'pattern' == $this->config['type'][ $attr_key ] ) {
223
  $attributeValue = $this->config['default'][ $attr_key ];
224
  } else { # Get Pattern value
225
- $attributeValue = $this->getAttributeValueByType($product, $attribute);
226
  }
227
-
228
  // Format Output according to Output Type config.
229
  $outputType = $this->config['output_type'][ $attr_key ];
230
  if ( 'default' != $outputType ) {
231
- $attributeValue = $this->format_output( $attributeValue, $outputType );
232
  }
233
-
234
-
235
  // Limit Output
236
  $limit = $this->config['limit'][ $attr_key ];
237
  if ( ! empty( $limit ) && is_numeric( $limit ) ) {
238
  if ( strpos( $attributeValue, '<![CDATA[' ) !== false ) {
239
- $attributeValue = str_replace(array( '<![CDATA[', ']]>' ), array( '', '' ), $attributeValue);
240
- $attributeValue = substr($attributeValue, 0, $limit);
241
  $attributeValue = '<![CDATA[' . $attributeValue . ']]>';
242
  } else {
243
  $attributeValue = substr( $attributeValue, 0, $limit );
244
  }
245
  }
246
-
247
  // Add Prefix and Suffix into Output
248
  $prefix = $this->config['prefix'][ $attr_key ];
249
  $suffix = $this->config['suffix'][ $attr_key ];
250
 
251
-
252
  if ( '' != $prefix || '' != $suffix ) {
253
  $attributeValue = $this->process_prefix_suffix( $attributeValue, $prefix, $suffix, $attribute );
254
  }
@@ -257,38 +348,40 @@ class Woo_Feed_Products_v3 {
257
  $merchant = $this->config['provider'];
258
  $feedType = $this->config['feedType'];
259
  if ( 'xml' == $this->config['feedType'] ) {
260
-
261
  # Replace XML Nodes according to merchant requirement
262
- $getReplacedAttribute = woo_feed_replace_to_merchant_attribute( $pluginAttribute, $merchant, $feedType );
263
-
264
- # XML does not support space in node. So replace Space with Underscore
265
- $getReplacedAttribute = str_replace( '', '_', $getReplacedAttribute );
266
-
267
- if ( ! empty($attributeValue) ) {
268
- $attributeValue = trim($attributeValue);
269
- }
 
 
270
 
271
  // Add closing XML node if value is empty
272
  if ( '' != $attributeValue ) {
273
  # Add CDATA wrapper for XML feed to prevent XML error.
274
  $attributeValue = woo_feed_add_cdata( $pluginAttribute, $attributeValue, $merchant );
275
-
276
  #TODO Move to proper place
277
  # Replace Google Color attribute value according to requirements
278
  if ( 'g:color' == $getReplacedAttribute ) {
279
  $attributeValue = str_replace( ', ', '/', $attributeValue );
280
  }
281
-
282
  # Strip slash from output
283
  $attributeValue = stripslashes( $attributeValue );
284
 
285
  $this->feedBody .= '<' . $getReplacedAttribute . '>' . "$attributeValue" . '</' . $getReplacedAttribute . '>';
286
  $this->feedBody .= "\n";
287
-
288
  } else {
289
  $this->feedBody .= '<' . $getReplacedAttribute . '/>';
290
  $this->feedBody .= "\n";
291
- }
292
  } elseif ( 'csv' == $this->config['feedType'] ) {
293
  $pluginAttribute = woo_feed_replace_to_merchant_attribute( $pluginAttribute, $merchant, $feedType );
294
  $pluginAttribute = $this->processStringForCSV( $pluginAttribute );
@@ -298,16 +391,16 @@ class Woo_Feed_Products_v3 {
298
  $pluginAttribute = $this->processStringForTXT( $pluginAttribute );
299
  $attributeValue = $this->processStringForTXT( $attributeValue );
300
  }
301
-
302
- $mAttributes[ $attr_key ] = $this->config['mattributes'][ $attr_key ];
303
  $this->products[ $this->pi ][ $pluginAttribute ] = $attributeValue;
304
  }
305
-
306
  // try {
307
  // woo_feed_log_feed_process( $this->config['filename'], 'Processing Merchant Specific Fields' );
308
  // Process feed data for uncommon merchant feed like Google,Facebook,Pinterest
309
  # Process feed data for uncommon merchant feed like Google,Facebook,Pinterest
310
- $this->process_for_merchant($product, $this->pi);
311
  // } catch ( Exception $e ) {
312
  // $message = 'Error Processing Merchant Specific Fields.' . PHP_EOL . 'Caught Exception :: ' . $e->getMessage();
313
  // woo_feed_log( $this->config['filename'], $message, 'critical', $e, true );
@@ -336,31 +429,34 @@ class Woo_Feed_Products_v3 {
336
  $this->process_csv_feed_body();
337
  }
338
  // woo_feed_log_feed_process( $this->config['filename'], 'Done Formatting...' );
339
- $this->pi++;
340
  }
341
 
342
  /**
343
  * Fires after looping through request product for getting product data
344
- * @since 3.2.10
345
  * @param int[] $productIds
346
  * @param array $feedConfig
 
 
347
  */
348
  do_action( 'woo_feed_after_product_loop', $productIds, $this->config );
349
-
350
  return $this->products;
351
  }
352
-
353
-
354
  /**
355
  * Process feed data according to merchant uncommon requirements like Google
356
  *
357
- * @since 3.2.0
358
- *
359
  * @param $productObj WC_Product
360
  * @param $index | Product Index
 
 
 
361
  */
362
- private function process_for_merchant( $productObj, $index ) {
363
- $product = $this->products[ $index ];
364
  $merchantAttributes = $this->config['mattributes'];
365
 
366
  // Format Shipping and Tax data for CSV and TXT feed only for google and facebook
@@ -383,10 +479,10 @@ class Woo_Feed_Products_v3 {
383
  'tax_ship',
384
  );
385
  foreach ( $this->products[ $this->pi ] as $attribute => $value ) {
386
- if ( in_array($attribute, $shippingAttr) ) {
387
 
388
  if ( 'tax_country' == $attribute ) {
389
- $t++;
390
  $tax[ $t ] .= $value . ':';
391
  } elseif ( 'tax_region' == $attribute ) {
392
  $tax[ $t ] .= $value . ':';
@@ -397,7 +493,7 @@ class Woo_Feed_Products_v3 {
397
  }
398
 
399
  if ( 'shipping_country' == $attribute ) {
400
- $s++;
401
  $shipping[ $s ] .= $value . ':';
402
  } elseif ( 'shipping_service' == $attribute ) {
403
  $shipping[ $s ] .= $value . ':';
@@ -407,7 +503,7 @@ class Woo_Feed_Products_v3 {
407
  $shipping[ $s ] .= $value . ':';
408
  }
409
 
410
- unset($this->products[ $this->pi ][ $attribute ]);
411
  }
412
  }
413
 
@@ -423,14 +519,14 @@ class Woo_Feed_Products_v3 {
423
  if ( 'google' == $this->config['provider'] ) {
424
 
425
  // Reformat Shipping attributes for google, facebook
426
- $s = 0;
427
- $t = 0;
428
- $tax = '';
429
  $shipping = '';
430
  if ( 'xml' == $this->config['feedType'] ) {
431
  foreach ( $merchantAttributes as $key => $value ) {
432
 
433
- if ( ! in_array($value, $this->google_shipping_tax) ) {
434
  continue;
435
  }
436
 
@@ -441,7 +537,7 @@ class Woo_Feed_Products_v3 {
441
  $output = $this->config['default'][ $key ];
442
  } else { // Get Pattern value.
443
  $attribute = $this->config['attributes'][ $key ];
444
- $output = $this->getAttributeValueByType($productObj, $attribute);
445
  }
446
 
447
  if ( false !== strpos( $value, 'price' ) || false !== strpos( $value, 'rate' ) ) {
@@ -459,7 +555,7 @@ class Woo_Feed_Products_v3 {
459
  $shipping .= '</g:shipping>' . "\n";
460
  $shipping .= '<g:shipping>';
461
  }
462
- } elseif ( ! in_array('shipping_country',$merchantAttributes) && 'shipping_price' == $value ) {
463
  if ( 0 == $s ) {
464
  $shipping .= '<g:shipping>';
465
  $s = 1;
@@ -480,7 +576,7 @@ class Woo_Feed_Products_v3 {
480
  } elseif ( 'tax_country' == $value ) {
481
  if ( 0 == $t ) {
482
  $tax .= '<g:tax>';
483
- $t = 1;
484
  } else {
485
  $tax .= '</g:tax>' . "\n";
486
  $tax .= '<g:tax>';
@@ -506,26 +602,26 @@ class Woo_Feed_Products_v3 {
506
  $this->feedBody .= $tax;
507
  }
508
  // ADD g:identifier_exists
509
- $identifier = array( 'brand', 'upc', 'sku', 'mpn', 'gtin' );
510
  $countIdentifier = 0;
511
- if ( ! in_array('identifier_exists', $merchantAttributes) ) {
512
- if ( count(array_intersect_key(array_flip($identifier), $product)) >= 2 ) {
513
  // Any 2 required keys exist!
514
  // @TODO Refactor with OR
515
- if ( array_key_exists('brand', $product) && ! empty($product['brand']) ) {
516
- $countIdentifier++;
517
  }
518
- if ( array_key_exists('upc', $product) && ! empty($product['upc']) ) {
519
- $countIdentifier++;
520
  }
521
- if ( array_key_exists('sku', $product) && ! empty($product['sku']) ) {
522
- $countIdentifier++;
523
  }
524
- if ( array_key_exists('mpn', $product) && ! empty($product['mpn']) ) {
525
- $countIdentifier++;
526
  }
527
- if ( array_key_exists('gtin', $product) && ! empty($product['gtin']) ) {
528
- $countIdentifier++;
529
  }
530
  }
531
 
@@ -549,11 +645,11 @@ class Woo_Feed_Products_v3 {
549
  /**
550
  * Generate TXT Feed Header
551
  *
 
552
  * @since 3.2.0
553
  *
554
- * @return string
555
  */
556
- private function process_txt_feed_header() {
557
  // Set Delimiter
558
  if ( 'tab' == $this->config['delimiter'] ) {
559
  $this->delimiter = "\t";
@@ -582,7 +678,8 @@ class Woo_Feed_Products_v3 {
582
 
583
  $product = $this->products[ $this->pi ];
584
  $headers = array_keys( $product );
585
- $this->feedHeader .= $this->enclosure . implode( "$this->enclosure$this->delimiter$this->enclosure", $headers ) . $this->enclosure . $eol;
 
586
 
587
  return $this->feedHeader;
588
  }
@@ -590,17 +687,18 @@ class Woo_Feed_Products_v3 {
590
  /**
591
  * Generate TXT Feed Body
592
  *
 
593
  * @since 3.2.0
594
  *
595
- * @return string
596
  */
597
- private function process_txt_feed_body() {
598
  $productInfo = array_values( $this->products[ $this->pi ] );
599
- $eol = PHP_EOL;
600
  if ( 'trovaprezzi' === $this->config['provider'] ) {
601
  $eol = '<endrecord>' . PHP_EOL;
602
  }
603
- $this->feedBody .= $this->enclosure . implode( "$this->enclosure$this->delimiter$this->enclosure", $productInfo ) . $this->enclosure . $eol;
 
604
 
605
  return $this->feedBody;
606
  }
@@ -608,11 +706,11 @@ class Woo_Feed_Products_v3 {
608
  /**
609
  * Generate CSV Feed Header
610
  *
 
611
  * @since 3.2.0
612
  *
613
- * @return array
614
  */
615
- private function process_csv_feed_header() {
616
  // Set Delimiter
617
  if ( 'tab' == $this->config['delimiter'] ) {
618
  $this->delimiter = "\t";
@@ -642,10 +740,10 @@ class Woo_Feed_Products_v3 {
642
 
643
  /**
644
  * Generate CSV Feed Body
645
- * @since 3.2.0
646
  * @return array
 
647
  */
648
- private function process_csv_feed_body() {
649
  $product = $this->products[ $this->pi ];
650
  $this->feedBody[] = array_values( $product );
651
 
@@ -654,11 +752,11 @@ class Woo_Feed_Products_v3 {
654
 
655
  /**
656
  * Make XML feed header
657
- * @since 3.2.0
658
  * @return string
 
659
  */
660
- private function process_xml_feed_header() {
661
- $datetime_now = gmdate( "Y-m-d H:i:s" );
662
  if ( 'fruugo.au' == $this->config["provider"] ) {
663
  return "<products version=\"1.0\" standalone=\"yes\">
664
  <datetime>$datetime_now</datetime>
@@ -774,26 +872,27 @@ class Woo_Feed_Products_v3 {
774
 
775
  /**
776
  * Make XML feed header
777
- * @since 3.2.0
778
  * @return string
 
779
  */
780
- private function process_xml_feed_footer() {
781
- if ( in_array( $this->config['provider'], [
782
- 'fruugo.au',
783
- 'stylight.com',
784
- 'nextad',
785
- 'skinflint.co.uk',
786
- 'comparer.be',
787
- 'dooyoo',
788
- 'hintaseuranta.fi',
789
- 'incurvy',
790
- 'kijiji.ca',
791
- 'marktplaats.nl',
792
- 'rakuten.de',
793
- 'shopalike.fr',
794
- 'spartoo.fi',
795
- 'webmarchand',
796
- ] ) ) {
 
797
  return '</products>';
798
  } elseif ( 'zap.co.il' == $this->config['provider'] ) {
799
  return '</STORE>';
@@ -810,13 +909,14 @@ class Woo_Feed_Products_v3 {
810
 
811
  /**
812
  * Process string for TXT CSV Feed
813
- * @since 3.2.0
814
  *
815
  * @param $string
816
  *
817
  * @return mixed|string
 
 
818
  */
819
- private function processStringForTXT( $string ) {
820
  if ( ! empty( $string ) ) {
821
  $string = html_entity_decode( $string, ENT_HTML401 | ENT_QUOTES ); // Convert any HTML entities
822
 
@@ -839,13 +939,14 @@ class Woo_Feed_Products_v3 {
839
 
840
  /**
841
  * Process string for CSV
842
- * @since 3.2.0
843
  *
844
  * @param $string
845
  *
846
  * @return mixed|string
 
 
847
  */
848
- private function processStringForCSV( $string ) {
849
  if ( ! empty( $string ) ) {
850
  $string = str_replace( "\n", ' ', $string );
851
  $string = str_replace( "\r", ' ', $string );
@@ -862,24 +963,28 @@ class Woo_Feed_Products_v3 {
862
 
863
  /**
864
  * Get Product Attribute Value by Type
865
- * @since 3.2.0
866
  *
867
  * @param $product WC_Product
868
  * @param $attribute
869
  *
870
  * @return mixed|string
 
 
871
  */
872
- public function getAttributeValueByType( $product, $attribute ) {
873
 
874
  if ( method_exists( $this, $attribute ) ) {
875
  $output = call_user_func_array( array( $this, $attribute ), array( $product ) );
876
- } elseif ( strpos( $attribute, self::PRODUCT_ATTRIBUTE_PREFIX ) !== false ) {
877
- $output = $this->getProductAttribute( $product, $attribute );
878
- } elseif ( strpos( $attribute, self::POST_META_PREFIX ) !== false ) {
879
- $output = $this->getProductMeta( $product, $attribute );
880
- } elseif ( strpos( $attribute, self::PRODUCT_TAXONOMY_PREFIX ) !== false ) {
881
- $output = $this->getProductTaxonomy( $product, $attribute );
882
- } elseif ( substr( $attribute, 0, 6 ) == 'image_' ) {
 
 
 
883
  // For additional image method images() will be used with extra parameter - image number
884
  $imageKey = explode( '_', $attribute );
885
  if ( ! isset( $imageKey[1] ) || ( isset( $imageKey[1] ) && ( empty( $imageKey[1] ) || ! is_numeric( $imageKey[1] ) ) ) ) {
@@ -887,69 +992,75 @@ class Woo_Feed_Products_v3 {
887
  }
888
  $output = call_user_func_array( array( $this, 'images' ), array( $product, $imageKey[1] ) );
889
  } else {
890
- $output = '';
 
891
  }
892
 
893
  // Json encode if value is an array
894
- if ( is_array( $output ) ) $output = wp_json_encode( $output );
 
 
895
 
896
  /**
897
  * Filter attribute value before return based on merchant and attribute name
898
  *
899
- * @since 3.3.7
900
- *
901
- * @param string $output the output
902
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
903
  * @param array feed config/rule
 
 
 
904
  */
905
  $output = apply_filters( "woo_feed_get_{$this->config['provider']}_{$attribute}_attribute", $output, $product, $this->config );
906
 
907
  /**
908
  * Filter attribute value before return based on attribute name
909
  *
910
- * @since 3.3.5
911
- *
912
- * @param string $output the output
913
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
914
  * @param array feed config/rule
 
 
 
915
  */
916
  return apply_filters( "woo_feed_get_{$attribute}_attribute", $output, $product, $this->config );
917
  }
918
 
919
-
920
  /**
921
  * Get Product Id
922
  *
923
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
924
  *
925
- * @since 3.2.0
926
  * @return mixed
 
927
  */
928
- private function id( $product ) {
929
  return $product->get_id();
930
  }
931
-
932
  /**
933
  * Get Product Title
934
- * @since 3.2.0
935
  *
936
  * @param WC_Product $product
937
  *
938
  * @return mixed
 
 
939
  */
940
- private function title( $product ) {
941
  return $product->get_name();
942
  }
943
 
944
  /**
945
  * Get Yoast Product Title
946
- * @since 3.2.0
947
  *
948
  * @param WC_Product $product
949
  *
950
  * @return mixed
 
 
951
  */
952
- private function yoast_wpseo_title( $product ) {
953
  $title = '';
954
  if ( class_exists( 'WPSEO_Frontend' ) ) {
955
  $title = WPSEO_Frontend::get_instance()->get_seo_title( get_post( $product->get_id() ) );
@@ -963,13 +1074,14 @@ class Woo_Feed_Products_v3 {
963
 
964
  /**
965
  * Get All In One Product Title
966
- * @since 3.2.0
967
  *
968
  * @param WC_Product $product
969
  *
970
  * @return mixed
 
 
971
  */
972
- private function _aioseop_title( $product ) {
973
  $title = '';
974
  if ( class_exists( 'All_in_One_SEO_Pack' ) ) {
975
  global $aioseop_options, $aiosp;
@@ -997,13 +1109,14 @@ class Woo_Feed_Products_v3 {
997
 
998
  /**
999
  * Get Product Description
1000
- * @since 3.2.0
1001
  *
1002
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
1003
  *
1004
  * @return mixed|string
 
 
1005
  */
1006
- private function description( $product ) {
1007
 
1008
  $description = $product->get_description();
1009
 
@@ -1030,16 +1143,18 @@ class Woo_Feed_Products_v3 {
1030
 
1031
  /**
1032
  * Get Yoast Product Description
1033
- * @since 3.2.0
1034
  *
1035
  * @param WC_Product $product
1036
  *
1037
  * @return mixed
 
 
1038
  */
1039
- private function yoast_wpseo_metadesc( $product ) {
1040
  $description = '';
1041
  if ( class_exists( 'WPSEO_Frontend' ) ) {
1042
- $description = wpseo_replace_vars( WPSEO_Meta::get_value( 'metadesc', $product->get_id() ), get_post( $product->get_id() ) );
 
1043
  }
1044
  if ( ! empty( $description ) ) {
1045
  return $description;
@@ -1050,13 +1165,14 @@ class Woo_Feed_Products_v3 {
1050
 
1051
  /**
1052
  * Get All In One Product Description
1053
- * @since 3.2.0
1054
  *
1055
  * @param WC_Product $product
1056
  *
1057
  * @return mixed
 
 
1058
  */
1059
- private function _aioseop_description( $product ) {
1060
  $description = '';
1061
  if ( class_exists( 'All_in_One_SEO_Pack' ) ) {
1062
  global $aioseop_options, $aiosp;
@@ -1069,7 +1185,8 @@ class Woo_Feed_Products_v3 {
1069
  if ( in_array( 'product', $aioseop_options['aiosp_cpostactive'], true ) ) {
1070
  $description = $aiosp->get_main_description( get_post( $product->get_id() ) ); // Get the description.
1071
  $description = $aiosp->trim_description( $description );
1072
- $description = apply_filters( 'aioseop_description_full', $aiosp->apply_description_format( $description, get_post( $product->get_id() ) ) );
 
1073
  }
1074
  }
1075
  if ( ! empty( $description ) ) {
@@ -1081,13 +1198,14 @@ class Woo_Feed_Products_v3 {
1081
 
1082
  /**
1083
  * Get Product Short Description
1084
- * @since 3.2.0
1085
  *
1086
  * @param WC_Product $product
1087
  *
1088
  * @return mixed|string
 
 
1089
  */
1090
- private function short_description( $product ) {
1091
 
1092
  $short_description = $product->get_short_description();
1093
 
@@ -1106,13 +1224,14 @@ class Woo_Feed_Products_v3 {
1106
 
1107
  /**
1108
  * At First convert Short Codes and then Remove failed Short Codes from String
1109
- * @since 3.2.0
1110
  *
1111
  * @param $content
1112
  *
1113
  * @return mixed|string
 
 
1114
  */
1115
- private function remove_short_codes( $content ) {
1116
  if ( empty( $content ) ) {
1117
  return '';
1118
  }
@@ -1132,13 +1251,14 @@ class Woo_Feed_Products_v3 {
1132
 
1133
  /**
1134
  * Get Product Categories
1135
- * @since 3.2.0
1136
  *
1137
  * @param WC_Product $product
1138
  *
1139
  * @return mixed
 
 
1140
  */
1141
- private function product_type( $product ) {
1142
  $id = $product->get_id();
1143
  if ( $product->is_type( 'variation' ) ) {
1144
  $id = $product->get_parent_id();
@@ -1148,16 +1268,17 @@ class Woo_Feed_Products_v3 {
1148
 
1149
  return wp_strip_all_tags( wc_get_product_category_list( $id, $separator, '' ) );
1150
  }
1151
-
1152
  /**
1153
  * Get Product URL
1154
- * @since 3.2.0
1155
  *
1156
  * @param WC_Product $product
1157
  *
1158
  * @return string
 
 
1159
  */
1160
- private function link( $product ) {
1161
  $utm = $this->config['campaign_parameters'];
1162
  if ( ! empty( $utm['utm_source'] ) && ! empty( $utm['utm_medium'] ) && ! empty( $utm['utm_campaign'] ) ) {
1163
  $utm = [
@@ -1167,47 +1288,54 @@ class Woo_Feed_Products_v3 {
1167
  'utm_term' => $utm['utm_term'],
1168
  'utm_content' => $utm['utm_content'],
1169
  ];
 
1170
  return add_query_arg( array_filter( $utm ), $product->get_permalink() );
1171
  }
 
1172
  return $product->get_permalink();
1173
  }
1174
-
1175
  /**
1176
  * Get External Product URL
1177
- * @since 3.2.0
1178
  *
1179
  * @param WC_Product $product
1180
  *
1181
  * @return string
 
 
1182
  */
1183
- private function ex_link( $product ) {
1184
  if ( $product->is_type( 'external' ) ) {
1185
  return $product->get_product_url();
1186
  }
1187
-
1188
  return '';
1189
  }
1190
 
1191
  /**
1192
  * Get Product Image
1193
- * @since 3.2.0
1194
  *
1195
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
1196
  *
1197
  * @return mixed
 
 
1198
  */
1199
- private function image( $product ) {
1200
  if ( $product->is_type( 'variation' ) ) {
1201
- $getImage = wp_get_attachment_image_src( get_post_thumbnail_id( $product->get_id() ), 'single-post-thumbnail' );
 
1202
  if ( has_post_thumbnail( $product->get_id() ) && ! empty( $getImage[0] ) ) :
1203
  $image = woo_feed_get_formatted_url( $getImage[0] );
1204
  else :
1205
- $getImage = wp_get_attachment_image_src( get_post_thumbnail_id( $product->get_parent_id() ), 'single-post-thumbnail' );
 
1206
  $image = woo_feed_get_formatted_url( $getImage[0] );
1207
  endif;
1208
  } else {
1209
  if ( has_post_thumbnail( $product->get_id() ) ) :
1210
- $getImage = wp_get_attachment_image_src( get_post_thumbnail_id( $product->get_id() ), 'single-post-thumbnail' );
 
1211
  $image = woo_feed_get_formatted_url( $getImage[0] );
1212
  else :
1213
  $image = woo_feed_get_formatted_url( wp_get_attachment_url( $product->get_id() ) );
@@ -1219,13 +1347,14 @@ class Woo_Feed_Products_v3 {
1219
 
1220
  /**
1221
  * Get Product Featured Image
1222
- * @since 3.2.0
1223
  *
1224
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
1225
  *
1226
  * @return mixed
 
 
1227
  */
1228
- private function feature_image( $product ) {
1229
  return $this->image( $product );
1230
  }
1231
 
@@ -1239,7 +1368,7 @@ class Woo_Feed_Products_v3 {
1239
  * @since 3.2.0
1240
  *
1241
  */
1242
- private function images( $product, $additionalImg = '' ) {
1243
  if ( $product->is_type( 'variation' ) ) {
1244
  // TODO Test Variation Images
1245
  $imgUrls = $this->get_product_gallery( wc_get_product( $product->get_parent_id() ) );
@@ -1262,11 +1391,13 @@ class Woo_Feed_Products_v3 {
1262
  /**
1263
  * Get Product Gallery Items (URL) array.
1264
  * This can contains empty array values
1265
- * @since 3.2.6
1266
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product
 
1267
  * @return string[]
 
1268
  */
1269
- private function get_product_gallery( $product ) {
1270
  $attachmentIds = $product->get_gallery_image_ids();
1271
  $imgUrls = array();
1272
  if ( $attachmentIds && is_array( $attachmentIds ) ) {
@@ -1276,42 +1407,46 @@ class Woo_Feed_Products_v3 {
1276
  $mKey ++;
1277
  }
1278
  }
 
1279
  return $imgUrls;
1280
  }
1281
 
1282
  /**
1283
  * Get Product Condition
1284
- * @since 3.2.0
1285
  *
1286
  * @param WC_Product $product
1287
  *
1288
  * @return mixed
 
 
1289
  */
1290
- private function condition( $product ) {
1291
  return apply_filters( 'woo_feed_product_condition', 'new', $product );
1292
  }
1293
 
1294
  /**
1295
  * Get Product Type
1296
- * @since 3.2.0
1297
  *
1298
  * @param WC_Product $product
1299
  *
1300
  * @return mixed
 
 
1301
  */
1302
- private function type( $product ) {
1303
  return $product->get_type();
1304
  }
1305
 
1306
  /**
1307
  * Get Product is a bundle product or not
1308
- * @since 3.2.0
1309
  *
1310
  * @param WC_Product $product
1311
  *
1312
  * @return mixed
 
 
1313
  */
1314
- private function is_bundle( $product ) {
1315
  if ( $product->is_type( 'bundle' ) || $product->is_type( 'yith_bundle' ) ) {
1316
  return "yes";
1317
  }
@@ -1321,13 +1456,14 @@ class Woo_Feed_Products_v3 {
1321
 
1322
  /**
1323
  * Get Product is a multi-pack product or not
1324
- * @since 3.2.0
1325
  *
1326
  * @param WC_Product $product
1327
  *
1328
  * @return mixed
 
 
1329
  */
1330
- private function multipack( $product ) {
1331
  $multi_pack = '';
1332
  if ( $product->is_type( 'grouped' ) ) {
1333
  $multi_pack = ( ! empty( $product->get_children() ) ) ? count( $product->get_children() ) : '';
@@ -1338,49 +1474,53 @@ class Woo_Feed_Products_v3 {
1338
 
1339
  /**
1340
  * Get Product visibility status
1341
- * @since 3.2.0
1342
  *
1343
  * @param WC_Product $product
1344
  *
1345
  * @return mixed
 
 
1346
  */
1347
- private function visibility( $product ) {
1348
  return $product->get_catalog_visibility();
1349
  }
1350
 
1351
  /**
1352
  * Get Product Total Rating
1353
- * @since 3.2.0
1354
  *
1355
  * @param WC_Product $product
1356
  *
1357
  * @return mixed
 
 
1358
  */
1359
- private function rating_total( $product ) {
1360
  return $product->get_rating_count();
1361
  }
1362
 
1363
  /**
1364
  * Get Product average rating
1365
- * @since 3.2.0
1366
  *
1367
  * @param WC_Product $product
1368
  *
1369
  * @return mixed
 
 
1370
  */
1371
- private function rating_average( $product ) {
1372
  return $product->get_average_rating();
1373
  }
1374
 
1375
  /**
1376
  * Get Product tags
1377
- * @since 3.2.0
1378
  *
1379
  * @param WC_Product $product
1380
  *
1381
  * @return mixed
 
 
1382
  */
1383
- private function tags( $product ) {
1384
  $id = $product->get_id();
1385
  if ( $product->is_type( 'variation' ) ) {
1386
  $id = $product->get_parent_id();
@@ -1397,13 +1537,14 @@ class Woo_Feed_Products_v3 {
1397
 
1398
  /**
1399
  * Get Product Parent Id
1400
- * @since 3.2.0
1401
  *
1402
  * @param WC_Product $product
1403
  *
1404
  * @return mixed
 
 
1405
  */
1406
- private function item_group_id( $product ) {
1407
  $id = $product->get_id();
1408
  if ( $product->is_type( 'variation' ) ) {
1409
  $id = $product->get_parent_id();
@@ -1414,25 +1555,27 @@ class Woo_Feed_Products_v3 {
1414
 
1415
  /**
1416
  * Get Product SKU
1417
- * @since 3.2.0
1418
  *
1419
  * @param WC_Product $product
1420
  *
1421
  * @return mixed
 
 
1422
  */
1423
- private function sku( $product ) {
1424
  return $product->get_sku();
1425
  }
1426
 
1427
  /**
1428
  * Get Product Parent SKU
1429
- * @since 3.2.0
1430
  *
1431
  * @param WC_Product $product
1432
  *
1433
  * @return mixed
 
 
1434
  */
1435
- private function parent_sku( $product ) {
1436
  if ( $product->is_type( 'variation' ) ) {
1437
  $id = $product->get_parent_id();
1438
  $parent = wc_get_product( $id );
@@ -1445,38 +1588,36 @@ class Woo_Feed_Products_v3 {
1445
 
1446
  /**
1447
  * Get Product Availability Status
1448
- * @since 3.2.0
1449
  *
1450
  * @param WC_Product $product
1451
  *
1452
  * @return mixed
 
 
1453
  */
1454
- private function availability( $product ) {
1455
  $status = $product->get_stock_status();
1456
- if ( $status ) {
1457
- if ( 'instock' == $status ) {
1458
- return "in stock";
1459
- } elseif ( 'outofstock' == $status ) {
1460
- return "out of stock";
1461
- } elseif ( 'onbackorder' == $status ) {
1462
- return "on backorder";
1463
- } else {
1464
- return "in stock";
1465
- }
1466
  }
1467
-
1468
- return "in stock";
1469
  }
1470
 
1471
  /**
1472
  * Get Product Quantity
1473
- * @since 3.2.0
1474
  *
1475
  * @param WC_Product $product
1476
  *
1477
  * @return mixed
 
 
1478
  */
1479
- private function quantity( $product ) {
1480
  if ( $product->is_type( 'variable' ) && $product->has_child() ) {
1481
  $visible_children = $product->get_visible_children();
1482
  $qty = array();
@@ -1506,13 +1647,14 @@ class Woo_Feed_Products_v3 {
1506
 
1507
  /**
1508
  * Get Product Sale Price Start Date
1509
- * @since 3.2.0
1510
  *
1511
  * @param WC_Product $product
1512
  *
1513
  * @return mixed
 
 
1514
  */
1515
- private function sale_price_sdate( $product ) {
1516
  $startDate = $product->get_date_on_sale_from();
1517
  if ( is_object( $startDate ) ) {
1518
  return $startDate->date_i18n();
@@ -1523,13 +1665,14 @@ class Woo_Feed_Products_v3 {
1523
 
1524
  /**
1525
  * Get Product Sale Price End Date
1526
- * @since 3.2.0
1527
  *
1528
  * @param WC_Product $product
1529
  *
1530
  * @return mixed
 
 
1531
  */
1532
- private function sale_price_edate( $product ) {
1533
  $endDate = $product->get_date_on_sale_to();
1534
  if ( is_object( $endDate ) ) {
1535
  return $endDate->date_i18n();
@@ -1540,62 +1683,62 @@ class Woo_Feed_Products_v3 {
1540
 
1541
  /**
1542
  * Get Product Regular Price
1543
- * @since 3.2.0
1544
  *
1545
  * @param WC_Product|WC_Product_Variable|WC_Product_Grouped $product Product Object.
1546
  *
1547
  * @return mixed
 
 
1548
  */
1549
- private function price( $product ) {
1550
- $price = $product->get_regular_price();
1551
- # Set variable product regular price according to setting
1552
  if ( $product->is_type( 'variable' ) ) {
1553
- $price = $this->getVariableProductPrice( $product, 'regular_price' );
1554
  } elseif ( $product->is_type( 'grouped' ) ) {
1555
- return $this->getGroupProductPrice( $product, 'regular' );
 
 
 
1556
  }
1557
-
1558
- return $price;
1559
  }
1560
-
1561
  /**
1562
  * Get Product Price
1563
- * @since 3.2.0
1564
  *
1565
  * @param WC_Product|WC_Product_Variable|WC_Product_Grouped $product
1566
  *
1567
- * @return mixed
 
 
1568
  */
1569
- private function current_price( $product ) {
1570
- $price = $product->get_price();
1571
- # Set variable product current price according to setting
1572
  if ( $product->is_type( 'variable' ) ) {
1573
- $price = $this->getVariableProductPrice( $product, 'price' );
1574
  } elseif ( $product->is_type( 'grouped' ) ) {
1575
  return $this->getGroupProductPrice( $product, 'current' );
 
 
1576
  }
1577
-
1578
- return $price;
1579
  }
1580
-
1581
  /**
1582
  * Get Product Sale Price
1583
- * @since 3.2.0
1584
  *
1585
  * @param WC_Product|WC_Product_Variable|WC_Product_Grouped $product
1586
  *
1587
  * @return mixed
 
 
1588
  */
1589
- private function sale_price( $product ) {
1590
- $price = $product->get_sale_price();
1591
- # Set variable product sale price according to setting
1592
- if ( $product->is_type('variable') ) {
1593
- $price = $this->getVariableProductPrice($product, 'sale_price');
1594
- } elseif ( $product->is_type('grouped') ) {
1595
  return $this->getGroupProductPrice( $product, 'sale' );
 
 
 
 
1596
  }
1597
-
1598
- return $price > 0 ? $price : '';
1599
  }
1600
 
1601
  /**
@@ -1607,21 +1750,18 @@ class Woo_Feed_Products_v3 {
1607
  * @since 3.2.0
1608
  *
1609
  */
1610
- private function price_with_tax( $product ) {
1611
- $price = $this->price( $product );
1612
- // Set variable product regular price according to setting.
1613
  if ( $product->is_type( 'variable' ) ) {
1614
- $price = $this->getVariableProductPrice( $product, 'regular_price' );
1615
  } elseif ( $product->is_type( 'grouped' ) ) {
1616
  return $this->getGroupProductPrice( $product, 'regular', true );
 
 
 
 
 
 
1617
  }
1618
-
1619
- // Get price with tax.
1620
- if ( $product->is_taxable() && ! empty( $price ) ) {
1621
- $price = $this->get_price_with_tax( $product, $price );
1622
- }
1623
-
1624
- return $price;
1625
  }
1626
 
1627
  /**
@@ -1633,21 +1773,18 @@ class Woo_Feed_Products_v3 {
1633
  * @since 3.2.0
1634
  *
1635
  */
1636
- private function current_price_with_tax( $product ) {
1637
- $price = $this->current_price( $product );
1638
- // Set variable product regular price according to setting
1639
  if ( $product->is_type( 'variable' ) ) {
1640
- $price = $this->getVariableProductPrice( $product, 'current_price' );
1641
  } elseif ( $product->is_type( 'grouped' ) ) {
1642
  return $this->getGroupProductPrice( $product, 'current', true );
 
 
 
 
 
 
1643
  }
1644
-
1645
- // Get price with tax
1646
- if ( $product->is_taxable() && ! empty( $price ) ) {
1647
- $price = $this->get_price_with_tax( $product, $price );
1648
- }
1649
-
1650
- return $price;
1651
  }
1652
 
1653
  /**
@@ -1659,22 +1796,19 @@ class Woo_Feed_Products_v3 {
1659
  * @since 3.2.0
1660
  *
1661
  */
1662
- private function sale_price_with_tax( $product ) {
1663
- $price = $this->sale_price( $product );
1664
-
1665
- // Set variable product regular price according to setting
1666
  if ( $product->is_type( 'variable' ) ) {
1667
- $price = $this->getVariableProductPrice( $product, 'sale_price' );
1668
  } elseif ( $product->is_type( 'grouped' ) ) {
1669
  return $this->getGroupProductPrice( $product, 'sale', true );
 
 
 
 
 
 
 
1670
  }
1671
-
1672
- // Get price with tax
1673
- if ( $product->is_taxable() && ! empty( $price ) ) {
1674
- $price = $this->get_price_with_tax( $product, $price );
1675
- }
1676
-
1677
- return $price > 0 ? $price : '';
1678
  }
1679
 
1680
  /**
@@ -1688,7 +1822,7 @@ class Woo_Feed_Products_v3 {
1688
  * @since 3.2.0
1689
  *
1690
  */
1691
- private function getGroupProductPrice( $grouped, $type, $tax = false ) {
1692
  $groupProductIds = $grouped->get_children();
1693
  $sum = 0;
1694
  if ( ! empty( $groupProductIds ) ) {
@@ -1725,27 +1859,41 @@ class Woo_Feed_Products_v3 {
1725
  }
1726
  }
1727
 
 
 
 
 
1728
  return $sum;
1729
  }
1730
 
1731
  /**
1732
- * Get total price of grouped product
1733
  *
1734
- * @param WC_Product|WC_Product_Variable $variable
1735
  * @param string $type regular_price, sale_price & current_price
 
1736
  *
1737
  * @return int|string
1738
  * @since 3.2.0
1739
  *
1740
  */
1741
- private function getVariableProductPrice( $variable, $type ) {
 
1742
  if ( 'regular_price' == $type ) {
1743
- return $variable->get_variation_regular_price();
1744
  } elseif ( 'sale_price' == $type ) {
1745
- return $variable->get_variation_sale_price();
1746
  } else {
1747
- return $variable->get_variation_price();
1748
  }
 
 
 
 
 
 
 
 
1749
  }
1750
 
1751
  /**
@@ -1758,338 +1906,331 @@ class Woo_Feed_Products_v3 {
1758
  * @since 3.2.0
1759
  *
1760
  */
1761
- public function get_price_with_tax( $product, $price ) {
1762
  if ( woo_feed_wc_version_check( 3.0 ) ) {
1763
  return wc_get_price_including_tax( $product, array( 'price' => $price ) );
1764
  } else {
1765
  return $product->get_price_including_tax( 1, $price );
1766
  }
1767
  }
1768
-
1769
  /**
1770
  * Get Product Weight
1771
- * @since 3.2.0
1772
  *
1773
  * @param WC_Product $product
1774
  *
1775
  * @return mixed
 
 
1776
  */
1777
- private function weight( $product ) {
1778
- // echo "Product Id: ".$product->get_name();
1779
- // echo " Product Name: ".$product->get_id(); echo "<br>";
1780
- // echo " Weight: ".$product->get_weight(); echo "<br>";
1781
- // echo "<br>"; echo "<br>";
1782
  return $product->get_weight();
1783
  }
1784
-
1785
  /**
1786
  * Get Product Width
1787
- * @since 3.2.0
1788
  *
1789
  * @param WC_Product $product
1790
  *
1791
  * @return mixed
 
 
1792
  */
1793
- private function width( $product ) {
1794
  return $product->get_width();
1795
  }
1796
-
1797
  /**
1798
  * Get Product Height
1799
- * @since 3.2.0
1800
  *
1801
  * @param WC_Product $product
1802
  *
1803
  * @return mixed
 
 
1804
  */
1805
- private function height( $product ) {
1806
  return $product->get_height();
1807
  }
1808
-
1809
  /**
1810
  * Get Product Length
1811
- * @since 3.2.0
1812
  *
1813
  * @param WC_Product $product
1814
  *
1815
  * @return mixed
 
 
1816
  */
1817
- private function length( $product ) {
1818
  return $product->get_length();
1819
  }
1820
-
1821
  /**
1822
  * Get Product Shipping Class
1823
- * @since 3.2.0
1824
  *
1825
  * @param WC_Product $product
1826
  *
1827
  * @return mixed
 
 
1828
  */
1829
- private function shipping_class( $product ) {
1830
  return $product->get_shipping_class();
1831
  }
1832
-
1833
  /**
1834
  * Get Product Author Name
1835
- * @since 3.2.0
1836
  *
1837
  * @param WC_Product $product
1838
  *
1839
  * @return mixed
 
 
1840
  */
1841
- private function author_name( $product ) {
1842
- $post = get_post($product->get_id());
1843
- $authorId = $post->post_author;
1844
-
1845
- return get_the_author_meta('user_login', $authorId);
1846
  }
1847
-
1848
  /**
1849
  * Get Product Author Email
1850
- * @since 3.2.0
1851
  *
1852
  * @param WC_Product $product
1853
  *
1854
  * @return mixed
 
 
1855
  */
1856
- private function author_email( $product ) {
1857
- $post = get_post($product->get_id());
1858
- $authorId = $post->post_author;
1859
-
1860
- return get_the_author_meta('user_email', $authorId);
1861
  }
1862
-
1863
  /**
1864
  * Get Product Created Date
1865
- * @since 3.2.0
1866
  *
1867
  * @param WC_Product $product
1868
  *
1869
  * @return mixed
 
 
1870
  */
1871
- private function date_created( $product ) {
1872
- $dateCreated = $product->get_date_created();
1873
-
1874
- return gmdate( 'Y-m-d', strtotime( $dateCreated ) );
1875
  }
1876
-
1877
  /**
1878
  * Get Product Last Updated Date
1879
- * @since 3.2.0
1880
  *
1881
  * @param WC_Product $product
1882
  *
1883
  * @return mixed
 
 
1884
  */
1885
- private function date_updated( $product ) {
1886
- $dateModified = $product->get_date_modified();
1887
-
1888
- return gmdate( 'Y-m-d', strtotime( $dateModified ) );
1889
  }
1890
-
1891
  /**
1892
  * Get Product Sale Price Effected Date for Google Shopping
1893
- * @since 3.2.0
1894
  *
1895
  * @param WC_Product $product
1896
  *
1897
- * @return mixed
 
 
1898
  */
1899
- private function sale_price_effective_date( $product ) {
1900
- $sale_price_effective_date = '';
1901
- $from = $this->sale_price_sdate($product);
1902
- $to = $this->sale_price_edate($product);
1903
- if ( ! empty($from) && ! empty($to) ) {
1904
- $from = gmdate("c", strtotime($from));
1905
- $to = gmdate("c", strtotime($to));
1906
- $sale_price_effective_date = $from . '/' . $to;
 
1907
  }
1908
-
1909
- return $sale_price_effective_date;
1910
  }
1911
-
1912
  /**
1913
  * Ger Product Attribute
1914
  *
1915
- * @since 2.2.3
1916
- *
1917
  * @param WC_Product $product
1918
  * @param $attr
1919
  *
1920
  * @return string
 
 
1921
  */
1922
- public function getProductAttribute( $product, $attr ) {
1923
  $id = $product->get_id();
1924
- $attr = str_replace(self::PRODUCT_ATTRIBUTE_PREFIX, '', $attr);
1925
-
1926
- if ( woo_feed_wc_version_check(3.2) ) {
1927
- if ( woo_feed_wc_version_check(3.6) ) {
1928
- $attr = str_replace("pa_", '', $attr);
1929
  }
1930
- $value = $product->get_attribute($attr);
1931
-
1932
  return $value;
1933
  } else {
1934
- return implode(',', wc_get_product_terms($id, $attr, array( 'fields' => 'names' )));
1935
  }
1936
  }
1937
-
1938
  /**
1939
  * Get Meta
1940
  *
1941
- * @since 2.2.3
1942
- *
1943
  * @param WC_Product $product
1944
  * @param string $meta post meta key
1945
  *
1946
  * @return mixed|string
 
 
1947
  */
1948
- public function getProductMeta( $product, $meta ) {
1949
- $id = $product->get_id();
1950
- $meta = str_replace(self::POST_META_PREFIX, '', $meta);
1951
-
1952
- if ( strpos($meta, 'attribute_pa') !== false ) {
1953
- $productMeta = $this->getProductAttribute($product, str_replace("attribute_", '', $meta));
1954
- } else {
1955
- $productMeta = get_post_meta($id, $meta, true);
1956
  }
1957
 
1958
- // @TODO pro version has output option for choosing meta from parent post. should this exists in free version???...
1959
-
1960
- if ( '' == $productMeta ) {
1961
- $postParent = wp_get_post_parent_id( $id );
1962
- if ( $postParent > 0 ) {
1963
- $productMeta = get_post_meta( $postParent, $meta, true );
1964
- }
1965
- }
1966
-
1967
- return $productMeta;
1968
  }
1969
-
1970
  /**
1971
  * Get Taxonomy
1972
- * @since 2.2.3
1973
  *
1974
  * @param WC_Product $product
1975
  * @param $taxonomy
1976
  *
1977
  * @return string
 
 
1978
  */
1979
- public function getProductTaxonomy( $product, $taxonomy ) {
1980
  $id = $product->get_id();
1981
- $taxonomy = str_replace(self::PRODUCT_TAXONOMY_PREFIX, '', $taxonomy);
1982
- $taxonomy_list = get_the_term_list( $id, $taxonomy, '', ',', '' );
1983
-
1984
- if ( ! empty($taxonomy_list) ) {
1985
- return wp_strip_all_tags($taxonomy_list);
1986
  }
1987
-
1988
- return '';
 
 
1989
  }
1990
-
1991
  /**
1992
  * Format price value
1993
- * @since 3.2.0
1994
  *
1995
  * @param string $name Attribute Name
1996
  * @param int $conditionName condition
1997
  * @param int $result price
1998
  *
1999
  * @return mixed
 
 
2000
  */
2001
- private function price_format( $name, $conditionName, $result ) {
2002
- $plus = "+";
2003
- $minus = "-";
2004
  $percent = "%";
2005
-
2006
- if ( strpos($name, 'price') !== false ) {
2007
- if ( strpos($result, $plus) !== false && strpos($result, $percent) !== false ) {
2008
- $result = str_replace("+", '', $result);
2009
- $result = str_replace("%", '', $result);
2010
- if ( is_numeric($result) ) {
2011
- $result = $conditionName + (($conditionName * $result) / 100);
2012
  }
2013
- } elseif ( strpos($result, $minus) !== false && strpos($result, $percent) !== false ) {
2014
- $result = str_replace("-", '', $result);
2015
- $result = str_replace("%", '', $result);
2016
- if ( is_numeric($result) ) {
2017
- $result = $conditionName - (($conditionName * $result) / 100);
2018
  }
2019
- } elseif ( strpos($result, $plus) !== false ) {
2020
- $result = str_replace("+", "", $result);
2021
- if ( is_numeric($result) ) {
2022
- $result = ($conditionName + $result);
2023
  }
2024
- } elseif ( strpos($result, $minus) !== false ) {
2025
- $result = str_replace("-", "", $result);
2026
- if ( is_numeric($result) ) {
2027
  $result = $conditionName - $result;
2028
  }
2029
  }
2030
  }
2031
-
2032
  return $result;
2033
  }
2034
-
2035
  /**
2036
  * Format output According to Output Type config
2037
- * @since 3.2.0
2038
  *
2039
- * @param $output
2040
- * @param $outputTypes
 
 
2041
  *
2042
  * @return float|int|string
 
 
2043
  */
2044
- public function format_output( $output, $outputTypes ) {
2045
  if ( ! empty( $outputTypes ) && is_array( $outputTypes ) ) {
2046
 
2047
- # Format Output According to output type
2048
  if ( in_array( 2, $outputTypes ) ) { // Strip Tags
2049
  $output = wp_strip_all_tags( html_entity_decode( $output ) );
2050
  }
2051
 
2052
- if ( in_array( 3, $outputTypes ) ) { # UTF-8 Encode
2053
  $output = utf8_encode( $output );
2054
  }
2055
 
2056
- if ( in_array( 4, $outputTypes ) ) { # htmlentities
2057
  $output = htmlentities( $output, ENT_QUOTES, 'UTF-8' );
2058
  }
2059
 
2060
- if ( in_array( 5, $outputTypes ) ) { # Integer
2061
- $output = absint( $output );
2062
  }
2063
 
2064
- if ( in_array( 6, $outputTypes ) ) { # Format Price
2065
- $output = (float) $output;
2066
- $output = number_format( $output, 2, '.', '' );
 
 
2067
  }
2068
 
2069
- if ( in_array( 7, $outputTypes ) ) { # Delete Space
2070
  $output = trim( $output );
2071
  $output = preg_replace( '!\s+!', ' ', $output );
2072
  }
2073
 
2074
- if ( in_array( 9, $outputTypes ) ) { # Remove Invalid Character
2075
  $output = woo_feed_stripInvalidXml( $output );
2076
  }
2077
 
2078
- if ( in_array( 10, $outputTypes ) ) { # Remove ShortCodes
2079
  $output = $this->remove_short_codes( $output );
2080
  }
2081
 
2082
- if ( in_array( 8, $outputTypes ) ) { # Add CDATA
2083
  $output = '<![CDATA[' . $output . ']]>';
2084
  }
2085
  }
2086
 
2087
  return $output;
2088
  }
2089
-
2090
  /**
2091
  * Add Prefix and Suffix with attribute value
2092
- * @since 3.2.0
2093
  *
2094
  * @param $output
2095
  * @param $prefix
@@ -2097,44 +2238,42 @@ class Woo_Feed_Products_v3 {
2097
  * @param $attribute
2098
  *
2099
  * @return string
 
 
2100
  */
2101
- public function process_prefix_suffix( $output, $prefix, $suffix, $attribute = '' ) {
2102
-
2103
- if ( empty( $output ) ) {
2104
- return "$output";
2105
  }
2106
-
2107
- # Add Prefix before Output
2108
  if ( '' != $prefix ) {
2109
  $output = "$prefix" . $output;
2110
  }
2111
-
2112
- # Add Suffix after Output
2113
- if ( '' != $suffix ) {
2114
  if (
2115
- 'price' == $attribute ||
2116
- 'sale_price' == $attribute ||
2117
- 'current_price' == $attribute ||
2118
- 'price_with_tax' == $attribute ||
2119
- 'current_price_with_tax' == $attribute ||
2120
- 'sale_price_with_tax' == $attribute ||
2121
- 'shipping_price' == $attribute ||
2122
- 'tax_rate' == $attribute
2123
- ) { # Add space before suffix if attribute contain price
2124
-
2125
- $output = $output . '' . $suffix;
2126
-
2127
- } elseif ( 'http' === substr( $output, 0, 4 ) ) {
2128
-
2129
- # Parse URL Parameters if available into suffix field
2130
  $output = woo_feed_make_url_with_parameter( $output, $suffix );
2131
-
2132
  } else {
2133
  $output = $output . "$suffix";
2134
  }
2135
  }
2136
-
2137
  return "$output";
2138
  }
2139
-
2140
  }
1
  <?php /** @noinspection PhpUnusedPrivateMethodInspection, PhpUnused, PhpUnusedLocalVariableInspection, DuplicatedCode */
2
+
3
  /**
4
  * Created by PhpStorm.
5
  * User: wahid
7
  * Time: 5:10 PM
8
  */
9
 
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ die();
12
+ }
13
+
14
+ /**
15
+ * Class Woo_Feed_Products_v3
16
+ */
17
  class Woo_Feed_Products_v3 {
18
+ /**
19
+ * The Increment
20
+ * @var int
21
+ */
22
+ protected $pi = 0;
23
+ /**
24
+ * Feed file headers
25
+ * @var string|array
26
+ */
27
  public $feedHeader;
28
+ /**
29
+ * Feed File Body
30
+ * @var string|array
31
+ */
32
  public $feedBody;
33
+ /**
34
+ * Feed file footer
35
+ * @var string|array
36
+ */
37
  public $feedFooter;
38
+ /**
39
+ * CSV|TXT column (text|word) enclosure
40
+ * @var string
41
+ */
42
+ protected $enclosure;
43
+ /**
44
+ * CSV|TXT column delimiter
45
+ * @var string
46
+ */
47
+ protected $delimiter;
48
+ /**
49
+ * Feed Rules
50
+ * @var array
51
+ */
52
+ protected $config;
53
+ /**
54
+ * Post status to query
55
+ * @var string
56
+ */
57
+ protected $post_status = 'publish';
58
+ /**
59
+ * Processed Products
60
+ * @var array
61
+ */
62
  public $products = [];
63
+ /**
64
+ * Query Method Selector
65
+ * @var string
66
+ */
67
+ protected $queryType = 'wp';
68
+ /**
69
+ * Google shipping tax attributes
70
+ * @var array
71
+ */
72
+ protected $google_shipping_tax = array(
73
  'shipping_country',
74
  'shipping_region',
75
  'shipping_service',
78
  'tax_region',
79
  'tax_rate',
80
  'tax_ship',
81
+ 'installment_months',
82
+ 'installment_amount',
83
+ 'subscription_period',
84
+ 'subscription_period_length',
85
+ 'subscription_amount',
86
  );
87
+ /**
88
+ * Product types for query
89
+ * @var array
90
+ */
91
+ protected $product_types = array(
92
  'simple',
93
  'variable',
94
  'variation',
95
  'grouped',
96
  'external',
97
  );
98
+
99
  // TODO check if product is in those above types.
100
  /**
101
  * Post meta prefix for dropdown item
115
  * @var string
116
  */
117
  const PRODUCT_TAXONOMY_PREFIX = 'wf_taxo_';
118
+
119
  public function __construct( $config ) {
120
  $this->config = woo_feed_parse_feed_rules( $config );
121
  $this->queryType = strtolower( get_option( 'woo_feed_product_query_type', 'wc' ) );
122
  if ( ! in_array( $this->queryType, [ 'wc', 'wp', 'both' ] ) ) {
123
  $this->queryType = 'wc';
124
  }
125
+
126
  // woo_feed_log_feed_process( $this->config['filename'], sprintf( 'Current Query Type is %s', $this->queryType ) );
127
  }
128
+
129
  /**
130
  * Get Products using WC_Product_Query
131
  *
151
  // }
152
  return $query->get_products();
153
  }
154
+
155
  /**
156
  * Get Products using WP_Query
157
  *
170
  'update_post_term_cache' => false,
171
  'suppress_filters' => false,
172
  );
173
+
174
  $query = new WP_Query( $args );
175
  // if( woo_feed_is_debugging_enabled() ) {
176
  // woo_feed_log_feed_process( $this->config['filename'], sprintf( 'WP_Query Args ::'.PHP_EOL.'%s', print_r( $args, true ) ) );
178
  // }
179
  return $query->get_posts();
180
  }
181
+
182
  /**
183
+ * Get products
184
  *
185
+ * @return array
186
  */
187
  public function query_products() {
188
  $products = [];
191
  } elseif ( 'wp' == $this->queryType ) {
192
  $products = $this->get_wp_query_products();
193
  } elseif ( 'both' == $this->queryType ) {
194
+ $wc = $this->get_wc_query_products();
195
+ $wp = $this->get_wp_query_products();
196
  $products = array_unique( array_merge( $wc, $wp ) );
197
  }
198
+
199
  return $products;
200
  }
201
 
202
+ /**
203
+ * Organize Feed Attribute config
204
+ * @return array|bool
205
+ */
206
+ public function get_attribute_config() {
207
+ if ( empty( $this->config ) ) {
208
+ return false;
209
+ }
210
+
211
+ $attributeConfig = array();
212
+ $merchantAttributes = $this->config['mattributes'];
213
+ if ( ! empty( $merchantAttributes ) ) {
214
+ $i = 0;
215
+ foreach ( $merchantAttributes as $key => $value ) {
216
+ $attributeConfig[ $i ]['mattributes'] = $value;
217
+ $attributeConfig[ $i ]['prefix'] = $this->config['prefix'][ $key ];
218
+ $attributeConfig[ $i ]['type'] = $this->config['type'][ $key ];
219
+ $attributeConfig[ $i ]['attributes'] = $this->config['attributes'][ $key ];
220
+ $attributeConfig[ $i ]['default'] = $this->config['default'][ $key ];
221
+ $attributeConfig[ $i ]['suffix'] = $this->config['suffix'][ $key ];
222
+ $attributeConfig[ $i ]['output_type'] = $this->config['output_type'][ $key ];
223
+ $attributeConfig[ $i ]['limit'] = $this->config['limit'][ $key ];
224
+ $i ++;
225
+ }
226
+ }
227
+
228
+ return $attributeConfig;
229
+ }
230
+
231
  /**
232
  * Get Product Information according to feed config
233
  *
 
 
234
  * @param int[] $productIds
235
  *
236
  * @return array
237
+ * @since 3.2.0
238
+ *
239
  */
240
  public function get_products( $productIds ) {
241
+
242
  if ( empty( $productIds ) ) {
243
  return [];
244
  }
245
 
246
  /**
247
  * Fires before looping through request product for getting product data
248
+ *
249
  * @param int[] $productIds
250
  * @param array $feedConfig
251
+ *
252
+ * @since 3.2.10
253
  */
254
  do_action( 'woo_feed_before_product_loop', $productIds, $this->config );
255
 
264
  continue;
265
  }
266
  }
267
+
268
  // Skip for invalid products
269
  if ( ! is_object( $product ) ) {
270
  // woo_feed_log_feed_process( $this->config['filename'], 'Skipping Product :: Product data is not a valid WC_Product object.' );
271
  continue;
272
  }
273
+
274
  // Skip for invisible products
275
  if ( ! $product->is_visible() ) {
276
  // woo_feed_log_feed_process( $this->config['filename'], 'Skipping Product :: Product is not visible.' );
277
  continue;
278
  }
279
+
280
  // Apply variable and variation settings
281
  if ( $product->is_type( 'variable' ) && $product->has_child() ) {
282
  $this->pi ++;
286
  }
287
  }
288
 
 
289
  // Add Single item wrapper before product info loop start
290
  if ( 'xml' == $this->config['feedType'] ) {
291
  $this->feedBody .= "\n";
297
  $mAttributes = array();
298
  // Get Product Attribute values by type and assign to product array
299
  foreach ( $this->config['attributes'] as $attr_key => $attribute ) {
300
+
301
  // Continue for Google Shipping and Tax attributes
302
  $skipFor = array( 'google', 'facebook' );
303
  if (
307
  ) {
308
  continue;
309
  }
310
+
311
+ if ( in_array( $this->config['mattributes'][ $attr_key ], $mAttributes ) ) {
312
  continue;
313
  }
314
 
315
  if ( 'pattern' == $this->config['type'][ $attr_key ] ) {
316
  $attributeValue = $this->config['default'][ $attr_key ];
317
  } else { # Get Pattern value
318
+ $attributeValue = $this->getAttributeValueByType( $product, $attribute );
319
  }
320
+
321
  // Format Output according to Output Type config.
322
  $outputType = $this->config['output_type'][ $attr_key ];
323
  if ( 'default' != $outputType ) {
324
+ $attributeValue = $this->format_output( $attributeValue, $outputType, $product, $attribute );
325
  }
326
+
 
327
  // Limit Output
328
  $limit = $this->config['limit'][ $attr_key ];
329
  if ( ! empty( $limit ) && is_numeric( $limit ) ) {
330
  if ( strpos( $attributeValue, '<![CDATA[' ) !== false ) {
331
+ $attributeValue = str_replace( array( '<![CDATA[', ']]>' ), array( '', '' ), $attributeValue );
332
+ $attributeValue = substr( $attributeValue, 0, $limit );
333
  $attributeValue = '<![CDATA[' . $attributeValue . ']]>';
334
  } else {
335
  $attributeValue = substr( $attributeValue, 0, $limit );
336
  }
337
  }
338
+
339
  // Add Prefix and Suffix into Output
340
  $prefix = $this->config['prefix'][ $attr_key ];
341
  $suffix = $this->config['suffix'][ $attr_key ];
342
 
 
343
  if ( '' != $prefix || '' != $suffix ) {
344
  $attributeValue = $this->process_prefix_suffix( $attributeValue, $prefix, $suffix, $attribute );
345
  }
348
  $merchant = $this->config['provider'];
349
  $feedType = $this->config['feedType'];
350
  if ( 'xml' == $this->config['feedType'] ) {
351
+
352
  # Replace XML Nodes according to merchant requirement
353
+ $getReplacedAttribute = woo_feed_replace_to_merchant_attribute( $pluginAttribute,
354
+ $merchant,
355
+ $feedType );
356
+
357
+ # XML does not support space in node. So replace Space with Underscore
358
+ $getReplacedAttribute = str_replace( '', '_', $getReplacedAttribute );
359
+
360
+ if ( ! empty( $attributeValue ) ) {
361
+ $attributeValue = trim( $attributeValue );
362
+ }
363
 
364
  // Add closing XML node if value is empty
365
  if ( '' != $attributeValue ) {
366
  # Add CDATA wrapper for XML feed to prevent XML error.
367
  $attributeValue = woo_feed_add_cdata( $pluginAttribute, $attributeValue, $merchant );
368
+
369
  #TODO Move to proper place
370
  # Replace Google Color attribute value according to requirements
371
  if ( 'g:color' == $getReplacedAttribute ) {
372
  $attributeValue = str_replace( ', ', '/', $attributeValue );
373
  }
374
+
375
  # Strip slash from output
376
  $attributeValue = stripslashes( $attributeValue );
377
 
378
  $this->feedBody .= '<' . $getReplacedAttribute . '>' . "$attributeValue" . '</' . $getReplacedAttribute . '>';
379
  $this->feedBody .= "\n";
380
+
381
  } else {
382
  $this->feedBody .= '<' . $getReplacedAttribute . '/>';
383
  $this->feedBody .= "\n";
384
+ }
385
  } elseif ( 'csv' == $this->config['feedType'] ) {
386
  $pluginAttribute = woo_feed_replace_to_merchant_attribute( $pluginAttribute, $merchant, $feedType );
387
  $pluginAttribute = $this->processStringForCSV( $pluginAttribute );
391
  $pluginAttribute = $this->processStringForTXT( $pluginAttribute );
392
  $attributeValue = $this->processStringForTXT( $attributeValue );
393
  }
394
+
395
+ $mAttributes[ $attr_key ] = $this->config['mattributes'][ $attr_key ];
396
  $this->products[ $this->pi ][ $pluginAttribute ] = $attributeValue;
397
  }
398
+
399
  // try {
400
  // woo_feed_log_feed_process( $this->config['filename'], 'Processing Merchant Specific Fields' );
401
  // Process feed data for uncommon merchant feed like Google,Facebook,Pinterest
402
  # Process feed data for uncommon merchant feed like Google,Facebook,Pinterest
403
+ $this->process_for_merchant( $product, $this->pi );
404
  // } catch ( Exception $e ) {
405
  // $message = 'Error Processing Merchant Specific Fields.' . PHP_EOL . 'Caught Exception :: ' . $e->getMessage();
406
  // woo_feed_log( $this->config['filename'], $message, 'critical', $e, true );
429
  $this->process_csv_feed_body();
430
  }
431
  // woo_feed_log_feed_process( $this->config['filename'], 'Done Formatting...' );
432
+ $this->pi ++;
433
  }
434
 
435
  /**
436
  * Fires after looping through request product for getting product data
437
+ *
438
  * @param int[] $productIds
439
  * @param array $feedConfig
440
+ *
441
+ * @since 3.2.10
442
  */
443
  do_action( 'woo_feed_after_product_loop', $productIds, $this->config );
444
+
445
  return $this->products;
446
  }
447
+
448
+
449
  /**
450
  * Process feed data according to merchant uncommon requirements like Google
451
  *
 
 
452
  * @param $productObj WC_Product
453
  * @param $index | Product Index
454
+ *
455
+ * @since 3.2.0
456
+ *
457
  */
458
+ protected function process_for_merchant( $productObj, $index ) {
459
+ $product = $this->products[ $index ];
460
  $merchantAttributes = $this->config['mattributes'];
461
 
462
  // Format Shipping and Tax data for CSV and TXT feed only for google and facebook
479
  'tax_ship',
480
  );
481
  foreach ( $this->products[ $this->pi ] as $attribute => $value ) {
482
+ if ( in_array( $attribute, $shippingAttr ) ) {
483
 
484
  if ( 'tax_country' == $attribute ) {
485
+ $t ++;
486
  $tax[ $t ] .= $value . ':';
487
  } elseif ( 'tax_region' == $attribute ) {
488
  $tax[ $t ] .= $value . ':';
493
  }
494
 
495
  if ( 'shipping_country' == $attribute ) {
496
+ $s ++;
497
  $shipping[ $s ] .= $value . ':';
498
  } elseif ( 'shipping_service' == $attribute ) {
499
  $shipping[ $s ] .= $value . ':';
503
  $shipping[ $s ] .= $value . ':';
504
  }
505
 
506
+ unset( $this->products[ $this->pi ][ $attribute ] );
507
  }
508
  }
509
 
519
  if ( 'google' == $this->config['provider'] ) {
520
 
521
  // Reformat Shipping attributes for google, facebook
522
+ $s = 0;
523
+ $t = 0;
524
+ $tax = '';
525
  $shipping = '';
526
  if ( 'xml' == $this->config['feedType'] ) {
527
  foreach ( $merchantAttributes as $key => $value ) {
528
 
529
+ if ( ! in_array( $value, $this->google_shipping_tax ) ) {
530
  continue;
531
  }
532
 
537
  $output = $this->config['default'][ $key ];
538
  } else { // Get Pattern value.
539
  $attribute = $this->config['attributes'][ $key ];
540
+ $output = $this->getAttributeValueByType( $productObj, $attribute );
541
  }
542
 
543
  if ( false !== strpos( $value, 'price' ) || false !== strpos( $value, 'rate' ) ) {
555
  $shipping .= '</g:shipping>' . "\n";
556
  $shipping .= '<g:shipping>';
557
  }
558
+ } elseif ( ! in_array( 'shipping_country', $merchantAttributes ) && 'shipping_price' == $value ) {
559
  if ( 0 == $s ) {
560
  $shipping .= '<g:shipping>';
561
  $s = 1;
576
  } elseif ( 'tax_country' == $value ) {
577
  if ( 0 == $t ) {
578
  $tax .= '<g:tax>';
579
+ $t = 1;
580
  } else {
581
  $tax .= '</g:tax>' . "\n";
582
  $tax .= '<g:tax>';
602
  $this->feedBody .= $tax;
603
  }
604
  // ADD g:identifier_exists
605
+ $identifier = array( 'brand', 'upc', 'sku', 'mpn', 'gtin' );
606
  $countIdentifier = 0;
607
+ if ( ! in_array( 'identifier_exists', $merchantAttributes ) ) {
608
+ if ( count( array_intersect_key( array_flip( $identifier ), $product ) ) >= 2 ) {
609
  // Any 2 required keys exist!
610
  // @TODO Refactor with OR
611
+ if ( array_key_exists( 'brand', $product ) && ! empty( $product['brand'] ) ) {
612
+ $countIdentifier ++;
613
  }
614
+ if ( array_key_exists( 'upc', $product ) && ! empty( $product['upc'] ) ) {
615
+ $countIdentifier ++;
616
  }
617
+ if ( array_key_exists( 'sku', $product ) && ! empty( $product['sku'] ) ) {
618
+ $countIdentifier ++;
619
  }
620
+ if ( array_key_exists( 'mpn', $product ) && ! empty( $product['mpn'] ) ) {
621
+ $countIdentifier ++;
622
  }
623
+ if ( array_key_exists( 'gtin', $product ) && ! empty( $product['gtin'] ) ) {
624
+ $countIdentifier ++;
625
  }
626
  }
627
 
645
  /**
646
  * Generate TXT Feed Header
647
  *
648
+ * @return string
649
  * @since 3.2.0
650
  *
 
651
  */
652
+ protected function process_txt_feed_header() {
653
  // Set Delimiter
654
  if ( 'tab' == $this->config['delimiter'] ) {
655
  $this->delimiter = "\t";
678
 
679
  $product = $this->products[ $this->pi ];
680
  $headers = array_keys( $product );
681
+ $this->feedHeader .= $this->enclosure . implode( "$this->enclosure$this->delimiter$this->enclosure",
682
+ $headers ) . $this->enclosure . $eol;
683
 
684
  return $this->feedHeader;
685
  }
687
  /**
688
  * Generate TXT Feed Body
689
  *
690
+ * @return string
691
  * @since 3.2.0
692
  *
 
693
  */
694
+ protected function process_txt_feed_body() {
695
  $productInfo = array_values( $this->products[ $this->pi ] );
696
+ $eol = PHP_EOL;
697
  if ( 'trovaprezzi' === $this->config['provider'] ) {
698
  $eol = '<endrecord>' . PHP_EOL;
699
  }
700
+ $this->feedBody .= $this->enclosure . implode( "$this->enclosure$this->delimiter$this->enclosure",
701
+ $productInfo ) . $this->enclosure . $eol;
702
 
703
  return $this->feedBody;
704
  }
706
  /**
707
  * Generate CSV Feed Header
708
  *
709
+ * @return array
710
  * @since 3.2.0
711
  *
 
712
  */
713
+ protected function process_csv_feed_header() {
714
  // Set Delimiter
715
  if ( 'tab' == $this->config['delimiter'] ) {
716
  $this->delimiter = "\t";
740
 
741
  /**
742
  * Generate CSV Feed Body
 
743
  * @return array
744
+ * @since 3.2.0
745
  */
746
+ protected function process_csv_feed_body() {
747
  $product = $this->products[ $this->pi ];
748
  $this->feedBody[] = array_values( $product );
749
 
752
 
753
  /**
754
  * Make XML feed header
 
755
  * @return string
756
+ * @since 3.2.0
757
  */
758
+ protected function process_xml_feed_header() {
759
+ $datetime_now = gmdate( 'Y-m-d H:i:s' );
760
  if ( 'fruugo.au' == $this->config["provider"] ) {
761
  return "<products version=\"1.0\" standalone=\"yes\">
762
  <datetime>$datetime_now</datetime>
872
 
873
  /**
874
  * Make XML feed header
 
875
  * @return string
876
+ * @since 3.2.0
877
  */
878
+ protected function process_xml_feed_footer() {
879
+ if ( in_array( $this->config['provider'],
880
+ [
881
+ 'fruugo.au',
882
+ 'stylight.com',
883
+ 'nextad',
884
+ 'skinflint.co.uk',
885
+ 'comparer.be',
886
+ 'dooyoo',
887
+ 'hintaseuranta.fi',
888
+ 'incurvy',
889
+ 'kijiji.ca',
890
+ 'marktplaats.nl',
891
+ 'rakuten.de',
892
+ 'shopalike.fr',
893
+ 'spartoo.fi',
894
+ 'webmarchand',
895
+ ] ) ) {
896
  return '</products>';
897
  } elseif ( 'zap.co.il' == $this->config['provider'] ) {
898
  return '</STORE>';
909
 
910
  /**
911
  * Process string for TXT CSV Feed
 
912
  *
913
  * @param $string
914
  *
915
  * @return mixed|string
916
+ * @since 3.2.0
917
+ *
918
  */
919
+ protected function processStringForTXT( $string ) {
920
  if ( ! empty( $string ) ) {
921
  $string = html_entity_decode( $string, ENT_HTML401 | ENT_QUOTES ); // Convert any HTML entities
922
 
939
 
940
  /**
941
  * Process string for CSV
 
942
  *
943
  * @param $string
944
  *
945
  * @return mixed|string
946
+ * @since 3.2.0
947
+ *
948
  */
949
+ protected function processStringForCSV( $string ) {
950
  if ( ! empty( $string ) ) {
951
  $string = str_replace( "\n", ' ', $string );
952
  $string = str_replace( "\r", ' ', $string );
963
 
964
  /**
965
  * Get Product Attribute Value by Type
 
966
  *
967
  * @param $product WC_Product
968
  * @param $attribute
969
  *
970
  * @return mixed|string
971
+ * @since 3.2.0
972
+ *
973
  */
974
+ protected function getAttributeValueByType( $product, $attribute ) {
975
 
976
  if ( method_exists( $this, $attribute ) ) {
977
  $output = call_user_func_array( array( $this, $attribute ), array( $product ) );
978
+ } elseif ( false !== strpos( $attribute, self::PRODUCT_ATTRIBUTE_PREFIX ) ) {
979
+ $attribute = str_replace( self::PRODUCT_ATTRIBUTE_PREFIX, '', $attribute );
980
+ $output = $this->getProductAttribute( $product, $attribute );
981
+ } elseif ( false !== strpos( $attribute, self::POST_META_PREFIX ) ) {
982
+ $attribute = str_replace( self::POST_META_PREFIX, '', $attribute );
983
+ $output = $this->getProductMeta( $product, $attribute );
984
+ } elseif ( false !== strpos( $attribute, self::PRODUCT_TAXONOMY_PREFIX ) ) {
985
+ $attribute = str_replace( self::PRODUCT_TAXONOMY_PREFIX, '', $attribute );
986
+ $output = $this->getProductTaxonomy( $product, $attribute );
987
+ } elseif ( 'image_' == substr( $attribute, 0, 6 ) ) {
988
  // For additional image method images() will be used with extra parameter - image number
989
  $imageKey = explode( '_', $attribute );
990
  if ( ! isset( $imageKey[1] ) || ( isset( $imageKey[1] ) && ( empty( $imageKey[1] ) || ! is_numeric( $imageKey[1] ) ) ) ) {
992
  }
993
  $output = call_user_func_array( array( $this, 'images' ), array( $product, $imageKey[1] ) );
994
  } else {
995
+ // return the attribute so multiple attribute can be join with separator to make custom attribute.
996
+ $output = $attribute;
997
  }
998
 
999
  // Json encode if value is an array
1000
+ if ( is_array( $output ) ) {
1001
+ $output = wp_json_encode( $output );
1002
+ }
1003
 
1004
  /**
1005
  * Filter attribute value before return based on merchant and attribute name
1006
  *
1007
+ * @param string $output the output
 
 
1008
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
1009
  * @param array feed config/rule
1010
+ *
1011
+ * @since 3.3.7
1012
+ *
1013
  */
1014
  $output = apply_filters( "woo_feed_get_{$this->config['provider']}_{$attribute}_attribute", $output, $product, $this->config );
1015
 
1016
  /**
1017
  * Filter attribute value before return based on attribute name
1018
  *
1019
+ * @param string $output the output
 
 
1020
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
1021
  * @param array feed config/rule
1022
+ *
1023
+ * @since 3.3.5
1024
+ *
1025
  */
1026
  return apply_filters( "woo_feed_get_{$attribute}_attribute", $output, $product, $this->config );
1027
  }
1028
 
 
1029
  /**
1030
  * Get Product Id
1031
  *
1032
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
1033
  *
 
1034
  * @return mixed
1035
+ * @since 3.2.0
1036
  */
1037
+ protected function id( $product ) {
1038
  return $product->get_id();
1039
  }
1040
+
1041
  /**
1042
  * Get Product Title
 
1043
  *
1044
  * @param WC_Product $product
1045
  *
1046
  * @return mixed
1047
+ * @since 3.2.0
1048
+ *
1049
  */
1050
+ protected function title( $product ) {
1051
  return $product->get_name();
1052
  }
1053
 
1054
  /**
1055
  * Get Yoast Product Title
 
1056
  *
1057
  * @param WC_Product $product
1058
  *
1059
  * @return mixed
1060
+ * @since 3.2.0
1061
+ *
1062
  */
1063
+ protected function yoast_wpseo_title( $product ) {
1064
  $title = '';
1065
  if ( class_exists( 'WPSEO_Frontend' ) ) {
1066
  $title = WPSEO_Frontend::get_instance()->get_seo_title( get_post( $product->get_id() ) );
1074
 
1075
  /**
1076
  * Get All In One Product Title
 
1077
  *
1078
  * @param WC_Product $product
1079
  *
1080
  * @return mixed
1081
+ * @since 3.2.0
1082
+ *
1083
  */
1084
+ protected function _aioseop_title( $product ) {
1085
  $title = '';
1086
  if ( class_exists( 'All_in_One_SEO_Pack' ) ) {
1087
  global $aioseop_options, $aiosp;
1109
 
1110
  /**
1111
  * Get Product Description
 
1112
  *
1113
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
1114
  *
1115
  * @return mixed|string
1116
+ * @since 3.2.0
1117
+ *
1118
  */
1119
+ protected function description( $product ) {
1120
 
1121
  $description = $product->get_description();
1122
 
1143
 
1144
  /**
1145
  * Get Yoast Product Description
 
1146
  *
1147
  * @param WC_Product $product
1148
  *
1149
  * @return mixed
1150
+ * @since 3.2.0
1151
+ *
1152
  */
1153
+ protected function yoast_wpseo_metadesc( $product ) {
1154
  $description = '';
1155
  if ( class_exists( 'WPSEO_Frontend' ) ) {
1156
+ $description = wpseo_replace_vars( WPSEO_Meta::get_value( 'metadesc', $product->get_id() ),
1157
+ get_post( $product->get_id() ) );
1158
  }
1159
  if ( ! empty( $description ) ) {
1160
  return $description;
1165
 
1166
  /**
1167
  * Get All In One Product Description
 
1168
  *
1169
  * @param WC_Product $product
1170
  *
1171
  * @return mixed
1172
+ * @since 3.2.0
1173
+ *
1174
  */
1175
+ protected function _aioseop_description( $product ) {
1176
  $description = '';
1177
  if ( class_exists( 'All_in_One_SEO_Pack' ) ) {
1178
  global $aioseop_options, $aiosp;
1185
  if ( in_array( 'product', $aioseop_options['aiosp_cpostactive'], true ) ) {
1186
  $description = $aiosp->get_main_description( get_post( $product->get_id() ) ); // Get the description.
1187
  $description = $aiosp->trim_description( $description );
1188
+ $description = apply_filters( 'aioseop_description_full',
1189
+ $aiosp->apply_description_format( $description, get_post( $product->get_id() ) ) );
1190
  }
1191
  }
1192
  if ( ! empty( $description ) ) {
1198
 
1199
  /**
1200
  * Get Product Short Description
 
1201
  *
1202
  * @param WC_Product $product
1203
  *
1204
  * @return mixed|string
1205
+ * @since 3.2.0
1206
+ *
1207
  */
1208
+ protected function short_description( $product ) {
1209
 
1210
  $short_description = $product->get_short_description();
1211
 
1224
 
1225
  /**
1226
  * At First convert Short Codes and then Remove failed Short Codes from String
 
1227
  *
1228
  * @param $content
1229
  *
1230
  * @return mixed|string
1231
+ * @since 3.2.0
1232
+ *
1233
  */
1234
+ protected function remove_short_codes( $content ) {
1235
  if ( empty( $content ) ) {
1236
  return '';
1237
  }
1251
 
1252
  /**
1253
  * Get Product Categories
 
1254
  *
1255
  * @param WC_Product $product
1256
  *
1257
  * @return mixed
1258
+ * @since 3.2.0
1259
+ *
1260
  */
1261
+ protected function product_type( $product ) {
1262
  $id = $product->get_id();
1263
  if ( $product->is_type( 'variation' ) ) {
1264
  $id = $product->get_parent_id();
1268
 
1269
  return wp_strip_all_tags( wc_get_product_category_list( $id, $separator, '' ) );
1270
  }
1271
+
1272
  /**
1273
  * Get Product URL
 
1274
  *
1275
  * @param WC_Product $product
1276
  *
1277
  * @return string
1278
+ * @since 3.2.0
1279
+ *
1280
  */
1281
+ protected function link( $product ) {
1282
  $utm = $this->config['campaign_parameters'];
1283
  if ( ! empty( $utm['utm_source'] ) && ! empty( $utm['utm_medium'] ) && ! empty( $utm['utm_campaign'] ) ) {
1284
  $utm = [
1288
  'utm_term' => $utm['utm_term'],
1289
  'utm_content' => $utm['utm_content'],
1290
  ];
1291
+
1292
  return add_query_arg( array_filter( $utm ), $product->get_permalink() );
1293
  }
1294
+
1295
  return $product->get_permalink();
1296
  }
1297
+
1298
  /**
1299
  * Get External Product URL
 
1300
  *
1301
  * @param WC_Product $product
1302
  *
1303
  * @return string
1304
+ * @since 3.2.0
1305
+ *
1306
  */
1307
+ protected function ex_link( $product ) {
1308
  if ( $product->is_type( 'external' ) ) {
1309
  return $product->get_product_url();
1310
  }
1311
+
1312
  return '';
1313
  }
1314
 
1315
  /**
1316
  * Get Product Image
 
1317
  *
1318
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
1319
  *
1320
  * @return mixed
1321
+ * @since 3.2.0
1322
+ *
1323
  */
1324
+ protected function image( $product ) {
1325
  if ( $product->is_type( 'variation' ) ) {
1326
+ $getImage = wp_get_attachment_image_src( get_post_thumbnail_id( $product->get_id() ),
1327
+ 'single-post-thumbnail' );
1328
  if ( has_post_thumbnail( $product->get_id() ) && ! empty( $getImage[0] ) ) :
1329
  $image = woo_feed_get_formatted_url( $getImage[0] );
1330
  else :
1331
+ $getImage = wp_get_attachment_image_src( get_post_thumbnail_id( $product->get_parent_id() ),
1332
+ 'single-post-thumbnail' );
1333
  $image = woo_feed_get_formatted_url( $getImage[0] );
1334
  endif;
1335
  } else {
1336
  if ( has_post_thumbnail( $product->get_id() ) ) :
1337
+ $getImage = wp_get_attachment_image_src( get_post_thumbnail_id( $product->get_id() ),
1338
+ 'single-post-thumbnail' );
1339
  $image = woo_feed_get_formatted_url( $getImage[0] );
1340
  else :
1341
  $image = woo_feed_get_formatted_url( wp_get_attachment_url( $product->get_id() ) );
1347
 
1348
  /**
1349
  * Get Product Featured Image
 
1350
  *
1351
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product Product Object.
1352
  *
1353
  * @return mixed
1354
+ * @since 3.2.0
1355
+ *
1356
  */
1357
+ protected function feature_image( $product ) {
1358
  return $this->image( $product );
1359
  }
1360
 
1368
  * @since 3.2.0
1369
  *
1370
  */
1371
+ protected function images( $product, $additionalImg = '' ) {
1372
  if ( $product->is_type( 'variation' ) ) {
1373
  // TODO Test Variation Images
1374
  $imgUrls = $this->get_product_gallery( wc_get_product( $product->get_parent_id() ) );
1391
  /**
1392
  * Get Product Gallery Items (URL) array.
1393
  * This can contains empty array values
1394
+ *
1395
  * @param WC_Product|WC_Product_Variable|WC_Product_Variation|WC_Product_Grouped|WC_Product_External|WC_Product_Composite $product
1396
+ *
1397
  * @return string[]
1398
+ * @since 3.2.6
1399
  */
1400
+ protected function get_product_gallery( $product ) {
1401
  $attachmentIds = $product->get_gallery_image_ids();
1402
  $imgUrls = array();
1403
  if ( $attachmentIds && is_array( $attachmentIds ) ) {
1407
  $mKey ++;
1408
  }
1409
  }
1410
+
1411
  return $imgUrls;
1412
  }
1413
 
1414
  /**
1415
  * Get Product Condition
 
1416
  *
1417
  * @param WC_Product $product
1418
  *
1419
  * @return mixed
1420
+ * @since 3.2.0
1421
+ *
1422
  */
1423
+ protected function condition( $product ) {
1424
  return apply_filters( 'woo_feed_product_condition', 'new', $product );
1425
  }
1426
 
1427
  /**
1428
  * Get Product Type
 
1429
  *
1430
  * @param WC_Product $product
1431
  *
1432
  * @return mixed
1433
+ * @since 3.2.0
1434
+ *
1435
  */
1436
+ protected function type( $product ) {
1437
  return $product->get_type();
1438
  }
1439
 
1440
  /**
1441
  * Get Product is a bundle product or not
 
1442
  *
1443
  * @param WC_Product $product
1444
  *
1445
  * @return mixed
1446
+ * @since 3.2.0
1447
+ *
1448
  */
1449
+ protected function is_bundle( $product ) {
1450
  if ( $product->is_type( 'bundle' ) || $product->is_type( 'yith_bundle' ) ) {
1451
  return "yes";
1452
  }
1456
 
1457
  /**
1458
  * Get Product is a multi-pack product or not
 
1459
  *
1460
  * @param WC_Product $product
1461
  *
1462
  * @return mixed
1463
+ * @since 3.2.0
1464
+ *
1465
  */
1466
+ protected function multipack( $product ) {
1467
  $multi_pack = '';
1468
  if ( $product->is_type( 'grouped' ) ) {
1469
  $multi_pack = ( ! empty( $product->get_children() ) ) ? count( $product->get_children() ) : '';
1474
 
1475
  /**
1476
  * Get Product visibility status
 
1477
  *
1478
  * @param WC_Product $product
1479
  *
1480
  * @return mixed
1481
+ * @since 3.2.0
1482
+ *
1483
  */
1484
+ protected function visibility( $product ) {
1485
  return $product->get_catalog_visibility();
1486
  }
1487
 
1488
  /**
1489
  * Get Product Total Rating
 
1490
  *
1491
  * @param WC_Product $product
1492
  *
1493
  * @return mixed
1494
+ * @since 3.2.0
1495
+ *
1496
  */
1497
+ protected function rating_total( $product ) {
1498
  return $product->get_rating_count();
1499
  }
1500
 
1501
  /**
1502
  * Get Product average rating
 
1503
  *
1504
  * @param WC_Product $product
1505
  *
1506
  * @return mixed
1507
+ * @since 3.2.0
1508
+ *
1509
  */
1510
+ protected function rating_average( $product ) {
1511
  return $product->get_average_rating();
1512
  }
1513
 
1514
  /**
1515
  * Get Product tags
 
1516
  *
1517
  * @param WC_Product $product
1518
  *
1519
  * @return mixed
1520
+ * @since 3.2.0
1521
+ *
1522
  */
1523
+ protected function tags( $product ) {
1524
  $id = $product->get_id();
1525
  if ( $product->is_type( 'variation' ) ) {
1526
  $id = $product->get_parent_id();
1537
 
1538
  /**
1539
  * Get Product Parent Id
 
1540
  *
1541
  * @param WC_Product $product
1542
  *
1543
  * @return mixed
1544
+ * @since 3.2.0
1545
+ *
1546
  */
1547
+ protected function item_group_id( $product ) {
1548
  $id = $product->get_id();
1549
  if ( $product->is_type( 'variation' ) ) {
1550
  $id = $product->get_parent_id();
1555
 
1556
  /**
1557
  * Get Product SKU
 
1558
  *
1559
  * @param WC_Product $product
1560
  *
1561
  * @return mixed
1562
+ * @since 3.2.0
1563
+ *
1564
  */
1565
+ protected function sku( $product ) {
1566
  return $product->get_sku();
1567
  }
1568
 
1569
  /**
1570
  * Get Product Parent SKU
 
1571
  *
1572
  * @param WC_Product $product
1573
  *
1574
  * @return mixed
1575
+ * @since 3.2.0
1576
+ *
1577
  */
1578
+ protected function parent_sku( $product ) {
1579
  if ( $product->is_type( 'variation' ) ) {
1580
  $id = $product->get_parent_id();
1581
  $parent = wc_get_product( $id );
1588
 
1589
  /**
1590
  * Get Product Availability Status
 
1591
  *
1592
  * @param WC_Product $product
1593
  *
1594
  * @return mixed
1595
+ * @since 3.2.0
1596
+ *
1597
  */
1598
+ protected function availability( $product ) {
1599
  $status = $product->get_stock_status();
1600
+ if ( 'instock' == $status ) {
1601
+ return 'in stock';
1602
+ } elseif ( 'outofstock' == $status ) {
1603
+ return 'out of stock';
1604
+ } elseif ( 'onbackorder' == $status ) {
1605
+ return 'on backorder';
1606
+ } else {
1607
+ return 'in stock';
 
 
1608
  }
 
 
1609
  }
1610
 
1611
  /**
1612
  * Get Product Quantity
 
1613
  *
1614
  * @param WC_Product $product
1615
  *
1616
  * @return mixed
1617
+ * @since 3.2.0
1618
+ *
1619
  */
1620
+ protected function quantity( $product ) {
1621
  if ( $product->is_type( 'variable' ) && $product->has_child() ) {
1622
  $visible_children = $product->get_visible_children();
1623
  $qty = array();
1647
 
1648
  /**
1649
  * Get Product Sale Price Start Date
 
1650
  *
1651
  * @param WC_Product $product
1652
  *
1653
  * @return mixed
1654
+ * @since 3.2.0
1655
+ *
1656
  */
1657
+ protected function sale_price_sdate( $product ) {
1658
  $startDate = $product->get_date_on_sale_from();
1659
  if ( is_object( $startDate ) ) {
1660
  return $startDate->date_i18n();
1665
 
1666
  /**
1667
  * Get Product Sale Price End Date
 
1668
  *
1669
  * @param WC_Product $product
1670
  *
1671
  * @return mixed
1672
+ * @since 3.2.0
1673
+ *
1674
  */
1675
+ protected function sale_price_edate( $product ) {
1676
  $endDate = $product->get_date_on_sale_to();
1677
  if ( is_object( $endDate ) ) {
1678
  return $endDate->date_i18n();
1683
 
1684
  /**
1685
  * Get Product Regular Price
 
1686
  *
1687
  * @param WC_Product|WC_Product_Variable|WC_Product_Grouped $product Product Object.
1688
  *
1689
  * @return mixed
1690
+ * @since 3.2.0
1691
+ *
1692
  */
1693
+ protected function price( $product ) {
 
 
1694
  if ( $product->is_type( 'variable' ) ) {
1695
+ return $this->getVariableProductPrice( $product, 'regular_price' );
1696
  } elseif ( $product->is_type( 'grouped' ) ) {
1697
+ return $this->getGroupProductPrice( $product,
1698
+ 'regular' ); // this calls self::price() so no need to use self::getWPMLPrice()
1699
+ } else {
1700
+ return $product->get_regular_price();
1701
  }
 
 
1702
  }
1703
+
1704
  /**
1705
  * Get Product Price
 
1706
  *
1707
  * @param WC_Product|WC_Product_Variable|WC_Product_Grouped $product
1708
  *
1709
+ * @return int|float|double|mixed
1710
+ * @since 3.2.0
1711
+ *
1712
  */
1713
+ protected function current_price( $product ) {
 
 
1714
  if ( $product->is_type( 'variable' ) ) {
1715
+ return $this->getVariableProductPrice( $product, 'price' );
1716
  } elseif ( $product->is_type( 'grouped' ) ) {
1717
  return $this->getGroupProductPrice( $product, 'current' );
1718
+ } else {
1719
+ return $product->get_price();
1720
  }
 
 
1721
  }
1722
+
1723
  /**
1724
  * Get Product Sale Price
 
1725
  *
1726
  * @param WC_Product|WC_Product_Variable|WC_Product_Grouped $product
1727
  *
1728
  * @return mixed
1729
+ * @since 3.2.0
1730
+ *
1731
  */
1732
+ protected function sale_price( $product ) {
1733
+ if ( $product->is_type( 'variable' ) ) {
1734
+ return $this->getVariableProductPrice( $product, 'sale_price' );
1735
+ } elseif ( $product->is_type( 'grouped' ) ) {
 
 
1736
  return $this->getGroupProductPrice( $product, 'sale' );
1737
+ } else {
1738
+ $price = $product->get_sale_price();
1739
+
1740
+ return $price > 0 ? $price : '';
1741
  }
 
 
1742
  }
1743
 
1744
  /**
1750
  * @since 3.2.0
1751
  *
1752
  */
1753
+ protected function price_with_tax( $product ) {
 
 
1754
  if ( $product->is_type( 'variable' ) ) {
1755
+ return $this->getVariableProductPrice( $product, 'regular_price', true );
1756
  } elseif ( $product->is_type( 'grouped' ) ) {
1757
  return $this->getGroupProductPrice( $product, 'regular', true );
1758
+ } else {
1759
+ $price = $this->price( $product );
1760
+
1761
+ // Get price with tax.
1762
+ return ( $product->is_taxable() && ! empty( $price ) ) ? $this->get_price_with_tax( $product,
1763
+ $price ) : $price;
1764
  }
 
 
 
 
 
 
 
1765
  }
1766
 
1767
  /**
1773
  * @since 3.2.0
1774
  *
1775
  */
1776
+ protected function current_price_with_tax( $product ) {
 
 
1777
  if ( $product->is_type( 'variable' ) ) {
1778
+ return $this->getVariableProductPrice( $product, 'current_price', true );
1779
  } elseif ( $product->is_type( 'grouped' ) ) {
1780
  return $this->getGroupProductPrice( $product, 'current', true );
1781
+ } else {
1782
+ $price = $this->current_price( $product );
1783
+
1784
+ // Get price with tax
1785
+ return ( $product->is_taxable() && ! empty( $price ) ) ? $this->get_price_with_tax( $product,
1786
+ $price ) : $price;
1787
  }
 
 
 
 
 
 
 
1788
  }
1789
 
1790
  /**
1796
  * @since 3.2.0
1797
  *
1798
  */
1799
+ protected function sale_price_with_tax( $product ) {
 
 
 
1800
  if ( $product->is_type( 'variable' ) ) {
1801
+ return $this->getVariableProductPrice( $product, 'sale_price', true );
1802
  } elseif ( $product->is_type( 'grouped' ) ) {
1803
  return $this->getGroupProductPrice( $product, 'sale', true );
1804
+ } else {
1805
+ $price = $this->sale_price( $product );
1806
+ if ( $product->is_taxable() && ! empty( $price ) ) {
1807
+ $price = $this->get_price_with_tax( $product, $price );
1808
+ }
1809
+
1810
+ return $price > 0 ? $price : '';
1811
  }
 
 
 
 
 
 
 
1812
  }
1813
 
1814
  /**
1822
  * @since 3.2.0
1823
  *
1824
  */
1825
+ protected function getGroupProductPrice( $grouped, $type, $tax = false ) {
1826
  $groupProductIds = $grouped->get_children();
1827
  $sum = 0;
1828
  if ( ! empty( $groupProductIds ) ) {
1859
  }
1860
  }
1861
 
1862
+ if ( 'sale' == $type ) {
1863
+ $sum = $sum > 0 ? $sum : '';
1864
+ }
1865
+
1866
  return $sum;
1867
  }
1868
 
1869
  /**
1870
+ * Get total price of variable product
1871
  *
1872
+ * @param WC_Product_Variable $variable
1873
  * @param string $type regular_price, sale_price & current_price
1874
+ * @param bool $tax calculate tax
1875
  *
1876
  * @return int|string
1877
  * @since 3.2.0
1878
  *
1879
  */
1880
+ protected function getVariableProductPrice( $variable, $type, $tax = false ) {
1881
+ $price = 0;
1882
  if ( 'regular_price' == $type ) {
1883
+ $price = $variable->get_variation_regular_price();
1884
  } elseif ( 'sale_price' == $type ) {
1885
+ $price = $variable->get_variation_sale_price();
1886
  } else {
1887
+ $price = $variable->get_variation_price();
1888
  }
1889
+ if ( true === $tax && $variable->is_taxable() ) {
1890
+ $price = $this->get_price_with_tax( $variable, $price );
1891
+ }
1892
+ if ( 'sale_price' != $type ) {
1893
+ $price = $price > 0 ? $price : '';
1894
+ }
1895
+
1896
+ return $price;
1897
  }
1898
 
1899
  /**
1906
  * @since 3.2.0
1907
  *
1908
  */
1909
+ protected function get_price_with_tax( $product, $price ) {
1910
  if ( woo_feed_wc_version_check( 3.0 ) ) {
1911
  return wc_get_price_including_tax( $product, array( 'price' => $price ) );
1912
  } else {
1913
  return $product->get_price_including_tax( 1, $price );
1914
  }
1915
  }
1916
+
1917
  /**
1918
  * Get Product Weight
 
1919
  *
1920
  * @param WC_Product $product
1921
  *
1922
  * @return mixed
1923
+ * @since 3.2.0
1924
+ *
1925
  */
1926
+ protected function weight( $product ) {
 
 
 
 
1927
  return $product->get_weight();
1928
  }
1929
+
1930
  /**
1931
  * Get Product Width
 
1932
  *
1933
  * @param WC_Product $product
1934
  *
1935
  * @return mixed
1936
+ * @since 3.2.0
1937
+ *
1938
  */
1939
+ protected function width( $product ) {
1940
  return $product->get_width();
1941
  }
1942
+
1943
  /**
1944
  * Get Product Height
 
1945
  *
1946
  * @param WC_Product $product
1947
  *
1948
  * @return mixed
1949
+ * @since 3.2.0
1950
+ *
1951
  */
1952
+ protected function height( $product ) {
1953
  return $product->get_height();
1954
  }
1955
+
1956
  /**
1957
  * Get Product Length
 
1958
  *
1959
  * @param WC_Product $product
1960
  *
1961
  * @return mixed
1962
+ * @since 3.2.0
1963
+ *
1964
  */
1965
+ protected function length( $product ) {
1966
  return $product->get_length();
1967
  }
1968
+
1969
  /**
1970
  * Get Product Shipping Class
 
1971
  *
1972
  * @param WC_Product $product
1973
  *
1974
  * @return mixed
1975
+ * @since 3.2.0
1976
+ *
1977
  */
1978
+ protected function shipping_class( $product ) {
1979
  return $product->get_shipping_class();
1980
  }
1981
+
1982
  /**
1983
  * Get Product Author Name
 
1984
  *
1985
  * @param WC_Product $product
1986
  *
1987
  * @return mixed
1988
+ * @since 3.2.0
1989
+ *
1990
  */
1991
+ protected function author_name( $product ) {
1992
+ $post = get_post( $product->get_id() );
1993
+
1994
+ return get_the_author_meta( 'user_login', $post->post_author );
 
1995
  }
1996
+
1997
  /**
1998
  * Get Product Author Email
 
1999
  *
2000
  * @param WC_Product $product
2001
  *
2002
  * @return mixed
2003
+ * @since 3.2.0
2004
+ *
2005
  */
2006
+ protected function author_email( $product ) {
2007
+ $post = get_post( $product->get_id() );
2008
+
2009
+ return get_the_author_meta( 'user_email', $post->post_author );
 
2010
  }
2011
+
2012
  /**
2013
  * Get Product Created Date
 
2014
  *
2015
  * @param WC_Product $product
2016
  *
2017
  * @return mixed
2018
+ * @since 3.2.0
2019
+ *
2020
  */
2021
+ protected function date_created( $product ) {
2022
+ return gmdate( 'Y-m-d', strtotime( $product->get_date_created() ) );
 
 
2023
  }
2024
+
2025
  /**
2026
  * Get Product Last Updated Date
 
2027
  *
2028
  * @param WC_Product $product
2029
  *
2030
  * @return mixed
2031
+ * @since 3.2.0
2032
+ *
2033
  */
2034
+ protected function date_updated( $product ) {
2035
+ return gmdate( 'Y-m-d', strtotime( $product->get_date_modified() ) );
 
 
2036
  }
2037
+
2038
  /**
2039
  * Get Product Sale Price Effected Date for Google Shopping
 
2040
  *
2041
  * @param WC_Product $product
2042
  *
2043
+ * @return string
2044
+ * @since 3.2.0
2045
+ *
2046
  */
2047
+ protected function sale_price_effective_date( $product ) {
2048
+ $effective_date = '';
2049
+ $from = $this->sale_price_sdate( $product );
2050
+ $to = $this->sale_price_edate( $product );
2051
+ if ( ! empty( $from ) && ! empty( $to ) ) {
2052
+ $from = gmdate( 'c', strtotime( $from ) );
2053
+ $to = gmdate( 'c', strtotime( $to ) );
2054
+
2055
+ $effective_date = $from . '/' . $to;
2056
  }
2057
+
2058
+ return $effective_date;
2059
  }
2060
+
2061
  /**
2062
  * Ger Product Attribute
2063
  *
 
 
2064
  * @param WC_Product $product
2065
  * @param $attr
2066
  *
2067
  * @return string
2068
+ * @since 2.2.3
2069
+ *
2070
  */
2071
+ protected function getProductAttribute( $product, $attr ) {
2072
  $id = $product->get_id();
2073
+
2074
+ if ( woo_feed_wc_version_check( 3.2 ) ) {
2075
+ if ( woo_feed_wc_version_check( 3.6 ) ) {
2076
+ $attr = str_replace( 'pa_', '', $attr );
 
2077
  }
2078
+ $value = $product->get_attribute( $attr );
2079
+
2080
  return $value;
2081
  } else {
2082
+ return implode( ',', wc_get_product_terms( $id, $attr, array( 'fields' => 'names' ) ) );
2083
  }
2084
  }
2085
+
2086
  /**
2087
  * Get Meta
2088
  *
 
 
2089
  * @param WC_Product $product
2090
  * @param string $meta post meta key
2091
  *
2092
  * @return mixed|string
2093
+ * @since 2.2.3
2094
+ *
2095
  */
2096
+ protected function getProductMeta( $product, $meta ) {
2097
+ $value = get_post_meta( $product->get_id(), $meta, true );
2098
+ // if empty get meta value of parent post
2099
+ if ( '' == $value && $product->get_parent_id() ) {
2100
+ $value = get_post_meta( $product->get_parent_id(), $meta, true );
 
 
 
2101
  }
2102
 
2103
+ return $value;
 
 
 
 
 
 
 
 
 
2104
  }
2105
+
2106
  /**
2107
  * Get Taxonomy
 
2108
  *
2109
  * @param WC_Product $product
2110
  * @param $taxonomy
2111
  *
2112
  * @return string
2113
+ * @since 2.2.3
2114
+ *
2115
  */
2116
+ protected function getProductTaxonomy( $product, $taxonomy ) {
2117
  $id = $product->get_id();
2118
+ if ( $product->is_type( 'variation' ) ) {
2119
+ $id = $product->get_parent_id();
 
 
 
2120
  }
2121
+
2122
+ $separator = apply_filters( 'woo_feed_product_taxonomy_term_list_separator', ',', $this->config, $product );
2123
+
2124
+ return wp_strip_all_tags( get_the_term_list( $id, $taxonomy, '', $separator, '' ) );
2125
  }
2126
+
2127
  /**
2128
  * Format price value
 
2129
  *
2130
  * @param string $name Attribute Name
2131
  * @param int $conditionName condition
2132
  * @param int $result price
2133
  *
2134
  * @return mixed
2135
+ * @since 3.2.0
2136
+ *
2137
  */
2138
+ protected function price_format( $name, $conditionName, $result ) {
2139
+ $plus = "+";
2140
+ $minus = "-";
2141
  $percent = "%";
2142
+
2143
+ if ( strpos( $name, 'price' ) !== false ) {
2144
+ if ( strpos( $result, $plus ) !== false && strpos( $result, $percent ) !== false ) {
2145
+ $result = str_replace( "+", '', $result );
2146
+ $result = str_replace( "%", '', $result );
2147
+ if ( is_numeric( $result ) ) {
2148
+ $result = $conditionName + ( ( $conditionName * $result ) / 100 );
2149
  }
2150
+ } elseif ( strpos( $result, $minus ) !== false && strpos( $result, $percent ) !== false ) {
2151
+ $result = str_replace( "-", '', $result );
2152
+ $result = str_replace( "%", '', $result );
2153
+ if ( is_numeric( $result ) ) {
2154
+ $result = $conditionName - ( ( $conditionName * $result ) / 100 );
2155
  }
2156
+ } elseif ( strpos( $result, $plus ) !== false ) {
2157
+ $result = str_replace( "+", "", $result );
2158
+ if ( is_numeric( $result ) ) {
2159
+ $result = ( $conditionName + $result );
2160
  }
2161
+ } elseif ( strpos( $result, $minus ) !== false ) {
2162
+ $result = str_replace( "-", "", $result );
2163
+ if ( is_numeric( $result ) ) {
2164
  $result = $conditionName - $result;
2165
  }
2166
  }
2167
  }
2168
+
2169
  return $result;
2170
  }
2171
+
2172
  /**
2173
  * Format output According to Output Type config
 
2174
  *
2175
+ * @param string $output
2176
+ * @param array $outputTypes
2177
+ * @param WC_Product $product
2178
+ * @param string $productAttribute
2179
  *
2180
  * @return float|int|string
2181
+ * @since 3.2.0
2182
+ *
2183
  */
2184
+ protected function format_output( $output, $outputTypes, $product, $productAttribute ) {
2185
  if ( ! empty( $outputTypes ) && is_array( $outputTypes ) ) {
2186
 
2187
+ // Format Output According to output type
2188
  if ( in_array( 2, $outputTypes ) ) { // Strip Tags
2189
  $output = wp_strip_all_tags( html_entity_decode( $output ) );
2190
  }
2191
 
2192
+ if ( in_array( 3, $outputTypes ) ) { // UTF-8 Encode
2193
  $output = utf8_encode( $output );
2194
  }
2195
 
2196
+ if ( in_array( 4, $outputTypes ) ) { // htmlentities
2197
  $output = htmlentities( $output, ENT_QUOTES, 'UTF-8' );
2198
  }
2199
 
2200
+ if ( in_array( 5, $outputTypes ) ) { // Integer
2201
+ $output = intval( $output );
2202
  }
2203
 
2204
+ if ( in_array( 6, $outputTypes ) ) { // Format Price
2205
+ if ( ! empty( $output ) && $output > 0 ) {
2206
+ $output = (float) $output;
2207
+ $output = number_format( $output, 2, '.', '' );
2208
+ }
2209
  }
2210
 
2211
+ if ( in_array( 7, $outputTypes ) ) { // Delete Space
2212
  $output = trim( $output );
2213
  $output = preg_replace( '!\s+!', ' ', $output );
2214
  }
2215
 
2216
+ if ( in_array( 9, $outputTypes ) ) { // Remove Invalid Character
2217
  $output = woo_feed_stripInvalidXml( $output );
2218
  }
2219
 
2220
+ if ( in_array( 10, $outputTypes ) ) { // Remove ShortCodes
2221
  $output = $this->remove_short_codes( $output );
2222
  }
2223
 
2224
+ if ( in_array( 8, $outputTypes ) ) { // Add CDATA
2225
  $output = '<![CDATA[' . $output . ']]>';
2226
  }
2227
  }
2228
 
2229
  return $output;
2230
  }
2231
+
2232
  /**
2233
  * Add Prefix and Suffix with attribute value
 
2234
  *
2235
  * @param $output
2236
  * @param $prefix
2238
  * @param $attribute
2239
  *
2240
  * @return string
2241
+ * @since 3.2.0
2242
+ *
2243
  */
2244
+ protected function process_prefix_suffix( $output, $prefix, $suffix, $attribute = '' ) {
2245
+
2246
+ if ( '' == $output ) {
2247
+ return $output;
2248
  }
2249
+
2250
+ // Add Prefix before Output
2251
  if ( '' != $prefix ) {
2252
  $output = "$prefix" . $output;
2253
  }
2254
+
2255
+ // Add Suffix after Output
2256
+ if ( '' !== $suffix ) {
2257
  if (
2258
+ 'price' == $attribute
2259
+ || 'sale_price' == $attribute
2260
+ || 'current_price' == $attribute
2261
+ || 'price_with_tax' == $attribute
2262
+ || 'current_price_with_tax' == $attribute
2263
+ || 'sale_price_with_tax' == $attribute
2264
+ || 'shipping_price' == $attribute
2265
+ || 'tax_rate' == $attribute
2266
+ ) { // Add space before suffix if attribute contain price.
2267
+ $output = $output . ' ' . $suffix;
2268
+ } elseif ( substr( $output, 0, 4 ) === 'http' ) {
2269
+ // Parse URL Parameters if available into suffix field
 
 
 
2270
  $output = woo_feed_make_url_with_parameter( $output, $suffix );
2271
+
2272
  } else {
2273
  $output = $output . "$suffix";
2274
  }
2275
  }
2276
+
2277
  return "$output";
2278
  }
 
2279
  }
includes/classes/class-woo-feed-savefile.php CHANGED
@@ -9,19 +9,19 @@
9
  * @author Ohidul Islam <wahid@webappick.com>
10
  */
11
  class Woo_Feed_Savefile {
12
-
13
- /**
14
- * Check if the directory for feed file exist or not and make directory
15
- *
16
- * @param $path
17
- * @return bool
18
- */
19
- public function checkDir( $path ) {
20
- if ( ! file_exists($path) ) {
21
- return wp_mkdir_p($path);
22
- }
23
- return true;
24
- }
25
 
26
  /**
27
  * Save CSV Feed file
9
  * @author Ohidul Islam <wahid@webappick.com>
10
  */
11
  class Woo_Feed_Savefile {
12
+
13
+ /**
14
+ * Check if the directory for feed file exist or not and make directory
15
+ *
16
+ * @param $path
17
+ * @return bool
18
+ */
19
+ public function checkDir( $path ) {
20
+ if ( ! file_exists($path) ) {
21
+ return wp_mkdir_p($path);
22
+ }
23
+ return true;
24
+ }
25
 
26
  /**
27
  * Save CSV Feed file
includes/feeds/class-woo-feed-custom.php CHANGED
@@ -47,8 +47,8 @@ class Woo_Feed_Custom {
47
  * @since 1.0.0
48
  */
49
  public function __construct( $feedRule ) {
50
- $this->products = new Woo_Feed_Products_v3($feedRule);
51
- # When update via cron job then set productIds
52
  if ( ! isset($feedRule['productIds']) ) {
53
  $feedRule['productIds'] = $this->products->query_products();
54
  }
@@ -74,14 +74,11 @@ class Woo_Feed_Custom {
74
  *
75
  */
76
  public function mapAttributeForXML() {
77
- $i = 0;
78
- $cdata = true;
79
  if ( $this->products ) {
80
  foreach ( $this->products as $no => $product ) {
81
  foreach ( $product as $key => $value ) {
82
  $this->products[ $no ][ $key ] = $this->formatXMLLine($key, $value);
83
  }
84
- $i++;
85
  }
86
  }
87
  }
@@ -119,16 +116,13 @@ class Woo_Feed_Custom {
119
  public function returnFinalProduct() {
120
  if ( ! empty($this->products) ) {
121
  if ( 'xml' == $this->rules['feedType'] ) {
122
- //return $engine->get_feed($this->products);
123
  $feed = array(
124
  "body" => $this->products->feedBody,
125
  "header" => $this->products->feedHeader,
126
  "footer" => $this->products->feedFooter,
127
  );
128
- //echo "<pre>";print_r($feed);die();
129
  return $feed;
130
  } elseif ( 'txt' == $this->rules['feedType'] ) {
131
- //return $engine->get_txt_feed();
132
  $feed = array(
133
  'body' => $this->products->feedBody,
134
  'header' => $this->products->feedHeader,
@@ -136,7 +130,6 @@ class Woo_Feed_Custom {
136
  );
137
  return $feed;
138
  } elseif ( 'csv' == $this->rules['feedType'] ) {
139
- //return $engine->get_csv_feed();
140
  $feed = array(
141
  'body' => $this->products->feedBody,
142
  'header' => $this->products->feedHeader,
@@ -156,7 +149,7 @@ class Woo_Feed_Custom {
156
  }
157
 
158
  public function get_header( $engine ) {
159
- $datetime_now = gmdate("Y-m-d H:i:s");
160
  if ( 'fruugo.au' == $this->rules["provider"] ) {
161
  $fruugo_au = "<products version=\"1.0\" standalone=\"yes\">
162
  <datetime>$datetime_now</datetime>
47
  * @since 1.0.0
48
  */
49
  public function __construct( $feedRule ) {
50
+ $this->products = new Woo_Feed_Products_v3( $feedRule );
51
+ // When update via cron job then set productIds.
52
  if ( ! isset($feedRule['productIds']) ) {
53
  $feedRule['productIds'] = $this->products->query_products();
54
  }
74
  *
75
  */
76
  public function mapAttributeForXML() {
 
 
77
  if ( $this->products ) {
78
  foreach ( $this->products as $no => $product ) {
79
  foreach ( $product as $key => $value ) {
80
  $this->products[ $no ][ $key ] = $this->formatXMLLine($key, $value);
81
  }
 
82
  }
83
  }
84
  }
116
  public function returnFinalProduct() {
117
  if ( ! empty($this->products) ) {
118
  if ( 'xml' == $this->rules['feedType'] ) {
 
119
  $feed = array(
120
  "body" => $this->products->feedBody,
121
  "header" => $this->products->feedHeader,
122
  "footer" => $this->products->feedFooter,
123
  );
 
124
  return $feed;
125
  } elseif ( 'txt' == $this->rules['feedType'] ) {
 
126
  $feed = array(
127
  'body' => $this->products->feedBody,
128
  'header' => $this->products->feedHeader,
130
  );
131
  return $feed;
132
  } elseif ( 'csv' == $this->rules['feedType'] ) {
 
133
  $feed = array(
134
  'body' => $this->products->feedBody,
135
  'header' => $this->products->feedHeader,
149
  }
150
 
151
  public function get_header( $engine ) {
152
+ $datetime_now = gmdate('Y-m-d H:i:s');
153
  if ( 'fruugo.au' == $this->rules["provider"] ) {
154
  $fruugo_au = "<products version=\"1.0\" standalone=\"yes\">
155
  <datetime>$datetime_now</datetime>
includes/feeds/class-woo-feed-facebook.php CHANGED
@@ -85,7 +85,7 @@ class Woo_Feed_Facebook {
85
  public function __construct( $feedRule ) {
86
  $feedRule['itemWrapper'] = $this->feedWrapper;
87
  $this->products = new Woo_Feed_Products_v3( $feedRule );
88
- # When update via cron job then set productIds
89
  if ( ! isset( $feedRule['productIds'] ) ) {
90
  $feedRule['productIds'] = $this->products->query_products();
91
  }
85
  public function __construct( $feedRule ) {
86
  $feedRule['itemWrapper'] = $this->feedWrapper;
87
  $this->products = new Woo_Feed_Products_v3( $feedRule );
88
+ // When update via cron job then set productIds.
89
  if ( ! isset( $feedRule['productIds'] ) ) {
90
  $feedRule['productIds'] = $this->products->query_products();
91
  }
includes/feeds/class-woo-feed-google.php CHANGED
@@ -85,8 +85,7 @@ class Woo_Feed_Google {
85
  public function __construct( $feedRule ) {
86
  $feedRule['itemWrapper'] = $this->feedWrapper;
87
  $this->products = new Woo_Feed_Products_v3( $feedRule );
88
-
89
- # When update via cron job then set productIds
90
  if ( ! isset( $feedRule['productIds'] ) ) {
91
  //@TODO use limit for free version here for cron calls... {google,facebook,pinterest,custom}
92
  $feedRule['productIds'] = $this->products->query_products();
85
  public function __construct( $feedRule ) {
86
  $feedRule['itemWrapper'] = $this->feedWrapper;
87
  $this->products = new Woo_Feed_Products_v3( $feedRule );
88
+ // When update via cron job then set productIds.
 
89
  if ( ! isset( $feedRule['productIds'] ) ) {
90
  //@TODO use limit for free version here for cron calls... {google,facebook,pinterest,custom}
91
  $feedRule['productIds'] = $this->products->query_products();
includes/feeds/class-woo-feed-pinterest.php CHANGED
@@ -85,7 +85,7 @@ class Woo_Feed_Pinterest {
85
  public function __construct( $feedRule ) {
86
  $feedRule['itemWrapper'] = $this->feedWrapper;
87
  $this->products = new Woo_Feed_Products_v3( $feedRule );
88
- # When update via cron job then set productIds
89
  if ( ! isset( $feedRule['productIds'] ) ) {
90
  $feedRule['productIds'] = $this->products->query_products();
91
  }
85
  public function __construct( $feedRule ) {
86
  $feedRule['itemWrapper'] = $this->feedWrapper;
87
  $this->products = new Woo_Feed_Products_v3( $feedRule );
88
+ // When update via cron job then set productIds.
89
  if ( ! isset( $feedRule['productIds'] ) ) {
90
  $feedRule['productIds'] = $this->products->query_products();
91
  }
includes/helper.php CHANGED
@@ -372,11 +372,12 @@ if ( ! function_exists( 'woo_feed_get_default_brand' ) ) {
372
  if ( false !== $url ) {
373
  $url = wp_parse_url( $url );
374
  if ( array_key_exists( 'host', $url ) ) {
375
- $arr = explode( '.', $url['host'] );
376
  $brand = $arr[ count( $arr ) - 2 ];
377
  $brand = ucfirst( $brand );
378
  }
379
  }
 
380
  return apply_filters( 'woo_feed_get_default_brand_name', $brand );
381
  }
382
  }
@@ -396,14 +397,14 @@ if ( ! function_exists( 'woo_feed_parse_feed_rules' ) ) {
396
  * Parse Feed Config/Rules to make sure that necessary array keys are exists
397
  * this will reduce the uses of isset() checking
398
  *
399
- * @uses wp_parse_args
 
400
  *
 
401
  * @since 3.3.5 $context parameter added.
402
  *
403
- * @param array $rules rules to parse.
404
- * @param string $context parsing context. useful for filtering, view, save, db, create etc.
405
  *
406
- * @return array
407
  */
408
  function woo_feed_parse_feed_rules( $rules = [], $context = 'view' ) {
409
 
@@ -481,11 +482,11 @@ if ( ! function_exists( 'woo_feed_parse_feed_rules' ) ) {
481
  /**
482
  * filter parsed rules for provider
483
  *
484
- * @since 3.3.7
485
- *
486
- * @param array $rules
487
  * @param string $context
488
  *
 
 
489
  */
490
  $rules = apply_filters( "woo_feed_{$rules['provider']}_parsed_rules", $rules, $context );
491
  }
@@ -493,11 +494,11 @@ if ( ! function_exists( 'woo_feed_parse_feed_rules' ) ) {
493
  /**
494
  * filter parsed rules
495
  *
496
- * @since 3.3.7 $provider parameter removed
497
- *
498
- * @param array $rules
499
  * @param string $context
500
  *
 
 
501
  */
502
  return apply_filters( 'woo_feed_parsed_rules', $rules, $context );
503
  }
@@ -604,14 +605,15 @@ if ( ! function_exists( 'woo_feed_merchant_info_metabox' ) ) {
604
  $provider = ( isset( $feedConfig['provider'] ) && ! empty( $feedConfig['provider'] ) ) ? $feedConfig['provider'] : '';
605
  $merchantInfo = new Woo_Feed_Merchant( $provider );
606
  ?>
607
- <span class="spinner"></span>
608
- <div class="merchant-infos">
609
  <?php foreach ( $merchantInfo->get_info() as $k => $v ) { ?>
610
- <div class="merchant-info-section <?php echo esc_attr( $k ); ?>">
611
  <?php if ( 'link' == $k ) { ?>
612
- <span class="dashicons dashicons-media-document" style="color: #82878c;" aria-hidden="true"></span>
613
- <span><?php esc_html_e( 'Feed Specification:', 'woo-feed' ) ?></span>
614
- <strong class="data"><?php
 
615
  /** @noinspection HtmlUnknownTarget */
616
  ( empty( $v ) ) ? esc_html_e( 'N/A',
617
  'woo-feed' ) : printf( '<a href="%s" target="_blank">%s</a>',
@@ -619,9 +621,9 @@ if ( ! function_exists( 'woo_feed_merchant_info_metabox' ) ) {
619
  esc_html__( 'Read Article', 'woo-feed' ) );
620
  ?></strong>
621
  <?php } elseif ( 'video' == $k ) { ?>
622
- <span class="dashicons dashicons-video-alt3" style="color: #82878c;" aria-hidden="true"></span>
623
- <span><?php esc_html_e( 'Video Documentation:', 'woo-feed' ) ?></span>
624
- <strong class="data"><?php
625
  /** @noinspection HtmlUnknownTarget */
626
  ( empty( $v ) ) ? esc_html_e( 'N/A',
627
  'woo-feed' ) : printf( '<a href="%s" target="_blank">%s</a>',
@@ -629,8 +631,9 @@ if ( ! function_exists( 'woo_feed_merchant_info_metabox' ) ) {
629
  esc_html__( 'Watch now', 'woo-feed' ) );
630
  ?></strong>
631
  <?php } elseif ( 'feed_file_type' == $k ) { ?>
632
- <span class="dashicons dashicons-media-text" style="color: #82878c;" aria-hidden="true"></span> <?php esc_html_e( 'Format Supported:', 'woo-feed' ) ?>
633
- <strong class="data"><?php
 
634
  if ( empty( $v ) ) {
635
  esc_html_e( 'N/A', 'woo-feed' );
636
  } else {
@@ -643,9 +646,9 @@ if ( ! function_exists( 'woo_feed_merchant_info_metabox' ) ) {
643
  } ?></strong>
644
  <?php
645
  } elseif ( 'doc' == $k ) { ?>
646
- <span class="dashicons dashicons-editor-help" style="color: #82878c;" aria-hidden="true"></span>
647
- <span><?php esc_html_e( 'Support Docs:', 'woo-feed' ); ?></span>
648
- <ul class="data">
649
  <?php
650
  if ( empty( $v ) ) {
651
  esc_html_e( 'N/A', 'woo-feed' );
@@ -658,12 +661,12 @@ if ( ! function_exists( 'woo_feed_merchant_info_metabox' ) ) {
658
  }
659
  }
660
  ?>
661
- </ul>
662
  <?php
663
  } ?>
664
- </div>
665
  <?php } ?>
666
- </div>
667
  <?php
668
  }
669
  }
@@ -722,8 +725,8 @@ if ( ! function_exists( 'render_feed_config' ) ) {
722
  if ( ! function_exists( 'render_filter_config' ) ) {
723
  /**
724
  * @param string $tabId
725
- * @param array $feedRules
726
- * @param bool $idEdit
727
  */
728
  function render_filter_config( $tabId, $feedRules, $idEdit ) {
729
  global $provider, $wooFeedDropDown, $wooFeedProduct;
@@ -830,21 +833,22 @@ if ( ! function_exists( 'woo_feed_unique_feed_slug' ) ) {
830
  * Generate Unique slug for feed.
831
  * This function only check database for existing feed for generating unique slug.
832
  * Use generate_unique_feed_file_name() for complete unique slug name.
833
- * @param string $slug
834
- * @param string $prefix
835
- * @param int $feedId
 
836
  *
837
  * @return string
838
  * @see wp_unique_post_slug()
839
  *
840
  */
841
- function woo_feed_unique_feed_slug( $slug, $prefix = '', $feedId = null ) {
842
  global $wpdb;
843
  /** @noinspection SpellCheckingInspection */
844
  $disallowed = array( 'siteurl', 'home', 'blogname', 'blogdescription', 'users_can_register', 'admin_email' );
845
- if ( $feedId && $feedId > 0 ) {
846
  $checkSql = "SELECT option_name FROM $wpdb->options WHERE option_name = %s AND option_id != %d LIMIT 1";
847
- $nameCheck = $wpdb->get_var( $wpdb->prepare( $checkSql, $prefix . $slug, $feedId ) ); // phpcs:ignore
848
  } else {
849
  $checkSql = "SELECT option_name FROM $wpdb->options WHERE option_name = %s LIMIT 1";
850
  $nameCheck = $wpdb->get_var( $wpdb->prepare( $checkSql, $prefix . $slug ) ); // phpcs:ignore
@@ -854,8 +858,8 @@ if ( ! function_exists( 'woo_feed_unique_feed_slug' ) ) {
854
  $suffix = 2;
855
  do {
856
  $altName = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
857
- if ( $feedId && $feedId > 0 ) {
858
- $nameCheck = $wpdb->get_var( $wpdb->prepare( $checkSql, $prefix . $altName, $feedId ) ); // phpcs:ignore
859
  } else {
860
  $nameCheck = $wpdb->get_var( $wpdb->prepare( $checkSql, $prefix . $altName ) ); // phpcs:ignore
861
  }
@@ -867,10 +871,29 @@ if ( ! function_exists( 'woo_feed_unique_feed_slug' ) ) {
867
  return $slug;
868
  }
869
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
870
  if ( ! function_exists( 'generate_unique_feed_file_name' ) ) {
871
  /**
872
  * Generate Unique file Name.
873
  * This will insure unique slug and file name for a single feed.
 
874
  * @param string $filename
875
  * @param string $type
876
  * @param string $provider
@@ -887,7 +910,7 @@ if ( ! function_exists( 'generate_unique_feed_file_name' ) ) {
887
  $raw_filename = wp_unique_filename( $feedDir, $raw_filename );
888
  $raw_filename = str_replace( '.' . $type, '', $raw_filename );
889
 
890
- return -1 != $raw_filename ? $raw_filename : false;
891
  }
892
  }
893
 
@@ -933,7 +956,9 @@ if ( ! function_exists( 'woo_feed_save_feed_config_data' ) ) {
933
  // Sanitize Fields
934
  $data = woo_feed_sanitize_form_fields( $data );
935
  if ( empty( $feed_option_name ) ) {
936
- $feed_option_name = generate_unique_feed_file_name( $data['filename'], $data['feedType'], $data['provider'] );
 
 
937
  } else {
938
  $feed_option_name = woo_feed_extract_feed_option_name( $feed_option_name );
939
  }
@@ -949,11 +974,12 @@ if ( ! function_exists( 'woo_feed_save_feed_config_data' ) ) {
949
  /**
950
  * Filters feed data just before it is inserted into the database.
951
  *
 
 
 
 
952
  * @since 3.3.3
953
  *
954
- * @param array $data An array of sanitized config
955
- * @param array $old_data An array of old feed data
956
- * @param string $feed_option_name Option name
957
  */
958
  $data = apply_filters( 'woo_feed_insert_feed_data', $data, $old_data, 'wf_config' . $feed_option_name );
959
 
@@ -961,16 +987,16 @@ if ( ! function_exists( 'woo_feed_save_feed_config_data' ) ) {
961
  /**
962
  * Before Updating Config to db
963
  *
964
- * @param array $data An array of sanitized config
965
- * @param string $feed_option_name Option name
966
  */
967
  do_action( 'woo_feed_before_update_config', $data, 'wf_config' . $feed_option_name );
968
  } else {
969
  /**
970
  * Before inserting Config to db
971
  *
972
- * @param array $data An array of sanitized config
973
- * @param string $feed_option_name Option name
974
  */
975
  do_action( 'woo_feed_before_insert_config', $data, 'wf_config' . $feed_option_name );
976
  }
@@ -986,25 +1012,26 @@ if ( ! function_exists( 'woo_feed_save_feed_config_data' ) ) {
986
  'feedrules' => $data,
987
  'url' => woo_feed_get_file_url( $feed_option_name, $data['provider'], $data['feedType'] ),
988
  'last_updated' => gmdate( 'Y-m-d H:i:s' ),
989
- 'status' => isset( $oldFeed['status'] ) && 1 == $old_feed['status'] ? 1 : 0, // set old status or disable auto update.
 
990
  );
991
- $saved2 = update_option( 'wf_feed_' . $feed_option_name, maybe_serialize( $feed_data ), false );
992
  }
993
 
994
  if ( $update ) {
995
  /**
996
  * After Updating Config to db
997
  *
998
- * @param array $data An array of sanitized config
999
- * @param string $feed_option_name Option name
1000
  */
1001
  do_action( 'woo_feed_after_update_config', $data, 'wf_config' . $feed_option_name );
1002
  } else {
1003
  /**
1004
  * After inserting Config to db
1005
  *
1006
- * @param array $data An array of sanitized config
1007
- * @param string $feed_option_name Option name
1008
  */
1009
  do_action( 'woo_feed_after_insert_config', $data, 'wf_config' . $feed_option_name );
1010
  }
@@ -1228,7 +1255,8 @@ if ( ! function_exists( 'woo_feed_delete_feed' ) ) {
1228
  if ( ! is_numeric( $feed_id ) ) {
1229
  $feed_name = woo_feed_extract_feed_option_name( $feed_id );
1230
  } else {
1231
- $feed_data = $wpdb->get_row( $wpdb->prepare( "SELECT option_name FROM $wpdb->options WHERE option_id = %d", $feed_id ) ); // phpcs:ignore
 
1232
  $option_name = $feed_data->option_name;
1233
  $feed_name = woo_feed_extract_feed_option_name( $feed_data->option_name );
1234
  }
@@ -1348,7 +1376,7 @@ if ( ! function_exists( 'woo_feed_generate_feed' ) ) {
1348
  /**
1349
  * Update Feed Information
1350
  *
1351
- * @param array $info feed config array
1352
  * @param string $feed_option_name feed option/file name
1353
  *
1354
  * @return string|bool
@@ -1358,7 +1386,7 @@ if ( ! function_exists( 'woo_feed_generate_feed' ) ) {
1358
  return false;
1359
  }
1360
  // parse rules.
1361
- $info = woo_feed_parse_feed_rules( isset( $info['feedrules'] ) ? $info['feedrules'] : $info );
1362
  $feed_option_name = woo_feed_extract_feed_option_name( $feed_option_name );
1363
  if ( ! empty( $info['provider'] ) ) {
1364
  do_action( 'before_woo_feed_generate_feed', $info );
@@ -1718,9 +1746,10 @@ if ( ! function_exists( 'woo_feed_apply_hooks_before_product_loop' ) ) {
1718
  /**
1719
  * Apply Hooks Before Looping through ProductIds
1720
  *
1721
- * @param array $feedConfig
 
1722
  */
1723
- function woo_feed_apply_hooks_before_product_loop( $feedConfig ) {
1724
  add_filter( 'woocommerce_get_tax_location', 'woo_feed_apply_tax_location_data', 10, 3 );
1725
  }
1726
  }
@@ -1728,31 +1757,37 @@ if ( ! function_exists( 'woo_feed_remove_hooks_before_product_loop' ) ) {
1728
  /**
1729
  * Remove Applied Hooks Looping through ProductIds
1730
  *
1731
- * @param array $feedConfig the feed array.
 
1732
  *
1733
  * @see woo_feed_apply_hooks_before_product_loop
1734
  */
1735
- function woo_feed_remove_hooks_before_product_loop( $feedConfig ) {
1736
  remove_filter( 'woocommerce_get_tax_location', 'woo_feed_apply_tax_location_data', 10 );
1737
  }
1738
  }
1739
  if ( ! function_exists( 'woo_feed_product_type_separator' ) ) {
1740
  /**
1741
  * Filter Product local category (type) separator
 
1742
  * @param string $separator
1743
- * @param array $config
1744
  *
1745
  * @return string
1746
  */
1747
  function woo_feed_product_type_separator( $separator, $config ) {
1748
- if ( 'trovaprezzi' === $config['provider'] ) $separator = ',';
 
 
 
1749
  return $separator;
1750
  }
1751
  }
1752
  if ( ! function_exists( 'woo_feed_get_trovaprezzi_availability_attribute_filter' ) ) {
1753
  /**
1754
  * Filter Product Availability Attribute Output For Trovaprezzi.it Template
1755
- * @param string $output
 
1756
  * @param WC_Product $product
1757
  *
1758
  * @return int
@@ -1769,6 +1804,7 @@ if ( ! function_exists( 'woo_feed_get_trovaprezzi_availability_attribute_filter'
1769
  $output = 1;
1770
  }
1771
  }
 
1772
  return $output;
1773
  }
1774
  }
@@ -1777,11 +1813,12 @@ if ( ! function_exists( 'woo_feed_get_trovaprezzi_availability_attribute_filter'
1777
  if ( ! function_exists( 'woo_feed_filter_parsed_trovaprezzi_rules' ) ) {
1778
  /**
1779
  * Filter Feed parsed rules for trovaprezzi.it
1780
- * @since 3.3.7
1781
- * @param array $rules
1782
  * @param string $context
1783
  *
1784
  * @return array
 
1785
  */
1786
  function woo_feed_filter_parsed_trovaprezzi_rules( $rules, $context ) {
1787
  if ( 'create' === $context ) {
@@ -1790,26 +1827,29 @@ if ( ! function_exists( 'woo_feed_filter_parsed_trovaprezzi_rules' ) ) {
1790
  $rules['decimals'] = 2;
1791
  $rules['itemsWrapper'] = 'Products';
1792
  $rules['itemWrapper'] = 'Offer';
1793
- $rules['delimiter'] = '|';
1794
- $rules['enclosure'] = ' ';
1795
  }
 
1796
  return $rules;
1797
  }
1798
  }
1799
  if ( ! function_exists( 'woo_feed_filter_parsed_criteo_rules' ) ) {
1800
  /**
1801
  * Filter Feed parsed rules for criteo
1802
- * @since 3.3.7
1803
- * @param array $rules
1804
  * @param string $context
1805
  *
1806
  * @return array
 
1807
  */
1808
  function woo_feed_filter_parsed_criteo_rules( $rules, $context ) {
1809
  if ( 'create' === $context ) {
1810
  $rules['itemsWrapper'] = 'channel';
1811
  $rules['itemWrapper'] = 'item';
1812
  }
 
1813
  return $rules;
1814
  }
1815
  }
372
  if ( false !== $url ) {
373
  $url = wp_parse_url( $url );
374
  if ( array_key_exists( 'host', $url ) ) {
375
+ $arr = explode( '.', $url['host'] );
376
  $brand = $arr[ count( $arr ) - 2 ];
377
  $brand = ucfirst( $brand );
378
  }
379
  }
380
+
381
  return apply_filters( 'woo_feed_get_default_brand_name', $brand );
382
  }
383
  }
397
  * Parse Feed Config/Rules to make sure that necessary array keys are exists
398
  * this will reduce the uses of isset() checking
399
  *
400
+ * @param array $rules rules to parse.
401
+ * @param string $context parsing context. useful for filtering, view, save, db, create etc.
402
  *
403
+ * @return array
404
  * @since 3.3.5 $context parameter added.
405
  *
406
+ * @uses wp_parse_args
 
407
  *
 
408
  */
409
  function woo_feed_parse_feed_rules( $rules = [], $context = 'view' ) {
410
 
482
  /**
483
  * filter parsed rules for provider
484
  *
485
+ * @param array $rules
 
 
486
  * @param string $context
487
  *
488
+ * @since 3.3.7
489
+ *
490
  */
491
  $rules = apply_filters( "woo_feed_{$rules['provider']}_parsed_rules", $rules, $context );
492
  }
494
  /**
495
  * filter parsed rules
496
  *
497
+ * @param array $rules
 
 
498
  * @param string $context
499
  *
500
+ * @since 3.3.7 $provider parameter removed
501
+ *
502
  */
503
  return apply_filters( 'woo_feed_parsed_rules', $rules, $context );
504
  }
605
  $provider = ( isset( $feedConfig['provider'] ) && ! empty( $feedConfig['provider'] ) ) ? $feedConfig['provider'] : '';
606
  $merchantInfo = new Woo_Feed_Merchant( $provider );
607
  ?>
608
+ <span class="spinner"></span>
609
+ <div class="merchant-infos">
610
  <?php foreach ( $merchantInfo->get_info() as $k => $v ) { ?>
611
+ <div class="merchant-info-section <?php echo esc_attr( $k ); ?>">
612
  <?php if ( 'link' == $k ) { ?>
613
+ <span class="dashicons dashicons-media-document" style="color: #82878c;"
614
+ aria-hidden="true"></span>
615
+ <span><?php esc_html_e( 'Feed Specification:', 'woo-feed' ) ?></span>
616
+ <strong class="data"><?php
617
  /** @noinspection HtmlUnknownTarget */
618
  ( empty( $v ) ) ? esc_html_e( 'N/A',
619
  'woo-feed' ) : printf( '<a href="%s" target="_blank">%s</a>',
621
  esc_html__( 'Read Article', 'woo-feed' ) );
622
  ?></strong>
623
  <?php } elseif ( 'video' == $k ) { ?>
624
+ <span class="dashicons dashicons-video-alt3" style="color: #82878c;" aria-hidden="true"></span>
625
+ <span><?php esc_html_e( 'Video Documentation:', 'woo-feed' ) ?></span>
626
+ <strong class="data"><?php
627
  /** @noinspection HtmlUnknownTarget */
628
  ( empty( $v ) ) ? esc_html_e( 'N/A',
629
  'woo-feed' ) : printf( '<a href="%s" target="_blank">%s</a>',
631
  esc_html__( 'Watch now', 'woo-feed' ) );
632
  ?></strong>
633
  <?php } elseif ( 'feed_file_type' == $k ) { ?>
634
+ <span class="dashicons dashicons-media-text" style="color: #82878c;"
635
+ aria-hidden="true"></span> <?php esc_html_e( 'Format Supported:', 'woo-feed' ) ?>
636
+ <strong class="data"><?php
637
  if ( empty( $v ) ) {
638
  esc_html_e( 'N/A', 'woo-feed' );
639
  } else {
646
  } ?></strong>
647
  <?php
648
  } elseif ( 'doc' == $k ) { ?>
649
+ <span class="dashicons dashicons-editor-help" style="color: #82878c;" aria-hidden="true"></span>
650
+ <span><?php esc_html_e( 'Support Docs:', 'woo-feed' ); ?></span>
651
+ <ul class="data">
652
  <?php
653
  if ( empty( $v ) ) {
654
  esc_html_e( 'N/A', 'woo-feed' );
661
  }
662
  }
663
  ?>
664
+ </ul>
665
  <?php
666
  } ?>
667
+ </div>
668
  <?php } ?>
669
+ </div>
670
  <?php
671
  }
672
  }
725
  if ( ! function_exists( 'render_filter_config' ) ) {
726
  /**
727
  * @param string $tabId
728
+ * @param array $feedRules
729
+ * @param bool $idEdit
730
  */
731
  function render_filter_config( $tabId, $feedRules, $idEdit ) {
732
  global $provider, $wooFeedDropDown, $wooFeedProduct;
833
  * Generate Unique slug for feed.
834
  * This function only check database for existing feed for generating unique slug.
835
  * Use generate_unique_feed_file_name() for complete unique slug name.
836
+ *
837
+ * @param string $slug slug for checking uniqueness.
838
+ * @param string $prefix prefix to check with. Optional.
839
+ * @param int $option_id option id. Optional option id to exclude specific option.
840
  *
841
  * @return string
842
  * @see wp_unique_post_slug()
843
  *
844
  */
845
+ function woo_feed_unique_feed_slug( $slug, $prefix = '', $option_id = null ) {
846
  global $wpdb;
847
  /** @noinspection SpellCheckingInspection */
848
  $disallowed = array( 'siteurl', 'home', 'blogname', 'blogdescription', 'users_can_register', 'admin_email' );
849
+ if ( $option_id && $option_id > 0 ) {
850
  $checkSql = "SELECT option_name FROM $wpdb->options WHERE option_name = %s AND option_id != %d LIMIT 1";
851
+ $nameCheck = $wpdb->get_var( $wpdb->prepare( $checkSql, $prefix . $slug, $option_id ) ); // phpcs:ignore
852
  } else {
853
  $checkSql = "SELECT option_name FROM $wpdb->options WHERE option_name = %s LIMIT 1";
854
  $nameCheck = $wpdb->get_var( $wpdb->prepare( $checkSql, $prefix . $slug ) ); // phpcs:ignore
858
  $suffix = 2;
859
  do {
860
  $altName = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix";
861
+ if ( $option_id && $option_id > 0 ) {
862
+ $nameCheck = $wpdb->get_var( $wpdb->prepare( $checkSql, $prefix . $altName, $option_id ) ); // phpcs:ignore
863
  } else {
864
  $nameCheck = $wpdb->get_var( $wpdb->prepare( $checkSql, $prefix . $altName ) ); // phpcs:ignore
865
  }
871
  return $slug;
872
  }
873
  }
874
+ if ( ! function_exists( 'woo_feed_unique_option_name' ) ) {
875
+ /**
876
+ * Alias of woo_feed_unique_feed_slug
877
+ *
878
+ * @param string $slug
879
+ * @param string $prefix
880
+ * @param null $option_id
881
+ *
882
+ * @return string
883
+ * @see woo_feed_unique_feed_slug
884
+ *
885
+ * @since 3.3.8
886
+ *
887
+ */
888
+ function woo_feed_unique_option_name( $slug, $prefix = '', $option_id = null ) {
889
+ return woo_feed_unique_feed_slug( $slug, $prefix, $option_id );
890
+ }
891
+ }
892
  if ( ! function_exists( 'generate_unique_feed_file_name' ) ) {
893
  /**
894
  * Generate Unique file Name.
895
  * This will insure unique slug and file name for a single feed.
896
+ *
897
  * @param string $filename
898
  * @param string $type
899
  * @param string $provider
910
  $raw_filename = wp_unique_filename( $feedDir, $raw_filename );
911
  $raw_filename = str_replace( '.' . $type, '', $raw_filename );
912
 
913
+ return - 1 != $raw_filename ? $raw_filename : false;
914
  }
915
  }
916
 
956
  // Sanitize Fields
957
  $data = woo_feed_sanitize_form_fields( $data );
958
  if ( empty( $feed_option_name ) ) {
959
+ $feed_option_name = generate_unique_feed_file_name( $data['filename'],
960
+ $data['feedType'],
961
+ $data['provider'] );
962
  } else {
963
  $feed_option_name = woo_feed_extract_feed_option_name( $feed_option_name );
964
  }
974
  /**
975
  * Filters feed data just before it is inserted into the database.
976
  *
977
+ * @param array $data An array of sanitized config
978
+ * @param array $old_data An array of old feed data
979
+ * @param string $feed_option_name Option name
980
+ *
981
  * @since 3.3.3
982
  *
 
 
 
983
  */
984
  $data = apply_filters( 'woo_feed_insert_feed_data', $data, $old_data, 'wf_config' . $feed_option_name );
985
 
987
  /**
988
  * Before Updating Config to db
989
  *
990
+ * @param array $data An array of sanitized config
991
+ * @param string $feed_option_name Option name
992
  */
993
  do_action( 'woo_feed_before_update_config', $data, 'wf_config' . $feed_option_name );
994
  } else {
995
  /**
996
  * Before inserting Config to db
997
  *
998
+ * @param array $data An array of sanitized config
999
+ * @param string $feed_option_name Option name
1000
  */
1001
  do_action( 'woo_feed_before_insert_config', $data, 'wf_config' . $feed_option_name );
1002
  }
1012
  'feedrules' => $data,
1013
  'url' => woo_feed_get_file_url( $feed_option_name, $data['provider'], $data['feedType'] ),
1014
  'last_updated' => gmdate( 'Y-m-d H:i:s' ),
1015
+ 'status' => isset( $oldFeed['status'] ) && 1 == $old_feed['status'] ? 1 : 0,
1016
+ // set old status or disable auto update.
1017
  );
1018
+ $saved2 = update_option( 'wf_feed_' . $feed_option_name, maybe_serialize( $feed_data ), false );
1019
  }
1020
 
1021
  if ( $update ) {
1022
  /**
1023
  * After Updating Config to db
1024
  *
1025
+ * @param array $data An array of sanitized config
1026
+ * @param string $feed_option_name Option name
1027
  */
1028
  do_action( 'woo_feed_after_update_config', $data, 'wf_config' . $feed_option_name );
1029
  } else {
1030
  /**
1031
  * After inserting Config to db
1032
  *
1033
+ * @param array $data An array of sanitized config
1034
+ * @param string $feed_option_name Option name
1035
  */
1036
  do_action( 'woo_feed_after_insert_config', $data, 'wf_config' . $feed_option_name );
1037
  }
1255
  if ( ! is_numeric( $feed_id ) ) {
1256
  $feed_name = woo_feed_extract_feed_option_name( $feed_id );
1257
  } else {
1258
+ $feed_data = $wpdb->get_row( $wpdb->prepare( "SELECT option_name FROM $wpdb->options WHERE option_id = %d",
1259
+ $feed_id ) ); // phpcs:ignore
1260
  $option_name = $feed_data->option_name;
1261
  $feed_name = woo_feed_extract_feed_option_name( $feed_data->option_name );
1262
  }
1376
  /**
1377
  * Update Feed Information
1378
  *
1379
+ * @param array $info feed config array
1380
  * @param string $feed_option_name feed option/file name
1381
  *
1382
  * @return string|bool
1386
  return false;
1387
  }
1388
  // parse rules.
1389
+ $info = woo_feed_parse_feed_rules( isset( $info['feedrules'] ) ? $info['feedrules'] : $info );
1390
  $feed_option_name = woo_feed_extract_feed_option_name( $feed_option_name );
1391
  if ( ! empty( $info['provider'] ) ) {
1392
  do_action( 'before_woo_feed_generate_feed', $info );
1746
  /**
1747
  * Apply Hooks Before Looping through ProductIds
1748
  *
1749
+ * @param int[] $productIds product id array.
1750
+ * @param array $feedConfig feed config array.
1751
  */
1752
+ function woo_feed_apply_hooks_before_product_loop( $productIds, $feedConfig ) {
1753
  add_filter( 'woocommerce_get_tax_location', 'woo_feed_apply_tax_location_data', 10, 3 );
1754
  }
1755
  }
1757
  /**
1758
  * Remove Applied Hooks Looping through ProductIds
1759
  *
1760
+ * @param int[] $productIds product id array.
1761
+ * @param array $feedConfig feed config array.
1762
  *
1763
  * @see woo_feed_apply_hooks_before_product_loop
1764
  */
1765
+ function woo_feed_remove_hooks_before_product_loop( $productIds, $feedConfig ) {
1766
  remove_filter( 'woocommerce_get_tax_location', 'woo_feed_apply_tax_location_data', 10 );
1767
  }
1768
  }
1769
  if ( ! function_exists( 'woo_feed_product_type_separator' ) ) {
1770
  /**
1771
  * Filter Product local category (type) separator
1772
+ *
1773
  * @param string $separator
1774
+ * @param array $config
1775
  *
1776
  * @return string
1777
  */
1778
  function woo_feed_product_type_separator( $separator, $config ) {
1779
+ if ( 'trovaprezzi' === $config['provider'] ) {
1780
+ $separator = ',';
1781
+ }
1782
+
1783
  return $separator;
1784
  }
1785
  }
1786
  if ( ! function_exists( 'woo_feed_get_trovaprezzi_availability_attribute_filter' ) ) {
1787
  /**
1788
  * Filter Product Availability Attribute Output For Trovaprezzi.it Template
1789
+ *
1790
+ * @param string $output
1791
  * @param WC_Product $product
1792
  *
1793
  * @return int
1804
  $output = 1;
1805
  }
1806
  }
1807
+
1808
  return $output;
1809
  }
1810
  }
1813
  if ( ! function_exists( 'woo_feed_filter_parsed_trovaprezzi_rules' ) ) {
1814
  /**
1815
  * Filter Feed parsed rules for trovaprezzi.it
1816
+ *
1817
+ * @param array $rules
1818
  * @param string $context
1819
  *
1820
  * @return array
1821
+ * @since 3.3.7
1822
  */
1823
  function woo_feed_filter_parsed_trovaprezzi_rules( $rules, $context ) {
1824
  if ( 'create' === $context ) {
1827
  $rules['decimals'] = 2;
1828
  $rules['itemsWrapper'] = 'Products';
1829
  $rules['itemWrapper'] = 'Offer';
1830
+ $rules['delimiter'] = '|';
1831
+ $rules['enclosure'] = ' ';
1832
  }
1833
+
1834
  return $rules;
1835
  }
1836
  }
1837
  if ( ! function_exists( 'woo_feed_filter_parsed_criteo_rules' ) ) {
1838
  /**
1839
  * Filter Feed parsed rules for criteo
1840
+ *
1841
+ * @param array $rules
1842
  * @param string $context
1843
  *
1844
  * @return array
1845
+ * @since 3.3.7
1846
  */
1847
  function woo_feed_filter_parsed_criteo_rules( $rules, $context ) {
1848
  if ( 'create' === $context ) {
1849
  $rules['itemsWrapper'] = 'channel';
1850
  $rules['itemWrapper'] = 'item';
1851
  }
1852
+
1853
  return $rules;
1854
  }
1855
  }
includes/hooks.php CHANGED
@@ -19,13 +19,13 @@ add_filter( 'woo_feed_trovaprezzi_parsed_rules', 'woo_feed_filter_parsed_trovapr
19
  add_filter( 'woo_feed_criteo_parsed_rules', 'woo_feed_filter_parsed_criteo_rules', 10, 2 );
20
 
21
  // Product Loop Start.
22
- add_action( 'woo_feed_before_product_loop', 'woo_feed_apply_hooks_before_product_loop', 10, 1 );
23
 
24
  // In The Loop
25
  add_filter( 'woo_feed_product_type_separator', 'woo_feed_product_type_separator', 10, 2 );
26
  add_filter( 'woo_feed_get_trovaprezzi_availability_attribute', 'woo_feed_get_trovaprezzi_availability_attribute_filter', 10, 2 );
27
 
28
  // Product Loop End.
29
- add_action( 'woo_feed_after_product_loop', 'woo_feed_remove_hooks_before_product_loop', 10, 1 );
30
 
31
  // End of file hooks.php.
19
  add_filter( 'woo_feed_criteo_parsed_rules', 'woo_feed_filter_parsed_criteo_rules', 10, 2 );
20
 
21
  // Product Loop Start.
22
+ add_action( 'woo_feed_before_product_loop', 'woo_feed_apply_hooks_before_product_loop', 10, 2 );
23
 
24
  // In The Loop
25
  add_filter( 'woo_feed_product_type_separator', 'woo_feed_product_type_separator', 10, 2 );
26
  add_filter( 'woo_feed_get_trovaprezzi_availability_attribute', 'woo_feed_get_trovaprezzi_availability_attribute_filter', 10, 2 );
27
 
28
  // Product Loop End.
29
+ add_action( 'woo_feed_after_product_loop', 'woo_feed_remove_hooks_before_product_loop', 10, 2 );
30
 
31
  // End of file hooks.php.
libs/WebAppick/AppServices/License.php CHANGED
@@ -229,7 +229,48 @@ class License {
229
 
230
  /**
231
  * Get Plugin data
232
- * @return array
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
  */
234
  public function get_information() {
235
  return $this->send_request( 'information', $this->license );
229
 
230
  /**
231
  * Get Plugin data
232
+ * @return array {
233
+ * Plugin Information
234
+ * @type bool $success API response status
235
+ * @type string $api_call_execution_time API Man (Rest Response) Execution Time
236
+ * @type array $data {
237
+ * Plugin Data ( API Man.)
238
+ * @type array $package {
239
+ * @type int $product_id API Man Product ID
240
+ * }
241
+ * @type array $info {
242
+ * @type string $id Plugin Id
243
+ * @type string $name Plugin Name
244
+ * @type string $author Author Name
245
+ * @type string $author_profile Author Profile URL
246
+ * @type string $slug Plugin Slug
247
+ * @type string $plugin Plugin main file path
248
+ * @type string $new_version New Version String
249
+ * @type string $url Plugin URL
250
+ * @type string $package Plugin update download URL
251
+ * @type string $icons Plugin Icons
252
+ * @type string $banners Plugin Banners
253
+ * @type string $banner_rtl RTL Version of Plugin Banners
254
+ * @type string $upgrade_notice Upgrade Notice
255
+ * @type string $requires Minimum WordPress Version
256
+ * @type string $requires_php Minimum PHP Version
257
+ * @type string $tested Tested upto WordPress Version
258
+ * @type array $compatibility Compatibility information (API Man sends string)
259
+ * @type array $contributors Plugin Contributors List (if available)
260
+ * @type array $ratings Plugin Rating (if available)
261
+ * @type float $num_ratings Plugin Rating (if available)
262
+ * @type string $last_updated Last updated Date
263
+ * @type string $homepage Plugin Home Page URL
264
+ * @type array $sections {
265
+ * Plugin Description Sections
266
+ * @type string $description Plugin Description
267
+ * @type string $changelog Change LOG
268
+ * }
269
+ * @type mixed $author_block_count
270
+ * @type mixed $author_block_rating
271
+ * }
272
+ * }
273
+ * }
274
  */
275
  public function get_information() {
276
  return $this->send_request( 'information', $this->license );
libs/WebAppick/AppServices/Updater.php CHANGED
@@ -115,7 +115,8 @@ class Updater {
115
  return $transient_data;
116
  }
117
  $project_info = $this->get_cached_version_info();
118
- if ( false === $project_info ) {
 
119
  $project_info = $this->get_information();
120
  $this->set_cached_version_info( $project_info );
121
  }
@@ -167,36 +168,6 @@ class Updater {
167
  */
168
  private function get_information() {
169
  $response = $this->license->check_update();
170
- // phpcs:disable
171
- /*
172
- // Possible fields for plugin information.
173
- $fields = [
174
- 'id' => '',
175
- 'name' => '',
176
- 'author' => '',
177
- 'author_profile' => '',
178
- 'slug' => '',
179
- 'plugin' => '',
180
- 'new_version' => '',
181
- 'url' => '',
182
- 'package' => '',
183
- 'icons' => '',
184
- 'banners' => '',
185
- 'banner_rtl' => '',
186
- 'upgrade_notice' => '',
187
- 'requires' => '',
188
- 'requires_php' => '',
189
- 'tested' => '',
190
- 'compatibility' => '',
191
- 'contributors' => '',
192
- 'ratings' => '',
193
- 'num_ratings' => '',
194
- 'last_updated' => '',
195
- 'homepage' => '',
196
- 'author_block_count' => '',
197
- 'author_block_rating' => '',
198
- ];*/
199
- // phpcs:enable
200
  if ( isset( $response['success'] ) && $response['success'] ) {
201
  $data = $response['data']['package'];
202
  $response = $this->license->get_information();
@@ -270,25 +241,25 @@ class Updater {
270
  /**
271
  * Typecast child element to array or object
272
  * Utility method
273
- * @param array|object $object the array or object to convert/typecast.
274
  * @param array $children children array.
275
- * @param string $castTo optional array or object.
276
  *
277
- * @return mixed|array|object
278
  */
279
- private function __children_to_array( $object, $children = [], $castTo = 'array' ) {
280
- if ( ! empty( $children ) && is_array( $children ) && ( is_object( $object ) || is_array( $object ) ) ) {
281
- $isObject = is_object( $object );
282
- $castTo = strtolower( $castTo ) == 'array' ? 'A' : 'O';
283
  foreach ( $children as $child ) {
284
- if ( $isObject && property_exists( $object, $child ) ) {
285
- $object->{$child} = 'A' === $castTo ? (array) $object->{$child} : (object) $object->{$child};
286
- } elseif ( array_key_exists( $child, $object ) ) {
287
- $object[ $child ] = 'A' === $castTo ? (array) $object[ $child ] : (object) $object[ $child ];
 
 
288
  }
289
  }
290
  }
291
- return $object;
292
  }
293
  }
294
  // End of file Updater.php.
115
  return $transient_data;
116
  }
117
  $project_info = $this->get_cached_version_info();
118
+
119
+ if ( false === $project_info || ! is_object( $project_info ) ) {
120
  $project_info = $this->get_information();
121
  $this->set_cached_version_info( $project_info );
122
  }
168
  */
169
  private function get_information() {
170
  $response = $this->license->check_update();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  if ( isset( $response['success'] ) && $response['success'] ) {
172
  $data = $response['data']['package'];
173
  $response = $this->license->get_information();
241
  /**
242
  * Typecast child element to array or object
243
  * Utility method
244
+ * @param array|object $input the array or object to convert/typecast.
245
  * @param array $children children array.
 
246
  *
247
+ * @return array|object
248
  */
249
+ private function __children_to_array( $input, $children = [] ) {
250
+ if ( ! empty( $children ) && is_array( $children ) && ( is_object( $input ) || is_array( $input ) ) ) {
251
+ $isObject = is_object( $input );
 
252
  foreach ( $children as $child ) {
253
+ if ( call_user_func_array( $isObject ? 'property_exists' : 'array_key_exists', [ $input, $child ] ) ) {
254
+ if ( $isObject ) {
255
+ $input->{$child} = (array) $input->{$child};
256
+ } else {
257
+ $input[ $child ] = (array) $input->{$child};
258
+ }
259
  }
260
  }
261
  }
262
+ return $input;
263
  }
264
  }
265
  // End of file Updater.php.
uninstall.php CHANGED
@@ -1,16 +1,16 @@
1
- <?php
2
- /**
3
- * Fired when the plugin is uninstalled.
4
- * @since 1.0.0
5
- *
6
- * @package WooFeed
7
- */
8
-
9
- // If uninstall not called from WordPress, then exit.
10
- if ( ! defined('WP_UNINSTALL_PLUGIN') ) {
11
- exit;
12
- }
13
-
14
- wp_clear_scheduled_hook( 'woo_feed_cleanup_logs' );
15
- wp_clear_scheduled_hook( 'woo_feed_update' );
16
  // End of file uninstall.php
1
+ <?php
2
+ /**
3
+ * Fired when the plugin is uninstalled.
4
+ * @since 1.0.0
5
+ *
6
+ * @package WooFeed
7
+ */
8
+
9
+ // If uninstall not called from WordPress, then exit.
10
+ if ( ! defined('WP_UNINSTALL_PLUGIN') ) {
11
+ exit;
12
+ }
13
+
14
+ wp_clear_scheduled_hook( 'woo_feed_cleanup_logs' );
15
+ wp_clear_scheduled_hook( 'woo_feed_update' );
16
  // End of file uninstall.php
woo-feed.php CHANGED
@@ -12,7 +12,7 @@
12
  * Description: This plugin generate WooCommerce product feed for Shopping Engines
13
  * like Google Shopping, Facebook Product Feed, eBay, Amazon, Idealo and many more.
14
  *
15
- * Version: 3.3.4
16
  * Author: WebAppick
17
  * Author URI: https://webappick.com/
18
  * License: GPL v2
@@ -27,7 +27,7 @@
27
  *
28
  * WC Requirement & Test
29
  * WC requires at least: 3.2
30
- * WC tested up to: 3.9.2
31
  */
32
 
33
  if ( ! defined( 'ABSPATH' ) ) {
@@ -40,7 +40,7 @@ if ( ! defined( 'WOO_FEED_FREE_VERSION' ) ) {
40
  * @var string
41
  * @since 3.1.6
42
  */
43
- define( 'WOO_FEED_FREE_VERSION', '3.3.4' );
44
  }
45
 
46
  if ( ! defined( 'WOO_FEED_FREE_FILE' ) ) {
12
  * Description: This plugin generate WooCommerce product feed for Shopping Engines
13
  * like Google Shopping, Facebook Product Feed, eBay, Amazon, Idealo and many more.
14
  *
15
+ * Version: 3.3.8
16
  * Author: WebAppick
17
  * Author URI: https://webappick.com/
18
  * License: GPL v2
27
  *
28
  * WC Requirement & Test
29
  * WC requires at least: 3.2
30
+ * WC tested up to: 4.0.0
31
  */
32
 
33
  if ( ! defined( 'ABSPATH' ) ) {
40
  * @var string
41
  * @since 3.1.6
42
  */
43
+ define( 'WOO_FEED_FREE_VERSION', '3.3.8' );
44
  }
45
 
46
  if ( ! defined( 'WOO_FEED_FREE_FILE' ) ) {