Passed
Push — master ( 037742...36c501 )
by Warwick
02:17
created

LSX_WETU_Importer::wetu_status()   A

Complexity

Conditions 5
Paths 3

Size

Total Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
nc 3
nop 0
dl 0
loc 19
rs 9.3222
c 0
b 0
f 0
1
<?php
2
/**
3
 * The main plugin class.
4
 *
5
 * @package   LSX_WETU_Importer
6
 * @author    LightSpeed
7
 * @license   GPL-2.0+
8
 * @link
9
 * @copyright 2016 LightSpeed
10
 */
11
/**
12
 * The Main plugin class.
13
 */
14
class LSX_WETU_Importer {
15
16
	/**
17
	 * Holds class instance
18
	 *
19
	 * @since 1.0.0
20
	 *
21
	 * @var      object|Module_Template
22
	 */
23
	protected static $instance = null;
24
25
	/**
26
	 * The slug for this plugin
27
	 *
28
	 * @since 0.0.1
29
	 *
30
	 * @var      string
31
	 */
32
	public $plugin_slug = 'lsx-wetu-importer';
33
34
	/**
35
	 * The url to list items from WETU
36
	 *
37
	 * @since 0.0.1
38
	 *
39
	 * @var      string
40
	 */
41
	public $tab_slug = 'default';
42
43
	/**
44
	 * The options for the plugin
45
	 *
46
	 * @since 0.0.1
47
	 *
48
	 * @var      string
49
	 */
50
	public $options = false;
51
52
	/**
53
	 * The url to import images from WETU
54
	 *
55
	 * @since 0.0.1
56
	 *
57
	 * @var      string
58
	 */
59
	public $import_scaling_url = false;
60
61
	/**
62
	 * scale the images on import or not
63
	 *
64
	 * @since 0.0.1
65
	 *
66
	 * @var      boolean
67
	 */
68
	public $scale_images = false;
69
70
	/**
71
	 * The WETU API Key
72
	 */
73
	public $api_key = false;
74
75
	/**
76
	 * The post types this works with.
77
	 */
78
	public $post_types = array();
79
80
	/**
81
	 * The previously attached images
82
	 *
83
	 * @var      array()
84
	 */
85
	public $found_attachments = array();
86
87
	/**
88
	 * The gallery ids for the found attachements
89
	 *
90
	 * @var      array()
91
	 */
92
	public $gallery_meta = array();
93
94
	/**
95
	 * The post ids to clean up (make sure the connected items are only singular)
96
	 *
97
	 * @var      array()
98
	 */
99
	public $cleanup_posts = array();
100
101
	/**
102
	 * A post => parent relationship array.
103
	 *
104
	 * @var      array()
105
	 */
106
	public $relation_meta = array();
107
108
	/**
109
	 * Image Limit
110
	 *
111
	 * @var      int
112
	 */
113
	public $image_limit = false;
114
115
	/**
116
	 * the featured image id
117
	 *
118
	 * @var      int
119
	 */
120
	public $featured_image = false;
121
122
	/**
123
	 * the banner image
124
	 *
125
	 * @var      int
126
	 */
127
	public $banner_image = false;
128
129
	/**
130
	 * Holds the current import to display
131
	 *
132
	 * @var      int
133
	 */
134
	public $current_importer = false;
135
136
	/**
137
	 * if you ran a tour import then you will have accommodation and destination queued to sync as well.
138
	 *
139
	 * @var      int
140
	 */
141
	public $queued_imports = array();
142
143
	/**
144
	 * An Array to hold the items to queue
145
	 *
146
	 * @var      int
147
	 */
148
	public $import_queue = array();
149
150
	/**
151
	 * Holds the current post that is being imported. Use to check the content and excerpt.
152
	 *
153
	 * @var      int
154
	 */
155
	public $current_post = false;
156
157
	/**
158
	 * Holds the accommodation settings
159
	 *
160
	 * @var      int
161
	 */
162
	public $accommodation_settings = false;
163
164
	/**
165
	 * Holds the tour settings
166
	 *
167
	 * @var      int
168
	 */
169
	public $tour_settings = false;
170
171
	/**
172
	 * Holds the destination settings
173
	 *
174
	 * @var      int
175
	 */
176
	public $destination_settings = false;
177
178
	/**
179
	 * Hold the flag to let you know if the debug is enabled or not.
180
	 *
181
	 * @var      int
182
	 */
183
	public $debug_enabled = false;
184
185
	/**
186
	 * Logger Class
187
	 *
188
	 * @var      \lsx\LSX_Logger
189
	 */
190
	public $logger = false;
191
192
	/**
193
	 * Initialize the plugin by setting localization, filters, and administration functions.
194
	 *
195
	 * @since 1.0.0
196
	 *
197
	 * @access private
198
	 */
199
	public function __construct() {
200
		add_action( 'admin_init', array( $this, 'compatible_version_check' ) );
201
		require_once LSX_WETU_IMPORTER_PATH . 'includes/helpers.php';
202
203
		// Don't run anything else in the plugin, if we're on an incompatible PHP version.
204
		if ( ! self::compatible_version() ) {
205
			return;
206
		}
207
208
		$this->set_variables();
209
210
		add_action( 'init', array( $this, 'load_plugin_textdomain' ) );
211
		add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ), 11 );
212
		add_action( 'admin_menu', array( $this, 'register_importer_page' ), 20 );
213
214
		require_once LSX_WETU_IMPORTER_PATH . 'classes/class-welcome.php';
215
		require_once LSX_WETU_IMPORTER_PATH . 'classes/class-lsx-wetu-importer-accommodation.php';
216
		require_once LSX_WETU_IMPORTER_PATH . 'classes/class-lsx-wetu-importer-destination.php';
217
		require_once LSX_WETU_IMPORTER_PATH . 'classes/class-lsx-wetu-importer-tours.php';
218
		require_once LSX_WETU_IMPORTER_PATH . 'classes/class-settings.php';
219
220
		add_action( 'init', array( $this, 'load_class' ) );
221
222
		if ( 'default' !== $this->tab_slug ) {
223
			add_action( 'wp_ajax_lsx_tour_importer', array( $this, 'process_ajax_search' ) );
224
			add_action( 'wp_ajax_nopriv_lsx_tour_importer', array( $this, 'process_ajax_search' ) );
225
226
			add_action( 'wp_ajax_lsx_import_items', array( $this, 'process_ajax_import' ) );
227
			add_action( 'wp_ajax_nopriv_lsx_import_items', array( $this, 'process_ajax_import' ) );
228
		}
229
	}
230
231
	// ACTIVATION FUNCTIONS.
232
233
	/**
234
	 * Load the plugin text domain for translation.
235
	 *
236
	 * @since 1.0.0
237
	 */
238
	public function load_plugin_textdomain() {
239
		load_plugin_textdomain( 'lsx-wetu-importer', false, basename( LSX_WETU_IMPORTER_PATH ) . '/languages' );
240
	}
