Content Egg - Version 3.9.0

Version Description

  • New: WooCommerce products synchronization.
  • New: WooCommerce attributes synchronization (global and custom).
  • New: WooCommerce autoblogging.
  • New: Curency converter for WooCommerce synchronization.
  • New: Latin slugs for WooCommerce attributes.
  • New: WooCommerce reviews rating for AE modules.
  • New: WooCommerce attributes filter (auto/blacklist/whitelist).
  • New: Post type for Fill utility.
  • New: Post status for Fill utility.
  • New: ustom fields for Fill utility.
  • New: Replacement tags: %RANDOM%, %RANDOM(10,50)%
  • New: Subscribers CSV export.
  • Improvement: Amazon: Getting price for parent products.
  • Improvement: Affilinet: https affilite links support.
  • Improvement: 'product-search' filter for Frontend search.
  • Improvement: User Guide - http://www.keywordrush.com/en/docs/content-egg/
  • Fix: Keywords parser.
  • Fix: Subscribers CSV export.
Download this release

Release Info

Developer keywordrush
Plugin Icon 128x128 Content Egg
Version 3.9.0
Comparing to
See all releases

Code changes from version 3.7.0 to 3.9.0

Files changed (52) hide show
  1. application/ModuleViewer.php +0 -1
  2. application/Plugin.php +3 -2
  3. application/ProductSearch.php +7 -1
  4. application/ProductSearchWidget.php +2 -2
  5. application/WooIntegrator.php +444 -0
  6. application/admin/AutoblogController.php +1 -1
  7. application/admin/EggMetabox.php +7 -1
  8. application/admin/GeneralConfig.php +59 -18
  9. application/admin/PluginAdmin.php +1 -0
  10. application/admin/PrefillController.php +56 -19
  11. application/admin/ToolsController.php +70 -0
  12. application/admin/views/_metabox_autoblog.php +22 -10
  13. application/admin/views/_metabox_results.php +15 -2
  14. application/admin/views/_metabox_search_results.php +4 -1
  15. application/admin/views/prefill.php +46 -1
  16. application/admin/views/settings.php +2 -1
  17. application/components/AffiliateParserModule.php +1 -1
  18. application/components/Config.php +15 -0
  19. application/components/ContentManager.php +88 -19
  20. application/components/ContentProduct.php +4 -1
  21. application/components/EggAutoblogger.php +0 -86
  22. application/components/FeaturedImage.php +19 -15
  23. application/components/LinkHandler.php +11 -5
  24. application/components/ModuleManager.php +15 -4
  25. application/helpers/CurrencyHelper.php +34 -3
  26. application/helpers/FileHelper.php +47 -0
  27. application/helpers/ImageHelper.php +5 -1
  28. application/helpers/TemplateHelper.php +23 -1
  29. application/helpers/TextHelper.php +52 -2
  30. application/models/AutoblogModel.php +58 -44
  31. application/models/Model.php +1 -1
  32. application/models/PriceAlertModel.php +17 -0
  33. application/modules/AE/AEConfig.php +1 -1
  34. application/modules/AE/AEModule.php +11 -1
  35. application/modules/AdmitadProducts/AdmitadProductsConfig.php +1 -1
  36. application/modules/AdmitadProducts/AdmitadProductsModule.php +31 -21
  37. application/modules/AffilinetCoupons/AffilinetCouponsConfig.php +23 -23
  38. application/modules/AffilinetCoupons/AffilinetCouponsModule.php +14 -5
  39. application/modules/AffilinetCoupons/views/search_panel.php +10 -10
  40. application/modules/Amazon/AmazonModule.php +79 -9
  41. application/modules/RelatedKeywords/RelatedKeywordsConfig.php +2 -3
  42. application/templates/blocks/item_features.php +10 -1
  43. content-egg.php +1 -1
  44. languages/content-egg.pot +501 -230
  45. languages/tpl/content-egg-tpl.pot +32 -21
  46. readme.txt +27 -5
  47. res/app/app.js +10 -0
  48. res/js/keywords.js +14 -10
  49. res/js/prefill.js +87 -50
  50. res/logos/flipkart-com.png +0 -0
  51. templates/block_offers_list.php +9 -1
  52. templates/block_offers_logo.php +8 -0
application/ModuleViewer.php CHANGED
@@ -33,7 +33,6 @@ class ModuleViewer {
33
 
34
  private function __construct()
35
  {
36
-
37
  }
38
 
39
  public function init()
33
 
34
  private function __construct()
35
  {
 
36
  }
37
 
38
  public function init()
application/Plugin.php CHANGED
@@ -14,7 +14,7 @@ use ContentEgg\application\helpers\CurrencyHelper;
14
  */
15
  class Plugin {
16
 
17
- const version = '3.7.0';
18
  const db_version = 33;
19
  const wp_requires = '4.2.2';
20
  const slug = 'content-egg';
@@ -33,7 +33,7 @@ class Plugin {
33
 
34
  return self::$instance;
35
  }
36
-
37
  private function __construct()
38
  {
39
  $this->loadTextdomain();
@@ -55,6 +55,7 @@ class Plugin {
55
  PriceAlert::getInstance()->init();
56
  AutoblogScheduler::initAction();
57
  ModuleUpdateScheduler::initAction();
 
58
  }
59
  }
60
 
14
  */
15
  class Plugin {
16
 
17
+ const version = '3.9.0';
18
  const db_version = 33;
19
  const wp_requires = '4.2.2';
20
  const slug = 'content-egg';
33
 
34
  return self::$instance;
35
  }
36
+
37
  private function __construct()
38
  {
39
  $this->loadTextdomain();
55
  PriceAlert::getInstance()->init();
56
  AutoblogScheduler::initAction();
57
  ModuleUpdateScheduler::initAction();
58
+ WooIntegrator::initAction();
59
  }
60
  }
61
 
application/ProductSearch.php CHANGED
@@ -54,8 +54,14 @@ class ProductSearch extends VirtualPage {
54
 
55
  public function getSlug()
56
  {
57
- return self::PAGE_SLUG;
58
  }
 
 
 
 
 
 
59
 
60
  public function getBody()
61
  {
54
 
55
  public function getSlug()
56
  {
57
+ return \apply_filters('cegg_product_search_slug', self::PAGE_SLUG);
58
  }
59
+
60
+ public static function getPageSlug()
61
+ {
62
+ return \apply_filters('cegg_product_search_slug', self::PAGE_SLUG);
63
+ }
64
+
65
 
66
  public function getBody()
67
  {
application/ProductSearchWidget.php CHANGED
@@ -90,7 +90,7 @@ class ProductSearchWidget extends \WP_Widget {
90
  if (\get_option('permalink_structure'))
91
  $form = preg_replace('/action=["\'].+?["\']/', 'action="' . self::getSearchFormUri() . '"', $form);
92
  else
93
- $form = preg_replace('/<\/form>/', '<input type="hidden" name="pagename" value="' . \esc_attr(ProductSearch::PAGE_SLUG) . '"></form>', $form);
94
 
95
  $form = preg_replace('/placeholder=".+?"/', 'placeholder="' . esc_attr(__('Product Search...', 'content-egg-tpl')) . '"', $form);
96
  }
@@ -100,7 +100,7 @@ class ProductSearchWidget extends \WP_Widget {
100
  public static function getSearchFormUri()
101
  {
102
  if (\get_option('permalink_structure'))
103
- return \esc_url(\home_url(ProductSearch::PAGE_SLUG));
104
  else
105
  return \esc_url(\home_url('/'));
106
  }
90
  if (\get_option('permalink_structure'))
91
  $form = preg_replace('/action=["\'].+?["\']/', 'action="' . self::getSearchFormUri() . '"', $form);
92
  else
93
+ $form = preg_replace('/<\/form>/', '<input type="hidden" name="pagename" value="' . \esc_attr(ProductSearch::getPageSlug()) . '"></form>', $form);
94
 
95
  $form = preg_replace('/placeholder=".+?"/', 'placeholder="' . esc_attr(__('Product Search...', 'content-egg-tpl')) . '"', $form);
96
  }
100
  public static function getSearchFormUri()
101
  {
102
  if (\get_option('permalink_structure'))
103
+ return \esc_url(\home_url(ProductSearch::getPageSlug()));
104
  else
105
  return \esc_url(\home_url('/'));
106
  }
application/WooIntegrator.php ADDED
@@ -0,0 +1,444 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application;
4
+
5
+ use ContentEgg\application\components\ContentManager;
6
+ use ContentEgg\application\components\FeaturedImage;
7
+ use ContentEgg\application\helpers\TextHelper;
8
+ use ContentEgg\application\helpers\CurrencyHelper;
9
+ use ContentEgg\application\admin\GeneralConfig;
10
+ use ContentEgg\application\components\ModuleManager;
11
+
12
+ /**
13
+ * WooIntegrator class file
14
+ *
15
+ * @author keywordrush.com <support@keywordrush.com>
16
+ * @link http://www.keywordrush.com/
17
+ * @copyright Copyright &copy; 2017 keywordrush.com
18
+ */
19
+ class WooIntegrator {
20
+
21
+ const META_WOO_SYNC_MODULE_UNIQUE_ID = '_cegg_woo_sync_muid';
22
+
23
+ private static $attributes_list;
24
+
25
+ public static function initAction()
26
+ {
27
+ if (!function_exists('\wc_get_product'))
28
+ return;
29
+
30
+ \add_action('content_egg_save_data', array(__CLASS__, 'wooHandler'), 13, 4);
31
+ }
32
+
33
+ public static function wooHandler($data, $module_id, $post_id, $is_last_iteration)
34
+ {
35
+ if (\get_post_type($post_id) != 'product' || !$product = \wc_get_product($post_id))
36
+ return;
37
+
38
+ if (!$is_last_iteration)
39
+ return;
40
+
41
+ // Get all post data
42
+ $affiliate_modules = ModuleManager::getInstance()->getAffiliteModulesList(true);
43
+ $modules_data = array();
44
+ foreach ($affiliate_modules as $module_id => $module_name)
45
+ {
46
+ if (!$data = ContentManager::getViewData($module_id, $post_id))
47
+ continue;
48
+ $modules_data[$module_id] = $data;
49
+ }
50
+
51
+ // Check for Manual sync
52
+ $is_product_sync = false;
53
+ $is_attr_sync = false;
54
+ foreach ($modules_data as $module_id => $data)
55
+ {
56
+ foreach ($data as $item)
57
+ {
58
+ if (!$is_product_sync && !empty($item['woo_sync']))
59
+ {
60
+ self::wooSync($item, $module_id, $post_id);
61
+ $is_product_sync = true;
62
+ }
63
+
64
+ if (!$is_attr_sync && !empty($item['woo_attr']))
65
+ {
66
+ self::wooCreateAttr($item, $module_id, $post_id);
67
+ $is_attr_sync == true;
68
+ }
69
+
70
+ if ($is_product_sync && $is_attr_sync)
71
+ return;
72
+ }
73
+ }
74
+
75
+ if ($is_product_sync)
76
+ return;
77
+
78
+ /**
79
+ * Automatic sync
80
+ */
81
+ $woocommerce_product_sync = GeneralConfig::getInstance()->option('woocommerce_product_sync');
82
+ $woocommerce_modules = GeneralConfig::getInstance()->option('woocommerce_modules');
83
+ if (!$woocommerce_modules || $woocommerce_product_sync == 'manually')
84
+ return;
85
+
86
+ $modules_data = array_intersect_key($modules_data, $woocommerce_modules);
87
+ if ($item = ContentManager::getMainProduct($modules_data, $woocommerce_product_sync))
88
+ {
89
+ self::wooSync($item, $item['module_id'], $post_id);
90
+
91
+ // also sync attr if not exist
92
+ if (!$product->get_attributes())
93
+ self::wooCreateAttr($item, $item['module_id'], $post_id);
94
+ }
95
+ }
96
+
97
+ public static function wooSync(array $item, $module_id, $post_id)
98
+ {
99
+ if (!$product = \wc_get_product($post_id))
100
+ return false;
101
+
102
+ // set price
103
+ if (!empty($item['price']))
104
+ {
105
+
106
+ $currency_rate = 1;
107
+ $woo_currency = \get_woocommerce_currency();
108
+ if ($item['currencyCode'] && $item['currencyCode'] != $woo_currency)
109
+ {
110
+ $currency_rate = CurrencyHelper::getCurrencyRate($item['currencyCode'], $woo_currency);
111
+ if (!$currency_rate)
112
+ $currency_rate = 1;
113
+ }
114
+
115
+ $product->set_price($item['price'] * $currency_rate);
116
+ if ($item['priceOld'])
117
+ {
118
+ $product->set_regular_price($item['priceOld'] * $currency_rate);
119
+ $product->set_sale_price($item['price'] * $currency_rate);
120
+ } else
121
+ {
122
+ $product->set_regular_price($item['price'] * $currency_rate);
123
+ $product->set_sale_price(null);
124
+ }
125
+ } else
126
+ {
127
+ $product->set_price(null);
128
+ $product->set_regular_price(null);
129
+ $product->set_sale_price(null);
130
+ }
131
+
132
+ if ($item['description'] && !$product->get_short_description())
133
+ $product->set_short_description($item['description']);
134
+
135
+ $product->set_date_modified(time());
136
+
137
+ // image
138
+ if (!$product->get_image_id() && $img_file = FeaturedImage::getImgFile($item))
139
+ FeaturedImage::attachThumbnail($img_file, $post_id);
140
+
141
+ if ($product->get_type() == 'external')
142
+ $product->set_product_url($item['url']);
143
+
144
+ // update meta
145
+ self::setMetaSyncUniqueId($post_id, $module_id, $item['unique_id']);
146
+
147
+ return $product->save();
148
+ }
149
+
150
+ public static function wooCreateAttr(array $item, $module_id, $post_id)
151
+ {
152
+ if (empty($item['features']) || !is_array($item['features']))
153
+ return;
154
+
155
+ if (!$product = \wc_get_product($post_id))
156
+ return false;
157
+
158
+ $attributes = $product->get_attributes();
159
+ $registered_taxonomy_count = 0;
160
+ $taxonomy_count = 0;
161
+ foreach ($item['features'] as $feature)
162
+ {
163
+ $feature['name'] = \wc_clean($feature['name']);
164
+ $prepared = self::modifyAttribute($feature['name'], $feature['value']);
165
+ $feature['name'] = $prepared['name'];
166
+ $feature['value'] = $prepared['value'];
167
+
168
+ $f_name = \wc_clean($feature['name']);
169
+ $f_slug = self::getSlug($f_name);
170
+
171
+ // exists?
172
+ if (isset($attributes[$f_slug]) || isset($attributes['pa_' . $f_slug]))
173
+ continue;
174
+
175
+ $f_value = \wc_sanitize_term_text_based($feature['value']);
176
+ $term_ids = array();
177
+ $taxonomy = '';
178
+ $prepared = self::isTaxonomyAttribute($f_name, $f_value, $f_slug);
179
+ if ($prepared)
180
+ {
181
+ $taxonomy_count++;
182
+ $f_name = \wc_clean($prepared['name']);
183
+
184
+ // Taxonomy Attribute
185
+ // @see: class-wc-admin-attributes.php -> process_add_attribute()
186
+ $attr_data = array(
187
+ 'attribute_label' => $f_name,
188
+ 'attribute_name' => $f_slug,
189
+ 'attribute_type' => 'text',
190
+ );
191
+
192
+ $attr_id = self::createTaxonomyAttribute($attr_data);
193
+
194
+ if ($attr_id)
195
+ {
196
+ $taxonomy = \wc_attribute_taxonomy_name_by_id($attr_id);
197
+
198
+ // Register the taxonomy now so that the import works!
199
+ if (!\taxonomy_exists($taxonomy))
200
+ {
201
+ \register_taxonomy(
202
+ $taxonomy, apply_filters('woocommerce_taxonomy_objects_' . $taxonomy, array('product')), apply_filters('woocommerce_taxonomy_args_' . $taxonomy, array(
203
+ 'hierarchical' => true,
204
+ 'show_ui' => false,
205
+ 'query_var' => true,
206
+ 'rewrite' => false,
207
+ ))
208
+ );
209
+ $registered_taxonomy_count++;
210
+ }
211
+
212
+ // Creates the term and taxonomy relationship if it doesn't already exist.
213
+ $f_value_array = self::value2Array($f_value);
214
+ $term_ids = \wp_set_object_terms($product->get_id(), $f_value_array, $taxonomy);
215
+ $term_ids = array_map('intval', $term_ids);
216
+ } else
217
+ $attr_id = 0;
218
+ } else
219
+ {
220
+ // Local Attribute
221
+ $attr_id = 0;
222
+ $f_value_array = self::value2Array($f_value);
223
+ }
224
+
225
+ $attribute = new \WC_Product_Attribute();
226
+ $attribute->set_id($attr_id); // 0 for product level attributes. ID for global attributes.
227
+ if ($taxonomy)
228
+ $attribute->set_name($taxonomy);
229
+ else
230
+ $attribute->set_name($f_name);
231
+ // attribute value or array of term ids/names.
232
+ if ($term_ids)
233
+ $attribute->set_options($term_ids);
234
+ else
235
+ $attribute->set_options($f_value_array);
236
+ $attribute->set_visible(true); // If visible on frontend.
237
+ $attributes[] = $attribute;
238
+ }
239
+ $product->set_attributes($attributes);
240
+ $res = $product->save();
241
+
242
+ if ($taxonomy_count)
243
+ \flush_rewrite_rules();
244
+ return $res;
245
+ }
246
+
247
+ public static function createTaxonomyAttribute($attribute)
248
+ {
249
+ global $wpdb;
250
+
251
+ if (empty($attribute['attribute_label']))
252
+ return false;
253
+
254
+ $attribute['attribute_label'] = \wc_clean($attribute['attribute_label']);
255
+
256
+ if (empty($attribute['attribute_name']))
257
+ $attribute['attribute_name'] = \wc_sanitize_taxonomy_name($attribute['attribute_label']);
258
+
259
+ if (empty($attribute['attribute_type']))
260
+ $attribute['attribute_type'] = 'text';
261
+
262
+
263
+ if (empty($attribute['attribute_orderby']))
264
+ $attribute['attribute_orderby'] = 'menu_order';
265
+
266
+ // validate slug
267
+ if (strlen($attribute['attribute_name']) >= 28 || wc_check_if_attribute_name_is_reserved($attribute['attribute_name']))
268
+ return false;
269
+
270
+ if (\taxonomy_exists(\wc_attribute_taxonomy_name($attribute['attribute_name'])))
271
+ return \wc_attribute_taxonomy_id_by_name($attribute['attribute_name']);
272
+
273
+ // Create the taxonomy
274
+ $insert = $wpdb->insert($wpdb->prefix . 'woocommerce_attribute_taxonomies', $attribute);
275
+
276
+ if (\is_wp_error($insert))
277
+ return false;
278
+
279
+ $id = $wpdb->insert_id;
280
+
281
+ //\do_action('woocommerce_attribute_added', $id, $attribute);
282
+
283
+ \wp_schedule_single_event(time(), 'woocommerce_flush_rewrite_rules');
284
+ \delete_transient('wc_attribute_taxonomies');
285
+
286
+ return $id;
287
+ }
288
+
289
+ public static function getAttributesList()
290
+ {
291
+ if (self::$attributes_list === null)
292
+ {
293
+ $attributes_list = GeneralConfig::getInstance()->option('woocommerce_attributes_list');
294
+ $attributes_list = explode(',', $attributes_list);
295
+ $attributes_list = array_map('trim', $attributes_list);
296
+ $attributes_list = array_map('mb_strtolower', $attributes_list);
297
+ $attributes_list = array_filter($attributes_list);
298
+ self::$attributes_list = $attributes_list;
299
+ }
300
+ return self::$attributes_list;
301
+ }
302
+
303
+ public static function modifyAttribute($name, $value, $slug = '')
304
+ {
305
+ /**
306
+ * Modifiers
307
+ */
308
+ // 16 M; 8 GB; 1.5 GB; 8MP; 30 fps; 2 m; 0.5600 kg; 6,37 кг
309
+ if (preg_match('/^([0-9]*[.,]?[0-9]+)[\s+]?([\p{L}]+)$/u', $value, $matches))
310
+ {
311
+ $name = $name . ' (' . $matches[2] . ')';
312
+ $value = $matches[1];
313
+ }
314
+ return array('name' => $name, 'value' => $value);
315
+ }
316
+
317
+ public static function value2Array($value)
318
+ {
319
+ // arrays
320
+ $list = preg_split('/[,|;\/]\s/', $value);
321
+ $list = array_map('trim', $list);
322
+ $list = array_map('\wc_sanitize_term_text_based', $list);
323
+ return $list;
324
+ }
325
+
326
+ public static function isTaxonomyAttribute($name, $value, $slug = '')
327
+ {
328
+ /**
329
+ * Black / white list filter
330
+ */
331
+ $attributes_filter = GeneralConfig::getInstance()->option('woocommerce_attributes_filter');
332
+ if ($attributes_filter)
333
+ {
334
+ if (in_array(mb_strtolower($name, 'utf-8'), self::getAttributesList()) || ($slug && in_array($slug, self::getAttributesList())))
335
+ $in_list = true;
336
+ else
337
+ $in_list = false;
338
+
339
+ if ($attributes_filter == 'whitelist' && $in_list)
340
+ return array('name' => $name, 'value' => $value);
341
+ elseif ($attributes_filter == 'blacklist' && !$in_list)
342
+ return array('name' => $name, 'value' => $value);
343
+ else
344
+ return false;
345
+ }
346
+
347
+ /**
348
+ * Default filter
349
+ */
350
+ // ignore names
351
+ $ignore_names = array('depth', 'height', 'weight', 'package', 'model', 'pack of', 'warranty', 'title', 'of items', 'ean', 'department', 'dimensions');
352
+ foreach ($ignore_names as $in)
353
+ {
354
+ if (mb_stristr($name, $in, true, 'utf-8') !== false)
355
+ return false;
356
+ }
357
+
358
+ if (strstr($name, '(') && strstr($name, ')') && is_numeric($value))
359
+ {
360
+ return array('name' => $name, 'value' => $value);
361
+ }
362
+
363
+ // Yes/No/0/1
364
+ $yes_array = array('yes');
365
+ foreach ($yes_array as $yes)
366
+ {
367
+ if (mb_strtolower($value, 'utf-8') == $yes)
368
+ return array('name' => $name, 'value' => ucfirst($value));
369
+ }
370
+ $no_array = array('no', '0', '-');
371
+ foreach ($no_array as $no)
372
+ {
373
+ if (mb_strtolower($value, 'utf-8') == $no)
374
+ return false;
375
+ }
376
+
377
+ // arrays
378
+ $list = preg_split('/[,|;\/]\s/', $value);
379
+ if (count($list) > 1 && count($list) <= 5)
380
+ {
381
+ foreach ($list as $l)
382
+ {
383
+ if (mb_strlen($l, 'utf-8') > 20)
384
+ return false;
385
+ }
386
+ return array('name' => $name, 'value' => $value);
387
+ }
388
+
389
+ // short string value
390
+ if (mb_strlen($value, 'utf-8') < 20)
391
+ return array('name' => $name, 'value' => $value);
392
+
393
+ return false;
394
+ }
395
+
396
+ public static function getSlug($name)
397
+ {
398
+ // already exists?
399
+ $taxonomies = \wc_get_attribute_taxonomies();
400
+ foreach ($taxonomies as $taxonomie)
401
+ {
402
+ if ($taxonomie->attribute_label == $name)
403
+ return $taxonomie->attribute_name;
404
+ }
405
+
406
+ // rus 2 lat
407
+ $slug = strtolower(TextHelper::sluggable($name));
408
+ if (strlen($slug) >= 28)
409
+ $slug = substr($slug, 0, 27);
410
+ $slug = \wc_sanitize_taxonomy_name($slug);
411
+ return $slug;
412
+ }
413
+
414
+ public static function setMetaSyncUniqueId($post_id, $module_id, $unique_id)
415
+ {
416
+ if (!$unique_id)
417
+ \delete_post_meta($post_id, self::META_WOO_SYNC_MODULE_UNIQUE_ID);
418
+ else
419
+ \update_post_meta($post_id, self::META_WOO_SYNC_MODULE_UNIQUE_ID, $module_id . '[&]' . $unique_id);
420
+ }
421
+
422
+ public static function getMetaSyncUniqueId($post_id)
423
+ {
424
+ return \get_post_meta($post_id, self::META_WOO_SYNC_MODULE_UNIQUE_ID, true);
425
+ }
426
+
427
+ public static function getSyncItem($post_id)
428
+ {
429
+ if (!$muids = self::getMetaSyncUniqueId($post_id))
430
+ return null;
431
+
432
+ $ids = explode('[&]', $muids);
433
+ if (count($ids) != 2)
434
+ return null;
435
+
436
+ $module_id = $ids[0];
437
+ $unique_id = $ids[1];
438
+
439
+ $item = ContentManager::getProductbyUniqueId($unique_id, $module_id, $post_id);
440
+ if ($item)
441
+ $item['module_id'] = $module_id;
442
+ return $item;
443
+ }
444
+ }
application/admin/AutoblogController.php CHANGED
@@ -191,7 +191,7 @@ class AutoblogController {
191
  if (is_array($val))
192
  $item[$key] = unserialize($item[$key]);
193
  }
194
- $item['id'] = 0;
195
  } else
196
  $item = $default;
197
  } else
191
  if (is_array($val))
192
  $item[$key] = unserialize($item[$key]);
193
  }
194
+ $item['id'] = null;
195
  } else
196
  $item = $default;
197
  } else
application/admin/EggMetabox.php CHANGED
@@ -251,14 +251,20 @@ class EggMetabox {
251
  if (!is_array($content))
252
  return;
253
 
 
254
  foreach ($content as $module_id => $data)
255
  {
 
256
  if (!ModuleManager::getInstance()->moduleExists($module_id) || !ModuleManager::getInstance()->isModuleActive($module_id))
257
  continue;
258
 
259
  $data = json_decode($data, true);
260
  $data = $this->dataPrepare($data);
261
- ContentManager::saveData($data, $module_id, $post_id);
 
 
 
 
262
  }
263
  }
264
 
251
  if (!is_array($content))
252
  return;
253
 
254
+ $i = 0;
255
  foreach ($content as $module_id => $data)
256
  {
257
+ $i++;
258
  if (!ModuleManager::getInstance()->moduleExists($module_id) || !ModuleManager::getInstance()->isModuleActive($module_id))
259
  continue;
260
 
261
  $data = json_decode($data, true);
262
  $data = $this->dataPrepare($data);
263
+ if ($i == count($content))
264
+ $last_iteration = true;
265
+ else
266
+ $last_iteration = false;
267
+ ContentManager::saveData($data, $module_id, $post_id, $last_iteration);
268
  }
269
  }
270
 
application/admin/GeneralConfig.php CHANGED
@@ -17,7 +17,7 @@ use ContentEgg\application\components\ModuleManager;
17
  */
18
  class GeneralConfig extends Config {
19
 
20
- private static $search_midules;
21
 
22
  public function page_slug()
23
  {
@@ -94,6 +94,8 @@ class GeneralConfig extends Config {
94
  $sent_price_alerts = PriceAlertModel::model()->count('status = ' . PriceAlertModel::STATUS_DELETED
95
  . ' AND TIMESTAMPDIFF( DAY, complet_date, "' . \current_time('mysql') . '") <= ' . PriceAlertModel::CLEAN_DELETED_DAYS);
96
 
 
 
97
  return array(
98
  'lang' => array(
99
  'title' => __('Website language', 'content-egg'),
@@ -135,16 +137,18 @@ class GeneralConfig extends Config {
135
  'message' => sprintf(__('The field "%s" can\'t be more than %d.', 'content-egg'), __('Price history', 'content-egg'), 362),
136
  ),
137
  ),
 
138
  ),
139
  'price_alert_enabled' => array(
140
  'title' => 'Price alert',
141
  'description' => __('Allow members to subscribe for price drop alert on email.', 'content-egg') .
142
  '<p class="description">' . sprintf(__('Active subscriptions now: <b>%d</b>', 'content-egg'), $total_price_alerts) .
143
- '. ' . sprintf(__('Messages are sent for last %d days: <b>%d</b>', 'content-egg'), PriceAlertModel::CLEAN_DELETED_DAYS, $sent_price_alerts) . '.</p>' .
 
144
  '<p class="description">' . __('This option requires "Price history" option (must be enabled) to work.', 'content-egg') . '</p>',
145
  'callback' => array($this, 'render_checkbox'),
146
  'default' => true,
147
- 'section' => 'default',
148
  ),
149
  'button_color' => array(
150
  'title' => __('Button color', 'content-egg'),
@@ -162,16 +166,16 @@ class GeneralConfig extends Config {
162
  'default' => '',
163
  'validator' => array(
164
  'strip_tags',
165
- ),
166
  ),
167
  'btn_text_coupon' => array(
168
  'title' => __('Coupon button text', 'content-egg'),
169
  'description' => sprintf(__('It will be used instead of "%s".', 'content-egg'), __('Shop Sale', 'content-egg-tpl')),
170
  'callback' => array($this, 'render_input'),
171
- 'default' =>'',
172
  'validator' => array(
173
  'strip_tags',
174
- ),
175
  ),
176
  'redirect_prefix' => array(
177
  'title' => __('Redirect prefix', 'content-egg'),
@@ -196,6 +200,7 @@ class GeneralConfig extends Config {
196
  'trim',
197
  'allow_empty',
198
  ),
 
199
  ),
200
  'from_email' => array(
201
  'title' => __('From Email', 'content-egg'),
@@ -210,6 +215,7 @@ class GeneralConfig extends Config {
210
  'message' => sprintf(__('Field "%s" filled with wrong data.', 'content-egg'), 'Email'),
211
  ),
212
  ),
 
213
  ),
214
  'search_modules' => array(
215
  'title' => __('Search modules', 'content-egg'),
@@ -217,9 +223,10 @@ class GeneralConfig extends Config {
217
  __('Do not select more than 1-2 modules.', 'content-egg') . '<br>' .
218
  __('Please note, AE modules work slowly and are not recommended for use as search modules.', 'content-egg') . '<br>' .
219
  __('Do not forget to add search widget or shorcode [content-egg-search-form].', 'content-egg'),
220
- 'checkbox_options' => self::getSearchModuleIds(),
221
  'callback' => array($this, 'render_checkbox_list'),
222
  'default' => array(),
 
223
  ),
224
  'search_page_tpl' => array(
225
  'title' => __('Search page template', 'content-egg'),
@@ -227,6 +234,47 @@ class GeneralConfig extends Config {
227
  __('You can use shortcodes, for example: [content-egg module=Amazon template=grid]', 'content-egg'),
228
  'callback' => array($this, 'render_textarea'),
229
  'default' => '',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
230
  ),
231
  );
232
  }
@@ -246,20 +294,13 @@ class GeneralConfig extends Config {
246
  PluginAdmin::render('settings', array('page_slug' => $this->page_slug()));
247
  }
248
 
249
- private static function getSearchModuleIds()
250
  {
251
- if (self::$search_midules === null)
252
  {
253
- $modules = ModuleManager::getInstance()->getAffiliateParsers(false);
254
- foreach ($modules as $module_id => $module)
255
- {
256
- // AE module?
257
- //if ($module_id != $module->getMyShortId())
258
- // continue;
259
- self::$search_midules[$module_id] = $module->getName();
260
- }
261
  }
262
- return self::$search_midules;
263
  }
264
 
265
  }
17
  */
18
  class GeneralConfig extends Config {
19
 
20
+ private static $affiliate_modules;
21
 
22
  public function page_slug()
23
  {
94
  $sent_price_alerts = PriceAlertModel::model()->count('status = ' . PriceAlertModel::STATUS_DELETED
95
  . ' AND TIMESTAMPDIFF( DAY, complet_date, "' . \current_time('mysql') . '") <= ' . PriceAlertModel::CLEAN_DELETED_DAYS);
96
 
97
+ $export_url = \get_admin_url(\get_current_blog_id(), 'admin.php?page=content-egg-tools&action=subscribers-export');
98
+
99
  return array(
100
  'lang' => array(
101
  'title' => __('Website language', 'content-egg'),
137
  'message' => sprintf(__('The field "%s" can\'t be more than %d.', 'content-egg'), __('Price history', 'content-egg'), 362),
138
  ),
139
  ),
140
+ 'section' => __('Price alerts', 'content-egg'),
141
  ),
142
  'price_alert_enabled' => array(
143
  'title' => 'Price alert',
144
  'description' => __('Allow members to subscribe for price drop alert on email.', 'content-egg') .
145
  '<p class="description">' . sprintf(__('Active subscriptions now: <b>%d</b>', 'content-egg'), $total_price_alerts) .
146
+ '. ' . sprintf(__('Messages are sent for last %d days: <b>%d</b>', 'content-egg'), PriceAlertModel::CLEAN_DELETED_DAYS, $sent_price_alerts) . '.' .
147
+ ' ' . sprintf(__('Export: [ <a href="%s">All</a> | <a href="%s">Active</a> ]', 'content-egg'), $export_url, $export_url . '&active_only=true') . '</p>' .
148
  '<p class="description">' . __('This option requires "Price history" option (must be enabled) to work.', 'content-egg') . '</p>',
149
  'callback' => array($this, 'render_checkbox'),
150
  'default' => true,
151
+ 'section' => __('Price alerts', 'content-egg'),
152
  ),
153
  'button_color' => array(
154
  'title' => __('Button color', 'content-egg'),
166
  'default' => '',
167
  'validator' => array(
168
  'strip_tags',
169
+ ),
170
  ),
171
  'btn_text_coupon' => array(
172
  'title' => __('Coupon button text', 'content-egg'),
173
  'description' => sprintf(__('It will be used instead of "%s".', 'content-egg'), __('Shop Sale', 'content-egg-tpl')),
174
  'callback' => array($this, 'render_input'),
175
+ 'default' => '',
176
  'validator' => array(
177
  'strip_tags',
178
+ ),
179
  ),
180
  'redirect_prefix' => array(
181
  'title' => __('Redirect prefix', 'content-egg'),
200
  'trim',
201
  'allow_empty',
202
  ),
203
+ 'section' => __('Price alerts', 'content-egg'),
204
  ),
205
  'from_email' => array(
206
  'title' => __('From Email', 'content-egg'),
215
  'message' => sprintf(__('Field "%s" filled with wrong data.', 'content-egg'), 'Email'),
216
  ),
217
  ),
218
+ 'section' => __('Price alerts', 'content-egg'),
219
  ),
220
  'search_modules' => array(
221
  'title' => __('Search modules', 'content-egg'),
223
  __('Do not select more than 1-2 modules.', 'content-egg') . '<br>' .
224
  __('Please note, AE modules work slowly and are not recommended for use as search modules.', 'content-egg') . '<br>' .
225
  __('Do not forget to add search widget or shorcode [content-egg-search-form].', 'content-egg'),
226
+ 'checkbox_options' => self::getAffiliteModulesList(),
227
  'callback' => array($this, 'render_checkbox_list'),
228
  'default' => array(),
229
+ 'section' => __('Frontend search', 'content-egg'),
230
  ),
