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 | 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 +6 -4
- classes/PHPExcel/CachedObjectStorage/Wincache.php +294 -294
- classes/PHPExcel/locale/sv/functions +408 -408
- classes/api.php +6 -7
- classes/arraytoxml.php +2 -1
- classes/chunk.php +8 -6
- classes/config.php +4 -1
- classes/upload.php +140 -79
- controllers/admin/import.php +10 -4
- controllers/admin/manage.php +4 -0
- controllers/admin/settings.php +46 -6
- controllers/controller/admin.php +1 -1
- helpers/functions.php +1 -0
- helpers/get_file_curl.php +29 -23
- helpers/pmxi_findDuplicates.php +3 -3
- helpers/wp_all_import_get_image_from_gallery.php +19 -7
- helpers/wp_all_import_is_json.php +28 -25
- helpers/wp_all_import_secure_file.php +1 -1
- helpers/wp_all_import_template_notifications.php +1 -1
- i18n/languages/wp_all_import_plugin-de_CH.po +1 -1
- i18n/languages/wp_all_import_plugin-de_DE.mo +0 -0
- i18n/languages/wp_all_import_plugin-de_DE.po +2 -2
- i18n/languages/wp_all_import_plugin-es_ES.mo +0 -0
- i18n/languages/wp_all_import_plugin-es_ES.po +2 -2
- libraries/XmlImportConfig.php +1 -1
- models/import/record.php +233 -143
- plugin.php +3 -3
- readme.txt +11 -2
- static/css/admin.css +11 -0
- static/js/admin.js +10 -4
- static/js/plupload/wplupload.js +18 -6
- views/admin/import/index.php +24 -5
- views/admin/import/options/_settings_template.php +1 -1
- views/admin/import/template.php +1 -1
- views/admin/import/template/_featured_template.php +9 -9
- views/admin/import/template/_other_template.php +2 -2
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 =
|
128 |
|
129 |
$request = get_file_curl($url, $image_filepath);
|
130 |
|
131 |
-
|
|
|
|
|
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 |
-
$
|
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 =
|
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 |
-
|
|
|
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 |
-
|
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 |
-
$
|
|
|
|
|
|
|
|
|
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 |
-
|
65 |
-
|
|
|
|
|
|
|
66 |
if ( strpos(basename($unzipped_file['stored_filename']), 'WP All Import Template') === 0 || strpos(basename($unzipped_file['stored_filename']), 'templates_') === 0 )
|
67 |
{
|
68 |
-
$
|
69 |
|
70 |
-
$
|
|
|
|
|
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 |
-
'
|
|
|
|
|
80 |
'post_type' => (!empty($options)) ? $options['custom_type'] : false,
|
81 |
'is_empty_bundle_file' => true
|
82 |
);
|
83 |
}
|
84 |
-
|
85 |
}
|
86 |
-
|
87 |
-
{
|
88 |
-
$filePath
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
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 |
-
$
|
305 |
|
306 |
$source['path'] = wp_all_import_get_relative_path($source['path']);
|
|
|
|
|
307 |
|
308 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
309 |
|
310 |
return array(
|
311 |
-
'filePath'
|
312 |
-
'
|
|
|
313 |
'root_element' => $this->root_element,
|
314 |
-
'is_csv'
|
315 |
-
'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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 =
|
6 |
|
7 |
if ( ! preg_match('%^(http|ftp)s?://%i', $url) ) return;
|
8 |
|
9 |
-
$
|
10 |
|
11 |
-
if ( ! is_wp_error($
|
12 |
-
|
13 |
-
$rawdata = wp_remote_retrieve_body( $
|
14 |
|
15 |
-
if (empty($rawdata))
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
|
|
|
|
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 =
|
33 |
-
if ( ! $result and
|
34 |
-
|
35 |
-
|
|
|
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
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
}
|
52 |
|
53 |
-
return ($curl === false) ? $
|
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
|
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
|
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
|
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
|
11 |
}
|
12 |
|
13 |
-
|
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 |
-
|
21 |
-
|
22 |
-
|
|
|
|
|
23 |
|
24 |
-
|
|
|
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 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
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 |
-
@
|
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 "
|
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 "
|
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', '&', $xml);
|
25 |
$xml = preg_replace('/&([^amp;|^gt;|^lt;]+)/i', '&$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 |
-
|
|
|
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 |
-
|
903 |
-
|
904 |
-
|
905 |
-
|
906 |
-
|
907 |
-
|
908 |
-
|
909 |
-
|
910 |
-
|
911 |
-
|
912 |
-
|
913 |
-
|
914 |
-
|
915 |
-
if ( $
|
916 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
917 |
}
|
918 |
else{
|
919 |
-
$
|
920 |
}
|
921 |
-
|
922 |
-
|
923 |
-
|
924 |
-
|
925 |
-
|
926 |
-
|
927 |
-
|
928 |
-
|
929 |
-
|
930 |
-
|
931 |
-
|
932 |
-
|
933 |
-
|
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 |
-
|
950 |
-
|
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 |
-
$
|
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 |
-
|
|
|
1064 |
{
|
1065 |
-
|
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 |
-
$
|
|
|
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) {
|
1461 |
|
1462 |
$attid = false;
|
1463 |
|
1464 |
$attch = null;
|
1465 |
|
1466 |
$url = trim($img_url);
|
1467 |
-
|
|
|
|
|
|
|
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 =
|
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 |
-
|
|
|
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(
|
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 |
-
|
|
|
|
|
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(
|
|
|
|
|
|
|
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' =>
|
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
|
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 => $
|
2236 |
|
2237 |
-
if ( ! empty($
|
2238 |
|
2239 |
-
foreach ( $
|
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( $
|
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'), $
|
2248 |
}
|
2249 |
|
2250 |
-
// Instead of deletion, change post status to Draft
|
2251 |
-
|
2252 |
-
|
2253 |
-
|
|
|
|
|
|
|
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($
|
2260 |
// Remove images
|
2261 |
-
empty($this->options['is_keep_imgs']) and wp_delete_attachments($
|
2262 |
|
2263 |
// Clear post's relationships
|
2264 |
-
if ( $this->options['custom_type'] != "import_users" ) wp_delete_object_term_relationships($
|
2265 |
|
2266 |
}
|
2267 |
-
else
|
2268 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2269 |
}
|
2270 |
}
|
2271 |
|
2272 |
-
if ( ! empty($
|
|
|
|
|
|
|
|
|
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']
|
2305 |
}
|
2306 |
|
2307 |
-
return (count($missing_ids_arr) > 1 and "ajax" == $this->options['import_processing']
|
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 |
-
|
2377 |
-
|
2378 |
-
}
|
2379 |
|
2380 |
$values = array();
|
2381 |
$term_order = 0;
|
2382 |
foreach ( $assign_taxes as $tt )
|
2383 |
-
|
|
|
|
|
|
|
|
|
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', '&', $xml);
|
25 |
$xml = preg_replace('/&([^amp;|^gt;|^lt;]+)/i', '&$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.
|
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.
|
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' =>
|
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.
|
5 |
-
Stable tag: 3.3.
|
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 |
-
|
675 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 => $
|
197 |
<?php
|
198 |
$image_src = 'dashicon-cpt';
|
199 |
-
|
200 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
201 |
?>
|
202 |
-
<option value="<?php echo $
|
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
|
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 |
|