241
242
	/**
243
	 * Sets the variables used throughout the plugin.
244
	 */
245
	public function set_variables() {
246
		$this->post_types = array( 'accommodation', 'destination', 'tour' );
247
		$options = \lsx_wetu_importer\includes\helpers\get_options();
248
249
		// Set the options.
250
		if ( ! empty( $options ) ) {
251
			$this->options = $options;
0 ignored issues
show
Documentation Bug introduced by
It seems like $options of type array is incompatible with the declared type string of property $options.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
252
253
			$temp_options = get_option( '_lsx-to_settings', false );
254
			if ( false !== $temp_options ) {
255
				$this->accommodation_settings = $temp_options['accommodation'];
256
				$this->tour_settings          = $temp_options['tour'];
257
				$this->destination_settings   = $temp_options['destination'];
258
			}
259
260
			$this->api_key = false;
261
262
			if ( ! defined( 'WETU_API_KEY' ) ) {
263
				if ( isset( $options['api_key'] ) && '' !== $options['api_key'] ) {
264
					$this->api_key = $options['api_key'];
265
				}
266
			} else {
267
				$this->api_key = WETU_API_KEY;
268
			}
269
270
			// Set the tab slug.
271
			// @codingStandardsIgnoreLine
272
			if ( isset( $_GET['tab'] ) || isset( $_POST['type'] ) ) {
273
				if ( isset( $_GET['tab'] ) ) {
274
					$this->tab_slug = wp_unslash( $_GET['tab'] );
275
				} else {
276
					$this->tab_slug = wp_unslash( $_POST['type'] );
277
				}
278
279
				// If any tours were queued.
280
				$this->queued_imports = get_option( 'lsx_wetu_importer_que', array() );
281
			}
282
283
			// Set the scaling options.
284
			if ( isset( $this->options ) && isset( $this->options['image_scaling'] ) ) {
285
				$this->scale_images = true;
286
287
				$width = '1024';
288 View Code Duplication
				if ( isset( $this->options['width'] ) && '' !== $this->options['width'] ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
289
					$width = $this->options['width'];
290
				}
291
292
				$height = '768';
293 View Code Duplication
				if ( isset( $this->options['height'] ) && '' !== $this->options['height'] ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
294
					$height = $this->options['height'];
295
				}
296
297
				$cropping = 'w';
298 View Code Duplication
				if ( isset( $this->options['cropping'] ) && '' !== $this->options['cropping'] ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
299
					$cropping = $this->options['cropping'];
300
				}
301
302
				$this->image_scaling_url = 'https://wetu.com/ImageHandler/' . $cropping . $width . 'x' . $height . '/';
0 ignored issues
show
Bug introduced by
The property image_scaling_url does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
303
			}
304
305
			if ( isset( $this->options ) && isset( $this->options['image_limit'] ) && '' !== $this->options['image_limit'] ) {
306
				$this->image_limit = $this->options['image_limit'];
307
			}
308
		}
309
	}
310
311
	// COMPATABILITY FUNCTIONS.
312
313
	/**
314
	 * On plugin activation
315
	 *
316
	 * @since 1.0.0
317
	 */
318
	public static function register_activation_hook() {
319
		self::compatible_version_check_on_activation();
320
	}
321
322
	/**
323
	 * Check if the PHP version is compatible.
324
	 *
325
	 * @since 1.0.0
326
	 */
327
	public static function compatible_version() {
328
		if ( version_compare( PHP_VERSION, '5.6', '<' ) ) {
329
			return false;
330
		}
331
332
		return true;
333
	}
334
335
	/**
336
	 * The backup sanity check, in case the plugin is activated in a weird way,
337
	 * or the versions change after activation.
338
	 *
339
	 * @since 1.0.0
340
	 */
341
	public function compatible_version_check() {
342
		if ( ! self::compatible_version() ) {
343
			if ( is_plugin_active( plugin_basename( LSX_WETU_IMPORTER_CORE ) ) ) {
344
				deactivate_plugins( plugin_basename( LSX_WETU_IMPORTER_CORE ) );
345
				add_action( 'admin_notices', array( $this, 'compatible_version_notice' ) );
346
347
				if ( isset( $_GET['activate'] ) ) {
348
					unset( $_GET['activate'] );
349
				}
350
			}
351
		}
352
	}
353
354
	/**
355
	 * Display the notice related with the older version from PHP.
356
	 *
357
	 * @since 1.0.0
358
	 */
359
	public function compatible_version_notice() {
360
		$class = 'notice notice-error';
361
		$message = esc_html__( 'LSX Importer for Wetu Plugin requires PHP 5.6 or higher.', 'lsx-wetu-importer' );
362
		printf( '<div class="%1$s"><p>%2$s</p></div>', esc_html( $class ), esc_html( $message ) );
363
	}
364
365
	/**
366
	 * The primary sanity check, automatically disable the plugin on activation if it doesn't
367
	 * meet minimum requirements.
368
	 *
369
	 * @since 1.0.0
370
	 */
371
	public static function compatible_version_check_on_activation() {
372
		if ( ! self::compatible_version() ) {
373
			deactivate_plugins( plugin_basename( LSX_WETU_IMPORTER_CORE ) );
374
			wp_die( esc_html__( 'LSX Importer for Wetu Plugin requires PHP 5.6 or higher.', 'lsx-wetu-importer' ) );
375
		}
376
	}
377
378
	// DISPLAY FUNCTIONS.
379
380
	/**
381
	 * Load the importer class you want to use
382
	 */
383
	public function load_class() {
384
		switch ( $this->tab_slug ) {
385
			case 'accommodation':
386
				$this->current_importer = new LSX_WETU_Importer_Accommodation();
0 ignored issues
show
Documentation Bug introduced by
It seems like new \LSX_WETU_Importer_Accommodation() of type object<LSX_WETU_Importer_Accommodation> is incompatible with the declared type integer of property $current_importer.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
387
				break;
388
389
			case 'destination':
390
				$this->current_importer = new LSX_WETU_Importer_Destination();
0 ignored issues
show
Documentation Bug introduced by
It seems like new \LSX_WETU_Importer_Destination() of type object<LSX_WETU_Importer_Destination> is incompatible with the declared type integer of property $current_importer.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
391
				break;
392
393
			case 'tour':
394
				$this->current_importer = new LSX_WETU_Importer_Tours();
0 ignored issues
show
Documentation Bug introduced by
It seems like new \LSX_WETU_Importer_Tours() of type object<LSX_WETU_Importer_Tours> is incompatible with the declared type integer of property $current_importer.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
395
				break;
396
397
			case 'settings':
398
				$this->current_importer = \lsx_wetu_importer\classes\Settings::get_instance();
0 ignored issues
show
Documentation Bug introduced by
It seems like \lsx_wetu_importer\class...ettings::get_instance() of type object is incompatible with the declared type integer of property $current_importer.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
399
				break;
400
401
			default:
402
				$this->current_importer = \lsx_wetu_importer\classes\Welcome::get_instance();
0 ignored issues
show
Documentation Bug introduced by
It seems like \lsx_wetu_importer\classes\Welcome::get_instance() of type object is incompatible with the declared type integer of property $current_importer.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
403
				break;
404
		}
405
	}