231
  'search_page_tpl' => array(
232
  'title' => __('Search page template', 'content-egg'),
234
  __('You can use shortcodes, for example: [content-egg module=Amazon template=grid]', 'content-egg'),
235
  'callback' => array($this, 'render_textarea'),
236
  'default' => '',
237
+ 'section' => __('Frontend search', 'content-egg'),
238
+ ),
239
+ 'woocommerce_modules' => array(
240
+ 'title' => __('Modules for synchronization', 'content-egg'),
241
+ 'description' => __('Select modules for automatic synchronization with WooCommerce.', 'content-egg'),
242
+ 'checkbox_options' => self::getAffiliteModulesList(),
243
+ 'callback' => array($this, 'render_checkbox_list'),
244
+ 'default' => array(),
245
+ 'section' => __('WooCommerce synchronization', 'content-egg'),
246
+ ),
247
+ 'woocommerce_product_sync' => array(
248
+ 'title' => __('Automatic synchronization', 'content-egg'),
249
+ 'description' => __('How to choose product for automatic synchronization with WooCommerce.', 'content-egg'),
250
+ 'callback' => array($this, 'render_dropdown'),
251
+ 'dropdown_options' => array(
252
+ 'min_price' => __('Minimum price', 'content-egg'),
253
+ 'max_price' => __('Maximum price', 'content-egg'),
254
+ 'random' => __('Random', 'content-egg'),
255
+ 'manually' => __('Manually only', 'content-egg'),
256
+ ),
257
+ 'default' => 'min_price',
258
+ 'section' => __('WooCommerce synchronization', 'content-egg'),
259
+ ),
260
+ 'woocommerce_attributes_filter' => array(
261
+ 'title' => __('Global attributes filter', 'content-egg'),
262
+ 'description' => __('How to create wocommerce attributes when synchronizing. Please, read documentation about them in our docs.', 'content-egg'),
263
+ 'callback' => array($this, 'render_dropdown'),
264
+ 'dropdown_options' => array(
265
+ '' => __('Default filter', 'content-egg'),
266
+ 'whitelist' => __('Whitelist attribute names', 'content-egg'),
267
+ 'blacklist' => __('Blacklist attribute names', 'content-egg'),
268
+ ),
269
+ 'default' => '',
270
+ 'section' => __('WooCommerce synchronization', 'content-egg'),
271
+ ),
272
+ 'woocommerce_attributes_list' => array(
273
+ 'title' => __('Attributes list', 'content-egg'),
274
+ 'description' => __('Black / white list of woocommerce global (filterable) attributes. Enter a comma separated list.', 'content-egg'),
275
+ 'callback' => array($this, 'render_textarea'),
276
+ 'default' => '',
277
+ 'section' => __('WooCommerce synchronization', 'content-egg'),
278
  ),
279
  );
280
  }
294
  PluginAdmin::render('settings', array('page_slug' => $this->page_slug()));
295
  }
296
 
297
+ private static function getAffiliteModulesList()
298
  {
299
+ if (self::$affiliate_modules === null)
300
  {
301
+ self::$affiliate_modules = ModuleManager::getInstance()->getAffiliteModulesList(false);
 
 
 
 
 
 
 
302
  }
303
+ return self::$affiliate_modules;
304
  }
305
 
306
  }
application/admin/PluginAdmin.php CHANGED
@@ -52,6 +52,7 @@ class PluginAdmin {
52
  new FeaturedImage;
53
  new PrefillController;
54
  new AutoblogController;
 
55
  AeIntegrationConfig::getInstance()->adminInit();
56
  }
57
  if (Plugin::isEnvato() && !Plugin::isActivated() && !\get_option(Plugin::slug . '_env_install'))
52
  new FeaturedImage;
53
  new PrefillController;
54
  new AutoblogController;
55
+ new ToolsController;
56
  AeIntegrationConfig::getInstance()->adminInit();
57
  }
58
  if (Plugin::isEnvato() && !Plugin::isActivated() && !\get_option(Plugin::slug . '_env_install'))
application/admin/PrefillController.php CHANGED
@@ -8,6 +8,7 @@ use ContentEgg\application\helpers\TextHelper;
8
  use ContentEgg\application\helpers\InputHelper;
9
  use ContentEgg\application\components\ContentManager;
10
  use ContentEgg\application\libs\KeywordDensity;
 
11
 
12
  /**
13
  * PrefillController class file
@@ -31,14 +32,26 @@ class PrefillController {
31
  \wp_enqueue_script('jquery-ui-progressbar', array('jquery-ui-core'));
32
  \wp_enqueue_style('contentegg-admin-ui-css', '//ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/themes/smoothness/jquery-ui.css', false, Plugin::version, false);
33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  \wp_localize_script('contentegg-prefill', 'content_egg_prefill', array(
35
- 'post_ids' =>
36
- \get_posts(array(
37
- 'post_type' => GeneralConfig::getInstance()->option('post_types'),
38
- 'numberposts' => -1,
39
- 'post_status' => array('publish', 'future'),
40
- 'fields' => 'ids',
41
- )),
42
  'nonce' => \wp_create_nonce('contentegg-prefill')
43
  ));
44
  }
@@ -68,21 +81,24 @@ class PrefillController {
68
 
69
  \check_ajax_referer('contentegg-prefill', 'nonce');
70
 
71
- if (empty($_GET['module_id']))
72
  throw new \Exception("Module is undefined.");
73
- if (empty($_GET['post_id']))
74
  throw new \Exception("Post ID is undefined.");
75
 
76
- $module_id = TextHelper::clear($_GET['module_id']);
77
- $post_id = (int) $_GET['post_id'];
78
- $keyword_source = InputHelper::get('keyword_source');
79
- $autoupdate = InputHelper::get('autoupdate', false);
80
  $autoupdate = filter_var($autoupdate, FILTER_VALIDATE_BOOLEAN);
81
- $keyword_count = (int) InputHelper::get('keyword_count');
82
- $minus_words = TextHelper::commaList(InputHelper::get('minus_words'));
 
 
 
83
  if ($minus_words)
84
  $minus_words = explode(',', $minus_words);
85
- $custom_field = InputHelper::get('custom_field', '');
86
  $custom_field = TextHelper::clear($custom_field);
87
 
88
  $parser = ModuleManager::getInstance()->parserFactory($module_id);
@@ -124,7 +140,7 @@ class PrefillController {
124
 
125
  // save & exit...
126
  \update_post_meta($post->ID, ContentManager::META_PREFIX_KEYWORD . $parser->getId(), $keyword);
127
- $this->printResult($log . ' - ' . __('Keyword for autoupdate was saved.', 'content-egg'));
128
  }
129
 
130
  try
@@ -147,6 +163,28 @@ class PrefillController {
147
  // save
148
  ContentManager::saveData($data, $parser->getId(), $post->ID);
149
  $log .= ' - ' . __('Data saved:', 'content-egg') . ' ' . count($data) . '.';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  $this->printResult($log);
151
  }
152
 
@@ -176,11 +214,10 @@ class PrefillController {
176
  $popular = $kd->getPopularWords($keyword_count);
177
  $keyword = join(' ', $popular);
178
  } elseif ($keyword_source == '_custom_field')
179
- {
180
  if (!$meta_name)
181
  return '';
182
  $keyword = \get_post_meta($post_id, $meta_name, true);
183
-
184
  } elseif (ModuleManager::getInstance()->moduleExists($keyword_source))
185
  {
186
  $keyword = \get_post_meta($post_id, ContentManager::META_PREFIX_KEYWORD . $keyword_source, true);
8
  use ContentEgg\application\helpers\InputHelper;
9
  use ContentEgg\application\components\ContentManager;
10
  use ContentEgg\application\libs\KeywordDensity;
11
+ use ContentEgg\application\models\AutoblogModel;
12
 
13
  /**
14
  * PrefillController class file
32
  \wp_enqueue_script('jquery-ui-progressbar', array('jquery-ui-core'));
33
  \wp_enqueue_style('contentegg-admin-ui-css', '//ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/themes/smoothness/jquery-ui.css', false, Plugin::version, false);
34
 
35
+ $post_statuses = array_merge(get_post_statuses(), array('future' => __('Future')));
36
+ $post_ids = \get_posts(array(
37
+ 'post_type' => GeneralConfig::getInstance()->option('post_types'),
38
+ 'numberposts' => -1,
39
+ 'post_status' => array_keys($post_statuses),
40
+ 'fields' => 'ids',
41
+ ));
42
+
43
+ $posts = array();
44
+ foreach ($post_ids as $post_id)
45
+ {
46
+ $post = array();
47
+ $post['id'] = $post_id;
48
+ $post['post_type'] = \get_post_field('post_type', $post_id);
49
+ $post['post_status'] = \get_post_field('post_status', $post_id);
50
+ $posts[] = $post;
51
+ }
52
+
53
  \wp_localize_script('contentegg-prefill', 'content_egg_prefill', array(
54
+ 'posts' => $posts,
 
 
 
 
 
 
55
  'nonce' => \wp_create_nonce('contentegg-prefill')
56
  ));
57
  }
81
 
82
  \check_ajax_referer('contentegg-prefill', 'nonce');
83
 
84
+ if (empty($_POST['module_id']))
85
  throw new \Exception("Module is undefined.");
86
+ if (empty($_POST['post_id']))
87
  throw new \Exception("Post ID is undefined.");
88
 
89
+ $module_id = TextHelper::clear($_POST['module_id']);
90
+ $post_id = (int) $_POST['post_id'];
91
+ $keyword_source = InputHelper::post('keyword_source');
92
+ $autoupdate = InputHelper::post('autoupdate', false);
93
  $autoupdate = filter_var($autoupdate, FILTER_VALIDATE_BOOLEAN);
94
+ $keyword_count = (int) InputHelper::post('keyword_count');
95
+ $minus_words = TextHelper::commaList(InputHelper::post('minus_words'));
96
+ $custom_field_names = InputHelper::post('custom_field_names', array());
97
+ $custom_field_values = InputHelper::post('custom_field_values', array());
98
+
99
  if ($minus_words)
100
  $minus_words = explode(',', $minus_words);
101
+ $custom_field = InputHelper::post('custom_field', '');
102
  $custom_field = TextHelper::clear($custom_field);
103
 
104
  $parser = ModuleManager::getInstance()->parserFactory($module_id);
140
 
141
  // save & exit...
142
  \update_post_meta($post->ID, ContentManager::META_PREFIX_KEYWORD . $parser->getId(), $keyword);
143
+ //$this->printResult($log . ' - ' . __('Keyword for autoupdate was saved.', 'content-egg'));
144
  }
145
 
146
  try
163
  // save
164
  ContentManager::saveData($data, $parser->getId(), $post->ID);
165
  $log .= ' - ' . __('Data saved:', 'content-egg') . ' ' . count($data) . '.';
166
+
167
+ // add custom fields
168
+ $meta_input = array();
169
+ if ($custom_field_names && is_array($custom_field_names))
170
+ {
171
+ foreach ($custom_field_names as $i => $cf_name)
172
+ {
173
+ if (!$cf_name || empty($custom_field_values[$i]))
174
+ continue;
175
+ $cf_value = $custom_field_values[$i];
176
+ if (\is_serialized($cf_value))
177
+ $cf_value = @unserialize($cf_value);
178
+ else
179
+ {
180
+ $modules_data = array($parser->getId() => $data);
181
+ $main_product = AutoblogModel::getMainProduct($modules_data, 'min_price');
182
+ $cf_value = AutoblogModel::buildTemplate($cf_value, $modules_data, $keyword, array(), $main_product);
183
+ }
184
+ \update_post_meta($post->ID, $cf_name, $cf_value);
185
+ }
186
+ }
187
+
188
  $this->printResult($log);
189
  }
190
 
214
  $popular = $kd->getPopularWords($keyword_count);
215
  $keyword = join(' ', $popular);
216
  } elseif ($keyword_source == '_custom_field')
217
+ {
218
  if (!$meta_name)
219
  return '';
220
  $keyword = \get_post_meta($post_id, $meta_name, true);
 
221
  } elseif (ModuleManager::getInstance()->moduleExists($keyword_source))
222
  {
223
  $keyword = \get_post_meta($post_id, ContentManager::META_PREFIX_KEYWORD . $keyword_source, true);
application/admin/ToolsController.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\admin;
4
+
5
+ use ContentEgg\application\models\PriceAlertModel;
6
+ use ContentEgg\application\helpers\FileHelper;
7
+
8
+ /**
9
+ * ToolsController class file
10
+ *
11
+ * @author keywordrush.com <support@keywordrush.com>
12
+ * @link http://www.keywordrush.com/
13
+ * @copyright Copyright &copy; 2017 keywordrush.com
14
+ */
15
+ class ToolsController {
16
+
17
+ const slug = 'content-egg-tools';
18
+
19
+ public function __construct()
20
+ {
21
+ \add_action('admin_menu', array($this, 'actionHandler'));
22
+ }
23
+
24
+ public function actionHandler()
25
+ {
26
+ if (empty($GLOBALS['pagenow']) || $GLOBALS['pagenow'] != 'admin.php')
27
+ return;
28
+
29
+ if (empty($_GET['page']) || $_GET['page'] != 'content-egg-tools')
30
+ return;
31
+
32
+ if (!empty($_GET['action']) && $_GET['action'] == 'subscribers-export')
33
+ {
34
+ $this->actionSubscribersExport();
35
+ }
36
+ }
37
+
38
+ public function actionSubscribersExport()
39
+ {
40
+ if (!\current_user_can('administrator'))
41
+ die('You do not have permission to view this page.');
42
+
43
+ $where = array();
44
+ if (!empty($_GET['active_only']) && (bool) $_GET['active_only'])
45
+ $where = array('where' => 'status = ' . PriceAlertModel::STATUS_ACTIVE);
46
+ $subscribers = $total_price_alerts = PriceAlertModel::model()->findAll($where);
47
+
48
+ $csv_arr = array();
49
+ $ignore_fields = array('activkey', 'email', 'status');
50
+ foreach ($subscribers as $subscriber)
51
+ {
52
+ $csv_line = array();
53
+ $csv_line['email'] = $subscriber['email'];
54
+ $csv_line['status'] = PriceAlertModel::getStatus($subscriber['status']);
55
+
56
+ foreach ($subscriber as $key => $s)
57
+ {
58
+ if (in_array($key, $ignore_fields))
59
+ continue;
60
+ $csv_line[$key] = $s;
61
+ }
62
+ $csv_arr[] = $csv_line;
63
+ }
64
+ $filename = 'subscribers-' . date('d-m-Y') . '.csv';
65
+ FileHelper::sendDownloadHeaders($filename);
66
+ echo FileHelper::array2Csv($csv_arr);
67
+ exit;
68
+ }
69
+
70
+ }
application/admin/views/_metabox_autoblog.php CHANGED
@@ -305,13 +305,25 @@ use ContentEgg\application\components\ModuleManager;
305
  <td>
306
  <?php
307
  $opt = array('name' => 'item[category]', 'id' => 'category', 'selected' => $item['category'], 'hide_empty' => false);
308
- if ($batch)
309
- {
310
- $opt['show_option_none'] = __('Create Automatically', 'content-egg'); // -1
311
- $opt['selected'] = -1;
312
- }
313
- \wp_dropdown_categories($opt);
314
  ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
315
  <p class="description">
316
  <?php _e('Default category for posts.', 'content-egg'); ?>
317
  <?php if ($batch): ?>
@@ -320,7 +332,7 @@ use ContentEgg\application\components\ModuleManager;
320
  </p>
321
  </td>
322
  </tr>
323
-
324
  <tr class="form-field">
325
  <th valign="top" scope="row">
326
  <label for="dynamic_categories"><?php _e('Dynamic categories', 'content-egg'); ?></label>
@@ -345,7 +357,7 @@ use ContentEgg\application\components\ModuleManager;
345
  <p class="description"><?php _e('Post will not be published if no content for such number of modules.', 'content-egg'); ?></p>
346
  </td>
347
  </tr>
348
-
349
  <tr class="form-field">
350
  <th valign="top" scope="row">
351
  <label for="min_comment_count"><?php _e('Minimum reviews required', 'content-egg'); ?></label>
@@ -432,12 +444,12 @@ use ContentEgg\application\components\ModuleManager;
432
  <td>
433
  <div style="width: 50%;float:left;">
434
  <?php for ($i = 0; $i < count($item['custom_field_names']); $i++): ?>
435
- <input type="text" value="<?php echo esc_attr($item['custom_field_names'][$i]); ?>" name="item[custom_field_names][]" placeholder="<?php _e('Custom Field', 'content-egg'); ?> <?php echo $i + 1;?>" id="custom_fields" />
436
  <?php endfor; ?>
437
  </div>
438
  <div style="width: 50%;float:left;">
439
  <?php for ($i = 0; $i < count($item['custom_field_values']); $i++): ?>
440
- <input value="<?php echo esc_attr($item['custom_field_values'][$i]); ?>" type="text" name="item[custom_field_values][]" placeholder="<?php _e('Value', 'content-egg'); ?> <?php echo $i + 1;?>" />
441
  <?php endfor; ?>
442
  </div>
443
  <p class="description">
305
  <td>
306
  <?php
307
  $opt = array('name' => 'item[category]', 'id' => 'category', 'selected' => $item['category'], 'hide_empty' => false);
308
+ //\wp_dropdown_categories($opt);
309
+ // categs + product categs
310
+ $cat_args = array('taxonomy' => array('category', 'product_cat'), 'orderby' => 'name', 'order' => 'asc', 'hide_empty' => false);
311
+ $categories = \get_terms($cat_args);
 
 
312
  ?>
313
+
314
+ <select name="item[category]" id="category">
315
+ <?php if ($batch): ?>
316
+ <option value="-1" <?php \selected($item['category'], -1); ?>>[ <?php _e('Create Automatically', 'content-egg');?> ]</option>
317
+ <?php endif; ?>
318
+ <?php foreach ($categories as $category): ?>
319
+ <option value="<?php echo \esc_attr($category->term_id); ?>" <?php \selected($item['category'], $category->term_id); ?>>
320
+ <?php echo \esc_attr($category->name); ?>
321
+ <?php if ($category->taxonomy == 'product_cat'):?> [product]<?php endif; ?>
322
+ </option>
323
+ <?php endforeach; ?>
324
+ </select>
325
+
326
+
327
  <p class="description">
328
  <?php _e('Default category for posts.', 'content-egg'); ?>
329
  <?php if ($batch): ?>
332
  </p>
333
  </td>
334
  </tr>
335
+
336
  <tr class="form-field">
337
  <th valign="top" scope="row">
338
  <label for="dynamic_categories"><?php _e('Dynamic categories', 'content-egg'); ?></label>
357
  <p class="description"><?php _e('Post will not be published if no content for such number of modules.', 'content-egg'); ?></p>
358
  </td>
359
  </tr>
360
+
361
  <tr class="form-field">
362
  <th valign="top" scope="row">
363
  <label for="min_comment_count"><?php _e('Minimum reviews required', 'content-egg'); ?></label>
444
  <td>
445
  <div style="width: 50%;float:left;">
446
  <?php for ($i = 0; $i < count($item['custom_field_names']); $i++): ?>
447
+ <input type="text" value="<?php echo esc_attr($item['custom_field_names'][$i]); ?>" name="item[custom_field_names][]" placeholder="<?php _e('Custom Field', 'content-egg'); ?> <?php echo $i + 1; ?>" id="custom_fields" />
448
  <?php endfor; ?>
449
  </div>
450
  <div style="width: 50%;float:left;">
451
  <?php for ($i = 0; $i < count($item['custom_field_values']); $i++): ?>
452
+ <input value="<?php echo esc_attr($item['custom_field_values'][$i]); ?>" type="text" name="item[custom_field_values][]" placeholder="<?php _e('Value', 'content-egg'); ?> <?php echo $i + 1; ?>" />
453
  <?php endfor; ?>
454
  </div>
455
  <p class="description">
application/admin/views/_metabox_results.php CHANGED
@@ -1,3 +1,11 @@
 
 
 
 
 
 
 
 
1
  <div class="data_results" ng-if="models.<?php echo $module_id; ?>.added.length">
2
  <div ui-sortable="{ 'ui-floating': true }" ng-model="models.<?php echo $module_id; ?>.added" class="row">
3
  <div class="col-md-12 added_data" ng-repeat="data in models.<?php echo $module_id; ?>.added">
@@ -9,17 +17,22 @@
9
  <div ng-class="data.img ? 'col-md-9' : 'col-md-10'">
10
  <input type="text" placeholder="<?php _e('Title', 'content-egg'); ?>" ng-model="data.title" class="form-control" style="margin-bottom: 5px;">
11
  <textarea type="text" placeholder="<?php _e('Description', 'content-egg'); ?>" rows="1" ng-model="data.description" class="col-sm-12"></textarea>
 
 
 
 
 
12
  </div>
13
  <div class="col-md-2">
14
  <div><a title="Go to" href="{{data.url}}" target="_blank"><span ng-show="data.domain"><img src="https://www.google.com/s2/favicons?domain={{data.domain}}"> {{data.domain}}</span><span ng-hide="data.domain"><?php _e('Go to ', 'content-egg'); ?></span></a></div>
15
  <div style="padding:0xp;margin:0px;padding-top:10px;"><a style="color:#D03300;" ng-click="delete(data, '<?php echo $module_id; ?>')"><?php _e('Delete', 'content-egg'); ?></a></div>
16
  <div style="padding:0xp;margin:0px;">
17
  <?php /* <small class="text-muted" ng-show="data.ean"><br><?php _e('EAN:'); ?> {{data.ean}}</small> */ ?>
18
- <small class="text-muted" ng-show="data.last_update"><br><?php _e('Last update:'); ?> {{data.last_update * 1000 | date:'shortDate'}}</small>
19
  </div>
20
  </div>
21
  </div>
22
-
23
  </div>
24
  </div>
25
  </div>
1
+ <?php
2
+
3
+ use ContentEgg\application\components\ModuleManager;
4
+
5
+ $module = ModuleManager::factory($module_id);
6
+ $is_woo = (\get_post_type($GLOBALS['post']->ID) == 'product') ? true : false;
7
+
8
+ ?>
9
  <div class="data_results" ng-if="models.<?php echo $module_id; ?>.added.length">
10
  <div ui-sortable="{ 'ui-floating': true }" ng-model="models.<?php echo $module_id; ?>.added" class="row">
11
  <div class="col-md-12 added_data" ng-repeat="data in models.<?php echo $module_id; ?>.added">
17
  <div ng-class="data.img ? 'col-md-9' : 'col-md-10'">
18
  <input type="text" placeholder="<?php _e('Title', 'content-egg'); ?>" ng-model="data.title" class="form-control" style="margin-bottom: 5px;">
19
  <textarea type="text" placeholder="<?php _e('Description', 'content-egg'); ?>" rows="1" ng-model="data.description" class="col-sm-12"></textarea>
20
+ <?php if ($is_woo && $module->isAffiliateParser()): ?>
21
+ <label><input ng-true-value="'true'" type="checkbox" ng-model="data.woo_sync" name="woo_sync" ng-change="wooRadioChange(data.unique_id, 'woo_sync')"> <?php _e('Woo synchronization', 'content-egg'); ?></label>
22
+ &nbsp;&nbsp;&nbsp;
23
+ <label ng-show="data.features.length"><input ng-true-value="'true'" type="checkbox" ng-model="data.woo_attr" name="woo_attr" ng-change="wooRadioChange(data.unique_id, 'woo_attr')"> <?php _e('Woo attributes', 'content-egg'); ?> ({{data.features.length}})</label>
24
+ <?php endif; ?>
25
  </div>
26
  <div class="col-md-2">
27
  <div><a title="Go to" href="{{data.url}}" target="_blank"><span ng-show="data.domain"><img src="https://www.google.com/s2/favicons?domain={{data.domain}}"> {{data.domain}}</span><span ng-hide="data.domain"><?php _e('Go to ', 'content-egg'); ?></span></a></div>
28
  <div style="padding:0xp;margin:0px;padding-top:10px;"><a style="color:#D03300;" ng-click="delete(data, '<?php echo $module_id; ?>')"><?php _e('Delete', 'content-egg'); ?></a></div>
29
  <div style="padding:0xp;margin:0px;">
30
  <?php /* <small class="text-muted" ng-show="data.ean"><br><?php _e('EAN:'); ?> {{data.ean}}</small> */ ?>
31
+ <small class="text-muted" ng-show="data.last_update"><br><?php _e('Last update:'); ?> {{data.last_update * 1000| date:'shortDate'}}</small>
32
  </div>
33
  </div>
34
  </div>
35
+
36
  </div>
37
  </div>
38
  </div>
application/admin/views/_metabox_search_results.php CHANGED
@@ -9,12 +9,15 @@
9
  <p>
10
  <span ng-show="result.price"><b>{{result.currencyCode}}</b> <strike ng-show="result.priceOld">{{result.priceOld}}</strike> <b>{{result.price}}</b></span>
11
  <span ng-show="result.domain" class="text-muted">&nbsp;&nbsp;<img src="https://www.google.com/s2/favicons?domain={{result.domain}}"> {{result.domain}}</span>
12
- &nbsp;&nbsp;<small class="text-muted" ng-show="result.ean"><?php _e('EAN:'); ?> {{result.ean}}</small>
 
 
13
  </p>
14
  <div ng-show="result.code">
15
  <?php _e('Coupon code:', 'content-egg'); ?> <em>{{result.code}}</em>
16
  - <span ng-show="result.startDate">{{result.startDate * 1000|date:'mediumDate'}} - {{result.endDate * 1000|date:'mediumDate'}}</span>
17
  </div>
 
18
  </div>
19
  </div>
20
  </div>
9
  <p>
10
  <span ng-show="result.price"><b>{{result.currencyCode}}</b> <strike ng-show="result.priceOld">{{result.priceOld}}</strike> <b>{{result.price}}</b></span>
11
  <span ng-show="result.domain" class="text-muted">&nbsp;&nbsp;<img src="https://www.google.com/s2/favicons?domain={{result.domain}}"> {{result.domain}}</span>
12
+
13
+ <span ng-show="result.features.length">&nbsp;&nbsp;<small class="text-muted"><?php _e('Attributes:', 'content-egg'); ?> {{result.features.length}}</small></span>
14
+ <span ng-show="result.ean">&nbsp;&nbsp;<small class="text-muted"><?php _e('EAN:', 'content-egg'); ?> {{result.ean}}</small></span>
15
  </p>
16
  <div ng-show="result.code">
17
  <?php _e('Coupon code:', 'content-egg'); ?> <em>{{result.code}}</em>
18
  - <span ng-show="result.startDate">{{result.startDate * 1000|date:'mediumDate'}} - {{result.endDate * 1000|date:'mediumDate'}}</span>
19
  </div>
20
+
21
  </div>
22
  </div>
23
  </div>
application/admin/views/prefill.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
2
 
3
  use ContentEgg\application\components\ModuleManager;
 
4
  ?>
5
 
6
  <?php if (\ContentEgg\application\Plugin::isFree() || \ContentEgg\application\Plugin::isInactiveEnvato()): ?>
@@ -67,11 +68,55 @@ use ContentEgg\application\components\ModuleManager;
67
  <input id="minus_words" type="text" class="regular-text">
68
  <p class="description"><?php _e('Remove these words from keyword. You can set several minus words/phrases with commas.', 'content-egg'); ?></p>
69
  </td>
70
- </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
 
72
  </table>
73
 
74
  <div id="progressbar" name="progressbar"></div>
 
75
 
76
  <div>
77
  <br>
1
  <?php
2
 
3
  use ContentEgg\application\components\ModuleManager;
4
+ use ContentEgg\application\admin\GeneralConfig;
5
  ?>
6
 
7
  <?php if (\ContentEgg\application\Plugin::isFree() || \ContentEgg\application\Plugin::isInactiveEnvato()): ?>
68
  <input id="minus_words" type="text" class="regular-text">
69
  <p class="description"><?php _e('Remove these words from keyword. You can set several minus words/phrases with commas.', 'content-egg'); ?></p>
70
  </td>
71
+ </tr>
72
+
73
+ <tr>
74
+ <th scope="row"><label for="post_type"><?php _e('Post type', 'content-egg'); ?></label></th>
75
+ <td>
76
+ <select id="post_type" multiple="multiple">
77
+ <?php foreach (GeneralConfig::getInstance()->option('post_types') as $post_type): ?>
78
+ <option value="<?php echo \esc_attr($post_type); ?>" selected="selected"><?php echo \esc_attr($post_type); ?></option>
79
+ <?php endforeach; ?>
80
+ </select>
81
+ <p class="description"><?php _e('You can set all supported post types in General settings -> Post Types.', 'content-egg'); ?></p>
82
+ </td>
83
+ </tr>
84
+
85
+ <tr>
86
+ <th scope="row"><label for="post_status"><?php _e('Post status', 'content-egg'); ?></label></th>
87
+ <td>
88
+ <?php
89
+ $post_statuses = array_merge(get_post_statuses(), array('future' => __('Future')));
90
+ $selected_post_statuses = array('publish', 'future');
91
+ ?>
92
+ <select id="post_status" multiple="multiple" size="5">
93
+ <?php foreach ($post_statuses as $post_status_value => $post_status_name): ?>
94
+ <option value="<?php echo \esc_attr($post_status_value); ?>"
95
+ <?php if (in_array($post_status_value, $selected_post_statuses)): ?>selected="selected"<?php endif; ?>>
96
+ <?php echo \esc_attr($post_status_name); ?>
97
+ </option>
98
+ <?php endforeach; ?>
99
+ </select>
100
+ <p class="description"><?php _e('You can set all supported post types in General settings -> Post Types.', 'content-egg'); ?></p>
101
+ </td>
102
+ </tr>
103
+
104
+ <tr>
105
+ <th scope="row"><label for="custom_fields"><?php _e('Add custom fields', 'content-egg'); ?></label></th>
106
+ <td>
107
+ <?php for ($i = 0; $i < 5; $i++): ?>
108
+ <input type="text" name="custom_field_names[]" placeholder="<?php echo sprintf(__('Custom Field %d', 'content-egg'), $i + 1); ?>" id="custom_fields" class="regular-text" />
109
+ <input type="text" name="custom_field_values[]" placeholder="<?php echo sprintf(__('Value %d', 'content-egg'), $i + 1); ?>" class="regular-text" /><br>
110
+ <?php endfor; ?>
111
+ <?php $tags = '%KEYWORD%, %RANDOM(10,50)%, %PRODUCT.title%, %PRODUCT.price%, ...'; ?>
112
+ <p class="description"><?php echo sprintf(__('You can use tags: %s.', 'content-egg'), $tags); ?></p>
113
+ </td>
114
+ </tr>
115
 
116
  </table>
117
 
118
  <div id="progressbar" name="progressbar"></div>
119
+ <div><?php _e('Total posts', 'content-egg'); ?>: <b><span id="post_ids_total"></span></b></div>
120
 
121
  <div>
122
  <br>
application/admin/views/settings.php CHANGED
@@ -54,7 +54,8 @@
54
  <form action="options.php" method="POST">
55
  <?php settings_fields($page_slug); ?>
56
  <table class="form-table">
57
- <?php do_settings_fields($page_slug, 'default'); ?>
 
58
  </table>
59
  <?php submit_button(); ?>
60
  </form>
54
  <form action="options.php" method="POST">
55
  <?php settings_fields($page_slug); ?>
56
  <table class="form-table">
57
+ <?php //do_settings_fields($page_slug, 'default'); ?>
58
+ <?php do_settings_sections($page_slug); ?>
59
  </table>
60
  <?php submit_button(); ?>
61
  </form>
