Import any XML or CSV File to WordPress - Version 3.3.6

Version Description

  • added de_CH translation
  • added support for .svg images
  • added possibility for import excerpts for pages
  • added new filter 'wp_all_import_specified_records'
  • added new filter 'wp_all_import_is_post_to_delete'
  • disable XMLReader stream filter for HHVM
  • improve search for existing images in media gallery
Download this release

Release Info

Developer soflyy
Plugin Icon 128x128 Import any XML or CSV File to WordPress
Version 3.3.6
Comparing to
See all releases

Code changes from version 3.3.5 to 3.3.6

actions/wp_ajax_test_images.php CHANGED
@@ -113,7 +113,7 @@ function pmxi_wp_ajax_test_images(){
113
 
114
  $start = time();
115
  if ( ! empty($post['imgs']) )
116
- {
117
  foreach ($post['imgs'] as $img)
118
  {
119
  if ( ! preg_match('%^(http|https|ftp|ftps)%i', $img)){
@@ -124,13 +124,15 @@ function pmxi_wp_ajax_test_images(){
124
  $image_name = wp_unique_filename($targetDir, 'test');
125
  $image_filepath = $targetDir . '/' . $image_name;
126
 
127
- $url = str_replace(" ", "%20", trim($img));
128
 
129
  $request = get_file_curl($url, $image_filepath);
130
 
131
- if ( (is_wp_error($request) or $request === false) and ! @file_put_contents($image_filepath, @file_get_contents($img))) {
 
 
132
  $failed_msgs[] = (is_wp_error($request)) ? $request->get_error_message() : sprintf(__('File `%s` cannot be saved locally', 'wp_all_import_plugin'), $img);
133
- } elseif( ! ($image_info = @getimagesize($image_filepath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
134
  $failed_msgs[] = sprintf(__('File `%s` is not a valid image.', 'wp_all_import_plugin'), $img);
135
  } else {
136
  $success_images++;
113
 
114
  $start = time();
115
  if ( ! empty($post['imgs']) )
116
+ {
117
  foreach ($post['imgs'] as $img)
118
  {
119
  if ( ! preg_match('%^(http|https|ftp|ftps)%i', $img)){
124
  $image_name = wp_unique_filename($targetDir, 'test');
125
  $image_filepath = $targetDir . '/' . $image_name;
126
 
127
+ $url = trim($img);
128
 
129
  $request = get_file_curl($url, $image_filepath);
130
 
131
+ $get_ctx = stream_context_create(array('http' => array('timeout' => 5)));
132
+
133
+ if ( (is_wp_error($request) or $request === false) and ! @file_put_contents($image_filepath, @file_get_contents($img, false, $get_ctx))) {
134
  $failed_msgs[] = (is_wp_error($request)) ? $request->get_error_message() : sprintf(__('File `%s` cannot be saved locally', 'wp_all_import_plugin'), $img);
135
+ } elseif( ! ($image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
136
  $failed_msgs[] = sprintf(__('File `%s` is not a valid image.', 'wp_all_import_plugin'), $img);
137
  } else {
138
  $success_images++;
classes/PHPExcel/CachedObjectStorage/Wincache.php CHANGED
@@ -1,294 +1,294 @@
1
- <?php
2
- /**
3
- * PHPExcel
4
- *
5
- * Copyright (c) 2006 - 2014 PHPExcel
6
- *
7
- * This library is free software; you can redistribute it and/or
8
- * modify it under the terms of the GNU Lesser General Public
9
- * License as published by the Free Software Foundation; either
10
- * version 2.1 of the License, or (at your option) any later version.
11
- *
12
- * This library is distributed in the hope that it will be useful,
13
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
- * Lesser General Public License for more details.
16
- *
17
- * You should have received a copy of the GNU Lesser General Public
18
- * License along with this library; if not, write to the Free Software
19
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
- *
21
- * @category PHPExcel
22
- * @package PHPExcel_CachedObjectStorage
23
- * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24
- * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25
- * @version ##VERSION##, ##DATE##
26
- */
27
-
28
-
29
- /**
30
- * PHPExcel_CachedObjectStorage_Wincache
31
- *
32
- * @category PHPExcel
33
- * @package PHPExcel_CachedObjectStorage
34
- * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
35
- */
36
- class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache {
37
-
38
- /**
39
- * Prefix used to uniquely identify cache data for this worksheet
40
- *
41
- * @var string
42
- */
43
- private $_cachePrefix = null;
44
-
45
- /**
46
- * Cache timeout
47
- *
48
- * @var integer
49
- */
50
- private $_cacheTime = 600;
51
-
52
-
53
- /**
54
- * Store cell data in cache for the current cell object if it's "dirty",
55
- * and the 'nullify' the current cell object
56
- *
57
- * @return void
58
- * @throws PHPExcel_Exception
59
- */
60
- protected function _storeData() {
61
- if ($this->_currentCellIsDirty && !empty($this->_currentObjectID)) {
62
- $this->_currentObject->detach();
63
-
64
- $obj = serialize($this->_currentObject);
65
- if (wincache_ucache_exists($this->_cachePrefix.$this->_currentObjectID.'.cache')) {
66
- if (!wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
67
- $this->__destruct();
68
- throw new PHPExcel_Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache');
69
- }
70
- } else {
71
- if (!wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
72
- $this->__destruct();
73
- throw new PHPExcel_Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache');
74
- }
75
- }
76
- $this->_currentCellIsDirty = false;
77
- }
78
-
79
- $this->_currentObjectID = $this->_currentObject = null;
80
- } // function _storeData()
81
-
82
-
83
- /**
84
- * Add or Update a cell in cache identified by coordinate address
85
- *
86
- * @param string $pCoord Coordinate address of the cell to update
87
- * @param PHPExcel_Cell $cell Cell to update
88
- * @return PHPExcel_Cell
89
- * @throws PHPExcel_Exception
90
- */
91
- public function addCacheData($pCoord, PHPExcel_Cell $cell) {
92
- if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) {
93
- $this->_storeData();
94
- }
95
- $this->_cellCache[$pCoord] = true;
96
-
97
- $this->_currentObjectID = $pCoord;
98
- $this->_currentObject = $cell;
99
- $this->_currentCellIsDirty = true;
100
-
101
- return $cell;
102
- } // function addCacheData()
103
-
104
-
105
- /**
106
- * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?
107
- *
108
- * @param string $pCoord Coordinate address of the cell to check
109
- * @return boolean
110
- */
111
- public function isDataSet($pCoord) {
112
- // Check if the requested entry is the current object, or exists in the cache
113
- if (parent::isDataSet($pCoord)) {
114
- if ($this->_currentObjectID == $pCoord) {
115
- return true;
116
- }
117
- // Check if the requested entry still exists in cache
118
- $success = wincache_ucache_exists($this->_cachePrefix.$pCoord.'.cache');
119
- if ($success === false) {
120
- // Entry no longer exists in Wincache, so clear it from the cache array
121
- parent::deleteCacheData($pCoord);
122
- throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');
123
- }
124
- return true;
125
- }
126
- return false;
127
- } // function isDataSet()
128
-
129
-
130
- /**
131
- * Get cell at a specific coordinate
132
- *
133
- * @param string $pCoord Coordinate of the cell
134
- * @throws PHPExcel_Exception
135
- * @return PHPExcel_Cell Cell that was found, or null if not found
136
- */
137
- public function getCacheData($pCoord) {
138
- if ($pCoord === $this->_currentObjectID) {
139
- return $this->_currentObject;
140
- }
141
- $this->_storeData();
142
-
143
- // Check if the entry that has been requested actually exists
144
- $obj = null;
145
- if (parent::isDataSet($pCoord)) {
146
- $success = false;
147
- $obj = wincache_ucache_get($this->_cachePrefix.$pCoord.'.cache', $success);
148
- if ($success === false) {
149
- // Entry no longer exists in WinCache, so clear it from the cache array
150
- parent::deleteCacheData($pCoord);
151
- throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');
152
- }
153
- } else {
154
- // Return null if requested entry doesn't exist in cache
155
- return null;
156
- }
157
-
158
- // Set current entry to the requested entry
159
- $this->_currentObjectID = $pCoord;
160
- $this->_currentObject = unserialize($obj);
161
- // Re-attach this as the cell's parent
162
- $this->_currentObject->attach($this);
163
-
164
- // Return requested entry
165
- return $this->_currentObject;
166
- } // function getCacheData()
167
-
168
-
169
- /**
170
- * Get a list of all cell addresses currently held in cache
171
- *
172
- * @return string[]
173
- */
174
- public function getCellList() {
175
- if ($this->_currentObjectID !== null) {
176
- $this->_storeData();
177
- }
178
-
179
- return parent::getCellList();
180
- }
181
-
182
-
183
- /**
184
- * Delete a cell in cache identified by coordinate address
185
- *
186
- * @param string $pCoord Coordinate address of the cell to delete
187
- * @throws PHPExcel_Exception
188
- */
189
- public function deleteCacheData($pCoord) {
190
- // Delete the entry from Wincache
191
- wincache_ucache_delete($this->_cachePrefix.$pCoord.'.cache');
192
-
193
- // Delete the entry from our cell address array
194
- parent::deleteCacheData($pCoord);
195
- } // function deleteCacheData()
196
-
197
-
198
- /**
199
- * Clone the cell collection
200
- *
201
- * @param PHPExcel_Worksheet $parent The new worksheet
202
- * @return void
203
- */
204
- public function copyCellCollection(PHPExcel_Worksheet $parent) {
205
- parent::copyCellCollection($parent);
206
- // Get a new id for the new file name
207
- $baseUnique = $this->_getUniqueID();
208
- $newCachePrefix = substr(md5($baseUnique),0,8).'.';
209
- $cacheList = $this->getCellList();
210
- foreach($cacheList as $cellID) {
211
- if ($cellID != $this->_currentObjectID) {
212
- $success = false;
213
- $obj = wincache_ucache_get($this->_cachePrefix.$cellID.'.cache', $success);
214
- if ($success === false) {
215
- // Entry no longer exists in WinCache, so clear it from the cache array
216
- parent::deleteCacheData($cellID);
217
- throw new PHPExcel_Exception('Cell entry '.$cellID.' no longer exists in Wincache');
218
- }
219
- if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->_cacheTime)) {
220
- $this->__destruct();
221
- throw new PHPExcel_Exception('Failed to store cell '.$cellID.' in Wincache');
222
- }
223
- }
224
- }
225
- $this->_cachePrefix = $newCachePrefix;
226
- } // function copyCellCollection()
227
-
228
-
229
- /**
230
- * Clear the cell collection and disconnect from our parent
231
- *
232
- * @return void
233
- */
234
- public function unsetWorksheetCells() {
235
- if(!is_null($this->_currentObject)) {
236
- $this->_currentObject->detach();
237
- $this->_currentObject = $this->_currentObjectID = null;
238
- }
239
-
240
- // Flush the WinCache cache
241
- $this->__destruct();
242
-
243
- $this->_cellCache = array();
244
-
245
- // detach ourself from the worksheet, so that it can then delete this object successfully
246
- $this->_parent = null;
247
- } // function unsetWorksheetCells()
248
-
249
-
250
- /**
251
- * Initialise this new cell collection
252
- *
253
- * @param PHPExcel_Worksheet $parent The worksheet for this cell collection
254
- * @param array of mixed $arguments Additional initialisation arguments
255
- */
256
- public function __construct(PHPExcel_Worksheet $parent, $arguments) {
257
- $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600;
258
-
259
- if (is_null($this->_cachePrefix)) {
260
- $baseUnique = $this->_getUniqueID();
261
- $this->_cachePrefix = substr(md5($baseUnique),0,8).'.';
262
- $this->_cacheTime = $cacheTime;
263
-
264
- parent::__construct($parent);
265
- }
266
- } // function __construct()
267
-
268
-
269
- /**
270
- * Destroy this cell collection
271
- */
272
- public function __destruct() {
273
- $cacheList = $this->getCellList();
274
- foreach($cacheList as $cellID) {
275
- wincache_ucache_delete($this->_cachePrefix.$cellID.'.cache');
276
- }
277
- } // function __destruct()
278
-
279
-
280
- /**
281
- * Identify whether the caching method is currently available
282
- * Some methods are dependent on the availability of certain extensions being enabled in the PHP build
283
- *
284
- * @return boolean
285
- */
286
- public static function cacheMethodIsAvailable() {
287
- if (!function_exists('wincache_ucache_add')) {
288
- return false;
289
- }
290
-
291
- return true;
292
- }
293
-
294
- }
1
+ <?php
2
+ /**
3
+ * PHPExcel
4
+ *
5
+ * Copyright (c) 2006 - 2014 PHPExcel
6
+ *
7
+ * This library is free software; you can redistribute it and/or
8
+ * modify it under the terms of the GNU Lesser General Public
9
+ * License as published by the Free Software Foundation; either
10
+ * version 2.1 of the License, or (at your option) any later version.
11
+ *
12
+ * This library is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with this library; if not, write to the Free Software
19
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
+ *
21
+ * @category PHPExcel
22
+ * @package PHPExcel_CachedObjectStorage
23
+ * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25
+ * @version ##VERSION##, ##DATE##
26
+ */
27
+
28
+
29
+ /**
30
+ * PHPExcel_CachedObjectStorage_Wincache
31
+ *
32
+ * @category PHPExcel
33
+ * @package PHPExcel_CachedObjectStorage
34
+ * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
35
+ */
36
+ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage_CacheBase implements PHPExcel_CachedObjectStorage_ICache {
37
+
38
+ /**
39
+ * Prefix used to uniquely identify cache data for this worksheet
40
+ *
41
+ * @var string
42
+ */
43
+ private $_cachePrefix = null;
44
+
45
+ /**
46
+ * Cache timeout
47
+ *
48
+ * @var integer
49
+ */
50
+ private $_cacheTime = 600;
51
+
52
+
53
+ /**
54
+ * Store cell data in cache for the current cell object if it's "dirty",
55
+ * and the 'nullify' the current cell object
56
+ *
57
+ * @return void
58
+ * @throws PHPExcel_Exception
59
+ */
60
+ protected function _storeData() {
61
+ if ($this->_currentCellIsDirty && !empty($this->_currentObjectID)) {
62
+ $this->_currentObject->detach();
63
+
64
+ $obj = serialize($this->_currentObject);
65
+ if (wincache_ucache_exists($this->_cachePrefix.$this->_currentObjectID.'.cache')) {
66
+ if (!wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
67
+ $this->__destruct();
68
+ throw new PHPExcel_Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache');
69
+ }
70
+ } else {
71
+ if (!wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) {
72
+ $this->__destruct();
73
+ throw new PHPExcel_Exception('Failed to store cell '.$this->_currentObjectID.' in WinCache');
74
+ }
75
+ }
76
+ $this->_currentCellIsDirty = false;
77
+ }
78
+
79
+ $this->_currentObjectID = $this->_currentObject = null;
80
+ } // function _storeData()
81
+
82
+
83
+ /**
84
+ * Add or Update a cell in cache identified by coordinate address
85
+ *
86
+ * @param string $pCoord Coordinate address of the cell to update
87
+ * @param PHPExcel_Cell $cell Cell to update
88
+ * @return PHPExcel_Cell
89
+ * @throws PHPExcel_Exception
90
+ */
91
+ public function addCacheData($pCoord, PHPExcel_Cell $cell) {
92
+ if (($pCoord !== $this->_currentObjectID) && ($this->_currentObjectID !== null)) {
93
+ $this->_storeData();
94
+ }
95
+ $this->_cellCache[$pCoord] = true;
96
+
97
+ $this->_currentObjectID = $pCoord;
98
+ $this->_currentObject = $cell;
99
+ $this->_currentCellIsDirty = true;
100
+
101
+ return $cell;
102
+ } // function addCacheData()
103
+
104
+
105
+ /**
106
+ * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?
107
+ *
108
+ * @param string $pCoord Coordinate address of the cell to check
109
+ * @return boolean
110
+ */
111
+ public function isDataSet($pCoord) {
112
+ // Check if the requested entry is the current object, or exists in the cache
113
+ if (parent::isDataSet($pCoord)) {
114
+ if ($this->_currentObjectID == $pCoord) {
115
+ return true;
116
+ }
117
+ // Check if the requested entry still exists in cache
118
+ $success = wincache_ucache_exists($this->_cachePrefix.$pCoord.'.cache');
119
+ if ($success === false) {
120
+ // Entry no longer exists in Wincache, so clear it from the cache array
121
+ parent::deleteCacheData($pCoord);
122
+ throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');
123
+ }
124
+ return true;
125
+ }
126
+ return false;
127
+ } // function isDataSet()
128
+
129
+
130
+ /**
131
+ * Get cell at a specific coordinate
132
+ *
133
+ * @param string $pCoord Coordinate of the cell
134
+ * @throws PHPExcel_Exception
135
+ * @return PHPExcel_Cell Cell that was found, or null if not found
136
+ */
137
+ public function getCacheData($pCoord) {
138
+ if ($pCoord === $this->_currentObjectID) {
139
+ return $this->_currentObject;
140
+ }
141
+ $this->_storeData();
142
+
143
+ // Check if the entry that has been requested actually exists
144
+ $obj = null;
145
+ if (parent::isDataSet($pCoord)) {
146
+ $success = false;
147
+ $obj = wincache_ucache_get($this->_cachePrefix.$pCoord.'.cache', $success);
148
+ if ($success === false) {
149
+ // Entry no longer exists in WinCache, so clear it from the cache array
150
+ parent::deleteCacheData($pCoord);
151
+ throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache');
152
+ }
153
+ } else {
154
+ // Return null if requested entry doesn't exist in cache
155
+ return null;
156
+ }
157
+
158
+ // Set current entry to the requested entry
159
+ $this->_currentObjectID = $pCoord;
160
+ $this->_currentObject = unserialize($obj);
161
+ // Re-attach this as the cell's parent
162
+ $this->_currentObject->attach($this);
163
+
164
+ // Return requested entry
165
+ return $this->_currentObject;
166
+ } // function getCacheData()
167
+
168
+
169
+ /**
170
+ * Get a list of all cell addresses currently held in cache
171
+ *
172
+ * @return string[]
173
+ */
174
+ public function getCellList() {
175
+ if ($this->_currentObjectID !== null) {
176
+ $this->_storeData();
177
+ }
178
+
179
+ return parent::getCellList();
180
+ }
181
+
182
+
183
+ /**
184
+ * Delete a cell in cache identified by coordinate address
185
+ *
186
+ * @param string $pCoord Coordinate address of the cell to delete
187
+ * @throws PHPExcel_Exception
188
+ */
189
+ public function deleteCacheData($pCoord) {
190
+ // Delete the entry from Wincache
191
+ wincache_ucache_delete($this->_cachePrefix.$pCoord.'.cache');
192
+
193
+ // Delete the entry from our cell address array
194
+ parent::deleteCacheData($pCoord);
195
+ } // function deleteCacheData()
196
+
197
+
198
+ /**
199
+ * Clone the cell collection
200
+ *
201
+ * @param PHPExcel_Worksheet $parent The new worksheet
202
+ * @return void
203
+ */
204
+ public function copyCellCollection(PHPExcel_Worksheet $parent) {
205
+ parent::copyCellCollection($parent);
206
+ // Get a new id for the new file name
207
+ $baseUnique = $this->_getUniqueID();
208
+ $newCachePrefix = substr(md5($baseUnique),0,8).'.';
209
+ $cacheList = $this->getCellList();
210
+ foreach($cacheList as $cellID) {
211
+ if ($cellID != $this->_currentObjectID) {
212
+ $success = false;
213
+ $obj = wincache_ucache_get($this->_cachePrefix.$cellID.'.cache', $success);
214
+ if ($success === false) {
215
+ // Entry no longer exists in WinCache, so clear it from the cache array
216
+ parent::deleteCacheData($cellID);
217
+ throw new PHPExcel_Exception('Cell entry '.$cellID.' no longer exists in Wincache');
218
+ }
219
+ if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->_cacheTime)) {
220
+ $this->__destruct();
221
+ throw new PHPExcel_Exception('Failed to store cell '.$cellID.' in Wincache');
222
+ }
223
+ }
224
+ }
225
+ $this->_cachePrefix = $newCachePrefix;
226
+ } // function copyCellCollection()
227
+
228
+
229
+ /**
230
+ * Clear the cell collection and disconnect from our parent
231
+ *
232
+ * @return void
233
+ */
234
+ public function unsetWorksheetCells() {
235
+ if(!is_null($this->_currentObject)) {
236
+ $this->_currentObject->detach();
237
+ $this->_currentObject = $this->_currentObjectID = null;
238
+ }
239
+
240
+ // Flush the WinCache cache
241
+ $this->__destruct();
242
+
243
+ $this->_cellCache = array();
244
+
245
+ // detach ourself from the worksheet, so that it can then delete this object successfully
246
+ $this->_parent = null;
247
+ } // function unsetWorksheetCells()
248
+
249
+
250
+ /**
251
+ * Initialise this new cell collection
252
+ *
253
+ * @param PHPExcel_Worksheet $parent The worksheet for this cell collection
254
+ * @param array of mixed $arguments Additional initialisation arguments
255
+ */
256
+ public function __construct(PHPExcel_Worksheet $parent, $arguments) {
257
+ $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600;
258
+
259
+ if (is_null($this->_cachePrefix)) {
260
+ $baseUnique = $this->_getUniqueID();
261
+ $this->_cachePrefix = substr(md5($baseUnique),0,8).'.';
262
+ $this->_cacheTime = $cacheTime;
263
+
264
+ parent::__construct($parent);
265
+ }
266
+ } // function __construct()
267
+
268
+
269
+ /**
270
+ * Destroy this cell collection
271
+ */
272
+ public function __destruct() {
273
+ $cacheList = $this->getCellList();
274
+ foreach($cacheList as $cellID) {
275
+ wincache_ucache_delete($this->_cachePrefix.$cellID.'.cache');
276
+ }
277
+ } // function __destruct()
278
+
279
+
280
+ /**
281
+ * Identify whether the caching method is currently available
282
+ * Some methods are dependent on the availability of certain extensions being enabled in the PHP build
283
+ *
284
+ * @return boolean
285
+ */
286
+ public static function cacheMethodIsAvailable() {
287
+ if (!function_exists('wincache_ucache_add')) {
288
+ return false;
289
+ }
290
+
291
+ return true;
292
+ }
293
+
294
+ }
classes/PHPExcel/locale/sv/functions CHANGED
@@ -1,408 +1,408 @@
1
- ##
2
- ## Add-in and Automation functions Tilläggs- och automatiseringsfunktioner
3
- ##
4
- GETPIVOTDATA = HÄMTA.PIVOTDATA ## Returnerar data som lagrats i en pivottabellrapport
5
-
6
-
7
- ##
8
- ## Cube functions Kubfunktioner
9
- ##
10
- CUBEKPIMEMBER = KUBKPIMEDLEM ## Returnerar namn, egenskap och mått för en KPI och visar namnet och egenskapen i cellen. En KPI, eller prestandaindikator, är ett kvantifierbart mått, t.ex. månatlig bruttovinst eller personalomsättning per kvartal, som används för att analysera ett företags resultat.
11
- CUBEMEMBER = KUBMEDLEM ## Returnerar en medlem eller ett par i en kubhierarki. Används för att verifiera att medlemmen eller paret finns i kuben.
12
- CUBEMEMBERPROPERTY = KUBMEDLEMSEGENSKAP ## Returnerar värdet för en medlemsegenskap i kuben. Används för att verifiera att ett medlemsnamn finns i kuben, samt för att returnera den angivna egenskapen för medlemmen.
13
- CUBERANKEDMEMBER = KUBRANGORDNADMEDLEM ## Returnerar den n:te, eller rangordnade, medlemmen i en uppsättning. Används för att returnera ett eller flera element i en uppsättning, till exempelvis den bästa försäljaren eller de tio bästa eleverna.
14
- CUBESET = KUBINSTÄLLNING ## Definierar en beräknad uppsättning medlemmar eller par genom att skicka ett bestämt uttryck till kuben på servern, som skapar uppsättningen och sedan returnerar den till Microsoft Office Excel.
15
- CUBESETCOUNT = KUBINSTÄLLNINGANTAL ## Returnerar antalet objekt i en uppsättning.
16
- CUBEVALUE = KUBVÄRDE ## Returnerar ett mängdvärde från en kub.
17
-
18
-
19
- ##
20
- ## Database functions Databasfunktioner
21
- ##
22
- DAVERAGE = DMEDEL ## Returnerar medelvärdet av databasposterna
23
- DCOUNT = DANTAL ## Räknar antalet celler som innehåller tal i en databas
24
- DCOUNTA = DANTALV ## Räknar ifyllda celler i en databas
25
- DGET = DHÄMTA ## Hämtar en enstaka post från en databas som uppfyller de angivna villkoren
26
- DMAX = DMAX ## Returnerar det största värdet från databasposterna
27
- DMIN = DMIN ## Returnerar det minsta värdet från databasposterna
28
- DPRODUCT = DPRODUKT ## Multiplicerar värdena i ett visst fält i poster som uppfyller villkoret
29
- DSTDEV = DSTDAV ## Uppskattar standardavvikelsen baserat på ett urval av databasposterna
30
- DSTDEVP = DSTDAVP ## Beräknar standardavvikelsen utifrån hela populationen av valda databasposter
31
- DSUM = DSUMMA ## Summerar talen i kolumnfält i databasposter som uppfyller villkoret
32
- DVAR = DVARIANS ## Uppskattar variansen baserat på ett urval av databasposterna
33
- DVARP = DVARIANSP ## Beräknar variansen utifrån hela populationen av valda databasposter
34
-
35
-
36
- ##
37
- ## Date and time functions Tid- och datumfunktioner
38
- ##
39
- DATE = DATUM ## Returnerar ett serienummer för ett visst datum
40
- DATEVALUE = DATUMVÄRDE ## Konverterar ett datum i textformat till ett serienummer
41
- DAY = DAG ## Konverterar ett serienummer till dag i månaden
42
- DAYS360 = DAGAR360 ## Beräknar antalet dagar mellan två datum baserat på ett 360-dagarsår
43
- EDATE = EDATUM ## Returnerar serienumret för ett datum som infaller ett visst antal månader före eller efter startdatumet
44
- EOMONTH = SLUTMÅNAD ## Returnerar serienumret för sista dagen i månaden ett visst antal månader tidigare eller senare
45
- HOUR = TIMME ## Konverterar ett serienummer till en timme
46
- MINUTE = MINUT ## Konverterar ett serienummer till en minut
47
- MONTH = MÅNAD ## Konverterar ett serienummer till en månad
48
- NETWORKDAYS = NETTOARBETSDAGAR ## Returnerar antalet hela arbetsdagar mellan två datum
49
- NOW = NU ## Returnerar serienumret för dagens datum och aktuell tid
50
- SECOND = SEKUND ## Konverterar ett serienummer till en sekund
51
- TIME = KLOCKSLAG ## Returnerar serienumret för en viss tid
52
- TIMEVALUE = TIDVÄRDE ## Konverterar en tid i textformat till ett serienummer
53
- TODAY = IDAG ## Returnerar serienumret för dagens datum
54
- WEEKDAY = VECKODAG ## Konverterar ett serienummer till en dag i veckan
55
- WEEKNUM = VECKONR ## Konverterar ett serienummer till ett veckonummer
56
- WORKDAY = ARBETSDAGAR ## Returnerar serienumret för ett datum ett visst antal arbetsdagar tidigare eller senare
57
- YEAR = ÅR ## Konverterar ett serienummer till ett år
58
- YEARFRAC = ÅRDEL ## Returnerar en del av ett år som representerar antalet hela dagar mellan start- och slutdatum
59
-
60
-
61
- ##
62
- ## Engineering functions Tekniska funktioner
63
- ##
64
- BESSELI = BESSELI ## Returnerar den modifierade Bessel-funktionen In(x)
65
- BESSELJ = BESSELJ ## Returnerar Bessel-funktionen Jn(x)
66
- BESSELK = BESSELK ## Returnerar den modifierade Bessel-funktionen Kn(x)
67
- BESSELY = BESSELY ## Returnerar Bessel-funktionen Yn(x)
68
- BIN2DEC = BIN.TILL.DEC ## Omvandlar ett binärt tal till decimalt
69
- BIN2HEX = BIN.TILL.HEX ## Omvandlar ett binärt tal till hexadecimalt
70
- BIN2OCT = BIN.TILL.OKT ## Omvandlar ett binärt tal till oktalt
71
- COMPLEX = KOMPLEX ## Omvandlar reella och imaginära koefficienter till ett komplext tal
72
- CONVERT = KONVERTERA ## Omvandlar ett tal från ett måttsystem till ett annat
73
- DEC2BIN = DEC.TILL.BIN ## Omvandlar ett decimalt tal till binärt
74
- DEC2HEX = DEC.TILL.HEX ## Omvandlar ett decimalt tal till hexadecimalt
75
- DEC2OCT = DEC.TILL.OKT ## Omvandlar ett decimalt tal till oktalt
76
- DELTA = DELTA ## Testar om två värden är lika
77
- ERF = FELF ## Returnerar felfunktionen
78
- ERFC = FELFK ## Returnerar den komplementära felfunktionen
79
- GESTEP = SLSTEG ## Testar om ett tal är större än ett tröskelvärde
80
- HEX2BIN = HEX.TILL.BIN ## Omvandlar ett hexadecimalt tal till binärt
81
- HEX2DEC = HEX.TILL.DEC ## Omvandlar ett hexadecimalt tal till decimalt
82
- HEX2OCT = HEX.TILL.OKT ## Omvandlar ett hexadecimalt tal till oktalt
83
- IMABS = IMABS ## Returnerar absolutvärdet (modulus) för ett komplext tal
84
- IMAGINARY = IMAGINÄR ## Returnerar den imaginära koefficienten för ett komplext tal
85
- IMARGUMENT = IMARGUMENT ## Returnerar det komplexa talets argument, en vinkel uttryckt i radianer
86
- IMCONJUGATE = IMKONJUGAT ## Returnerar det komplexa talets konjugat
87
- IMCOS = IMCOS ## Returnerar cosinus för ett komplext tal
88
- IMDIV = IMDIV ## Returnerar kvoten för två komplexa tal
89
- IMEXP = IMEUPPHÖJT ## Returnerar exponenten för ett komplext tal
90
- IMLN = IMLN ## Returnerar den naturliga logaritmen för ett komplext tal
91
- IMLOG10 = IMLOG10 ## Returnerar 10-logaritmen för ett komplext tal
92
- IMLOG2 = IMLOG2 ## Returnerar 2-logaritmen för ett komplext tal
93
- IMPOWER = IMUPPHÖJT ## Returnerar ett komplext tal upphöjt till en exponent
94
- IMPRODUCT = IMPRODUKT ## Returnerar produkten av komplexa tal
95
- IMREAL = IMREAL ## Returnerar den reella koefficienten för ett komplext tal
96
- IMSIN = IMSIN ## Returnerar sinus för ett komplext tal
97
- IMSQRT = IMROT ## Returnerar kvadratroten av ett komplext tal
98
- IMSUB = IMDIFF ## Returnerar differensen mellan två komplexa tal
99
- IMSUM = IMSUM ## Returnerar summan av komplexa tal
100
- OCT2BIN = OKT.TILL.BIN ## Omvandlar ett oktalt tal till binärt
101
- OCT2DEC = OKT.TILL.DEC ## Omvandlar ett oktalt tal till decimalt
102
- OCT2HEX = OKT.TILL.HEX ## Omvandlar ett oktalt tal till hexadecimalt
103
-
104
-
105
- ##
106
- ## Financial functions Finansiella funktioner
107
- ##
108
- ACCRINT = UPPLRÄNTA ## Returnerar den upplupna räntan för värdepapper med periodisk ränta
109
- ACCRINTM = UPPLOBLRÄNTA ## Returnerar den upplupna räntan för ett värdepapper som ger avkastning på förfallodagen
110
- AMORDEGRC = AMORDEGRC ## Returnerar avskrivningen för varje redovisningsperiod med hjälp av en avskrivningskoefficient
111
- AMORLINC = AMORLINC ## Returnerar avskrivningen för varje redovisningsperiod
112
- COUPDAYBS = KUPDAGBB ## Returnerar antal dagar från början av kupongperioden till likviddagen
113
- COUPDAYS = KUPDAGARS ## Returnerar antalet dagar i kupongperioden som innehåller betalningsdatumet
114
- COUPDAYSNC = KUPDAGNK ## Returnerar antalet dagar från betalningsdatumet till nästa kupongdatum
115
- COUPNCD = KUPNKD ## Returnerar nästa kupongdatum efter likviddagen
116
- COUPNUM = KUPANT ## Returnerar kuponger som förfaller till betalning mellan likviddagen och förfallodagen
117
- COUPPCD = KUPFKD ## Returnerar föregående kupongdatum före likviddagen
118
- CUMIPMT = KUMRÄNTA ## Returnerar den ackumulerade räntan som betalats mellan två perioder
119
- CUMPRINC = KUMPRIS ## Returnerar det ackumulerade kapitalbeloppet som betalats på ett lån mellan två perioder
120
- DB = DB ## Returnerar avskrivningen för en tillgång under en angiven tid enligt metoden för fast degressiv avskrivning
121
- DDB = DEGAVSKR ## Returnerar en tillgångs värdeminskning under en viss period med hjälp av dubbel degressiv avskrivning eller någon annan metod som du anger
122
- DISC = DISK ## Returnerar diskonteringsräntan för ett värdepapper
123
- DOLLARDE = DECTAL ## Omvandlar ett pris uttryckt som ett bråk till ett decimaltal
124
- DOLLARFR = BRÅK ## Omvandlar ett pris i kronor uttryckt som ett decimaltal till ett bråk
125
- DURATION = LÖPTID ## Returnerar den årliga löptiden för en säkerhet med periodiska räntebetalningar
126
- EFFECT = EFFRÄNTA ## Returnerar den årliga effektiva räntesatsen
127
- FV = SLUTVÄRDE ## Returnerar det framtida värdet på en investering
128
- FVSCHEDULE = FÖRRÄNTNING ## Returnerar det framtida värdet av ett begynnelsekapital beräknat på olika räntenivåer
129
- INTRATE = ÅRSRÄNTA ## Returnerar räntesatsen för ett betalt värdepapper
130
- IPMT = RBETALNING ## Returnerar räntedelen av en betalning för en given period
131
- IRR = IR ## Returnerar internräntan för en serie betalningar
132
- ISPMT = RALÅN ## Beräknar räntan som har betalats under en specifik betalningsperiod
133
- MDURATION = MLÖPTID ## Returnerar den modifierade Macauley-löptiden för ett värdepapper med det antagna nominella värdet 100 kr
134
- MIRR = MODIR ## Returnerar internräntan där positiva och negativa betalningar finansieras med olika räntor
135
- NOMINAL = NOMRÄNTA ## Returnerar den årliga nominella räntesatsen
136
- NPER = PERIODER ## Returnerar antalet perioder för en investering
137
- NPV = NETNUVÄRDE ## Returnerar nuvärdet av en serie periodiska betalningar vid en given diskonteringsränta
138
- ODDFPRICE = UDDAFPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda första period
139
- ODDFYIELD = UDDAFAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda första period
140
- ODDLPRICE = UDDASPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda sista period
141
- ODDLYIELD = UDDASAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda sista period
142
- PMT = BETALNING ## Returnerar den periodiska betalningen för en annuitet
143
- PPMT = AMORT ## Returnerar amorteringsdelen av en annuitetsbetalning för en given period
144
- PRICE = PRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger periodisk ränta
145
- PRICEDISC = PRISDISK ## Returnerar priset per 100 kr nominellt värde för ett diskonterat värdepapper
146
- PRICEMAT = PRISFÖRF ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger ränta på förfallodagen
147
- PV = PV ## Returnerar nuvärdet av en serie lika stora periodiska betalningar
148
- RATE = RÄNTA ## Returnerar räntesatsen per period i en annuitet
149
- RECEIVED = BELOPP ## Returnerar beloppet som utdelas på förfallodagen för ett betalat värdepapper
150
- SLN = LINAVSKR ## Returnerar den linjära avskrivningen för en tillgång under en period
151
- SYD = ÅRSAVSKR ## Returnerar den årliga avskrivningssumman för en tillgång under en angiven period
152
- TBILLEQ = SSVXEKV ## Returnerar avkastningen motsvarande en obligation för en statsskuldväxel
153
- TBILLPRICE = SSVXPRIS ## Returnerar priset per 100 kr nominellt värde för en statsskuldväxel
154
- TBILLYIELD = SSVXRÄNTA ## Returnerar avkastningen för en statsskuldväxel
155
- VDB = VDEGRAVSKR ## Returnerar avskrivningen för en tillgång under en angiven period (med degressiv avskrivning)
156
- XIRR = XIRR ## Returnerar internräntan för en serie betalningar som inte nödvändigtvis är periodiska
157
- XNPV = XNUVÄRDE ## Returnerar det nuvarande nettovärdet för en serie betalningar som inte nödvändigtvis är periodiska
158
- YIELD = NOMAVK ## Returnerar avkastningen för ett värdepapper som ger periodisk ränta
159
- YIELDDISC = NOMAVKDISK ## Returnerar den årliga avkastningen för diskonterade värdepapper, exempelvis en statsskuldväxel
160
- YIELDMAT = NOMAVKFÖRF ## Returnerar den årliga avkastningen för ett värdepapper som ger ränta på förfallodagen
161
-
162
-
163
- ##
164
- ## Information functions Informationsfunktioner
165
- ##
166
- CELL = CELL ## Returnerar information om formatering, plats och innehåll i en cell
167
- ERROR.TYPE = FEL.TYP ## Returnerar ett tal som motsvarar ett felvärde
168
- INFO = INFO ## Returnerar information om operativsystemet
169
- ISBLANK = ÄRREF ## Returnerar SANT om värdet är tomt
170
- ISERR = Ä ## Returnerar SANT om värdet är ett felvärde annat än #SAKNAS!
171
- ISERROR = ÄRFEL ## Returnerar SANT om värdet är ett felvärde
172
- ISEVEN = ÄRJÄMN ## Returnerar SANT om talet är jämnt
173
- ISLOGICAL = ÄREJTEXT ## Returnerar SANT om värdet är ett logiskt värde
174
- ISNA = ÄRLOGISK ## Returnerar SANT om värdet är felvärdet #SAKNAS!
175
- ISNONTEXT = ÄRSAKNAD ## Returnerar SANT om värdet inte är text
176
- ISNUMBER = ÄRTAL ## Returnerar SANT om värdet är ett tal
177
- ISODD = ÄRUDDA ## Returnerar SANT om talet är udda
178
- ISREF = ÄRTOM ## Returnerar SANT om värdet är en referens
179
- ISTEXT = ÄRTEXT ## Returnerar SANT om värdet är text
180
- N = N ## Returnerar ett värde omvandlat till ett tal
181
- NA = SAKNAS ## Returnerar felvärdet #SAKNAS!
182
- TYPE = VÄRDETYP ## Returnerar ett tal som anger värdets datatyp
183
-
184
-
185
- ##
186
- ## Logical functions Logiska funktioner
187
- ##
188
- AND = OCH ## Returnerar SANT om alla argument är sanna
189
- FALSE = FALSKT ## Returnerar det logiska värdet FALSKT
190
- IF = OM ## Anger vilket logiskt test som ska utföras
191
- IFERROR = OMFEL ## Returnerar ett värde som du anger om en formel utvärderar till ett fel; annars returneras resultatet av formeln
192
- NOT = ICKE ## Inverterar logiken för argumenten
193
- OR = ELLER ## Returnerar SANT om något argument är SANT
194
- TRUE = SANT ## Returnerar det logiska värdet SANT
195
-
196
-
197
- ##
198
- ## Lookup and reference functions Sök- och referensfunktioner
199
- ##
200
- ADDRESS = ADRESS ## Returnerar en referens som text till en enstaka cell i ett kalkylblad
201
- AREAS = OMRÅDEN ## Returnerar antalet områden i en referens
202
- CHOOSE = VÄLJ ## Väljer ett värde i en lista över värden
203
- COLUMN = KOLUMN ## Returnerar kolumnnumret för en referens
204
- COLUMNS = KOLUMNER ## Returnerar antalet kolumner i en referens
205
- HLOOKUP = LETAKOLUMN ## Söker i den översta raden i en matris och returnerar värdet för angiven cell
206
- HYPERLINK = HYPERLÄNK ## Skapar en genväg eller ett hopp till ett dokument i nätverket, i ett intranät eller på Internet
207
- INDEX = INDEX ## Använder ett index för ett välja ett värde i en referens eller matris
208
- INDIRECT = INDIREKT ## Returnerar en referens som anges av ett textvärde
209
- LOOKUP = LETAUPP ## Letar upp värden i en vektor eller matris
210
- MATCH = PASSA ## Letar upp värden i en referens eller matris
211
- OFFSET = FÖRSKJUTNING ## Returnerar en referens förskjuten i förhållande till en given referens
212
- ROW = RAD ## Returnerar radnumret för en referens
213
- ROWS = RADER ## Returnerar antalet rader i en referens
214
- RTD = RTD ## Hämtar realtidsdata från ett program som stöder COM-automation (Automation: Ett sätt att arbeta med ett programs objekt från ett annat program eller utvecklingsverktyg. Detta kallades tidigare för OLE Automation, och är en branschstandard och ingår i Component Object Model (COM).)
215
- TRANSPOSE = TRANSPONERA ## Transponerar en matris
216
- VLOOKUP = LETARAD ## Letar i den första kolumnen i en matris och flyttar över raden för att returnera värdet för en cell
217
-
218
-
219
- ##
220
- ## Math and trigonometry functions Matematiska och trigonometriska funktioner
221
- ##
222
- ABS = ABS ## Returnerar absolutvärdet av ett tal
223
- ACOS = ARCCOS ## Returnerar arcus cosinus för ett tal
224
- ACOSH = ARCCOSH ## Returnerar inverterad hyperbolisk cosinus för ett tal
225
- ASIN = ARCSIN ## Returnerar arcus cosinus för ett tal
226
- ASINH = ARCSINH ## Returnerar hyperbolisk arcus sinus för ett tal
227
- ATAN = ARCTAN ## Returnerar arcus tangens för ett tal
228
- ATAN2 = ARCTAN2 ## Returnerar arcus tangens för en x- och en y- koordinat
229
- ATANH = ARCTANH ## Returnerar hyperbolisk arcus tangens för ett tal
230
- CEILING = RUNDA.UPP ## Avrundar ett tal till närmaste heltal eller närmaste signifikanta multipel
231
- COMBIN = KOMBIN ## Returnerar antalet kombinationer för ett givet antal objekt
232
- COS = COS ## Returnerar cosinus för ett tal
233
- COSH = COSH ## Returnerar hyperboliskt cosinus för ett tal
234
- DEGREES = GRADER ## Omvandlar radianer till grader
235
- EVEN = JÄMN ## Avrundar ett tal uppåt till närmaste heltal
236
- EXP = EXP ## Returnerar e upphöjt till ett givet tal
237
- FACT = FAKULTET ## Returnerar fakulteten för ett tal
238
- FACTDOUBLE = DUBBELFAKULTET ## Returnerar dubbelfakulteten för ett tal
239
- FLOOR = RUNDA.NED ## Avrundar ett tal nedåt mot noll
240
- GCD = SGD ## Returnerar den största gemensamma nämnaren
241
- INT = HELTAL ## Avrundar ett tal nedåt till närmaste heltal
242
- LCM = MGM ## Returnerar den minsta gemensamma multipeln
243
- LN = LN ## Returnerar den naturliga logaritmen för ett tal
244
- LOG = LOG ## Returnerar logaritmen för ett tal för en given bas
245
- LOG10 = LOG10 ## Returnerar 10-logaritmen för ett tal
246
- MDETERM = MDETERM ## Returnerar matrisen som är avgörandet av en matris
247
- MINVERSE = MINVERT ## Returnerar matrisinversen av en matris
248
- MMULT = MMULT ## Returnerar matrisprodukten av två matriser
249
- MOD = REST ## Returnerar resten vid en division
250
- MROUND = MAVRUNDA ## Returnerar ett tal avrundat till en given multipel
251
- MULTINOMIAL = MULTINOMIAL ## Returnerar multinomialen för en uppsättning tal
252
- ODD = UDDA ## Avrundar ett tal uppåt till närmaste udda heltal
253
- PI = PI ## Returnerar värdet pi
254
- POWER = UPPHÖJT.TILL ## Returnerar resultatet av ett tal upphöjt till en exponent
255
- PRODUCT = PRODUKT ## Multiplicerar argumenten
256
- QUOTIENT = KVOT ## Returnerar heltalsdelen av en division
257
- RADIANS = RADIANER ## Omvandlar grader till radianer
258
- RAND = SLUMP ## Returnerar ett slumptal mellan 0 och 1
259
- RANDBETWEEN = SLUMP.MELLAN ## Returnerar ett slumptal mellan de tal som du anger
260
- ROMAN = ROMERSK ## Omvandlar vanliga (arabiska) siffror till romerska som text
261
- ROUND = AVRUNDA ## Avrundar ett tal till ett angivet antal siffror
262
- ROUNDDOWN = AVRUNDA.NEDÅT ## Avrundar ett tal nedåt mot noll
263
- ROUNDUP = AVRUNDA.UPPÅT ## Avrundar ett tal uppåt, från noll
264
- SERIESSUM = SERIESUMMA ## Returnerar summan av en potensserie baserat på formeln
265
- SIGN = TECKEN ## Returnerar tecknet för ett tal
266
- SIN = SIN ## Returnerar sinus för en given vinkel
267
- SINH = SINH ## Returnerar hyperbolisk sinus för ett tal
268
- SQRT = ROT ## Returnerar den positiva kvadratroten
269
- SQRTPI = ROTPI ## Returnerar kvadratroten för (tal * pi)
270
- SUBTOTAL = DELSUMMA ## Returnerar en delsumma i en lista eller databas
271
- SUM = SUMMA ## Summerar argumenten
272
- SUMIF = SUMMA.OM ## Summerar celler enligt ett angivet villkor
273
- SUMIFS = SUMMA.OMF ## Lägger till cellerna i ett område som uppfyller flera kriterier
274
- SUMPRODUCT = PRODUKTSUMMA ## Returnerar summan av produkterna i motsvarande matriskomponenter
275
- SUMSQ = KVADRATSUMMA ## Returnerar summan av argumentens kvadrater
276
- SUMX2MY2 = SUMMAX2MY2 ## Returnerar summan av differensen mellan kvadraterna för motsvarande värden i två matriser
277
- SUMX2PY2 = SUMMAX2PY2 ## Returnerar summan av summan av kvadraterna av motsvarande värden i två matriser
278
- SUMXMY2 = SUMMAXMY2 ## Returnerar summan av kvadraten av skillnaden mellan motsvarande värden i två matriser
279
- TAN = TAN ## Returnerar tangens för ett tal
280
- TANH = TANH ## Returnerar hyperbolisk tangens för ett tal
281
- TRUNC = AVKORTA ## Avkortar ett tal till ett heltal
282
-
283
-
284
- ##
285
- ## Statistical functions Statistiska funktioner
286
- ##
287
- AVEDEV = MEDELAVV ## Returnerar medelvärdet för datapunkters absoluta avvikelse från deras medelvärde
288
- AVERAGE = MEDEL ## Returnerar medelvärdet av argumenten
289
- AVERAGEA = AVERAGEA ## Returnerar medelvärdet av argumenten, inklusive tal, text och logiska värden
290
- AVERAGEIF = MEDELOM ## Returnerar medelvärdet (aritmetiskt medelvärde) för alla celler i ett område som uppfyller ett givet kriterium
291
- AVERAGEIFS = MEDELOMF ## Returnerar medelvärdet (det aritmetiska medelvärdet) för alla celler som uppfyller flera villkor.
292
- BETADIST = BETAFÖRD ## Returnerar den kumulativa betafördelningsfunktionen
293
- BETAINV = BETAINV ## Returnerar inversen till den kumulativa fördelningsfunktionen för en viss betafördelning
294
- BINOMDIST = BINOMFÖRD ## Returnerar den individuella binomialfördelningen
295
- CHIDIST = CHI2FÖRD ## Returnerar den ensidiga sannolikheten av c2-fördelningen
296
- CHIINV = CHI2INV ## Returnerar inversen av chi2-fördelningen
297
- CHITEST = CHI2TEST ## Returnerar oberoendetesten
298
- CONFIDENCE = KONFIDENS ## Returnerar konfidensintervallet för en populations medelvärde
299
- CORREL = KORREL ## Returnerar korrelationskoefficienten mellan två datamängder
300
- COUNT = ANTAL ## Räknar hur många tal som finns bland argumenten
301
- COUNTA = ANTALV ## Räknar hur många värden som finns bland argumenten
302
- COUNTBLANK = ANTAL.TOMMA ## Räknar antalet tomma celler i ett område
303
- COUNTIF = ANTAL.OM ## Räknar antalet celler i ett område som uppfyller angivna villkor.
304
- COUNTIFS = ANTAL.OMF ## Räknar antalet celler i ett område som uppfyller flera villkor.
305
- COVAR = KOVAR ## Returnerar kovariansen, d.v.s. medelvärdet av produkterna för parade avvikelser
306
- CRITBINOM = KRITBINOM ## Returnerar det minsta värdet för vilket den kumulativa binomialfördelningen är mindre än eller lika med ett villkorsvärde
307
- DEVSQ = KVADAVV ## Returnerar summan av kvadrater på avvikelser
308
- EXPONDIST = EXPONFÖRD ## Returnerar exponentialfördelningen
309
- FDIST = FFÖRD ## Returnerar F-sannolikhetsfördelningen
310
- FINV = FINV ## Returnerar inversen till F-sannolikhetsfördelningen
311
- FISHER = FISHER ## Returnerar Fisher-transformationen
312
- FISHERINV = FISHERINV ## Returnerar inversen till Fisher-transformationen
313
- FORECAST = PREDIKTION ## Returnerar ett värde längs en linjär trendlinje
314
- FREQUENCY = FREKVENS ## Returnerar en frekvensfördelning som en lodrät matris
315
- FTEST = FTEST ## Returnerar resultatet av en F-test
316
- GAMMADIST = GAMMAFÖRD ## Returnerar gammafördelningen
317
- GAMMAINV = GAMMAINV ## Returnerar inversen till den kumulativa gammafördelningen
318
- GAMMALN = GAMMALN ## Returnerar den naturliga logaritmen för gammafunktionen, G(x)
319
- GEOMEAN = GEOMEDEL ## Returnerar det geometriska medelvärdet
320
- GROWTH = EXPTREND ## Returnerar värden längs en exponentiell trend
321
- HARMEAN = HARMMEDEL ## Returnerar det harmoniska medelvärdet
322
- HYPGEOMDIST = HYPGEOMFÖRD ## Returnerar den hypergeometriska fördelningen
323
- INTERCEPT = SKÄRNINGSPUNKT ## Returnerar skärningspunkten för en linjär regressionslinje
324
- KURT = TOPPIGHET ## Returnerar toppigheten av en mängd data
325
- LARGE = STÖRSTA ## Returnerar det n:te största värdet i en mängd data
326
- LINEST = REGR ## Returnerar parametrar till en linjär trendlinje
327
- LOGEST = EXPREGR ## Returnerar parametrarna i en exponentiell trend
328
- LOGINV = LOGINV ## Returnerar inversen till den lognormala fördelningen
329
- LOGNORMDIST = LOGNORMFÖRD ## Returnerar den kumulativa lognormala fördelningen
330
- MAX = MAX ## Returnerar det största värdet i en lista av argument
331
- MAXA = MAXA ## Returnerar det största värdet i en lista av argument, inklusive tal, text och logiska värden
332
- MEDIAN = MEDIAN ## Returnerar medianen för angivna tal
333
- MIN = MIN ## Returnerar det minsta värdet i en lista med argument
334
- MINA = MINA ## Returnerar det minsta värdet i en lista över argument, inklusive tal, text och logiska värden
335
- MODE = TYPVÄRDE ## Returnerar det vanligaste värdet i en datamängd
336
- NEGBINOMDIST = NEGBINOMFÖRD ## Returnerar den negativa binomialfördelningen
337
- NORMDIST = NORMFÖRD ## Returnerar den kumulativa normalfördelningen
338
- NORMINV = NORMINV ## Returnerar inversen till den kumulativa normalfördelningen
339
- NORMSDIST = NORMSFÖRD ## Returnerar den kumulativa standardnormalfördelningen
340
- NORMSINV = NORMSINV ## Returnerar inversen till den kumulativa standardnormalfördelningen
341
- PEARSON = PEARSON ## Returnerar korrelationskoefficienten till Pearsons momentprodukt
342
- PERCENTILE = PERCENTIL ## Returnerar den n:te percentilen av värden i ett område
343
- PERCENTRANK = PROCENTRANG ## Returnerar procentrangen för ett värde i en datamängd
344
- PERMUT = PERMUT ## Returnerar antal permutationer för ett givet antal objekt
345
- POISSON = POISSON ## Returnerar Poisson-fördelningen
346
- PROB = SANNOLIKHET ## Returnerar sannolikheten att värden i ett område ligger mellan två gränser
347
- QUARTILE = KVARTIL ## Returnerar kvartilen av en mängd data
348
- RANK = RANG ## Returnerar rangordningen för ett tal i en lista med tal
349
- RSQ = RKV ## Returnerar kvadraten av Pearsons produktmomentkorrelationskoefficient
350
- SKEW = SNEDHET ## Returnerar snedheten för en fördelning
351
- SLOPE = LUTNING ## Returnerar lutningen på en linjär regressionslinje
352
- SMALL = MINSTA ## Returnerar det n:te minsta värdet i en mängd data
353
- STANDARDIZE = STANDARDISERA ## Returnerar ett normaliserat värde
354
- STDEV = STDAV ## Uppskattar standardavvikelsen baserat på ett urval
355
- STDEVA = STDEVA ## Uppskattar standardavvikelsen baserat på ett urval, inklusive tal, text och logiska värden
356
- STDEVP = STDAVP ## Beräknar standardavvikelsen baserat på hela populationen
357
- STDEVPA = STDEVPA ## Beräknar standardavvikelsen baserat på hela populationen, inklusive tal, text och logiska värden
358
- STEYX = STDFELYX ## Returnerar standardfelet för ett förutspått y-värde för varje x-värde i regressionen
359
- TDIST = TFÖRD ## Returnerar Students t-fördelning
360
- TINV = TINV ## Returnerar inversen till Students t-fördelning
361
- TREND = TREND ## Returnerar värden längs en linjär trend
362
- TRIMMEAN = TRIMMEDEL ## Returnerar medelvärdet av mittpunkterna i en datamängd
363
- TTEST = TTEST ## Returnerar sannolikheten beräknad ur Students t-test
364
- VAR = VARIANS ## Uppskattar variansen baserat på ett urval
365
- VARA = VARA ## Uppskattar variansen baserat på ett urval, inklusive tal, text och logiska värden
366
- VARP = VARIANSP ## Beräknar variansen baserat på hela populationen
367
- VARPA = VARPA ## Beräknar variansen baserat på hela populationen, inklusive tal, text och logiska värden
368
- WEIBULL = WEIBULL ## Returnerar Weibull-fördelningen
369
- ZTEST = ZTEST ## Returnerar det ensidiga sannolikhetsvärdet av ett z-test
370
-
371
-
372
- ##
373
- ## Text functions Textfunktioner
374
- ##
375
- ASC = ASC ## Ändrar helbredds (dubbel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med halvt breddsteg (enkel byte)
376
- BAHTTEXT = BAHTTEXT ## Omvandlar ett tal till text med valutaformatet ß (baht)
377
- CHAR = TECKENKOD ## Returnerar tecknet som anges av kod
378
- CLEAN = STÄDA ## Tar bort alla icke utskrivbara tecken i en text
379
- CODE = KOD ## Returnerar en numerisk kod för det första tecknet i en textsträng
380
- CONCATENATE = SAMMANFOGA ## Sammanfogar flera textdelar till en textsträng
381
- DOLLAR = VALUTA ## Omvandlar ett tal till text med valutaformat
382
- EXACT = EXAKT ## Kontrollerar om två textvärden är identiska
383
- FIND = HITTA ## Hittar en text i en annan (skiljer på gemener och versaler)
384
- FINDB = HITTAB ## Hittar en text i en annan (skiljer på gemener och versaler)
385
- FIXED = FASTTAL ## Formaterar ett tal som text med ett fast antal decimaler
386
- JIS = JIS ## Ändrar halvbredds (enkel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med helt breddsteg (dubbel byte)
387
- LEFT = VÄNSTER ## Returnerar tecken längst till vänster i en sträng
388
- LEFTB = VÄNSTERB ## Returnerar tecken längst till vänster i en sträng
389
- LEN = LÄNGD ## Returnerar antalet tecken i en textsträng
390
- LENB = LÄNGDB ## Returnerar antalet tecken i en textsträng
391
- LOWER = GEMENER ## Omvandlar text till gemener
392
- MID = EXTEXT ## Returnerar angivet antal tecken från en text med början vid den position som du anger
393
- MIDB = EXTEXTB ## Returnerar angivet antal tecken från en text med början vid den position som du anger
394
- PHONETIC = PHONETIC ## Returnerar de fonetiska (furigana) tecknen i en textsträng
395
- PROPER = INITIAL ## Ändrar första bokstaven i varje ord i ett textvärde till versal
396
- REPLACE = ERSÄTT ## Ersätter tecken i text
397
- REPLACEB = ERSÄTTB ## Ersätter tecken i text
398
- REPT = REP ## Upprepar en text ett bestämt antal gånger
399
- RIGHT = HÖGER ## Returnerar tecken längst till höger i en sträng
400
- RIGHTB = HÖGERB ## Returnerar tecken längst till höger i en sträng
401
- SEARCH = SÖK ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler)
402
- SEARCHB = SÖKB ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler)
403
- SUBSTITUTE = BYT.UT ## Ersätter gammal text med ny text i en textsträng
404
- T = T ## Omvandlar argumenten till text
405
- TEXT = TEXT ## Formaterar ett tal och omvandlar det till text
406
- TRIM = RENSA ## Tar bort blanksteg från text
407
- UPPER = VERSALER ## Omvandlar text till versaler
408
- VALUE = TEXTNUM ## Omvandlar ett textargument till ett tal
1
+ ##
2
+ ## Add-in and Automation functions Tilläggs- och automatiseringsfunktioner
3
+ ##
4
+ GETPIVOTDATA = HÄMTA.PIVOTDATA ## Returnerar data som lagrats i en pivottabellrapport
5
+
6
+
7
+ ##
8
+ ## Cube functions Kubfunktioner
9
+ ##
10
+ CUBEKPIMEMBER = KUBKPIMEDLEM ## Returnerar namn, egenskap och mått för en KPI och visar namnet och egenskapen i cellen. En KPI, eller prestandaindikator, är ett kvantifierbart mått, t.ex. månatlig bruttovinst eller personalomsättning per kvartal, som används för att analysera ett företags resultat.
11
+ CUBEMEMBER = KUBMEDLEM ## Returnerar en medlem eller ett par i en kubhierarki. Används för att verifiera att medlemmen eller paret finns i kuben.
12
+ CUBEMEMBERPROPERTY = KUBMEDLEMSEGENSKAP ## Returnerar värdet för en medlemsegenskap i kuben. Används för att verifiera att ett medlemsnamn finns i kuben, samt för att returnera den angivna egenskapen för medlemmen.
13
+ CUBERANKEDMEMBER = KUBRANGORDNADMEDLEM ## Returnerar den n:te, eller rangordnade, medlemmen i en uppsättning. Används för att returnera ett eller flera element i en uppsättning, till exempelvis den bästa försäljaren eller de tio bästa eleverna.
14
+ CUBESET = KUBINSTÄLLNING ## Definierar en beräknad uppsättning medlemmar eller par genom att skicka ett bestämt uttryck till kuben på servern, som skapar uppsättningen och sedan returnerar den till Microsoft Office Excel.
15
+ CUBESETCOUNT = KUBINSTÄLLNINGANTAL ## Returnerar antalet objekt i en uppsättning.
16
+ CUBEVALUE = KUBVÄRDE ## Returnerar ett mängdvärde från en kub.
17
+
18
+
19
+ ##
20
+ ## Database functions Databasfunktioner
21
+ ##
22
+ DAVERAGE = DMEDEL ## Returnerar medelvärdet av databasposterna
23
+ DCOUNT = DANTAL ## Räknar antalet celler som innehåller tal i en databas
24
+ DCOUNTA = DANTALV ## Räknar ifyllda celler i en databas
25
+ DGET = DHÄMTA ## Hämtar en enstaka post från en databas som uppfyller de angivna villkoren
26
+ DMAX = DMAX ## Returnerar det största värdet från databasposterna
27
+ DMIN = DMIN ## Returnerar det minsta värdet från databasposterna
28
+ DPRODUCT = DPRODUKT ## Multiplicerar värdena i ett visst fält i poster som uppfyller villkoret
29
+ DSTDEV = DSTDAV ## Uppskattar standardavvikelsen baserat på ett urval av databasposterna
30
+ DSTDEVP = DSTDAVP ## Beräknar standardavvikelsen utifrån hela populationen av valda databasposter
31
+ DSUM = DSUMMA ## Summerar talen i kolumnfält i databasposter som uppfyller villkoret
32
+ DVAR = DVARIANS ## Uppskattar variansen baserat på ett urval av databasposterna
33
+ DVARP = DVARIANSP ## Beräknar variansen utifrån hela populationen av valda databasposter
34
+
35
+
36
+ ##
37
+ ## Date and time functions Tid- och datumfunktioner
38
+ ##
39
+ DATE = DATUM ## Returnerar ett serienummer för ett visst datum
40
+ DATEVALUE = DATUMVÄRDE ## Konverterar ett datum i textformat till ett serienummer
41
+ DAY = DAG ## Konverterar ett serienummer till dag i månaden
42
+ DAYS360 = DAGAR360 ## Beräknar antalet dagar mellan två datum baserat på ett 360-dagarsår
43
+ EDATE = EDATUM ## Returnerar serienumret för ett datum som infaller ett visst antal månader före eller efter startdatumet
44
+ EOMONTH = SLUTMÅNAD ## Returnerar serienumret för sista dagen i månaden ett visst antal månader tidigare eller senare
45
+ HOUR = TIMME ## Konverterar ett serienummer till en timme
46
+ MINUTE = MINUT ## Konverterar ett serienummer till en minut
47
+ MONTH = MÅNAD ## Konverterar ett serienummer till en månad
48
+ NETWORKDAYS = NETTOARBETSDAGAR ## Returnerar antalet hela arbetsdagar mellan två datum
49
+ NOW = NU ## Returnerar serienumret för dagens datum och aktuell tid
50
+ SECOND = SEKUND ## Konverterar ett serienummer till en sekund
51
+ TIME = KLOCKSLAG ## Returnerar serienumret för en viss tid
52
+ TIMEVALUE = TIDVÄRDE ## Konverterar en tid i textformat till ett serienummer
53
+ TODAY = IDAG ## Returnerar serienumret för dagens datum
54
+ WEEKDAY = VECKODAG ## Konverterar ett serienummer till en dag i veckan
55
+ WEEKNUM = VECKONR ## Konverterar ett serienummer till ett veckonummer
56
+ WORKDAY = ARBETSDAGAR ## Returnerar serienumret för ett datum ett visst antal arbetsdagar tidigare eller senare
57
+ YEAR = ÅR ## Konverterar ett serienummer till ett år
58
+ YEARFRAC = ÅRDEL ## Returnerar en del av ett år som representerar antalet hela dagar mellan start- och slutdatum
59
+
60
+
61
+ ##
62
+ ## Engineering functions Tekniska funktioner
63
+ ##
64
+ BESSELI = BESSELI ## Returnerar den modifierade Bessel-funktionen In(x)
65
+ BESSELJ = BESSELJ ## Returnerar Bessel-funktionen Jn(x)
66
+ BESSELK = BESSELK ## Returnerar den modifierade Bessel-funktionen Kn(x)
67
+ BESSELY = BESSELY ## Returnerar Bessel-funktionen Yn(x)
68
+ BIN2DEC = BIN.TILL.DEC ## Omvandlar ett binärt tal till decimalt
69
+ BIN2HEX = BIN.TILL.HEX ## Omvandlar ett binärt tal till hexadecimalt
70
+ BIN2OCT = BIN.TILL.OKT ## Omvandlar ett binärt tal till oktalt
71
+ COMPLEX = KOMPLEX ## Omvandlar reella och imaginära koefficienter till ett komplext tal
72
+ CONVERT = KONVERTERA ## Omvandlar ett tal från ett måttsystem till ett annat
73
+ DEC2BIN = DEC.TILL.BIN ## Omvandlar ett decimalt tal till binärt
74
+ DEC2HEX = DEC.TILL.HEX ## Omvandlar ett decimalt tal till hexadecimalt
75
+ DEC2OCT = DEC.TILL.OKT ## Omvandlar ett decimalt tal till oktalt
76
+ DELTA = DELTA ## Testar om två värden är lika
77
+ ERF = FELF ## Returnerar felfunktionen
78
+ ERFC = FELFK ## Returnerar den komplementära felfunktionen
79
+ GESTEP = SLSTEG ## Testar om ett tal är större än ett tröskelvärde
80
+ HEX2BIN = HEX.TILL.BIN ## Omvandlar ett hexadecimalt tal till binärt
81
+ HEX2DEC = HEX.TILL.DEC ## Omvandlar ett hexadecimalt tal till decimalt
82
+ HEX2OCT = HEX.TILL.OKT ## Omvandlar ett hexadecimalt tal till oktalt
83
+ IMABS = IMABS ## Returnerar absolutvärdet (modulus) för ett komplext tal
84
+ IMAGINARY = IMAGINÄR ## Returnerar den imaginära koefficienten för ett komplext tal
85
+ IMARGUMENT = IMARGUMENT ## Returnerar det komplexa talets argument, en vinkel uttryckt i radianer
86
+ IMCONJUGATE = IMKONJUGAT ## Returnerar det komplexa talets konjugat
87
+ IMCOS = IMCOS ## Returnerar cosinus för ett komplext tal
88
+ IMDIV = IMDIV ## Returnerar kvoten för två komplexa tal
89
+ IMEXP = IMEUPPHÖJT ## Returnerar exponenten för ett komplext tal
90
+ IMLN = IMLN ## Returnerar den naturliga logaritmen för ett komplext tal
91
+ IMLOG10 = IMLOG10 ## Returnerar 10-logaritmen för ett komplext tal
92
+ IMLOG2 = IMLOG2 ## Returnerar 2-logaritmen för ett komplext tal
93
+ IMPOWER = IMUPPHÖJT ## Returnerar ett komplext tal upphöjt till en exponent
94
+ IMPRODUCT = IMPRODUKT ## Returnerar produkten av komplexa tal
95
+ IMREAL = IMREAL ## Returnerar den reella koefficienten för ett komplext tal
96
+ IMSIN = IMSIN ## Returnerar sinus för ett komplext tal
97
+ IMSQRT = IMROT ## Returnerar kvadratroten av ett komplext tal
98
+ IMSUB = IMDIFF ## Returnerar differensen mellan två komplexa tal
99
+ IMSUM = IMSUM ## Returnerar summan av komplexa tal
100
+ OCT2BIN = OKT.TILL.BIN ## Omvandlar ett oktalt tal till binärt
101
+ OCT2DEC = OKT.TILL.DEC ## Omvandlar ett oktalt tal till decimalt
102
+ OCT2HEX = OKT.TILL.HEX ## Omvandlar ett oktalt tal till hexadecimalt
103
+
104
+
105
+ ##
106
+ ## Financial functions Finansiella funktioner
107
+ ##
108
+ ACCRINT = UPPLRÄNTA ## Returnerar den upplupna räntan för värdepapper med periodisk ränta
109
+ ACCRINTM = UPPLOBLRÄNTA ## Returnerar den upplupna räntan för ett värdepapper som ger avkastning på förfallodagen
110
+ AMORDEGRC = AMORDEGRC ## Returnerar avskrivningen för varje redovisningsperiod med hjälp av en avskrivningskoefficient
111
+ AMORLINC = AMORLINC ## Returnerar avskrivningen för varje redovisningsperiod
112
+ COUPDAYBS = KUPDAGBB ## Returnerar antal dagar från början av kupongperioden till likviddagen
113
+ COUPDAYS = KUPDAGARS ## Returnerar antalet dagar i kupongperioden som innehåller betalningsdatumet
114
+ COUPDAYSNC = KUPDAGNK ## Returnerar antalet dagar från betalningsdatumet till nästa kupongdatum
115
+ COUPNCD = KUPNKD ## Returnerar nästa kupongdatum efter likviddagen
116
+ COUPNUM = KUPANT ## Returnerar kuponger som förfaller till betalning mellan likviddagen och förfallodagen
117
+ COUPPCD = KUPFKD ## Returnerar föregående kupongdatum före likviddagen
118
+ CUMIPMT = KUMRÄNTA ## Returnerar den ackumulerade räntan som betalats mellan två perioder
119
+ CUMPRINC = KUMPRIS ## Returnerar det ackumulerade kapitalbeloppet som betalats på ett lån mellan två perioder
120
+ DB = DB ## Returnerar avskrivningen för en tillgång under en angiven tid enligt metoden för fast degressiv avskrivning
121
+ DDB = DEGAVSKR ## Returnerar en tillgångs värdeminskning under en viss period med hjälp av dubbel degressiv avskrivning eller någon annan metod som du anger
122
+ DISC = DISK ## Returnerar diskonteringsräntan för ett värdepapper
123
+ DOLLARDE = DECTAL ## Omvandlar ett pris uttryckt som ett bråk till ett decimaltal
124
+ DOLLARFR = BRÅK ## Omvandlar ett pris i kronor uttryckt som ett decimaltal till ett bråk
125
+ DURATION = LÖPTID ## Returnerar den årliga löptiden för en säkerhet med periodiska räntebetalningar
126
+ EFFECT = EFFRÄNTA ## Returnerar den årliga effektiva räntesatsen
127
+ FV = SLUTVÄRDE ## Returnerar det framtida värdet på en investering
128
+ FVSCHEDULE = FÖRRÄNTNING ## Returnerar det framtida värdet av ett begynnelsekapital beräknat på olika räntenivåer
129
+ INTRATE = ÅRSRÄNTA ## Returnerar räntesatsen för ett betalt värdepapper
130
+ IPMT = RBETALNING ## Returnerar räntedelen av en betalning för en given period
131
+ IRR = IR ## Returnerar internräntan för en serie betalningar
132
+ ISPMT = RALÅN ## Beräknar räntan som har betalats under en specifik betalningsperiod
133
+ MDURATION = MLÖPTID ## Returnerar den modifierade Macauley-löptiden för ett värdepapper med det antagna nominella värdet 100 kr
134
+ MIRR = MODIR ## Returnerar internräntan där positiva och negativa betalningar finansieras med olika räntor
135
+ NOMINAL = NOMRÄNTA ## Returnerar den årliga nominella räntesatsen
136
+ NPER = PERIODER ## Returnerar antalet perioder för en investering
137
+ NPV = NETNUVÄRDE ## Returnerar nuvärdet av en serie periodiska betalningar vid en given diskonteringsränta
138
+ ODDFPRICE = UDDAFPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda första period
139
+ ODDFYIELD = UDDAFAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda första period
140
+ ODDLPRICE = UDDASPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda sista period
141
+ ODDLYIELD = UDDASAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda sista period
142
+ PMT = BETALNING ## Returnerar den periodiska betalningen för en annuitet
143
+ PPMT = AMORT ## Returnerar amorteringsdelen av en annuitetsbetalning för en given period
144
+ PRICE = PRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger periodisk ränta
145
+ PRICEDISC = PRISDISK ## Returnerar priset per 100 kr nominellt värde för ett diskonterat värdepapper
146
+ PRICEMAT = PRISFÖRF ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger ränta på förfallodagen
147
+ PV = PV ## Returnerar nuvärdet av en serie lika stora periodiska betalningar
148
+ RATE = RÄNTA ## Returnerar räntesatsen per period i en annuitet
149
+ RECEIVED = BELOPP ## Returnerar beloppet som utdelas på förfallodagen för ett betalat värdepapper
150
+ SLN = LINAVSKR ## Returnerar den linjära avskrivningen för en tillgång under en period
151
+ SYD = ÅRSAVSKR ## Returnerar den årliga avskrivningssumman för en tillgång under en angiven period
152
+ TBILLEQ = SSVXEKV ## Returnerar avkastningen motsvarande en obligation för en statsskuldväxel
153
+ TBILLPRICE = SSVXPRIS ## Returnerar priset per 100 kr nominellt värde för en statsskuldväxel
154
+ TBILLYIELD = SSVXRÄNTA ## Returnerar avkastningen för en statsskuldväxel
155
+ VDB = VDEGRAVSKR ## Returnerar avskrivningen för en tillgång under en angiven period (med degressiv avskrivning)
156
+ XIRR = XIRR ## Returnerar internräntan för en serie betalningar som inte nödvändigtvis är periodiska
157
+ XNPV = XNUVÄRDE ## Returnerar det nuvarande nettovärdet för en serie betalningar som inte nödvändigtvis är periodiska
158
+ YIELD = NOMAVK ## Returnerar avkastningen för ett värdepapper som ger periodisk ränta
159
+ YIELDDISC = NOMAVKDISK ## Returnerar den årliga avkastningen för diskonterade värdepapper, exempelvis en statsskuldväxel
160
+ YIELDMAT = NOMAVKFÖRF ## Returnerar den årliga avkastningen för ett värdepapper som ger ränta på förfallodagen
161
+
162
+
163
+ ##
164
+ ## Information functions Informationsfunktioner
165
+ ##
166
+ CELL = CELL ## Returnerar information om formatering, plats och innehåll i en cell
167
+ ERROR.TYPE = FEL.TYP ## Returnerar ett tal som motsvarar ett felvärde
168
+ INFO = INFO ## Returnerar information om operativsystemet
169
+ ISBLANK = ÄRREF ## Returnerar SANT om värdet är tomt
170
+ ISERR = Ä ## Returnerar SANT om värdet är ett felvärde annat än #SAKNAS!
171
+ ISERROR = ÄRFEL ## Returnerar SANT om värdet är ett felvärde
172
+ ISEVEN = ÄRJÄMN ## Returnerar SANT om talet är jämnt
173
+ ISLOGICAL = ÄREJTEXT ## Returnerar SANT om värdet är ett logiskt värde
174
+ ISNA = ÄRLOGISK ## Returnerar SANT om värdet är felvärdet #SAKNAS!
175
+ ISNONTEXT = ÄRSAKNAD ## Returnerar SANT om värdet inte är text
176
+ ISNUMBER = ÄRTAL ## Returnerar SANT om värdet är ett tal
177
+ ISODD = ÄRUDDA ## Returnerar SANT om talet är udda
178
+ ISREF = ÄRTOM ## Returnerar SANT om värdet är en referens
179
+ ISTEXT = ÄRTEXT ## Returnerar SANT om värdet är text
180
+ N = N ## Returnerar ett värde omvandlat till ett tal
181
+ NA = SAKNAS ## Returnerar felvärdet #SAKNAS!
182
+ TYPE = VÄRDETYP ## Returnerar ett tal som anger värdets datatyp
183
+
184
+
185
+ ##
186
+ ## Logical functions Logiska funktioner
187
+ ##
188
+ AND = OCH ## Returnerar SANT om alla argument är sanna
189
+ FALSE = FALSKT ## Returnerar det logiska värdet FALSKT
190
+ IF = OM ## Anger vilket logiskt test som ska utföras
191
+ IFERROR = OMFEL ## Returnerar ett värde som du anger om en formel utvärderar till ett fel; annars returneras resultatet av formeln
192
+ NOT = ICKE ## Inverterar logiken för argumenten
193
+ OR = ELLER ## Returnerar SANT om något argument är SANT
194
+ TRUE = SANT ## Returnerar det logiska värdet SANT
195
+
196
+
197
+ ##
198
+ ## Lookup and reference functions Sök- och referensfunktioner
199
+ ##
200
+ ADDRESS = ADRESS ## Returnerar en referens som text till en enstaka cell i ett kalkylblad
201
+ AREAS = OMRÅDEN ## Returnerar antalet områden i en referens
202
+ CHOOSE = VÄLJ ## Väljer ett värde i en lista över värden
203
+ COLUMN = KOLUMN ## Returnerar kolumnnumret för en referens
204
+ COLUMNS = KOLUMNER ## Returnerar antalet kolumner i en referens
205
+ HLOOKUP = LETAKOLUMN ## Söker i den översta raden i en matris och returnerar värdet för angiven cell
206
+ HYPERLINK = HYPERLÄNK ## Skapar en genväg eller ett hopp till ett dokument i nätverket, i ett intranät eller på Internet
207
+ INDEX = INDEX ## Använder ett index för ett välja ett värde i en referens eller matris
208
+ INDIRECT = INDIREKT ## Returnerar en referens som anges av ett textvärde
209
+ LOOKUP = LETAUPP ## Letar upp värden i en vektor eller matris
210
+ MATCH = PASSA ## Letar upp värden i en referens eller matris
211
+ OFFSET = FÖRSKJUTNING ## Returnerar en referens förskjuten i förhållande till en given referens
212
+ ROW = RAD ## Returnerar radnumret för en referens
213
+ ROWS = RADER ## Returnerar antalet rader i en referens
214
+ RTD = RTD ## Hämtar realtidsdata från ett program som stöder COM-automation (Automation: Ett sätt att arbeta med ett programs objekt från ett annat program eller utvecklingsverktyg. Detta kallades tidigare för OLE Automation, och är en branschstandard och ingår i Component Object Model (COM).)
215
+ TRANSPOSE = TRANSPONERA ## Transponerar en matris
216
+ VLOOKUP = LETARAD ## Letar i den första kolumnen i en matris och flyttar över raden för att returnera värdet för en cell
217
+
218
+
219
+ ##
220
+ ## Math and trigonometry functions Matematiska och trigonometriska funktioner
221
+ ##
222
+ ABS = ABS ## Returnerar absolutvärdet av ett tal
223
+ ACOS = ARCCOS ## Returnerar arcus cosinus för ett tal
224
+ ACOSH = ARCCOSH ## Returnerar inverterad hyperbolisk cosinus för ett tal
225
+ ASIN = ARCSIN ## Returnerar arcus cosinus för ett tal
226
+ ASINH = ARCSINH ## Returnerar hyperbolisk arcus sinus för ett tal
227
+ ATAN = ARCTAN ## Returnerar arcus tangens för ett tal
228
+ ATAN2 = ARCTAN2 ## Returnerar arcus tangens för en x- och en y- koordinat
229
+ ATANH = ARCTANH ## Returnerar hyperbolisk arcus tangens för ett tal
230
+ CEILING = RUNDA.UPP ## Avrundar ett tal till närmaste heltal eller närmaste signifikanta multipel
231
+ COMBIN = KOMBIN ## Returnerar antalet kombinationer för ett givet antal objekt
232
+ COS = COS ## Returnerar cosinus för ett tal
233
+ COSH = COSH ## Returnerar hyperboliskt cosinus för ett tal
234
+ DEGREES = GRADER ## Omvandlar radianer till grader
235
+ EVEN = JÄMN ## Avrundar ett tal uppåt till närmaste heltal
236
+ EXP = EXP ## Returnerar e upphöjt till ett givet tal
237
+ FACT = FAKULTET ## Returnerar fakulteten för ett tal
238
+ FACTDOUBLE = DUBBELFAKULTET ## Returnerar dubbelfakulteten för ett tal
239
+ FLOOR = RUNDA.NED ## Avrundar ett tal nedåt mot noll
240
+ GCD = SGD ## Returnerar den största gemensamma nämnaren
241
+ INT = HELTAL ## Avrundar ett tal nedåt till närmaste heltal
242
+ LCM = MGM ## Returnerar den minsta gemensamma multipeln
243
+ LN = LN ## Returnerar den naturliga logaritmen för ett tal
244
+ LOG = LOG ## Returnerar logaritmen för ett tal för en given bas
245
+ LOG10 = LOG10 ## Returnerar 10-logaritmen för ett tal
246
+ MDETERM = MDETERM ## Returnerar matrisen som är avgörandet av en matris
247
+ MINVERSE = MINVERT ## Returnerar matrisinversen av en matris
248
+ MMULT = MMULT ## Returnerar matrisprodukten av två matriser
249
+ MOD = REST ## Returnerar resten vid en division
250
+ MROUND = MAVRUNDA ## Returnerar ett tal avrundat till en given multipel
251
+ MULTINOMIAL = MULTINOMIAL ## Returnerar multinomialen för en uppsättning tal
252
+ ODD = UDDA ## Avrundar ett tal uppåt till närmaste udda heltal
253
+ PI = PI ## Returnerar värdet pi
254
+ POWER = UPPHÖJT.TILL ## Returnerar resultatet av ett tal upphöjt till en exponent
255
+ PRODUCT = PRODUKT ## Multiplicerar argumenten
256
+ QUOTIENT = KVOT ## Returnerar heltalsdelen av en division
257
+ RADIANS = RADIANER ## Omvandlar grader till radianer
258
+ RAND = SLUMP ## Returnerar ett slumptal mellan 0 och 1
259
+ RANDBETWEEN = SLUMP.MELLAN ## Returnerar ett slumptal mellan de tal som du anger
260
+ ROMAN = ROMERSK ## Omvandlar vanliga (arabiska) siffror till romerska som text
261
+ ROUND = AVRUNDA ## Avrundar ett tal till ett angivet antal siffror
262
+ ROUNDDOWN = AVRUNDA.NEDÅT ## Avrundar ett tal nedåt mot noll
263
+ ROUNDUP = AVRUNDA.UPPÅT ## Avrundar ett tal uppåt, från noll
264
+ SERIESSUM = SERIESUMMA ## Returnerar summan av en potensserie baserat på formeln
265
+ SIGN = TECKEN ## Returnerar tecknet för ett tal
266
+ SIN = SIN ## Returnerar sinus för en given vinkel
267
+ SINH = SINH ## Returnerar hyperbolisk sinus för ett tal
268
+ SQRT = ROT ## Returnerar den positiva kvadratroten
269
+ SQRTPI = ROTPI ## Returnerar kvadratroten för (tal * pi)
270
+ SUBTOTAL = DELSUMMA ## Returnerar en delsumma i en lista eller databas
271
+ SUM = SUMMA ## Summerar argumenten
272
+ SUMIF = SUMMA.OM ## Summerar celler enligt ett angivet villkor
273
+ SUMIFS = SUMMA.OMF ## Lägger till cellerna i ett område som uppfyller flera kriterier
274
+ SUMPRODUCT = PRODUKTSUMMA ## Returnerar summan av produkterna i motsvarande matriskomponenter
275
+ SUMSQ = KVADRATSUMMA ## Returnerar summan av argumentens kvadrater
276
+ SUMX2MY2 = SUMMAX2MY2 ## Returnerar summan av differensen mellan kvadraterna för motsvarande värden i två matriser
277
+ SUMX2PY2 = SUMMAX2PY2 ## Returnerar summan av summan av kvadraterna av motsvarande värden i två matriser
278
+ SUMXMY2 = SUMMAXMY2 ## Returnerar summan av kvadraten av skillnaden mellan motsvarande värden i två matriser
279
+ TAN = TAN ## Returnerar tangens för ett tal
280
+ TANH = TANH ## Returnerar hyperbolisk tangens för ett tal
281
+ TRUNC = AVKORTA ## Avkortar ett tal till ett heltal
282
+
283
+
284
+ ##
285
+ ## Statistical functions Statistiska funktioner
286
+ ##
287
+ AVEDEV = MEDELAVV ## Returnerar medelvärdet för datapunkters absoluta avvikelse från deras medelvärde
288
+ AVERAGE = MEDEL ## Returnerar medelvärdet av argumenten
289
+ AVERAGEA = AVERAGEA ## Returnerar medelvärdet av argumenten, inklusive tal, text och logiska värden
290
+ AVERAGEIF = MEDELOM ## Returnerar medelvärdet (aritmetiskt medelvärde) för alla celler i ett område som uppfyller ett givet kriterium
291
+ AVERAGEIFS = MEDELOMF ## Returnerar medelvärdet (det aritmetiska medelvärdet) för alla celler som uppfyller flera villkor.
292
+ BETADIST = BETAFÖRD ## Returnerar den kumulativa betafördelningsfunktionen
293
+ BETAINV = BETAINV ## Returnerar inversen till den kumulativa fördelningsfunktionen för en viss betafördelning
294
+ BINOMDIST = BINOMFÖRD ## Returnerar den individuella binomialfördelningen
295
+ CHIDIST = CHI2FÖRD ## Returnerar den ensidiga sannolikheten av c2-fördelningen
296
+ CHIINV = CHI2INV ## Returnerar inversen av chi2-fördelningen
297
+ CHITEST = CHI2TEST ## Returnerar oberoendetesten
298
+ CONFIDENCE = KONFIDENS ## Returnerar konfidensintervallet för en populations medelvärde
299
+ CORREL = KORREL ## Returnerar korrelationskoefficienten mellan två datamängder
300
+ COUNT = ANTAL ## Räknar hur många tal som finns bland argumenten
301
+ COUNTA = ANTALV ## Räknar hur många värden som finns bland argumenten
302
+ COUNTBLANK = ANTAL.TOMMA ## Räknar antalet tomma celler i ett område
303
+ COUNTIF = ANTAL.OM ## Räknar antalet celler i ett område som uppfyller angivna villkor.
304
+ COUNTIFS = ANTAL.OMF ## Räknar antalet celler i ett område som uppfyller flera villkor.
305
+ COVAR = KOVAR ## Returnerar kovariansen, d.v.s. medelvärdet av produkterna för parade avvikelser
306
+ CRITBINOM = KRITBINOM ## Returnerar det minsta värdet för vilket den kumulativa binomialfördelningen är mindre än eller lika med ett villkorsvärde
307
+ DEVSQ = KVADAVV ## Returnerar summan av kvadrater på avvikelser
308
+ EXPONDIST = EXPONFÖRD ## Returnerar exponentialfördelningen
309
+ FDIST = FFÖRD ## Returnerar F-sannolikhetsfördelningen
310
+ FINV = FINV ## Returnerar inversen till F-sannolikhetsfördelningen
311
+ FISHER = FISHER ## Returnerar Fisher-transformationen
312
+ FISHERINV = FISHERINV ## Returnerar inversen till Fisher-transformationen
313
+ FORECAST = PREDIKTION ## Returnerar ett värde längs en linjär trendlinje
314
+ FREQUENCY = FREKVENS ## Returnerar en frekvensfördelning som en lodrät matris
315
+ FTEST = FTEST ## Returnerar resultatet av en F-test
316
+ GAMMADIST = GAMMAFÖRD ## Returnerar gammafördelningen
317
+ GAMMAINV = GAMMAINV ## Returnerar inversen till den kumulativa gammafördelningen
318
+ GAMMALN = GAMMALN ## Returnerar den naturliga logaritmen för gammafunktionen, G(x)
319
+ GEOMEAN = GEOMEDEL ## Returnerar det geometriska medelvärdet
320
+ GROWTH = EXPTREND ## Returnerar värden längs en exponentiell trend
321
+ HARMEAN = HARMMEDEL ## Returnerar det harmoniska medelvärdet
322
+ HYPGEOMDIST = HYPGEOMFÖRD ## Returnerar den hypergeometriska fördelningen
323
+ INTERCEPT = SKÄRNINGSPUNKT ## Returnerar skärningspunkten för en linjär regressionslinje
324
+ KURT = TOPPIGHET ## Returnerar toppigheten av en mängd data
325
+ LARGE = STÖRSTA ## Returnerar det n:te största värdet i en mängd data
326
+ LINEST = REGR ## Returnerar parametrar till en linjär trendlinje
327
+ LOGEST = EXPREGR ## Returnerar parametrarna i en exponentiell trend
328
+ LOGINV = LOGINV ## Returnerar inversen till den lognormala fördelningen
329
+ LOGNORMDIST = LOGNORMFÖRD ## Returnerar den kumulativa lognormala fördelningen
330
+ MAX = MAX ## Returnerar det största värdet i en lista av argument
331
+ MAXA = MAXA ## Returnerar det största värdet i en lista av argument, inklusive tal, text och logiska värden
332
+ MEDIAN = MEDIAN ## Returnerar medianen för angivna tal
333
+ MIN = MIN ## Returnerar det minsta värdet i en lista med argument
334
+ MINA = MINA ## Returnerar det minsta värdet i en lista över argument, inklusive tal, text och logiska värden
335
+ MODE = TYPVÄRDE ## Returnerar det vanligaste värdet i en datamängd
336
+ NEGBINOMDIST = NEGBINOMFÖRD ## Returnerar den negativa binomialfördelningen
337
+ NORMDIST = NORMFÖRD ## Returnerar den kumulativa normalfördelningen
338
+ NORMINV = NORMINV ## Returnerar inversen till den kumulativa normalfördelningen
339
+ NORMSDIST = NORMSFÖRD ## Returnerar den kumulativa standardnormalfördelningen
340
+ NORMSINV = NORMSINV ## Returnerar inversen till den kumulativa standardnormalfördelningen
341
+ PEARSON = PEARSON ## Returnerar korrelationskoefficienten till Pearsons momentprodukt
342
+ PERCENTILE = PERCENTIL ## Returnerar den n:te percentilen av värden i ett område
343
+ PERCENTRANK = PROCENTRANG ## Returnerar procentrangen för ett värde i en datamängd
344
+ PERMUT = PERMUT ## Returnerar antal permutationer för ett givet antal objekt
345
+ POISSON = POISSON ## Returnerar Poisson-fördelningen
346
+ PROB = SANNOLIKHET ## Returnerar sannolikheten att värden i ett område ligger mellan två gränser
347
+ QUARTILE = KVARTIL ## Returnerar kvartilen av en mängd data
348
+ RANK = RANG ## Returnerar rangordningen för ett tal i en lista med tal
349
+ RSQ = RKV ## Returnerar kvadraten av Pearsons produktmomentkorrelationskoefficient
350
+ SKEW = SNEDHET ## Returnerar snedheten för en fördelning
351
+ SLOPE = LUTNING ## Returnerar lutningen på en linjär regressionslinje
352
+ SMALL = MINSTA ## Returnerar det n:te minsta värdet i en mängd data
353
+ STANDARDIZE = STANDARDISERA ## Returnerar ett normaliserat värde
354
+ STDEV = STDAV ## Uppskattar standardavvikelsen baserat på ett urval
355
+ STDEVA = STDEVA ## Uppskattar standardavvikelsen baserat på ett urval, inklusive tal, text och logiska värden
356
+ STDEVP = STDAVP ## Beräknar standardavvikelsen baserat på hela populationen
357
+ STDEVPA = STDEVPA ## Beräknar standardavvikelsen baserat på hela populationen, inklusive tal, text och logiska värden
358
+ STEYX = STDFELYX ## Returnerar standardfelet för ett förutspått y-värde för varje x-värde i regressionen
359
+ TDIST = TFÖRD ## Returnerar Students t-fördelning
360
+ TINV = TINV ## Returnerar inversen till Students t-fördelning
361
+ TREND = TREND ## Returnerar värden längs en linjär trend
362
+ TRIMMEAN = TRIMMEDEL ## Returnerar medelvärdet av mittpunkterna i en datamängd
363
+ TTEST = TTEST ## Returnerar sannolikheten beräknad ur Students t-test
364
+ VAR = VARIANS ## Uppskattar variansen baserat på ett urval
365
+ VARA = VARA ## Uppskattar variansen baserat på ett urval, inklusive tal, text och logiska värden
366
+ VARP = VARIANSP ## Beräknar variansen baserat på hela populationen
367
+ VARPA = VARPA ## Beräknar variansen baserat på hela populationen, inklusive tal, text och logiska värden
368
+ WEIBULL = WEIBULL ## Returnerar Weibull-fördelningen
369
+ ZTEST = ZTEST ## Returnerar det ensidiga sannolikhetsvärdet av ett z-test
370
+
371
+
372
+ ##
373
+ ## Text functions Textfunktioner
374
+ ##
375
+ ASC = ASC ## Ändrar helbredds (dubbel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med halvt breddsteg (enkel byte)
376
+ BAHTTEXT = BAHTTEXT ## Omvandlar ett tal till text med valutaformatet ß (baht)
377
+ CHAR = TECKENKOD ## Returnerar tecknet som anges av kod
378
+ CLEAN = STÄDA ## Tar bort alla icke utskrivbara tecken i en text
379
+ CODE = KOD ## Returnerar en numerisk kod för det första tecknet i en textsträng
380
+ CONCATENATE = SAMMANFOGA ## Sammanfogar flera textdelar till en textsträng
381
+ DOLLAR = VALUTA ## Omvandlar ett tal till text med valutaformat
382
+ EXACT = EXAKT ## Kontrollerar om två textvärden är identiska
383
+ FIND = HITTA ## Hittar en text i en annan (skiljer på gemener och versaler)
384
+ FINDB = HITTAB ## Hittar en text i en annan (skiljer på gemener och versaler)
385
+ FIXED = FASTTAL ## Formaterar ett tal som text med ett fast antal decimaler
386
+ JIS = JIS ## Ändrar halvbredds (enkel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med helt breddsteg (dubbel byte)
387
+ LEFT = VÄNSTER ## Returnerar tecken längst till vänster i en sträng
388
+ LEFTB = VÄNSTERB ## Returnerar tecken längst till vänster i en sträng
389
+ LEN = LÄNGD ## Returnerar antalet tecken i en textsträng
390
+ LENB = LÄNGDB ## Returnerar antalet tecken i en textsträng
391
+ LOWER = GEMENER ## Omvandlar text till gemener
392
+ MID = EXTEXT ## Returnerar angivet antal tecken från en text med början vid den position som du anger
393
+ MIDB = EXTEXTB ## Returnerar angivet antal tecken från en text med början vid den position som du anger
394
+ PHONETIC = PHONETIC ## Returnerar de fonetiska (furigana) tecknen i en textsträng
395
+ PROPER = INITIAL ## Ändrar första bokstaven i varje ord i ett textvärde till versal
396
+ REPLACE = ERSÄTT ## Ersätter tecken i text
397
+ REPLACEB = ERSÄTTB ## Ersätter tecken i text
398
+ REPT = REP ## Upprepar en text ett bestämt antal gånger
399
+ RIGHT = HÖGER ## Returnerar tecken längst till höger i en sträng
400
+ RIGHTB = HÖGERB ## Returnerar tecken längst till höger i en sträng
401
+ SEARCH = SÖK ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler)
402
+ SEARCHB = SÖKB ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler)
403
+ SUBSTITUTE = BYT.UT ## Ersätter gammal text med ny text i en textsträng
404
+ T = T ## Omvandlar argumenten till text
405
+ TEXT = TEXT ## Formaterar ett tal och omvandlar det till text
406
+ TRIM = RENSA ## Tar bort blanksteg från text
407
+ UPPER = VERSALER ## Omvandlar text till versaler
408
+ VALUE = TEXTNUM ## Omvandlar ett textargument till ett tal
classes/api.php CHANGED
@@ -351,9 +351,8 @@ class PMXI_API
351
  public static function upload_image($pid, $img_url, $download_images, $logger, $create_image = false, $image_name = "", $file_type = 'images'){
352
 
353
  if (empty($img_url)) return false;
354
-
355
- $url = str_replace(" ", "%20", trim($img_url));
356
- $bn = wp_all_import_sanitize_filename(basename($url));
357
 
358
  if ($image_name == ""){
359
  $img_ext = pmxi_getExtensionFromStr($url);
@@ -374,7 +373,7 @@ class PMXI_API
374
 
375
  global $wpdb;
376
 
377
- $attch = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . $wpdb->posts . " WHERE (post_title = %s OR post_title = %s OR post_name = %s) AND post_type = %s AND post_mime_type LIKE %s;", $image_name, preg_replace('/\\.[^.\\s]{3,4}$/', '', $image_name), sanitize_title($image_name), "attachment", "image%" ) );
378
 
379
  if ( $attch != null ){
380
 
@@ -412,7 +411,7 @@ class PMXI_API
412
  }
413
  // validate import images
414
  elseif($file_type == 'images'){
415
- if( ! ($image_info = @getimagesize($image_filepath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
416
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $image_filepath));
417
  @unlink($image_filepath);
418
  } else {
@@ -439,7 +438,7 @@ class PMXI_API
439
  } else{
440
 
441
  if($file_type == 'images'){
442
- if( ($image_info = @getimagesize($image_filepath)) and in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
443
  $result = true;
444
  $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
445
  }
@@ -464,7 +463,7 @@ class PMXI_API
464
  } else{
465
 
466
  if($file_type == 'images'){
467
- if( ! ($image_info = @getimagesize($image_filepath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
468
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $url));
469
  @unlink($image_filepath);
470
  } else {
351
  public static function upload_image($pid, $img_url, $download_images, $logger, $create_image = false, $image_name = "", $file_type = 'images'){
352
 
353
  if (empty($img_url)) return false;
354
+
355
+ $bn = wp_all_import_sanitize_filename(urldecode(basename($img_url)));
 
356
 
357
  if ($image_name == ""){
358
  $img_ext = pmxi_getExtensionFromStr($url);
373
 
374
  global $wpdb;
375
 
376
+ $attch = wp_all_import_get_image_from_gallery($image_name, $targetDir, $file_type);
377
 
378
  if ( $attch != null ){
379
 
411
  }
412
  // validate import images
413
  elseif($file_type == 'images'){
414
+ if( ! ($image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
415
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $image_filepath));
416
  @unlink($image_filepath);
417
  } else {
438
  } else{
439
 
440
  if($file_type == 'images'){
441
+ if( ($image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath)) and in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
442
  $result = true;
443
  $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
444
  }
463
  } else{
464
 
465
  if($file_type == 'images'){
466
+ if( ! ($image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
467
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $url));
468
  @unlink($image_filepath);
469
  } else {
classes/arraytoxml.php CHANGED
@@ -39,6 +39,7 @@ class PMXI_ArrayToXML
39
  }
40
 
41
  // replace anything not alpha numeric
 
42
  $key = preg_replace('/[^a-z0-9_]/i', '', $key);
43
 
44
  // if there is another array found recrusively call this function
@@ -51,7 +52,7 @@ class PMXI_ArrayToXML
51
  else
52
  {
53
  // add single node.
54
- $value = htmlspecialchars($value);
55
  $xml->addChild($key, $value);
56
 
57
  }
39
  }
40
 
41
  // replace anything not alpha numeric
42
+ // preg_replace('/^[0-9]+/i', '', preg_replace('/[^a-z0-9_]/i', '', $key))
43
  $key = preg_replace('/[^a-z0-9_]/i', '', $key);
44
 
45
  // if there is another array found recrusively call this function
52
  else
53
  {
54
  // add single node.
55
+ $value = htmlspecialchars(preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $value));
56
  $xml->addChild($key, $value);
57
 
58
  }
classes/chunk.php CHANGED
@@ -88,7 +88,7 @@ class PMXI_Chunk {
88
  @fclose($f);
89
 
90
  if ($is_html)
91
- {
92
  $path = $this->get_file_path();
93
 
94
  $this->is_404 = true;
@@ -100,7 +100,8 @@ class PMXI_Chunk {
100
  }
101
 
102
  if (empty($this->options['element']) or $this->options['get_cloud'])
103
- {
 
104
  $path = $this->get_file_path();
105
 
106
  $reader = new XMLReader();
@@ -142,7 +143,7 @@ class PMXI_Chunk {
142
  }
143
  }
144
  }
145
- }
146
 
147
  $path = $this->get_file_path();
148
 
@@ -154,7 +155,8 @@ class PMXI_Chunk {
154
 
155
  function get_file_path()
156
  {
157
- if ( function_exists('stream_filter_register') and $this->options['filter'] )
 
158
  {
159
  stream_filter_register('preprocessxml', 'preprocessXml_filter');
160
  if (defined('HHVM_VERSION'))
@@ -278,8 +280,8 @@ class preprocessXml_filter extends php_user_filter {
278
  {
279
  // the & symbol is not valid in XML, so replace it with temporary word _ampersand_
280
  $bucket->data = str_replace("&", "_ampersand_", $bucket->data);
281
- }
282
- $bucket->data = $this->replace_colons($bucket->data);
283
  $consumed += $bucket->datalen;
284
  stream_bucket_append($out, $bucket);
285
  }
88
  @fclose($f);
89
 
90
  if ($is_html)
91
+ {
92
  $path = $this->get_file_path();
93
 
94
  $this->is_404 = true;
100
  }
101
 
102
  if (empty($this->options['element']) or $this->options['get_cloud'])
103
+ {
104
+
105
  $path = $this->get_file_path();
106
 
107
  $reader = new XMLReader();
143
  }
144
  }
145
  }
146
+ }
147
 
148
  $path = $this->get_file_path();
149
 
155
 
156
  function get_file_path()
157
  {
158
+ $is_enabled_stream_filter = apply_filters('wp_all_import_is_enabled_stream_filter', true);
159
+ if ( function_exists('stream_filter_register') and $this->options['filter'] and $is_enabled_stream_filter )
160
  {
161
  stream_filter_register('preprocessxml', 'preprocessXml_filter');
162
  if (defined('HHVM_VERSION'))
280
  {
281
  // the & symbol is not valid in XML, so replace it with temporary word _ampersand_
282
  $bucket->data = str_replace("&", "_ampersand_", $bucket->data);
283
+ $bucket->data = preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $this->replace_colons($bucket->data));
284
+ }
285
  $consumed += $bucket->datalen;
286
  stream_bucket_append($out, $bucket);
287
  }
classes/config.php CHANGED
@@ -40,7 +40,10 @@ class PMXI_Config implements IteratorAggregate {
40
  $filePath = realpath($filePath);
41
  if ($filePath and ! in_array($filePath, $this->loaded)) {
42
  require $filePath;
43
-
 
 
 
44
  $sandbox = create_function('', "require '$filePath'; if(array_keys(get_defined_vars()) != array('config')) return array(); return \$config;");
45
  $config = $sandbox();
46
  $this->loaded[] = $filePath;
40
  $filePath = realpath($filePath);
41
  if ($filePath and ! in_array($filePath, $this->loaded)) {
42
  require $filePath;
43
+ //handle unc paths for the anonymous function
44
+ if(substr($filePath, 0, 2) == "\\\\"){
45
+ $filePath = str_replace('\\','\\\\',$filePath);
46
+ }
47
  $sandbox = create_function('', "require '$filePath'; if(array_keys(get_defined_vars()) != array('config')) return array(); return \$config;");
48
  $config = $sandbox();
49
  $this->loaded[] = $filePath;
classes/upload.php CHANGED
@@ -8,7 +8,7 @@ if ( ! class_exists('PMXI_Upload')){
8
  protected $root_element = '';
9
  protected $is_csv = false;
10
 
11
- protected $uploadsPath;
12
 
13
  function __construct( $file, $errors, $targetDir = false ){
14
 
@@ -40,7 +40,11 @@ if ( ! class_exists('PMXI_Upload')){
40
 
41
  $this->file = wp_all_import_get_absolute_path($this->file);
42
 
43
- $template = false;
 
 
 
 
44
 
45
  if (empty($this->file)) {
46
  $this->errors->add('form-validation', __('Please specify a file to import.<br/><br/>If you are uploading the file from your computer, please wait for it to finish uploading (progress bar at 100%), before trying to continue.', 'wp_all_import_plugin'));
@@ -58,38 +62,68 @@ if ( ! class_exists('PMXI_Upload')){
58
  }
59
  else {
60
 
61
- $filePath = '';
 
 
62
 
63
- if (!empty($v_result_list)){
64
- foreach ($v_result_list as $unzipped_file) {
65
- if ($unzipped_file['status'] == 'ok' and preg_match('%\W(xml|csv|txt|dat|psv|json|xls|xlsx)$%i', trim($unzipped_file['stored_filename'])) and strpos($unzipped_file['stored_filename'], 'readme.txt') === false ) {
 
 
 
66
  if ( strpos(basename($unzipped_file['stored_filename']), 'WP All Import Template') === 0 || strpos(basename($unzipped_file['stored_filename']), 'templates_') === 0 )
67
  {
68
- $template = file_get_contents($unzipped_file['filename']);
69
 
70
- $templateOptions = json_decode($template, true);
 
 
71
 
72
  if ( ! empty($templateOptions) and isset($templateOptions[0]['_import_type']) and $templateOptions[0]['_import_type'] == 'url' )
73
  {
74
-
75
  $options = maybe_unserialize($templateOptions[0]['options']);
76
 
77
  return array(
78
  'filePath' => $templateOptions[0]['_import_url'],
79
- 'template' => $template,
 
 
80
  'post_type' => (!empty($options)) ? $options['custom_type'] : false,
81
  'is_empty_bundle_file' => true
82
  );
83
  }
84
-
85
  }
86
- elseif ($filePath == '')
87
- {
88
- $filePath = $unzipped_file['filename'];
 
 
 
 
 
 
 
 
89
  }
90
  }
91
  }
92
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  if ( $this->uploadsPath === false ){
94
  $this->errors->add('form-validation', __('WP All Import can\'t access your WordPress uploads folder.', 'wp_all_import_plugin'));
95
  }
@@ -122,61 +156,10 @@ if ( ! class_exists('PMXI_Upload')){
122
  'path' => $this->file,
123
  );
124
 
125
- if (preg_match('%\W(csv|txt|dat|psv)$%i', trim($filePath))){ // If CSV file found in archieve
126
-
127
- if($this->uploadsPath === false){
128
- $this->errors->add('form-validation', __('WP All Import can\'t access your WordPress uploads folder.', 'wp_all_import_plugin'));
129
- }
130
-
131
- include_once(PMXI_Plugin::ROOT_DIR.'/libraries/XmlImportCsvParse.php');
132
- $csv = new PMXI_CsvParser( array( 'filename' => $filePath, 'targetDir' => $this->uploadsPath ) ); // create chunks
133
- //wp_all_import_remove_source($filePath, false);
134
- $filePath = $csv->xml_path;
135
- $this->is_csv = $csv->is_csv;
136
- $this->root_element = 'node';
137
-
138
- } elseif (preg_match('%\W(json)$%i', trim($filePath))){
139
-
140
- $json_str = file_get_contents($filePath);
141
- $is_json = wp_all_import_is_json($json_str);
142
-
143
- if( is_wp_error($is_json)){
144
- $this->errors->add('form-validation', $is_json->get_error_message(), 'wp_all_import_plugin');
145
- }
146
- else{
147
-
148
- $xml_data = wp_all_import_json_to_xml( json_decode($json_str, true) );
149
-
150
- if ( empty($xml_data) ){
151
- $this->errors->add('form-validation', __('Can not import this file. JSON to XML convertation failed.', 'wp_all_import_plugin'));
152
- }
153
- else{
154
- $jsontmpname = $this->uploadsPath .'/'. wp_all_import_url_title(wp_unique_filename($this->uploadsPath, str_replace("json", "xml", basename($filePath))));
155
- file_put_contents($jsontmpname, $xml_data);
156
- wp_all_import_remove_source($filePath, false);
157
- $filePath = $jsontmpname;
158
- }
159
- }
160
-
161
- } elseif (preg_match('%\W(sql)$%i', trim($filePath))){
162
-
163
- include_once( PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportSQLParse.php' );
164
-
165
- $localSQLPath = $filePath;
166
- $sql = new PMXI_SQLParser( $localSQLPath, $this->uploadsPath );
167
- $filePath = $sql->parse();
168
- wp_all_import_remove_source($localSQLPath, false);
169
- }
170
- elseif (preg_match('%\W(xls|xlsx)$%i', trim($filePath))){
171
 
172
- include_once( PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportXLSParse.php' );
173
-
174
- $localXLSPath = $filePath;
175
- $xls = new PMXI_XLSParser( $localXLSPath, $this->uploadsPath );
176
- $filePath = $xls->parse();
177
- wp_all_import_remove_source($localXLSPath, false);
178
-
179
- }
180
  }
181
 
182
  } elseif ( preg_match('%\W(csv|txt|dat|psv)$%i', trim($this->file))) { // If CSV file uploaded
@@ -288,8 +271,7 @@ if ( ! class_exists('PMXI_Upload')){
288
  $filePath = $xls->parse();
289
 
290
  } else { // If XML file uploaded
291
-
292
- // Detect if file is very large
293
  $filePath = $this->file;
294
  $source = array(
295
  'name' => basename($this->file),
@@ -301,20 +283,99 @@ if ( ! class_exists('PMXI_Upload')){
301
 
302
  if ( $this->errors->get_error_codes() ) return $this->errors;
303
 
304
- $templateOptions = json_decode($template, true);
305
 
306
  $source['path'] = wp_all_import_get_relative_path($source['path']);
 
 
307
 
308
- $options = maybe_unserialize($templateOptions[0]['options']);
 
 
 
 
 
 
 
309
 
310
  return array(
311
- 'filePath' => $filePath,
312
- 'source' => $source,
 
313
  'root_element' => $this->root_element,
314
- 'is_csv' => $this->is_csv,
315
- 'template' => $template,
 
316
  'post_type' => (!empty($options)) ? $options['custom_type'] : false
317
  );
318
- }
319
- }
320
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  protected $root_element = '';
9
  protected $is_csv = false;
10
 
11
+ protected $uploadsPath;
12
 
13
  function __construct( $file, $errors, $targetDir = false ){
14
 
40
 
41
  $this->file = wp_all_import_get_absolute_path($this->file);
42
 
43
+ $templates = false;
44
+
45
+ $bundle = array();
46
+
47
+ $bundleFiles = array();
48
 
49
  if (empty($this->file)) {
50
  $this->errors->add('form-validation', __('Please specify a file to import.<br/><br/>If you are uploading the file from your computer, please wait for it to finish uploading (progress bar at 100%), before trying to continue.', 'wp_all_import_plugin'));
62
  }
63
  else {
64
 
65
+ $filePath = '';
66
+
67
+ $decodedTemplates = array();
68
 
69
+ if ( ! empty($v_result_list) )
70
+ {
71
+ foreach ($v_result_list as $unzipped_file)
72
+ {
73
+ if ($unzipped_file['status'] == 'ok' and preg_match('%\W(xml|csv|txt|dat|psv|json|xls|xlsx)$%i', trim($unzipped_file['stored_filename'])) and strpos($unzipped_file['stored_filename'], 'readme.txt') === false )
74
+ {
75
  if ( strpos(basename($unzipped_file['stored_filename']), 'WP All Import Template') === 0 || strpos(basename($unzipped_file['stored_filename']), 'templates_') === 0 )
76
  {
77
+ $templates = file_get_contents($unzipped_file['filename']);
78
 
79
+ $decodedTemplates = json_decode($templates, true);
80
+
81
+ $templateOptions = empty($decodedTemplates[0]) ? current($decodedTemplates) : $decodedTemplates;
82
 
83
  if ( ! empty($templateOptions) and isset($templateOptions[0]['_import_type']) and $templateOptions[0]['_import_type'] == 'url' )
84
  {
 
85
  $options = maybe_unserialize($templateOptions[0]['options']);
86
 
87
  return array(
88
  'filePath' => $templateOptions[0]['_import_url'],
89
+ 'bundle' => $bundle,
90
+ 'template' => json_encode($templateOptions),
91
+ 'templates' => $templates,
92
  'post_type' => (!empty($options)) ? $options['custom_type'] : false,
93
  'is_empty_bundle_file' => true
94
  );
95
  }
 
96
  }
97
+ else
98
+ {
99
+ if ($filePath == '')
100
+ {
101
+ $filePath = $unzipped_file['filename'];
102
+ }
103
+
104
+ if ( ! in_array($unzipped_file['filename'], $bundleFiles) )
105
+ {
106
+ $bundleFiles[basename($unzipped_file['filename'])] = $unzipped_file['filename'];
107
+ }
108
  }
109
  }
110
  }
111
  }
112
+
113
+ if (count($bundleFiles) > 1)
114
+ {
115
+ if ( ! empty($decodedTemplates) )
116
+ {
117
+ foreach ($decodedTemplates as $cpt => $tpl)
118
+ {
119
+ $fileFormats = $this->get_xml_file( $bundleFiles[basename($tpl[0]['source_file_name'])] );
120
+ $bundle[$cpt] = $fileFormats['xml'];
121
+ }
122
+ }
123
+
124
+ if ( ! empty($bundle)) $filePath = current($bundle);
125
+ }
126
+
127
  if ( $this->uploadsPath === false ){
128
  $this->errors->add('form-validation', __('WP All Import can\'t access your WordPress uploads folder.', 'wp_all_import_plugin'));
129
  }
156
  'path' => $this->file,
157
  );
158
 
159
+ $fileFormats = $this->get_xml_file( $filePath );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160
 
161
+ $filePath = $fileFormats['xml'];
162
+
 
 
 
 
 
 
163
  }
164
 
165
  } elseif ( preg_match('%\W(csv|txt|dat|psv)$%i', trim($this->file))) { // If CSV file uploaded
271
  $filePath = $xls->parse();
272
 
273
  } else { // If XML file uploaded
274
+
 
275
  $filePath = $this->file;
276
  $source = array(
277
  'name' => basename($this->file),
283
 
284
  if ( $this->errors->get_error_codes() ) return $this->errors;
285
 
286
+ $decodedTemplates = empty($templates) ? false : json_decode($templates, true);
287
 
288
  $source['path'] = wp_all_import_get_relative_path($source['path']);
289
+
290
+ $templateOptions = "";
291
 
292
+ if ( is_array($decodedTemplates) )
293
+ {
294
+ $templateOptions = empty($decodedTemplates[0]) ? current($decodedTemplates) : $decodedTemplates;
295
+ }
296
+
297
+ $options = (empty($templateOptions[0]['options'])) ? false : maybe_unserialize($templateOptions[0]['options']);
298
+
299
+ if ( ! empty($options['root_element'])) $this->root_element = $options['root_element'];
300
 
301
  return array(
302
+ 'filePath' => $filePath,
303
+ 'bundle' => $bundle, // sub imports [cpt => filepath]
304
+ 'source' => $source,
305
  'root_element' => $this->root_element,
306
+ 'is_csv' => $this->is_csv,
307
+ 'template' => empty($templateOptions) ? "" : json_encode($templateOptions),
308
+ 'templates' => $templates,
309
  'post_type' => (!empty($options)) ? $options['custom_type'] : false
310
  );
311
+ }
312
+
313
+ protected function get_xml_file( $filePath )
314
+ {
315
+ $csv_path = '';
316
+
317
+ if (preg_match('%\W(csv|txt|dat|psv)$%i', trim($filePath))){ // If CSV file found in archieve
318
+
319
+ if($this->uploadsPath === false){
320
+ $this->errors->add('form-validation', __('WP All Import can\'t access your WordPress uploads folder.', 'wp_all_import_plugin'));
321
+ }
322
+
323
+ include_once(PMXI_Plugin::ROOT_DIR.'/libraries/XmlImportCsvParse.php');
324
+ $csv = new PMXI_CsvParser( array( 'filename' => $filePath, 'targetDir' => $this->uploadsPath ) ); // create chunks
325
+
326
+ $csv_path = $filePath;
327
+
328
+ $filePath = $csv->xml_path;
329
+ $this->is_csv = $csv->is_csv;
330
+ $this->root_element = 'node';
331
+
332
+ } elseif (preg_match('%\W(json)$%i', trim($filePath))){
333
+
334
+ $json_str = file_get_contents($filePath);
335
+ $is_json = wp_all_import_is_json($json_str);
336
+
337
+ if( is_wp_error($is_json)){
338
+ $this->errors->add('form-validation', $is_json->get_error_message(), 'wp_all_import_plugin');
339
+ }
340
+ else{
341
+
342
+ $xml_data = wp_all_import_json_to_xml( json_decode($json_str, true) );
343
+
344
+ if ( empty($xml_data) ){
345
+ $this->errors->add('form-validation', __('Can not import this file. JSON to XML convertation failed.', 'wp_all_import_plugin'));
346
+ }
347
+ else{
348
+ $jsontmpname = $this->uploadsPath .'/'. wp_all_import_url_title(wp_unique_filename($this->uploadsPath, str_replace("json", "xml", basename($filePath))));
349
+ file_put_contents($jsontmpname, $xml_data);
350
+ wp_all_import_remove_source($filePath, false);
351
+ $filePath = $jsontmpname;
352
+ }
353
+ }
354
+
355
+ } elseif (preg_match('%\W(sql)$%i', trim($filePath))){
356
+
357
+ include_once( PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportSQLParse.php' );
358
+
359
+ $localSQLPath = $filePath;
360
+ $sql = new PMXI_SQLParser( $localSQLPath, $this->uploadsPath );
361
+ $filePath = $sql->parse();
362
+ wp_all_import_remove_source($localSQLPath, false);
363
+ }
364
+ elseif (preg_match('%\W(xls|xlsx)$%i', trim($filePath))){
365
+
366
+ include_once( PMXI_Plugin::ROOT_DIR . '/libraries/XmlImportXLSParse.php' );
367
+
368
+ $localXLSPath = $filePath;
369
+ $xls = new PMXI_XLSParser( $localXLSPath, $this->uploadsPath );
370
+ $filePath = $xls->parse();
371
+ wp_all_import_remove_source($localXLSPath, false);
372
+
373
+ }
374
+
375
+ return array(
376
+ 'csv' => $csv_path,
377
+ 'xml' => $filePath
378
+ );
379
+ }
380
+ }
381
+ }
controllers/admin/import.php CHANGED
@@ -245,7 +245,7 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
245
  $this->errors->add('form-validation', __('Certain columns are required to be present in your file to enable it to be re-imported with WP All Import. These columns are missing. Re-export your file using WP All Export, and don\'t delete any of the columns when editing it. Then, re-import will work correctly.', 'wp_all_import_plugin'));
246
  }
247
  elseif($importRecord->options['custom_type'] == 'import_users' && ! class_exists('PMUI_Plugin')){
248
- $this->errors->add('form-validation', __('The import template you are using requires User Import Add-On.<br/><a href="http://www.wpallimport.com/add-ons/user-import/?utm_source=wordpress.org&utm_medium=wpai-import-template&utm_campaign=free+wp+all+export+plugin" target="_blank">Purchase the User Import Add-On</a>', 'wp_all_import_plugin'));
249
  }
250
 
251
  break;
@@ -2358,6 +2358,9 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
2358
 
2359
  wp_cache_flush();
2360
 
 
 
 
2361
  if ( PMXI_Plugin::is_ajax() or ! $ajax_processing ) {
2362
 
2363
  $functions = $wp_uploads['basedir'] . DIRECTORY_SEPARATOR . WP_ALL_IMPORT_UPLOADS_BASE_DIRECTORY . DIRECTORY_SEPARATOR . 'functions.php';
@@ -2573,8 +2576,7 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
2573
  }
2574
 
2575
  if ( ( PMXI_Plugin::is_ajax() and empty(PMXI_Plugin::$session->local_paths) ) or ! $ajax_processing or ! empty($import->canceled) ) {
2576
-
2577
- $import->delete_source( $logger );
2578
  $import->set(array(
2579
  'processing' => 0, // unlock cron requests
2580
  'triggered' => 0,
@@ -2604,7 +2606,10 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
2604
  $import->set(array(
2605
  'registered_on' => date('Y-m-d H:i:s'),
2606
  'executing' => 0
2607
- ))->update();
 
 
 
2608
 
2609
  // add history log
2610
  $custom_type = get_post_type_object( $import->options['custom_type'] );
@@ -2623,6 +2628,7 @@ class PMXI_Admin_Import extends PMXI_Controller_Admin {
2623
 
2624
  do_action( 'pmxi_after_xml_import', $import->id );
2625
 
 
2626
  $import->options['is_import_specified'] and $logger and call_user_func($logger, 'Done');
2627
 
2628
  echo <<<COMPLETE
245
  $this->errors->add('form-validation', __('Certain columns are required to be present in your file to enable it to be re-imported with WP All Import. These columns are missing. Re-export your file using WP All Export, and don\'t delete any of the columns when editing it. Then, re-import will work correctly.', 'wp_all_import_plugin'));
246
  }
247
  elseif($importRecord->options['custom_type'] == 'import_users' && ! class_exists('PMUI_Plugin')){
248
+ $this->errors->add('form-validation', __('The import template you are using requires the User Import Add-On.<br/><a href="http://www.wpallimport.com/add-ons/user-import/?utm_source=wordpress.org&utm_medium=wpai-import-template&utm_campaign=free+wp+all+export+plugin" target="_blank">Purchase the User Import Add-On</a>', 'wp_all_import_plugin'));
249
  }
250
 
251
  break;
2358
 
2359
  wp_cache_flush();
2360
 
2361
+ wp_defer_term_counting(true);
2362
+ wp_defer_comment_counting(true);
2363
+
2364
  if ( PMXI_Plugin::is_ajax() or ! $ajax_processing ) {
2365
 
2366
  $functions = $wp_uploads['basedir'] . DIRECTORY_SEPARATOR . WP_ALL_IMPORT_UPLOADS_BASE_DIRECTORY . DIRECTORY_SEPARATOR . 'functions.php';
2576
  }
2577
 
2578
  if ( ( PMXI_Plugin::is_ajax() and empty(PMXI_Plugin::$session->local_paths) ) or ! $ajax_processing or ! empty($import->canceled) ) {
2579
+
 
2580
  $import->set(array(
2581
  'processing' => 0, // unlock cron requests
2582
  'triggered' => 0,
2606
  $import->set(array(
2607
  'registered_on' => date('Y-m-d H:i:s'),
2608
  'executing' => 0
2609
+ ))->update();
2610
+
2611
+ wp_defer_term_counting(false);
2612
+ wp_defer_comment_counting(false);
2613
 
2614
  // add history log
2615
  $custom_type = get_post_type_object( $import->options['custom_type'] );
2628
 
2629
  do_action( 'pmxi_after_xml_import', $import->id );
2630
 
2631
+ $import->delete_source( $logger );
2632
  $import->options['is_import_specified'] and $logger and call_user_func($logger, 'Done');
2633
 
2634
  echo <<<COMPLETE
controllers/admin/manage.php CHANGED
@@ -208,6 +208,10 @@ class PMXI_Admin_Manage extends PMXI_Controller_Admin {
208
  @mkdir($bundle_dir);
209
 
210
  $tpl_name = empty($import->friendly_name) ? $import->name : $import->friendly_name;
 
 
 
 
211
  $tpl_data = array(
212
  'name' => $tpl_name,
213
  'is_keep_linebreaks' => 0,
208
  @mkdir($bundle_dir);
209
 
210
  $tpl_name = empty($import->friendly_name) ? $import->name : $import->friendly_name;
211
+ if (empty($tpl_name))
212
+ {
213
+ $tpl_name = 'Import_' . $import->id;
214
+ }
215
  $tpl_data = array(
216
  'name' => $tpl_name,
217
  'is_keep_linebreaks' => 0,
controllers/admin/settings.php CHANGED
@@ -558,6 +558,8 @@ class PMXI_Admin_Settings extends PMXI_Controller_Admin {
558
 
559
  $post_type = false;
560
 
 
 
561
  // Check if file has been uploaded
562
  if (!$chunks || $chunk == $chunks - 1) {
563
  // Strip the temp .part suffix off
@@ -585,14 +587,52 @@ class PMXI_Admin_Settings extends PMXI_Controller_Admin {
585
  exit(json_encode(array("jsonrpc" => "2.0", "error" => array("code" => 102, "message" => $response), "id" => "id")));
586
  }
587
  else
588
- {
589
-
590
- if ( ! empty($upload_result['post_type'])) $post_type = $upload_result['post_type'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
591
 
592
  if ( ! empty($upload_result['is_empty_bundle_file']))
593
- {
594
  // Return JSON-RPC response
595
- exit(json_encode(array("jsonrpc" => "2.0", "error" => null, "result" => null, "id" => "id", "name" => $upload_result['filePath'], "post_type" => $post_type, "template" => $upload_result['template'], "url_bundle" => true)));
596
  }
597
  else
598
  {
@@ -671,7 +711,7 @@ class PMXI_Admin_Settings extends PMXI_Controller_Admin {
671
  }
672
 
673
  // Return JSON-RPC response
674
- exit(json_encode(array("jsonrpc" => "2.0", "error" => null, "result" => null, "id" => "id", "name" => $filePath, "post_type" => $post_type)));
675
 
676
  }
677
 
558
 
559
  $post_type = false;
560
 
561
+ $notice = false;
562
+
563
  // Check if file has been uploaded
564
  if (!$chunks || $chunk == $chunks - 1) {
565
  // Strip the temp .part suffix off
587
  exit(json_encode(array("jsonrpc" => "2.0", "error" => array("code" => 102, "message" => $response), "id" => "id")));
588
  }
589
  else
590
+ {
591
+ if ( ! empty($upload_result['post_type']))
592
+ {
593
+ $post_type = $upload_result['post_type'];
594
+
595
+ switch ( $post_type ) {
596
+
597
+ case 'product':
598
+
599
+ if ( ! class_exists('WooCommerce') ) {
600
+ $notice = __('<p class="wpallimport-bundle-notice">The import bundle you are using requires WooCommerce.</p><a class="upgrade_link" href="https://wordpress.org/plugins/woocommerce/" target="_blank">Get WooCommerce</a>.', 'wp_all_import_plugin');
601
+ }
602
+ else {
603
+
604
+ if ( ! defined('PMWI_EDITION') ) {
605
+
606
+ $notice = __('<p class="wpallimport-bundle-notice">The import bundle you are using requires the Pro version of the WooCommerce Add-On.</p><a href="http://www.wpallimport.com/checkout/?edd_action=add_to_cart&download_id=1529&edd_options%5Bprice_id%5D=1" class="upgrade_link" target="_blank">Purchase the WooCommerce Add-On</a>.', 'wp_all_import_plugin');
607
+
608
+ }
609
+ elseif ( PMWI_EDITION != 'paid' ) {
610
+
611
+ $notice = __('<p class="wpallimport-bundle-notice">The import bundle you are using requires the Pro version of the WooCommerce Add-On, but you have the free version installed.</p><a href="http://www.wpallimport.com/checkout/?edd_action=add_to_cart&download_id=1529&edd_options%5Bprice_id%5D=1" target="_blank" class="upgrade_link">Purchase the WooCommerce Add-On</a>.', 'wp_all_import_plugin');
612
+
613
+ }
614
+ }
615
+
616
+ break;
617
+
618
+ case 'import_users':
619
+
620
+ if ( ! class_exists('PMUI_Plugin') ) {
621
+ $notice = __('<p class="wpallimport-bundle-notice">The import bundle you are using requires the User Import Add-On.</p><a href="http://www.wpallimport.com/checkout/?edd_action=add_to_cart&download_id=1921&edd_options%5Bprice_id%5D=1" target="_blank" class="upgrade_link">Purchase the User Import Add-On</a>.', 'wp_all_import_plugin');
622
+ }
623
+
624
+ break;
625
+
626
+ default:
627
+ # code...
628
+ break;
629
+ }
630
+ }
631
 
632
  if ( ! empty($upload_result['is_empty_bundle_file']))
633
+ {
634
  // Return JSON-RPC response
635
+ exit(json_encode(array("jsonrpc" => "2.0", "error" => null, "result" => null, "id" => "id", "name" => $upload_result['filePath'], "post_type" => $post_type, "notice" => $notice, "template" => $upload_result['template'], "url_bundle" => true)));
636
  }
637
  else
638
  {
711
  }
712
 
713
  // Return JSON-RPC response
714
+ exit(json_encode(array("jsonrpc" => "2.0", "error" => null, "result" => null, "id" => "id", "name" => $filePath, "post_type" => $post_type, "notice" => $notice)));
715
 
716
  }
717
 
controllers/controller/admin.php CHANGED
@@ -89,7 +89,7 @@ abstract class PMXI_Controller_Admin extends PMXI_Controller {
89
  //wp_enqueue_script('wp-all-import-autocomplete', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/ui.autocomplete.js', array('jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-position'));
90
  wp_enqueue_script('jquery-tipsy', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/jquery.tipsy.js', 'jquery');
91
  wp_enqueue_script('jquery-nestable', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/jquery.mjs.nestedSortable.js', array('jquery', 'jquery-ui-dialog', 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'jquery-ui-tabs', 'jquery-ui-progressbar'));
92
- wp_enqueue_script('jquery-moment', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/moment.js', 'jquery');
93
  wp_enqueue_script('jquery-select2', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/select2.min.js', 'jquery');
94
  wp_enqueue_script('jquery-ddslick', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/jquery.ddslick.min.js', 'jquery');
95
  wp_enqueue_script('jquery-contextmenu', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/jquery.ui-contextmenu.min.js', array('jquery', 'jquery-ui-menu'));
89
  //wp_enqueue_script('wp-all-import-autocomplete', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/ui.autocomplete.js', array('jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-position'));
90
  wp_enqueue_script('jquery-tipsy', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/jquery.tipsy.js', 'jquery');
91
  wp_enqueue_script('jquery-nestable', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/jquery.mjs.nestedSortable.js', array('jquery', 'jquery-ui-dialog', 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'jquery-ui-tabs', 'jquery-ui-progressbar'));
92
+ wp_enqueue_script('jquery-moment', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/moment.js', 'jquery', PMXI_VERSION);
93
  wp_enqueue_script('jquery-select2', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/select2.min.js', 'jquery');
94
  wp_enqueue_script('jquery-ddslick', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/jquery.ddslick.min.js', 'jquery');
95
  wp_enqueue_script('jquery-contextmenu', WP_ALL_IMPORT_ROOT_URL . '/static/js/jquery/jquery.ui-contextmenu.min.js', array('jquery', 'jquery-ui-menu'));
helpers/functions.php CHANGED
@@ -34,6 +34,7 @@
34
  if (preg_match('%jpg%i', $content_type[1])) return 'jpg';
35
  if (preg_match('%png%i', $content_type[1])) return 'png';
36
  if (preg_match('%gif%i', $content_type[1])) return 'gif';
 
37
  return ($content_type[1] == "unknown") ? "" : $content_type[1];
38
  }
39
 
34
  if (preg_match('%jpg%i', $content_type[1])) return 'jpg';
35
  if (preg_match('%png%i', $content_type[1])) return 'png';
36
  if (preg_match('%gif%i', $content_type[1])) return 'gif';
37
+ if (preg_match('%svg%i', $content_type[1])) return 'svg';
38
  return ($content_type[1] == "unknown") ? "" : $content_type[1];
39
  }
40
 
helpers/get_file_curl.php CHANGED
@@ -2,37 +2,41 @@
2
 
3
  if ( ! function_exists('get_file_curl') ):
4
 
5
- function get_file_curl($url, $fullpath, $to_variable = false, $iteration = 0) {
6
 
7
  if ( ! preg_match('%^(http|ftp)s?://%i', $url) ) return;
8
 
9
- $request = wp_remote_get($url);
10
 
11
- if ( ! is_wp_error($request) and ( ! isset($request['response']['code']) or isset($request['response']['code']) and ! in_array($request['response']['code'], array(401, 403, 404))) ) {
12
-
13
- $rawdata = wp_remote_retrieve_body( $request );
14
 
15
- if (empty($rawdata)){
16
- $result = pmxi_curl_download($url, $fullpath, $to_variable);
17
- if ( ! $result and ! $iteration){
18
- $url = wp_all_import_translate_uri($url);
19
- return get_file_curl($url, $fullpath, $to_variable, 1);
 
 
20
  }
21
  return $result;
22
  }
23
 
24
- if ( ! @file_put_contents($fullpath, $rawdata) ) {
 
25
  $fp = fopen($fullpath,'w');
26
  fwrite($fp, $rawdata);
27
  fclose($fp);
28
  }
29
 
30
- if ( preg_match('%\W(jpg|jpeg|gif|png)$%i', basename($fullpath)) and ( ! ($image_info = @getimagesize($fullpath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG)) ) )
31
  {
32
- $result = pmxi_curl_download($url, $fullpath, $to_variable);
33
- if ( ! $result and ! $iteration){
34
- $url = wp_all_import_translate_uri($url);
35
- return get_file_curl($url, $fullpath, $to_variable, 1);
 
36
  }
37
  return $result;
38
  }
@@ -40,17 +44,17 @@ if ( ! function_exists('get_file_curl') ):
40
  return ($to_variable) ? $rawdata : true;
41
 
42
  }
43
- else{
44
-
45
  $curl = pmxi_curl_download($url, $fullpath, $to_variable);
46
 
47
- if ($curl === false and ! $iteration){
48
- $url = wp_all_import_translate_uri($url);
49
- return get_file_curl($url, $fullpath, $to_variable, 1);
50
-
51
  }
52
 
53
- return ($curl === false) ? $request : $curl;
54
 
55
  }
56
 
@@ -66,6 +70,7 @@ if ( ! function_exists('pmxi_curl_download') ) {
66
 
67
  $ch = curl_init($url);
68
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
69
  $rawdata = curl_exec_follow($ch);
70
 
71
  $result = curl_getinfo($ch, CURLINFO_HTTP_CODE);
@@ -124,6 +129,7 @@ if ( ! function_exists('curl_exec_follow') ):
124
  curl_setopt($rch, CURLOPT_HEADER, true);
125
  curl_setopt($rch, CURLOPT_NOBODY, true);
126
  curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
 
127
  do
128
  {
129
  curl_setopt($rch, CURLOPT_URL, $newurl);
2
 
3
  if ( ! function_exists('get_file_curl') ):
4
 
5
+ function get_file_curl($url, $fullpath, $to_variable = false, $iteration = false) {
6
 
7
  if ( ! preg_match('%^(http|ftp)s?://%i', $url) ) return;
8
 
9
+ $response = wp_remote_get($url);
10
 
11
+ if ( ! is_wp_error($response) and ( ! isset($response['response']['code']) or isset($response['response']['code']) and ! in_array($response['response']['code'], array(401, 403, 404))) )
12
+ {
13
+ $rawdata = wp_remote_retrieve_body( $response );
14
 
15
+ if (empty($rawdata))
16
+ {
17
+ $result = pmxi_curl_download($url, $fullpath, $to_variable);
18
+ if ( ! $result and $iteration === false)
19
+ {
20
+ $new_url = wp_all_import_translate_uri($url);
21
+ return ($new_url !== $url) ? get_file_curl($new_url, $fullpath, $to_variable, true) : $result;
22
  }
23
  return $result;
24
  }
25
 
26
+ if ( ! @file_put_contents($fullpath, $rawdata) )
27
+ {
28
  $fp = fopen($fullpath,'w');
29
  fwrite($fp, $rawdata);
30
  fclose($fp);
31
  }
32
 
33
+ if ( preg_match('%\W(svg)$%i', basename($fullpath)) or preg_match('%\W(jpg|jpeg|gif|png)$%i', basename($fullpath)) and ( ! ($image_info = apply_filters('pmxi_getimagesize', @getimagesize($fullpath), $fullpath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG)) ) )
34
  {
35
+ $result = pmxi_curl_download($url, $fullpath, $to_variable);
36
+ if ( ! $result and $iteration === false)
37
+ {
38
+ $new_url = wp_all_import_translate_uri($url);
39
+ return ($new_url !== $url) ? get_file_curl($new_url, $fullpath, $to_variable, true) : $result;
40
  }
41
  return $result;
42
  }
44
  return ($to_variable) ? $rawdata : true;
45
 
46
  }
47
+ else
48
+ {
49
  $curl = pmxi_curl_download($url, $fullpath, $to_variable);
50
 
51
+ if ($curl === false and $iteration === false)
52
+ {
53
+ $new_url = wp_all_import_translate_uri($url);
54
+ return ($new_url !== $url) ? get_file_curl($new_url, $fullpath, $to_variable, true) : $response;
55
  }
56
 
57
+ return ($curl === false) ? $response : $curl;
58
 
59
  }
60
 
70
 
71
  $ch = curl_init($url);
72
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
73
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
74
  $rawdata = curl_exec_follow($ch);
75
 
76
  $result = curl_getinfo($ch, CURLINFO_HTTP_CODE);
129
  curl_setopt($rch, CURLOPT_HEADER, true);
130
  curl_setopt($rch, CURLOPT_NOBODY, true);
131
  curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
132
+ curl_setopt($rch, CURLOPT_CONNECTTIMEOUT, 5);
133
  do
134
  {
135
  curl_setopt($rch, CURLOPT_URL, $newurl);
helpers/pmxi_findDuplicates.php CHANGED
@@ -14,7 +14,7 @@ function pmxi_findDuplicates($articleData, $custom_duplicate_name = '', $custom_
14
  if ( ! empty($articleData['post_type'])){
15
  $post_types = (class_exists('PMWI_Plugin') and $articleData['post_type'] == 'product') ? array('product', 'product_variation') : array($articleData['post_type']);
16
 
17
- $sql = $wpdb->prepare("SELECT SQL_CALC_FOUND_ROWS " . $wpdb->posts . ".ID FROM " . $wpdb->posts . " INNER JOIN " . $wpdb->postmeta . " ON ( " . $wpdb->posts . ".ID = " . $wpdb->postmeta . ".post_id ) WHERE 1=1 AND ( ( " . $wpdb->postmeta . ".meta_key = %s AND CAST(" . $wpdb->postmeta . ".meta_value AS CHAR) = %s ) OR ( " . $wpdb->postmeta . ".meta_key = %s AND CAST(" . $wpdb->postmeta . ".meta_value AS CHAR) = %s ) ) AND " . $wpdb->posts . ".post_type IN ('". implode("','", $post_types) ."') AND ((" . $wpdb->posts . ".post_status <> 'trash' AND " . $wpdb->posts . ".post_status <> 'auto-draft')) GROUP BY " . $wpdb->posts . ".ID ORDER BY " . $wpdb->posts . ".ID ASC LIMIT 0, 15", trim($custom_duplicate_name), trim($custom_duplicate_value), trim($custom_duplicate_name), htmlspecialchars(trim($custom_duplicate_value)));
18
 
19
  $query = $wpdb->get_results( $sql );
20
 
@@ -24,7 +24,7 @@ function pmxi_findDuplicates($articleData, $custom_duplicate_name = '', $custom_
24
 
25
  if (empty($duplicate_ids)){
26
 
27
- $query = $wpdb->get_results( $wpdb->prepare("SELECT SQL_CALC_FOUND_ROWS ".$wpdb->posts.".ID FROM ".$wpdb->posts." INNER JOIN ".$wpdb->postmeta." ON (".$wpdb->posts.".ID = ".$wpdb->postmeta.".post_id) WHERE 1=1 AND ".$wpdb->posts.".post_type IN ('". implode("','", $post_types) ."') AND (".$wpdb->posts.".post_status = 'publish' OR ".$wpdb->posts.".post_status = 'future' OR ".$wpdb->posts.".post_status = 'draft' OR ".$wpdb->posts.".post_status = 'pending' OR ".$wpdb->posts.".post_status = 'trash' OR ".$wpdb->posts.".post_status = 'private') AND ( (".$wpdb->postmeta.".meta_key = '%s' AND CAST(".$wpdb->postmeta.".meta_value AS CHAR) = '%s') ) GROUP BY ".$wpdb->posts.".ID ORDER BY ".$wpdb->posts.".ID ASC LIMIT 0, 20", trim($custom_duplicate_name), htmlspecialchars(trim($custom_duplicate_value))));
28
 
29
  if ( ! empty($query) )
30
  foreach ($query as $p)
@@ -50,7 +50,7 @@ function pmxi_findDuplicates($articleData, $custom_duplicate_name = '', $custom_
50
  }
51
  }
52
  else{
53
- $query = $wpdb->get_results( $wpdb->prepare("SELECT SQL_CALC_FOUND_ROWS ".$wpdb->users.".ID FROM ".$wpdb->users." INNER JOIN ".$wpdb->usermeta." ON (".$wpdb->users.".ID = ".$wpdb->usermeta.".user_id) WHERE 1=1 AND ( (".$wpdb->usermeta.".meta_key = '%s' AND CAST(".$wpdb->usermeta.".meta_value AS CHAR) = '%s') ) GROUP BY ".$wpdb->users.".ID ORDER BY ".$wpdb->users.".ID ASC LIMIT 0, 20", $custom_duplicate_name, $custom_duplicate_value));
54
 
55
  if ( ! empty($query) )
56
  foreach ($query as $p)
14
  if ( ! empty($articleData['post_type'])){
15
  $post_types = (class_exists('PMWI_Plugin') and $articleData['post_type'] == 'product') ? array('product', 'product_variation') : array($articleData['post_type']);
16
 
17
+ $sql = $wpdb->prepare("SELECT SQL_CALC_FOUND_ROWS " . $wpdb->posts . ".ID FROM " . $wpdb->posts . " INNER JOIN " . $wpdb->postmeta . " ON ( " . $wpdb->posts . ".ID = " . $wpdb->postmeta . ".post_id ) WHERE 1=1 AND ( ( " . $wpdb->postmeta . ".meta_key = %s AND " . $wpdb->postmeta . ".meta_value = %s ) OR ( " . $wpdb->postmeta . ".meta_key = %s AND " . $wpdb->postmeta . ".meta_value = %s ) ) AND " . $wpdb->posts . ".post_type IN ('". implode("','", $post_types) ."') AND ((" . $wpdb->posts . ".post_status <> 'trash' AND " . $wpdb->posts . ".post_status <> 'auto-draft')) GROUP BY " . $wpdb->posts . ".ID ORDER BY " . $wpdb->posts . ".ID ASC LIMIT 0, 15", trim($custom_duplicate_name), trim($custom_duplicate_value), trim($custom_duplicate_name), htmlspecialchars(trim($custom_duplicate_value)));
18
 
19
  $query = $wpdb->get_results( $sql );
20
 
24
 
25
  if (empty($duplicate_ids)){
26
 
27
+ $query = $wpdb->get_results( $wpdb->prepare("SELECT SQL_CALC_FOUND_ROWS ".$wpdb->posts.".ID FROM ".$wpdb->posts." INNER JOIN ".$wpdb->postmeta." ON (".$wpdb->posts.".ID = ".$wpdb->postmeta.".post_id) WHERE 1=1 AND ".$wpdb->posts.".post_type IN ('". implode("','", $post_types) ."') AND (".$wpdb->posts.".post_status = 'publish' OR ".$wpdb->posts.".post_status = 'future' OR ".$wpdb->posts.".post_status = 'draft' OR ".$wpdb->posts.".post_status = 'pending' OR ".$wpdb->posts.".post_status = 'trash' OR ".$wpdb->posts.".post_status = 'private') AND ( (".$wpdb->postmeta.".meta_key = '%s' AND ".$wpdb->postmeta.".meta_value = '%s') ) GROUP BY ".$wpdb->posts.".ID ORDER BY ".$wpdb->posts.".ID ASC LIMIT 0, 20", trim($custom_duplicate_name), htmlspecialchars(trim($custom_duplicate_value))));
28
 
29
  if ( ! empty($query) )
30
  foreach ($query as $p)
50
  }
51
  }
52
  else{
53
+ $query = $wpdb->get_results( $wpdb->prepare("SELECT SQL_CALC_FOUND_ROWS ".$wpdb->users.".ID FROM ".$wpdb->users." INNER JOIN ".$wpdb->usermeta." ON (".$wpdb->users.".ID = ".$wpdb->usermeta.".user_id) WHERE 1=1 AND ( (".$wpdb->usermeta.".meta_key = '%s' AND ".$wpdb->usermeta.".meta_value = '%s') ) GROUP BY ".$wpdb->users.".ID ORDER BY ".$wpdb->users.".ID ASC LIMIT 0, 20", $custom_duplicate_name, $custom_duplicate_value));
54
 
55
  if ( ! empty($query) )
56
  foreach ($query as $p)
helpers/wp_all_import_get_image_from_gallery.php CHANGED
@@ -7,21 +7,33 @@ function wp_all_import_get_image_from_gallery($image_name, $targetDir = false, $
7
  if ( ! $targetDir )
8
  {
9
  $wp_uploads = wp_upload_dir();
10
- $targetDir = $wp_uploads['path'];
11
  }
12
 
13
- // search attachment by file name with extension
14
- $attch = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . $wpdb->posts . " WHERE (post_title = %s OR post_title = %s OR post_name = %s) AND post_type = %s AND post_mime_type LIKE %s;", $image_name, preg_replace('/\\.[^.\\s]{3,4}$/', '', $image_name), sanitize_title($image_name), "attachment", "image%" ) );
15
 
 
 
 
 
 
 
 
 
16
  if ( empty($attch) )
17
  {
 
 
18
 
19
  // search attachment by file name without extension
20
- $attachment_title = explode(".", $image_name);
21
- if (is_array($attachment_title) and count($attachment_title) > 1) array_pop($attachment_title);
22
- $image_name = implode(".", $attachment_title);
 
 
23
 
24
- $attch = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . $wpdb->posts . " WHERE (post_title = %s OR post_title = %s OR post_name = %s) AND post_type = %s AND post_mime_type LIKE %s;", $image_name, preg_replace('/\\.[^.\\s]{3,4}$/', '', $image_name), sanitize_title($image_name), "attachment", "image%" ) );
 
25
  }
26
 
27
  // search attachment by file headers
7
  if ( ! $targetDir )
8
  {
9
  $wp_uploads = wp_upload_dir();
10
+ $targetDir = $wp_uploads['path'];
11
  }
12
 
13
+ $attch = '';
 
14
 
15
+ // search attachment by attached file
16
+ $attachment_meta = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . $wpdb->postmeta . " WHERE meta_key = %s AND meta_value LIKE %s;", '_wp_attached_file', "%/" . $image_name ) );
17
+
18
+ if ( ! empty($attachment_meta) )
19
+ {
20
+ $attch = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . $wpdb->posts . " WHERE ID = %d;", $attachment_meta->post_id ) );
21
+ }
22
+
23
  if ( empty($attch) )
24
  {
25
+ // search attachment by file name with extension
26
+ $attch = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . $wpdb->posts . " WHERE (post_title = %s OR post_title = %s OR post_name = %s) AND post_type = %s AND post_mime_type LIKE %s;", $image_name, preg_replace('/\\.[^.\\s]{3,4}$/', '', $image_name), sanitize_title($image_name), "attachment", "image%" ) );
27
 
28
  // search attachment by file name without extension
29
+ if ( empty($attch) )
30
+ {
31
+ $attachment_title = explode(".", $image_name);
32
+ if (is_array($attachment_title) and count($attachment_title) > 1) array_pop($attachment_title);
33
+ $image_name = implode(".", $attachment_title);
34
 
35
+ $attch = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM " . $wpdb->posts . " WHERE (post_title = %s OR post_title = %s OR post_name = %s) AND post_type = %s AND post_mime_type LIKE %s;", $image_name, preg_replace('/\\.[^.\\s]{3,4}$/', '', $image_name), sanitize_title($image_name), "attachment", "image%" ) );
36
+ }
37
  }
38
 
39
  // search attachment by file headers
helpers/wp_all_import_is_json.php CHANGED
@@ -2,30 +2,33 @@
2
 
3
  if ( ! function_exists('wp_all_import_is_json')){
4
  function wp_all_import_is_json($string) {
5
- json_decode($string);
6
-
7
- switch (json_last_error()) {
8
- case JSON_ERROR_NONE:
9
- return true;
10
- break;
11
- case JSON_ERROR_DEPTH:
12
- return new WP_Error( 'broke', __( "Maximum stack depth exceeded", "pmxi_plugin" ) );
13
- break;
14
- case JSON_ERROR_STATE_MISMATCH:
15
- return new WP_Error( 'broke', __( "Underflow or the modes mismatch", "pmxi_plugin" ) );
16
- break;
17
- case JSON_ERROR_CTRL_CHAR:
18
- return new WP_Error( 'broke', __( "Unexpected control character found", "pmxi_plugin" ) );
19
- break;
20
- case JSON_ERROR_SYNTAX:
21
- return new WP_Error( 'broke', __( "Syntax error, malformed JSON", "pmxi_plugin" ) );
22
- break;
23
- case JSON_ERROR_UTF8:
24
- return new WP_Error( 'broke', __( "Malformed UTF-8 characters, possibly incorrectly encoded", "pmxi_plugin" ) );
25
- break;
26
- default:
27
- return new WP_Error( 'broke', __( "Unknown json error", "pmxi_plugin" ) );
28
- break;
29
- }
 
 
 
30
  }
31
  }
2
 
3
  if ( ! function_exists('wp_all_import_is_json')){
4
  function wp_all_import_is_json($string) {
5
+ if (function_exists('json_last_error'))
6
+ {
7
+ json_decode($string);
8
+ switch (json_last_error()) {
9
+ case JSON_ERROR_NONE:
10
+ return true;
11
+ break;
12
+ case JSON_ERROR_DEPTH:
13
+ return new WP_Error( 'broke', __( "Maximum stack depth exceeded", "pmxi_plugin" ) );
14
+ break;
15
+ case JSON_ERROR_STATE_MISMATCH:
16
+ return new WP_Error( 'broke', __( "Underflow or the modes mismatch", "pmxi_plugin" ) );
17
+ break;
18
+ case JSON_ERROR_CTRL_CHAR:
19
+ return new WP_Error( 'broke', __( "Unexpected control character found", "pmxi_plugin" ) );
20
+ break;
21
+ case JSON_ERROR_SYNTAX:
22
+ return new WP_Error( 'broke', __( "Syntax error, malformed JSON", "pmxi_plugin" ) );
23
+ break;
24
+ case JSON_ERROR_UTF8:
25
+ return new WP_Error( 'broke', __( "Malformed UTF-8 characters, possibly incorrectly encoded", "pmxi_plugin" ) );
26
+ break;
27
+ default:
28
+ return new WP_Error( 'broke', __( "Unknown json error", "pmxi_plugin" ) );
29
+ break;
30
+ }
31
+ }
32
+ return true;
33
  }
34
  }
helpers/wp_all_import_secure_file.php CHANGED
@@ -11,7 +11,7 @@ if ( ! function_exists('wp_all_import_secure_file') ){
11
 
12
  if ( @is_dir($dir) and $remove_dir ) wp_all_import_remove_source($dir . DIRECTORY_SEPARATOR . 'index.php' );
13
 
14
- @mkdir($dir, 0755);
15
 
16
  if (@is_writable($dir) and @is_dir($dir)){
17
  $targetDir = $dir;
11
 
12
  if ( @is_dir($dir) and $remove_dir ) wp_all_import_remove_source($dir . DIRECTORY_SEPARATOR . 'index.php' );
13
 
14
+ @wp_mkdir_p($dir);
15
 
16
  if (@is_writable($dir) and @is_dir($dir)){
17
  $targetDir = $dir;
helpers/wp_all_import_template_notifications.php CHANGED
@@ -80,7 +80,7 @@ if ( ! function_exists('wp_all_import_template_notifications') )
80
  {
81
  $notification[] = __('The import template you are using requires an Add-On for WP All Import. If you continue without using this Add-On your data may import incorrectly.', 'wp_all_import_plugin');
82
  }
83
- }
84
 
85
  if ( ! empty($notifications))
86
  {
80
  {
81
  $notification[] = __('The import template you are using requires an Add-On for WP All Import. If you continue without using this Add-On your data may import incorrectly.', 'wp_all_import_plugin');
82
  }
83
+ }
84
 
85
  if ( ! empty($notifications))
86
  {
i18n/languages/wp_all_import_plugin-de_CH.po CHANGED
@@ -1184,7 +1184,7 @@ msgstr ""
1184
 
1185
  #: ../../controllers/admin/import.php:295
1186
  msgid ""
1187
- "The import template you are using requires User Import Add-On.<br/><a href=\"http://"
1188
  "www.wpallimport.com/add-ons/user-import/?utm_source=wordpress.org&utm_medium=wpai-"
1189
  "import-template&utm_campaign=free+wp+all+export+plugin\" target=\"_blank\">Purchase "
1190
  "the User Import Add-On</a>"
1184
 
1185
  #: ../../controllers/admin/import.php:295
1186
  msgid ""
1187
+ "The import template you are using requires the User Import Add-On.<br/><a href=\"http://"
1188
  "www.wpallimport.com/add-ons/user-import/?utm_source=wordpress.org&utm_medium=wpai-"
1189
  "import-template&utm_campaign=free+wp+all+export+plugin\" target=\"_blank\">Purchase "
1190
  "the User Import Add-On</a>"
i18n/languages/wp_all_import_plugin-de_DE.mo CHANGED
Binary file
i18n/languages/wp_all_import_plugin-de_DE.po CHANGED
@@ -142,7 +142,7 @@ msgstr[1] ""
142
 
143
  #: ../../controllers/admin/settings.php:652
144
  #, php-format
145
- msgid "Please verify that the file you uploading is a valid %s file."
146
  msgstr ""
147
 
148
  #: ../../helpers/wp_all_import_addon_notifications.php:124
@@ -1179,7 +1179,7 @@ msgstr ""
1179
 
1180
  #: ../../controllers/admin/import.php:295
1181
  msgid ""
1182
- "The import template you are using requires User Import Add-On.<br/><a "
1183
  "href=\"http://www.wpallimport.com/add-ons/user-import/?utm_source=wordpress."
1184
  "org&utm_medium=wpai-import-template&utm_campaign=free+wp+all+export+plugin\" "
1185
  "target=\"_blank\">Purchase the User Import Add-On</a>"
142
 
143
  #: ../../controllers/admin/settings.php:652
144
  #, php-format
145
+ msgid "This %s file has errors and is not valid."
146
  msgstr ""
147
 
148
  #: ../../helpers/wp_all_import_addon_notifications.php:124
1179
 
1180
  #: ../../controllers/admin/import.php:295
1181
  msgid ""
1182
+ "The import template you are using requires the User Import Add-On.<br/><a "
1183
  "href=\"http://www.wpallimport.com/add-ons/user-import/?utm_source=wordpress."
1184
  "org&utm_medium=wpai-import-template&utm_campaign=free+wp+all+export+plugin\" "
1185
  "target=\"_blank\">Purchase the User Import Add-On</a>"
i18n/languages/wp_all_import_plugin-es_ES.mo CHANGED
Binary file
i18n/languages/wp_all_import_plugin-es_ES.po CHANGED
@@ -142,7 +142,7 @@ msgstr[1] ""
142
 
143
  #: ../../controllers/admin/settings.php:652
144
  #, php-format
145
- msgid "Please verify that the file you uploading is a valid %s file."
146
  msgstr ""
147
 
148
  #: ../../helpers/wp_all_import_addon_notifications.php:124
@@ -1190,7 +1190,7 @@ msgstr ""
1190
 
1191
  #: ../../controllers/admin/import.php:295
1192
  msgid ""
1193
- "The import template you are using requires User Import Add-On.<br/><a "
1194
  "href=\"http://www.wpallimport.com/add-ons/user-import/?utm_source=wordpress."
1195
  "org&utm_medium=wpai-import-template&utm_campaign=free+wp+all+export+plugin\" "
1196
  "target=\"_blank\">Purchase the User Import Add-On</a>"
142
 
143
  #: ../../controllers/admin/settings.php:652
144
  #, php-format
145
+ msgid "This %s file has errors and is not valid."
146
  msgstr ""
147
 
148
  #: ../../helpers/wp_all_import_addon_notifications.php:124
1190
 
1191
  #: ../../controllers/admin/import.php:295
1192
  msgid ""
1193
+ "The import template you are using requires the User Import Add-On.<br/><a "
1194
  "href=\"http://www.wpallimport.com/add-ons/user-import/?utm_source=wordpress."
1195
  "org&utm_medium=wpai-import-template&utm_campaign=free+wp+all+export+plugin\" "
1196
  "target=\"_blank\">Purchase the User Import Add-On</a>"
libraries/XmlImportConfig.php CHANGED
@@ -34,7 +34,7 @@ if (!class_exists('XmlImportConfig'))
34
  private function init()
35
  {
36
  $this->setCacheDirectory(dirname(__FILE__) . '/cache');
37
- $this->setMultiGlue(', ');
38
  }
39
 
40
  /**
34
  private function init()
35
  {
36
  $this->setCacheDirectory(dirname(__FILE__) . '/cache');
37
+ $this->setMultiGlue( apply_filters('wp_all_import_multi_glue', ', ') );
38
  }
39
 
40
  /**
models/import/record.php CHANGED
@@ -19,11 +19,11 @@ class PMXI_Import_Record extends PMXI_Model_Record {
19
  $is_preprocess_enabled = apply_filters('is_xml_preprocess_enabled', true);
20
 
21
  if ($is_preprocess_enabled)
22
- {
23
  $xml = preg_replace_callback('/<!\[CDATA\[[^\]\]]*\]\]>/s', 'wp_all_import_cdata_filter', $xml );
24
- //$xml = preg_replace('/&(?![a-z#]+;)/i', '&amp;', $xml);
25
  $xml = preg_replace('/&([^amp;|^gt;|^lt;]+)/i', '&amp;$1', $xml);
26
-
27
  if ( ! empty(self::$cdata) ){
28
  foreach (self::$cdata as $key => $val) {
29
  $xml = str_replace('{{CPLACE_' . ($key + 1) . '}}', $val, $xml);
@@ -84,8 +84,8 @@ class PMXI_Import_Record extends PMXI_Model_Record {
84
  parent::__construct($data);
85
  $this->setTable(PMXI_Plugin::getInstance()->getTablePrefix() . 'imports');
86
  $this->errors = new WP_Error();
87
- }
88
-
89
  public $post_meta_to_insert = array();
90
 
91
  /**
@@ -495,7 +495,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
495
  // apply mapping rules before splitting via separator symbol
496
  if ( ! empty($this->options['tax_enable_mapping'][$tx_name]) and ! empty($this->options['tax_logic_mapping'][$tx_name]) ){
497
  if ( ! empty( $mapping_rules) ){
498
- foreach ($mapping_rules as $rule) {
499
  if ( ! empty($rule[trim($_tx)])){
500
  $_tx = trim($rule[trim($_tx)]);
501
  break;
@@ -621,6 +621,10 @@ class PMXI_Import_Record extends PMXI_Model_Record {
621
  $images_bundle = array();
622
  $auto_rename_images_bundle = array();
623
  $auto_extensions_bundle = array();
 
 
 
 
624
  foreach ($image_sections as $section) {
625
  $chunk == 1 and $logger and call_user_func($logger, __('Composing URLs for ' . strtolower($section['title']) . '...', 'wp_all_import_plugin'));
626
  $featured_images = array();
@@ -651,8 +655,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
651
  'files' => $featured_images
652
  );
653
 
654
- // Composing images meta titles
655
- $image_meta_titles_bundle = array();
656
  if ( $this->options[$section['slug'] . 'set_image_meta_title'] ){
657
  $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (titles)...', 'wp_all_import_plugin'));
658
  $image_meta_titles = array();
@@ -664,8 +667,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
664
  $image_meta_titles_bundle[ empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $image_meta_titles;
665
  }
666
 
667
- // Composing images meta captions
668
- $image_meta_captions_bundle = array();
669
  if ( $this->options[$section['slug'] . 'set_image_meta_caption'] ){
670
  $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (captions)...', 'wp_all_import_plugin'));
671
  $image_meta_captions = array();
@@ -677,8 +679,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
677
  $image_meta_captions_bundle[ empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $image_meta_captions;
678
  }
679
 
680
- // Composing images meta alt text
681
- $image_meta_alts_bundle = array();
682
  if ( $this->options[$section['slug'] . 'set_image_meta_alt'] ){
683
  $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (alt text)...', 'wp_all_import_plugin'));
684
  $image_meta_alts = array();
@@ -690,8 +691,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
690
  $image_meta_alts_bundle[ empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $image_meta_alts;
691
  }
692
 
693
- // Composing images meta description
694
- $image_meta_descriptions_bundle = array();
695
  if ( $this->options[$section['slug'] . 'set_image_meta_description'] ){
696
  $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (description)...', 'wp_all_import_plugin'));
697
  $image_meta_descriptions = array();
@@ -817,9 +817,14 @@ class PMXI_Import_Record extends PMXI_Model_Record {
817
 
818
  $specified_records = array();
819
 
 
 
 
 
820
  if ($this->options['is_import_specified']) {
821
  $chunk == 1 and $logger and call_user_func($logger, __('Calculate specified records to import...', 'wp_all_import_plugin'));
822
- foreach (preg_split('% *, *%', $this->options['import_specified'], -1, PREG_SPLIT_NO_EMPTY) as $chank) {
 
823
  if (preg_match('%^(\d+)-(\d+)$%', $chank, $mtch)) {
824
  $specified_records = array_merge($specified_records, range(intval($mtch[1]), intval($mtch[2])));
825
  } else {
@@ -827,13 +832,9 @@ class PMXI_Import_Record extends PMXI_Model_Record {
827
  }
828
  }
829
 
830
- }
831
-
832
- $simpleXml = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
833
-
834
- $rootNodes = $simpleXml->xpath($cxpath);
835
 
836
- foreach ($titles as $i => $void) {
837
 
838
  $custom_type_details = get_post_type_object( $post_type[$i] );
839
 
@@ -841,6 +842,18 @@ class PMXI_Import_Record extends PMXI_Model_Record {
841
 
842
  $logger and call_user_func($logger, __('---', 'wp_all_import_plugin'));
843
  $logger and call_user_func($logger, sprintf(__('Record #%s', 'wp_all_import_plugin'), $this->imported + $this->skipped + $i + 1));
 
 
 
 
 
 
 
 
 
 
 
 
844
 
845
  wp_cache_flush();
846
 
@@ -871,7 +884,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
871
  'description' => $addons_data['PMUI_Plugin']['pmui_description'][$i],
872
  'nickname' => $addons_data['PMUI_Plugin']['pmui_nickname'][$i],
873
  'role' => ('' == $addons_data['PMUI_Plugin']['pmui_role'][$i]) ? 'subscriber' : strtolower($addons_data['PMUI_Plugin']['pmui_role'][$i]),
874
- );
875
  $logger and call_user_func($logger, sprintf(__('Combine all data for user %s...', 'wp_all_import_plugin'), $articleData['user_login']));
876
  }
877
  else {
@@ -898,67 +911,72 @@ class PMXI_Import_Record extends PMXI_Model_Record {
898
 
899
  // An array representation of current XML node
900
  $current_xml_node = wp_all_import_xml2array($rootNodes[$i]);
 
 
901
 
902
- // if Auto Matching re-import option selected
903
- if ( "manual" != $this->options['duplicate_matching'] ){
904
-
905
- // find corresponding article among previously imported
906
- $logger and call_user_func($logger, sprintf(__('Find corresponding article among previously imported for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
907
- $postRecord->clear();
908
- $postRecord->getBy(array(
909
- 'unique_key' => $unique_keys[$i],
910
- 'import_id' => $this->id,
911
- ));
912
-
913
- if ( ! $postRecord->isEmpty() ) {
914
- $logger and call_user_func($logger, sprintf(__('Duplicate post was found for post %s with unique key `%s`...', 'wp_all_import_plugin'), $articleData['post_title'], $unique_keys[$i]));
915
- if ( $this->options['custom_type'] == 'import_users'){
916
- $post_to_update = get_user_by('id', $post_to_update_id = $postRecord->post_id);
 
 
 
 
 
 
917
  }
918
  else{
919
- $post_to_update = get_post($post_to_update_id = $postRecord->post_id);
920
  }
921
- }
922
- else{
923
- $logger and call_user_func($logger, sprintf(__('Duplicate post wasn\'t found with unique key `%s`...', 'wp_all_import_plugin'), $unique_keys[$i]));
924
- }
925
-
926
- // if Manual Matching re-import option seleted
927
- } else {
928
-
929
- if ('custom field' == $this->options['duplicate_indicator']) {
930
- $custom_duplicate_value = XmlImportParser::factory($xml, $cxpath, $this->options['custom_duplicate_value'], $file)->parse($records); $tmp_files[] = $file;
931
- $custom_duplicate_name = XmlImportParser::factory($xml, $cxpath, $this->options['custom_duplicate_name'], $file)->parse($records); $tmp_files[] = $file;
932
- }
933
- else{
934
- count($titles) and $custom_duplicate_name = $custom_duplicate_value = array_fill(0, count($titles), '');
935
- }
936
-
937
- $logger and call_user_func($logger, sprintf(__('Find corresponding article among database for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
938
-
939
- if ('pid' == $this->options['duplicate_indicator']) {
940
- $duplicate_id = $post_ids[$i];
941
- }
942
- // handle duplicates according to import settings
943
- else
944
- {
945
- $duplicates = pmxi_findDuplicates($articleData, $custom_duplicate_name[$i], $custom_duplicate_value[$i], $this->options['duplicate_indicator']);
946
- $duplicate_id = ( ! empty($duplicates)) ? array_shift($duplicates) : false;
947
- }
948
 
949
- if ( ! empty($duplicate_id)) {
950
- $logger and call_user_func($logger, sprintf(__('Duplicate post was found for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
951
- if ( $this->options['custom_type'] == 'import_users'){
952
- $post_to_update = get_user_by('id', $post_to_update_id = $duplicate_id);
953
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
954
  else{
955
- $post_to_update = get_post($post_to_update_id = $duplicate_id);
956
  }
957
- }
958
- else{
959
- $logger and call_user_func($logger, sprintf(__('Duplicate post wasn\'n found for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
960
  }
961
- }
962
 
963
  if ( ! empty($specified_records) ) {
964
 
@@ -981,7 +999,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
981
 
982
  $continue_import = true;
983
 
984
- $continue_import = apply_filters('wp_all_import_is_post_to_update', $post_to_update_id, $current_xml_node);
985
 
986
  if ( ! $continue_import ){
987
 
@@ -1059,11 +1077,23 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1059
  if ( ! $this->options['is_update_slug']){
1060
  $articleData['post_name'] = $post_to_update->post_name;
1061
  $logger and call_user_func($logger, sprintf(__('Preserve slug of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
1062
- }
1063
- elseif( ! empty($articleData['post_name']) and $articleData['post_name'] != $post_to_update->post_name)
 
1064
  {
1065
- update_post_meta($pid, '_wp_old_slug', $post_to_update->post_name);
1066
- }
 
 
 
 
 
 
 
 
 
 
 
1067
  if ( ! $this->options['is_update_excerpt']){
1068
  $articleData['post_excerpt'] = $post_to_update->post_excerpt;
1069
  $logger and call_user_func($logger, sprintf(__('Preserve excerpt of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
@@ -1118,7 +1148,8 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1118
  // handle obsolete attachments (i.e. delete or keep) according to import settings
1119
  if ( $this->options['update_all_data'] == 'yes' or ( $this->options['update_all_data'] == 'no' and $this->options['is_update_images'] and $this->options['update_images_logic'] == "full_update")){
1120
  $logger and call_user_func($logger, sprintf(__('Deleting images for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
1121
- $missing_images = wp_delete_attachments($articleData['ID'], ! $this->options['do_not_remove_images'], 'images');
 
1122
  }
1123
  }
1124
  }
@@ -1230,7 +1261,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1230
  if ( empty($articleData['ID']) )
1231
  {
1232
  $continue_import = true;
1233
- $continue_import = apply_filters('wp_all_import_is_post_to_create', $current_xml_node);
1234
 
1235
  if ( ! $continue_import ){
1236
  $skipped++;
@@ -1290,7 +1321,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1290
  set_post_format($pid, ("xpath" == $this->options['post_format']) ? $post_format[$i] : $this->options['post_format'] );
1291
  $logger and call_user_func($logger, sprintf(__('Associate post `%s` with post format %s ...', 'wp_all_import_plugin'), $articleData['post_title'], ("xpath" == $this->options['post_format']) ? $post_format[$i] : $this->options['post_format']));
1292
  }
1293
- // [/post format]
1294
 
1295
  // [addons import]
1296
 
@@ -1326,21 +1357,21 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1326
  }
1327
  }
1328
 
1329
- // [/addons import]
1330
 
1331
  // Page Template
1332
- if ('page' == $articleData['post_type'] and wp_all_import_is_update_cf('_wp_page_template', $this->options) and ( !empty($this->options['page_template']) or "no" == $this->options['is_multiple_page_template']) ){
1333
  update_post_meta($pid, '_wp_page_template', ("no" == $this->options['is_multiple_page_template']) ? $page_template[$i] : $this->options['page_template']);
1334
  }
1335
 
1336
  // [featured image]
1337
 
1338
- $is_images_to_update = apply_filters('pmxi_is_images_to_update', true, $articleData, $current_xml_node);
1339
 
1340
- $is_allow_import_images = apply_filters('wp_all_import_is_allow_import_images', false, $articleData['post_type']);
 
 
1341
 
1342
- if ( $is_images_to_update and ! empty($uploads) and false === $uploads['error'] and ($articleData['post_type'] == "product" and class_exists('PMWI_Plugin') or $is_allow_import_images) and (empty($articleData['ID']) or $this->options['update_all_data'] == "yes" or ( $this->options['update_all_data'] == "no" and $this->options['is_update_images'])) ) {
1343
-
1344
  if ( ! empty($images_bundle) ){
1345
 
1346
  require_once(ABSPATH . 'wp-admin/includes/image.php');
@@ -1355,12 +1386,12 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1355
 
1356
  $gallery_attachment_ids = array();
1357
 
1358
- if ( ! empty($featured_images[$i]) ){
1359
 
1360
  $targetDir = $uploads['path'];
1361
  $targetUrl = $uploads['url'];
1362
 
1363
- $logger and call_user_func($logger, __('<b>IMAGES:</b>', 'wp_all_import_plugin'));
1364
 
1365
  if ( ! @is_writable($targetDir) ){
1366
 
@@ -1457,14 +1488,17 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1457
 
1458
  $is_keep_existing_images = ( ! empty($articleData['ID']) and $this->options['is_update_images'] and $this->options['update_images_logic'] == "add_new" and $this->options['update_all_data'] == "no" and $is_show_add_new_images);
1459
 
1460
- foreach ($imgs as $k => $img_url) { if (empty($img_url)) continue;
1461
 
1462
  $attid = false;
1463
 
1464
  $attch = null;
1465
 
1466
  $url = trim($img_url);
1467
- $bn = wp_all_import_sanitize_filename(basename($url));
 
 
 
1468
 
1469
  if ( "yes" == $this->options[$option_slug . 'download_images'] and ! empty($auto_extensions_bundle[$slug][$i]) and preg_match('%^(jpg|jpeg|png|gif)$%i', $auto_extensions_bundle[$slug][$i])){
1470
  $img_ext = $auto_extensions_bundle[$slug][$i];
@@ -1478,8 +1512,9 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1478
  $logger and call_user_func($logger, sprintf(__('- Importing image `%s` for `%s` ...', 'wp_all_import_plugin'), $img_url, $articleData['post_title']));
1479
 
1480
  // generate local file name
1481
- $image_name = apply_filters("wp_all_import_image_filename", urldecode(($this->options[$option_slug . 'auto_rename_images'] and !empty($auto_rename_images_bundle[$slug][$i])) ? sanitize_file_name(($img_ext) ? str_replace("." . $default_extension, "", $auto_rename_images_bundle[$slug][$i]) : $auto_rename_images_bundle[$slug][$i]) : sanitize_file_name((($img_ext) ? str_replace("." . $default_extension, "", $bn) : $bn))) . (("" != $img_ext) ? '.' . $img_ext : ''));
1482
-
 
1483
  // if wizard store image data to custom field
1484
  $create_image = false;
1485
  $download_image = true;
@@ -1494,7 +1529,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1494
  $image_filename = md5(time()) . '.jpg';
1495
  $image_filepath = $targetDir . '/' . $image_filename;
1496
  imagejpeg($img, $image_filepath);
1497
- if( ! ($image_info = @getimagesize($image_filepath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
1498
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $image_filepath));
1499
  $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
1500
  } else {
@@ -1502,7 +1537,8 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1502
  }
1503
  }
1504
  }
1505
- else {
 
1506
 
1507
  if ($this->options[$option_slug . 'auto_rename_images'] and !empty($auto_rename_images_bundle[$slug][$i]))
1508
  {
@@ -1513,7 +1549,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1513
  }
1514
 
1515
  $image_filename = wp_unique_filename($targetDir, $image_name);
1516
- $image_filepath = $targetDir . '/' . $image_filename;
1517
 
1518
  // keep existing and add newest images
1519
  if ( $is_keep_existing_images ){
@@ -1590,14 +1626,16 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1590
  }
1591
  // validate import images
1592
  elseif($bundle_data['type'] == 'images'){
1593
- if( ! ($image_info = @getimagesize($image_filepath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
1594
- $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $image_filepath));
1595
- $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
1596
- @unlink($image_filepath);
1597
- } else {
1598
  $create_image = true;
1599
  $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully found', 'wp_all_import_plugin'), $wpai_image_path));
1600
  }
 
 
 
 
 
 
1601
  }
1602
  }
1603
  }
@@ -1607,15 +1645,22 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1607
 
1608
  $request = get_file_curl($url, $image_filepath);
1609
 
1610
- if ( (is_wp_error($request) or $request === false) and ! @file_put_contents($image_filepath, @file_get_contents($url))) {
 
 
1611
  @unlink($image_filepath); // delete file since failed upload may result in empty file created
1612
  } else{
1613
 
1614
- if($bundle_data['type'] == 'images'){
1615
- if( ($image_info = @getimagesize($image_filepath)) and in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
1616
  $create_image = true;
1617
  $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
1618
  }
 
 
 
 
 
1619
  }
1620
  elseif($bundle_data['type'] == 'files'){
1621
  if( $wp_filetype = wp_check_filetype(basename($image_filepath), null )) {
@@ -1626,26 +1671,28 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1626
 
1627
  }
1628
 
1629
- if ( ! $create_image ){
1630
 
1631
  $url = trim(pmxi_convert_encoding($img_url));
1632
 
1633
  $request = get_file_curl($url, $image_filepath);
 
 
1634
 
1635
- if ( (is_wp_error($request) or $request === false) and ! @file_put_contents($image_filepath, @file_get_contents($url))) {
1636
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s cannot be saved locally as %s', 'wp_all_import_plugin'), $url, $image_filepath));
1637
  $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
1638
  @unlink($image_filepath); // delete file since failed upload may result in empty file created
1639
  }
1640
  else{
1641
  if($bundle_data['type'] == 'images'){
1642
- if( ! ($image_info = @getimagesize($image_filepath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
 
 
 
1643
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $url));
1644
  $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
1645
- @unlink($image_filepath);
1646
- } else {
1647
- $create_image = true;
1648
- $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
1649
  }
1650
  }
1651
  elseif($bundle_data['type'] == 'files'){
@@ -1669,10 +1716,25 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1669
 
1670
  if ($create_image){
1671
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1672
  $handle_image = array(
1673
  'file' => $image_filepath,
1674
  'url' => $targetUrl . '/' . $image_filename,
1675
- 'type' => ($bundle_data['type'] == 'images') ? image_type_to_mime_type($image_info[2]) : $wp_filetype['type']
1676
  ); //apply_filters( 'wp_handle_upload', , 'upload' );
1677
 
1678
  $logger and call_user_func($logger, sprintf(__('- Creating an attachment for image `%s`', 'wp_all_import_plugin'), $handle_image['url']));
@@ -1700,13 +1762,13 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1700
  $logger and call_user_func($logger, __('- <b>WARNING</b>', 'wp_all_import_plugin') . ': ' . $attid->get_error_message());
1701
  $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
1702
  } else {
1703
- wp_update_attachment_metadata($attid, wp_generate_attachment_metadata($attid, $handle_image['file']));
1704
  }
1705
 
1706
  }
1707
 
1708
- if ($attid)
1709
- {
1710
  if ($attch != null and empty($attch->post_parent)){
1711
  wp_update_post(
1712
  array(
@@ -1722,7 +1784,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1722
  if ( $this->options[$option_slug . 'set_image_meta_description'] and ! empty($img_descriptions[$k]) ) $update_attachment_meta['post_content'] = trim($img_descriptions[$k]);
1723
  if ( $this->options[$option_slug . 'set_image_meta_alt'] and ! empty($img_alts[$k]) ) update_post_meta($attid, '_wp_attachment_image_alt', trim($img_alts[$k]));
1724
 
1725
- if ( ! empty($update_attachment_meta)) $this->wpdb->update( $this->wpdb->posts, $update_attachment_meta, array('ID' => $attid) );
1726
 
1727
  $logger and call_user_func($logger, __('- <b>ACTION</b>: ' . $slug, 'wp_all_import_plugin'));
1728
  do_action( $slug, $pid, $attid, ($handle_image) ? $handle_image['file'] : $image_filepath, $is_keep_existing_images ? 'add_images' : 'update_images');
@@ -1863,8 +1925,10 @@ class PMXI_Import_Record extends PMXI_Model_Record {
1863
  $logger and call_user_func($logger, sprintf(__('- Filename for attachment was generated as %s', 'wp_all_import_plugin'), $attachment_filename));
1864
 
1865
  $request = get_file_curl(trim($atch_url), $attachment_filepath);
 
 
1866
 
1867
- if ( (is_wp_error($request) or $request === false) and ! @file_put_contents($attachment_filepath, @file_get_contents(trim($atch_url)))) {
1868
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: Attachment file %s cannot be saved locally as %s', 'wp_all_import_plugin'), trim($atch_url), $attachment_filepath));
1869
  is_wp_error($request) and $logger and call_user_func($logger, sprintf(__('- <b>WP Error</b>: %s', 'wp_all_import_plugin'), $request->get_error_message()));
1870
  $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
@@ -2217,7 +2281,7 @@ class PMXI_Import_Record extends PMXI_Model_Record {
2217
 
2218
  foreach ($missingPosts as $missingPost) {
2219
 
2220
- $missing_ids[] = $missingPost['post_id'];
2221
 
2222
  }
2223
 
@@ -2232,44 +2296,66 @@ class PMXI_Import_Record extends PMXI_Model_Record {
2232
 
2233
  $missing_ids_arr = array_chunk($missing_ids, $this->options['records_per_request']);
2234
 
2235
- foreach ($missing_ids_arr as $key => $ids) {
2236
 
2237
- if ( ! empty($ids) ) {
2238
 
2239
- foreach ( $ids as $k => $id ) {
2240
 
2241
  $to_delete = true;
2242
 
2243
  // Instead of deletion, set Custom Field
2244
  if ($this->options['is_update_missing_cf']){
2245
- update_post_meta( $id, $this->options['update_missing_cf_name'], $this->options['update_missing_cf_value'] );
2246
  $to_delete = false;
2247
- $logger and call_user_func($logger, sprintf(__('Instead of deletion post with ID `%s`, set Custom Field `%s` to value `%s`', 'wp_all_import_plugin'), $id, $this->options['update_missing_cf_name'], $this->options['update_missing_cf_value']));
2248
  }
2249
 
2250
- // Instead of deletion, change post status to Draft
2251
- $final_post_type = get_post_type($pid);
2252
- if ($this->options['set_missing_to_draft'] and $final_post_type != 'product_variation'){
2253
- $this->wpdb->update( $this->wpdb->posts, array('post_status' => 'draft'), array('ID' => $id) );
 
 
 
2254
  $to_delete = false;
2255
- $logger and call_user_func($logger, sprintf(__('Instead of deletion, change post with ID `%s` status to Draft', 'wp_all_import_plugin'), $id));
2256
  }
 
 
 
2257
  if ($to_delete){
2258
  // Remove attachments
2259
- empty($this->options['is_keep_attachments']) and wp_delete_attachments($id, true, 'files');
2260
  // Remove images
2261
- empty($this->options['is_keep_imgs']) and wp_delete_attachments($id, true, 'images');
2262
 
2263
  // Clear post's relationships
2264
- if ( $this->options['custom_type'] != "import_users" ) wp_delete_object_term_relationships($id, get_object_taxonomies('' != $this->options['custom_type'] ? $this->options['custom_type'] : 'post'));
2265
 
2266
  }
2267
- else{
2268
- unset($ids[$k]);
 
 
 
 
 
 
 
 
 
 
 
 
 
2269
  }
2270
  }
2271
 
2272
- if ( ! empty($ids) ){
 
 
 
 
2273
 
2274
  do_action('pmxi_delete_post', $ids);
2275
 
@@ -2297,14 +2383,14 @@ class PMXI_Import_Record extends PMXI_Model_Record {
2297
 
2298
  $this->set(array('deleted' => $this->deleted + count($ids)))->update();
2299
 
2300
- $logger and call_user_func($logger, sprintf(__('%d Posts deleted from database', 'wp_all_import_plugin'), $this->deleted));
2301
  }
2302
  }
2303
 
2304
- if ( PMXI_Plugin::is_ajax() and "ajax" == $this->options['import_processing'] and ! $this->options['is_update_missing_cf'] and ! $this->options['set_missing_to_draft']) break;
2305
  }
2306
 
2307
- return (count($missing_ids_arr) > 1 and "ajax" == $this->options['import_processing'] and ! $this->options['is_update_missing_cf'] and ! $this->options['set_missing_to_draft']) ? false : true;
2308
  }
2309
  }
2310
 
@@ -2372,15 +2458,19 @@ class PMXI_Import_Record extends PMXI_Model_Record {
2372
 
2373
  if (empty($assign_taxes)) return;
2374
 
2375
- foreach ($assign_taxes as $tt) {
2376
- $this->wpdb->insert( $this->wpdb->term_relationships, array( 'object_id' => $pid, 'term_taxonomy_id' => $tt ) );
2377
- $this->wpdb->query( "UPDATE {$this->wpdb->term_taxonomy} SET count = count + 1 WHERE term_taxonomy_id = $tt" );
2378
- }
2379
 
2380
  $values = array();
2381
  $term_order = 0;
2382
  foreach ( $assign_taxes as $tt )
2383
- $values[] = $this->wpdb->prepare( "(%d, %d, %d)", $pid, $tt, ++$term_order);
 
 
 
 
2384
 
2385
 
2386
  if ( $values ){
19
  $is_preprocess_enabled = apply_filters('is_xml_preprocess_enabled', true);
20
 
21
  if ($is_preprocess_enabled)
22
+ {
23
  $xml = preg_replace_callback('/<!\[CDATA\[[^\]\]]*\]\]>/s', 'wp_all_import_cdata_filter', $xml );
24
+ //$xml = preg_replace('/&(?![a-z#]+;)/i', '&amp;', $xml);
25
  $xml = preg_replace('/&([^amp;|^gt;|^lt;]+)/i', '&amp;$1', $xml);
26
+
27
  if ( ! empty(self::$cdata) ){
28
  foreach (self::$cdata as $key => $val) {
29
  $xml = str_replace('{{CPLACE_' . ($key + 1) . '}}', $val, $xml);
84
  parent::__construct($data);
85
  $this->setTable(PMXI_Plugin::getInstance()->getTablePrefix() . 'imports');
86
  $this->errors = new WP_Error();
87
+ }
88
+
89
  public $post_meta_to_insert = array();
90
 
91
  /**
495
  // apply mapping rules before splitting via separator symbol
496
  if ( ! empty($this->options['tax_enable_mapping'][$tx_name]) and ! empty($this->options['tax_logic_mapping'][$tx_name]) ){
497
  if ( ! empty( $mapping_rules) ){
498
+ foreach ($mapping_rules as $rule) {
499
  if ( ! empty($rule[trim($_tx)])){
500
  $_tx = trim($rule[trim($_tx)]);
501
  break;
621
  $images_bundle = array();
622
  $auto_rename_images_bundle = array();
623
  $auto_extensions_bundle = array();
624
+ $image_meta_titles_bundle = array();
625
+ $image_meta_captions_bundle = array();
626
+ $image_meta_alts_bundle = array();
627
+ $image_meta_descriptions_bundle = array();
628
  foreach ($image_sections as $section) {
629
  $chunk == 1 and $logger and call_user_func($logger, __('Composing URLs for ' . strtolower($section['title']) . '...', 'wp_all_import_plugin'));
630
  $featured_images = array();
655
  'files' => $featured_images
656
  );
657
 
658
+ // Composing images meta titles
 
659
  if ( $this->options[$section['slug'] . 'set_image_meta_title'] ){
660
  $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (titles)...', 'wp_all_import_plugin'));
661
  $image_meta_titles = array();
667
  $image_meta_titles_bundle[ empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $image_meta_titles;
668
  }
669
 
670
+ // Composing images meta captions
 
671
  if ( $this->options[$section['slug'] . 'set_image_meta_caption'] ){
672
  $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (captions)...', 'wp_all_import_plugin'));
673
  $image_meta_captions = array();
679
  $image_meta_captions_bundle[ empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $image_meta_captions;
680
  }
681
 
682
+ // Composing images meta alt text
 
683
  if ( $this->options[$section['slug'] . 'set_image_meta_alt'] ){
684
  $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (alt text)...', 'wp_all_import_plugin'));
685
  $image_meta_alts = array();
691
  $image_meta_alts_bundle[ empty($section['slug']) ? 'pmxi_gallery_image' : $section['slug']] = $image_meta_alts;
692
  }
693
 
694
+ // Composing images meta description
 
695
  if ( $this->options[$section['slug'] . 'set_image_meta_description'] ){
696
  $chunk == 1 and $logger and call_user_func($logger, __('Composing ' . strtolower($section['title']) . ' meta data (description)...', 'wp_all_import_plugin'));
697
  $image_meta_descriptions = array();
817
 
818
  $specified_records = array();
819
 
820
+ $simpleXml = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
821
+
822
+ $rootNodes = $simpleXml->xpath($cxpath);
823
+
824
  if ($this->options['is_import_specified']) {
825
  $chunk == 1 and $logger and call_user_func($logger, __('Calculate specified records to import...', 'wp_all_import_plugin'));
826
+ $import_specified_option = apply_filters('wp_all_import_specified_records', $this->options['import_specified'], $this->id, $rootNodes);
827
+ foreach (preg_split('% *, *%', $import_specified_option, -1, PREG_SPLIT_NO_EMPTY) as $chank) {
828
  if (preg_match('%^(\d+)-(\d+)$%', $chank, $mtch)) {
829
  $specified_records = array_merge($specified_records, range(intval($mtch[1]), intval($mtch[2])));
830
  } else {
832
  }
833
  }
834
 
835
+ }
 
 
 
 
836
 
837
+ foreach ($titles as $i => $void) {
838
 
839
  $custom_type_details = get_post_type_object( $post_type[$i] );
840
 
842
 
843
  $logger and call_user_func($logger, __('---', 'wp_all_import_plugin'));
844
  $logger and call_user_func($logger, sprintf(__('Record #%s', 'wp_all_import_plugin'), $this->imported + $this->skipped + $i + 1));
845
+
846
+ if ( "manual" == $this->options['duplicate_matching']
847
+ and ! empty($specified_records)
848
+ and ! in_array($created + $updated + $skipped + 1, $specified_records) )
849
+ {
850
+ $skipped++;
851
+ $logger and call_user_func($logger, __('<b>SKIPPED</b>: by specified records option', 'wp_all_import_plugin'));
852
+ $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
853
+ $logger and !$is_cron and PMXI_Plugin::$session->chunk_number++;
854
+ $logger and !$is_cron and PMXI_Plugin::$session->save_data();
855
+ continue;
856
+ }
857
 
858
  wp_cache_flush();
859
 
884
  'description' => $addons_data['PMUI_Plugin']['pmui_description'][$i],
885
  'nickname' => $addons_data['PMUI_Plugin']['pmui_nickname'][$i],
886
  'role' => ('' == $addons_data['PMUI_Plugin']['pmui_role'][$i]) ? 'subscriber' : strtolower($addons_data['PMUI_Plugin']['pmui_role'][$i]),
887
+ );
888
  $logger and call_user_func($logger, sprintf(__('Combine all data for user %s...', 'wp_all_import_plugin'), $articleData['user_login']));
889
  }
890
  else {
911
 
912
  // An array representation of current XML node
913
  $current_xml_node = wp_all_import_xml2array($rootNodes[$i]);
914
+
915
+ $check_for_duplicates = apply_filters('wp_all_import_is_check_duplicates', true, $this->id);
916
 
917
+ if ( $check_for_duplicates )
918
+ {
919
+ // if Auto Matching re-import option selected
920
+ if ( "manual" != $this->options['duplicate_matching'] ){
921
+
922
+ // find corresponding article among previously imported
923
+ $logger and call_user_func($logger, sprintf(__('Find corresponding article among previously imported for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
924
+ $postRecord->clear();
925
+ $postRecord->getBy(array(
926
+ 'unique_key' => $unique_keys[$i],
927
+ 'import_id' => $this->id,
928
+ ));
929
+
930
+ if ( ! $postRecord->isEmpty() ) {
931
+ $logger and call_user_func($logger, sprintf(__('Duplicate post was found for post %s with unique key `%s`...', 'wp_all_import_plugin'), $articleData['post_title'], $unique_keys[$i]));
932
+ if ( $this->options['custom_type'] == 'import_users'){
933
+ $post_to_update = get_user_by('id', $post_to_update_id = $postRecord->post_id);
934
+ }
935
+ else{
936
+ $post_to_update = get_post($post_to_update_id = $postRecord->post_id);
937
+ }
938
  }
939
  else{
940
+ $logger and call_user_func($logger, sprintf(__('Duplicate post wasn\'t found with unique key `%s`...', 'wp_all_import_plugin'), $unique_keys[$i]));
941
  }
942
+
943
+ // if Manual Matching re-import option seleted
944
+ } else {
945
+
946
+ if ('custom field' == $this->options['duplicate_indicator']) {
947
+ $custom_duplicate_value = XmlImportParser::factory($xml, $cxpath, $this->options['custom_duplicate_value'], $file)->parse($records); $tmp_files[] = $file;
948
+ $custom_duplicate_name = XmlImportParser::factory($xml, $cxpath, $this->options['custom_duplicate_name'], $file)->parse($records); $tmp_files[] = $file;
949
+ }
950
+ else{
951
+ count($titles) and $custom_duplicate_name = $custom_duplicate_value = array_fill(0, count($titles), '');
952
+ }
953
+
954
+ $logger and call_user_func($logger, sprintf(__('Find corresponding article among database for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
955
 
956
+ if ('pid' == $this->options['duplicate_indicator']) {
957
+ $duplicate_id = $post_ids[$i];
 
 
958
  }
959
+ // handle duplicates according to import settings
960
+ else
961
+ {
962
+ $duplicates = pmxi_findDuplicates($articleData, $custom_duplicate_name[$i], $custom_duplicate_value[$i], $this->options['duplicate_indicator']);
963
+ $duplicate_id = ( ! empty($duplicates)) ? array_shift($duplicates) : false;
964
+ }
965
+
966
+ if ( ! empty($duplicate_id)) {
967
+ $logger and call_user_func($logger, sprintf(__('Duplicate post was found for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
968
+ if ( $this->options['custom_type'] == 'import_users'){
969
+ $post_to_update = get_user_by('id', $post_to_update_id = $duplicate_id);
970
+ }
971
+ else{
972
+ $post_to_update = get_post($post_to_update_id = $duplicate_id);
973
+ }
974
+ }
975
  else{
976
+ $logger and call_user_func($logger, sprintf(__('Duplicate post wasn\'n found for post `%s`...', 'wp_all_import_plugin'), $articleData['post_title']));
977
  }
 
 
 
978
  }
979
+ }
980
 
981
  if ( ! empty($specified_records) ) {
982
 
999
 
1000
  $continue_import = true;
1001
 
1002
+ $continue_import = apply_filters('wp_all_import_is_post_to_update', $post_to_update_id, $current_xml_node, $this->id);
1003
 
1004
  if ( ! $continue_import ){
1005
 
1077
  if ( ! $this->options['is_update_slug']){
1078
  $articleData['post_name'] = $post_to_update->post_name;
1079
  $logger and call_user_func($logger, sprintf(__('Preserve slug of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
1080
+ }
1081
+ // Check for changed slugs for published post objects and save the old slug.
1082
+ if( ! empty($articleData['post_name']) and $articleData['post_name'] != $post_to_update->post_name)
1083
  {
1084
+ $old_slugs = (array) get_post_meta( $post_to_update_id, '_wp_old_slug' );
1085
+
1086
+ // If we haven't added this old slug before, add it now.
1087
+ if ( ! empty( $post_to_update->post_name ) && ! in_array( $post_to_update->post_name, $old_slugs ) ) {
1088
+ add_post_meta( $post_to_update_id, '_wp_old_slug', $post_to_update->post_name );
1089
+ }
1090
+
1091
+ // If the new slug was used previously, delete it from the list.
1092
+ if ( in_array( $articleData['post_name'], $old_slugs ) ) {
1093
+ delete_post_meta( $post_to_update_id, '_wp_old_slug', $articleData['post_name'] );
1094
+ }
1095
+ }
1096
+
1097
  if ( ! $this->options['is_update_excerpt']){
1098
  $articleData['post_excerpt'] = $post_to_update->post_excerpt;
1099
  $logger and call_user_func($logger, sprintf(__('Preserve excerpt of already existing article for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
1148
  // handle obsolete attachments (i.e. delete or keep) according to import settings
1149
  if ( $this->options['update_all_data'] == 'yes' or ( $this->options['update_all_data'] == 'no' and $this->options['is_update_images'] and $this->options['update_images_logic'] == "full_update")){
1150
  $logger and call_user_func($logger, sprintf(__('Deleting images for `%s`', 'wp_all_import_plugin'), $articleData['post_title']));
1151
+ $do_not_remove_images = ( $this->options['download_images'] == 'gallery' or $this->options['do_not_remove_images']) ? false : true;
1152
+ $missing_images = wp_delete_attachments($articleData['ID'], $do_not_remove_images, 'images');
1153
  }
1154
  }
1155
  }
1261
  if ( empty($articleData['ID']) )
1262
  {
1263
  $continue_import = true;
1264
+ $continue_import = apply_filters('wp_all_import_is_post_to_create', $current_xml_node, $this->id);
1265
 
1266
  if ( ! $continue_import ){
1267
  $skipped++;
1321
  set_post_format($pid, ("xpath" == $this->options['post_format']) ? $post_format[$i] : $this->options['post_format'] );
1322
  $logger and call_user_func($logger, sprintf(__('Associate post `%s` with post format %s ...', 'wp_all_import_plugin'), $articleData['post_title'], ("xpath" == $this->options['post_format']) ? $post_format[$i] : $this->options['post_format']));
1323
  }
1324
+ // [/post format]
1325
 
1326
  // [addons import]
1327
 
1357
  }
1358
  }
1359
 
1360
+ // [/addons import]
1361
 
1362
  // Page Template
1363
+ if ( ! empty($articleData['post_type']) and 'page' == $articleData['post_type'] and wp_all_import_is_update_cf('_wp_page_template', $this->options) and ( !empty($this->options['page_template']) or "no" == $this->options['is_multiple_page_template']) ){
1364
  update_post_meta($pid, '_wp_page_template', ("no" == $this->options['is_multiple_page_template']) ? $page_template[$i] : $this->options['page_template']);
1365
  }
1366
 
1367
  // [featured image]
1368
 
1369
+ $is_images_to_update = apply_filters('pmxi_is_images_to_update', true, $articleData, $current_xml_node);
1370
 
1371
+ $is_allow_import_images = apply_filters('wp_all_import_is_allow_import_images', false, empty($articleData['post_type']) ? '' : $articleData['post_type']);
1372
+
1373
+ if ( $is_images_to_update and ! empty($uploads) and false === $uploads['error'] and ( ! empty($articleData['post_type']) and $articleData['post_type'] == "product" and class_exists('PMWI_Plugin') or $is_allow_import_images) and (empty($articleData['ID']) or $this->options['update_all_data'] == "yes" or ( $this->options['update_all_data'] == "no" and $this->options['is_update_images'])) ) {
1374
 
 
 
1375
  if ( ! empty($images_bundle) ){
1376
 
1377
  require_once(ABSPATH . 'wp-admin/includes/image.php');
1386
 
1387
  $gallery_attachment_ids = array();
1388
 
1389
+ if ( ! empty($featured_images[$i]) ){
1390
 
1391
  $targetDir = $uploads['path'];
1392
  $targetUrl = $uploads['url'];
1393
 
1394
+ $logger and call_user_func($logger, __('<b>IMAGES:</b>', 'wp_all_import_plugin'));
1395
 
1396
  if ( ! @is_writable($targetDir) ){
1397
 
1488
 
1489
  $is_keep_existing_images = ( ! empty($articleData['ID']) and $this->options['is_update_images'] and $this->options['update_images_logic'] == "add_new" and $this->options['update_all_data'] == "no" and $is_show_add_new_images);
1490
 
1491
+ foreach ($imgs as $k => $img_url) {
1492
 
1493
  $attid = false;
1494
 
1495
  $attch = null;
1496
 
1497
  $url = trim($img_url);
1498
+
1499
+ if (empty($url)) continue;
1500
+
1501
+ $bn = wp_all_import_sanitize_filename(urldecode(basename($url)));
1502
 
1503
  if ( "yes" == $this->options[$option_slug . 'download_images'] and ! empty($auto_extensions_bundle[$slug][$i]) and preg_match('%^(jpg|jpeg|png|gif)$%i', $auto_extensions_bundle[$slug][$i])){
1504
  $img_ext = $auto_extensions_bundle[$slug][$i];
1512
  $logger and call_user_func($logger, sprintf(__('- Importing image `%s` for `%s` ...', 'wp_all_import_plugin'), $img_url, $articleData['post_title']));
1513
 
1514
  // generate local file name
1515
+ $image_name = urldecode(($this->options[$option_slug . 'auto_rename_images'] and !empty($auto_rename_images_bundle[$slug][$i])) ? sanitize_file_name(($img_ext) ? str_replace("." . $default_extension, "", $auto_rename_images_bundle[$slug][$i]) : $auto_rename_images_bundle[$slug][$i]) : sanitize_file_name((($img_ext) ? str_replace("." . $default_extension, "", $bn) : $bn))) . (("" != $img_ext) ? '.' . $img_ext : '');
1516
+ $image_name = apply_filters("wp_all_import_image_filename", $image_name, empty($img_titles[$k]) ? '' : $img_titles[$k], empty($img_captions[$k]) ? '' : $img_captions[$k], empty($img_alts[$k]) ? '' : $img_alts[$k], $articleData);
1517
+
1518
  // if wizard store image data to custom field
1519
  $create_image = false;
1520
  $download_image = true;
1529
  $image_filename = md5(time()) . '.jpg';
1530
  $image_filepath = $targetDir . '/' . $image_filename;
1531
  imagejpeg($img, $image_filepath);
1532
+ if( ! ($image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath)) or ! in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
1533
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $image_filepath));
1534
  $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
1535
  } else {
1537
  }
1538
  }
1539
  }
1540
+
1541
+ if ( ! $create_image ) {
1542
 
1543
  if ($this->options[$option_slug . 'auto_rename_images'] and !empty($auto_rename_images_bundle[$slug][$i]))
1544
  {
1549
  }
1550
 
1551
  $image_filename = wp_unique_filename($targetDir, $image_name);
1552
+ $image_filepath = $targetDir . '/' . $image_filename;
1553
 
1554
  // keep existing and add newest images
1555
  if ( $is_keep_existing_images ){
1626
  }
1627
  // validate import images
1628
  elseif($bundle_data['type'] == 'images'){
1629
+ if( preg_match('%\W(svg)$%i', basename($image_filepath)) or $image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath) and in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG)) ) {
 
 
 
 
1630
  $create_image = true;
1631
  $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully found', 'wp_all_import_plugin'), $wpai_image_path));
1632
  }
1633
+ else
1634
+ {
1635
+ $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $image_filepath));
1636
+ $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
1637
+ @unlink($image_filepath);
1638
+ }
1639
  }
1640
  }
1641
  }
1645
 
1646
  $request = get_file_curl($url, $image_filepath);
1647
 
1648
+ $get_ctx = stream_context_create(array('http' => array('timeout' => 5)));
1649
+
1650
+ if ( (is_wp_error($request) or $request === false) and ! @file_put_contents($image_filepath, @file_get_contents($url, false, $get_ctx))) {
1651
  @unlink($image_filepath); // delete file since failed upload may result in empty file created
1652
  } else{
1653
 
1654
+ if($bundle_data['type'] == 'images'){
1655
+ if( preg_match('%\W(svg)$%i', basename($image_filepath)) or $image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath) and in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
1656
  $create_image = true;
1657
  $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
1658
  }
1659
+ else
1660
+ {
1661
+ $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $url));
1662
+ $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
1663
+ }
1664
  }
1665
  elseif($bundle_data['type'] == 'files'){
1666
  if( $wp_filetype = wp_check_filetype(basename($image_filepath), null )) {
1671
 
1672
  }
1673
 
1674
+ if ( ! $create_image and $img_url !== pmxi_convert_encoding($img_url) ){
1675
 
1676
  $url = trim(pmxi_convert_encoding($img_url));
1677
 
1678
  $request = get_file_curl($url, $image_filepath);
1679
+
1680
+ $get_ctx = stream_context_create(array('http' => array('timeout' => 5)));
1681
 
1682
+ if ( (is_wp_error($request) or $request === false) and ! @file_put_contents($image_filepath, @file_get_contents($url, false, $get_ctx))) {
1683
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s cannot be saved locally as %s', 'wp_all_import_plugin'), $url, $image_filepath));
1684
  $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
1685
  @unlink($image_filepath); // delete file since failed upload may result in empty file created
1686
  }
1687
  else{
1688
  if($bundle_data['type'] == 'images'){
1689
+ if( preg_match('%\W(svg)$%i', basename($image_filepath)) or $image_info = apply_filters('pmxi_getimagesize', @getimagesize($image_filepath), $image_filepath) and in_array($image_info[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG))) {
1690
+ $create_image = true;
1691
+ $logger and call_user_func($logger, sprintf(__('- Image `%s` has been successfully downloaded', 'wp_all_import_plugin'), $url));
1692
+ } else {
1693
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: File %s is not a valid image and cannot be set as featured one', 'wp_all_import_plugin'), $url));
1694
  $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
1695
+ @unlink($image_filepath);
 
 
 
1696
  }
1697
  }
1698
  elseif($bundle_data['type'] == 'files'){
1716
 
1717
  if ($create_image){
1718
 
1719
+ $file_mime_type = '';
1720
+
1721
+ if ($bundle_data['type'] == 'images')
1722
+ {
1723
+ if ( ! empty($image_info) )
1724
+ {
1725
+ $file_mime_type = image_type_to_mime_type($image_info[2]);
1726
+ }
1727
+ $file_mime_type = apply_filters('wp_all_import_image_mime_type', $file_mime_type, $image_filepath);
1728
+ }
1729
+ else
1730
+ {
1731
+ $file_mime_type = $wp_filetype['type'];
1732
+ }
1733
+
1734
  $handle_image = array(
1735
  'file' => $image_filepath,
1736
  'url' => $targetUrl . '/' . $image_filename,
1737
+ 'type' => $file_mime_type
1738
  ); //apply_filters( 'wp_handle_upload', , 'upload' );
1739
 
1740
  $logger and call_user_func($logger, sprintf(__('- Creating an attachment for image `%s`', 'wp_all_import_plugin'), $handle_image['url']));
1762
  $logger and call_user_func($logger, __('- <b>WARNING</b>', 'wp_all_import_plugin') . ': ' . $attid->get_error_message());
1763
  $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
1764
  } else {
1765
+ wp_update_attachment_metadata($attid, wp_generate_attachment_metadata($attid, $handle_image['file']));
1766
  }
1767
 
1768
  }
1769
 
1770
+ if ($attid and ! is_wp_error($attid))
1771
+ {
1772
  if ($attch != null and empty($attch->post_parent)){
1773
  wp_update_post(
1774
  array(
1784
  if ( $this->options[$option_slug . 'set_image_meta_description'] and ! empty($img_descriptions[$k]) ) $update_attachment_meta['post_content'] = trim($img_descriptions[$k]);
1785
  if ( $this->options[$option_slug . 'set_image_meta_alt'] and ! empty($img_alts[$k]) ) update_post_meta($attid, '_wp_attachment_image_alt', trim($img_alts[$k]));
1786
 
1787
+ if ( ! empty($update_attachment_meta)) $this->wpdb->update( $this->wpdb->posts, $update_attachment_meta, array('ID' => $attid) );
1788
 
1789
  $logger and call_user_func($logger, __('- <b>ACTION</b>: ' . $slug, 'wp_all_import_plugin'));
1790
  do_action( $slug, $pid, $attid, ($handle_image) ? $handle_image['file'] : $image_filepath, $is_keep_existing_images ? 'add_images' : 'update_images');
1925
  $logger and call_user_func($logger, sprintf(__('- Filename for attachment was generated as %s', 'wp_all_import_plugin'), $attachment_filename));
1926
 
1927
  $request = get_file_curl(trim($atch_url), $attachment_filepath);
1928
+
1929
+ $get_ctx = stream_context_create(array('http' => array('timeout' => 5)));
1930
 
1931
+ if ( (is_wp_error($request) or $request === false) and ! @file_put_contents($attachment_filepath, @file_get_contents(trim($atch_url), false, $get_ctx))) {
1932
  $logger and call_user_func($logger, sprintf(__('- <b>WARNING</b>: Attachment file %s cannot be saved locally as %s', 'wp_all_import_plugin'), trim($atch_url), $attachment_filepath));
1933
  is_wp_error($request) and $logger and call_user_func($logger, sprintf(__('- <b>WP Error</b>: %s', 'wp_all_import_plugin'), $request->get_error_message()));
1934
  $logger and !$is_cron and PMXI_Plugin::$session->warnings++;
2281
 
2282
  foreach ($missingPosts as $missingPost) {
2283
 
2284
+ $missing_ids[] = $missingPost;
2285
 
2286
  }
2287
 
2296
 
2297
  $missing_ids_arr = array_chunk($missing_ids, $this->options['records_per_request']);
2298
 
2299
+ foreach ($missing_ids_arr as $key => $missingPostRecords) {
2300
 
2301
+ if ( ! empty($missingPostRecords) ) {
2302
 
2303
+ foreach ( $missingPostRecords as $k => $missingPostRecord ) {
2304
 
2305
  $to_delete = true;
2306
 
2307
  // Instead of deletion, set Custom Field
2308
  if ($this->options['is_update_missing_cf']){
2309
+ update_post_meta( $missingPostRecord['post_id'], $this->options['update_missing_cf_name'], $this->options['update_missing_cf_value'] );
2310
  $to_delete = false;
2311
+ $logger and call_user_func($logger, sprintf(__('Instead of deletion post with ID `%s`, set Custom Field `%s` to value `%s`', 'wp_all_import_plugin'), $missingPostRecord['post_id'], $this->options['update_missing_cf_name'], $this->options['update_missing_cf_value']));
2312
  }
2313
 
2314
+ // Instead of deletion, change post status to Draft
2315
+ if ($this->options['set_missing_to_draft']){
2316
+ if ($final_post_type = get_post_type($missingPostRecord['post_id']) and $final_post_type != 'product_variation')
2317
+ {
2318
+ $this->wpdb->update( $this->wpdb->posts, array('post_status' => 'draft'), array('ID' => $missingPostRecord['post_id']) );
2319
+ $logger and call_user_func($logger, sprintf(__('Instead of deletion, change post with ID `%s` status to Draft', 'wp_all_import_plugin'), $missingPostRecord['post_id']));
2320
+ }
2321
  $to_delete = false;
 
2322
  }
2323
+
2324
+ $to_delete = apply_filters('wp_all_import_is_post_to_delete', $to_delete, $missingPostRecord['post_id'], $this);
2325
+
2326
  if ($to_delete){
2327
  // Remove attachments
2328
+ empty($this->options['is_keep_attachments']) and wp_delete_attachments($missingPostRecord['post_id'], true, 'files');
2329
  // Remove images
2330
+ empty($this->options['is_keep_imgs']) and wp_delete_attachments($missingPostRecord['post_id'], true, 'images');
2331
 
2332
  // Clear post's relationships
2333
+ if ( $this->options['custom_type'] != "import_users" ) wp_delete_object_term_relationships($missingPostRecord['post_id'], get_object_taxonomies('' != $this->options['custom_type'] ? $this->options['custom_type'] : 'post'));
2334
 
2335
  }
2336
+ else
2337
+ {
2338
+
2339
+ $postRecord = new PMXI_Post_Record();
2340
+ $postRecord->getById($missingPostRecord['id']);
2341
+ if ( ! $postRecord->isEmpty() )
2342
+ {
2343
+ $postRecord->set(array(
2344
+ 'iteration' => $iteration
2345
+ ))->save();
2346
+ }
2347
+
2348
+ do_action('pmxi_missing_post', $missingPostRecord['post_id']);
2349
+
2350
+ unset($missingPostRecords[$k]);
2351
  }
2352
  }
2353
 
2354
+ if ( ! empty($missingPostRecords) ){
2355
+ $ids = array();
2356
+ foreach ($missingPostRecords as $k => $missingPostRecord) {
2357
+ $ids[] = $missingPostRecord['post_id'];
2358
+ }
2359
 
2360
  do_action('pmxi_delete_post', $ids);
2361
 
2383
 
2384
  $this->set(array('deleted' => $this->deleted + count($ids)))->update();
2385
 
2386
+ $logger and call_user_func($logger, sprintf(__('%d Posts deleted from database. IDs (%s)', 'wp_all_import_plugin'), $this->deleted, implode(",", $ids)));
2387
  }
2388
  }
2389
 
2390
+ if ( PMXI_Plugin::is_ajax() and "ajax" == $this->options['import_processing']) break;
2391
  }
2392
 
2393
+ return (count($missing_ids_arr) > 1 and "ajax" == $this->options['import_processing']) ? false : true;
2394
  }
2395
  }
2396
 
2458
 
2459
  if (empty($assign_taxes)) return;
2460
 
2461
+ // foreach ($assign_taxes as $tt) {
2462
+ // $this->wpdb->insert( $this->wpdb->term_relationships, array( 'object_id' => $pid, 'term_taxonomy_id' => $tt ) );
2463
+ // $this->wpdb->query( "UPDATE {$this->wpdb->term_taxonomy} SET count = count + 1 WHERE term_taxonomy_id = $tt" );
2464
+ // }
2465
 
2466
  $values = array();
2467
  $term_order = 0;
2468
  foreach ( $assign_taxes as $tt )
2469
+ {
2470
+ do_action('wp_all_import_associate_term', $pid, $tt, $tx_name);
2471
+ $values[] = $this->wpdb->prepare( "(%d, %d, %d)", $pid, $tt, ++$term_order);
2472
+ $this->wpdb->query( "UPDATE {$this->wpdb->term_taxonomy} SET count = count + 1 WHERE term_taxonomy_id = $tt" );
2473
+ }
2474
 
2475
 
2476
  if ( $values ){
plugin.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: WP All Import
4
  Plugin URI: http://www.wpallimport.com/upgrade-to-pro?utm_source=wordpress.org&utm_medium=plugins-page&utm_campaign=free+plugin
5
  Description: The most powerful solution for importing XML and CSV files to WordPress. Create Posts and Pages with content from any XML or CSV file. A paid upgrade to WP All Import Pro is available for support and additional features.
6
- Version: 3.3.5
7
  Author: Soflyy
8
  */
9
 
@@ -25,7 +25,7 @@ define('WP_ALL_IMPORT_ROOT_URL', rtrim(plugin_dir_url(__FILE__), '/'));
25
  */
26
  define('WP_ALL_IMPORT_PREFIX', 'pmxi_');
27
 
28
- define('PMXI_VERSION', '3.3.5');
29
 
30
  define('PMXI_EDITION', 'free');
31
 
@@ -1051,7 +1051,7 @@ final class PMXI_Plugin {
1051
  'is_update_parent' => 1,
1052
  'is_keep_attachments' => 0,
1053
  'is_keep_imgs' => 0,
1054
- 'do_not_remove_images' => 0,
1055
 
1056
  'is_update_custom_fields' => 1,
1057
  'update_custom_fields_logic' => 'full_update',
3
  Plugin Name: WP All Import
4
  Plugin URI: http://www.wpallimport.com/upgrade-to-pro?utm_source=wordpress.org&utm_medium=plugins-page&utm_campaign=free+plugin
5
  Description: The most powerful solution for importing XML and CSV files to WordPress. Create Posts and Pages with content from any XML or CSV file. A paid upgrade to WP All Import Pro is available for support and additional features.
6
+ Version: 3.3.6
7
  Author: Soflyy
8
  */
9
 
25
  */
26
  define('WP_ALL_IMPORT_PREFIX', 'pmxi_');
27
 
28
+ define('PMXI_VERSION', '3.3.6');
29
 
30
  define('PMXI_EDITION', 'free');
31
 
1051
  'is_update_parent' => 1,
1052
  'is_keep_attachments' => 0,
1053
  'is_keep_imgs' => 0,
1054
+ 'do_not_remove_images' => 1,
1055
 
1056
  'is_update_custom_fields' => 1,
1057
  'update_custom_fields_logic' => 'full_update',
readme.txt CHANGED
@@ -1,8 +1,8 @@
1
  === Import any XML or CSV File to WordPress ===
2
  Contributors: soflyy, wpallimport
3
  Requires at least: 4.1
4
- Tested up to: 4.4.2
5
- Stable tag: 3.3.5
6
  Tags: wordpress csv import, wordpress xml import, xml, csv, datafeed, import, migrate, import csv to wordpress, import xml to wordpress, advanced xml import, advanced csv import, bulk csv import, bulk xml import, bulk data import, xml to custom post type, csv to custom post type, woocommerce csv import, woocommerce xml import, csv import, import csv, xml import, import xml, csv importer
7
 
8
  WP All Import is an extremely powerful importer that makes it easy to import any XML or CSV file to WordPress.
@@ -105,6 +105,15 @@ Does it work with special character encoding like Hebrew, Arabic, Chinese, etc?
105
 
106
  == Changelog ==
107
 
 
 
 
 
 
 
 
 
 
108
  = 3.3.5 =
109
  - fixed 'Use images currently in Media Library' option
110
 
1
  === Import any XML or CSV File to WordPress ===
2
  Contributors: soflyy, wpallimport
3
  Requires at least: 4.1
4
+ Tested up to: 4.5.1
5
+ Stable tag: 3.3.6
6
  Tags: wordpress csv import, wordpress xml import, xml, csv, datafeed, import, migrate, import csv to wordpress, import xml to wordpress, advanced xml import, advanced csv import, bulk csv import, bulk xml import, bulk data import, xml to custom post type, csv to custom post type, woocommerce csv import, woocommerce xml import, csv import, import csv, xml import, import xml, csv importer
7
 
8
  WP All Import is an extremely powerful importer that makes it easy to import any XML or CSV file to WordPress.
105
 
106
  == Changelog ==
107
 
108
+ = 3.3.6 =
109
+ - added de_CH translation
110
+ - added support for .svg images
111
+ - added possibility for import excerpts for pages
112
+ - added new filter 'wp_all_import_specified_records'
113
+ - added new filter 'wp_all_import_is_post_to_delete'
114
+ - disable XMLReader stream filter for HHVM
115
+ - improve search for existing images in media gallery
116
+
117
  = 3.3.5 =
118
  - fixed 'Use images currently in Media Library' option
119
 
static/css/admin.css CHANGED
@@ -596,6 +596,10 @@
596
  margin-top: 5px;
597
  font-size:20px;
598
  }
 
 
 
 
599
  /*--------------------------------------------------------------------------
600
  *
601
  * Helpers
@@ -1390,6 +1394,13 @@
1390
  color: #555;
1391
  margin-top: 0;
1392
  }
 
 
 
 
 
 
 
1393
  .wpallimport-plugin #custom_type_selector .dd-option .dashicon-cpt:before,
1394
  .wpallimport-plugin #custom_type_selector .dd-selected .dashicon-cpt:before{
1395
  font-family: "dashicons";
596
  margin-top: 5px;
597
  font-size:20px;
598
  }
599
+ .wpallimport-plugin p.wpallimport-bundle-notice{
600
+ margin-top: 0;
601
+ margin-bottom: 15px;
602
+ }
603
  /*--------------------------------------------------------------------------
604
  *
605
  * Helpers
1394
  color: #555;
1395
  margin-top: 0;
1396
  }
1397
+ .wpallimport-plugin #custom_type_selector .dd-option .dashicon-shop_order:before,
1398
+ .wpallimport-plugin #custom_type_selector .dd-selected .dashicon-shop_order:before{
1399
+ font-family: "WooCommerce";
1400
+ content: "\e03d";
1401
+ color: #555;
1402
+ margin-top: 2px;
1403
+ }
1404
  .wpallimport-plugin #custom_type_selector .dd-option .dashicon-cpt:before,
1405
  .wpallimport-plugin #custom_type_selector .dd-selected .dashicon-cpt:before{
1406
  font-family: "dashicons";
static/js/admin.js CHANGED
@@ -671,8 +671,8 @@
671
 
672
  // Clear all detected custom fields
673
  $form.find('.clear_detected_cf').click(function(){
674
- if ($detected_cf.length){
675
- var parent = $(this).parents('.wpallimport-collapsed-content:first');
676
  for (var i = 0; i < $detected_cf.length; i++){
677
  parent.find('input[name^=custom_name]:visible').each(function(){
678
  if ($detected_cf[i].key == $(this).val()) $(this).parents('tr').first().remove();
@@ -1723,9 +1723,15 @@
1723
  matchBrackets: true,
1724
  mode: "application/x-httpd-php",
1725
  indentUnit: 4,
1726
- indentWithTabs: true
 
1727
  });
1728
- editor.setCursor(1);
 
 
 
 
 
1729
  }
1730
 
1731
  $('.wp_all_import_ajax_deletion').click(function(e){
671
 
672
  // Clear all detected custom fields
673
  $form.find('.clear_detected_cf').click(function(){
674
+ var parent = $(this).parents('.wpallimport-collapsed-content:first');
675
+ if ($detected_cf.length){
676
  for (var i = 0; i < $detected_cf.length; i++){
677
  parent.find('input[name^=custom_name]:visible').each(function(){
678
  if ($detected_cf[i].key == $(this).val()) $(this).parents('tr').first().remove();
1723
  matchBrackets: true,
1724
  mode: "application/x-httpd-php",
1725
  indentUnit: 4,
1726
+ indentWithTabs: true,
1727
+ lineWrapping: true
1728
  });
1729
+ editor.setCursor(1);
1730
+ $('.CodeMirror').resizable({
1731
+ resize: function() {
1732
+ editor.setSize("100%", $(this).height());
1733
+ }
1734
+ });
1735
  }
1736
 
1737
  $('.wp_all_import_ajax_deletion').click(function(e){
static/js/plupload/wplupload.js CHANGED
@@ -44,6 +44,8 @@ $.fn.wplupload = function($options) {
44
  $('#cancel-upload').removeAttr('disabled');
45
 
46
  //$('.auto-generate-template').removeAttr('rel').hide();
 
 
47
 
48
  $up.start();
49
  });
@@ -121,12 +123,12 @@ $.fn.wplupload = function($options) {
121
  else
122
  {
123
  $('.auto-generate-template').css({'display':'inline-block'}).attr('rel', 'upload_type');
124
- }
125
  }
126
  else
127
  {
128
  $('.auto-generate-template').hide();
129
- }
130
  }
131
  else
132
  {
@@ -137,11 +139,21 @@ $.fn.wplupload = function($options) {
137
 
138
  $('#progressbar').html('<span>Upload Complete</span> - ' + file.name + ' (' + ( (file.size / (1024*1024) >= 1) ? (file.size / (1024*1024)).toFixed(2) + 'mb' : (file.size / (1024)).toFixed(2) + 'kb') + ')');
139
 
140
- setTimeout(function() {
141
-
142
- $('.wpallimport-choose-file').find('.wpallimport-upload-resource-step-two').slideDown();
143
 
144
- $('.wpallimport-choose-file').find('.wpallimport-submit-buttons').show();
 
 
 
 
 
 
 
 
 
 
 
 
145
 
146
  if (r.OK) {
147
 
44
  $('#cancel-upload').removeAttr('disabled');
45
 
46
  //$('.auto-generate-template').removeAttr('rel').hide();
47
+
48
+ $('.wpallimport-upload-type-container[rel=upload_type]').find('.wpallimport-note').hide();
49
 
50
  $up.start();
51
  });
123
  else
124
  {
125
  $('.auto-generate-template').css({'display':'inline-block'}).attr('rel', 'upload_type');
126
+ }
127
  }
128
  else
129
  {
130
  $('.auto-generate-template').hide();
131
+ }
132
  }
133
  else
134
  {
139
 
140
  $('#progressbar').html('<span>Upload Complete</span> - ' + file.name + ' (' + ( (file.size / (1024*1024) >= 1) ? (file.size / (1024*1024)).toFixed(2) + 'mb' : (file.size / (1024)).toFixed(2) + 'kb') + ')');
141
 
142
+ setTimeout(function() {
 
 
143
 
144
+ if (r.post_type && r.notice !== false)
145
+ {
146
+ var $note = $('.wpallimport-upload-type-container[rel=upload_type]').find('.wpallimport-note');
147
+ $note.html("<div class='wpallimport-free-edition-notice'>" + r.notice + "</div>").show();
148
+ $('.wpallimport-choose-file').find('.wpallimport-submit-buttons').hide();
149
+ $('.wpallimport-choose-file').find('.wpallimport-upload-resource-step-two').slideUp();
150
+ $('input[name=filepath]').val('');
151
+ }
152
+ else
153
+ {
154
+ $('.wpallimport-choose-file').find('.wpallimport-upload-resource-step-two').slideDown();
155
+ $('.wpallimport-choose-file').find('.wpallimport-submit-buttons').show();
156
+ }
157
 
158
  if (r.OK) {
159
 
views/admin/import/index.php CHANGED
@@ -100,6 +100,7 @@ $l10n = array(
100
  </div>
101
  </div>
102
  </div>
 
103
  </div>
104
  <div class="wpallimport-upload-type-container" rel="url_type">
105
  <div class="wpallimport-file-type-options">
@@ -169,7 +170,7 @@ $l10n = array(
169
 
170
  $custom_types = get_post_types(array('_builtin' => true), 'objects') + get_post_types(array('_builtin' => false, 'show_ui' => true), 'objects');
171
  foreach ($custom_types as $key => $ct) {
172
- if (in_array($key, array('attachment', 'revision', 'nav_menu_item'))) unset($custom_types[$key]);
173
  }
174
  $custom_types = apply_filters( 'pmxi_custom_types', $custom_types );
175
 
@@ -193,13 +194,31 @@ $l10n = array(
193
  </div>
194
  <select name="custom_type_selector" id="custom_type_selector" class="wpallimport-post-types">
195
  <?php if ( ! empty($custom_types)): ?>
196
- <?php foreach ($custom_types as $key => $cpt) :?>
197
  <?php
198
  $image_src = 'dashicon-cpt';
199
- if ( in_array($key, array('post', 'page', 'product', 'import_users') ) )
200
- $image_src = 'dashicon-' . $key;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
  ?>
202
- <option value="<?php echo $key; ?>" data-imagesrc="dashicon <?php echo $image_src; ?>"><?php echo $cpt->labels->name; ?></option>
203
  <?php endforeach; ?>
204
  <?php endif; ?>
205
  <?php if ( ! empty($hidden_post_types)): ?>
100
  </div>
101
  </div>
102
  </div>
103
+ <div class="wpallimport-note" style="margin: 0 auto; font-size: 13px;"></div>
104
  </div>
105
  <div class="wpallimport-upload-type-container" rel="url_type">
106
  <div class="wpallimport-file-type-options">
170
 
171
  $custom_types = get_post_types(array('_builtin' => true), 'objects') + get_post_types(array('_builtin' => false, 'show_ui' => true), 'objects');
172
  foreach ($custom_types as $key => $ct) {
173
+ if (in_array($key, array('attachment', 'revision', 'nav_menu_item', 'shop_coupon'))) unset($custom_types[$key]);
174
  }
175
  $custom_types = apply_filters( 'pmxi_custom_types', $custom_types );
176
 
194
  </div>
195
  <select name="custom_type_selector" id="custom_type_selector" class="wpallimport-post-types">
196
  <?php if ( ! empty($custom_types)): ?>
197
+ <?php foreach ($custom_types as $key => $ct) :?>
198
  <?php
199
  $image_src = 'dashicon-cpt';
200
+
201
+ $cpt = $key;
202
+ $cpt_label = $ct->labels->name;
203
+
204
+ if (class_exists('WooCommerce'))
205
+ {
206
+ if ($key == 'product')
207
+ {
208
+ $cpt = 'shop_order';
209
+ $cpt_label = $custom_types['shop_order']->labels->name;
210
+ }
211
+ elseif($key == 'shop_order')
212
+ {
213
+ $cpt = 'product';
214
+ $cpt_label = $custom_types['product']->labels->name;
215
+ }
216
+ }
217
+
218
+ if ( in_array($cpt, array('post', 'page', 'product', 'import_users', 'shop_order') ) )
219
+ $image_src = 'dashicon-' . $cpt;
220
  ?>
221
+ <option value="<?php echo $cpt; ?>" data-imagesrc="dashicon <?php echo $image_src; ?>"><?php echo $cpt_label; ?></option>
222
  <?php endforeach; ?>
223
  <?php endif; ?>
224
  <?php if ( ! empty($hidden_post_types)): ?>
views/admin/import/options/_settings_template.php CHANGED
@@ -49,7 +49,7 @@
49
 
50
  $custom_types = get_post_types(array('_builtin' => true), 'objects') + get_post_types(array('_builtin' => false, 'show_ui' => true), 'objects');
51
  foreach ($custom_types as $key => $ct) {
52
- if (in_array($key, array('attachment', 'revision', 'nav_menu_item'))) unset($custom_types[$key]);
53
  }
54
  $custom_types = apply_filters( 'pmxi_custom_types', $custom_types );
55
 
49
 
50
  $custom_types = get_post_types(array('_builtin' => true), 'objects') + get_post_types(array('_builtin' => false, 'show_ui' => true), 'objects');
51
  foreach ($custom_types as $key => $ct) {
52
+ if (in_array($key, array('attachment', 'revision', 'nav_menu_item', 'shop_coupon'))) unset($custom_types[$key]);
53
  }
54
  $custom_types = apply_filters( 'pmxi_custom_types', $custom_types );
55
 
views/admin/import/template.php CHANGED
@@ -62,7 +62,7 @@
62
  </div>
63
  </div>
64
 
65
- <?php if ($post_type != 'page'):?>
66
  <div class="template_input">
67
  <input type="text" name="post_excerpt" style="width:100%; line-height: 25px;" value="<?php echo esc_attr($post['post_excerpt']) ?>" placeholder="<?php echo ($post_type == 'product' and class_exists('PMWI_Plugin')) ? __('WooCommerce Short Description', 'wp_all_import_plugin') : __('Excerpt', 'wp_all_import_plugin'); ?>"/>
68
  </div>
62
  </div>
63
  </div>
64
 
65
+ <?php if ( post_type_supports( $post_type, 'excerpt' ) ):?>
66
  <div class="template_input">
67
  <input type="text" name="post_excerpt" style="width:100%; line-height: 25px;" value="<?php echo esc_attr($post['post_excerpt']) ?>" placeholder="<?php echo ($post_type == 'product' and class_exists('PMWI_Plugin')) ? __('WooCommerce Short Description', 'wp_all_import_plugin') : __('Excerpt', 'wp_all_import_plugin'); ?>"/>
68
  </div>
views/admin/import/template/_featured_template.php CHANGED
@@ -46,7 +46,7 @@
46
  <label for="<?php echo $section_slug; ?>featured_delim"><?php _e('Enter image filenames one per line, or separate them with a ', 'wp_all_import_plugin');?></label>
47
  <input type="text" class="small" id="<?php echo $section_slug; ?>featured_delim" name="<?php echo $section_slug; ?>featured_delim" value="<?php echo esc_attr($post[$section_slug . 'featured_delim']) ?>" style="width:5%; text-align:center;"/>
48
  <textarea name="<?php echo $section_slug; ?>featured_image" class="newline rad4" style="clear: both; display:block; "><?php echo esc_attr($post[$section_slug . 'featured_image']) ?></textarea>
49
- </div>
50
  </div>
51
  <h4><?php _e('Image Options', 'wp_all_import_plugin'); ?></h4>
52
  <div class="search_through_the_media_library">
@@ -57,9 +57,9 @@
57
  <a href="#help" class="wpallimport-help" title="<?php _e('If an image with the same file name is found in the Media Library then that image will be attached to this record instead of importing a new image. Disable this setting if your import has different images with the same file name.', 'wp_all_import_plugin') ?>" style="position: relative; top: -2px;">?</a>
58
  </div>
59
  <div class="input" style="margin: 3px;">
60
- <input type="hidden" name="do_not_remove_images" value="0" />
61
- <input type="checkbox" id="do_not_remove_images" name="do_not_remove_images" value="1" <?php echo $post['do_not_remove_images'] ? 'checked="checked"': '' ?> />
62
- <label for="do_not_remove_images"><?php _e('Keep images currently in Media Library', 'wp_all_import_plugin') ?></label>
63
  <a href="#help" class="wpallimport-help" title="<?php _e('If disabled, images attached to imported posts will be deleted and then all images will be imported.', 'wp_all_import_plugin') ?>" style="position:relative; top: -2px;">?</a>
64
  </div>
65
  </div>
@@ -78,7 +78,7 @@
78
  <input type="checkbox" id="<?php echo $section_slug; ?>create_draft" name="<?php echo $section_slug; ?>create_draft" value="yes" <?php echo 'yes' == $post[$section_slug . 'create_draft'] ? 'checked="checked"' : '' ?> class="fix_checkbox"/>
79
  <label for="<?php echo $section_slug; ?>create_draft"><?php _e('If no images are downloaded successfully, create entry as Draft.', 'wp_all_import_plugin') ?></label>
80
  </div>
81
- <?php endif; ?>
82
  </td>
83
  </tr>
84
  </table>
@@ -135,13 +135,13 @@
135
  <label for="<?php echo $section_slug; ?>set_image_meta_description"><?php _e('Set Description(s)','wp_all_import_plugin');?></label>
136
  <div class="switcher-target-<?php echo $section_slug; ?>set_image_meta_description" style="padding-left:23px;">
137
  <div class="input">
138
- <input id="image_meta_description_delim_logic_separate" type="radio" name="image_meta_description_delim_logic" value="separate" <?php echo ($post[$section_slug . 'image_meta_description_delim_logic'] == 'separate' and ! empty($post[$section_slug . 'image_meta_description_delim'])) ? 'checked="checked"' : ''; ?>/>
139
- <label for="image_meta_description_delim_logic_separate"><?php _e('Separate them with a', 'wp_all_import_plugin'); ?></label>
140
  <input type="text" class="small" id="<?php echo $section_slug; ?>image_meta_description_delim" name="<?php echo $section_slug; ?>image_meta_description_delim" value="<?php echo esc_attr($post[$section_slug . 'image_meta_description_delim']) ?>" style="width:5%; text-align:center;"/>
141
  </div>
142
  <div class="input">
143
- <input id="image_meta_description_delim_logic_line" type="radio" name="image_meta_description_delim_logic" value="line" <?php echo ($post[$section_slug . 'image_meta_description_delim_logic'] == 'line' or empty($post[$section_slug . 'image_meta_description_delim'])) ? 'checked="checked"' : ''; ?>/>
144
- <label for="image_meta_description_delim_logic_line"><?php _e('Enter them one per line', 'wp_all_import_plugin'); ?></label>
145
  </div>
146
  <p style="margin-bottom:5px;"><?php _e('The first description will be linked to the first image, the second description will be linked to the second image, ...', 'wp_all_import_plugin');?></p>
147
  <textarea name="<?php echo $section_slug; ?>image_meta_description" class="newline rad4"><?php echo esc_attr($post[$section_slug . 'image_meta_description']) ?></textarea>
46
  <label for="<?php echo $section_slug; ?>featured_delim"><?php _e('Enter image filenames one per line, or separate them with a ', 'wp_all_import_plugin');?></label>
47
  <input type="text" class="small" id="<?php echo $section_slug; ?>featured_delim" name="<?php echo $section_slug; ?>featured_delim" value="<?php echo esc_attr($post[$section_slug . 'featured_delim']) ?>" style="width:5%; text-align:center;"/>
48
  <textarea name="<?php echo $section_slug; ?>featured_image" class="newline rad4" style="clear: both; display:block; "><?php echo esc_attr($post[$section_slug . 'featured_image']) ?></textarea>
49
+ </div>
50
  </div>
51
  <h4><?php _e('Image Options', 'wp_all_import_plugin'); ?></h4>
52
  <div class="search_through_the_media_library">
57
  <a href="#help" class="wpallimport-help" title="<?php _e('If an image with the same file name is found in the Media Library then that image will be attached to this record instead of importing a new image. Disable this setting if your import has different images with the same file name.', 'wp_all_import_plugin') ?>" style="position: relative; top: -2px;">?</a>
58
  </div>
59
  <div class="input" style="margin: 3px;">
60
+ <input type="hidden" name="<?php echo $section_slug; ?>do_not_remove_images" value="0" />
61
+ <input type="checkbox" id="<?php echo $section_slug; ?>do_not_remove_images" name="<?php echo $section_slug; ?>do_not_remove_images" value="1" <?php echo $post[$section_slug . 'do_not_remove_images'] ? 'checked="checked"': '' ?> />
62
+ <label for="<?php echo $section_slug; ?>do_not_remove_images"><?php _e('Keep images currently in Media Library', 'wp_all_import_plugin') ?></label>
63
  <a href="#help" class="wpallimport-help" title="<?php _e('If disabled, images attached to imported posts will be deleted and then all images will be imported.', 'wp_all_import_plugin') ?>" style="position:relative; top: -2px;">?</a>
64
  </div>
65
  </div>
78
  <input type="checkbox" id="<?php echo $section_slug; ?>create_draft" name="<?php echo $section_slug; ?>create_draft" value="yes" <?php echo 'yes' == $post[$section_slug . 'create_draft'] ? 'checked="checked"' : '' ?> class="fix_checkbox"/>
79
  <label for="<?php echo $section_slug; ?>create_draft"><?php _e('If no images are downloaded successfully, create entry as Draft.', 'wp_all_import_plugin') ?></label>
80
  </div>
81
+ <?php endif; ?>
82
  </td>
83
  </tr>
84
  </table>
135
  <label for="<?php echo $section_slug; ?>set_image_meta_description"><?php _e('Set Description(s)','wp_all_import_plugin');?></label>
136
  <div class="switcher-target-<?php echo $section_slug; ?>set_image_meta_description" style="padding-left:23px;">
137
  <div class="input">
138
+ <input id="<?php echo $section_slug; ?>image_meta_description_delim_logic_separate" type="radio" name="<?php echo $section_slug; ?>image_meta_description_delim_logic" value="separate" <?php echo ($post[$section_slug . 'image_meta_description_delim_logic'] == 'separate' and ! empty($post[$section_slug . 'image_meta_description_delim'])) ? 'checked="checked"' : ''; ?>/>
139
+ <label for="<?php echo $section_slug; ?>image_meta_description_delim_logic_separate"><?php _e('Separate them with a', 'wp_all_import_plugin'); ?></label>
140
  <input type="text" class="small" id="<?php echo $section_slug; ?>image_meta_description_delim" name="<?php echo $section_slug; ?>image_meta_description_delim" value="<?php echo esc_attr($post[$section_slug . 'image_meta_description_delim']) ?>" style="width:5%; text-align:center;"/>
141
  </div>
142
  <div class="input">
143
+ <input id="<?php echo $section_slug; ?>image_meta_description_delim_logic_line" type="radio" name="<?php echo $section_slug; ?>image_meta_description_delim_logic" value="line" <?php echo ($post[$section_slug . 'image_meta_description_delim_logic'] == 'line' or empty($post[$section_slug . 'image_meta_description_delim'])) ? 'checked="checked"' : ''; ?>/>
144
+ <label for="<?php echo $section_slug; ?>image_meta_description_delim_logic_line"><?php _e('Enter them one per line', 'wp_all_import_plugin'); ?></label>
145
  </div>
146
  <p style="margin-bottom:5px;"><?php _e('The first description will be linked to the first image, the second description will be linked to the second image, ...', 'wp_all_import_plugin');?></p>
147
  <textarea name="<?php echo $section_slug; ?>image_meta_description" class="newline rad4"><?php echo esc_attr($post[$section_slug . 'image_meta_description']) ?></textarea>
views/admin/import/template/_other_template.php CHANGED
@@ -9,8 +9,8 @@
9
  <table class="form-table" style="max-width:none;">
10
  <tr>
11
  <td>
12
- <input type="hidden" name="encoding" value="<?php echo ($isWizard) ? PMXI_Plugin::$session->encoding : $post['encoding']; ?>"/>
13
- <input type="hidden" name="delimiter" value="<?php echo ($isWizard) ? PMXI_Plugin::$session->is_csv : $post['delimiter']; ?>"/>
14
 
15
  <?php $is_support_post_format = ( current_theme_supports( 'post-formats' ) && post_type_supports( $post_type, 'post-formats' ) ) ? true : false; ?>
16
 
9
  <table class="form-table" style="max-width:none;">
10
  <tr>
11
  <td>
12
+ <input type="hidden" name="encoding" value="<?php echo ($this->isWizard) ? PMXI_Plugin::$session->encoding : $post['encoding']; ?>"/>
13
+ <input type="hidden" name="delimiter" value="<?php echo ($this->isWizard) ? PMXI_Plugin::$session->is_csv : $post['delimiter']; ?>"/>
14
 
15
  <?php $is_support_post_format = ( current_theme_supports( 'post-formats' ) && post_type_supports( $post_type, 'post-formats' ) ) ? true : false; ?>
16