406
407
	/**
408
	 * Registers the admin page which will house the importer form.
409
	 */
410
	public function register_importer_page() {
411
		add_submenu_page( 'tour-operator', esc_html__( 'Importer', 'tour-operator' ), esc_html__( 'Importer', 'tour-operator' ), 'manage_options', 'lsx-wetu-importer', array( $this, 'display_page' ) );
412
	}
413
414
	/**
415
	 * Enqueue the JS needed to contact wetu and return your result.
416
	 */
417
	public function admin_scripts() {
418
		if ( defined( 'WP_DEBUG' ) && true === WP_DEBUG ) {
419
			$min = '';
0 ignored issues
show
Unused Code introduced by
$min is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
420
		} else {
421
			$min = '.min';
0 ignored issues
show
Unused Code introduced by
$min is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
422
		}
423
424
		$min = '';
425
426
		if ( is_admin() && isset( $_GET['page'] ) && $this->plugin_slug === $_GET['page'] ) {
427
428
			wp_enqueue_style( 'lsx-wetu-importer-style', LSX_WETU_IMPORTER_URL . 'assets/css/lsx-wetu-importer.css', LSX_WETU_IMPORTER_VER, true );
429
			wp_enqueue_script( 'lsx-wetu-importers-script', LSX_WETU_IMPORTER_URL . 'assets/js/lsx-wetu-importer' . $min . '.js', array( 'jquery' ), LSX_WETU_IMPORTER_VER, true );
430
431
			wp_localize_script(
432
				'lsx-wetu-importers-script',
433
				'lsx_tour_importer_params',
434
				array(
435
					'ajax_url' => admin_url( 'admin-ajax.php' ),
436
				)
437
			);
438
		}
439
	}
440
441
	/**
442
	 * Display the importer administration screen
443
	 */
444
	public function display_page() {
445
		?>
446
		<div class="wrap">
447
			<?php
448
			$this->navigation( $this->tab_slug );
449
			if ( 'default' !== $this->tab_slug && 'settings' !== $this->tab_slug ) {
450
				$this->wetu_status();
451
				$this->post_status_navigation();
452
			}
453
			$this->current_importer->display_page();
0 ignored issues
show
Bug introduced by
The method display_page cannot be called on $this->current_importer (of type integer).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
454
			?>
455
		</div>
456
		<?php
457
	}
458
459
	/**
460
	 * Outputs the post status navigation
461
	 *
462
	 * @return void
463
	 */
464
	public function post_status_navigation() {
465
		?>
466
		<ul class="subsubsub">
467
			<li class="searchform"><a class="current" href="#search"><?php esc_attr_e( 'Search', 'lsx-wetu-importer' ); ?></a> | </li>
468
			<li class="publish"><a href="#publish"><?php esc_attr_e( 'Published', 'lsx-wetu-importer' ); ?> <span class="count"> (<?php echo esc_attr( \lsx_wetu_importer\includes\helpers\get_post_count( $this->tab_slug, 'publish ' ) ); ?>)</span></a> | </li>
469
			<li class="pending"><a href="#pending"><?php esc_attr_e( 'Pending', 'lsx-wetu-importer' ); ?> <span class="count"> (<?php echo esc_attr( \lsx_wetu_importer\includes\helpers\get_post_count( $this->tab_slug, 'pending ' ) ); ?>)</span></a>| </li> 
470
			<li class="draft"><a href="#draft"><?php esc_attr_e( 'Draft', 'lsx-wetu-importer' ); ?></a> <span class="count"> (<?php echo esc_attr( \lsx_wetu_importer\includes\helpers\get_post_count( $this->tab_slug, 'draft ' ) ); ?>)</span></li>
471
472
			<?php if ( 'tour' === $this->tab_slug ) { ?>
473
				<li class="import"> | <a class="import search-toggle"  href="#import"><?php esc_attr_e( 'WETU', 'lsx-wetu-importer' ); ?> <span class="count"> (<?php echo esc_attr( \lsx_wetu_importer\includes\helpers\get_wetu_tour_count() ); ?>)</span></a></li>
474
			<?php } else if ( ! empty( $this->queued_imports ) ) { ?>
475
				<li class="import"> | <a class="import search-toggle"  href="#import"><?php esc_attr_e( 'WETU Queue', 'lsx-wetu-importer' ); ?> <span class="count"> (<?php echo esc_attr( \lsx_wetu_importer\includes\helpers\get_wetu_queue_count( $this->tab_slug ) ); ?>)</span></a></li>
476
			<?php } ?>
477
		</ul>
478
		<?php
479
	}
480
481
	/**
482
	 * Search Form
483
	 */
484
	public function search_form() {
485
		?>
486
		<form class="ajax-form" id="<?php echo esc_attr( $this->plugin_slug ); ?>-search-form" method="get" action="tools.php" data-type="<?php echo esc_attr( $this->tab_slug ); ?>">
487
			<input type="hidden" name="page" value="<?php echo esc_attr( $this->tab_slug ); ?>" />
488
489
			<?php do_action( 'lsx_wetu_importer_search_form',$this ); ?>
490
491
			<div class="normal-search">
492
				<input pattern=".{3,}" placeholder="3 characters minimum" class="keyword" name="keyword" value=""> <input class="button button-primary submit" type="submit" value="<?php esc_html_e( 'Search', 'lsx-wetu-importer' ); ?>" />
493
			</div>
494
495
			<div class="advanced-search hidden" style="display:none;">
496
				<textarea rows="10" cols="40" name="bulk-keywords"></textarea>
497
				<input class="button button-primary submit" type="submit" value="<?php esc_attr_e( 'Search', 'lsx-wetu-importer' ); ?>" />
498
			</div>
499
500
			<div class="ajax-loader" style="display:none;width:100%;text-align:center;">
501
				<img style="width:64px;" src="<?php echo esc_url( LSX_WETU_IMPORTER_URL . 'assets/images/ajaxloader.gif' ); ?>" />
502
			</div>
503
504
			<div class="ajax-loader-small" style="display:none;width:100%;text-align:center;">
505
				<img style="width:32px;" src="<?php echo esc_url( LSX_WETU_IMPORTER_URL . 'assets/images/ajaxloader.gif' ); ?>" />
506
			</div>
507
508
			<a class="button advanced-search-toggle" href="#"><?php esc_html_e( 'Bulk Search', 'lsx-wetu-importer' ); ?></a>
509
		</form>
510
		<?php
511
	}
512
513
	/**
514
	 * The header of the item list
515
	 */