application/components/AffiliateParserModule.php CHANGED
@@ -36,7 +36,7 @@ abstract class AffiliateParserModule extends ParserModule {
36
  {
37
  $data[$key]['percentageSaved'] = 0;
38
  if (!isset($data[$key]['priceOld']))
39
- $data[$key]['priceOld'] = 0;
40
  if ($item['priceOld'] && $item['priceOld'] <= $item['price'])
41
  $data[$key]['priceOld'] = 0;
42
 
36
  {
37
  $data[$key]['percentageSaved'] = 0;
38
  if (!isset($data[$key]['priceOld']))
39
+ $data[$key]['priceOld'] = $item['priceOld'] = 0;
40
  if ($item['priceOld'] && $item['priceOld'] <= $item['price'])
41
  $data[$key]['priceOld'] = 0;
42
 
application/components/Config.php CHANGED
@@ -116,6 +116,8 @@ abstract class Config {
116
  // reinit options for later plugin binding
117
  $this->options = $this->options();
118
 
 
 
119
  foreach ($this->options as $id => $field)
120
  {
121
  if (empty($field['title']))
@@ -139,6 +141,19 @@ abstract class Config {
139
  $params['render_after'] = $field['render_after'];
140
  if (empty($field['section']))
141
  $field['section'] = 'default';
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  \add_settings_field(
143
  $id, $field['title'], $field['callback'], $this->page_slug, // menu slug
144
  $field['section'], $params
116
  // reinit options for later plugin binding
117
  $this->options = $this->options();
118
 
119
+ $sections = array();
120
+
121
  foreach ($this->options as $id => $field)
122
  {
123
  if (empty($field['title']))
141
  $params['render_after'] = $field['render_after'];
142
  if (empty($field['section']))
143
  $field['section'] = 'default';
144
+
145
+ // section
146
+ if (!isset($sections[$field['section']]))
147
+ {
148
+ if ($field['section'] == 'default')
149
+ $section_title = '';
150
+ else
151
+ $section_title = $field['section'];
152
+
153
+ \add_settings_section(sanitize_text_field($field['section']), $section_title, null, $this->page_slug);
154
+ $sections[$field['section']] = $field['section'];
155
+ }
156
+
157
  \add_settings_field(
158
  $id, $field['title'], $field['callback'], $this->page_slug, // menu slug
159
  $field['section'], $params
application/components/ContentManager.php CHANGED
@@ -25,11 +25,11 @@ class ContentManager {
25
 
26
  private static $_view_data = array();
27
 
28
- public static function saveData(array $data, $module_id, $post_id)
29
  {
30
  if (!$data)
31
  {
32
- self::deleteData($module_id, $post_id);
33
  return;
34
  }
35
 
@@ -69,7 +69,9 @@ class ContentManager {
69
  PriceAlert::getInstance()->sendAlerts($data, $module_id, $post_id);
70
  }
71
 
72
- \do_action('content_egg_save_data', $data, $module_id, $post_id);
 
 
73
  }
74
 
75
  public static function dataPresavePrepare(array $data, $module_id, $post_id)
@@ -87,19 +89,24 @@ class ContentManager {
87
  return $data;
88
  }
89
 
90
- public static function deleteData($module_id, $post_id)
91
  {
92
  $data = ContentManager::getData($post_id, $module_id);
93
  if (!$data)
 
 
 
94
  return;
 
95
 
96
  \delete_post_meta($post_id, self::META_PREFIX_DATA . $module_id);
97
  \delete_post_meta($post_id, self::META_PREFIX_LAST_BYKEYWORD_UPDATE . $module_id);
98
  \delete_post_meta($post_id, self::META_PREFIX_LAST_ITEMS_UPDATE . $module_id);
99
 
100
  self::clearData($data);
 
101
 
102
- \do_action('content_egg_save_data', array(), $module_id, $post_id);
103
  }
104
 
105
  private static function clearData($data)
@@ -196,7 +203,30 @@ class ContentManager {
196
  $data = self::dataPreviewPrepare($data, $module_id, $post_id, $params);
197
  self::$_view_data[$data_id] = $data;
198
  }
199
- return self::$_view_data[$data_id];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
  }
201
 
202
  public static function dataPreviewPrepare(array $data, $module_id, $post_id, $params = array())
@@ -215,13 +245,6 @@ class ContentManager {
215
  elseif (empty($d['logo']) && isset($d['extra']['logo']))
216
  $data[$key]['logo'] = $d['extra']['logo'];
217
 
218
- // locale fix...
219
- if (!empty($params['locale']))
220
- {
221
- if (isset($d['extra']['locale']) && strtolower($d['extra']['locale']) != strtolower($params['locale']))
222
- unset($data[$key]);
223
- }
224
-
225
  // https fix for local images
226
  if ($is_ssl && strstr($d['img'], $http_home_url))
227
  {
@@ -250,7 +273,7 @@ class ContentManager {
250
  $keyword = \get_post_meta($post_id, ContentManager::META_PREFIX_KEYWORD . $module_id, true);
251
  if (!$keyword)
252
  return;
253
-
254
  $updateParams = \get_post_meta($post_id, ContentManager::META_PREFIX_UPDATE_PARAMS . $module_id, true);
255
 
256
  $module = ModuleManager::getInstance()->factory($module_id);
@@ -282,7 +305,7 @@ class ContentManager {
282
  return;
283
 
284
  $items = ContentManager::getData($post_id, $module_id);
285
-
286
  if (!$items)
287
  return;
288
 
@@ -335,7 +358,7 @@ class ContentManager {
335
  {
336
  if (is_object($item))
337
  $item = ContentManager::object2Array($item);
338
-
339
  // AE modules
340
  if (!empty($item['extra']['comments']))
341
  {
@@ -415,14 +438,19 @@ class ContentManager {
415
  'comment_approved' => 1,
416
  );
417
 
418
- $is_rehub_theme = (basename(get_template_directory()) == 'rehub') ? true : false;
419
- $rehub_post_type = get_post_meta($post_id, 'rehub_framework_post_type', true);
420
-
421
  if ($rehub_post_type && $rehub_post_type == 'review')
422
  $is_review_post_type = true;
423
  else
424
  $is_review_post_type = false;
425
 
 
 
 
 
 
426
  foreach ($normalized_comments as $comment)
427
  {
428
  $comment_pros = '';
@@ -464,7 +492,48 @@ class ContentManager {
464
  if (function_exists('add_comment_rates'))
465
  \add_comment_rates($comment_id);
466
  }
 
 
 
 
 
 
 
 
 
 
 
467
  }
468
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
469
 
470
  }
25
 
26
  private static $_view_data = array();
27
 
28
+ public static function saveData(array $data, $module_id, $post_id, $is_last_iteration = true)
29
  {
30
  if (!$data)
31
  {
32
+ self::deleteData($module_id, $post_id, $is_last_iteration);
33
  return;
34
  }
35
 
69
  PriceAlert::getInstance()->sendAlerts($data, $module_id, $post_id);
70
  }
71
 
72
+ self::resetViewDataCache($module_id, $post_id);
73
+
74
+ \do_action('content_egg_save_data', $data, $module_id, $post_id, $is_last_iteration);
75
  }
76
 
77
  public static function dataPresavePrepare(array $data, $module_id, $post_id)
89
  return $data;
90
  }
91
 
92
+ public static function deleteData($module_id, $post_id, $is_last_iteration = true)
93
  {
94
  $data = ContentManager::getData($post_id, $module_id);
95
  if (!$data)
96
+ {
97
+ // last chance to fire last_iteration hook
98
+ \do_action('content_egg_save_data', array(), $module_id, $post_id, $is_last_iteration);
99
  return;
100
+ }
101
 
102
  \delete_post_meta($post_id, self::META_PREFIX_DATA . $module_id);
103
  \delete_post_meta($post_id, self::META_PREFIX_LAST_BYKEYWORD_UPDATE . $module_id);
104
  \delete_post_meta($post_id, self::META_PREFIX_LAST_ITEMS_UPDATE . $module_id);
105
 
106
  self::clearData($data);
107
+ self::resetViewDataCache($module_id, $post_id);
108
 
109
+ \do_action('content_egg_save_data', array(), $module_id, $post_id, $is_last_iteration);
110
  }
111
 
112
  private static function clearData($data)
203
  $data = self::dataPreviewPrepare($data, $module_id, $post_id, $params);
204
  self::$_view_data[$data_id] = $data;
205
  }
206
+
207
+ // locale fix...
208
+ $data = self::$_view_data[$data_id];
209
+ if (!empty($params['locale']))
210
+ {
211
+ foreach ($data as $key => $d)
212
+ {
213
+ if (isset($d['extra']['locale']) && strtolower($d['extra']['locale']) != strtolower($params['locale']))
214
+ unset($data[$key]);
215
+ }
216
+ }
217
+
218
+ return $data;
219
+ }
220
+
221
+ public static function resetViewDataCache($module_id = null, $post_id = null)
222
+ {
223
+ if ($module_id && $post_id)
224
+ {
225
+ $data_id = $post_id . '-' . $module_id;
226
+ if (isset(self::$_view_data[$data_id]))
227
+ unset(self::$_view_data[$data_id]);
228
+ } else
229
+ self::$_view_data = array();
230
  }
231
 
232
  public static function dataPreviewPrepare(array $data, $module_id, $post_id, $params = array())
245
  elseif (empty($d['logo']) && isset($d['extra']['logo']))
246
  $data[$key]['logo'] = $d['extra']['logo'];
247
 
 
 
 
 
 
 
 
248
  // https fix for local images
249
  if ($is_ssl && strstr($d['img'], $http_home_url))
250
  {
273
  $keyword = \get_post_meta($post_id, ContentManager::META_PREFIX_KEYWORD . $module_id, true);
274
  if (!$keyword)
275
  return;
276
+
277
  $updateParams = \get_post_meta($post_id, ContentManager::META_PREFIX_UPDATE_PARAMS . $module_id, true);
278
 
279
  $module = ModuleManager::getInstance()->factory($module_id);
305
  return;
306
 
307
  $items = ContentManager::getData($post_id, $module_id);
308
+
309
  if (!$items)
310
  return;
311
 
358
  {
359
  if (is_object($item))
360
  $item = ContentManager::object2Array($item);
361
+
362
  // AE modules
363
  if (!empty($item['extra']['comments']))
364
  {
438
  'comment_approved' => 1,
439
  );
440
 
441
+ $is_rehub_theme = (basename(\get_template_directory()) == 'rehub') ? true : false;
442
+ $rehub_post_type = \get_post_meta($post_id, 'rehub_framework_post_type', true);
443
+
444
  if ($rehub_post_type && $rehub_post_type == 'review')
445
  $is_review_post_type = true;
446
  else
447
  $is_review_post_type = false;
448
 
449
+ if (\get_post_type($post_id) == 'product')
450
+ $is_woo_product = true;
451
+ else
452
+ $is_woo_product = false;
453
+
454
  foreach ($normalized_comments as $comment)
455
  {
456
  $comment_pros = '';
492
  if (function_exists('add_comment_rates'))
493
  \add_comment_rates($comment_id);
494
  }
495
+
496
+ if ($is_woo_product && !empty($comment['rating']) && $comment['rating'] > 0 && $comment['rating'] <= 5)
497
+ {
498
+ \add_comment_meta($comment_id, 'rating', $comment['rating'], true);
499
+ }
500
+ }
501
+
502
+ if ($is_woo_product && class_exists('\WC_Comments'))
503
+ {
504
+ // Ensure product average rating and review count is kept up to date.
505
+ \WC_Comments::clear_transients($post_id);
506
  }
507
  }
508
+
509
+ public static function getMainProduct($modules_data, $main_product_selector = 'min_price')
510
+ {
511
+ $all_items = array();
512
+ foreach ($modules_data as $module_id => $items)
513
+ {
514
+ foreach ($items as $item)
515
+ {
516
+ $item = ArrayHelper::object2Array($item);
517
+ $item['module_id'] = $module_id;
518
+ /*
519
+ if (empty($item['price']))
520
+ continue;
521
+ *
522
+ */
523
+ $all_items[] = $item;
524
+ }
525
+ }
526
+
527
+ if (!$all_items)
528
+ return null;
529
+
530
+ if ($main_product_selector == 'random')
531
+ return $all_items[array_rand($all_items)];
532
+
533
+ if ($main_product_selector == 'max_price')
534
+ return $all_items[ArrayHelper::getMaxKeyAssoc($all_items, 'price', true)];
535
+ else
536
+ return $all_items[ArrayHelper::getMinKeyAssoc($all_items, 'price', true)];
537
+ }
538
 
539
  }
application/components/ContentProduct.php CHANGED
@@ -7,7 +7,7 @@ namespace ContentEgg\application\components;
7
  *
8
  * @author keywordrush.com <support@keywordrush.com>
9
  * @link http://www.keywordrush.com/
10
- * @copyright Copyright &copy; 2015 keywordrush.com
11
  */
12
  class ContentProduct extends Content {
13
 
@@ -30,5 +30,8 @@ class ContentProduct extends Content {
30
  public $upc;
31
  public $sku;
32
  public $isbn;
 
 
 
33
 
34
  }
7
  *
8
  * @author keywordrush.com <support@keywordrush.com>
9
  * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2017 keywordrush.com
11
  */
12
  class ContentProduct extends Content {
13
 
30
  public $upc;
31
  public $sku;
32
  public $isbn;
33
+ public $woo_sync;
34
+ public $woo_attr;
35
+ public $features = array();
36
 
37
  }
application/components/EggAutoblogger.php DELETED
@@ -1,86 +0,0 @@
1
- <?php
2
-
3
- namespace ContentEgg\application\components;
4
-
5
- /**
6
- * EggAutoblogger class file
7
- *
8
- * @author keywordrush.com <support@keywordrush.com>
9
- * @link http://www.keywordrush.com/
10
- * @copyright Copyright &copy; 2015 keywordrush.com
11
- */
12
- class EggAutoblogger {
13
-
14
- //private $keyword;
15
- private $autoblog;
16
-
17
- public function __construct(array $autoblog)
18
- {
19
- $this->autoblog = $autoblog;
20
- }
21
-
22
- /*
23
- public function setKeyword($keyword)
24
- {
25
- $this->keyword = $keyword;
26
- }
27
-
28
- public function getKeyword()
29
- {
30
- return $this->keyword;
31
- }
32
- *
33
- */
34
-
35
- public function createPost($keyword)
36
- {
37
- //$this->setKeyword($keyword);
38
- //0. Отметить задание автоблоггинга как запущеное
39
-
40
- $modules_data = array();
41
- foreach (ModuleManager::getInstance()->getParserModules(true) as $module)
42
- {
43
-
44
- try
45
- {
46
- $data = $module->doRequest($keyword, array(), true);
47
- } catch (\Exception $e)
48
- {
49
- // error
50
- continue;
51
- }
52
- foreach ($data as $i => $d)
53
- {
54
- $data[$i]->keyword = $keyword;
55
- }
56
- $modules_data[$module->getId()] = $data;
57
- }
58
-
59
- // @todo: проверки обязательных плагинов и т.д.
60
- // create post
61
- $post = array(
62
- 'ID' => null,
63
- 'post_title' => $keyword,
64
- 'post_content' => 'content',
65
- 'post_status' => 'publish',
66
- 'post_author' => $this->autoblog['user_id'],
67
- 'post_category' => array($this->autoblog['category']),
68
- );
69
-
70
- $post_id = \wp_insert_post($post);
71
- if (!$post_id)
72
- return false;
73
-
74
- // \do_action('content_egg_autoblog_create_post', $post_id);
75
- // save modules data
76
- foreach ($modules_data as $module_id => $data)
77
- {
78
- ContentManager::saveData($data, $module_id, $post_id);
79
- }
80
-
81
- //@todo: пересохранить заданеи автоблоггинга
82
-
83
- return $post_id;
84
- }
85
-
86
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
application/components/FeaturedImage.php CHANGED
@@ -73,26 +73,14 @@ class FeaturedImage {
73
  $img_file = self::getImgFile($d);
74
  if (!$img_file)
75
  continue;
76
- $filetype = \wp_check_filetype(basename($img_file), null);
77
- $attachment = array(
78
- 'guid' => $img_file,
79
- 'post_mime_type' => $filetype['type'],
80
- 'post_title' => $d['title'],
81
- 'post_content' => '',
82
- 'post_status' => 'inherit'
83
- );
84
- $attach_id = \wp_insert_attachment($attachment, $img_file, $post_id);
85
- $attach_data = \wp_generate_attachment_metadata($attach_id, $img_file);
86
- \wp_update_attachment_metadata($attach_id, $attach_data);
87
- \set_post_thumbnail($post_id, $attach_id);
88
-
89
- return true;
90
  } //data foreach
91
 
92
  return false;
93
  }
94
 
95
- private static function getImgFile($item)
96
  {
97
  if (empty($item['img']))
98
  return false;
@@ -126,4 +114,20 @@ class FeaturedImage {
126
  return $img_file;
127
  }
128
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129
  }
73
  $img_file = self::getImgFile($d);
74
  if (!$img_file)
75
  continue;
76
+
77
+ return self::attachThumbnail($img_file, $post_id, $d['title']);
 
 
 
 
 
 
 
 
 
 
 
 
78
  } //data foreach
79
 
80
  return false;
81
  }
82
 
83
+ public static function getImgFile($item)
84
  {
85
  if (empty($item['img']))
86
  return false;
114
  return $img_file;
115
  }
116
 
117
+ public static function attachThumbnail($img_file, $post_id, $title = '')
118
+ {
119
+ $filetype = \wp_check_filetype(basename($img_file), null);
120
+ $attachment = array(
121
+ 'guid' => $img_file,
122
+ 'post_mime_type' => $filetype['type'],
123
+ 'post_title' => $title,
124
+ 'post_content' => '',
125
+ 'post_status' => 'inherit'
126
+ );
127
+ $attach_id = \wp_insert_attachment($attachment, $img_file, $post_id);
128
+ $attach_data = \wp_generate_attachment_metadata($attach_id, $img_file);
129
+ \wp_update_attachment_metadata($attach_id, $attach_data);
130
+ return \set_post_thumbnail($post_id, $attach_id);
131
+ }
132
+
133
  }
application/components/LinkHandler.php CHANGED
@@ -28,23 +28,29 @@ class LinkHandler {
28
  {
29
  if (!$deeplink)
30
  {
31
- return $url;
32
  } elseif (strstr($deeplink, '{{') && strstr($deeplink, '}}'))
33
  {
34
- // teplate deeplink
35
- return self::getUrlTemplate($url, $deeplink);
36
  } elseif (!preg_match('/^https?:\/\//i', $deeplink))
37
  {
38
  // url with tail
39
- return self::getUrlWithTail($url, $deeplink);
40
  } else
41
  {
42
  // deeplink
43
  // @todo: subid
44
  //if ($subid)
45
  //$deeplink = Cpa::deeplinkSetSubid($deeplink, $subid);
46
- return $deeplink . urlencode($url);
47
  }
 
 
 
 
 
 
48
  }
49
 
50
  public static function getUrlWithTail($url, $tail)
28
  {
29
  if (!$deeplink)
30
  {
31
+ $result = $url;
32
  } elseif (strstr($deeplink, '{{') && strstr($deeplink, '}}'))
33
  {
34
+ // template deeplink
35
+ $result = self::getUrlTemplate($url, $deeplink);
36
  } elseif (!preg_match('/^https?:\/\//i', $deeplink))
37
  {
38
  // url with tail
39
+ $result = self::getUrlWithTail($url, $deeplink);
40
  } else
41
  {
42
  // deeplink
43
  // @todo: subid
44
  //if ($subid)
45
  //$deeplink = Cpa::deeplinkSetSubid($deeplink, $subid);
46
+ $result = $deeplink . urlencode($url);
47
  }
48
+ if ($subid)
49
+ {
50
+ $result = self::getUrlWithTail($result, $subid);
51
+ }
52
+
53
+ return $result;
54
  }
55
 
56
  public static function getUrlWithTail($url, $tail)
application/components/ModuleManager.php CHANGED
@@ -54,10 +54,10 @@ class ModuleManager {
54
  public function highlightAdminMenu($parent_file)
55
  {
56
  global $plugin_page;
57
-
58
  if (substr($plugin_page, 0, strlen(Plugin::slug())) !== Plugin::slug())
59
  return $parent_file;
60
-
61
  if (!$parent_file)
62
  $plugin_page = Plugin::slug;
63
  return $parent_file;
@@ -82,14 +82,13 @@ class ModuleManager {
82
  // create module
83
  self::factory($module_id);
84
  }
85
-
86
  // fill active modules
87
  foreach (self::$modules as $module)
88
  {
89
  if ($module->isActive())
90
  self::$active_modules[$module->getId()] = $module;
91
  }
92
-
93
  }
94
 
95
  private function scanForModules($path = null)
@@ -339,4 +338,16 @@ class ModuleManager {
339
  }
340
  return $result;
341
  }
 
 
 
 
 
 
 
 
 
 
 
 
342
  }
54
  public function highlightAdminMenu($parent_file)
55
  {
56
  global $plugin_page;
57
+
58
  if (substr($plugin_page, 0, strlen(Plugin::slug())) !== Plugin::slug())
59
  return $parent_file;
60
+
61
  if (!$parent_file)
62
  $plugin_page = Plugin::slug;
63
  return $parent_file;
82
  // create module
83
  self::factory($module_id);
84
  }
85
+
86
  // fill active modules
87
  foreach (self::$modules as $module)
88
  {
89
  if ($module->isActive())
90
  self::$active_modules[$module->getId()] = $module;
91
  }
 
92
  }
93
 
94
  private function scanForModules($path = null)
338
  }
339
  return $result;
340
  }
341
+
342
+ public function getAffiliteModulesList($only_active = true)
343
+ {
344
+ $results = array();
345
+ $modules = ModuleManager::getInstance()->getAffiliateParsers($only_active);
346
+ foreach ($modules as $module_id => $module)
347
+ {
348
+ $results[$module_id] = $module->getName();
349
+ }
350
+ return $results;
351
+ }
352
+
353
  }
application/helpers/CurrencyHelper.php CHANGED
@@ -214,14 +214,13 @@ class CurrencyHelper {
214
  'name' => 'Mexican peso',
215
  ),
216
  'MDL' => array(
217
- 'currency_symbol' => 'MDL',
218
- 'currency_pos' => 'right',
219
  'thousand_sep' => ',',
220
  'decimal_sep' => '.',
221
  'num_decimals' => 2,
222
  'name' => 'Moldovan leu',
223
  ),
224
-
225
  );
226
  }
227
 
@@ -306,4 +305,36 @@ class CurrencyHelper {
306
  return array_keys(self::currencies());
307
  }
308
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
309
  }
214
  'name' => 'Mexican peso',
215
  ),
216
  'MDL' => array(
217
+ 'currency_symbol' => 'lei',
218
+ 'currency_pos' => 'right_space',
219
  'thousand_sep' => ',',
220
  'decimal_sep' => '.',
221
  'num_decimals' => 2,
222
  'name' => 'Moldovan leu',
223
  ),
 
224
  );
225
  }
226
 
305
  return array_keys(self::currencies());
306
  }
307
 
308
+ public static function queryCurrencyRate($from, $to)
309
+ {
310
+ $yql_base_url = "http://query.yahooapis.com/v1/public/yql";
311
+ $yql_query = 'select * from yahoo.finance.xchange where pair in ("' . $from . $to . '")';
312
+ $yql_query_url = $yql_base_url . "?q=" . urlencode($yql_query);
313
+ $yql_query_url .= "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
314
+
315
+ $response = \wp_remote_get($yql_query_url);
316
+ if (\is_wp_error($response))
317
+ return 0;
318
+
319
+ if (!$result = json_decode(\wp_remote_retrieve_body($response), true))
320
+ return 0;
321
+
322
+ if (!isset($result['query']['results']['rate']['Rate']))
323
+ return 0;
324
+
325
+ return (float) $result['query']['results']['rate']['Rate'];
326
+ }
327
+
328
+ public static function getCurrencyRate($from, $to)
329
+ {
330
+ $transient_name = 'currency-rate-' . $from . $to;
331
+ $rate = \get_transient($transient_name);
332
+ if ($rate === false)
333
+ {
334
+ $rate = self::queryCurrencyRate($from, $to);
335
+ \set_transient($transient_name, $rate, 6 * 3600);
336
+ }
337
+ return $rate;
338
+ }
339
+
340
  }
application/helpers/FileHelper.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\helpers;
4
+
5
+ /**
6
+ * TextHelper class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2017 keywordrush.com
11
+ */
12
+ class FileHelper {
13
+
14
+ public static function array2Csv(array $array)
15
+ {
16
+ if (ob_get_length() > 0)
17
+ ob_clean();
18
+
19
+ if (!$array)
20
+ return '';
21
+ ob_start();
22
+ $df = fopen("php://output", 'w');
23
+ fputcsv($df, array_keys(reset($array)));
24
+ foreach ($array as $row)
25
+ {
26
+ fputcsv($df, $row);
27
+ }
28
+ fclose($df);
29
+ return ob_get_clean();
30
+ }
31
+
32
+ public static function sendDownloadHeaders($filename)
33
+ {
34
+ $now = gmdate("D, d M Y H:i:s");
35
+ header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
36
+ header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
37
+ header("Last-Modified: {$now} GMT");
38
+
39
+ header("Content-Type: application/force-download");
40
+ header("Content-Type: application/octet-stream");
41
+ header("Content-Type: application/download");
42
+
43
+ header("Content-Disposition: attachment;filename={$filename}");
44
+ header("Content-Transfer-Encoding: binary");
45
+ }
46
+
47
+ }
application/helpers/ImageHelper.php CHANGED
@@ -39,7 +39,11 @@ class ImageHelper {
39
  if ($file_ext === null)
40
  {
41
  if ($ext = pathinfo(basename($img_uri), PATHINFO_EXTENSION))
42
- $file_ext = $ext;
 
 
 
 
43
  else
44
  {
45
  $headers = \wp_remote_retrieve_headers($response);
39
  if ($file_ext === null)
40
  {
41
  if ($ext = pathinfo(basename($img_uri), PATHINFO_EXTENSION))
42
+ {
43
+ // image url params
44
+ $ext_parts = explode('?', $ext);
45
+ $file_ext = $ext_parts[0];
46
+ }
47
  else
48
  {
49
  $headers = \wp_remote_retrieve_headers($response);
application/helpers/TemplateHelper.php CHANGED
@@ -168,7 +168,7 @@ class TemplateHelper {
168
 
169
  public static function splitAttributeName($attribute)
170
  {
171
- return trim(preg_replace('/([A-Z])/', ' $1', $attribute));
172
  }
173
 
174
  public static function getAmazonLink(array $itemLinks, $description)
@@ -193,6 +193,28 @@ class TemplateHelper {
193
  $res = time();
194
  return $res;
195
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
 
197
  public static function getLastUpdateFormatted($module_id, $post_id = null, $time = true)
198
  {
168
 
169
  public static function splitAttributeName($attribute)
170
  {
171
+ return trim(preg_replace('/([A-Z])([a-z])/', ' $1$2', $attribute));
172
  }
173
 
174
  public static function getAmazonLink(array $itemLinks, $description)
193
  $res = time();
194
  return $res;
195
  }
196
+
197
+
198
+ public static function getLastUpdateFormattedAmazon(array $data, $time = true)
199
+ {
200
+ if (!isset($data['Amazon']))
201
+ return false;
202
+
203
+ $item = current($data['Amazon']);
204
+ if (empty($item['last_update']))
205
+ return false;
206
+
207
+ $last_update = $item['last_update'];
208
+
209
+ $format = \get_option('date_format');
210
+ if ($time)
211
+ $format .= ' ' . \get_option('time_format');
212
+
213
+ // last update date stored in gmt, convert into local time
214
+ $last_update = strtotime(\get_date_from_gmt(date('Y-m-d H:i:s', $last_update)));
215
+
216
+ return \date_i18n($format, $last_update);
217
+ }
218
 
219
  public static function getLastUpdateFormatted($module_id, $post_id = null, $time = true)
220
  {
application/helpers/TextHelper.php CHANGED
@@ -405,20 +405,44 @@ class TextHelper {
405
 
406
  public static function getHostName($url)
407
  {
 
408
  return TextHelper::getDomainWithoutSubdomain(strtolower(str_ireplace('www.', '', parse_url($url, PHP_URL_HOST))));
409
  }
410
 
411
- public static function parseDomain($url, $go_param)
 
 
 
 
 
412
  {
413
  if (!$query = parse_url($url, PHP_URL_QUERY))
414
  return '';
415
  parse_str($query, $arr);
416
  if (isset($arr[$go_param]))
417
- return TextHelper::getHostName($arr[$go_param]);
418
  else
419
  return '';
420
  }
421
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
422
  public static function getDomainWithoutSubdomain($domain)
423
  {
424
  if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs))
@@ -435,6 +459,11 @@ class TextHelper {
435
  return $arr[array_rand($arr)];
436
  }
437
 
 
 
 
 
 
438
  /**
439
  * Verify a correct EAN13 structure
440
  */
@@ -481,4 +510,25 @@ class TextHelper {
481
  return $rating;
482
  }
483
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
484
  }
405
 
406
  public static function getHostName($url)
407
  {
408
+ $url = trim($url);
409
  return TextHelper::getDomainWithoutSubdomain(strtolower(str_ireplace('www.', '', parse_url($url, PHP_URL_HOST))));
410
  }
411
 
412
+ public static function isValidDomainName($domain)
413
+ {
414
+ return preg_match('/^(?!\-)(?:[a-zA-Z\d\-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$/', $domain);
415
+ }
416
+
417
+ public static function parseOriginalUrl($url, $go_param)
418
  {
419
  if (!$query = parse_url($url, PHP_URL_QUERY))
420
  return '';
421
  parse_str($query, $arr);
422
  if (isset($arr[$go_param]))
423
+ return $arr[$go_param];
424
  else
425
  return '';
426
  }
427
 
428
+ public static function parseDomain($url, $go_param)
429
+ {
430
+ if (!$url = TextHelper::parseOriginalUrl($url, $go_param))
431
+ return '';
432
+ return TextHelper::getHostName($url);
433
+
434
+ /*
435
+ if (!$query = parse_url($url, PHP_URL_QUERY))
436
+ return '';
437
+ parse_str($query, $arr);
438
+ if (isset($arr[$go_param]))
439
+ return TextHelper::getHostName($arr[$go_param]);
440
+ else
441
+ return '';
442
+ *
443
+ */
444
+ }
445
+
446
  public static function getDomainWithoutSubdomain($domain)
447
  {
448
  if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs))
459
  return $arr[array_rand($arr)];
460
  }
461
 
462
+ public static function getArrayFromCommaList($str)
463
+ {
464
+ return explode(",", TextHelper::commaList($str));
465
+ }
466
+
467
  /**
468
  * Verify a correct EAN13 structure
469
  */
510
  return $rating;
511
  }
512
 
513
+ public static function sluggable($string)
514
+ {
515
+ $cyrylicFrom = array('Є', 'І', 'Ѓ', 'і', 'є', 'ѓ', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
516
+ $cyrylicTo = array('YE', 'I', 'G', 'i', 'ye', 'g', 'A', 'B', 'V', 'G', 'D', 'E', 'YO', 'ZH', 'Z', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'X', 'C', 'CH', 'SH', 'SHH', '', 'Y', '', 'E', 'YU', 'YA', 'a', 'b', 'v', 'g', 'd', 'e', 'yo', 'zh', 'z', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'x', 'c', 'ch', 'sh', 'shh', '', 'y', '', 'e', 'yu', 'ya');
517
+ $from = array("Á", "À", "Â", "Ä", "Ă", "Ā", "Ã", "Å", "Ą", "Æ", "Ć", "Ċ", "Ĉ", "Č", "Ç", "Ď", "Đ", "Ð", "É", "È", "Ė", "Ê", "Ë", "Ě", "Ē", "Ę", "Ə", "Ġ", "Ĝ", "Ğ", "Ģ", "á", "à", "â", "ä", "ă", "ā", "ã", "å", "ą", "æ", "ć", "ċ", "ĉ", "č", "ç", "ď", "đ", "ð", "é", "è", "ė", "ê", "ë", "ě", "ē", "ę", "ə", "ġ", "ĝ", "ğ", "ģ", "Ĥ", "Ħ", "I", "Í", "Ì", "İ", "Î", "Ï", "Ī", "Į", "IJ", "Ĵ", "Ķ", "Ļ", "Ł", "Ń", "Ň", "Ñ", "Ņ", "Ó", "Ò", "Ô", "Ö", "Õ", "Ő", "Ø", "Ơ", "Œ", "ĥ", "ħ", "ı", "í", "ì", "i", "î", "ï", "ī", "į", "ij", "ĵ", "ķ", "ļ", "ł", "ń", "ň", "ñ", "ņ", "ó", "ò", "ô", "ö", "õ", "ő", "ø", "ơ", "œ", "Ŕ", "Ř", "Ś", "Ŝ", "Š", "Ş", "Ť", "Ţ", "Þ", "Ú", "Ù", "Û", "Ü", "Ŭ", "Ū", "Ů", "Ų", "Ű", "Ư", "Ŵ", "Ý", "Ŷ", "Ÿ", "Ź", "Ż", "Ž", "ŕ", "ř", "ś", "ŝ", "š", "ş", "ß", "ť", "ţ", "þ", "ú", "ù", "û", "ü", "ŭ", "ū", "ů", "ų", "ű", "ư", "ŵ", "ý", "ŷ", "ÿ", "ź", "ż", "ž");
518
+ $to = array("A", "A", "A", "A", "A", "A", "A", "A", "A", "AE", "C", "C", "C", "C", "C", "D", "D", "D", "E", "E", "E", "E", "E", "E", "E", "E", "G", "G", "G", "G", "G", "a", "a", "a", "a", "a", "a", "a", "a", "a", "ae", "c", "c", "c", "c", "c", "d", "d", "d", "e", "e", "e", "e", "e", "e", "e", "e", "g", "g", "g", "g", "g", "H", "H", "I", "I", "I", "I", "I", "I", "I", "I", "IJ", "J", "K", "L", "L", "N", "N", "N", "N", "O", "O", "O", "O", "O", "O", "O", "O", "CE", "h", "h", "i", "i", "i", "i", "i", "i", "i", "i", "ij", "j", "k", "l", "l", "n", "n", "n", "n", "o", "o", "o", "o", "o", "o", "o", "o", "o", "R", "R", "S", "S", "S", "S", "T", "T", "T", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "W", "Y", "Y", "Y", "Z", "Z", "Z", "r", "r", "s", "s", "s", "s", "B", "t", "t", "b", "u", "u", "u", "u", "u", "u", "u", "u", "u", "u", "w", "y", "y", "y", "z", "z", "z");
519
+ $from = array_merge($from, $cyrylicFrom);
520
+ $to = array_merge($to, $cyrylicTo);
521
+ $string = str_replace($from, $to, $string);
522
+
523
+ if (function_exists('iconv'))
524
+ {
525
+ $string = iconv('UTF-8', 'UTF-8//TRANSLIT//IGNORE', $string);
526
+ }
527
+ $string = preg_replace("/[^A-Za-z0-9'_\-\.]/", '-', $string);
528
+ $string = preg_replace('/\-+/', '-', $string);
529
+ $string = preg_replace('/^-+/', '', $string);
530
+ $string = preg_replace('/-+$/', '', $string);
531
+ return $string;
532
+ }
533
+
534
  }
application/models/AutoblogModel.php CHANGED
@@ -7,7 +7,7 @@ use ContentEgg\application\components\ContentManager;
7
  use ContentEgg\application\helpers\TextHelper;
8
  use ContentEgg\application\components\FeaturedImage;
9
  use ContentEgg\application\helpers\TemplateHelper;
10
- use ContentEgg\application\helpers\ArrayHelper;
11
 
12
  /**
13
  * AutoblogModel class file
@@ -101,7 +101,7 @@ class AutoblogModel extends Model {
101
 
102
  if (!$item['id'])
103
  {
104
- $item['id'] = 0;
105
  $item['create_date'] = \current_time('mysql');
106
  $this->getDb()->insert($this->tableName(), $item);
107
  return $this->getDb()->insert_id;
@@ -167,7 +167,6 @@ class AutoblogModel extends Model {
167
  if ($post_id)
168
  {
169
  $autoblog['post_count'] ++;
170
- \do_action('cegg_autoblog_post_create', $post_id);
171
  }
172
  $autoblog['keywords'][$keyword_id] = self::markKeywordInactive($keyword);
173
  $keyword_id = self::getNextKeywordId($autoblog['keywords']);
@@ -294,13 +293,30 @@ class AutoblogModel extends Model {
294
  }
295
 
296
  // main product
297
- $main_product = $this->getMainProduct($modules_data, $autoblog['main_product']);
298
 
299
- $title = $this->buildTemplate($autoblog['template_title'], $modules_data, $keyword, $module_keywords, $main_product);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
300
  $title = \wp_strip_all_tags($title);
301
  if (!$title)
302
  $title = $keyword;
303
- $body = $this->buildTemplate($autoblog['template_body'], $modules_data, $keyword, $module_keywords, $main_product);
304
  if ((bool) $autoblog['post_status'])
305
  $post_status = 'publish';
306
  else
@@ -316,7 +332,7 @@ class AutoblogModel extends Model {
316
  if (\is_serialized($cf_value))
317
  $cf_value = @unserialize($cf_value);
318
  else
319
- $cf_value = $this->buildTemplate($cf_value, $modules_data, $keyword, $module_keywords, $main_product);
320
 
321
  $meta_input[$custom_field] = $cf_value;
322
  }
@@ -324,7 +340,7 @@ class AutoblogModel extends Model {
324
 
325
  //tags
326
  if ($autoblog['tags'])
327
- $tags_input = $this->buildTemplate($autoblog['tags'], $modules_data, $keyword, $module_keywords, $main_product);
328
  else
329
  $tags_input = '';
330
 
@@ -339,6 +355,7 @@ class AutoblogModel extends Model {
339
  $categ_id = $autoblog['category'];
340
  if (!$categ_id)
341
  $categ_id = $autoblog['category'];
 
342
 
343
  // create post
344
  $post = array(
@@ -353,26 +370,40 @@ class AutoblogModel extends Model {
353
  'tags_input' => $tags_input,
354
  //'tax_input' => '',
355
  );
356
- // @todo:
357
- // You can set the page template for a non-page by calling update_post_meta() with a key of ‘_wp_page_template’.
358
 
359
  $post_id = \wp_insert_post($post);
360
-
361
  if (!$post_id)
362
  throw new \Exception(sprintf(__('Post can\'t be created. Unknown error.', 'content-egg'), $autoblog['min_modules_count']));
363
 
 
 
 
 
 
 
 
 
 
 
 
364
  // save modules data & keyword for autoupdate
 
365
  foreach ($modules_data as $module_id => $data)
366
  {
 
367
  $autoupdate_keyword = \sanitize_text_field($module_keywords[$module_id]);
368
- ContentManager::saveData($data, $module_id, $post_id);
 
 
 
 
369
  if (in_array($module_id, $autoblog['autoupdate_modules']) && $autoupdate_keyword)
370
  {
371
  \update_post_meta($post_id, ContentManager::META_PREFIX_KEYWORD . $module_id, $autoupdate_keyword);
372
  }
373
  }
374
 
375
- \do_action('content_egg_autoblog_create_post', $post_id);
376
 
377
  // set featured image
378
  $fi = new FeaturedImage();
@@ -381,18 +412,29 @@ class AutoblogModel extends Model {
381
  return $post_id;
382
  }
383
 
384
- private function buildTemplate($template, array $modules_data, $keyword, $module_keywords = array(), $main_product = null)
385
  {
386
  if (!$template)
387
  return $template;
388
 
389
  $template = TextHelper::spin($template);
390
- if (!preg_match_all('/%[a-zA-Z0-9_\.]+%/', $template, $matches))
391
  return $template;
392
 
393
  $replace = array();
394
  foreach ($matches[0] as $pattern)
395
  {
 
 
 
 
 
 
 
 
 
 
 
396
  // keyword
397
  if (stristr($pattern, '%KEYWORD%'))
398
  {
@@ -400,6 +442,7 @@ class AutoblogModel extends Model {
400
  continue;
401
  }
402
 
 
403
  // module keyword
404
  if (stristr($pattern, '%KEYWORD.'))
405
  {
@@ -497,35 +540,6 @@ class AutoblogModel extends Model {
497
  return false;
498
  }
499
 
500
- private function getMainProduct($modules_data, $autoblog_main_product)
501
- {
502
- $all_items = array();
503
- foreach ($modules_data as $module_id => $items)
504
- {
505
- foreach ($items as $item)
506
- {
507
- $item = ArrayHelper::object2Array($item);
508
- /*
509
- if (empty($item['price']))
510
- continue;
511
- *
512
- */
513
- $all_items[] = $item;
514
- }
515
- }
516
-
517
- if (!$all_items)
518
- return null;
519
-
520
- if ($autoblog_main_product == 'random')
521
- return $all_items[array_rand($all_items)];
522
-
523
- if ($autoblog_main_product == 'max_price')
524
- return $all_items[ArrayHelper::getMaxKeyAssoc($all_items, 'price', true)];
525
- else
526
- return $all_items[ArrayHelper::getMinKeyAssoc($all_items, 'price', true)];
527
- }
528
-
529
  static public function createNestedCategories(array $categoryPath)
530
  {
531
  $parent = 0;
7
  use ContentEgg\application\helpers\TextHelper;
8
  use ContentEgg\application\components\FeaturedImage;
9
  use ContentEgg\application\helpers\TemplateHelper;
10
+ use ContentEgg\application\admin\GeneralConfig;
11
 
12
  /**
13
  * AutoblogModel class file
101
 
102
  if (!$item['id'])
103
  {
104
+ $item['id'] = null;
105
  $item['create_date'] = \current_time('mysql');
106
  $this->getDb()->insert($this->tableName(), $item);
107
  return $this->getDb()->insert_id;
167
  if ($post_id)
168
  {
169
  $autoblog['post_count'] ++;
 
170
  }
171
  $autoblog['keywords'][$keyword_id] = self::markKeywordInactive($keyword);
172
  $keyword_id = self::getNextKeywordId($autoblog['keywords']);
293
  }
294
 
295
  // main product
296
+ $main_product = ContentManager::getMainProduct($modules_data, $autoblog['main_product']);
297
 
298
+ // set main product for woo sync
299
+ $product_sync = GeneralConfig::getInstance()->option('woocommerce_product_sync');
300
+ $woocommerce_modules = GeneralConfig::getInstance()->option('woocommerce_modules');
301
+
302
+ if ($autoblog['post_type'] == 'product' && ($product_sync == 'manually' || !array_intersect_key($modules_data, $woocommerce_modules)) && $main_product)
303
+ {
304
+ foreach ($modules_data[$main_product['module_id']] as $i => $product)
305
+ {
306
+ if ($product->unique_id == $main_product['unique_id'] && $product instanceof \ContentEgg\application\components\ContentProduct)
307
+ {
308
+ $modules_data[$main_product['module_id']][$i]->woo_sync = true;
309
+ $modules_data[$main_product['module_id']][$i]->woo_attr = true;
310
+ break;
311
+ }
312
+ }
313
+ }
314
+
315
+ $title = AutoblogModel::buildTemplate($autoblog['template_title'], $modules_data, $keyword, $module_keywords, $main_product);
316
  $title = \wp_strip_all_tags($title);
317
  if (!$title)
318
  $title = $keyword;
319
+ $body = AutoblogModel::buildTemplate($autoblog['template_body'], $modules_data, $keyword, $module_keywords, $main_product);
320
  if ((bool) $autoblog['post_status'])
321
  $post_status = 'publish';
322
  else
332
  if (\is_serialized($cf_value))
333
  $cf_value = @unserialize($cf_value);
334
  else
335
+ $cf_value = AutoblogModel::buildTemplate($cf_value, $modules_data, $keyword, $module_keywords, $main_product);
336
 
337
  $meta_input[$custom_field] = $cf_value;
338
  }
340
 
341
  //tags
342
  if ($autoblog['tags'])
343
+ $tags_input = AutoblogModel::buildTemplate($autoblog['tags'], $modules_data, $keyword, $module_keywords, $main_product);
344
  else
345
  $tags_input = '';
346
 
355
  $categ_id = $autoblog['category'];
356
  if (!$categ_id)
357
  $categ_id = $autoblog['category'];
358
+ $categ_id = (int) $categ_id;
359
 
360
  // create post
361
  $post = array(
370
  'tags_input' => $tags_input,
371
  //'tax_input' => '',
372
  );
 
 
373
 
374
  $post_id = \wp_insert_post($post);
 
375
  if (!$post_id)
376
  throw new \Exception(sprintf(__('Post can\'t be created. Unknown error.', 'content-egg'), $autoblog['min_modules_count']));
377
 
378
+ // woocommerce product
379
+ if (\get_post_type($post_id) == 'product')
380
+ {
381
+ // external by default
382
+ \wp_set_object_terms($post_id, 'external', 'product_type');
383
+
384
+ if (\term_exists($categ_id, 'product_cat'))
385
+ \wp_set_object_terms($post_id, (int) $categ_id, 'product_cat');
386
+ }
387
+
388
+
389
  // save modules data & keyword for autoupdate
390
+ $i = 0;
391
  foreach ($modules_data as $module_id => $data)
392
  {
393
+ $i++;
394
  $autoupdate_keyword = \sanitize_text_field($module_keywords[$module_id]);
395
+ if ($i == count($modules_data))
396
+ $last_iteration = true;
397
+ else
398
+ $last_iteration = false;
399
+ ContentManager::saveData($data, $module_id, $post_id, $last_iteration);
400
  if (in_array($module_id, $autoblog['autoupdate_modules']) && $autoupdate_keyword)
401
  {
402
  \update_post_meta($post_id, ContentManager::META_PREFIX_KEYWORD . $module_id, $autoupdate_keyword);
403
  }
404
  }
405
 
406
+ \do_action('cegg_autoblog_post_create', $post_id);
407
 
408
  // set featured image
409
  $fi = new FeaturedImage();
412
  return $post_id;
413
  }
414
 
415
+ public static function buildTemplate($template, array $modules_data, $keyword, $module_keywords = array(), $main_product = null)
416
  {
417
  if (!$template)
418
  return $template;
419
 
420
  $template = TextHelper::spin($template);
421
+ if (!preg_match_all('/%[a-zA-Z0-9_\.\,\(\)]+%/', $template, $matches))
422
  return $template;
423
 
424
  $replace = array();
425
  foreach ($matches[0] as $pattern)
426
  {
427
+ // keyword
428
+ if (stristr($pattern, '%RANDOM'))
429
+ {
430
+ preg_match('/%RANDOM\((\d+),(\d+)\)%/', $pattern, $rmatches);
431
+ if ($matches)
432
+ $replace[$pattern] = rand((int) $rmatches[1], (int) $rmatches[2]);
433
+ else
434
+ $replace[$pattern] = rand(0, 9999999);
435
+ continue;
436
+ }
437
+
438
  // keyword
439
  if (stristr($pattern, '%KEYWORD%'))
440
  {
442
  continue;
443
  }
444
 
445
+
446
  // module keyword
447
  if (stristr($pattern, '%KEYWORD.'))
448
  {
540
  return false;
541
  }
542
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
543
  static public function createNestedCategories(array $categoryPath)
544
  {
545
  $parent = 0;
application/models/Model.php CHANGED
@@ -200,7 +200,7 @@ abstract class Model {
200
  $item['id'] = (int) $item['id'];
201
  if (!$item['id'])
202
  {
203
- $item['id'] = 0;
204
  $this->getDb()->insert($this->tableName(), $item);
205
  return $this->getDb()->insert_id;
206
  } else
200
  $item['id'] = (int) $item['id'];
201
  if (!$item['id'])
202
  {
203
+ $item['id'] = null;
204
  $this->getDb()->insert($this->tableName(), $item);
205
  return $this->getDb()->insert_id;
206
  } else
application/models/PriceAlertModel.php CHANGED
@@ -71,5 +71,22 @@ class PriceAlertModel extends Model {
71
  $sql = 'DELETE FROM ' . $this->tableName() . ' WHERE email = %s AND status != %d';
72
  $this->getDb()->query($this->getDb()->prepare($sql, $email, self::STATUS_DELETED));
73
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
 
75
  }
71
  $sql = 'DELETE FROM ' . $this->tableName() . ' WHERE email = %s AND status != %d';
72
  $this->getDb()->query($this->getDb()->prepare($sql, $email, self::STATUS_DELETED));
73
  }
74
+
75
+ public static function getStatus($id)
76
+ {
77
+ $statuses = self::getStatuses();
78
+ if (isset($statuses[$id]))
79
+ return $statuses[$id];
80
+ else
81
+ return null;
82
+ }
83
+ public static function getStatuses()
84
+ {
85
+ return array(
86
+ self::STATUS_INACTIVE => 'INACTIVE',
87
+ self::STATUS_ACTIVE => 'ACTIVE',
88
+ self::STATUS_DELETED => 'DELETED',
89
+ );
90
+ }
91
 
92
  }
application/modules/AE/AEConfig.php CHANGED
@@ -30,7 +30,7 @@ class AEConfig extends AffiliateParserModuleConfig {
30
  'title' => __('Results', 'content-egg'),
31
  'description' => __('Number of results for one search query.', 'content-egg'),
32
  'callback' => array($this, 'render_input'),
33
- 'default' => 9,
34
  'validator' => array(
35
  'trim',
36
  'absint',
30
  'title' => __('Results', 'content-egg'),
31
  'description' => __('Number of results for one search query.', 'content-egg'),
32
  'callback' => array($this, 'render_input'),
33
+ 'default' => 5,
34
  'validator' => array(
35
  'trim',
36
  'absint',
application/modules/AE/AEModule.php CHANGED
@@ -181,7 +181,17 @@ class AEModule extends AffiliateParserModule {
181
  $content->extra = new ExtraDataAE;
182
  if (isset($r['extra']['features']))
183
  {
184
- $content->extra->features = $r['extra']['features'];
 
 
 
 
 
 
 
 
 
 
185
  unset($r['extra']['features']);
186
  }
187
  if (isset($r['extra']['comments']))
181
  $content->extra = new ExtraDataAE;
182
  if (isset($r['extra']['features']))
183
  {
184
+ //$content->extra->features = $r['extra']['features'];
185
+
186
+ foreach ($r['extra']['features'] as $f)
187
+ {
188
+ $feature = array(
189
+ 'name' => $f['name'],
190
+ 'value' => $f['value'],
191
+ );
192
+ $content->features[] = $feature;
193
+ }
194
+
195
  unset($r['extra']['features']);
196
  }
197
  if (isset($r['extra']['comments']))
application/modules/AdmitadProducts/AdmitadProductsConfig.php CHANGED
@@ -35,7 +35,7 @@ class AdmitadProductsConfig extends AffiliateParserModuleConfig {
35
  'deeplink' => array(
36
  'title' => 'Deeplink' . ' ' . '<span class="cegg_required">*</span>',
37
  'description' => __('Deeplink of offer.', 'content-egg')
38
- . ' ' . __('<a target="_blank" href="http://www.keywordrush.com/manuals/affegg_manual.en.pdf">Manual</a> for deeplink settings for different CPA-networks.', 'content-egg'),
39
  'callback' => array($this, 'render_input'),
40
  'default' => '',
41
  'validator' => array(
35
  'deeplink' => array(
36
  'title' => 'Deeplink' . ' ' . '<span class="cegg_required">*</span>',
37
  'description' => __('Deeplink of offer.', 'content-egg')
38
+ . ' ' . __('<a target="_blank" href="http://www.keywordrush.com/en/docs/content-egg/DeeplinkSettings.html">Manual</a> for deeplink settings for different CPA-networks.', 'content-egg'),
39
  'callback' => array($this, 'render_input'),
40
  'default' => '',
41
  'validator' => array(
application/modules/AdmitadProducts/AdmitadProductsModule.php CHANGED
@@ -7,6 +7,7 @@ use ContentEgg\application\libs\admitad\AdmitadProducts;
7
  use ContentEgg\application\components\ContentProduct;
8
  use ContentEgg\application\admin\PluginAdmin;
9
  use ContentEgg\application\helpers\TextHelper;
 
10
 
11
  /**
12
  * AdmitadProductsModule class file
@@ -21,7 +22,7 @@ class AdmitadProductsModule extends AffiliateParserModule {
21
  {
22
  return array(
23
  'name' => 'Admitad Products',
24
- 'description' => __('Add products from <a href="https://www.admitad.com/ru/promo/?ref=770f943d83">Admitad</a>.', 'content-egg') . ' ' . __('You must get approve for each program separately.', 'content-egg')
25
  . '<br>' . __('Used API the <a href="https://www.admitadgoods.ru/en.html" target="_blank">Admitad Goods</a> WP plugin.', 'content-egg')
26
  );
27
  }
@@ -56,12 +57,12 @@ class AdmitadProductsModule extends AffiliateParserModule {
56
  if ($this->config('only_sale'))
57
  $options['only_sale'] = 1;
58
 
59
-
60
  if (!empty($query_params['price_from']))
61
  $options['price_from'] = $query_params['price_from'];
62
  elseif ($this->config('price_from'))
63
  $options['price_from'] = (int) $this->config('price_from');
64
-
65
  if (!empty($query_params['price_to']))
66
  $options['price_to'] = $query_params['price_to'];
67
  elseif ($this->config('price_to'))
@@ -96,8 +97,11 @@ class AdmitadProductsModule extends AffiliateParserModule {
96
  $content->price = (float) $r['price'];
97
  $content->img = $r['picture'];
98
  $content->manufacturer = $r['vendor'];
99
- $content->orig_url = $this->parseUrl($r['url']);
100
- $content->domain = TextHelper::parseDomain($content->orig_url, 'ulp');
 
 
 
101
 
102
  $content->url = $this->createAffUrl($content->orig_url);
103
  $content->description = $r['description'];
@@ -109,6 +113,15 @@ class AdmitadProductsModule extends AffiliateParserModule {
109
  $content->extra->id_item = $r['id_item'];
110
  ExtraDataAdmitadProducts::fillAttributes($content->extra, $r);
111
 
 
 
 
 
 
 
 
 
 
112
  $data[] = $content;
113
  }
114
  return $data;
@@ -156,28 +169,25 @@ class AdmitadProductsModule extends AffiliateParserModule {
156
  PluginAdmin::render('_metabox_search_results', array('module_id' => $this->getId()));
157
  }
158
 
159
- private function parseUrl($url)
160
  {
161
- $query = parse_url($url, PHP_URL_QUERY);
162
- parse_str($query, $params);
163
- if (empty($params['ulp']))
164
- throw new \Exception('Invalid product URI');
165
- return $params['ulp'];
166
- }
 
 
 
 
167
 
168
- private function createAffUrl($orig_url)
169
- {
170
- /**
171
- * &i=13 подставить
172
- * это метка адмитада чтоб понимать что с плагина действия
173
- */
174
- return $this->config('deeplink') . urlencode($orig_url) . '&i=13';
175
  }
176
-
177
  public function renderSearchPanel()
178
  {
179
  $this->render('search_panel', array('module_id' => $this->getId()));
180
  }
181
-
182
 
183
  }