516
	public function table_header() {
517
		?>
518
		<thead>
519
		<tr>
520
			<th style="" class="manage-column column-cb check-column" id="cb" scope="col">
521
				<label for="cb-select-all-1" class="screen-reader-text">Select All</label>
522
				<input type="checkbox" id="cb-select-all-1">
523
			</th>
524
			<th style="" class="manage-column column-title " id="title" style="width:50%;" scope="col">Title</th>
525
			<th style="" class="manage-column column-date" id="date" scope="col">Date</th>
526
			<th style="" class="manage-column column-ssid" id="ssid" scope="col">WETU ID</th>
527
		</tr>
528
		</thead>
529
		<?php
530
	}
531
532
	/**
533
	 * The footer of the item list
534
	 */
535
	public function table_footer() {
536
		?>
537
		<tfoot>
538
		<tr>
539
			<th style="" class="manage-column column-cb check-column" id="cb" scope="col">
540
				<label for="cb-select-all-1" class="screen-reader-text">Select All</label>
541
				<input type="checkbox" id="cb-select-all-1">
542
			</th>
543
			<th style="" class="manage-column column-title" scope="col">Title</th>
544
			<th style="" class="manage-column column-date" scope="col">Date</th>
545
			<th style="" class="manage-column column-ssid" scope="col">WETU ID</th>
546
		</tr>
547
		</tfoot>
548
		<?php
549
	}
550
551
	/**
552
	 * Displays the importers navigation.
553
	 *
554
	 * @param $tab string
555
	 */
556
	public function navigation( $tab = '' ) {
557
		$post_types = array(
558
			'tour'          => esc_attr( 'Tours', 'lsx-wetu-importer' ),
559
			'accommodation' => esc_attr( 'Accommodation', 'lsx-wetu-importer' ),
560
			'destination'   => esc_attr( 'Destinations', 'lsx-wetu-importer' ),
561
		);
562
563
		echo wp_kses_post( '<div class="wp-filter">' );
564
		echo wp_kses_post( '<ul class="filter-links">' );
565
		echo wp_kses_post( '<li><a class="' . $this->itemd( $tab, 'default', 'current', false ) . '" href="' . admin_url( 'admin.php' ) . '?page=' . $this->plugin_slug . '">' . esc_attr__( 'Home', 'lsx-wetu-importer' ) . '</a></li>' );
0 ignored issues
show
Documentation introduced by
$tab is of type string, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
566
567
		foreach ( $post_types as $post_type => $label ) {
568
			echo wp_kses_post( ' | <li><a class="' . $this->itemd( $tab, $post_type, 'current', false ) . '" href="' . admin_url( 'admin.php' ) . '?page=' . $this->plugin_slug . '&tab=' . $post_type . '">' . $label . '</a></li>' );
0 ignored issues
show
Documentation introduced by
$tab is of type string, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
569
		}
570
571
		echo wp_kses_post( ' | <li><a class="' . $this->itemd( $tab, 'settings', 'current', false ) . '" href="' . admin_url( 'admin.php' ) . '?page=' . $this->plugin_slug . '&tab=settings">' . esc_attr__( 'Settings', 'lsx-wetu-importer' ) . '</a></li>' );
0 ignored issues
show
Documentation introduced by
$tab is of type string, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
572
		echo wp_kses_post( '</ul> </div>' );
573
	}
574
575
	/**
576
	 * Wetu Status Bar.
577
	 */
578
	public function wetu_status() {
579
		$tours = get_transient( 'lsx_ti_tours' );
580
		echo '<div class="wetu-status tour-wetu-status"><h3>' . esc_html__( 'Wetu Status','lsx-wetu-importer' ) . ' - ';
581
582
		if ( '' === $tours || false === $tours || isset( $_GET['refresh_tours'] ) ) {
583
			$result = $this->update_options();
584
585
			if ( true === $result ) {
586
				echo '<span style="color:green;">' . esc_attr( 'Connected','lsx-wetu-importer' ) . '</span>';
587
				echo ' - <small><a href="#">' . esc_attr( 'Refresh','lsx-wetu-importer' ) . '</a></small>';
588
			} else {
589
				echo '<span style="color:red;">' . wp_kses_post( $result ) . '</span>';
590
			}
591
		} else {
592
			echo '<span style="color:green;">' . esc_attr( 'Connected','lsx-wetu-importer' ) . '</span> - <small><a href="#">' . esc_attr( 'Refresh','lsx-wetu-importer' ) . '</a></small>';
593
		}
594
		echo '</h3>';
595
		echo '</div>';
596
	}
597
598
	/**
599
	 * Set_taxonomy with some terms
600
	 */
601
	public function team_member_checkboxes( $selected = array() ) {
602
		if ( post_type_exists( 'team' ) ) { ?>
603
			<ul>
604
				<?php
605
					$team_args = array(
606
						'post_type'	=> 'team',
607
						'post_status' => 'publish',
608
						'nopagin' => true,
609
						'fields' => 'ids',
610
					);
611
612
					$team_members = new WP_Query( $team_args );
613
614
					if ( $team_members->have_posts() ) {
615
						foreach ( $team_members->posts as $member ) {
616
							?>
617
							<li><input class="team" <?php $this->checked( $selected, $member ); ?> type="checkbox" value="<?php echo $member; ?>" /> <?php echo get_the_title( $member ); ?></li>
0 ignored issues
show
Documentation introduced by
$selected is of type array, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
618
							<?php
619
						}
620
					} else { ?>
621
						<li><input class="team" type="checkbox" value="0" /> <?php esc_html_e( 'None', 'lsx-wetu-importer' ); ?></li>
622
					<?php }
623
				?>
624
			</ul>
625
		<?php }
626
	}
627
628
629
	// GENERAL FUNCTIONS.
630
631
	/**
632
	 * Checks to see if an item is checked.
633
	 *
634
	 * @param $haystack array|string
635
	 * @param $needle string
636
	 * @param $echo bool
637
	 */
638 View Code Duplication
	public function checked( $haystack = false, $needle = '', $echo = true ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
639
		$return = $this->itemd( $haystack,$needle, 'checked' );
640
641
		if ( '' !== $return ) {
642
			if ( true === $echo ) {
643
				echo wp_kses_post( $return );
644
			} else {
645
				return $return;
646
			}
647
		}
648
	}
649
650
	/**
651
	 * Checks to see if an item is checked.
652
	 *
653
	 * @param $haystack array|string
654
	 * @param $needle string
655
	 * @param $echo bool
656
	 */
657 View Code Duplication
	public function selected( $haystack = false, $needle = '', $echo = true ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
658
		$return = $this->itemd( $haystack, $needle, 'selected' );
659
660
		if ( '' !== $return ) {
661
			if ( true === $echo ) {
662
				echo wp_kses_post( $return );
663
			} else {
664
				return $return;
665
			}
666
		}
667
	}