7
  use ContentEgg\application\components\ContentProduct;
8
  use ContentEgg\application\admin\PluginAdmin;
9
  use ContentEgg\application\helpers\TextHelper;
10
+ use ContentEgg\application\components\LinkHandler;
11
 
12
  /**
13
  * AdmitadProductsModule class file
22
  {
23
  return array(
24
  'name' => 'Admitad Products',
25
+ 'description' => __('Add products from <a href="http://www.keywordrush.com/go/admitad">Admitad</a>.', 'content-egg') . ' ' . __('You must get approve for each program separately.', 'content-egg')
26
  . '<br>' . __('Used API the <a href="https://www.admitadgoods.ru/en.html" target="_blank">Admitad Goods</a> WP plugin.', 'content-egg')
27
  );
28
  }
57
  if ($this->config('only_sale'))
58
  $options['only_sale'] = 1;
59
 
60
+
61
  if (!empty($query_params['price_from']))
62
  $options['price_from'] = $query_params['price_from'];
63
  elseif ($this->config('price_from'))
64
  $options['price_from'] = (int) $this->config('price_from');
65
+
66
  if (!empty($query_params['price_to']))
67
  $options['price_to'] = $query_params['price_to'];
68
  elseif ($this->config('price_to'))
97
  $content->price = (float) $r['price'];
98
  $content->img = $r['picture'];
99
  $content->manufacturer = $r['vendor'];
100
+
101
+ if (!$orig_url = TextHelper::parseOriginalUrl($r['url'], 'ulp'))
102
+ continue;
103
+ $content->orig_url = $orig_url;
104
+ $content->domain = TextHelper::parseDomain($r['url'], 'ulp');
105
 
106
  $content->url = $this->createAffUrl($content->orig_url);
107
  $content->description = $r['description'];
113
  $content->extra->id_item = $r['id_item'];
114
  ExtraDataAdmitadProducts::fillAttributes($content->extra, $r);
115
 
116
+ foreach ($content->extra->param as $f_name => $f_value)
117
+ {
118
+ $feature = array(
119
+ 'name' => $f_name,
120
+ 'value' => $f_value,
121
+ );
122
+ $content->features[] = $feature;
123
+ }
124
+
125
  $data[] = $content;
126
  }
127
  return $data;
169
  PluginAdmin::render('_metabox_search_results', array('module_id' => $this->getId()));
170
  }
171
 
172
+ public function viewDataPrepare($data)
173
  {
174
+ $deeplink = $this->config('deeplink');
175
+ foreach ($data as $key => $d)
176
+ {
177
+ /**
178
+ * &i=13 подставить
179
+ * это метка адмитада чтоб понимать что с плагина действия
180
+ */
181
+ if ($deeplink && $d['orig_url'])
182
+ $data[$key]['url'] = LinkHandler::createAffUrl($d['orig_url'], $deeplink, 'i=13');
183
+ }
184
 
185
+ return parent::viewDataPrepare($data);
 
 
 
 
 
 
186
  }
187
+
188
  public function renderSearchPanel()
189
  {
190
  $this->render('search_panel', array('module_id' => $this->getId()));
191
  }
 
192
 
193
  }
application/modules/AffilinetCoupons/AffilinetCouponsConfig.php CHANGED
@@ -83,11 +83,11 @@ class AffilinetCouponsConfig extends AffiliateParserModuleConfig {
83
  'description' => 'Vouchers can come with or without an actual voucher code. If they don’t have a voucher code, then the customer gets the benefit automatically. With this parameter, you can limit the results to only those vouchers, which have a voucher code, or those, which don’t have a voucher code.',
84
  'callback' => array($this, 'render_dropdown'),
85
  'dropdown_options' => array(
86
- 0 => 'Any',
87
- 1 => 'Empty',
88
- 2 => 'Filled',
89
  ),
90
- 'default' => 0,
91
  'section' => 'default',
92
  'metaboxInit' => true,
93
  ),
@@ -96,15 +96,15 @@ class AffilinetCouponsConfig extends AffiliateParserModuleConfig {
96
  'description' => '',
97
  'callback' => array($this, 'render_dropdown'),
98
  'dropdown_options' => array(
99
- -1 => 'Any',
100
- 0 => 'All products',
101
- 1 => 'Specific products',
102
- 2 => 'Multi buy discount',
103
- 3 => 'Free shipping',
104
- 4 => 'Free product',
105
- 5 => 'Competition',
106
  ),
107
- 'default' => 0,
108
  'section' => 'default',
109
  'metaboxInit' => true,
110
  ),
@@ -123,11 +123,11 @@ class AffilinetCouponsConfig extends AffiliateParserModuleConfig {
123
  'description' => 'Some vouchers can only be used by new customers. With this parameter you can restrict the results to either get only those vouchers, which all customers can use, or those vouchers, which only new customers can use.',
124
  'callback' => array($this, 'render_dropdown'),
125
  'dropdown_options' => array(
126
- 0 => 'No restrictions',
127
- 1 => 'All customers',
128
- 2 => 'Only new customers',
129
  ),
130
- 'default' => 0,
131
  'section' => 'default',
132
  ),
133
  'ExclusivesOnly' => array(
@@ -142,14 +142,14 @@ class AffilinetCouponsConfig extends AffiliateParserModuleConfig {
142
  'description' => 'Specifies the logic that shall be applied to the list of shops which is specified in Shop IDs. If you choose "Exclude", then products are not returned, if they come from any of the shops specified in Shop IDs.',
143
  'callback' => array($this, 'render_dropdown'),
144
  'dropdown_options' => array(
145
- 0 => 'ID',
146
- 1 => 'Program ID',
147
- 2 => 'Title',
148
- 3 => 'Last change date',
149
- 4 => 'Start date',
150
- 5 => 'End date',
151
  ),
152
- 'default' => 0,
153
  'section' => 'default',
154
  ),
155
  'SortDesc' => array(
83
  'description' => 'Vouchers can come with or without an actual voucher code. If they don’t have a voucher code, then the customer gets the benefit automatically. With this parameter, you can limit the results to only those vouchers, which have a voucher code, or those, which don’t have a voucher code.',
84
  'callback' => array($this, 'render_dropdown'),
85
  'dropdown_options' => array(
86
+ '0.' => 'Any',
87
+ '1.' => 'Empty',
88
+ '2.' => 'Filled',
89
  ),
90
+ 'default' => '0.',
91
  'section' => 'default',
92
  'metaboxInit' => true,
93
  ),
96
  'description' => '',
97
  'callback' => array($this, 'render_dropdown'),
98
  'dropdown_options' => array(
99
+ '-1.' => 'Any',
100
+ '0.' => 'All products',
101
+ '1.' => 'Specific products',
102
+ '2.' => 'Multi buy discount',
103
+ '3.' => 'Free shipping',
104
+ '4.' => 'Free product',
105
+ '5.' => 'Competition',
106
  ),
107
+ 'default' => '0.',
108
  'section' => 'default',
109
  'metaboxInit' => true,
110
  ),
123
  'description' => 'Some vouchers can only be used by new customers. With this parameter you can restrict the results to either get only those vouchers, which all customers can use, or those vouchers, which only new customers can use.',
124
  'callback' => array($this, 'render_dropdown'),
125
  'dropdown_options' => array(
126
+ '0.' => 'No restrictions',
127
+ '1.' => 'All customers',
128
+ '2.' => 'Only new customers',
129
  ),
130
+ 'default' => '0.',
131
  'section' => 'default',
132
  ),
133
  'ExclusivesOnly' => array(
142
  'description' => 'Specifies the logic that shall be applied to the list of shops which is specified in Shop IDs. If you choose "Exclude", then products are not returned, if they come from any of the shops specified in Shop IDs.',
143
  'callback' => array($this, 'render_dropdown'),
144
  'dropdown_options' => array(
145
+ '0.' => 'ID',
146
+ '1.' => 'Program ID',
147
+ '2.' => 'Title',
148
+ '3.' => 'Last change date',
149
+ '4.' => 'Start date',
150
+ '5.' => 'End date',
151
  ),
152
+ 'default' => '0.',
153
  'section' => 'default',
154
  ),