668
669
	/**
670
	 * Checks to see if an item is selected. If $echo is false,  it will return the $type if conditions are true.
671
	 *
672
	 * @param $haystack array|string
673
	 * @param $needle string
674
	 * @param $type string
675
	 * @param $wrap bool
676
	 * @return $html string
0 ignored issues
show
Documentation introduced by
The doc-type $html could not be parsed: Unknown type name "$html" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
677
	 */
678
	public function itemd( $haystack = false, $needle = '', $type = '', $wrap = true ) {
679
		$html = '';
680
681
		if ( '' !== $type ) {
682
			if ( ! is_array( $haystack ) ) {
683
				$haystack = array( $haystack );
684
			}
685
			if ( in_array( $needle, $haystack ) ) {
686
				if ( true === $wrap || 'true' === $wrap ) {
687
					$html = $type . '="' . $type . '"';
688
				} else {
689
					$html = $type;
690
				}
691
			}
692
		}
693
694
		return $html;
695
	}
696
697
	/**
698
	 * Grabs any attachments for the current item
699
	 */
700
	public function find_attachments( $id = false ) {
701
		if ( false !== $id ) {
702
			if ( empty( $this->found_attachments ) ) {
703
				$attachments_args = array(
704
					'post_parent' => $id,
705
					'post_status' => 'inherit',
706
					'post_type' => 'attachment',
707
					'order' => 'ASC',
708
					'nopagin' => 'true',
709
					'posts_per_page' => '-1',
710
				);
711
712
				$attachments = new WP_Query( $attachments_args );
713
714
				if ( $attachments->have_posts() ) {
715
					foreach ( $attachments->posts as $attachment ) {
716
						$this->found_attachments[ $attachment->ID ] = str_replace( array( '.jpg', '.png', '.jpeg' ), '', $attachment->post_title );
717
					}
718
				}
719
			}
720
		}
721
	}
722
723
	// CUSTOM FIELD FUNCTIONS.
724
725
	/**
726
	 * Saves the room data
727
	 */
728
	public function save_custom_field( $value = false, $meta_key, $id, $decrease = false, $unique = true ) {
729
		if ( false !== $value ) {
730
			if ( false !== $decrease ) {
731
				$value = intval( $value );
732
				$value--;
733
			}
734
735
			$prev = get_post_meta( $id, $meta_key, true );
736
737
			if ( false !== $id && '0' !== $id && false !== $prev && true === $unique ) {
738
				update_post_meta( $id, $meta_key, $value, $prev );
739
			} else {
740
				add_post_meta( $id, $meta_key, $value, $unique );
741
			}
742
		}
743
	}
744
745
	/**
746
	 * Grabs the custom fields,  and resaves an array of unique items.
747
	 */
748
	public function cleanup_posts() {
749
		if ( ! empty( $this->cleanup_posts ) ) {
750
751
			foreach ( $this->cleanup_posts as $id => $key ) {
752
				$prev_items = get_post_meta( $id, $key, false );
753
				$new_items = array_unique( $prev_items );
754
				delete_post_meta( $id, $key );
755
756
				foreach ( $new_items as $new_item ) {
757
					add_post_meta( $id, $key, $new_item, false );
758
				}
759
			}
760
		}
761
	}
762
763
	// TAXONOMY FUNCTIONS.
764
765
	/**
766
	 * Set_taxonomy with some terms
767
	 */