155
  'SortDesc' => array(
application/modules/AffilinetCoupons/AffilinetCouponsModule.php CHANGED
@@ -52,19 +52,26 @@ class AffilinetCouponsModule extends AffiliateParserModule {
52
 
53
 
54
  if (isset($query_params['VoucherType']))
55
- $options['VoucherType'] = $query_params['VoucherType'];
56
  else
57
- $options['VoucherType'] = $this->config('VoucherType');
58
  if (isset($query_params['VoucherCodeContent']))
59
- $options['VoucherCodeContent'] = $query_params['VoucherCodeContent'];
60
  else
61
- $options['VoucherCodeContent'] = $this->config('VoucherCodeContent');
62
 
63
- $fields = array('ProgramId', 'MinimumOrderValue', 'CustomerRestriction', 'OrderBy', 'SortDesc');
64
  foreach ($fields as $field)
65
  {
66
  $options[$field] = $this->config($field);
67
  }
 
 
 
 
 
 
 
68
  $options['ExclusivesOnly'] = var_export((bool) $this->config('ExclusivesOnly'), true);
69
 
70
  // 0 = NoRestriction, 1 = Accepted, Waiting, DeclinedOrDeleted, NoPartnership
@@ -110,6 +117,8 @@ class AffilinetCouponsModule extends AffiliateParserModule {
110
  if ($links = $doc->getElementsByTagName('a'))
111
  {
112
  $content->url = trim($links->item(0)->getAttribute('href'));
 
 
113
  }
114
 
115
  $content->extra = new ExtraDataAffilinetCoupons;
52
 
53
 
54
  if (isset($query_params['VoucherType']))
55
+ $options['VoucherType'] = (int)$query_params['VoucherType'];
56
  else
57
+ $options['VoucherType'] = (int)$this->config('VoucherType');
58
  if (isset($query_params['VoucherCodeContent']))
59
+ $options['VoucherCodeContent'] = (int)$query_params['VoucherCodeContent'];
60
  else
61
+ $options['VoucherCodeContent'] = (int)$this->config('VoucherCodeContent');
62
 
63
+ $fields = array('ProgramId', 'MinimumOrderValue', 'SortDesc');
64
  foreach ($fields as $field)
65
  {
66
  $options[$field] = $this->config($field);
67
  }
68
+ $fields = array('OrderBy', 'CustomerRestriction');
69
+ foreach ($fields as $field)
70
+ {
71
+ $options[$field] = (int) $this->config($field);
72
+ }
73
+
74
+
75
  $options['ExclusivesOnly'] = var_export((bool) $this->config('ExclusivesOnly'), true);
76
 
77
  // 0 = NoRestriction, 1 = Accepted, Waiting, DeclinedOrDeleted, NoPartnership
117
  if ($links = $doc->getElementsByTagName('a'))
118
  {
119
  $content->url = trim($links->item(0)->getAttribute('href'));
120
+ if (\is_ssl())
121
+ $content->url = preg_replace('/^http/', 'https', $content->url);
122
  }
123
 
124
  $content->extra = new ExtraDataAffilinetCoupons;
application/modules/AffilinetCoupons/views/search_panel.php CHANGED
@@ -1,19 +1,19 @@
1
  <div class="col-sm-4">
2
  <select class="form-control input-sm" ng-model="query_params.<?php echo $module_id; ?>.VoucherType">
3
- <option value="-1">Any voucher type</option>
4
- <option value="0">All products</option>
5
- <option value="1">Specific products</option>
6
- <option value="2">Multi buy discount</option>
7
- <option value="3">Free shipping</option>
8
- <option value="4">Free product</option>
9
- <option value="5">Competition</option>
10
  </select>
11
  </div>
12
  <div class="col-sm-4">
13
 
14
  <select class="form-control input-sm" ng-model="query_params.<?php echo $module_id; ?>.VoucherCodeContent">
15
- <option value="0">Any code content</option>
16
- <option value="1">Empty</option>
17
- <option value="2">Filled</option>
18
  </select>
19
  </div>
1
  <div class="col-sm-4">
2
  <select class="form-control input-sm" ng-model="query_params.<?php echo $module_id; ?>.VoucherType">
3
+ <option value="-1.">Any voucher type</option>
4
+ <option value="0.">All products</option>
5
+ <option value="1.">Specific products</option>
6
+ <option value="2.">Multi buy discount</option>
7
+ <option value="3.">Free shipping</option>
8
+ <option value="4.">Free product</option>
9
+ <option value="5.">Competition</option>
10
  </select>
11
  </div>
12
  <div class="col-sm-4">
13
 
14
  <select class="form-control input-sm" ng-model="query_params.<?php echo $module_id; ?>.VoucherCodeContent">
15
+ <option value="0.">Any code content</option>
16
+ <option value="1.">Empty</option>
17
+ <option value="2.">Filled</option>
18
  </select>
19
  </div>
application/modules/Amazon/AmazonModule.php CHANGED
@@ -8,6 +8,7 @@ use ContentEgg\application\components\ContentProduct;
8
  use ContentEgg\application\admin\PluginAdmin;
9
  use ContentEgg\application\components\ExtraData;
10
  use ContentEgg\application\helpers\TextHelper;
 
11
 
12
  /**
13
  * AmazonModule class file
@@ -91,7 +92,7 @@ class AmazonModule extends AffiliateParserModule {
91
  if ($this->config('merchant_id'))
92
  $options['MerchantId'] = "Amazon";
93
 
94
- $options['ResponseGroup'] = 'ItemIds,Offers,ItemAttributes,Images';
95
 
96
  // Customer Reviews
97
  if ($this->config('customer_reviews'))
@@ -155,7 +156,6 @@ class AmazonModule extends AffiliateParserModule {
155
  $ItemLookup = true;
156
  } else
157
  $ItemLookup = false;
158
-
159
  for ($i = 0; $i < $pages_count; $i++)
160
  {
161
  $options['ItemPage'] = $i + 1;
@@ -238,7 +238,7 @@ class AmazonModule extends AffiliateParserModule {
238
  $item_ids[] = $item['extra']['ASIN'];
239
  }
240
 
241
- $options['ResponseGroup'] = 'Offers';
242
 
243
  // update iframe url for customer reviews
244
  //if ($this->config('customer_reviews') && $this->config('customer_reviews_iframe'))
@@ -360,6 +360,39 @@ class AmazonModule extends AffiliateParserModule {
360
  if (isset($r['ItemAttributes']['Author']))
361
  $extra->author = $r['ItemAttributes']['Author'];
362
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
363
  // Offers
364
  self::fillOfferVars($r, $content, $extra);
365
 
@@ -394,7 +427,7 @@ class AmazonModule extends AffiliateParserModule {
394
 
395
  // Заполняем стандартные поля: title, description, url, price
396
  // все остальные данные в extra
397
- $content->url = urldecode($r['DetailPageURL']); // urldecode???
398
 
399
  if (isset($r['ItemAttributes']['Title']))
400
  $content->title = $r['ItemAttributes']['Title'];
@@ -467,6 +500,29 @@ class AmazonModule extends AffiliateParserModule {
467
  $extra = json_decode(json_encode($extra), FALSE);
468
  }
469
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
470
  // OfferSummary
471
  if (isset($r['OfferSummary']))
472
  {
@@ -485,9 +541,7 @@ class AmazonModule extends AffiliateParserModule {
485
  }
486
 
487
  // Offers
488
- if (isset($r['Offers']) &&
489
- isset($r['Offers']['Offer']) &&
490
- isset($r['Offers']['Offer']['OfferListing']))
491
  {
492
  // SalePrice for amazon de?
493
  if (isset($r['Offers']['Offer']['OfferListing']['SalePrice']))
@@ -502,7 +556,7 @@ class AmazonModule extends AffiliateParserModule {
502
  $content->percentageSaved = $r['Offers']['Offer']['OfferListing']['PercentageSaved'];
503
  }
504
 
505
- //@link: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/AvailabilityValues.html
506
  if (isset($r['Offers']['Offer']['OfferListing']['Availability']))
507
  {
508
  $extra->availability = $r['Offers']['Offer']['OfferListing']['Availability'];
@@ -661,11 +715,27 @@ class AmazonModule extends AffiliateParserModule {
661
 
662
  private static function parseAsinFromUrl($url)
663
  {
664
- $regex = '~(?:www\.)?ama?zo?n\.(?:com|ca|co\.uk|co\.jp|de|fr|in|com\.mx)/(?:exec/obidos/ASIN/|o/|gp/product/|(?:(?:[^"\'/]*)/)?dp/|)(B[A-Z0-9]{9})(?:(?:/|\?|\#)(?:[^"\'\s]*))?~isx';
 
 
665
  if (preg_match($regex, $url, $matches))
666
  return $matches[1];
667
  else
668
  return '';
669
  }
670
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
671
  }
8
  use ContentEgg\application\admin\PluginAdmin;
9
  use ContentEgg\application\components\ExtraData;
10
  use ContentEgg\application\helpers\TextHelper;
11
+ use ContentEgg\application\helpers\TemplateHelper;
12
 
13
  /**
14
  * AmazonModule class file
92
  if ($this->config('merchant_id'))
93
  $options['MerchantId'] = "Amazon";
94
 
95
+ $options['ResponseGroup'] = 'ItemIds,Offers,ItemAttributes,Images,VariationOffers';
96
 
97
  // Customer Reviews
98
  if ($this->config('customer_reviews'))
156
  $ItemLookup = true;
157
  } else
158
  $ItemLookup = false;
 
159
  for ($i = 0; $i < $pages_count; $i++)
160
  {
161
  $options['ItemPage'] = $i + 1;
238
  $item_ids[] = $item['extra']['ASIN'];
239
  }
240
 
241
+ $options['ResponseGroup'] = 'Offers,VariationOffers';
242
 
243
  // update iframe url for customer reviews
244
  //if ($this->config('customer_reviews') && $this->config('customer_reviews_iframe'))
360
  if (isset($r['ItemAttributes']['Author']))
361
  $extra->author = $r['ItemAttributes']['Author'];
362
 
363
+ foreach ($r['ItemAttributes'] as $attr_name => $attr_value)
364
+ {
365
+ if (!$attr_value || in_array($attr_name, array('Feature', 'ListPrice')))
366
+ continue;
367
+
368
+ if (is_array($attr_value))
369
+ {
370
+ $tmp_attr_value = reset($attr_value);
371
+ if (isset($attr_value[0]) && !is_array($attr_value[0]))
372
+ $attr_value = join('; ', $attr_value);
373
+ elseif (is_array($tmp_attr_value) && isset($tmp_attr_value[0]) && !is_array($tmp_attr_value[0]))
374
+ $attr_value = join('; ', $tmp_attr_value);
375
+ else
376
+ {
377
+ if (is_array(reset($attr_value)))
378
+ $attr_value = reset($attr_value);
379
+ if (isset($attr_value[0]))
380
+ continue;
381
+ $tmp_attr_value = array();
382
+ foreach ($attr_value as $kk => $vv)
383
+ {
384
+ $tmp_attr_value[] = TemplateHelper::splitAttributeName($kk) . ': ' . $vv;
385
+ }
386
+ $attr_value = join('; ', $tmp_attr_value);
387
+ }
388
+ }
389
+ $feature = array(
390
+ 'name' => TemplateHelper::splitAttributeName($attr_name),
391
+ 'value' => $attr_value,
392
+ );
393
+ $content->features[] = $feature;
394
+ }
395
+
396
  // Offers
397
  self::fillOfferVars($r, $content, $extra);
398
 
427
 
428
  // Заполняем стандартные поля: title, description, url, price
429
  // все остальные данные в extra
430
+ $content->url = self::formatProductUrl(rawurldecode($r['DetailPageURL'])); // urldecode???
431
 
432
  if (isset($r['ItemAttributes']['Title']))
433
  $content->title = $r['ItemAttributes']['Title'];
500
  $extra = json_decode(json_encode($extra), FALSE);
501
  }
502
 
503
+ // Parent ASIN do not have offers. Return first(???) Offer From Item Variations
504
+ // @link: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/ItemsThatDoNotHaveOffers.html
505
+ /*
506
+ if (!isset($r['Offers']['Offer']) && isset($r['Variations']) && isset($r['Variations']['Item']))
507
+ {
508
+ if (!isset($r['Variations']['Item'][0]) && isset($r['Variations']['Item']['ASIN']))
509
+ $r['Variations']['Item'] = array($r['Variations']['Item']);
510
+ $r['Offers'] = $r['Variations']['Item'][0]['Offers'];
511
+ // $r['OfferSummary'] = $r['VariationSummary'];
512
+ }
513
+ *
514
+ */
515
+
516
+ // VariationSummary only for parent products
517
+ if (!$content->price && isset($r['VariationSummary']))
518
+ {
519
+ if (isset($r['VariationSummary']['LowestSalePrice']))
520
+ $r['Price'] = $r['VariationSummary']['LowestSalePrice'];
521
+ elseif (isset($r['VariationSummary']['LowestPrice']))
522
+ $r['Price'] = $r['VariationSummary']['LowestPrice'];
523
+ }
524
+
525
+
526
  // OfferSummary
527
  if (isset($r['OfferSummary']))
528
  {
541
  }
542
 
543
  // Offers
544
+ if (isset($r['Offers']) && isset($r['Offers']['Offer']) && isset($r['Offers']['Offer']['OfferListing']))
 
 
545
  {
546
  // SalePrice for amazon de?
547
  if (isset($r['Offers']['Offer']['OfferListing']['SalePrice']))
556
  $content->percentageSaved = $r['Offers']['Offer']['OfferListing']['PercentageSaved'];
557
  }
558
 
559
+ // @link: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/AvailabilityValues.html
560
  if (isset($r['Offers']['Offer']['OfferListing']['Availability']))
561
  {
562
  $extra->availability = $r['Offers']['Offer']['OfferListing']['Availability'];
715
 
716
  private static function parseAsinFromUrl($url)
717
  {
718
+ //$regex = '~(?:www\.)?ama?zo?n\.(?:com|ca|co\.uk|co\.jp|de|fr|in|com\.mx)/(?:exec/obidos/ASIN/|o/|gp/product/|(?:(?:[^"\'/]*)/)?dp/|)(B[A-Z0-9]{9})(?:(?:/|\?|\#)(?:[^"\'\s]*))?~isx';
719
+ $regex = '~(?:www\.)?ama?zo?n\.(?:com|ca|co\.uk|co\.jp|de|fr|in|com\.mx)/(?:exec/obidos/ASIN/|o/|gp/product/|(?:(?:[^"\'/]*)/)?dp/|)(B[0-9]{2}[0-9A-Z]{7}|[0-9]{9}(X|0-9]))(?:(?:/|\?|\#)(?:[^"\'\s]*))?~isx';
720
+
721
  if (preg_match($regex, $url, $matches))
722
  return $matches[1];
723
  else
724
  return '';
725
  }
726
 
727
+ private static function formatProductUrl($url)
728
+ {
729
+ if (!strstr($url, '%'))
730
+ return $url;
731
+
732
+ if (!$parts = parse_url($url))
733
+ return $urls;
734
+
735
+ // fix % in url: https://www.amazon.in/Optimum-Nutrition-100%-Whey-Standard/dp/B002DYJ00C
736
+ $parts['path'] = str_replace('%', '', $parts['path']);
737
+ $result = $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . '?' . $parts['query'];
738
+ return $result;
739
+ }
740
+
741
  }
application/modules/RelatedKeywords/RelatedKeywordsConfig.php CHANGED
@@ -18,7 +18,7 @@ class RelatedKeywordsConfig extends ParserModuleConfig {
18
  $optiosn = array(
19
  'subscription_key' => array(
20
  'title' => 'Subscription Key <span class="cegg_required">*</span>',
21
- 'description' => __('Key access to Bing Autosuggest API. You can get <a href="https://www.microsoft.com/cognitive-services/en-us/subscriptions">here</a>.', 'content-egg') .
22
  __('You can set several Subscription Keys with commas.', 'content-egg'),
23
  'callback' => array($this, 'render_input'),
24
  'default' => '',
@@ -76,12 +76,11 @@ class RelatedKeywordsConfig extends ParserModuleConfig {
76
  unset($parent['featured_image']);
77
  return array_merge($parent, $optiosn);
78
  }
79
-
80
  static public function marketCodes()
81
  {
82
  $codes = array('es-AR', 'en-AU', 'de-AT', 'nl-BE', 'fr-BE', 'pt-BR', 'en-CA', 'fr-CA', 'es-CL', 'da-DK', 'fi-FI', 'fr-FR', 'de-DE', 'zh-HK', 'en-IN', 'en-ID', 'en-IE', 'it-IT', 'ja-JP', 'ko-KR', 'en-MY', 'es-MX', 'nl-NL', 'en-NZ', 'no-NO', 'zh-CN', 'pl-PL', 'pt-PT', 'en-PH', 'ru-RU', 'ar-SA', 'en-ZA', 'es-ES', 'sv-SE', 'fr-CH', 'de-CH', 'zh-TW', 'tr-TR', 'en-GB', 'en-US', 'es-US');
83
  return array_combine($codes, $codes);
84
  }
85
-
86
 
87
  }
18
  $optiosn = array(
19
  'subscription_key' => array(
20
  'title' => 'Subscription Key <span class="cegg_required">*</span>',
21
+ 'description' => __('Key access to Bing Autosuggest API. You can get <a href="https://azure.microsoft.com/en-us/try/cognitive-services/?api=autosuggest-api">here</a>.', 'content-egg') .
22
  __('You can set several Subscription Keys with commas.', 'content-egg'),
23
  'callback' => array($this, 'render_input'),
24
  'default' => '',
76
  unset($parent['featured_image']);
77
  return array_merge($parent, $optiosn);
78
  }
79
+
80
  static public function marketCodes()
81
  {
82
  $codes = array('es-AR', 'en-AU', 'de-AT', 'nl-BE', 'fr-BE', 'pt-BR', 'en-CA', 'fr-CA', 'es-CL', 'da-DK', 'fi-FI', 'fr-FR', 'de-DE', 'zh-HK', 'en-IN', 'en-ID', 'en-IE', 'it-IT', 'ja-JP', 'ko-KR', 'en-MY', 'es-MX', 'nl-NL', 'en-NZ', 'no-NO', 'zh-CN', 'pl-PL', 'pt-PT', 'en-PH', 'ru-RU', 'ar-SA', 'en-ZA', 'es-ES', 'sv-SE', 'fr-CH', 'de-CH', 'zh-TW', 'tr-TR', 'en-GB', 'en-US', 'es-US');
83
  return array_combine($codes, $codes);
84
  }
 
85
 
86
  }
application/templates/blocks/item_features.php CHANGED
@@ -1,4 +1,13 @@
1
- <?php if (!empty($item['extra']['itemAttributes']['Feature'])): ?>
 
 
 
 
 
 
 
 
 
2
  <div class="cegg-features-box">
3
  <h4 class="cegg-no-top-margin"><?php _e('Features', 'content-egg-tpl'); ?></h4>
4
  <ul class="cegg-feature-list">
1
+ <?php if (!empty($item['features'])): ?>
2
+ <div class="cegg-features-box">
3
+ <h4 class="cegg-no-top-margin"><?php _e('Features', 'content-egg-tpl'); ?></h4>
4
+ <ul class="cegg-feature-list">
5
+ <?php foreach ($item['features'] as $feature): ?>
6
+ <li><?php echo '<strong>' . esc_html($feature['name']) . '</strong>' . ': ' . esc_html($feature['value']); ?></li>
7
+ <?php endforeach; ?>
8
+ </ul>
9
+ </div>
10
+ <?php elseif (!empty($item['extra']['itemAttributes']['Feature'])): ?>
11
  <div class="cegg-features-box">
12
  <h4 class="cegg-no-top-margin"><?php _e('Features', 'content-egg-tpl'); ?></h4>
13
  <ul class="cegg-feature-list">
content-egg.php CHANGED
@@ -6,7 +6,7 @@ namespace ContentEgg;
6
  Plugin Name: Content Egg
7
  Plugin URI: http://www.keywordrush.com/contentegg
8
  Description: Easily adding auto updating products from affiliate systems and additional content to posts.
9
- Version: 3.7.0
10
  Author: keywordrush.com
11
  Author URI: http://www.keywordrush.com
12
  Text Domain: content-egg
6
  Plugin Name: Content Egg
7
  Plugin URI: http://www.keywordrush.com/contentegg
8
  Description: Easily adding auto updating products from affiliate systems and additional content to posts.
9
+ Version: 3.9.0
10
  Author: keywordrush.com
11
  Author URI: http://www.keywordrush.com
12
  Text Domain: content-egg
languages/content-egg.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the Content Egg package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Content Egg 3.6.0\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/content-egg\n"
7
- "POT-Creation-Date: 2017-04-08 09:51:11+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -97,7 +97,7 @@ msgid "Duplicate "
97
  msgstr ""
98
 
99
  #: application/admin/AutoblogTable.php:56 application/admin/MyListTable.php:165
100
- #: application/admin/views/_metabox_results.php:15
101
  #: application/modules/Offer/views/metabox_module.php:99
102
  msgid "Delete"
103
  msgstr ""
@@ -137,7 +137,7 @@ msgid "The field \"%s\" can not be empty"
137
  msgstr ""
138
 
139
  #: application/admin/EnvatoConfig.php:38 application/admin/EnvatoConfig.php:56
140
- #: application/admin/GeneralConfig.php:210
141
  msgid "Field \"%s\" filled with wrong data."
142
  msgstr ""
143
 
@@ -161,153 +161,239 @@ msgstr ""
161
  msgid "Error."
162
  msgstr ""
163
 
164
- #: application/admin/GeneralConfig.php:34 application/admin/PluginAdmin.php:92
165
  msgid "Settings"
166
  msgstr ""
167
 
168
- #: application/admin/GeneralConfig.php:99
169
  msgid "Website language"
170
  msgstr ""
171
 
172
- #: application/admin/GeneralConfig.php:100
173
  msgid "Modules, which have Multilanguage support, will have priority for this language. Also, this setting will point on language of output templates"
174
  msgstr ""
175
 
176
- #: application/admin/GeneralConfig.php:108
177
  msgid "What post types do you want to use for Content Egg?"
178
  msgstr ""
179
 
180
- #: application/admin/GeneralConfig.php:109
181
  msgid "This setting also shows post types for Autofill extension"
182
  msgstr ""
183
 
184
- #: application/admin/GeneralConfig.php:116
185
  msgid "Filter bots"
186
  msgstr ""
187
 
188
- #: application/admin/GeneralConfig.php:117
189
  msgid "Bots can't activate parsers."
190
  msgstr ""
191
 
192
- #: application/admin/GeneralConfig.php:118
193
  msgid "Updating price and keyword updating is made with page opening. If we determine update by useragent, and page is opened by one of known bots, no parsers will work in this case."
194
  msgstr ""
195
 
196
- #: application/admin/GeneralConfig.php:125
197
- #: application/admin/GeneralConfig.php:135
198
  msgid "Price history"
199
  msgstr ""
200
 
201
- #: application/admin/GeneralConfig.php:126
202
  msgid "How long save price history. 0 - deactivate price history."
203
  msgstr ""
204
 
205
- #: application/admin/GeneralConfig.php:135
206
  msgid "The field \"%s\" can't be more than %d."
207
  msgstr ""
208
 
209
- #: application/admin/GeneralConfig.php:141
 
 
 
 
 
 
 
210
  msgid "Allow members to subscribe for price drop alert on email."
211
  msgstr ""
212
 
213
- #: application/admin/GeneralConfig.php:142
214
  msgid "Active subscriptions now: <b>%d</b>"
215
  msgstr ""
216
 
217
- #: application/admin/GeneralConfig.php:143
218
  msgid "Messages are sent for last %d days: <b>%d</b>"
219
  msgstr ""
220
 
221
- #: application/admin/GeneralConfig.php:144
 
 
 
 
222
  msgid "This option requires \"Price history\" option (must be enabled) to work."
223
  msgstr ""
224
 
225
- #: application/admin/GeneralConfig.php:150
226
  msgid "Button color"
227
  msgstr ""
228
 
229
- #: application/admin/GeneralConfig.php:151
230
  msgid "Button color for standard templates."
231
  msgstr ""
232
 
233
- #: application/admin/GeneralConfig.php:159
234
  msgid "Buy now button text"
235
  msgstr ""
236
 
237
- #: application/admin/GeneralConfig.php:160
238
- #: application/admin/GeneralConfig.php:169
239
  msgid "It will be used instead of \"%s\"."
240
  msgstr ""
241
 
242
- #: application/admin/GeneralConfig.php:168
243
  msgid "Coupon button text"
244
  msgstr ""
245
 
246
- #: application/admin/GeneralConfig.php:177
247
- #: application/admin/GeneralConfig.php:186
248
  msgid "Redirect prefix"
249
  msgstr ""
250
 
251
- #: application/admin/GeneralConfig.php:178
252
  msgid "Custom prefix for local redirect links."
253
  msgstr ""
254
 
255
- #: application/admin/GeneralConfig.php:186
256
  msgid "The field \"%s\" can contain only Latin letters and digits."
257
  msgstr ""
258
 
259
- #: application/admin/GeneralConfig.php:191
260
  msgid "From Name"
261
  msgstr ""
262
 
263
- #: application/admin/GeneralConfig.php:192
264
  msgid "This name will appear in the From Name column of emails sent from CE plugin."
265
  msgstr ""
266
 
267
- #: application/admin/GeneralConfig.php:201
268
  msgid "From Email"
269
  msgstr ""
270
 
271
- #: application/admin/GeneralConfig.php:202
272
  msgid "Customize the From Email address."
273
  msgstr ""
274
 
275
- #: application/admin/GeneralConfig.php:202
276
  msgid "To avoid your email being marked as spam, it is recommended your \"from\" match your website."
277
  msgstr ""
278
 
279
- #: application/admin/GeneralConfig.php:215
280
  msgid "Search modules"
281
  msgstr ""
282
 
283
- #: application/admin/GeneralConfig.php:216
284
  msgid "Select modules to search on frontend."
285
  msgstr ""
286
 
287
- #: application/admin/GeneralConfig.php:217
288
  msgid "Do not select more than 1-2 modules."
289
  msgstr ""
290
 
291
- #: application/admin/GeneralConfig.php:218
292
  msgid "Please note, AE modules work slowly and are not recommended for use as search modules."
293
  msgstr ""
294
 
295
- #: application/admin/GeneralConfig.php:219
296
  msgid "Do not forget to add search widget or shorcode [content-egg-search-form]."
297
  msgstr ""
298
 
299
- #: application/admin/GeneralConfig.php:225
 
 
 
 
 
300
  msgid "Search page template"
301
  msgstr ""
302
 
303
- #: application/admin/GeneralConfig.php:226
304
  msgid "Template for body of search page."
305
  msgstr ""
306
 
307
- #: application/admin/GeneralConfig.php:227
308
  msgid "You can use shortcodes, for example: [content-egg module=Amazon template=grid]"
309
  msgstr ""
310
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
311
  #: application/admin/ImportExportController.php:26
312
  msgid "Import/Export"
313
  msgstr ""
@@ -366,42 +452,43 @@ msgstr ""
366
  msgid " back"
367
  msgstr ""
368
 
369
- #: application/admin/PluginAdmin.php:78
370
  msgid "Are you sure?"
371
  msgstr ""
372
 
373
- #: application/admin/PrefillController.php:49
374
- #: application/admin/views/prefill.php:11
 
 
 
 
 
375
  msgid "Fill"
376
  msgstr ""
377
 
378
- #: application/admin/PrefillController.php:98
379
  msgid "Data already exist."
380
  msgstr ""
381
 
382
- #: application/admin/PrefillController.php:111
383
  msgid "Impossible to determine a keyword"
384
  msgstr ""
385
 
386
- #: application/admin/PrefillController.php:120
387
  msgid "Keyword for autoupdate already exists."
388
  msgstr ""
389
 
390
- #: application/admin/PrefillController.php:124
391
- msgid "Keyword for autoupdate was saved."
392
- msgstr ""
393
-
394
- #: application/admin/PrefillController.php:133
395
- #: application/admin/views/metabox_module.php:85
396
  msgid "Error:"
397
  msgstr ""
398
 
399
- #: application/admin/PrefillController.php:140
400
- #: application/admin/views/metabox_module.php:50
401
  msgid "No data found..."
402
  msgstr ""
403
 
404
- #: application/admin/PrefillController.php:146
405
  msgid "Data saved:"
406
  msgstr ""
407
 
@@ -615,8 +702,8 @@ msgid "You can use shortcodes, for example:"
615
  msgstr ""
616
 
617
  #: application/admin/views/_metabox_autoblog.php:216
618
- #: application/admin/views/_metabox_autoblog.php:422
619
- #: application/admin/views/_metabox_autoblog.php:444
620
  msgid "\"Formulas\", and also all tags from title template, will also work here."
621
  msgstr ""
622
 
@@ -641,10 +728,12 @@ msgid "Chosen modules will not run in this configuration. "
641
  msgstr ""
642
 
643
  #: application/admin/views/_metabox_autoblog.php:260
 
644
  msgid "Post status"
645
  msgstr ""
646
 
647
  #: application/admin/views/_metabox_autoblog.php:272
 
648
  msgid "Post type"
649
  msgstr ""
650
 
@@ -667,147 +756,148 @@ msgstr ""
667
  #: application/modules/Pepperjam/PepperjamConfig.php:96
668
  #: application/modules/Pixabay/PixabayConfig.php:108
669
  #: application/modules/TradedoublerProducts/TradedoublerProductsConfig.php:57
 
670
  msgid "Category "
671
  msgstr ""
672
 
673
- #: application/admin/views/_metabox_autoblog.php:310
674
  msgid "Create Automatically"
675
  msgstr ""
676
 
677
- #: application/admin/views/_metabox_autoblog.php:316
678
  msgid "Default category for posts."
679
  msgstr ""
680
 
681
- #: application/admin/views/_metabox_autoblog.php:318
682
  msgid "\"Create Automatically\" means, that categories will be created based on data of CSV file with keywords and categories."
683
  msgstr ""
684
 
685
- #: application/admin/views/_metabox_autoblog.php:326
686
  msgid "Dynamic categories"
687
  msgstr ""
688
 
689
- #: application/admin/views/_metabox_autoblog.php:330
690
  msgid "Do not create"
691
  msgstr ""
692
 
693
- #: application/admin/views/_metabox_autoblog.php:331
694
  msgid "Create category"
695
  msgstr ""
696
 
697
- #: application/admin/views/_metabox_autoblog.php:332
698
  msgid "Create nested categories"
699
  msgstr ""
700
 
701
- #: application/admin/views/_metabox_autoblog.php:334
702
  msgid "Create a category automatically, if the main product has a category data."
703
  msgstr ""
704
 
705
- #: application/admin/views/_metabox_autoblog.php:340
706
  msgid "Minimum modules required"
707
  msgstr ""
708
 
709
- #: application/admin/views/_metabox_autoblog.php:345
710
  msgid "Post will not be published if no content for such number of modules."
711
  msgstr ""
712
 
713
- #: application/admin/views/_metabox_autoblog.php:351
714
  msgid "Minimum reviews required"
715
  msgstr ""
716
 
717
- #: application/admin/views/_metabox_autoblog.php:356
718
  msgid "Post will not be published if there are no user reviews. This option works only for AE modules."
719
  msgstr ""
720
 
721
- #: application/admin/views/_metabox_autoblog.php:362
722
  #: application/modules/AdmitadProducts/AdmitadProductsConfig.php:150
723
  msgid "Automatic update"
724
  msgstr ""
725
 
726
- #: application/admin/views/_metabox_autoblog.php:373
727
  msgid "For selected modules, the current keyword will be used as a keyword for autoupdate. Data of the module will be updated periodically In accordance with the configuration of the lifetime of the cache."
728
  msgstr ""
729
 
730
- #: application/admin/views/_metabox_autoblog.php:379
731
  msgid "Required modules"
732
  msgstr ""
733
 
734
- #: application/admin/views/_metabox_autoblog.php:390
735
  msgid "Post will not be publicized if no results for these modules."
736
  msgstr ""
737
 
738
- #: application/admin/views/_metabox_autoblog.php:397
739
  msgid "Main product"
740
  msgstr ""
741
 
742
- #: application/admin/views/_metabox_autoblog.php:401
743
- msgid "Minimum price"
744
- msgstr ""
745
-
746
- #: application/admin/views/_metabox_autoblog.php:402
747
- msgid "Maximum price"
748
- msgstr ""
749
-
750
- #: application/admin/views/_metabox_autoblog.php:403
751
- msgid "Random"
752
- msgstr ""
753
-
754
- #: application/admin/views/_metabox_autoblog.php:406
755
  msgid "How to choose \"main\" product?"
756
  msgstr ""
757
 
758
- #: application/admin/views/_metabox_autoblog.php:407
759
  msgid "Then you can use tags:"
760
  msgstr ""
761
 
762
- #: application/admin/views/_metabox_autoblog.php:414
763
  msgid "Tags"
764
  msgstr ""
765
 
766
- #: application/admin/views/_metabox_autoblog.php:421
767
  msgid "Comma separated list of tags."
768
  msgstr ""
769
 
770
- #: application/admin/views/_metabox_autoblog.php:430
 
771
  msgid "Add custom fields"
772
  msgstr ""
773
 
774
- #: application/admin/views/_metabox_autoblog.php:435
775
  msgid "Custom Field"
776
  msgstr ""
777
 
778
- #: application/admin/views/_metabox_autoblog.php:440
779
  msgid "Value"
780
  msgstr ""
781
 
782
- #: application/admin/views/_metabox_results.php:10
783
  #: application/components/ParserModuleConfig.php:57
784
  #: application/modules/Offer/views/metabox_module.php:53
785
  #: application/modules/Youtube/YoutubeConfig.php:64
786
- #: application/modules/Youtube/views/search_panel.php:11
787
  msgid "Title"
788
  msgstr ""
789
 
790
- #: application/admin/views/_metabox_results.php:11
791
  #: application/modules/Offer/views/metabox_module.php:95
792
  msgid "Description"
793
  msgstr ""
794
 
795
- #: application/admin/views/_metabox_results.php:14
 
 
 
 
 
 
 
 
796
  #: application/admin/views/_promo_box.php:42
797
  #: application/modules/Offer/views/metabox_module.php:98
798
  msgid "Go to "
799
  msgstr ""
800
 
801
- #: application/admin/views/_metabox_results.php:16
802
- #: application/admin/views/_metabox_search_results.php:12
803
- msgid "EAN:"
804
  msgstr ""
805
 
806
- #: application/admin/views/_metabox_results.php:17
807
- msgid "Last update:"
808
  msgstr ""
809
 
810
- #: application/admin/views/_metabox_search_results.php:15
 
 
 
 
811
  #: application/modules/CjLinks/views/search_results.php:16
812
  msgid "Coupon code:"
813
  msgstr ""
@@ -959,121 +1049,155 @@ msgstr ""
959
  msgid "Find all"
960
  msgstr ""
961
 
962
- #: application/admin/views/metabox_general.php:40
963
- #: application/admin/views/metabox_module.php:76
964
  msgid "Add all"
965
  msgstr ""
966
 
967
- #: application/admin/views/metabox_general.php:41
968
  msgid "Are you sure you want to delete the results of all modules?"
969
  msgstr ""
970
 
971
- #: application/admin/views/metabox_general.php:41
972
- #: application/admin/views/metabox_module.php:45
973
  #: application/modules/Offer/views/metabox_module.php:36
974
  msgid "Delete all"
975
  msgstr ""
976
 
977
- #: application/admin/views/metabox_module.php:26
978
  #: application/modules/Offer/views/metabox_module.php:26
979
  msgid "Output Template for shortcode"
980
  msgstr ""
981
 
982
- #: application/admin/views/metabox_module.php:36
983
- msgid "Keyword for the automatic update"
984
  msgstr ""
985
 
986
- #: application/admin/views/metabox_module.php:45
 
 
 
 
987
  #: application/modules/Offer/views/metabox_module.php:36
988
  msgid "Are you sure you want to delete all results?"
989
  msgstr ""
990
 
991
- #: application/admin/views/metabox_module.php:54
992
  #: application/modules/GoogleImages/GoogleImagesConfig.php:160
993
  msgid "Search"
994
  msgstr ""
995
 
996
- #: application/admin/views/metabox_module.php:60
997
  msgid "Keyword for search"
998
  msgstr ""
999
 
1000
- #: application/admin/views/metabox_module.php:62
1001
  msgid "Find"
1002
  msgstr ""
1003
 
1004
- #: application/admin/views/metabox_module.php:84
1005
  msgid "Not found..."
1006
  msgstr ""
1007
 
1008
- #: application/admin/views/prefill.php:14
1009
  msgid "This extension will fill module's data for all existed posts."
1010
  msgstr ""
1011
 
1012
- #: application/admin/views/prefill.php:15
1013
  msgid "All existing data and keywords will not be erased or overwritten."
1014
  msgstr ""
1015
 
1016
- #: application/admin/views/prefill.php:19
1017
  msgid "Add data for module"
1018
  msgstr ""
1019
 
1020
- #: application/admin/views/prefill.php:29
1021
  msgid "Keyword source"
1022
  msgstr ""
1023
 
1024
- #: application/admin/views/prefill.php:32
1025
  msgid "Calculate as base of the density of keywords inside post"
1026
  msgstr ""
1027
 
1028
- #: application/admin/views/prefill.php:33
1029
  msgid "Title for post"
1030
  msgstr ""
1031
 
1032
- #: application/admin/views/prefill.php:34
1033
  msgid "Post tags"
1034
  msgstr ""
1035
 
1036
  #: application/admin/views/prefill.php:36
 
 
 
 
1037
  msgid "Copy from"
1038
  msgstr ""
1039
 
1040
- #: application/admin/views/prefill.php:43
 
 
 
 
1041
  msgid "Autoupdate"
1042
  msgstr ""
1043
 
1044
- #: application/admin/views/prefill.php:45
1045
  msgid "Add Keyword for the automatic update"
1046
  msgstr ""
1047
 
1048
- #: application/admin/views/prefill.php:46
1049
  msgid "Only for those modules, which have autoupdate function."
1050
  msgstr ""
1051
 
1052
- #: application/admin/views/prefill.php:51
1053
  msgid "Number of words"
1054
  msgstr ""
1055
 
1056
- #: application/admin/views/prefill.php:58
1057
  msgid "Maximum words for one search query."
1058
  msgstr ""
1059
 
1060
- #: application/admin/views/prefill.php:63
1061
  msgid "\"Minus\" words"
1062
  msgstr ""
1063
 
1064
- #: application/admin/views/prefill.php:66
1065
  msgid "Remove these words from keyword. You can set several minus words/phrases with commas."
1066
  msgstr ""
1067
 
1068
- #: application/admin/views/prefill.php:76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1069
  msgid "Start"
1070
  msgstr ""
1071
 
1072
- #: application/admin/views/prefill.php:77
1073
  msgid "Run again"
1074
  msgstr ""
1075
 
1076
- #: application/admin/views/prefill.php:78
1077
  msgid "Stop"
1078
  msgstr ""
1079
 
@@ -1086,7 +1210,7 @@ msgstr ""
1086
  msgid "General settings"
1087
  msgstr ""
1088
 
1089
- #: application/admin/views/settings.php:71
1090
  msgid "Conditions"
1091
  msgstr ""
1092
 
@@ -1227,31 +1351,27 @@ msgstr ""
1227
  msgid "Status"
1228
  msgstr ""
1229
 
1230
- #: application/models/AutoblogModel.php:76
1231
- msgid "Total posts"
1232
- msgstr ""
1233
-
1234
  #: application/models/AutoblogModel.php:77
1235
  msgid "Last error"
1236
  msgstr ""
1237
 
1238
- #: application/models/AutoblogModel.php:204
1239
  msgid "Required module %s will not run. The module is not configured or deleted."
1240
  msgstr ""
1241
 
1242
- #: application/models/AutoblogModel.php:270
1243
  msgid "Data was not found for required module %s."
1244
  msgstr ""
1245
 
1246
- #: application/models/AutoblogModel.php:277
1247
  msgid "It does not reach the desired amount of data. Minimum required modules: %d."
1248
  msgstr ""
1249
 
1250
- #: application/models/AutoblogModel.php:293
1251
  msgid "Total reviews found: %d. Minimum reviews required: %d."
1252
  msgstr ""
1253
 
1254
- #: application/models/AutoblogModel.php:360
1255
  msgid "Post can't be created. Unknown error."
1256
  msgstr ""
1257
 
@@ -1306,6 +1426,7 @@ msgstr ""
1306
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:92
1307
  #: application/modules/Twitter/TwitterConfig.php:80
1308
  #: application/modules/Udemy/UdemyConfig.php:64
 
1309
  #: application/modules/VkNews/VkNewsConfig.php:20
1310
  #: application/modules/Youtube/YoutubeConfig.php:35
1311
  #: application/modules/Zanox/ZanoxConfig.php:45
@@ -1340,6 +1461,7 @@ msgstr ""
1340
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:93
1341
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:93
1342
  #: application/modules/Udemy/UdemyConfig.php:65
 
1343
  #: application/modules/Zanox/ZanoxConfig.php:46
1344
  msgid "Number of results for one search query."
1345
  msgstr ""
@@ -1384,6 +1506,7 @@ msgstr ""
1384
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:103
1385
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:103
1386
  #: application/modules/Udemy/UdemyConfig.php:79
 
1387
  #: application/modules/Zanox/ZanoxConfig.php:61
1388
  msgid "Results for updates "
1389
  msgstr ""
@@ -1416,6 +1539,7 @@ msgstr ""
1416
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:104
1417
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:104
1418
  #: application/modules/Udemy/UdemyConfig.php:80
 
1419
  #: application/modules/Zanox/ZanoxConfig.php:62
1420
  msgid "Number of results for automatic updates and autoblogging."
1421
  msgstr ""
@@ -1433,11 +1557,11 @@ msgstr ""
1433
  #: application/modules/Affiliatewindow/AffiliatewindowConfig.php:128
1434
  #: application/modules/AffilinetProducts/AffilinetProductsConfig.php:165
1435
  #: application/modules/Aliexpress/AliexpressConfig.php:258
1436
- #: application/modules/Amazon/AmazonConfig.php:290
1437
  #: application/modules/BingImages/BingImagesConfig.php:202
1438
  #: application/modules/CityadsProducts/CityadsProductsConfig.php:215
1439
  #: application/modules/CjProducts/CjProductsConfig.php:216
1440
- #: application/modules/Ebay/EbayConfig.php:344
1441
  #: application/modules/Envato/EnvatoConfig.php:207
1442
  #: application/modules/Flickr/FlickrConfig.php:104
1443
  #: application/modules/Flipkart/FlipkartConfig.php:92
@@ -1461,6 +1585,7 @@ msgstr ""
1461
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:168
1462
  #: application/modules/Twitter/TwitterConfig.php:125
1463
  #: application/modules/Udemy/UdemyConfig.php:212
 
1464
  #: application/modules/VkNews/VkNewsConfig.php:42
1465
  #: application/modules/Zanox/ZanoxConfig.php:152
1466
  msgid "Save images"
@@ -1471,11 +1596,11 @@ msgstr ""
1471
  #: application/modules/Affiliatewindow/AffiliatewindowConfig.php:129
1472
  #: application/modules/AffilinetProducts/AffilinetProductsConfig.php:166
1473
  #: application/modules/Aliexpress/AliexpressConfig.php:259
1474
- #: application/modules/Amazon/AmazonConfig.php:291
1475
  #: application/modules/BingImages/BingImagesConfig.php:203
1476
  #: application/modules/CityadsProducts/CityadsProductsConfig.php:216
1477
  #: application/modules/CjProducts/CjProductsConfig.php:217
1478
- #: application/modules/Ebay/EbayConfig.php:345
1479
  #: application/modules/Envato/EnvatoConfig.php:208
1480
  #: application/modules/Flickr/FlickrConfig.php:105
1481
  #: application/modules/Flipkart/FlipkartConfig.php:93
@@ -1498,6 +1623,7 @@ msgstr ""
1498
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:169
1499
  #: application/modules/Twitter/TwitterConfig.php:126
1500
  #: application/modules/Udemy/UdemyConfig.php:213
 
1501
  #: application/modules/VkNews/VkNewsConfig.php:43
1502
  #: application/modules/Zanox/ZanoxConfig.php:153
1503
  msgid "Save images on server"
@@ -1528,7 +1654,7 @@ msgid "Adds coupons from <a href=\"https://www.admitad.com/ru/promo/?ref=770f943
1528
  msgstr ""
1529
 
1530
  #: application/modules/AdmitadCoupons/AdmitadCouponsModule.php:25
1531
- #: application/modules/AdmitadProducts/AdmitadProductsModule.php:24
1532
  #: application/modules/TradedoublerCoupons/TradedoublerCouponsModule.php:25
1533
  msgid "You must get approve for each program separately."
1534
  msgstr ""
@@ -1570,6 +1696,7 @@ msgid "Field \"Results for autoupdating\" can not be more than 20."
1570
  msgstr ""
1571
 
1572
  #: application/modules/AdmitadProducts/AdmitadProductsConfig.php:88
 
1573
  msgid "Discount"
1574
  msgstr ""
1575
 
@@ -1672,14 +1799,52 @@ msgstr ""
1672
  msgid "Update products"
1673
  msgstr ""
1674
 
1675
- #: application/modules/AdmitadProducts/AdmitadProductsModule.php:24
1676
  msgid "Add products from <a href=\"https://www.admitad.com/ru/promo/?ref=770f943d83\">Admitad</a>."
1677
  msgstr ""
1678
 
1679
- #: application/modules/AdmitadProducts/AdmitadProductsModule.php:25
1680
  msgid "Used API the <a href=\"https://www.admitadgoods.ru/en.html\" target=\"_blank\">Admitad Goods</a> WP plugin."
1681
  msgstr ""
1682
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1683
  #: application/modules/Affiliatewindow/AffiliatewindowConfig.php:23
1684
  msgid "Access key for ProductServe API (ShopWindow Client) V3. You can get it <a href=\"https://www.affiliatewindow.com/affiliates/accountdetails.php\">here</a>."
1685
  msgstr ""
@@ -1855,10 +2020,12 @@ msgid "Max number of partner sales for last month. Example, 456"
1855
  msgstr ""
1856
 
1857
  #: application/modules/Aliexpress/AliexpressConfig.php:235
 
1858
  msgid "Price low to high"
1859
  msgstr ""
1860
 
1861
  #: application/modules/Aliexpress/AliexpressConfig.php:236
 
1862
  msgid "Price high to low"
1863
  msgstr ""
1864
 
@@ -1895,6 +2062,20 @@ msgstr ""
1895
  msgid "Adds items from aliexpress.com"
1896
  msgstr ""
1897
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1898
  #: application/modules/Amazon/AmazonConfig.php:22
1899
  msgid "Special key to access the Amazon API."
1900
  msgstr ""
@@ -2038,136 +2219,145 @@ msgstr ""
2038
  msgid "Get user reviews. Reviews will be in iframe. Iframe url is valid only 24 hours, please, use autoupdating function with less than 24 hour to keep actual url."
2039
  msgstr ""
2040
 
2041
- #: application/modules/Amazon/AmazonConfig.php:227
2042
  #: application/modules/Market/MarketConfig.php:138
2043
  #: application/modules/Ozon/OzonConfig.php:155
2044
  msgid "Cut reviews"
2045
  msgstr ""
2046
 
2047
- #: application/modules/Amazon/AmazonConfig.php:228
2048
  msgid "Number of characters for one review. 0 - the maximal length of the text."
2049
  msgstr ""
2050
 
2051
- #: application/modules/Amazon/AmazonConfig.php:252
2052
  msgid "Parse description"
2053
  msgstr ""
2054
 
2055
- #: application/modules/Amazon/AmazonConfig.php:253
2056
  msgid "Parse description of products from seller"
2057
  msgstr ""
2058
 
2059
- #: application/modules/Amazon/AmazonConfig.php:259
2060
  msgid "Type of description"
2061
  msgstr ""
2062
 
2063
- #: application/modules/Amazon/AmazonConfig.php:263
2064
  msgid "Like on Amazon"
2065
  msgstr ""
2066
 
2067
- #: application/modules/Amazon/AmazonConfig.php:264
2068
  msgid "Safe HTML"
2069
  msgstr ""
2070
 
2071
- #: application/modules/Amazon/AmazonConfig.php:265
2072
  msgid "Only allowed HTML tags"
2073
  msgstr ""
2074
 
2075
- #: application/modules/Amazon/AmazonConfig.php:266
2076
  msgid "Text only"
2077
  msgstr ""
2078
 
2079
- #: application/modules/Amazon/AmazonConfig.php:272
2080
- #: application/modules/Ebay/EbayConfig.php:333
2081
  msgid "Size of description"
2082
  msgstr ""
2083
 
2084
- #: application/modules/Amazon/AmazonConfig.php:273
2085
- #: application/modules/Ebay/EbayConfig.php:334
2086
  msgid "The maximum size of the item description. 0 - do not cut."
2087
  msgstr ""
2088
 
2089
- #: application/modules/Amazon/AmazonConfig.php:283
2090
  msgid "Use images with https (use it if you also have https site)"
2091
  msgstr ""
2092
 
2093
- #: application/modules/Amazon/AmazonConfig.php:284
2094
  msgid "Rewrite url of images with https. Use it if you have SSL on your domain"
2095
  msgstr ""
2096
 
2097
- #: application/modules/Amazon/AmazonConfig.php:291
2098
  msgid "Enabling this option violates rules of API."
2099
  msgstr ""
2100
 
2101
- #: application/modules/Amazon/AmazonConfig.php:301
2102
  msgid "Tracking ID for %s locale"
2103
  msgstr ""
2104
 
2105
- #: application/modules/Amazon/AmazonConfig.php:302
2106
  msgid "Type here your tracking ID for this locale if you need multiple locale parsing"
2107
  msgstr ""
2108
 
2109
- #: application/modules/Amazon/AmazonModule.php:28
2110
- msgid "Adds goods from Amazon."
2111
- msgstr ""
2112
-
2113
- #: application/modules/Amazon/views/search_panel.php:17
2114
- msgid "Min. discount"
2115
  msgstr ""
2116
 
2117
- #: application/modules/Amazon/views/search_panel.php:18
2118
  msgid "5%"
2119
  msgstr ""
2120
 
2121
- #: application/modules/Amazon/views/search_panel.php:19
2122
  msgid "10%"
2123
  msgstr ""
2124
 
2125
- #: application/modules/Amazon/views/search_panel.php:20
2126
  msgid "15%"
2127
  msgstr ""
2128
 
2129
- #: application/modules/Amazon/views/search_panel.php:21
2130
  msgid "20%"
2131
  msgstr ""
2132
 
2133
- #: application/modules/Amazon/views/search_panel.php:22
2134
  msgid "25%"
2135
  msgstr ""
2136
 
2137
- #: application/modules/Amazon/views/search_panel.php:23
2138
  msgid "30%"
2139
  msgstr ""
2140
 
2141
- #: application/modules/Amazon/views/search_panel.php:24
2142
  msgid "35%"
2143
  msgstr ""
2144
 
2145
- #: application/modules/Amazon/views/search_panel.php:25
2146
  msgid "40%"
2147
  msgstr ""
2148
 
2149
- #: application/modules/Amazon/views/search_panel.php:26
2150
  msgid "50%"
2151
  msgstr ""
2152
 
2153
- #: application/modules/Amazon/views/search_panel.php:27
2154
  msgid "60%"
2155
  msgstr ""
2156
 
2157
- #: application/modules/Amazon/views/search_panel.php:28
2158
  msgid "70%"
2159
  msgstr ""
2160
 
2161
- #: application/modules/Amazon/views/search_panel.php:29
2162
  msgid "80%"
2163
  msgstr ""
2164
 
2165
- #: application/modules/Amazon/views/search_panel.php:30
2166
  msgid "90%"
2167
  msgstr ""
2168
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2169
  #: application/modules/BingImages/BingImagesConfig.php:21
2170
- msgid "Key access to Bing Search API. You can get <a href=\"https://www.microsoft.com/cognitive-services/en-us/subscriptions\">here</a>."
2171
  msgstr ""
2172
 
2173
  #: application/modules/BingImages/BingImagesConfig.php:22
@@ -2291,12 +2481,12 @@ msgid "All"
2291
  msgstr ""
2292
 
2293
  #: application/modules/BingImages/BingImagesConfig.php:90
2294
- #: application/modules/BingImages/views/search_panel.php:3
2295
  msgid "Public"
2296
  msgstr ""
2297
 
2298
  #: application/modules/BingImages/BingImagesConfig.php:91
2299
- #: application/modules/BingImages/views/search_panel.php:4
2300
  msgid "Share"
2301
  msgstr ""
2302
 
@@ -2305,13 +2495,13 @@ msgid "Share commercially "
2305
  msgstr ""
2306
 
2307
  #: application/modules/BingImages/BingImagesConfig.php:93
2308
- #: application/modules/BingImages/views/search_panel.php:6
2309
  msgid "Modify"
2310
  msgstr ""
2311
 
2312
  #: application/modules/BingImages/BingImagesConfig.php:94
2313
  #: application/modules/BingImages/BingImagesConfig.php:186
2314
- #: application/modules/BingImages/views/search_panel.php:7
2315
  msgid "Modify commercially"
2316
  msgstr ""
2317
 
@@ -2512,6 +2702,9 @@ msgid "Limit the search to only that domain. For example ask: wikimedia.org"
2512
  msgstr ""
2513
 
2514
  #: application/modules/BingImages/templates/data_simple.php:5
 
 
 
2515
  msgid "Simple"
2516
  msgstr ""
2517
 
@@ -2520,17 +2713,17 @@ msgstr ""
2520
  msgid "Source: %s"
2521
  msgstr ""
2522
 
2523
- #: application/modules/BingImages/views/search_panel.php:2
2524
  #: application/modules/Flickr/FlickrConfig.php:75
2525
- #: application/modules/Flickr/views/search_panel.php:2
2526
  #: application/modules/GoogleImages/GoogleImagesConfig.php:24
2527
- #: application/modules/GoogleImages/views/search_panel.php:2
2528
  #: application/modules/Youtube/YoutubeConfig.php:76
2529
- #: application/modules/Youtube/views/search_panel.php:2
2530
  msgid "Any license"
2531
  msgstr ""
2532
 
2533
- #: application/modules/BingImages/views/search_panel.php:5
2534
  msgid "Share commercially"
2535
  msgstr ""
2536
 
@@ -2927,11 +3120,19 @@ msgstr ""
2927
  msgid "Payment options"
2928
  msgstr ""
2929
 
2930
- #: application/modules/Ebay/EbayConfig.php:326
 
 
 
 
 
 
 
 
2931
  msgid "Get description"
2932
  msgstr ""
2933
 
2934
- #: application/modules/Ebay/EbayConfig.php:327
2935
  msgid "Get description of product. This takes more requests for Ebay API and slow down searching. Description will be requested only for 20 first products for one searching"
2936
  msgstr ""
2937
 
@@ -2955,6 +3156,8 @@ msgstr ""
2955
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:60
2956
  #: application/modules/Udemy/UdemyConfig.php:29
2957
  #: application/modules/Udemy/UdemyConfig.php:44
 
 
2958
  msgid "The field \"%s\" can not be empty."
2959
  msgstr ""
2960
 
@@ -2996,7 +3199,7 @@ msgstr ""
2996
 
2997
  #: application/modules/Envato/EnvatoConfig.php:118
2998
  #: application/modules/Youtube/YoutubeConfig.php:61
2999
- #: application/modules/Youtube/views/search_panel.php:8
3000
  msgid "Date"
3001
  msgstr ""
3002
 
@@ -3058,26 +3261,27 @@ msgid "Number of results for a single query"
3058
  msgstr ""
3059
 
3060
  #: application/modules/Flickr/FlickrConfig.php:61
3061
- #: application/modules/Flickr/views/search_panel.php:10
3062
  #: application/modules/GoogleBooks/GoogleBooksConfig.php:99
3063
  #: application/modules/Ozon/OzonConfig.php:66
 
3064
  #: application/modules/Youtube/YoutubeConfig.php:63
3065
- #: application/modules/Youtube/views/search_panel.php:10
3066
  msgid "Relevance"
3067
  msgstr ""
3068
 
3069
  #: application/modules/Flickr/FlickrConfig.php:62
3070
- #: application/modules/Flickr/views/search_panel.php:11
3071
  msgid "Date of post"
3072
  msgstr ""
3073
 
3074
  #: application/modules/Flickr/FlickrConfig.php:63
3075
- #: application/modules/Flickr/views/search_panel.php:12
3076
  msgid "Date of shooting"
3077
  msgstr ""
3078
 
3079
  #: application/modules/Flickr/FlickrConfig.php:64
3080
- #: application/modules/Flickr/views/search_panel.php:13
3081
  msgid "First interesting"
3082
  msgstr ""
3083
 
@@ -3092,30 +3296,30 @@ msgid "Many photos on Flickr have Creative Commons license. <a href=\"http://www
3092
  msgstr ""
3093
 
3094
  #: application/modules/Flickr/FlickrConfig.php:76
3095
- #: application/modules/Flickr/views/search_panel.php:3
3096
  #: application/modules/GoogleImages/GoogleImagesConfig.php:25
3097
- #: application/modules/GoogleImages/views/search_panel.php:3
3098
  msgid "Any Creative Commons"
3099
  msgstr ""
3100
 
3101
  #: application/modules/Flickr/FlickrConfig.php:77
3102
- #: application/modules/Flickr/views/search_panel.php:4
3103
  #: application/modules/GoogleImages/GoogleImagesConfig.php:26
3104
- #: application/modules/GoogleImages/views/search_panel.php:4
3105
  msgid "With Allow of commercial use"
3106
  msgstr ""
3107
 
3108
  #: application/modules/Flickr/FlickrConfig.php:78
3109
- #: application/modules/Flickr/views/search_panel.php:5
3110
  #: application/modules/GoogleImages/GoogleImagesConfig.php:27
3111
- #: application/modules/GoogleImages/views/search_panel.php:5
3112
  msgid "Allowed change"
3113
  msgstr ""
3114
 
3115
  #: application/modules/Flickr/FlickrConfig.php:79
3116
- #: application/modules/Flickr/views/search_panel.php:6
3117
  #: application/modules/GoogleImages/GoogleImagesConfig.php:28
3118
- #: application/modules/GoogleImages/views/search_panel.php:6
3119
  msgid "Commercial use and change"
3120
  msgstr ""
3121
 
@@ -3260,7 +3464,7 @@ msgstr ""
3260
  msgid "Limit search by definite shop. You can find shop ID <a target=\"_blank\" href=\"http://api.gdeslon.ru/merchants\">here</a>. You can set multiple ID with comma."
3261
  msgstr ""
3262
 
3263
- #: application/modules/GdeSlon/GdeSlonModule.php:26
3264
  msgid "Adds goods from gdeslon.ru."
3265
  msgstr ""
3266
 
@@ -3269,6 +3473,7 @@ msgid "Field \"Results for autoblogging\" can not be more than 40."
3269
  msgstr ""
3270
 
3271
  #: application/modules/GoogleBooks/GoogleBooksConfig.php:67
 
3272
  msgid "Country"
3273
  msgstr ""
3274
 
@@ -3323,27 +3528,27 @@ msgstr ""
3323
 
3324
  #: application/modules/GoogleImages/GoogleImagesConfig.php:105
3325
  #: application/modules/GoogleImages/GoogleImagesConfig.php:120
3326
- #: application/modules/GoogleImages/views/search_panel.php:11
3327
  msgid "Any size"
3328
  msgstr ""
3329
 
3330
  #: application/modules/GoogleImages/GoogleImagesConfig.php:106
3331
- #: application/modules/GoogleImages/views/search_panel.php:12
3332
  msgid "Small"
3333
  msgstr ""
3334
 
3335
  #: application/modules/GoogleImages/GoogleImagesConfig.php:107
3336
- #: application/modules/GoogleImages/views/search_panel.php:13
3337
  msgid "Medium"
3338
  msgstr ""
3339
 
3340
  #: application/modules/GoogleImages/GoogleImagesConfig.php:108
3341
- #: application/modules/GoogleImages/views/search_panel.php:14
3342
  msgid "Large"
3343
  msgstr ""
3344
 
3345
  #: application/modules/GoogleImages/GoogleImagesConfig.php:109
3346
- #: application/modules/GoogleImages/views/search_panel.php:15
3347
  msgid "Huge"
3348
  msgstr ""
3349
 
@@ -3478,7 +3683,7 @@ msgstr ""
3478
 
3479
  #: application/modules/Market/MarketConfig.php:80
3480
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:118
3481
- #: application/modules/TradetrackerCoupons/views/search_panel.php:3
3482
  msgid "Offers"
3483
  msgstr ""
3484
 
@@ -3557,7 +3762,7 @@ msgstr ""
3557
  #: application/modules/Offer/views/metabox_module.php:61
3558
  #: application/modules/Ozon/OzonConfig.php:172
3559
  #: application/modules/Youtube/YoutubeConfig.php:62
3560
- #: application/modules/Youtube/views/search_panel.php:9
3561
  msgid "Rating"
3562
  msgstr ""
3563
 
@@ -3841,7 +4046,7 @@ msgid "Search photo with free license CC0 Public Domain on pixabay.com"
3841
  msgstr ""
3842
 
3843
  #: application/modules/RelatedKeywords/RelatedKeywordsConfig.php:21
3844
- msgid "Key access to Bing Autosuggest API. You can get <a href=\"https://www.microsoft.com/cognitive-services/en-us/subscriptions\">here</a>."
3845
  msgstr ""
3846
 
3847
  #: application/modules/RelatedKeywords/RelatedKeywordsConfig.php:30
@@ -3912,6 +4117,10 @@ msgstr ""
3912
  msgid "Access key for Tradedoubler Coupons API. You can get it <a href=\"https://login.tradedoubler.com/publisher/aManageTokens.action\">here</a>."
3913
  msgstr ""
3914
 
 
 
 
 
3915
  #: application/modules/TradedoublerProducts/TradedoublerProductsConfig.php:21
3916
  msgid "Access key for Tradedoubler Products API. You can get it <a href=\"https://login.tradedoubler.com/publisher/aManageTokens.action\">here</a>."
3917
  msgstr ""
@@ -3953,12 +4162,12 @@ msgid "Items type"
3953
  msgstr ""
3954
 
3955
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:117
3956
- #: application/modules/TradetrackerCoupons/views/search_panel.php:2
3957
  msgid "Vouchers"
3958
  msgstr ""
3959
 
3960
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:119
3961
- #: application/modules/TradetrackerCoupons/views/search_panel.php:4
3962
  msgid "Text Links"
3963
  msgstr ""
3964
 
@@ -3994,10 +4203,12 @@ msgid "Feed Category Name"
3994
  msgstr ""
3995
 
3996
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:150
 
3997
  msgid "Price From"
3998
  msgstr ""
3999
 
4000
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:159
 
4001
  msgid "Price To"
4002
  msgstr ""
4003
 
@@ -4143,12 +4354,72 @@ msgstr ""
4143
  msgid "Adds cources from %s."
4144
  msgstr ""
4145
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4146
  #: application/modules/VkNews/VkNewsModule.php:25
4147
  msgid "Adds news from Russian-language social network vk.com"
4148
  msgstr ""
4149
 
4150
  #: application/modules/Youtube/YoutubeConfig.php:65
4151
- #: application/modules/Youtube/views/search_panel.php:12
4152
  msgid "Views"
4153
  msgstr ""
4154
 
@@ -4161,11 +4432,11 @@ msgid "Creative Commons license"
4161
  msgstr ""
4162
 
4163
  #: application/modules/Youtube/YoutubeConfig.php:78
4164
- #: application/modules/Youtube/views/search_panel.php:4
4165
  msgid "Standard license"
4166
  msgstr ""
4167
 
4168
- #: application/modules/Youtube/views/search_panel.php:3
4169
  msgid "Creative Commons"
4170
  msgstr ""
4171
 
2
  # This file is distributed under the same license as the Content Egg package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Content Egg 3.9.0\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/content-egg\n"
7
+ "POT-Creation-Date: 2017-07-28 14:34:59+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
97
  msgstr ""
98
 
99
  #: application/admin/AutoblogTable.php:56 application/admin/MyListTable.php:165
100
+ #: application/admin/views/_metabox_results.php:28
101
  #: application/modules/Offer/views/metabox_module.php:99
102
  msgid "Delete"
103
  msgstr ""
137
  msgstr ""
138
 
139
  #: application/admin/EnvatoConfig.php:38 application/admin/EnvatoConfig.php:56
140
+ #: application/admin/GeneralConfig.php:215
141
  msgid "Field \"%s\" filled with wrong data."
142
  msgstr ""
143
 
161
  msgid "Error."
162
  msgstr ""
163
 
164
+ #: application/admin/GeneralConfig.php:34 application/admin/PluginAdmin.php:93
165
  msgid "Settings"
166
  msgstr ""
167
 
168
+ #: application/admin/GeneralConfig.php:101
169
  msgid "Website language"
170
  msgstr ""
171
 
172
+ #: application/admin/GeneralConfig.php:102
173
  msgid "Modules, which have Multilanguage support, will have priority for this language. Also, this setting will point on language of output templates"
174
  msgstr ""
175
 
176
+ #: application/admin/GeneralConfig.php:110
177
  msgid "What post types do you want to use for Content Egg?"
178
  msgstr ""
179
 
180
+ #: application/admin/GeneralConfig.php:111
181
  msgid "This setting also shows post types for Autofill extension"
182
  msgstr ""
183
 
184
+ #: application/admin/GeneralConfig.php:118
185
  msgid "Filter bots"
186
  msgstr ""
187
 
188
+ #: application/admin/GeneralConfig.php:119
189
  msgid "Bots can't activate parsers."
190
  msgstr ""
191
 
192
+ #: application/admin/GeneralConfig.php:120
193
  msgid "Updating price and keyword updating is made with page opening. If we determine update by useragent, and page is opened by one of known bots, no parsers will work in this case."
194
  msgstr ""
195
 
196
+ #: application/admin/GeneralConfig.php:127
197
+ #: application/admin/GeneralConfig.php:137
198
  msgid "Price history"
199
  msgstr ""
200
 
201
+ #: application/admin/GeneralConfig.php:128
202
  msgid "How long save price history. 0 - deactivate price history."
203
  msgstr ""
204
 
205
+ #: application/admin/GeneralConfig.php:137
206
  msgid "The field \"%s\" can't be more than %d."
207
  msgstr ""
208
 
209
+ #: application/admin/GeneralConfig.php:140
210
+ #: application/admin/GeneralConfig.php:151
211
+ #: application/admin/GeneralConfig.php:203
212
+ #: application/admin/GeneralConfig.php:218
213
+ msgid "Price alerts"
214
+ msgstr ""
215
+
216
+ #: application/admin/GeneralConfig.php:144
217
  msgid "Allow members to subscribe for price drop alert on email."
218
  msgstr ""
219
 
220
+ #: application/admin/GeneralConfig.php:145
221
  msgid "Active subscriptions now: <b>%d</b>"
222
  msgstr ""
223
 
224
+ #: application/admin/GeneralConfig.php:146
225
  msgid "Messages are sent for last %d days: <b>%d</b>"
226
  msgstr ""
227
 
228
+ #: application/admin/GeneralConfig.php:147
229
+ msgid "Export: [ <a href=\"%s\">All</a> | <a href=\"%s\">Active</a> ]"
230
+ msgstr ""
231
+
232
+ #: application/admin/GeneralConfig.php:148
233
  msgid "This option requires \"Price history\" option (must be enabled) to work."
234
  msgstr ""
235
 
236
+ #: application/admin/GeneralConfig.php:154
237
  msgid "Button color"
238
  msgstr ""
239
 
240
+ #: application/admin/GeneralConfig.php:155
241
  msgid "Button color for standard templates."
242
  msgstr ""
243
 
244
+ #: application/admin/GeneralConfig.php:163
245
  msgid "Buy now button text"
246
  msgstr ""
247
 
248
+ #: application/admin/GeneralConfig.php:164
249
+ #: application/admin/GeneralConfig.php:173
250
  msgid "It will be used instead of \"%s\"."
251
  msgstr ""
252
 
253
+ #: application/admin/GeneralConfig.php:172
254
  msgid "Coupon button text"
255
  msgstr ""
256
 
257
+ #: application/admin/GeneralConfig.php:181
258
+ #: application/admin/GeneralConfig.php:190
259
  msgid "Redirect prefix"
260
  msgstr ""
261
 
262
+ #: application/admin/GeneralConfig.php:182
263
  msgid "Custom prefix for local redirect links."
264
  msgstr ""
265
 
266
+ #: application/admin/GeneralConfig.php:190
267
  msgid "The field \"%s\" can contain only Latin letters and digits."
268
  msgstr ""
269
 
270
+ #: application/admin/GeneralConfig.php:195
271
  msgid "From Name"
272
  msgstr ""
273
 
274
+ #: application/admin/GeneralConfig.php:196
275
  msgid "This name will appear in the From Name column of emails sent from CE plugin."
276
  msgstr ""
277
 
278
+ #: application/admin/GeneralConfig.php:206
279
  msgid "From Email"
280
  msgstr ""
281
 
282
+ #: application/admin/GeneralConfig.php:207
283
  msgid "Customize the From Email address."
284
  msgstr ""
285
 
286
+ #: application/admin/GeneralConfig.php:207
287
  msgid "To avoid your email being marked as spam, it is recommended your \"from\" match your website."
288
  msgstr ""
289
 
290
+ #: application/admin/GeneralConfig.php:221
291
  msgid "Search modules"
292
  msgstr ""
293
 
294
+ #: application/admin/GeneralConfig.php:222
295
  msgid "Select modules to search on frontend."
296
  msgstr ""
297
 
298
+ #: application/admin/GeneralConfig.php:223
299
  msgid "Do not select more than 1-2 modules."
300
  msgstr ""
301
 
302
+ #: application/admin/GeneralConfig.php:224
303
  msgid "Please note, AE modules work slowly and are not recommended for use as search modules."
304
  msgstr ""
305
 
306
+ #: application/admin/GeneralConfig.php:225
307
  msgid "Do not forget to add search widget or shorcode [content-egg-search-form]."
308
  msgstr ""
309
 
310
+ #: application/admin/GeneralConfig.php:229
311
+ #: application/admin/GeneralConfig.php:237
312
+ msgid "Frontend search"
313
+ msgstr ""
314
+
315
+ #: application/admin/GeneralConfig.php:232
316
  msgid "Search page template"
317
  msgstr ""
318
 
319
+ #: application/admin/GeneralConfig.php:233
320
  msgid "Template for body of search page."
321
  msgstr ""
322
 
323
+ #: application/admin/GeneralConfig.php:234
324
  msgid "You can use shortcodes, for example: [content-egg module=Amazon template=grid]"
325
  msgstr ""
326
 
327
+ #: application/admin/GeneralConfig.php:240
328
+ msgid "Modules for synchronization"
329
+ msgstr ""
330
+
331
+ #: application/admin/GeneralConfig.php:241
332
+ msgid "Select modules for automatic synchronization with WooCommerce."
333
+ msgstr ""
334
+
335
+ #: application/admin/GeneralConfig.php:245
336
+ #: application/admin/GeneralConfig.php:258
337
+ #: application/admin/GeneralConfig.php:270
338
+ #: application/admin/GeneralConfig.php:277
339
+ msgid "WooCommerce synchronization"
340
+ msgstr ""
341
+
342
+ #: application/admin/GeneralConfig.php:248
343
+ msgid "Automatic synchronization"
344
+ msgstr ""
345
+
346
+ #: application/admin/GeneralConfig.php:249
347
+ msgid "How to choose product for automatic synchronization with WooCommerce."
348
+ msgstr ""
349
+
350
+ #: application/admin/GeneralConfig.php:252
351
+ #: application/admin/views/_metabox_autoblog.php:413
352
+ msgid "Minimum price"
353
+ msgstr ""
354
+
355
+ #: application/admin/GeneralConfig.php:253
356
+ #: application/admin/views/_metabox_autoblog.php:414
357
+ msgid "Maximum price"
358
+ msgstr ""
359
+
360
+ #: application/admin/GeneralConfig.php:254
361
+ #: application/admin/views/_metabox_autoblog.php:415
362
+ msgid "Random"
363
+ msgstr ""
364
+
365
+ #: application/admin/GeneralConfig.php:255
366
+ msgid "Manually only"
367
+ msgstr ""
368
+
369
+ #: application/admin/GeneralConfig.php:261
370
+ msgid "Global attributes filter"
371
+ msgstr ""
372
+
373
+ #: application/admin/GeneralConfig.php:262
374
+ msgid "How to create wocommerce attributes when synchronizing. Please, read documentation about them in our docs."
375
+ msgstr ""
376
+
377
+ #: application/admin/GeneralConfig.php:265
378
+ msgid "Default filter"
379
+ msgstr ""
380
+
381
+ #: application/admin/GeneralConfig.php:266
382
+ msgid "Whitelist attribute names"
383
+ msgstr ""
384
+
385
+ #: application/admin/GeneralConfig.php:267
386
+ msgid "Blacklist attribute names"
387
+ msgstr ""
388
+
389
+ #: application/admin/GeneralConfig.php:273
390
+ msgid "Attributes list"
391
+ msgstr ""
392
+
393
+ #: application/admin/GeneralConfig.php:274
394
+ msgid "Black / white list of woocommerce global (filterable) attributes. Enter a comma separated list."
395
+ msgstr ""
396
+
397
  #: application/admin/ImportExportController.php:26
398
  msgid "Import/Export"
399
  msgstr ""
452
  msgid " back"
453
  msgstr ""
454
 
455
+ #: application/admin/PluginAdmin.php:79
456
  msgid "Are you sure?"
457
  msgstr ""
458
 
459
+ #: application/admin/PrefillController.php:35
460
+ #: application/admin/views/prefill.php:89
461
+ msgid "Future"
462
+ msgstr ""
463
+
464
+ #: application/admin/PrefillController.php:62
465
+ #: application/admin/views/prefill.php:12
466
  msgid "Fill"
467
  msgstr ""
468
 
469
+ #: application/admin/PrefillController.php:117
470
  msgid "Data already exist."
471
  msgstr ""
472
 
473
+ #: application/admin/PrefillController.php:130
474
  msgid "Impossible to determine a keyword"
475
  msgstr ""
476
 
477
+ #: application/admin/PrefillController.php:139
478
  msgid "Keyword for autoupdate already exists."
479
  msgstr ""
480
 
481
+ #: application/admin/PrefillController.php:152
482
+ #: application/admin/views/metabox_module.php:89
 
 
 
 
483
  msgid "Error:"
484
  msgstr ""
485
 
486
+ #: application/admin/PrefillController.php:159
487
+ #: application/admin/views/metabox_module.php:54
488
  msgid "No data found..."
489
  msgstr ""
490
 
491
+ #: application/admin/PrefillController.php:165
492
  msgid "Data saved:"
493
  msgstr ""
494
 
702
  msgstr ""
703
 
704
  #: application/admin/views/_metabox_autoblog.php:216
705
+ #: application/admin/views/_metabox_autoblog.php:434
706
+ #: application/admin/views/_metabox_autoblog.php:456
707
  msgid "\"Formulas\", and also all tags from title template, will also work here."
708
  msgstr ""
709
 
728
  msgstr ""
729
 
730
  #: application/admin/views/_metabox_autoblog.php:260
731
+ #: application/admin/views/prefill.php:86
732
  msgid "Post status"
733
  msgstr ""
734
 
735
  #: application/admin/views/_metabox_autoblog.php:272
736
+ #: application/admin/views/prefill.php:74
737
  msgid "Post type"
738
  msgstr ""
739
 
756
  #: application/modules/Pepperjam/PepperjamConfig.php:96
757
  #: application/modules/Pixabay/PixabayConfig.php:108
758
  #: application/modules/TradedoublerProducts/TradedoublerProductsConfig.php:57
759
+ #: application/modules/Viglink/ViglinkConfig.php:76
760
  msgid "Category "
761
  msgstr ""
762
 
763
+ #: application/admin/views/_metabox_autoblog.php:316
764
  msgid "Create Automatically"
765
  msgstr ""
766
 
767
+ #: application/admin/views/_metabox_autoblog.php:328
768
  msgid "Default category for posts."
769
  msgstr ""
770
 
771
+ #: application/admin/views/_metabox_autoblog.php:330
772
  msgid "\"Create Automatically\" means, that categories will be created based on data of CSV file with keywords and categories."
773
  msgstr ""
774
 
775
+ #: application/admin/views/_metabox_autoblog.php:338
776
  msgid "Dynamic categories"
777
  msgstr ""
778
 
779
+ #: application/admin/views/_metabox_autoblog.php:342
780
  msgid "Do not create"
781
  msgstr ""
782
 
783
+ #: application/admin/views/_metabox_autoblog.php:343
784
  msgid "Create category"
785
  msgstr ""
786
 
787
+ #: application/admin/views/_metabox_autoblog.php:344
788
  msgid "Create nested categories"
789
  msgstr ""
790
 
791
+ #: application/admin/views/_metabox_autoblog.php:346
792
  msgid "Create a category automatically, if the main product has a category data."
793
  msgstr ""
794
 
795
+ #: application/admin/views/_metabox_autoblog.php:352
796
  msgid "Minimum modules required"
797
  msgstr ""
798
 
799
+ #: application/admin/views/_metabox_autoblog.php:357
800
  msgid "Post will not be published if no content for such number of modules."
801
  msgstr ""
802
 
803
+ #: application/admin/views/_metabox_autoblog.php:363
804
  msgid "Minimum reviews required"
805
  msgstr ""
806
 
807
+ #: application/admin/views/_metabox_autoblog.php:368
808
  msgid "Post will not be published if there are no user reviews. This option works only for AE modules."
809
  msgstr ""
810
 
811
+ #: application/admin/views/_metabox_autoblog.php:374
812
  #: application/modules/AdmitadProducts/AdmitadProductsConfig.php:150
813
  msgid "Automatic update"
814
  msgstr ""
815
 
816
+ #: application/admin/views/_metabox_autoblog.php:385
817
  msgid "For selected modules, the current keyword will be used as a keyword for autoupdate. Data of the module will be updated periodically In accordance with the configuration of the lifetime of the cache."
818
  msgstr ""
819
 
820
+ #: application/admin/views/_metabox_autoblog.php:391
821
  msgid "Required modules"
822
  msgstr ""
823
 
824
+ #: application/admin/views/_metabox_autoblog.php:402
825
  msgid "Post will not be publicized if no results for these modules."
826
  msgstr ""
827
 
828
+ #: application/admin/views/_metabox_autoblog.php:409
829
  msgid "Main product"
830
  msgstr ""
831
 
832
+ #: application/admin/views/_metabox_autoblog.php:418
 
 
 
 
 
 
 
 
 
 
 
 
833
  msgid "How to choose \"main\" product?"
834
  msgstr ""
835
 
836
+ #: application/admin/views/_metabox_autoblog.php:419
837
  msgid "Then you can use tags:"
838
  msgstr ""
839
 
840
+ #: application/admin/views/_metabox_autoblog.php:426
841
  msgid "Tags"
842
  msgstr ""
843
 
844
+ #: application/admin/views/_metabox_autoblog.php:433
845
  msgid "Comma separated list of tags."
846
  msgstr ""
847
 
848
+ #: application/admin/views/_metabox_autoblog.php:442
849
+ #: application/admin/views/prefill.php:105
850
  msgid "Add custom fields"
851
  msgstr ""
852
 
853
+ #: application/admin/views/_metabox_autoblog.php:447
854
  msgid "Custom Field"
855
  msgstr ""
856
 
857
+ #: application/admin/views/_metabox_autoblog.php:452
858
  msgid "Value"
859
  msgstr ""
860
 
861
+ #: application/admin/views/_metabox_results.php:18
862
  #: application/components/ParserModuleConfig.php:57
863
  #: application/modules/Offer/views/metabox_module.php:53
864
  #: application/modules/Youtube/YoutubeConfig.php:64
865
+ #: application/modules/Youtube/views/search_panel.php:13
866
  msgid "Title"
867
  msgstr ""
868
 
869
+ #: application/admin/views/_metabox_results.php:19
870
  #: application/modules/Offer/views/metabox_module.php:95
871
  msgid "Description"
872
  msgstr ""
873
 
874
+ #: application/admin/views/_metabox_results.php:21
875
+ msgid "Woo synchronization"
876
+ msgstr ""
877
+
878
+ #: application/admin/views/_metabox_results.php:23
879
+ msgid "Woo attributes"
880
+ msgstr ""
881
+
882
+ #: application/admin/views/_metabox_results.php:27
883
  #: application/admin/views/_promo_box.php:42
884
  #: application/modules/Offer/views/metabox_module.php:98
885
  msgid "Go to "
886
  msgstr ""
887
 
888
+ #: application/admin/views/_metabox_results.php:31
889
+ msgid "Last update:"
 
890
  msgstr ""
891
 
892
+ #: application/admin/views/_metabox_search_results.php:13
893
+ msgid "Attributes:"
894
  msgstr ""
895
 
896
+ #: application/admin/views/_metabox_search_results.php:14
897
+ msgid "EAN:"
898
+ msgstr ""
899
+
900
+ #: application/admin/views/_metabox_search_results.php:17
901
  #: application/modules/CjLinks/views/search_results.php:16
902
  msgid "Coupon code:"
903
  msgstr ""
1049
  msgid "Find all"
1050
  msgstr ""
1051
 
1052
+ #: application/admin/views/metabox_general.php:37
1053
+ #: application/admin/views/metabox_module.php:80
1054
  msgid "Add all"
1055
  msgstr ""
1056
 
1057
+ #: application/admin/views/metabox_general.php:38
1058
  msgid "Are you sure you want to delete the results of all modules?"
1059
  msgstr ""
1060
 
1061
+ #: application/admin/views/metabox_general.php:38
1062
+ #: application/admin/views/metabox_module.php:49
1063
  #: application/modules/Offer/views/metabox_module.php:36
1064
  msgid "Delete all"
1065
  msgstr ""
1066
 
1067
+ #: application/admin/views/metabox_module.php:27
1068
  #: application/modules/Offer/views/metabox_module.php:26
1069
  msgid "Output Template for shortcode"
1070
  msgstr ""
1071
 
1072
+ #: application/admin/views/metabox_module.php:37
1073
+ msgid "Keyword for update"
1074
  msgstr ""
1075
 
1076
+ #: application/admin/views/metabox_module.php:37
1077
+ msgid "Keyword for automatic update"
1078
+ msgstr ""
1079
+
1080
+ #: application/admin/views/metabox_module.php:49
1081
  #: application/modules/Offer/views/metabox_module.php:36
1082
  msgid "Are you sure you want to delete all results?"
1083
  msgstr ""
1084
 
1085
+ #: application/admin/views/metabox_module.php:58
1086
  #: application/modules/GoogleImages/GoogleImagesConfig.php:160
1087
  msgid "Search"
1088
  msgstr ""
1089
 
1090
+ #: application/admin/views/metabox_module.php:64
1091
  msgid "Keyword for search"
1092
  msgstr ""
1093
 
1094
+ #: application/admin/views/metabox_module.php:66
1095
  msgid "Find"
1096
  msgstr ""
1097
 
1098
+ #: application/admin/views/metabox_module.php:88
1099
  msgid "Not found..."
1100
  msgstr ""
1101
 
1102
+ #: application/admin/views/prefill.php:15
1103
  msgid "This extension will fill module's data for all existed posts."
1104
  msgstr ""
1105
 
1106
+ #: application/admin/views/prefill.php:16
1107
  msgid "All existing data and keywords will not be erased or overwritten."
1108
  msgstr ""
1109
 
1110
+ #: application/admin/views/prefill.php:20
1111
  msgid "Add data for module"
1112
  msgstr ""
1113
 
1114
+ #: application/admin/views/prefill.php:30
1115
  msgid "Keyword source"
1116
  msgstr ""
1117
 
1118
+ #: application/admin/views/prefill.php:33
1119
  msgid "Calculate as base of the density of keywords inside post"
1120
  msgstr ""
1121
 
1122
+ #: application/admin/views/prefill.php:34
1123
  msgid "Title for post"
1124
  msgstr ""
1125
 
1126
+ #: application/admin/views/prefill.php:35
1127
  msgid "Post tags"
1128
  msgstr ""
1129
 
1130
  #: application/admin/views/prefill.php:36
1131
+ msgid "Arbitrary custom field"
1132
+ msgstr ""
1133
+
1134
+ #: application/admin/views/prefill.php:38
1135
  msgid "Copy from"
1136
  msgstr ""
1137
 
1138
+ #: application/admin/views/prefill.php:41
1139
+ msgid "Set the name of a custom field"
1140
+ msgstr ""
1141
+
1142
+ #: application/admin/views/prefill.php:46
1143
  msgid "Autoupdate"
1144
  msgstr ""
1145
 
1146
+ #: application/admin/views/prefill.php:48
1147
  msgid "Add Keyword for the automatic update"
1148
  msgstr ""
1149
 
1150
+ #: application/admin/views/prefill.php:49
1151
  msgid "Only for those modules, which have autoupdate function."
1152
  msgstr ""
1153
 
1154
+ #: application/admin/views/prefill.php:54
1155
  msgid "Number of words"
1156
  msgstr ""
1157
 
1158
+ #: application/admin/views/prefill.php:61
1159
  msgid "Maximum words for one search query."
1160
  msgstr ""
1161
 
1162
+ #: application/admin/views/prefill.php:66
1163
  msgid "\"Minus\" words"
1164
  msgstr ""
1165
 
1166
+ #: application/admin/views/prefill.php:69
1167
  msgid "Remove these words from keyword. You can set several minus words/phrases with commas."
1168
  msgstr ""
1169
 
1170
+ #: application/admin/views/prefill.php:81
1171
+ #: application/admin/views/prefill.php:100
1172
+ msgid "You can set all supported post types in General settings -> Post Types."
1173
+ msgstr ""
1174
+
1175
+ #: application/admin/views/prefill.php:108
1176
+ msgid "Custom Field %d"
1177
+ msgstr ""
1178
+
1179
+ #: application/admin/views/prefill.php:109
1180
+ msgid "Value %d"
1181
+ msgstr ""
1182
+
1183
+ #: application/admin/views/prefill.php:112
1184
+ msgid "You can use tags: %s."
1185
+ msgstr ""
1186
+
1187
+ #: application/admin/views/prefill.php:119
1188
+ #: application/models/AutoblogModel.php:76
1189
+ msgid "Total posts"
1190
+ msgstr ""
1191
+
1192
+ #: application/admin/views/prefill.php:123
1193
  msgid "Start"
1194
  msgstr ""
1195
 
1196
+ #: application/admin/views/prefill.php:124
1197
  msgid "Run again"
1198
  msgstr ""
1199
 
1200
+ #: application/admin/views/prefill.php:125
1201
  msgid "Stop"
1202
  msgstr ""
1203
 
1210
  msgid "General settings"
1211
  msgstr ""
1212
 
1213
+ #: application/admin/views/settings.php:72
1214
  msgid "Conditions"
1215
  msgstr ""
1216
 
1351
  msgid "Status"
1352
  msgstr ""
1353
 
 
 
 
 
1354
  #: application/models/AutoblogModel.php:77
1355
  msgid "Last error"
1356
  msgstr ""
1357
 
1358
+ #: application/models/AutoblogModel.php:203
1359
  msgid "Required module %s will not run. The module is not configured or deleted."
1360
  msgstr ""
1361
 
1362
+ #: application/models/AutoblogModel.php:269
1363
  msgid "Data was not found for required module %s."
1364
  msgstr ""
1365
 
1366
+ #: application/models/AutoblogModel.php:276
1367
  msgid "It does not reach the desired amount of data. Minimum required modules: %d."
1368
  msgstr ""
1369
 
1370
+ #: application/models/AutoblogModel.php:292
1371
  msgid "Total reviews found: %d. Minimum reviews required: %d."
1372
  msgstr ""
1373
 
1374
+ #: application/models/AutoblogModel.php:376
1375
  msgid "Post can't be created. Unknown error."
1376
  msgstr ""
1377
 
1426
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:92
1427
  #: application/modules/Twitter/TwitterConfig.php:80
1428
  #: application/modules/Udemy/UdemyConfig.php:64
1429
+ #: application/modules/Viglink/ViglinkConfig.php:50
1430
  #: application/modules/VkNews/VkNewsConfig.php:20
1431
  #: application/modules/Youtube/YoutubeConfig.php:35
1432
  #: application/modules/Zanox/ZanoxConfig.php:45
1461
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:93
1462
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:93
1463
  #: application/modules/Udemy/UdemyConfig.php:65
1464
+ #: application/modules/Viglink/ViglinkConfig.php:51
1465
  #: application/modules/Zanox/ZanoxConfig.php:46
1466
  msgid "Number of results for one search query."
1467
  msgstr ""
1506
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:103
1507
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:103
1508
  #: application/modules/Udemy/UdemyConfig.php:79
1509
+ #: application/modules/Viglink/ViglinkConfig.php:60
1510
  #: application/modules/Zanox/ZanoxConfig.php:61
1511
  msgid "Results for updates "
1512
  msgstr ""
1539
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:104
1540
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:104
1541
  #: application/modules/Udemy/UdemyConfig.php:80
1542
+ #: application/modules/Viglink/ViglinkConfig.php:61
1543
  #: application/modules/Zanox/ZanoxConfig.php:62
1544
  msgid "Number of results for automatic updates and autoblogging."
1545
  msgstr ""
1557
  #: application/modules/Affiliatewindow/AffiliatewindowConfig.php:128
1558
  #: application/modules/AffilinetProducts/AffilinetProductsConfig.php:165
1559
  #: application/modules/Aliexpress/AliexpressConfig.php:258
1560
+ #: application/modules/Amazon/AmazonConfig.php:267
1561
  #: application/modules/BingImages/BingImagesConfig.php:202
1562
  #: application/modules/CityadsProducts/CityadsProductsConfig.php:215
1563
  #: application/modules/CjProducts/CjProductsConfig.php:216
1564
+ #: application/modules/Ebay/EbayConfig.php:355
1565
  #: application/modules/Envato/EnvatoConfig.php:207
1566
  #: application/modules/Flickr/FlickrConfig.php:104
1567
  #: application/modules/Flipkart/FlipkartConfig.php:92
1585
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:168
1586
  #: application/modules/Twitter/TwitterConfig.php:125
1587
  #: application/modules/Udemy/UdemyConfig.php:212
1588
+ #: application/modules/Viglink/ViglinkConfig.php:123
1589
  #: application/modules/VkNews/VkNewsConfig.php:42
1590
  #: application/modules/Zanox/ZanoxConfig.php:152
1591
  msgid "Save images"
1596
  #: application/modules/Affiliatewindow/AffiliatewindowConfig.php:129
1597
  #: application/modules/AffilinetProducts/AffilinetProductsConfig.php:166
1598
  #: application/modules/Aliexpress/AliexpressConfig.php:259
1599
+ #: application/modules/Amazon/AmazonConfig.php:268
1600
  #: application/modules/BingImages/BingImagesConfig.php:203
1601
  #: application/modules/CityadsProducts/CityadsProductsConfig.php:216
1602
  #: application/modules/CjProducts/CjProductsConfig.php:217
1603
+ #: application/modules/Ebay/EbayConfig.php:356
1604
  #: application/modules/Envato/EnvatoConfig.php:208
1605
  #: application/modules/Flickr/FlickrConfig.php:105
1606
  #: application/modules/Flipkart/FlipkartConfig.php:93
1623
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:169
1624
  #: application/modules/Twitter/TwitterConfig.php:126
1625
  #: application/modules/Udemy/UdemyConfig.php:213
1626
+ #: application/modules/Viglink/ViglinkConfig.php:124
1627
  #: application/modules/VkNews/VkNewsConfig.php:43
1628
  #: application/modules/Zanox/ZanoxConfig.php:153
1629
  msgid "Save images on server"
1654
  msgstr ""
1655
 
1656
  #: application/modules/AdmitadCoupons/AdmitadCouponsModule.php:25
1657
+ #: application/modules/AdmitadProducts/AdmitadProductsModule.php:25
1658
  #: application/modules/TradedoublerCoupons/TradedoublerCouponsModule.php:25
1659
  msgid "You must get approve for each program separately."
1660
  msgstr ""
1696
  msgstr ""
1697
 
1698
  #: application/modules/AdmitadProducts/AdmitadProductsConfig.php:88
1699
+ #: application/modules/Amazon/views/search_panel.php:26
1700
  msgid "Discount"
1701
  msgstr ""
1702
 
1799
  msgid "Update products"
1800
  msgstr ""
1801
 
1802
+ #: application/modules/AdmitadProducts/AdmitadProductsModule.php:25
1803
  msgid "Add products from <a href=\"https://www.admitad.com/ru/promo/?ref=770f943d83\">Admitad</a>."
1804
  msgstr ""
1805
 
1806
+ #: application/modules/AdmitadProducts/AdmitadProductsModule.php:26
1807
  msgid "Used API the <a href=\"https://www.admitadgoods.ru/en.html\" target=\"_blank\">Admitad Goods</a> WP plugin."
1808
  msgstr ""
1809
 
1810
+ #: application/modules/AdmitadProducts/views/search_panel.php:2
1811
+ #: application/modules/AffilinetProducts/views/search_panel.php:2
1812
+ #: application/modules/Aliexpress/views/search_panel.php:2
1813
+ #: application/modules/Aliexpress/views/update_panel.php:2
1814
+ #: application/modules/Amazon/views/search_panel.php:45
1815
+ #: application/modules/Amazon/views/update_panel.php:2
1816
+ #: application/modules/CjProducts/views/search_panel.php:2
1817
+ #: application/modules/Ebay/views/search_panel.php:2
1818
+ #: application/modules/Ebay/views/update_panel.php:2
1819
+ #: application/modules/Impactradius/views/search_panel.php:2
1820
+ #: application/modules/Optimisemedia/views/search_panel.php:2
1821
+ #: application/modules/PayTM/views/search_panel.php:2
1822
+ #: application/modules/TradedoublerProducts/views/search_panel.php:2
1823
+ #: application/modules/Viglink/views/search_panel.php:2
1824
+ #: application/modules/Viglink/views/update_panel.php:2
1825
+ #: application/modules/Zanox/views/search_panel.php:2
1826
+ msgid "Min. price"
1827
+ msgstr ""
1828
+
1829
+ #: application/modules/AdmitadProducts/views/search_panel.php:5
1830
+ #: application/modules/AffilinetProducts/views/search_panel.php:5
1831
+ #: application/modules/Aliexpress/views/search_panel.php:5
1832
+ #: application/modules/Aliexpress/views/update_panel.php:5
1833
+ #: application/modules/Amazon/views/search_panel.php:48
1834
+ #: application/modules/Amazon/views/update_panel.php:5
1835
+ #: application/modules/CjProducts/views/search_panel.php:5
1836
+ #: application/modules/Ebay/views/search_panel.php:5
1837
+ #: application/modules/Ebay/views/update_panel.php:5
1838
+ #: application/modules/Impactradius/views/search_panel.php:5
1839
+ #: application/modules/Optimisemedia/views/search_panel.php:5
1840
+ #: application/modules/PayTM/views/search_panel.php:5
1841
+ #: application/modules/TradedoublerProducts/views/search_panel.php:5
1842
+ #: application/modules/Viglink/views/search_panel.php:5
1843
+ #: application/modules/Viglink/views/update_panel.php:5
1844
+ #: application/modules/Zanox/views/search_panel.php:5
1845
+ msgid "Max. price"
1846
+ msgstr ""
1847
+
1848
  #: application/modules/Affiliatewindow/AffiliatewindowConfig.php:23
1849
  msgid "Access key for ProductServe API (ShopWindow Client) V3. You can get it <a href=\"https://www.affiliatewindow.com/affiliates/accountdetails.php\">here</a>."
1850
  msgstr ""
2020
  msgstr ""
2021
 
2022
  #: application/modules/Aliexpress/AliexpressConfig.php:235
2023
+ #: application/modules/Viglink/ViglinkConfig.php:87
2024
  msgid "Price low to high"
2025
  msgstr ""
2026
 
2027
  #: application/modules/Aliexpress/AliexpressConfig.php:236
2028
+ #: application/modules/Viglink/ViglinkConfig.php:88
2029
  msgid "Price high to low"
2030
  msgstr ""
2031
 
2062
  msgid "Adds items from aliexpress.com"
2063
  msgstr ""
2064
 
2065
+ #: application/modules/Aliexpress/views/update_panel.php:2
2066
+ #: application/modules/Amazon/views/update_panel.php:2
2067
+ #: application/modules/Ebay/views/update_panel.php:2
2068
+ #: application/modules/Viglink/views/update_panel.php:2
2069
+ msgid "Min. price for automatic update"
2070
+ msgstr ""
2071
+
2072
+ #: application/modules/Aliexpress/views/update_panel.php:5
2073
+ #: application/modules/Amazon/views/update_panel.php:5
2074
+ #: application/modules/Ebay/views/update_panel.php:5
2075
+ #: application/modules/Viglink/views/update_panel.php:5
2076
+ msgid "Max. price for automatic update"
2077
+ msgstr ""
2078
+
2079
  #: application/modules/Amazon/AmazonConfig.php:22
2080
  msgid "Special key to access the Amazon API."
2081
  msgstr ""
2219
  msgid "Get user reviews. Reviews will be in iframe. Iframe url is valid only 24 hours, please, use autoupdating function with less than 24 hour to keep actual url."
2220
  msgstr ""
2221
 
2222
+ #: application/modules/Amazon/AmazonConfig.php:218
2223
  #: application/modules/Market/MarketConfig.php:138
2224
  #: application/modules/Ozon/OzonConfig.php:155
2225
  msgid "Cut reviews"
2226
  msgstr ""
2227
 
2228
+ #: application/modules/Amazon/AmazonConfig.php:219
2229
  msgid "Number of characters for one review. 0 - the maximal length of the text."
2230
  msgstr ""
2231
 
2232
+ #: application/modules/Amazon/AmazonConfig.php:229
2233
  msgid "Parse description"
2234
  msgstr ""
2235
 
2236
+ #: application/modules/Amazon/AmazonConfig.php:230
2237
  msgid "Parse description of products from seller"
2238
  msgstr ""
2239
 
2240
+ #: application/modules/Amazon/AmazonConfig.php:236
2241
  msgid "Type of description"
2242
  msgstr ""
2243
 
2244
+ #: application/modules/Amazon/AmazonConfig.php:240
2245
  msgid "Like on Amazon"
2246
  msgstr ""
2247
 
2248
+ #: application/modules/Amazon/AmazonConfig.php:241
2249
  msgid "Safe HTML"
2250
  msgstr ""
2251
 
2252
+ #: application/modules/Amazon/AmazonConfig.php:242
2253
  msgid "Only allowed HTML tags"
2254
  msgstr ""
2255
 
2256
+ #: application/modules/Amazon/AmazonConfig.php:243
2257
  msgid "Text only"
2258
  msgstr ""
2259
 
2260
+ #: application/modules/Amazon/AmazonConfig.php:249
2261
+ #: application/modules/Ebay/EbayConfig.php:344
2262
  msgid "Size of description"
2263
  msgstr ""
2264
 
2265
+ #: application/modules/Amazon/AmazonConfig.php:250
2266
+ #: application/modules/Ebay/EbayConfig.php:345
2267
  msgid "The maximum size of the item description. 0 - do not cut."
2268
  msgstr ""
2269
 
2270
+ #: application/modules/Amazon/AmazonConfig.php:260
2271
  msgid "Use images with https (use it if you also have https site)"
2272
  msgstr ""
2273
 
2274
+ #: application/modules/Amazon/AmazonConfig.php:261
2275
  msgid "Rewrite url of images with https. Use it if you have SSL on your domain"
2276
  msgstr ""
2277
 
2278
+ #: application/modules/Amazon/AmazonConfig.php:268
2279
  msgid "Enabling this option violates rules of API."
2280
  msgstr ""
2281
 
2282
+ #: application/modules/Amazon/AmazonConfig.php:278
2283
  msgid "Tracking ID for %s locale"
2284
  msgstr ""
2285
 
2286
+ #: application/modules/Amazon/AmazonConfig.php:279
2287
  msgid "Type here your tracking ID for this locale if you need multiple locale parsing"
2288
  msgstr ""
2289
 
2290
+ #: application/modules/Amazon/AmazonModule.php:29
2291
+ msgid "Adds products from Amazon."
 
 
 
 
2292
  msgstr ""
2293
 
2294
+ #: application/modules/Amazon/views/search_panel.php:27
2295
  msgid "5%"
2296
  msgstr ""
2297
 
2298
+ #: application/modules/Amazon/views/search_panel.php:28
2299
  msgid "10%"
2300
  msgstr ""
2301
 
2302
+ #: application/modules/Amazon/views/search_panel.php:29
2303
  msgid "15%"
2304
  msgstr ""
2305
 
2306
+ #: application/modules/Amazon/views/search_panel.php:30
2307
  msgid "20%"
2308
  msgstr ""
2309
 
2310
+ #: application/modules/Amazon/views/search_panel.php:31
2311
  msgid "25%"
2312
  msgstr ""
2313
 
2314
+ #: application/modules/Amazon/views/search_panel.php:32
2315
  msgid "30%"
2316
  msgstr ""
2317
 
2318
+ #: application/modules/Amazon/views/search_panel.php:33
2319
  msgid "35%"
2320
  msgstr ""
2321
 
2322
+ #: application/modules/Amazon/views/search_panel.php:34
2323
  msgid "40%"
2324
  msgstr ""
2325
 
2326
+ #: application/modules/Amazon/views/search_panel.php:35
2327
  msgid "50%"
2328
  msgstr ""
2329
 
2330
+ #: application/modules/Amazon/views/search_panel.php:36
2331
  msgid "60%"
2332
  msgstr ""
2333
 
2334
+ #: application/modules/Amazon/views/search_panel.php:37
2335
  msgid "70%"
2336
  msgstr ""
2337
 
2338
+ #: application/modules/Amazon/views/search_panel.php:38
2339
  msgid "80%"
2340
  msgstr ""
2341
 
2342
+ #: application/modules/Amazon/views/search_panel.php:39
2343
  msgid "90%"
2344
  msgstr ""
2345
 
2346
+ #: application/modules/Amazon/views/search_panel.php:45
2347
+ msgid "Min. price."
2348
+ msgstr ""
2349
+
2350
+ #: application/modules/Amazon/views/search_panel.php:45
2351
+ #: application/modules/Amazon/views/search_panel.php:48
2352
+ msgid "It require that you specify a category."
2353
+ msgstr ""
2354
+
2355
+ #: application/modules/Amazon/views/search_panel.php:48
2356
+ msgid "Max. price."
2357
+ msgstr ""
2358
+
2359
  #: application/modules/BingImages/BingImagesConfig.php:21
2360
+ msgid "Key access to Bing Search API. You can get <a href=\"https://azure.microsoft.com/en-us/try/cognitive-services/?api=bing-image-search-api\">here</a>."
2361
  msgstr ""
2362
 
2363
  #: application/modules/BingImages/BingImagesConfig.php:22
2481
  msgstr ""
2482
 
2483
  #: application/modules/BingImages/BingImagesConfig.php:90
2484
+ #: application/modules/BingImages/views/search_panel.php:4
2485
  msgid "Public"
2486
  msgstr ""
2487
 
2488
  #: application/modules/BingImages/BingImagesConfig.php:91
2489
+ #: application/modules/BingImages/views/search_panel.php:5
2490
  msgid "Share"
2491
  msgstr ""
2492
 
2495
  msgstr ""
2496
 
2497
  #: application/modules/BingImages/BingImagesConfig.php:93
2498
+ #: application/modules/BingImages/views/search_panel.php:7
2499
  msgid "Modify"
2500
  msgstr ""
2501
 
2502
  #: application/modules/BingImages/BingImagesConfig.php:94
2503
  #: application/modules/BingImages/BingImagesConfig.php:186
2504
+ #: application/modules/BingImages/views/search_panel.php:8
2505
  msgid "Modify commercially"
2506
  msgstr ""
2507
 
2702
  msgstr ""
2703
 
2704
  #: application/modules/BingImages/templates/data_simple.php:5
2705
+ #: application/modules/GoogleNews/templates/data_simple.php:5
2706
+ #: application/modules/RelatedKeywords/templates/data_simple.php:5
2707
+ #: application/modules/RssFetcher/templates/data_simple.php:5
2708
  msgid "Simple"
2709
  msgstr ""
2710
 
2713
  msgid "Source: %s"
2714
  msgstr ""
2715
 
2716
+ #: application/modules/BingImages/views/search_panel.php:3
2717
  #: application/modules/Flickr/FlickrConfig.php:75
2718
+ #: application/modules/Flickr/views/search_panel.php:3
2719
  #: application/modules/GoogleImages/GoogleImagesConfig.php:24
2720
+ #: application/modules/GoogleImages/views/search_panel.php:3
2721
  #: application/modules/Youtube/YoutubeConfig.php:76
2722
+ #: application/modules/Youtube/views/search_panel.php:3
2723
  msgid "Any license"
2724
  msgstr ""
2725
 
2726
+ #: application/modules/BingImages/views/search_panel.php:6
2727
  msgid "Share commercially"
2728
  msgstr ""
2729
 
3120
  msgid "Payment options"
3121
  msgstr ""
3122
 
3123
+ #: application/modules/Ebay/EbayConfig.php:309
3124
+ msgid "Available to"
3125
+ msgstr ""
3126
+
3127
+ #: application/modules/Ebay/EbayConfig.php:310
3128
+ msgid "Limits items to those available to the specified country only. Expects the two-letter ISO 3166 country code."
3129
+ msgstr ""
3130
+
3131
+ #: application/modules/Ebay/EbayConfig.php:337
3132
  msgid "Get description"
3133
  msgstr ""
3134
 
3135
+ #: application/modules/Ebay/EbayConfig.php:338
3136
  msgid "Get description of product. This takes more requests for Ebay API and slow down searching. Description will be requested only for 20 first products for one searching"
3137
  msgstr ""
3138
 
3156
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:60
3157
  #: application/modules/Udemy/UdemyConfig.php:29
3158
  #: application/modules/Udemy/UdemyConfig.php:44
3159
+ #: application/modules/Viglink/ViglinkConfig.php:31
3160
+ #: application/modules/Viglink/ViglinkConfig.php:45
3161
  msgid "The field \"%s\" can not be empty."
3162
  msgstr ""
3163
 
3199
 
3200
  #: application/modules/Envato/EnvatoConfig.php:118
3201
  #: application/modules/Youtube/YoutubeConfig.php:61
3202
+ #: application/modules/Youtube/views/search_panel.php:10
3203
  msgid "Date"
3204
  msgstr ""
3205
 
3261
  msgstr ""
3262
 
3263
  #: application/modules/Flickr/FlickrConfig.php:61
3264
+ #: application/modules/Flickr/views/search_panel.php:12
3265
  #: application/modules/GoogleBooks/GoogleBooksConfig.php:99
3266
  #: application/modules/Ozon/OzonConfig.php:66
3267
+ #: application/modules/Viglink/ViglinkConfig.php:86
3268
  #: application/modules/Youtube/YoutubeConfig.php:63
3269
+ #: application/modules/Youtube/views/search_panel.php:12
3270
  msgid "Relevance"
3271
  msgstr ""
3272
 
3273
  #: application/modules/Flickr/FlickrConfig.php:62
3274
+ #: application/modules/Flickr/views/search_panel.php:13
3275
  msgid "Date of post"
3276
  msgstr ""
3277
 
3278
  #: application/modules/Flickr/FlickrConfig.php:63
3279
+ #: application/modules/Flickr/views/search_panel.php:14
3280
  msgid "Date of shooting"
3281
  msgstr ""
3282
 
3283
  #: application/modules/Flickr/FlickrConfig.php:64
3284
+ #: application/modules/Flickr/views/search_panel.php:15
3285
  msgid "First interesting"
3286
  msgstr ""
3287
 
3296
  msgstr ""
3297
 
3298
  #: application/modules/Flickr/FlickrConfig.php:76
3299
+ #: application/modules/Flickr/views/search_panel.php:4
3300
  #: application/modules/GoogleImages/GoogleImagesConfig.php:25
3301
+ #: application/modules/GoogleImages/views/search_panel.php:4
3302
  msgid "Any Creative Commons"
3303
  msgstr ""
3304
 
3305
  #: application/modules/Flickr/FlickrConfig.php:77
3306
+ #: application/modules/Flickr/views/search_panel.php:5
3307
  #: application/modules/GoogleImages/GoogleImagesConfig.php:26
3308
+ #: application/modules/GoogleImages/views/search_panel.php:5
3309
  msgid "With Allow of commercial use"
3310
  msgstr ""
3311
 
3312
  #: application/modules/Flickr/FlickrConfig.php:78
3313
+ #: application/modules/Flickr/views/search_panel.php:6
3314
  #: application/modules/GoogleImages/GoogleImagesConfig.php:27
3315
+ #: application/modules/GoogleImages/views/search_panel.php:6
3316
  msgid "Allowed change"
3317
  msgstr ""
3318
 
3319
  #: application/modules/Flickr/FlickrConfig.php:79
3320
+ #: application/modules/Flickr/views/search_panel.php:7
3321
  #: application/modules/GoogleImages/GoogleImagesConfig.php:28
3322
+ #: application/modules/GoogleImages/views/search_panel.php:7
3323
  msgid "Commercial use and change"
3324
  msgstr ""
3325
 
3464
  msgid "Limit search by definite shop. You can find shop ID <a target=\"_blank\" href=\"http://api.gdeslon.ru/merchants\">here</a>. You can set multiple ID with comma."
3465
  msgstr ""
3466
 
3467
+ #: application/modules/GdeSlon/GdeSlonModule.php:27
3468
  msgid "Adds goods from gdeslon.ru."
3469
  msgstr ""
3470
 
3473
  msgstr ""
3474
 
3475
  #: application/modules/GoogleBooks/GoogleBooksConfig.php:67
3476
+ #: application/modules/Viglink/ViglinkConfig.php:70
3477
  msgid "Country"
3478
  msgstr ""
3479
 
3528
 
3529
  #: application/modules/GoogleImages/GoogleImagesConfig.php:105
3530
  #: application/modules/GoogleImages/GoogleImagesConfig.php:120
3531
+ #: application/modules/GoogleImages/views/search_panel.php:12
3532
  msgid "Any size"
3533
  msgstr ""
3534
 
3535
  #: application/modules/GoogleImages/GoogleImagesConfig.php:106
3536
+ #: application/modules/GoogleImages/views/search_panel.php:13
3537
  msgid "Small"
3538
  msgstr ""
3539
 
3540
  #: application/modules/GoogleImages/GoogleImagesConfig.php:107
3541
+ #: application/modules/GoogleImages/views/search_panel.php:14
3542
  msgid "Medium"
3543
  msgstr ""
3544
 
3545
  #: application/modules/GoogleImages/GoogleImagesConfig.php:108
3546
+ #: application/modules/GoogleImages/views/search_panel.php:15
3547
  msgid "Large"
3548
  msgstr ""
3549
 
3550
  #: application/modules/GoogleImages/GoogleImagesConfig.php:109
3551
+ #: application/modules/GoogleImages/views/search_panel.php:16
3552
  msgid "Huge"
3553
  msgstr ""
3554
 
3683
 
3684
  #: application/modules/Market/MarketConfig.php:80
3685
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:118
3686
+ #: application/modules/TradetrackerCoupons/views/search_panel.php:4
3687
  msgid "Offers"
3688
  msgstr ""
3689
 
3762
  #: application/modules/Offer/views/metabox_module.php:61
3763
  #: application/modules/Ozon/OzonConfig.php:172
3764
  #: application/modules/Youtube/YoutubeConfig.php:62
3765
+ #: application/modules/Youtube/views/search_panel.php:11
3766
  msgid "Rating"
3767
  msgstr ""
3768
 
4046
  msgstr ""
4047
 
4048
  #: application/modules/RelatedKeywords/RelatedKeywordsConfig.php:21
4049
+ msgid "Key access to Bing Autosuggest API. You can get <a href=\"https://azure.microsoft.com/en-us/try/cognitive-services/?api=autosuggest-api\">here</a>."
4050
  msgstr ""
4051
 
4052
  #: application/modules/RelatedKeywords/RelatedKeywordsConfig.php:30
4117
  msgid "Access key for Tradedoubler Coupons API. You can get it <a href=\"https://login.tradedoubler.com/publisher/aManageTokens.action\">here</a>."
4118
  msgstr ""
4119
 
4120
+ #: application/modules/TradedoublerCoupons/TradedoublerCouponsModule.php:25
4121
+ msgid "Adds coupons from Tradedoubler."
4122
+ msgstr ""
4123
+
4124
  #: application/modules/TradedoublerProducts/TradedoublerProductsConfig.php:21
4125
  msgid "Access key for Tradedoubler Products API. You can get it <a href=\"https://login.tradedoubler.com/publisher/aManageTokens.action\">here</a>."
4126
  msgstr ""
4162
  msgstr ""
4163
 
4164
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:117
4165
+ #: application/modules/TradetrackerCoupons/views/search_panel.php:3
4166
  msgid "Vouchers"
4167
  msgstr ""
4168
 
4169
  #: application/modules/TradetrackerCoupons/TradetrackerCouponsConfig.php:119
4170
+ #: application/modules/TradetrackerCoupons/views/search_panel.php:5
4171
  msgid "Text Links"
4172
  msgstr ""
4173
 
4203
  msgstr ""
4204
 
4205
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:150
4206
+ #: application/modules/Viglink/ViglinkConfig.php:93
4207
  msgid "Price From"
4208
  msgstr ""
4209
 
4210
  #: application/modules/TradetrackerProducts/TradetrackerProductsConfig.php:159
4211
+ #: application/modules/Viglink/ViglinkConfig.php:102
4212
  msgid "Price To"
4213
  msgstr ""
4214
 
4354
  msgid "Adds cources from %s."
4355
  msgstr ""
4356
 
4357
+ #: application/modules/Viglink/ViglinkConfig.php:21
4358
+ msgid "To track clicks by campaign, use your campaign-specific API Key."
4359
+ msgstr ""
4360
+
4361
+ #: application/modules/Viglink/ViglinkConfig.php:22
4362
+ msgid "You can find your API key in your <a target=\"_blank\" href=\"%s\">VigLink</a> account."
4363
+ msgstr ""
4364
+
4365
+ #: application/modules/Viglink/ViglinkConfig.php:23
4366
+ msgid "When logged into your dashboard, go to Manage -> Account. Under the My Campaign sub-heading, copy a API Key."
4367
+ msgstr ""
4368
+
4369
+ #: application/modules/Viglink/ViglinkConfig.php:37
4370
+ msgid "When logged into your dashboard, go to Manage -> Account. Under the My Campaign sub-heading, copy a Secret Key. If you don’t have one, click “Get a Secret Key\" on any of your campaigns."
4371
+ msgstr ""
4372
+
4373
+ #: application/modules/Viglink/ViglinkConfig.php:71
4374
+ msgid "Filter results to only include offers from a specific country. Please use ISO Alpha-2 country codes like \"us\" for United States. You can specify multiple countries separated by commas."
4375
+ msgstr ""
4376
+
4377
+ #: application/modules/Viglink/ViglinkConfig.php:77
4378
+ msgid "Filter your query by a specific category."
4379
+ msgstr ""
4380
+
4381
+ #: application/modules/Viglink/ViglinkConfig.php:83
4382
+ msgid "Sort order"
4383
+ msgstr ""
4384
+
4385
+ #: application/modules/Viglink/ViglinkConfig.php:111
4386
+ msgid "Merchant"
4387
+ msgstr ""
4388
+
4389
+ #: application/modules/Viglink/ViglinkConfig.php:112
4390
+ msgid "Filter your query by a specific merchant. Currently this filter is case-sensitive. The best way to ensure that it will return accurate results is to filter with a value <a target=\"_blank\" href=\"%s\">already discovered</a>. You can specify multiple merchants separated by commas."
4391
+ msgstr ""
4392
+
4393
+ #: application/modules/Viglink/ViglinkConfig.php:117
4394
+ msgid "Images filter"
4395
+ msgstr ""
4396
+
4397
+ #: application/modules/Viglink/ViglinkConfig.php:118
4398
+ msgid "Products with images"
4399
+ msgstr ""
4400
+
4401
+ #: application/modules/Viglink/ViglinkConfig.php:118
4402
+ msgid "Some merchants do not supply an image in their feeds. As such, you have the option here to filter out items that do not have a merchant-supplied image, or correctly structured image URL."
4403
+ msgstr ""
4404
+
4405
+ #: application/modules/Viglink/ViglinkConfig.php:134
4406
+ msgid "[ All ]"
4407
+ msgstr ""
4408
+
4409
+ #: application/modules/Viglink/ViglinkModule.php:26
4410
+ msgid "Module adds products from <a target=\"_blank\" href=\"%s\">VigLink</a>."
4411
+ msgstr ""
4412
+
4413
+ #: application/modules/Viglink/ViglinkModule.php:27
4414
+ msgid "Search for specific products from a vast catalog of over 350 million products."
4415
+ msgstr ""
4416
+
4417
  #: application/modules/VkNews/VkNewsModule.php:25
4418
  msgid "Adds news from Russian-language social network vk.com"
4419
  msgstr ""
4420
 
4421
  #: application/modules/Youtube/YoutubeConfig.php:65
4422
+ #: application/modules/Youtube/views/search_panel.php:14
4423
  msgid "Views"
4424
  msgstr ""
4425
 
4432
  msgstr ""
4433
 
4434
  #: application/modules/Youtube/YoutubeConfig.php:78
4435
+ #: application/modules/Youtube/views/search_panel.php:5
4436
  msgid "Standard license"
4437
  msgstr ""
4438
 
4439
+ #: application/modules/Youtube/views/search_panel.php:4
4440
  msgid "Creative Commons"
4441
  msgstr ""
4442
 
languages/tpl/content-egg-tpl.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the Content Egg package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Content Egg 3.6.0\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/content-egg-tpl\n"
7
- "POT-Creation-Date: 2017-04-08 09:51:07+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -128,11 +128,11 @@ msgstr ""
128
  msgid "If you don't want to receive any price alerts from us in the future, <a href=\"%s\">please click here</a>."
129
  msgstr ""
130
 
131
- #: application/ProductSearch.php:67
132
  msgid "Sorry. No products found."
133
  msgstr ""
134
 
135
- #: application/ProductSearch.php:112
136
  msgid "Search Results for \"%s\""
137
  msgstr ""
138
 
@@ -140,36 +140,36 @@ msgstr ""
140
  msgid "Product Search..."
141
  msgstr ""
142
 
143
- #: application/admin/GeneralConfig.php:160
144
- #: application/helpers/TemplateHelper.php:518
145
  msgid "Buy This Item"
146
  msgstr ""
147
 
148
- #: application/admin/GeneralConfig.php:169
149
- #: application/helpers/TemplateHelper.php:523
150
  msgid "Shop Sale"
151
  msgstr ""
152
 
153
- #: application/admin/views/_metabox_results.php:16
154
- #: application/admin/views/_metabox_search_results.php:12
155
- msgid "EAN:"
156
  msgstr ""
157
 
158
- #: application/admin/views/_metabox_results.php:17
159
  msgid "Last update:"
160
  msgstr ""
161
 
162
- #: application/components/ContentManager.php:380
163
  #: application/modules/Market/templates/data_item.php:127
164
  msgid "Pros:"
165
  msgstr ""
166
 
167
- #: application/components/ContentManager.php:382
168
  #: application/modules/Market/templates/data_item.php:128
169
  msgid "Cons:"
170
  msgstr ""
171
 
172
- #: application/components/ContentManager.php:455
173
  msgid "Rating"
174
  msgstr ""
175
 
@@ -197,7 +197,7 @@ msgstr ""
197
  msgid "m"
198
  msgstr ""
199
 
200
- #: application/helpers/TemplateHelper.php:314
201
  #: application/modules/Amazon/templates/data_compare.php:87
202
  #: application/modules/Ozon/templates/data_compare.php:67
203
  #: application/templates/data_price_tracker_alert.php:37
@@ -226,6 +226,7 @@ msgstr ""
226
  #: application/modules/TradedoublerProducts/templates/data_grid.php:7
227
  #: application/modules/TradetrackerProducts/templates/data_grid.php:7
228
  #: application/modules/Udemy/templates/data_grid.php:7
 
229
  #: application/modules/Zanox/templates/data_grid.php:7
230
  msgid "Grid"
231
  msgstr ""
@@ -254,6 +255,7 @@ msgstr ""
254
  #: application/modules/TradedoublerProducts/templates/data_item.php:7
255
  #: application/modules/TradetrackerProducts/templates/data_item.php:7
256
  #: application/modules/Udemy/templates/data_item.php:7
 
257
  #: application/modules/Zanox/templates/data_item.php:7
258
  msgid "Product card"
259
  msgstr ""
@@ -282,6 +284,7 @@ msgstr ""
282
  #: application/modules/TradedoublerProducts/templates/data_list.php:6
283
  #: application/modules/TradetrackerProducts/templates/data_list.php:6
284
  #: application/modules/Udemy/templates/data_list.php:6
 
285
  #: application/modules/Zanox/templates/data_list.php:6
286
  msgid "List"
287
  msgstr ""
@@ -305,6 +308,7 @@ msgstr ""
305
  #: application/modules/Shareasale/templates/data_price_tracker_alert.php:7
306
  #: application/modules/TradedoublerProducts/templates/data_price_tracker_alert.php:7
307
  #: application/modules/TradetrackerProducts/templates/data_price_tracker_alert.php:7
 
308
  #: application/modules/Zanox/templates/data_price_tracker_alert.php:7
309
  #: application/templates/data_price_tracker_alert.php:5
310
  msgid "Price tracker & alert"
@@ -383,11 +387,12 @@ msgstr ""
383
 
384
  #: application/modules/Amazon/templates/data_compare.php:141
385
  #: application/templates/blocks/item_features.php:3
386
- #: application/templates/blocks/item_features.php:13
387
  #: application/templates/blocks/item_features.php:22
388
  #: application/templates/blocks/item_features.php:31
389
  #: application/templates/blocks/item_features.php:40
390
  #: application/templates/blocks/item_features.php:49
 
391
  msgid "Features"
392
  msgstr ""
393
 
@@ -451,7 +456,7 @@ msgid "VIEW THIS ITEM"
451
  msgstr ""
452
 
453
  #: application/modules/Ebay/templates/data_item.php:58
454
- #: application/templates/data_grid.php:67
455
  msgid "Bids:"
456
  msgstr ""
457
 
@@ -510,6 +515,11 @@ msgstr ""
510
  msgid "Data from Yandex.Market"
511
  msgstr ""
512
 
 
 
 
 
 
513
  #: application/modules/Market/templates/data_item.php:83
514
  msgid "free"
515
  msgstr ""
@@ -564,7 +574,7 @@ msgstr ""
564
  msgid "Tile"
565
  msgstr ""
566
 
567
- #: application/templates/blocks/item_features.php:59
568
  msgid "Specifications"
569
  msgstr ""
570
 
@@ -635,8 +645,9 @@ msgstr ""
635
  msgid "OFF"
636
  msgstr ""
637
 
638
- #: application/templates/data_grid.php:85
639
- #: application/templates/data_list.php:85
 
640
  msgid "Last updated on"
641
  msgstr ""
642
 
2
  # This file is distributed under the same license as the Content Egg package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Content Egg 3.9.0\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/content-egg-tpl\n"
7
+ "POT-Creation-Date: 2017-07-28 14:34:55+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
128
  msgid "If you don't want to receive any price alerts from us in the future, <a href=\"%s\">please click here</a>."
129
  msgstr ""
130
 
131
+ #: application/ProductSearch.php:73
132
  msgid "Sorry. No products found."
133
  msgstr ""
134
 
135
+ #: application/ProductSearch.php:118
136
  msgid "Search Results for \"%s\""
137
  msgstr ""
138
 
140
  msgid "Product Search..."
141
  msgstr ""
142
 
143
+ #: application/admin/GeneralConfig.php:164
144
+ #: application/helpers/TemplateHelper.php:540
145
  msgid "Buy This Item"
146
  msgstr ""
147
 
148
+ #: application/admin/GeneralConfig.php:173
149
+ #: application/helpers/TemplateHelper.php:545
150
  msgid "Shop Sale"
151
  msgstr ""
152
 
153
+ #: application/admin/PrefillController.php:35
154
+ #: application/admin/views/prefill.php:89
155
+ msgid "Future"
156
  msgstr ""
157
 
158
+ #: application/admin/views/_metabox_results.php:31
159
  msgid "Last update:"
160
  msgstr ""
161
 
162
+ #: application/components/ContentManager.php:407
163
  #: application/modules/Market/templates/data_item.php:127
164
  msgid "Pros:"
165
  msgstr ""
166
 
167
+ #: application/components/ContentManager.php:409
168
  #: application/modules/Market/templates/data_item.php:128
169
  msgid "Cons:"
170
  msgstr ""
171
 
172
+ #: application/components/ContentManager.php:488
173
  msgid "Rating"
174
  msgstr ""
175
 
197
  msgid "m"
198
  msgstr ""
199
 
200
+ #: application/helpers/TemplateHelper.php:336
201
  #: application/modules/Amazon/templates/data_compare.php:87
202
  #: application/modules/Ozon/templates/data_compare.php:67
203
  #: application/templates/data_price_tracker_alert.php:37
226
  #: application/modules/TradedoublerProducts/templates/data_grid.php:7
227
  #: application/modules/TradetrackerProducts/templates/data_grid.php:7
228
  #: application/modules/Udemy/templates/data_grid.php:7
229
+ #: application/modules/Viglink/templates/data_grid.php:7
230
  #: application/modules/Zanox/templates/data_grid.php:7
231
  msgid "Grid"
232
  msgstr ""
255
  #: application/modules/TradedoublerProducts/templates/data_item.php:7
256
  #: application/modules/TradetrackerProducts/templates/data_item.php:7
257
  #: application/modules/Udemy/templates/data_item.php:7
258
+ #: application/modules/Viglink/templates/data_item.php:7
259
  #: application/modules/Zanox/templates/data_item.php:7
260
  msgid "Product card"
261
  msgstr ""
284
  #: application/modules/TradedoublerProducts/templates/data_list.php:6
285
  #: application/modules/TradetrackerProducts/templates/data_list.php:6
286
  #: application/modules/Udemy/templates/data_list.php:6
287
+ #: application/modules/Viglink/templates/data_list.php:6
288
  #: application/modules/Zanox/templates/data_list.php:6
289
  msgid "List"
290
  msgstr ""
308
  #: application/modules/Shareasale/templates/data_price_tracker_alert.php:7
309
  #: application/modules/TradedoublerProducts/templates/data_price_tracker_alert.php:7
310
  #: application/modules/TradetrackerProducts/templates/data_price_tracker_alert.php:7
311
+ #: application/modules/Viglink/templates/data_price_tracker_alert.php:7
312
  #: application/modules/Zanox/templates/data_price_tracker_alert.php:7
313
  #: application/templates/data_price_tracker_alert.php:5
314
  msgid "Price tracker & alert"
387
 
388
  #: application/modules/Amazon/templates/data_compare.php:141
389
  #: application/templates/blocks/item_features.php:3
390
+ #: application/templates/blocks/item_features.php:12
391
  #: application/templates/blocks/item_features.php:22
392
  #: application/templates/blocks/item_features.php:31
393
  #: application/templates/blocks/item_features.php:40
394
  #: application/templates/blocks/item_features.php:49
395
+ #: application/templates/blocks/item_features.php:58
396
  msgid "Features"
397
  msgstr ""
398
 
456
  msgstr ""
457
 
458
  #: application/modules/Ebay/templates/data_item.php:58
459
+ #: application/templates/data_grid.php:66
460
  msgid "Bids:"
461
  msgstr ""
462
 
515
  msgid "Data from Yandex.Market"
516
  msgstr ""
517
 
518
+ #: application/modules/Market/templates/data_item.php:83
519
+ #: application/modules/Market/templates/data_item.php:85
520
+ msgid "Shipping:"
521
+ msgstr ""
522
+
523
  #: application/modules/Market/templates/data_item.php:83
524
  msgid "free"
525
  msgstr ""
574
  msgid "Tile"
575
  msgstr ""
576
 
577
+ #: application/templates/blocks/item_features.php:68
578
  msgid "Specifications"
579
  msgstr ""
580
 
645
  msgid "OFF"
646
  msgstr ""
647
 
648
+ #: application/templates/data_grid.php:84
649
+ #: application/templates/data_list.php:85 templates/block_offers_list.php:86
650
+ #: templates/block_offers_logo.php:69
651
  msgid "Last updated on"
652
  msgstr ""
653
 
readme.txt CHANGED
@@ -1,9 +1,9 @@
1
  === Content Egg ===
2
  Contributors: keywordrush,wpsoul
3
- Tags: content, affiliate, autoblogging, amazon, affilinet, coupons, linkshare, shareasale, ozon, flickr, youtube, commission junction, aliexpress, cj, images, wikipedia, freebase, ecommerce, links, shortcode, monetize, search engine optimization, ebay, zanox, moneymaking, price comparison, google images, timesaving, clickbank, linkshare, pixabay, admitad, affilitewindow, optimisemedia, tradedoubler, flipkart, paytm, price alert, tracker, impactradius, pepperjam, pepperjamnetwork, udemy, envato, tradetracker
4
  Requires at least: 4.2.2
5
- Tested up to: 4.7.2
6
- Stable tag: 3.7.0
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -18,6 +18,8 @@ Easily adding auto updating products from affiliate systems and additional conte
18
  * Autoblogging - monetizing and content auto pilot.
19
  * Multilanguage: make site on any language.
20
  * Automatic updating prices and offers.
 
 
21
  * Option to generate auto updating price comparison lists of actual offers by keyword.
22
  * Options to set search filters for modules (price range, discount, categories, best offers, CC license, etc).
23
  * Automatically adds your partner ID to links.
@@ -43,7 +45,7 @@ Easily adding auto updating products from affiliate systems and additional conte
43
  >
44
  >Modules of free version: Amazon, Pixabay, Google Images, Youtube, Commission Junction Links, Freebase, Affili.net Coupons, Related Keywords, RSS Fetcher, Admitad Products, Offer.
45
  >
46
- >Additional modules of PRO version: Ebay, Zanox, Aliexpress, CJ Products, ClickBank, Admitad Coupons, Affilitewindow, Flipkart, Optimisemedia, Tradedoubler, Tradetracker, Affili.net Products, Linkshare, Shareasale, Impactradius, Cityads, Ozon, Paytm, Pepperjam Network, Udemy, Envato, Flickr, Bing Images, Google Books, Google News, Twitter, VK news, Yandex Market...
47
  >
48
  >And we don't stop on these modules. All buyers of pro version can suggest us new module.
49
  >
@@ -80,7 +82,7 @@ This section describes how to install the plugin and get it working.
80
  1. Upload `content-egg` folder to the `/wp-content/plugins/` directory
81
  1. Activate the plugin through the 'Plugins' menu in WordPress
82
  1. Configure plugin settings
83
- 1. You can find manual how to configure each module - [Content Egg Manual](http://www.keywordrush.com/manuals/content_egg_manual.en.pdf)
84
 
85
  == Frequently Asked Questions ==
86
 
@@ -108,6 +110,26 @@ If you can do any Wordpress page templates – you can do also templates for Con
108
 
109
  == Changelog ==
110
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  = 3.7.0 =
112
  * New: Price filter in search form.
113
  * New: Price filter for autoupdate (Amazon, Ebay, Aliexpress).
1
  === Content Egg ===
2
  Contributors: keywordrush,wpsoul
3
+ Tags: content, affiliate, autoblogging, amazon, affilinet, coupons, linkshare, shareasale, ozon, flickr, youtube, commission junction, aliexpress, cj, images, wikipedia, freebase, ecommerce, links, shortcode, monetize, search engine optimization, ebay, zanox, moneymaking, price comparison, google images, timesaving, clickbank, linkshare, pixabay, admitad, affilitewindow, optimisemedia, tradedoubler, flipkart, paytm, price alert, tracker, impactradius, pepperjam, pepperjamnetwork, udemy, envato, tradetracker, viglink
4
  Requires at least: 4.2.2
5
+ Tested up to: 4.8
6
+ Stable tag: 3.9.0
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
18
  * Autoblogging - monetizing and content auto pilot.
19
  * Multilanguage: make site on any language.
20
  * Automatic updating prices and offers.
21
+ * WooCommerce products synchronization.
22
+ * WooCommerce autoblogging.
23
  * Option to generate auto updating price comparison lists of actual offers by keyword.
24
  * Options to set search filters for modules (price range, discount, categories, best offers, CC license, etc).
25
  * Automatically adds your partner ID to links.
45
  >
46
  >Modules of free version: Amazon, Pixabay, Google Images, Youtube, Commission Junction Links, Freebase, Affili.net Coupons, Related Keywords, RSS Fetcher, Admitad Products, Offer.
47
  >
48
+ >Additional modules of PRO version: Ebay, Zanox, Aliexpress, CJ Products, ClickBank, Admitad Coupons, Flipkart, Optimisemedia, Tradedoubler, Tradetracker, Affili.net Products, Linkshare, Shareasale, Impactradius, Cityads, Ozon, Paytm, Pepperjam Network, Udemy, Viglink, Envato, Flickr, Bing Images, Google Books, Google News, Twitter, VK news, Yandex Market...
49
  >
50
  >And we don't stop on these modules. All buyers of pro version can suggest us new module.
51
  >
82
  1. Upload `content-egg` folder to the `/wp-content/plugins/` directory
83
  1. Activate the plugin through the 'Plugins' menu in WordPress
84
  1. Configure plugin settings
85
+ 1. You can find manual how to configure each module - [Content Egg User Guide](http://www.keywordrush.com/en/docs/content-egg/)
86
 
87
  == Frequently Asked Questions ==
88
 
110
 
111
  == Changelog ==
112
 
113
+ = 3.9.0 =
114
+ * New: WooCommerce products synchronization.
115
+ * New: WooCommerce attributes synchronization (global and custom).
116
+ * New: WooCommerce autoblogging.
117
+ * New: Curency converter for WooCommerce synchronization.
118
+ * New: Latin slugs for WooCommerce attributes.
119
+ * New: WooCommerce reviews rating for AE modules.
120
+ * New: WooCommerce attributes filter (auto/blacklist/whitelist).
121
+ * New: Post type for Fill utility.
122
+ * New: Post status for Fill utility.
123
+ * New: Сustom fields for Fill utility.
124
+ * New: Replacement tags: %RANDOM%, %RANDOM(10,50)%
125
+ * New: Subscribers CSV export.
126
+ * Improvement: Amazon: Getting price for parent products.
127
+ * Improvement: Affilinet: https affilite links support.
128
+ * Improvement: 'product-search' filter for Frontend search.
129
+ * Improvement: User Guide - http://www.keywordrush.com/en/docs/content-egg/
130
+ * Fix: Keywords parser.
131
+ * Fix: Subscribers CSV export.
132
+
133
  = 3.7.0 =
134
  * New: Price filter in search form.
135
  * New: Price filter for autoupdate (Amazon, Ebay, Aliexpress).
res/app/app.js CHANGED
@@ -168,6 +168,16 @@ contentEgg.controller('ContentEggController', function ($scope, ModuleService) {
168
  $scope.blockShortcode = '[content-egg-block template=' + $scope.selectedBlockTemplate + ']';
169
  };
170
 
 
 
 
 
 
 
 
 
 
 
171
  });
172
 
173
  contentEgg.config(function ($sceDelegateProvider) {
168
  $scope.blockShortcode = '[content-egg-block template=' + $scope.selectedBlockTemplate + ']';
169
  };
170
 
171
+ $scope.wooRadioChange = function (unique_id, param_name) {
172
+ angular.forEach($scope.models, function (service, module_id) {
173
+ for (var i = 0, len = $scope.models[module_id].added.length; i < len; i++) {
174
+ if ($scope.models[module_id].added[i].unique_id != unique_id) {
175
+ $scope.models[module_id].added[i][param_name] = false;
176
+ }
177
+ }
178
+ });
179
+ };
180
+
181
  });
182
 
183
  contentEgg.config(function ($sceDelegateProvider) {
res/js/keywords.js CHANGED
@@ -213,7 +213,7 @@ jQuery.namespace = function () {
213
  vjoObj = jQuery.namespace("vjo.darwin.domain.finding.autofill.AutoFill");
214
  vjoObj._do = function (data) {
215
  sug_ebay_callback(data);
216
- }
217
 
218
 
219
  function sug_ebay(query) {
@@ -320,13 +320,15 @@ function trend_google() {
320
  else
321
  zone = 'com';
322
 
323
- var url = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D'https%3A%2F%2Fwww.google." + zone + "%2Ftrends%2Fhottrends%2Fatom%2Fhourly'%20and%20xpath%3D'.%2F%2Fa'&format=json&diagnostics=true&callback=";
 
 
 
324
  jQuery.getJSON(url, function () {
325
  }).done(function (data) {
326
  var keywords = {};
327
- var keyword;
328
- jQuery.each(data.query.results.a, function (i, row) {
329
- var keyword = row.content;
330
  keywords[keyword] = keyword;
331
  jQuery('#trend_keywords')
332
  .append(jQuery("<option></option>")
@@ -339,15 +341,17 @@ function amazon_trends() {
339
 
340
  var category_id = jQuery('#amazon_categ').val();
341
  var amazon_section = jQuery('#amazon_section').val();
342
- var aurl = 'http://www.amazon.com/gp/rss/' + amazon_section + '/' + category_id + '/';
343
- var url = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D'" + encodeURI(aurl) + "%2F'%20and%20xpath%3D'.%2F%2Fspan%2Fa'&format=json&callback=";
 
 
 
344
  jQuery('#goods_keywords').empty();
345
  jQuery.getJSON(url, function () {
346
  }).done(function (data) {
347
  var keywords = {};
348
- var keyword;
349
- jQuery.each(data.query.results.a, function (i, row) {
350
- var keyword = row.content;
351
  keywords[keyword] = keyword;
352
  jQuery('#goods_keywords')
353
  .append(jQuery("<option></option>")
213
  vjoObj = jQuery.namespace("vjo.darwin.domain.finding.autofill.AutoFill");
214
  vjoObj._do = function (data) {
215
  sug_ebay_callback(data);
216
+ };
217
 
218
 
219
  function sug_ebay(query) {
320
  else
321
  zone = 'com';
322
 
323
+ var site = "https://www.google." + zone + "/trends/hottrends/atom/hourly";
324
+ var yql = "select * from htmlstring where url='" + site + "' AND xpath='.//a/text()'";
325
+ var url = "http://query.yahooapis.com/v1/public/yql?q=" + encodeURIComponent(yql) + "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
326
+
327
  jQuery.getJSON(url, function () {
328
  }).done(function (data) {
329
  var keywords = {};
330
+ list = data.query.results.result.split("\n");
331
+ jQuery.each(list, function (i, keyword) {
 
332
  keywords[keyword] = keyword;
333
  jQuery('#trend_keywords')
334
  .append(jQuery("<option></option>")
341
 
342
  var category_id = jQuery('#amazon_categ').val();
343
  var amazon_section = jQuery('#amazon_section').val();
344
+
345
+ var site = 'http://www.amazon.com/gp/rss/' + amazon_section + '/' + category_id + '/';
346
+ var yql = "select * from htmlstring where url='" + site + "' AND xpath='.//span/a/text()'";
347
+ var url = "http://query.yahooapis.com/v1/public/yql?q=" + encodeURIComponent(yql) + "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
348
+
349
  jQuery('#goods_keywords').empty();
350
  jQuery.getJSON(url, function () {
351
  }).done(function (data) {
352
  var keywords = {};
353
+ list = data.query.results.result.split("\n");
354
+ jQuery.each(list, function (i, keyword) {
 
355
  keywords[keyword] = keyword;
356
  jQuery('#goods_keywords')
357
  .append(jQuery("<option></option>")
res/js/prefill.js CHANGED
@@ -3,16 +3,22 @@ var cegg_start_prefill_begin = 0;
3
  var cegg_xxx;
4
  var cegg_in_action = false;
5
  var cegg_post_ids = [];
 
6
 
7
- jQuery(document).ready(function($) {
8
 
9
- updateProgress(0);
 
10
 
11
- jQuery('#start_prefill_begin').click(function() {
12
  if (cegg_in_action) {
13
  return false;
14
  }
15
- cegg_post_ids = content_egg_prefill.post_ids.slice();
 
 
 
 
16
  cegg_p_stop = 0;
17
  cegg_start_prefill_begin = 1;
18
  jQuery('#start_prefill').prop('disabled', true);
@@ -30,10 +36,14 @@ jQuery(document).ready(function($) {
30
  prefill();
31
  });
32
 
33
- jQuery('#start_prefill').click(function() {
34
  if (cegg_in_action) {
35
  return false;
36
  }
 
 
 
 
37
  cegg_p_stop = 0;
38
  jQuery('#start_prefill').prop('disabled', true);
39
  jQuery('#start_prefill_begin').prop('disabled', true);
@@ -47,85 +57,112 @@ jQuery(document).ready(function($) {
47
  prefill();
48
  });
49
 
50
- jQuery('#stop_prefill').click(function() {
51
  cegg_p_stop = 1;
52
  cegg_xxx.abort();
53
  jQuery('#start_prefill').prop('disabled', false);
54
  jQuery('#start_prefill_begin').prop('disabled', false);
55
  jQuery('#stop_prefill').prop('disabled', true);
56
  jQuery('#ajaxBusy').hide();
57
-
58
- });
59
-
60
- jQuery(function() {
61
- jQuery('#keyword_source').change(function(){
62
- if(jQuery('#keyword_source').val() == '_custom_field') {
63
- jQuery('#custom_field').show();
64
- } else {
65
- jQuery('#custom_field').hide();
66
- }
67
- });
68
- });
69
 
70
- // Ajax activity indicator bound
71
- // to ajax start/stop document events
72
- /*
73
- jQuery(document).ajaxStart(function() {
74
- cegg_in_action = true;
75
- jQuery('#ajaxBusy').show();
76
- jQuery('#ajaxWaiting').hide();
77
 
78
- }).ajaxStop(function() {
79
- cegg_in_action = false;
80
- jQuery('#ajaxBusy').hide();
 
 
 
 
 
81
  });
82
- */
83
 
84
  });
85
 
86
- function prefill() {
 
 
 
87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  jQuery('#ajaxBusy').show();
89
-
90
- if (cegg_post_ids.length == 0)
91
- cegg_post_ids = content_egg_prefill.post_ids.slice();
92
-
93
  var post_id = cegg_post_ids.shift();
94
 
95
  if (cegg_post_ids.length == 0)
96
  cegg_p_stop = 1;
97
 
98
- var prefill_url = ajaxurl + '?action=content-egg-prefill&post_id=' + post_id;
99
-
100
  var module_id = jQuery("#module_id").val();
101
  var keyword_source = jQuery("#keyword_source").val();
102
  var keyword_count = jQuery("#keyword_count").val();
103
  var minus_words = jQuery("#minus_words").val();
104
  var autoupdate = jQuery("#autoupdate").is(':checked');
105
  var custom_field = jQuery("#custom_field").val();
106
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  prefill_url += '&module_id=' + module_id;
108
  prefill_url += '&keyword_source=' + keyword_source;
109
  prefill_url += '&keyword_count=' + keyword_count;
110
  prefill_url += '&autoupdate=' + autoupdate;
111
  prefill_url += '&minus_words=' + encodeURIComponent(minus_words);
112
  prefill_url += '&custom_field=' + encodeURIComponent(custom_field);
 
 
113
  prefill_url += '&nonce=' + content_egg_prefill.nonce;
 
114
 
115
  cegg_xxx = jQuery.ajax({
116
  url: prefill_url,
117
  dataType: 'json',
118
  //dataType: (jQuery.browser.msie) ? "text" : "xml",
119
  cache: false,
120
- type: 'GET',
121
  timeout: 600000, //10min
122
- //data: 'cmd=' + cmd + required_plugins,
123
  });
124
 
125
- var progress = (content_egg_prefill.post_ids.length - cegg_post_ids.length) * 100 / content_egg_prefill.post_ids.length;
126
-
127
 
128
- cegg_xxx.done(function(data, textStatus) {
129
  jQuery('#logs').prepend(data['log'] + '<br />');
130
  //updateProgress(parseInt(data['progress']));
131
  jQuery("#total").text(data['total']);
@@ -146,7 +183,7 @@ function prefill() {
146
  jQuery('#stop_prefill').prop('disabled', true);
147
  jQuery('#ajaxWaiting').hide();
148
  jQuery('#ajaxBusy').hide();
149
-
150
  return false;
151
  } else {
152
  //recursion
@@ -157,10 +194,10 @@ function prefill() {
157
  }
158
  });
159
 
160
- cegg_xxx.fail(function(jqXHR, textStatus, errorThrown) {
161
  jQuery('#logs').prepend('<span class="label label-important">Error: ' + errorThrown + '</span><br>');
162
  updateProgress(progress);
163
-
164
  //stop prefill
165
  if (cegg_p_stop == 1) {
166
  jQuery('#start_prefill').prop('disabled', false);
@@ -168,7 +205,7 @@ function prefill() {
168
  jQuery('#stop_prefill').prop('disabled', true);
169
  jQuery('#ajaxWaiting').hide();
170
  jQuery('#ajaxBusy').hide();
171
-
172
  return false;
173
  } else {
174
  //recursion
@@ -187,8 +224,8 @@ function updateProgress(percentage) {
187
  return;
188
  if (percentage > 100)
189
  percentage = 100;
190
-
191
- jQuery( "#progressbar" ).progressbar({
192
- value: percentage
193
- });
194
  }
3
  var cegg_xxx;
4
  var cegg_in_action = false;
5
  var cegg_post_ids = [];
6
+ var cegg_post_ids_total = 0;
7
 
8
+ jQuery(document).ready(function ($) {
9
 
10
+ updateProgress(0);
11
+ getPostIds();
12
 
13
+ jQuery('#start_prefill_begin').click(function () {
14
  if (cegg_in_action) {
15
  return false;
16
  }
17
+
18
+ getPostIds();
19
+ if (cegg_post_ids.length == 0)
20
+ return false;
21
+
22
  cegg_p_stop = 0;
23
  cegg_start_prefill_begin = 1;
24
  jQuery('#start_prefill').prop('disabled', true);
36
  prefill();
37
  });
38
 
39
+ jQuery('#start_prefill').click(function () {
40
  if (cegg_in_action) {
41
  return false;
42
  }
43
+ getPostIds();
44
+ if (cegg_post_ids.length == 0)
45
+ return false;
46
+
47
  cegg_p_stop = 0;
48
  jQuery('#start_prefill').prop('disabled', true);
49
  jQuery('#start_prefill_begin').prop('disabled', true);
57
  prefill();
58
  });
59
 
60
+ jQuery('#stop_prefill').click(function () {
61
  cegg_p_stop = 1;
62
  cegg_xxx.abort();
63
  jQuery('#start_prefill').prop('disabled', false);
64
  jQuery('#start_prefill_begin').prop('disabled', false);
65
  jQuery('#stop_prefill').prop('disabled', true);
66
  jQuery('#ajaxBusy').hide();
 
 
 
 
 
 
 
 
 
 
 
 
67
 
68
+ });
 
 
 
 
 
 
69
 
70
+ jQuery(function () {
71
+ jQuery('#keyword_source').change(function () {
72
+ if (jQuery('#keyword_source').val() == '_custom_field') {
73
+ jQuery('#custom_field').show();
74
+ } else {
75
+ jQuery('#custom_field').hide();
76
+ }
77
+ });
78
  });
 
79
 
80
  });
81
 
82
+ function getPostIds()
83
+ {
84
+ var post_type = jQuery("#post_type").val();
85
+ var post_status = jQuery("#post_status").val();
86
 
87
+ cegg_post_ids = [];
88
+ var j = 0;
89
+ for (var i = 0; i < content_egg_prefill.posts.length; i++) {
90
+
91
+ if (jQuery.inArray(content_egg_prefill.posts[i].post_type, post_type) == -1)
92
+ continue;
93
+ if (jQuery.inArray(content_egg_prefill.posts[i].post_status, post_status) == -1)
94
+ continue;
95
+
96
+ cegg_post_ids[j] = content_egg_prefill.posts[i].id;
97
+ j++;
98
+ }
99
+ cegg_post_ids_total = cegg_post_ids.length;
100
+ jQuery('#post_ids_total').text(cegg_post_ids_total);
101
+ }
102
+
103
+ function prefill() {
104
+
105
  jQuery('#ajaxBusy').show();
106
+
 
 
 
107
  var post_id = cegg_post_ids.shift();
108
 
109
  if (cegg_post_ids.length == 0)
110
  cegg_p_stop = 1;
111
 
112
+ var prefill_url = ajaxurl + '?action=content-egg-prefill';
113
+
114
  var module_id = jQuery("#module_id").val();
115
  var keyword_source = jQuery("#keyword_source").val();
116
  var keyword_count = jQuery("#keyword_count").val();
117
  var minus_words = jQuery("#minus_words").val();
118
  var autoupdate = jQuery("#autoupdate").is(':checked');
119
  var custom_field = jQuery("#custom_field").val();
120
+ // var custom_field_names = jQuery('input[name="custom_field_names[]"]').val();
121
+ //var custom_field_values = jQuery('input[name="custom_field_values[]"]').serialize();
122
+
123
+ var custom_field_names = jQuery("input[name='custom_field_names[]']")
124
+ .map(function(){return jQuery(this).val();}).get();
125
+ var custom_field_values = jQuery("input[name='custom_field_values[]']")
126
+ .map(function(){return jQuery(this).val();}).get();
127
+
128
+
129
+ var data = {
130
+ 'post_id': post_id,
131
+ 'module_id': module_id,
132
+ 'keyword_source': keyword_source,
133
+ 'keyword_count': keyword_count,
134
+ 'autoupdate': autoupdate,
135
+ 'minus_words': minus_words,
136
+ 'custom_field': custom_field,
137
+ 'custom_field_names': custom_field_names,
138
+ 'custom_field_values': custom_field_values,
139
+ 'nonce': content_egg_prefill.nonce
140
+ };
141
+ /*
142
  prefill_url += '&module_id=' + module_id;
143
  prefill_url += '&keyword_source=' + keyword_source;
144
  prefill_url += '&keyword_count=' + keyword_count;
145
  prefill_url += '&autoupdate=' + autoupdate;
146
  prefill_url += '&minus_words=' + encodeURIComponent(minus_words);
147
  prefill_url += '&custom_field=' + encodeURIComponent(custom_field);
148
+ prefill_url += '&custom_field_names=' + encodeURIComponent(custom_field_names);
149
+ prefill_url += '&custom_field_values=' + encodeURIComponent(custom_field_values);
150
  prefill_url += '&nonce=' + content_egg_prefill.nonce;
151
+ */
152
 
153
  cegg_xxx = jQuery.ajax({
154
  url: prefill_url,
155
  dataType: 'json',
156
  //dataType: (jQuery.browser.msie) ? "text" : "xml",
157
  cache: false,
158
+ type: 'POST',
159
  timeout: 600000, //10min
160
+ data: data,
161
  });
162
 
163
+ var progress = (cegg_post_ids_total - cegg_post_ids.length) * 100 / cegg_post_ids_total;
 
164
 
165
+ cegg_xxx.done(function (data, textStatus) {
166
  jQuery('#logs').prepend(data['log'] + '<br />');
167
  //updateProgress(parseInt(data['progress']));
168
  jQuery("#total").text(data['total']);
183
  jQuery('#stop_prefill').prop('disabled', true);
184
  jQuery('#ajaxWaiting').hide();
185
  jQuery('#ajaxBusy').hide();
186
+
187
  return false;
188
  } else {
189
  //recursion
194
  }
195
  });
196
 
197
+ cegg_xxx.fail(function (jqXHR, textStatus, errorThrown) {
198
  jQuery('#logs').prepend('<span class="label label-important">Error: ' + errorThrown + '</span><br>');
199
  updateProgress(progress);
200
+
201
  //stop prefill
202
  if (cegg_p_stop == 1) {
203
  jQuery('#start_prefill').prop('disabled', false);
205
  jQuery('#stop_prefill').prop('disabled', true);
206
  jQuery('#ajaxWaiting').hide();
207
  jQuery('#ajaxBusy').hide();
208
+
209
  return false;
210
  } else {
211
  //recursion
224
  return;
225
  if (percentage > 100)
226
  percentage = 100;
227
+
228
+ jQuery("#progressbar").progressbar({
229
+ value: percentage
230
+ });
231
  }
res/logos/flipkart-com.png CHANGED
Binary file
templates/block_offers_list.php CHANGED
@@ -80,4 +80,12 @@ usort($all_items, function($a, $b) {
80
  </div>
81
  <?php endforeach; ?>
82
  </div>
83
- </div>
 
 
 
 
 
 
 
 
80
  </div>
81
  <?php endforeach; ?>
82
  </div>
83
+ <?php if ($amazon_last_updated = TemplateHelper::getLastUpdateFormattedAmazon($data)): ?>
84
+ <div class="row">
85
+ <div class="text-muted text-right">
86
+ <small><?php _e('Last updated on', 'content-egg-tpl'); ?> <?php echo $amazon_last_updated; ?></small>
87
+ </div>
88
+ </div>
89
+ <?php endif; ?>
90
+
91
+ </div>
templates/block_offers_logo.php CHANGED
@@ -63,4 +63,12 @@ use ContentEgg\application\helpers\TextHelper;
63
  <?php endforeach; ?>
64
  <?php endforeach; ?>
65
  </div>
 
 
 
 
 
 
 
 
66
  </div>
63
  <?php endforeach; ?>
64
  <?php endforeach; ?>
65
  </div>
66
+ <?php if ($amazon_last_updated = TemplateHelper::getLastUpdateFormattedAmazon($data)): ?>
67
+ <div class="row">
68
+ <div class="text-muted text-right">
69
+ <small><?php _e('Last updated on', 'content-egg-tpl'); ?> <?php echo $amazon_last_updated; ?></small>
70
+ </div>
71
+ </div>
72
+ <?php endif; ?>
73
+
74
  </div>