768
	public function set_taxonomy( $taxonomy, $terms, $id ) {
0 ignored issues
show
Unused Code introduced by
The parameter $terms is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
769
		$result = array();
770
771
		if ( ! empty( $data ) ) {
0 ignored issues
show
Bug introduced by
The variable $data seems to never exist, and therefore empty should always return true. Did you maybe rename this variable?

This check looks for calls to isset(...) or empty() on variables that are yet undefined. These calls will always produce the same result and can be removed.

This is most likely caused by the renaming of a variable or the removal of a function/method parameter.

Loading history...
772
			foreach ( $data as $k ) {
773
				if ( $id ) {
774
					$term = term_exists( trim( $k ), $tax );
0 ignored issues
show
Bug introduced by
The variable $tax does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
775
					if ( ! $term ) {
776
						$term = wp_insert_term( trim( $k ), $tax );
777
778 View Code Duplication
						if ( is_wp_error( $term ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
779
							echo wp_kses_post( $term->get_error_message() );
780
						} else {
781
							wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
782
						}
783
					} else {
784
						wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
785
					}
786
				} else {
787
					$result[] = trim( $k );
788
				}
789
			}
790
		}
791
		return $result;
792
	}
793
794
	/**
795
	 * Sets the terms of the current post
796
	 *
797
	 * @param boolean $id
798
	 * @param boolean $name
799
	 * @param boolean $taxonomy
800
	 * @param boolean $parent
801
	 * @return void
802
	 */
803
	public function set_term( $id = false, $name = false, $taxonomy = false, $parent = false ) {
804
		$term = term_exists( $name, $taxonomy );
805
		if ( ! $term ) {
806
			if ( false !== $parent ) {
807
				$parent = array(
808
					'parent' => $parent,
809
				);
810
			}
811
			$term = wp_insert_term( trim( $name ), $taxonomy,$parent );
812
813 View Code Duplication
			if ( is_wp_error( $term ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
814
				echo wp_kses_post( $term->get_error_message() );
815
			} else {
816
				wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
817
			}
818
		} else {
819
			wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
820
		}
821
822
		return $term['term_id'];
823
	}
824
825
	/**
826
	 * set_taxonomy with some terms
827
	 */
828
	public function taxonomy_checkboxes( $taxonomy = false, $selected = array() ) {
829
		$return = '';
830
831
		if ( false !== $taxonomy ) {
832
			$return .= '<ul>';
833
			$terms = get_terms( array(
834
				'taxonomy' => $taxonomy,
835
				'hide_empty' => false,
836
			) );
837
838
			if ( ! is_wp_error( $terms ) ) {
839
				foreach ( $terms as $term ) {
840
					$return .= '<li><input class="' . $taxonomy . '" ' . $this->checked( $selected,$term->term_id,false ) . ' type="checkbox" value="' . $term->term_id . '" /> ' . $term->name . '</li>';
0 ignored issues
show
Documentation introduced by
$selected is of type array, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
841
				}
842
			} else {
843
				$return .= '<li><input type="checkbox" value="" /> ' . __( 'None', 'lsx-wetu-importer' ) . '</li>';
844
			}
845
846
			$return .= '</ul>';
847
		}
848
849
		return $return;
850
	}
851
852
	// MAP FUNCTIONS
853
854
	/**
855
	 * Saves the longitude and lattitude, as well as sets the map marker.
856
	 */
857
	public function set_map_data( $data, $id, $zoom = '10' ) {
858
		$longitude = false;
859
		$latitude = false;
860
		$address = false;
861
862
		if ( isset( $data[0]['position'] ) ) {
863 View Code Duplication
			if ( isset( $data[0]['position']['driving_latitude'] ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
864
				$latitude = $data[0]['position']['driving_latitude'];
865
			} elseif ( isset( $data[0]['position']['latitude'] ) ) {
866
				$latitude = $data[0]['position']['latitude'];
867
			}
868
869 View Code Duplication
			if ( isset( $data[0]['position']['driving_longitude'] ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
870
				$longitude = $data[0]['position']['driving_longitude'];
871
			} elseif ( isset( $data[0]['position']['longitude'] ) ) {
872
				$longitude = $data[0]['position']['longitude'];
873
			}
874
		}
875
876
		if ( isset( $data[0]['content'] ) && isset( $data[0]['content']['contact_information'] ) ) {
877
			if ( isset( $data[0]['content']['contact_information']['address'] ) ) {
878
				$address = strip_tags( $data[0]['content']['contact_information']['address'] );
879
				$address = explode( "\n", $address );
880
881
				foreach ( $address as $bitkey => $bit ) {
882
					$bit = ltrim( rtrim( $bit ) );
883
884
					if ( false === $bit || '' === $bit || null === $bit || empty( $bit ) ) {
885
						unset( $address[ $bitkey ] );
886
					}
887
				}
888
889
				$address = implode( ', ',$address );
890
				$address = str_replace( ', , ', ', ', $address );
891
			}
892
		}
893
894
		if ( false !== $longitude ) {
895
			$location_data = array(
896
				'address'	=> (string) $address,
897
				'lat'		=> (string) $latitude,
898
				'long'		=> (string) $longitude,
899
				'zoom'		=> (string) $zoom,
900
				'elevation'	=> '',
901
			);
902
903 View Code Duplication
			if ( false !== $id && '0' !== $id ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
904
				$prev = get_post_meta( $id,'location',true );
905
				update_post_meta( $id,'location',$location_data,$prev );
906
			} else {
907
				add_post_meta( $id,'location',$location_data,true );
908
			}
909
		}
910
	}
911
912
	// IMAGE FUNCTIONS
913
914
	/**
915
	 * Creates the main gallery data
916
	 */
917
	public function set_featured_image( $data, $id ) {
918
		if ( is_array( $data[0]['content']['images'] ) && ! empty( $data[0]['content']['images'] ) ) {
919
			$this->featured_image = $this->attach_image( $data[0]['content']['images'][0], $id,  array(
0 ignored issues
show
Documentation introduced by
array('width' => '800', ...00', 'cropping' => 'h') is of type array<string,string,{"wi...","cropping":"string"}>, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
920
				'width' => '800',
921
				'height' => '600',
922
				'cropping' => 'h',
923
			) );
924
925
			if ( false !== $this->featured_image ) {
926
				delete_post_meta( $id,'_thumbnail_id' );
927
				add_post_meta( $id,'_thumbnail_id',$this->featured_image,true );
928
			}
929
		}
930
	}
931
932
	/**
933
	 * Sets a banner image
934
	 */
935
	public function set_banner_image( $data, $id, $content = array( 'none' ) ) {
936
		if ( is_array( $data[0]['content']['images'] ) && ! empty( $data[0]['content']['images'] ) ) {
937
			if ( in_array( 'unique_banner_image', $content ) && isset( $data[0]['destination_image'] ) && is_array( $data[0]['destination_image'] ) ) {
938
				$temp_banner = $this->attach_image( $data[0]['destination_image'], $id, array(
0 ignored issues
show
Documentation introduced by
array('width' => '1920',...00', 'cropping' => 'c') is of type array<string,string,{"wi...","cropping":"string"}>, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
939
					'width' => '1920',
940
					'height' => '600',
941
					'cropping' => 'c',
942
				));
943
			} else {
944
				$temp_banner = $this->attach_image( $data[0]['content']['images'][1], $id, array(
0 ignored issues
show
Documentation introduced by
array('width' => '1920',...00', 'cropping' => 'c') is of type array<string,string,{"wi...","cropping":"string"}>, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
945
					'width' => '1920',
946
					'height' => '600',
947
					'cropping' => 'c',
948
				));
949
			}
950
951 View Code Duplication
			if ( false !== $temp_banner ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
952
				$this->banner_image = $temp_banner;
953
954
				delete_post_meta( $id,'image_group' );
955
956
				$new_banner = array(
957
					'banner_image' => array(
958
						'cmb-field-0' => $this->banner_image,
959
					),
960
				);
961
962
				add_post_meta( $id,'image_group',$new_banner,true );
963
			}
964
		}
965
	}
966
967
	/**
968
	 * Creates the main gallery data
969
	 */
970
	public function create_main_gallery( $data, $id ) {
971
		if ( is_array( $data[0]['content']['images'] ) && ! empty( $data[0]['content']['images'] ) ) {
972
			if ( isset( $this->options['image_replacing'] ) && 'on' === $this->options['image_replacing'] ) {
973
				$current_gallery = get_post_meta( $id, 'gallery', false );
974
975
				if ( false !== $current_gallery && ! empty( $current_gallery ) ) {
976
					foreach ( $current_gallery as $g ) {
977
						delete_post_meta( $id,'gallery', $g );
978
979
						if ( 'attachment' === get_post_type( $g ) ) {
980
							wp_delete_attachment( $g, true );
981
						}
982
					}
983
				}
984
			}
985
986
			$counter = 0;
987
988
			foreach ( $data[0]['content']['images'] as $image_data ) {
989
				if ( ( 0 === $counter && false !== $this->featured_image ) || ( 1 === $counter && false !== $this->banner_image ) ) {
990
					$counter++;
991
992
					if ( false !== $this->image_limit && false !== $this->image_limit ) {
993
						$this->image_limit++;
994
					}
995
996
					continue;
997
				}
998
999
				if ( false !== $this->image_limit && $counter >= $this->image_limit ) {
1000
					continue;
1001
				}
1002
1003
				$this->gallery_meta[] = $this->attach_image( $image_data,$id );
1004
				$counter++;
1005
			}
1006
1007
			if ( ! empty( $this->gallery_meta ) ) {
1008
				delete_post_meta( $id,'gallery' );
1009
				$this->gallery_meta = array_unique( $this->gallery_meta );
1010
1011
				foreach ( $this->gallery_meta as $gallery_id ) {
1012
					if ( false !== $gallery_id && '' !== $gallery_id && ! is_array( $gallery_id ) ) {
1013
						add_post_meta( $id,'gallery',$gallery_id,false );
1014
					}
1015
				}
1016
			}
1017
		}
1018
	}
1019
1020
	/**
1021
	 * search_form
1022
	 */
1023
	public function get_scaling_url( $args = array() ) {
1024
		$defaults = array(
1025
			'width' => '1024',
1026
			'height' => '768',
1027
			//'cropping' => 'w',
1028
			'cropping' => 'h',
1029
		);
1030
1031
		if ( false !== $this->options ) {
1032 View Code Duplication
			if ( isset( $this->options['width'] ) && '' !== $this->options['width'] ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1033
				$defaults['width'] = $this->options['width'];
1034
			}
1035
1036 View Code Duplication
			if ( isset( $this->options['height'] ) && '' !== $this->options['height'] ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1037
				$defaults['height'] = $this->options['height'];
1038
			}
1039
1040 View Code Duplication
			if ( isset( $this->options['cropping'] ) && '' !== $this->options['cropping'] ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1041
				$defaults['cropping'] = $this->options['cropping'];
1042
			}
1043
		}
1044
1045
		$args = wp_parse_args( $args, $defaults );
1046
		$cropping = $args['cropping'];
1047
		$width = $args['width'];
1048
		$height = $args['height'];
1049
1050
		return 'https://wetu.com/ImageHandler/' . $cropping . $width . 'x' . $height . '/';
1051
	}
1052
1053
	/**
1054
	 * Attaches 1 image
1055
	 */
1056
	public function attach_image( $v = false, $parent_id, $image_sizes = false, $banner = false ) {
0 ignored issues
show
Unused Code introduced by
The parameter $banner is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1057
		if ( false !== $v ) {
1058
			$temp_fragment = explode( '/',$v['url_fragment'] );
1059
			$url_filename = $temp_fragment[ count( $temp_fragment ) -1 ];
1060
			$url_filename = str_replace( array( '.jpg', '.png', '.jpeg' ),'',$url_filename );
1061
			$url_filename = trim( $url_filename );
1062
			$title = $url_filename;
0 ignored issues
show
Unused Code introduced by
$title is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1063
			$url_filename = str_replace( ' ','_',$url_filename );
1064
1065
			if ( ! isset( $this->options['image_replacing'] ) && in_array( $url_filename, $this->found_attachments ) ) {
1066
				return array_search( $url_filename,$this->found_attachments );
1067
			}
1068
1069
			$postdata = array();
1070
1071
			if ( empty( $v['label'] ) ) {
1072
				$v['label'] = '';
1073
			}
1074
1075 View Code Duplication
			if ( ! empty( $v['description'] ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1076
				$desc = wp_strip_all_tags( $v['description'] );
1077
				$posdata = array(
0 ignored issues
show
Unused Code introduced by
$posdata is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1078
					'post_excerpt' => $desc,
1079
				);
1080
			}
1081
1082 View Code Duplication
			if ( ! empty( $v['section'] ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1083
				$desc = wp_strip_all_tags( $v['section'] );
1084
				$posdata = array(
0 ignored issues
show
Unused Code introduced by
$posdata is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1085
					'post_excerpt' => $desc,
1086
				);
1087
			}
1088
1089
			$attach_id = null;
0 ignored issues
show
Unused Code introduced by
$attach_id is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1090
			//Resizor - add option to setting if required
1091
			$fragment = str_replace( ' ','%20',$v['url_fragment'] );
1092
			$url = $this->get_scaling_url( $image_sizes ) . $fragment;
0 ignored issues
show
Documentation introduced by
$image_sizes is of type boolean, but the function expects a array.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
1093
1094
			$attach_id = $this->attach_external_image2( $url,$parent_id,'',$v['label'],$postdata );
1095
1096
			$this->found_attachments[ $attach_id ] = $url_filename;
1097
1098
			//echo($attach_id.' add image');
1099
			if ( ! empty( $attach_id ) ) {
1100
				return $attach_id;
1101
			}
1102
		}
1103
		return 	false;
1104
	}
1105
1106
	public function attach_external_image2( $url = null, $post_id = null, $thumb = null, $filename = null, $post_data = array() ) {
1107
		if ( ! $url || ! $post_id ) { return new WP_Error( 'missing', 'Need a valid URL and post ID...' ); }
1108
1109
		require_once( ABSPATH . 'wp-admin/includes/file.php' );
1110
		require_once( ABSPATH . 'wp-admin/includes/media.php' );
1111
		require_once( ABSPATH . 'wp-admin/includes/image.php' );
1112
		// Download file to temp location, returns full server path to temp file
1113
		//$tmp = download_url( $url );
1114
1115
		//var_dump($tmp);
1116
		$tmp = tempnam( '/tmp', 'FOO' );
1117
1118
		$image = file_get_contents( $url );
1119
		file_put_contents( $tmp, $image );
1120
		chmod( $tmp,'777' );
1121
1122
		preg_match( '/[^\?]+\.(tif|TIFF|jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG|pdf|PDF|bmp|BMP)/', $url, $matches );    // fix file filename for query strings
1123
		$url_filename = basename( $matches[0] );
1124
		$url_filename = str_replace( '%20','_',$url_filename );
1125
		// extract filename from url for title
1126
		$url_type = wp_check_filetype( $url_filename );                                           // determine file type (ext and mime/type)
1127
1128
		// override filename if given, reconstruct server path
1129
		if ( ! empty( $filename ) && ' ' != $filename ) {
1130
			$filename = sanitize_file_name( $filename );
1131
			$tmppath = pathinfo( $tmp );
1132
1133
			$extension = '';
1134
			if ( isset( $tmppath['extension'] ) ) {
1135
				$extension = $tmppath['extension'];
1136
			}
1137
1138
			$new = $tmppath['dirname'] . '/' . $filename . '.' . $extension;
1139
			rename( $tmp, $new );                                                                 // renames temp file on server
1140
			$tmp = $new;                                                                        // push new filename (in path) to be used in file array later
1141
		}
1142
1143
		// assemble file data (should be built like $_FILES since wp_handle_sideload() will be using)
1144
		$file_array['tmp_name'] = $tmp;                                                         // full server path to temp file
0 ignored issues
show
Coding Style Comprehensibility introduced by
$file_array was never initialized. Although not strictly required by PHP, it is generally a good practice to add $file_array = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
1145
1146 View Code Duplication
		if ( ! empty( $filename ) && ' ' != $filename ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1147
			$file_array['name'] = $filename . '.' . $url_type['ext'];                           // user given filename for title, add original URL extension
1148
		} else {
1149
			$file_array['name'] = $url_filename;                                                // just use original URL filename
1150
		}
1151
1152
		// set additional wp_posts columns
1153 View Code Duplication
		if ( empty( $post_data['post_title'] ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1154
1155
			$url_filename = str_replace( '%20',' ',$url_filename );
1156
1157
			$post_data['post_title'] = basename( $url_filename, '.' . $url_type['ext'] );         // just use the original filename (no extension)
1158
		}
1159
1160
		// make sure gets tied to parent
1161
		if ( empty( $post_data['post_parent'] ) ) {
1162
			$post_data['post_parent'] = $post_id;
1163
		}
1164
1165
		// required libraries for media_handle_sideload
1166
1167
		// do the validation and storage stuff
1168
		$att_id = media_handle_sideload( $file_array, $post_id, null, $post_data );             // $post_data can override the items saved to wp_posts table, like post_mime_type, guid, post_parent, post_title, post_content, post_status
1169
1170
		// If error storing permanently, unlink
1171
		if ( is_wp_error( $att_id ) ) {
1172
			unlink( $file_array['tmp_name'] );   // clean up
1173
			return false; // output wp_error
1174
			//return $att_id; // output wp_error
1175
		}
1176
1177
		return $att_id;
1178
	}
1179
1180
	// AJAX FUNCTIONS
1181
	/**
1182
	 * Run through the accommodation grabbed from the DB.
1183
	 */
1184
	public function process_ajax_search() {
1185
		$this->current_importer->process_ajax_search();
0 ignored issues
show
Bug introduced by
The method process_ajax_search cannot be called on $this->current_importer (of type integer).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
1186
		die();
1187
	}
1188
1189
	/**
1190
	 * Connect to wetu
1191
	 */
1192
	public function process_ajax_import() {
1193
		$this->current_importer->process_ajax_import();
0 ignored issues
show
Bug introduced by
The method process_ajax_import cannot be called on $this->current_importer (of type integer).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
1194
		die();
1195
	}
1196
1197
	/**
1198
	 * Formats the row for the completed list.
1199
	 */
1200
	public function format_completed_row( $response ) {
1201
		echo wp_kses_post( '<li class="post-' . $response . '"><span class="dashicons dashicons-yes"></span> <a target="_blank" href="' . get_permalink( $response ) . '">' . get_the_title( $response ) . '</a></li>' );
1202
	}
1203
1204
	/**
1205
	 * Formats the error.
1206
	 */
1207
	public function format_error( $response ) {
1208
		echo wp_kses_post( '<li class="post-error"><span class="dashicons dashicons-no"></span>' . $response . '</li>' );
1209
	}
1210
1211
	/**
1212
	 * Does a multine search
1213
	 */
1214
	public function multineedle_stripos( $haystack, $needles, $offset = 0 ) {
1215
		$found = false;
1216
		$needle_count = count( $needles );
1217
1218
		foreach ( $needles as $needle ) {
1219
			if ( false !== stripos( $haystack, $needle, $offset ) ) {
1220
				$found[] = true;
1221
			}
1222
		}
1223
1224
		if ( false !== $found && count( $found ) === $needle_count ) {
1225
			return true;
1226
		} else {
1227
			return false;
1228
		}
1229
	}
1230
1231
	/**
1232
	 * Grab all the current accommodation posts via the lsx_wetu_id field.
1233
	 */
1234 View Code Duplication
	public function find_current_accommodation( $post_type = 'accommodation' ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1235
		global $wpdb;
1236
		$return = array();
1237
1238
		// @codingStandardsIgnoreStart
1239
		$current_accommodation = $wpdb->get_results("
1240
			SELECT key1.post_id,key1.meta_value
1241
			FROM {$wpdb->postmeta} key1
1242
1243
			INNER JOIN  {$wpdb->posts} key2
1244
			ON key1.post_id = key2.ID
1245
1246
			WHERE key1.meta_key = 'lsx_wetu_id'
1247
			AND key2.post_type = '{$post_type}'
1248
1249
			LIMIT 0,5000
1250
		");
1251
		// @codingStandardsIgnoreEnd
1252
1253
		if ( null !== $current_accommodation && ! empty( $current_accommodation ) ) {
1254
			foreach ( $current_accommodation as $accom ) {
1255
				$return[ $accom->meta_value ] = $accom;
1256
			}
1257
		}
1258
1259
		return $return;
1260
	}
1261
1262
	/**
1263
	 * Set the Video date
1264
	 */
1265
	public function set_video_data( $data, $id ) {
1266
		if ( ! empty( $data[0]['content']['youtube_videos'] ) && is_array( $data[0]['content']['youtube_videos'] ) ) {
1267
			$videos = false;
1268
1269
			foreach ( $data[0]['content']['youtube_videos'] as $video ) {
1270
				$temp_video = array();
1271
1272
				if ( isset( $video['label'] ) ) {
1273
					$temp_video['title'] = $video['label'];
1274
				}
1275
				if ( isset( $video['description'] ) ) {
1276
					$temp_video['description'] = strip_tags( $video['description'] );
1277
				}
1278
				if ( isset( $video['url'] ) ) {
1279
					$temp_video['url'] = $video['url'];
1280
				}
1281
1282
				$temp_video['thumbnail'] = '';
1283
				$videos[] = $temp_video;
1284
			}
1285
1286
			if ( false !== $id && '0' !== $id ) {
1287
				delete_post_meta( $id, 'videos' );
1288
			}
1289
1290
			foreach ( $videos as $video ) {
0 ignored issues
show
Bug introduced by
The expression $videos of type false is not traversable.
Loading history...
1291
				add_post_meta( $id,'videos',$video,false );
1292
			}
1293
		}
1294
	}
1295
1296
	public function shuffle_assoc( &$array ) {
1297
		$new = array();
1298
		$keys = array_keys( $array );
1299
1300
		shuffle( $keys );
1301
1302
		foreach ( $keys as $key ) {
1303
			$new[ $key ] = $array[ $key ];
1304
		}
1305
1306
		$array = $new;
1307
1308
		return true;
1309
	}
1310
1311
	/**
1312
	 * Save the list of Tours into an option
1313
	 */
1314
	public function update_options() {
1315
		$own = '';
0 ignored issues
show
Unused Code introduced by
$own is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1316
		$options = array();
1317
		delete_option( 'lsx_ti_tours_api_options' );
1318
1319
		if ( isset( $_GET['own'] ) ) {
1320
			$this->current_importer->url_qs .= '&own=true';
1321
			$options[] = 'own';
1322
		}
1323
1324
		if ( isset( $_GET['type'] ) && 'allitineraries' !== $_GET['type'] ) {
1325
			$this->current_importer->url_qs .= '&type=' . implode( '', $_GET['type'] );
1326
			$options[] = implode( '', $_GET['type'] );
1327
		}
1328
1329
		$this->current_importer->url_qs .= '&results=2000';
1330
1331
		add_option( 'lsx_ti_tours_api_options', $options );
1332
1333
		$data = wp_remote_get( $this->current_importer->url . '/V8/List?' . $this->current_importer->url_qs );
1334
		$tours = json_decode( wp_remote_retrieve_body( $data ), true );
1335
1336
		if ( isset( $tours['error'] ) ) {
1337
			return $tours['error'];
1338
		} elseif ( isset( $tours['itineraries'] ) && ! empty( $tours['itineraries'] ) ) {
1339
			set_transient( 'lsx_ti_tours', $tours['itineraries'], 60 * 60 * 2 );
1340
			return true;
1341
		}
1342
	}
1343
}
1344
1345
$lsx_wetu_importer = new LSX_WETU_Importer();
1346