Passed
Push — master ( 5c13d7...6249b0 )
by Warwick
02:37 queued 12s
created

LSX_WETU_Importer::__construct()   B

Complexity

Conditions 6
Paths 5

Size

Total Lines 35

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
nc 5
nop 0
dl 0
loc 35
rs 8.7377
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
	 * Hold the post columns object
187
	 *
188
	 * @var object LSX_WETU_Importer_Post_Columns()
189
	 */
190
	public $post_columns = 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-lsx-wetu-importer-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-lsx-wetu-importer-settings.php';
219
		if ( isset( $this->options ) && isset( $this->options['enable_tour_ref_column'] ) && '' !== $this->options['enable_tour_ref_column'] ) {
220
			require_once LSX_WETU_IMPORTER_PATH . 'classes/class-lsx-wetu-importer-post-columns.php';
221
			$this->post_columns = LSX_WETU_Importer_Post_Columns::get_instance();
222
		}
223
224
		add_action( 'init', array( $this, 'load_class' ) );
225
226
		if ( 'default' !== $this->tab_slug ) {
227
			add_action( 'wp_ajax_lsx_tour_importer', array( $this, 'process_ajax_search' ) );
228
			add_action( 'wp_ajax_nopriv_lsx_tour_importer', array( $this, 'process_ajax_search' ) );
229
230
			add_action( 'wp_ajax_lsx_import_items', array( $this, 'process_ajax_import' ) );
231
			add_action( 'wp_ajax_nopriv_lsx_import_items', array( $this, 'process_ajax_import' ) );
232
		}
233
	}
234
235
	// ACTIVATION FUNCTIONS.
236
237
	/**
238
	 * Load the plugin text domain for translation.
239
	 *
240
	 * @since 1.0.0
241
	 */
242
	public function load_plugin_textdomain() {
243
		load_plugin_textdomain( 'lsx-wetu-importer', false, basename( LSX_WETU_IMPORTER_PATH ) . '/languages' );
244
	}
245
246
	/**
247
	 * Sets the variables used throughout the plugin.
248
	 */
249
	public function set_variables() {
250
		$this->post_types = array( 'accommodation', 'destination', 'tour' );
251
		$options = lsx_wetu_get_options();
252
253
		// Set the options.
254
		$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...
255
256
		$temp_options = get_option( '_lsx-to_settings', false );
257
		if ( false !== $temp_options ) {
258
			$this->accommodation_settings = $temp_options['accommodation'];
259
			$this->tour_settings          = $temp_options['tour'];
260
			$this->destination_settings   = $temp_options['destination'];
261
		}
262
263
		$this->api_key = false;
264
265
		if ( ! defined( 'WETU_API_KEY' ) ) {
266
			if ( isset( $options['api_key'] ) && '' !== $options['api_key'] ) {
267
				$this->api_key = $options['api_key'];
268
			}
269
		} else {
270
			$this->api_key = WETU_API_KEY;
271
		}
272
273
		// Set the tab slug.
274
		// @codingStandardsIgnoreLine
275
		if ( isset( $_GET['tab'] ) || ( defined( 'DOING_AJAX' ) && isset( $_POST['type'] ) ) ) {
276
			if ( isset( $_GET['tab'] ) ) {
277
				$this->tab_slug = sanitize_text_field( $_GET['tab'] );
278
			} else {
279
				// @codingStandardsIgnoreLine
280
				$this->tab_slug = sanitize_text_field( $_POST['type'] );
281
			}
282
		}
283
284
		// If any tours were queued.
285
		$this->queued_imports = get_option( 'lsx_wetu_importer_que', array() );
286
287
		// Set the scaling options.
288
		if ( isset( $this->options ) && isset( $this->options['image_scaling'] ) ) {
289
			$this->scale_images = true;
290
291
			$width = '1024';
292 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...
293
				$width = $this->options['width'];
294
			}
295
296
			$height = '768';
297 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...
298
				$height = $this->options['height'];
299
			}
300
301
			$cropping = 'w';
302 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...
303
				$cropping = $this->options['cropping'];
304
			}
305
306
			$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...
307
		}
308
309
		if ( isset( $this->options ) && isset( $this->options['image_limit'] ) && '' !== $this->options['image_limit'] ) {
310
			$this->image_limit = $this->options['image_limit'];
311
		}
312
	}
313
314
	// COMPATABILITY FUNCTIONS.
315
316
	/**
317
	 * On plugin activation
318
	 *
319
	 * @since 1.0.0
320
	 */
321
	public static function register_activation_hook() {
322
		self::compatible_version_check_on_activation();
323
	}
324
325
	/**
326
	 * Check if the PHP version is compatible.
327
	 *
328
	 * @since 1.0.0
329
	 */
330
	public static function compatible_version() {
331
		if ( version_compare( PHP_VERSION, '5.6', '<' ) ) {
332
			return false;
333
		}
334
335
		return true;
336
	}
337
338
	/**
339
	 * The backup sanity check, in case the plugin is activated in a weird way,
340
	 * or the versions change after activation.
341
	 *
342
	 * @since 1.0.0
343
	 */
344
	public function compatible_version_check() {
345
		if ( ! self::compatible_version() ) {
346
			if ( is_plugin_active( plugin_basename( LSX_WETU_IMPORTER_CORE ) ) ) {
347
				deactivate_plugins( plugin_basename( LSX_WETU_IMPORTER_CORE ) );
348
				add_action( 'admin_notices', array( $this, 'compatible_version_notice' ) );
349
350
				if ( isset( $_GET['activate'] ) ) {
351
					unset( $_GET['activate'] );
352
				}
353
			}
354
		}
355
	}
356
357
	/**
358
	 * Display the notice related with the older version from PHP.
359
	 *
360
	 * @since 1.0.0
361
	 */
362
	public function compatible_version_notice() {
363
		$class = 'notice notice-error';
364
		$message = esc_html__( 'LSX Importer for Wetu Plugin requires PHP 5.6 or higher.', 'lsx-wetu-importer' );
365
		printf( '<div class="%1$s"><p>%2$s</p></div>', esc_html( $class ), esc_html( $message ) );
366
	}
367
368
	/**
369
	 * The primary sanity check, automatically disable the plugin on activation if it doesn't
370
	 * meet minimum requirements.
371
	 *
372
	 * @since 1.0.0
373
	 */
374
	public static function compatible_version_check_on_activation() {
375
		if ( ! self::compatible_version() ) {
376
			deactivate_plugins( plugin_basename( LSX_WETU_IMPORTER_CORE ) );
377
			wp_die( esc_html__( 'LSX Importer for Wetu Plugin requires PHP 5.6 or higher.', 'lsx-wetu-importer' ) );
378
		}
379
	}
380
381
	// DISPLAY FUNCTIONS.
382
383
	/**
384
	 * Load the importer class you want to use
385
	 */
386
	public function load_class() {
387
		switch ( $this->tab_slug ) {
388
			case 'accommodation':
389
				$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...
390
				break;
391
392
			case 'destination':
393
				$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...
394
				break;
395
396
			case 'tour':
397
				$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...
398
				break;
399
400
			case 'settings':
401
				$this->current_importer = LSX_WETU_Importer_Settings::get_instance();
0 ignored issues
show
Documentation Bug introduced by
It seems like \LSX_WETU_Importer_Settings::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...
402
				break;
403
404
			default:
405
				$this->current_importer = LSX_WETU_Importer_Welcome::get_instance();
0 ignored issues
show
Documentation Bug introduced by
It seems like \LSX_WETU_Importer_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...
406
				break;
407
		}
408
	}
409
410
	/**
411
	 * Registers the admin page which will house the importer form.
412
	 */
413
	public function register_importer_page() {
414
		add_submenu_page( 'tour-operator', esc_html__( 'Importer', 'tour-operator' ), esc_html__( 'Importer', 'tour-operator' ), 'manage_options', 'lsx-wetu-importer', array( $this, 'display_page' ) );
415
	}
416
417
	/**
418
	 * Enqueue the JS needed to contact wetu and return your result.
419
	 */
420
	public function admin_scripts() {
421
		if ( defined( 'WP_DEBUG' ) && true === WP_DEBUG ) {
422
			$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...
423
		} else {
424
			$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...
425
		}
426
427
		$min = '';
428
429
		if ( is_admin() && isset( $_GET['page'] ) && $this->plugin_slug === $_GET['page'] ) {
430
431
			wp_enqueue_style( 'lsx-wetu-importer-style', LSX_WETU_IMPORTER_URL . 'assets/css/lsx-wetu-importer.css', LSX_WETU_IMPORTER_VER, true );
432
			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 );
433
434
			wp_localize_script(
435
				'lsx-wetu-importers-script',
436
				'lsx_tour_importer_params',
437
				array(
438
					'ajax_url' => admin_url( 'admin-ajax.php' ),
439
					'ajax_nonce' => wp_create_nonce( 'lsx_wetu_ajax_action' ),
440
				)
441
			);
442
		}
443
	}
444
445
	/**
446
	 * Display the importer administration screen
447
	 */
448
	public function display_page() {
449
		?>
450
		<div class="wrap">
451
			<?php
452
			$this->navigation( $this->tab_slug );
453
			if ( 'default' !== $this->tab_slug && 'settings' !== $this->tab_slug ) {
454
				$this->wetu_status();
455
				$this->post_status_navigation();
456
			}
457
			$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...
458
			?>
459
		</div>
460
		<?php
461
	}
462
463
	/**
464
	 * Outputs the post status navigation
465
	 *
466
	 * @return void
467
	 */
468
	public function post_status_navigation() {
469
		?>
470
		<ul class="subsubsub">
471
			<li class="searchform"><a class="current" href="#search"><?php esc_attr_e( 'Search', 'lsx-wetu-importer' ); ?></a> | </li>
472
			<li class="publish"><a href="#publish"><?php esc_attr_e( 'Published', 'lsx-wetu-importer' ); ?> <span class="count"> (<?php echo esc_attr( lsx_wetu_get_post_count( $this->tab_slug, 'publish ' ) ); ?>)</span></a> | </li>
473
			<li class="pending"><a href="#pending"><?php esc_attr_e( 'Pending', 'lsx-wetu-importer' ); ?> <span class="count"> (<?php echo esc_attr( lsx_wetu_get_post_count( $this->tab_slug, 'pending ' ) ); ?>)</span></a>| </li> 
474
			<li class="draft"><a href="#draft"><?php esc_attr_e( 'Draft', 'lsx-wetu-importer' ); ?></a> <span class="count"> (<?php echo esc_attr( lsx_wetu_get_post_count( $this->tab_slug, 'draft ' ) ); ?>)</span></li>
475
476
			<?php if ( 'tour' === $this->tab_slug ) { ?>
477
				<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_get_tour_count() ); ?>)</span></a></li>
478
			<?php } else if ( ! empty( $this->queued_imports ) ) { ?>
479
				<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_get_queue_count( $this->tab_slug ) ); ?>)</span></a></li>
480
			<?php } ?>
481
		</ul>
482
		<?php
483
	}
484
485
	/**
486
	 * Search Form
487
	 */
488
	public function search_form() {
489
		?>
490
		<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 ); ?>">
491
			<input type="hidden" name="page" value="<?php echo esc_attr( $this->tab_slug ); ?>" />
492
493
			<?php do_action( 'lsx_wetu_importer_search_form',$this ); ?>
494
495
			<div class="normal-search">
496
				<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' ); ?>" />
497
			</div>
498
499
			<div class="advanced-search hidden" style="display:none;">
500
				<textarea rows="10" cols="40" name="bulk-keywords"></textarea>
501
				<input class="button button-primary submit" type="submit" value="<?php esc_attr_e( 'Search', 'lsx-wetu-importer' ); ?>" />
502
			</div>
503
504
			<div class="ajax-loader" style="display:none;width:100%;text-align:center;">
505
				<img style="width:64px;" src="<?php echo esc_url( LSX_WETU_IMPORTER_URL . 'assets/images/ajaxloader.gif' ); ?>" />
506
			</div>
507
508
			<div class="ajax-loader-small" style="display:none;width:100%;text-align:center;">
509
				<img style="width:32px;" src="<?php echo esc_url( LSX_WETU_IMPORTER_URL . 'assets/images/ajaxloader.gif' ); ?>" />
510
			</div>
511
512
			<a class="button advanced-search-toggle" href="#"><?php esc_html_e( 'Bulk Search', 'lsx-wetu-importer' ); ?></a>
513
		</form>
514
		<?php
515
	}
516
517
	/**
518
	 * The header of the item list
519
	 */
520
	public function table_header() {
521
		?>
522
		<thead>
523
		<tr>
524
			<th style="" class="manage-column column-cb check-column" id="cb" scope="col">
525
				<label for="cb-select-all-1" class="screen-reader-text">Select All</label>
526
				<input type="checkbox" id="cb-select-all-1">
527
			</th>
528
			<th style="" class="manage-column column-title " id="title" style="width:50%;" scope="col">Title</th>
529
			<th style="" class="manage-column column-date" id="date" scope="col">Date</th>
530
			<th style="" class="manage-column column-ssid" id="ssid" scope="col">WETU ID</th>
531
		</tr>
532
		</thead>
533
		<?php
534
	}
535
536
	/**
537
	 * The footer of the item list
538
	 */
539
	public function table_footer() {
540
		?>
541
		<tfoot>
542
		<tr>
543
			<th style="" class="manage-column column-cb check-column" id="cb" scope="col">
544
				<label for="cb-select-all-1" class="screen-reader-text">Select All</label>
545
				<input type="checkbox" id="cb-select-all-1">
546
			</th>
547
			<th style="" class="manage-column column-title" scope="col">Title</th>
548
			<th style="" class="manage-column column-date" scope="col">Date</th>
549
			<th style="" class="manage-column column-ssid" scope="col">WETU ID</th>
550
		</tr>
551
		</tfoot>
552
		<?php
553
	}
554
555
	/**
556
	 * Displays the importers navigation.
557
	 *
558
	 * @param $tab string
559
	 */
560
	public function navigation( $tab = '' ) {
561
		$post_types = array(
562
			'tour'          => esc_attr( 'Tours', 'lsx-wetu-importer' ),
563
			'accommodation' => esc_attr( 'Accommodation', 'lsx-wetu-importer' ),
564
			'destination'   => esc_attr( 'Destinations', 'lsx-wetu-importer' ),
565
		);
566
567
		echo wp_kses_post( '<div class="wp-filter">' );
568
		echo wp_kses_post( '<ul class="filter-links">' );
569
		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...
570
571
		foreach ( $post_types as $post_type => $label ) {
572
			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...
573
		}
574
575
		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...
576
		echo wp_kses_post( '</ul> </div>' );
577
	}
578
579
	/**
580
	 * Wetu Status Bar.
581
	 */
582
	public function wetu_status() {
583
		$tours = get_transient( 'lsx_ti_tours' );
584
		echo '<div class="wetu-status tour-wetu-status"><h3>' . esc_html__( 'Wetu Status','lsx-wetu-importer' ) . ' - ';
585
586
		if ( '' === $tours || false === $tours || isset( $_GET['refresh_tours'] ) ) {
587
			$result = $this->update_options();
588
589
			if ( true === $result ) {
590
				echo '<span style="color:green;">' . esc_attr( 'Connected','lsx-wetu-importer' ) . '</span>';
591
				echo ' - <small><a href="#">' . esc_attr( 'Refresh','lsx-wetu-importer' ) . '</a></small>';
592
			} else {
593
				echo '<span style="color:red;">' . wp_kses_post( $result ) . '</span>';
594
			}
595
		} else {
596
			echo '<span style="color:green;">' . esc_attr( 'Connected','lsx-wetu-importer' ) . '</span> - <small><a href="#">' . esc_attr( 'Refresh','lsx-wetu-importer' ) . '</a></small>';
597
		}
598
		echo '</h3>';
599
		echo '</div>';
600
	}
601
602
	/**
603
	 * Set_taxonomy with some terms
604
	 */
605
	public function team_member_checkboxes( $selected = array() ) {
606
		if ( post_type_exists( 'team' ) ) { ?>
607
			<ul>
608
				<?php
609
					$team_args = array(
610
						'post_type'	=> 'team',
611
						'post_status' => 'publish',
612
						'nopagin' => true,
613
						'fields' => 'ids',
614
					);
615
616
					$team_members = new WP_Query( $team_args );
617
618
					if ( $team_members->have_posts() ) {
619
						foreach ( $team_members->posts as $member ) {
620
							?>
621
							<li><input class="team" <?php $this->checked( $selected, $member ); ?> type="checkbox" value="<?php echo esc_attr( $member ); ?>" /> <?php echo wp_kses_post( 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...
622
							<?php
623
						}
624
					} else { ?>
625
						<li><input class="team" type="checkbox" value="0" /> <?php esc_html_e( 'None', 'lsx-wetu-importer' ); ?></li>
626
					<?php }
627
				?>
628
			</ul>
629
		<?php }
630
	}
631
632
633
	// GENERAL FUNCTIONS.
634
635
	/**
636
	 * Checks to see if an item is checked.
637
	 *
638
	 * @param $haystack array|string
639
	 * @param $needle string
640
	 * @param $echo bool
641
	 */
642 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...
643
		$return = $this->itemd( $haystack,$needle, 'checked' );
644
645
		if ( '' !== $return ) {
646
			if ( true === $echo ) {
647
				echo wp_kses_post( $return );
648
			} else {
649
				return $return;
650
			}
651
		}
652
	}
653
654
	/**
655
	 * Checks to see if an item is checked.
656
	 *
657
	 * @param $haystack array|string
658
	 * @param $needle string
659
	 * @param $echo bool
660
	 */
661 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...
662
		$return = $this->itemd( $haystack, $needle, 'selected' );
663
664
		if ( '' !== $return ) {
665
			if ( true === $echo ) {
666
				echo wp_kses_post( $return );
667
			} else {
668
				return $return;
669
			}
670
		}
671
	}
672
673
	/**
674
	 * Checks to see if an item is selected. If $echo is false,  it will return the $type if conditions are true.
675
	 *
676
	 * @param $haystack array|string
677
	 * @param $needle string
678
	 * @param $type string
679
	 * @param $wrap bool
680
	 * @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...
681
	 */
682
	public function itemd( $haystack = false, $needle = '', $type = '', $wrap = true ) {
683
		$html = '';
684
685
		if ( '' !== $type ) {
686
			if ( ! is_array( $haystack ) ) {
687
				$haystack = array( $haystack );
688
			}
689
			if ( in_array( $needle, $haystack ) ) {
690
				if ( true === $wrap || 'true' === $wrap ) {
691
					$html = $type . '="' . $type . '"';
692
				} else {
693
					$html = $type;
694
				}
695
			}
696
		}
697
698
		return $html;
699
	}
700
701
	/**
702
	 * Grabs any attachments for the current item
703
	 */
704
	public function find_attachments( $id = false ) {
705
		if ( false !== $id ) {
706
			if ( empty( $this->found_attachments ) ) {
707
				$attachments_args = array(
708
					'post_parent' => $id,
709
					'post_status' => 'inherit',
710
					'post_type' => 'attachment',
711
					'order' => 'ASC',
712
					'nopagin' => 'true',
713
					'posts_per_page' => '-1',
714
				);
715
716
				$attachments = new WP_Query( $attachments_args );
717
718
				if ( $attachments->have_posts() ) {
719
					foreach ( $attachments->posts as $attachment ) {
720
						$this->found_attachments[ $attachment->ID ] = str_replace( array( '.jpg', '.png', '.jpeg' ), '', $attachment->post_title );
721
					}
722
				}
723
			}
724
		}
725
	}
726
727
	// CUSTOM FIELD FUNCTIONS.
728
729
	/**
730
	 * Saves the room data
731
	 */
732
	public function save_custom_field( $value = false, $meta_key, $id, $decrease = false, $unique = true ) {
733
		if ( false !== $value ) {
734
			if ( false !== $decrease ) {
735
				$value = intval( $value );
736
				$value--;
737
			}
738
739
			$prev = get_post_meta( $id, $meta_key, true );
740
741
			if ( false !== $id && '0' !== $id && false !== $prev && true === $unique ) {
742
				update_post_meta( $id, $meta_key, $value, $prev );
743
			} else {
744
				add_post_meta( $id, $meta_key, $value, $unique );
745
			}
746
		}
747
	}
748
749
	/**
750
	 * Grabs the custom fields,  and resaves an array of unique items.
751
	 */
752
	public function cleanup_posts() {
753
		if ( ! empty( $this->cleanup_posts ) ) {
754
755
			foreach ( $this->cleanup_posts as $id => $key ) {
756
				$prev_items = get_post_meta( $id, $key, false );
757
				$new_items = array_unique( $prev_items );
758
				delete_post_meta( $id, $key );
759
760
				foreach ( $new_items as $new_item ) {
761
					add_post_meta( $id, $key, $new_item, false );
762
				}
763
			}
764
		}
765
	}
766
767
	// TAXONOMY FUNCTIONS.
768
769
	/**
770
	 * Set_taxonomy with some terms
771
	 */
772
	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...
773
		$result = array();
774
775
		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...
776
			foreach ( $data as $k ) {
777
				if ( $id ) {
778
					$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...
779
					if ( ! $term ) {
780
						$term = wp_insert_term( trim( $k ), $tax );
781
782 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...
783
							echo wp_kses_post( $term->get_error_message() );
784
						} else {
785
							wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
786
						}
787
					} else {
788
						wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
789
					}
790
				} else {
791
					$result[] = trim( $k );
792
				}
793
			}
794
		}
795
		return $result;
796
	}
797
798
	/**
799
	 * Sets the terms of the current post
800
	 *
801
	 * @param boolean $id
802
	 * @param boolean $name
803
	 * @param boolean $taxonomy
804
	 * @param boolean $parent
805
	 * @return void
806
	 */
807
	public function set_term( $id = false, $name = false, $taxonomy = false, $parent = false ) {
808
		$term = term_exists( $name, $taxonomy );
809
		if ( ! $term ) {
810
			if ( false !== $parent ) {
811
				$parent = array(
812
					'parent' => $parent,
813
				);
814
			}
815
			$term = wp_insert_term( trim( $name ), $taxonomy,$parent );
816
817 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...
818
				echo wp_kses_post( $term->get_error_message() );
819
			} else {
820
				wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
821
			}
822
		} else {
823
			wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
824
		}
825
826
		return $term['term_id'];
827
	}
828
829
	/**
830
	 * set_taxonomy with some terms
831
	 */
832
	public function taxonomy_checkboxes( $taxonomy = false, $selected = array() ) {
833
		$return = '';
834
835
		if ( false !== $taxonomy ) {
836
			$return .= '<ul>';
837
			$terms = get_terms( array(
838
				'taxonomy' => $taxonomy,
839
				'hide_empty' => false,
840
			) );
841
842
			if ( ! is_wp_error( $terms ) ) {
843
				foreach ( $terms as $term ) {
844
					$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...
845
				}
846
			} else {
847
				$return .= '<li><input type="checkbox" value="" /> ' . __( 'None', 'lsx-wetu-importer' ) . '</li>';
848
			}
849
850
			$return .= '</ul>';
851
		}
852
853
		return $return;
854
	}
855
856
	// MAP FUNCTIONS
857
858
	/**
859
	 * Saves the longitude and lattitude, as well as sets the map marker.
860
	 */
861
	public function set_map_data( $data, $id, $zoom = '10' ) {
862
		$longitude = false;
863
		$latitude = false;
864
		$address = false;
865
866
		if ( isset( $data[0]['position'] ) ) {
867 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...
868
				$latitude = $data[0]['position']['driving_latitude'];
869
			} elseif ( isset( $data[0]['position']['latitude'] ) ) {
870
				$latitude = $data[0]['position']['latitude'];
871
			}
872
873 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...
874
				$longitude = $data[0]['position']['driving_longitude'];
875
			} elseif ( isset( $data[0]['position']['longitude'] ) ) {
876
				$longitude = $data[0]['position']['longitude'];
877
			}
878
		}
879
880
		if ( isset( $data[0]['content'] ) && isset( $data[0]['content']['contact_information'] ) ) {
881
			if ( isset( $data[0]['content']['contact_information']['address'] ) ) {
882
				$address = strip_tags( $data[0]['content']['contact_information']['address'] );
883
				$address = explode( "\n", $address );
884
885
				foreach ( $address as $bitkey => $bit ) {
886
					$bit = ltrim( rtrim( $bit ) );
887
888
					if ( false === $bit || '' === $bit || null === $bit || empty( $bit ) ) {
889
						unset( $address[ $bitkey ] );
890
					}
891
				}
892
893
				$address = implode( ', ',$address );
894
				$address = str_replace( ', , ', ', ', $address );
895
			}
896
		}
897
898
		if ( false !== $longitude ) {
899
			$location_data = array(
900
				'address'	=> (string) $address,
901
				'lat'		=> (string) $latitude,
902
				'long'		=> (string) $longitude,
903
				'zoom'		=> (string) $zoom,
904
				'elevation'	=> '',
905
			);
906
907 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...
908
				$prev = get_post_meta( $id,'location',true );
909
				update_post_meta( $id,'location',$location_data,$prev );
910
			} else {
911
				add_post_meta( $id,'location',$location_data,true );
912
			}
913
		}
914
	}
915
916
	// IMAGE FUNCTIONS
917
918
	/**
919
	 * Creates the main gallery data
920
	 */
921
	public function set_featured_image( $data, $id ) {
922
		if ( is_array( $data[0]['content']['images'] ) && ! empty( $data[0]['content']['images'] ) ) {
923
			$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...
924
				'width' => '800',
925
				'height' => '600',
926
				'cropping' => 'h',
927
			) );
928
929
			if ( false !== $this->featured_image ) {
930
				delete_post_meta( $id,'_thumbnail_id' );
931
				add_post_meta( $id,'_thumbnail_id',$this->featured_image,true );
932
			}
933
		}
934
	}
935
936
	/**
937
	 * Sets a banner image
938
	 */
939
	public function set_banner_image( $data, $id, $content = array( 'none' ) ) {
940
		if ( is_array( $data[0]['content']['images'] ) && ! empty( $data[0]['content']['images'] ) ) {
941
			if ( in_array( 'unique_banner_image', $content ) && isset( $data[0]['destination_image'] ) && is_array( $data[0]['destination_image'] ) ) {
942
				$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...
943
					'width' => '1920',
944
					'height' => '600',
945
					'cropping' => 'c',
946
				));
947
			} else {
948
				$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...
949
					'width' => '1920',
950
					'height' => '600',
951
					'cropping' => 'c',
952
				));
953
			}
954
955 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...
956
				$this->banner_image = $temp_banner;
957
958
				delete_post_meta( $id,'image_group' );
959
960
				$new_banner = array(
961
					'banner_image' => array(
962
						'cmb-field-0' => $this->banner_image,
963
					),
964
				);
965
966
				add_post_meta( $id,'image_group',$new_banner,true );
967
			}
968
		}
969
	}
970
971
	/**
972
	 * Creates the main gallery data
973
	 */
974
	public function create_main_gallery( $data, $id ) {
975
		if ( is_array( $data[0]['content']['images'] ) && ! empty( $data[0]['content']['images'] ) ) {
976
			if ( isset( $this->options['image_replacing'] ) && 'on' === $this->options['image_replacing'] ) {
977
				$current_gallery = get_post_meta( $id, 'gallery', false );
978
979
				if ( false !== $current_gallery && ! empty( $current_gallery ) ) {
980
					foreach ( $current_gallery as $g ) {
981
						delete_post_meta( $id,'gallery', $g );
982
983
						if ( 'attachment' === get_post_type( $g ) ) {
984
							wp_delete_attachment( $g, true );
985
						}
986
					}
987
				}
988
			}
989
990
			$counter = 0;
991
992
			foreach ( $data[0]['content']['images'] as $image_data ) {
993
				if ( ( 0 === $counter && false !== $this->featured_image ) || ( 1 === $counter && false !== $this->banner_image ) ) {
994
					$counter++;
995
996
					if ( false !== $this->image_limit && false !== $this->image_limit ) {
997
						$this->image_limit++;
998
					}
999
1000
					continue;
1001
				}
1002
1003
				if ( false !== $this->image_limit && $counter >= $this->image_limit ) {
1004
					continue;
1005
				}
1006
1007
				$this->gallery_meta[] = $this->attach_image( $image_data,$id );
1008
				$counter++;
1009
			}
1010
1011
			if ( ! empty( $this->gallery_meta ) ) {
1012
				delete_post_meta( $id,'gallery' );
1013
				$this->gallery_meta = array_unique( $this->gallery_meta );
1014
1015
				foreach ( $this->gallery_meta as $gallery_id ) {
1016
					if ( false !== $gallery_id && '' !== $gallery_id && ! is_array( $gallery_id ) ) {
1017
						add_post_meta( $id,'gallery',$gallery_id,false );
1018
					}
1019
				}
1020
			}
1021
		}
1022
	}
1023
1024
	/**
1025
	 * search_form
1026
	 */
1027
	public function get_scaling_url( $args = array() ) {
1028
		$defaults = array(
1029
			'width' => '1024',
1030
			'height' => '768',
1031
			//'cropping' => 'w',
1032
			'cropping' => 'h',
1033
		);
1034
1035
		if ( false !== $this->options ) {
1036 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...
1037
				$defaults['width'] = $this->options['width'];
1038
			}
1039
1040 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...
1041
				$defaults['height'] = $this->options['height'];
1042
			}
1043
1044 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...
1045
				$defaults['cropping'] = $this->options['cropping'];
1046
			}
1047
		}
1048
1049
		$args = wp_parse_args( $args, $defaults );
1050
		$cropping = $args['cropping'];
1051
		$width = $args['width'];
1052
		$height = $args['height'];
1053
1054
		return 'https://wetu.com/ImageHandler/' . $cropping . $width . 'x' . $height . '/';
1055
	}
1056
1057
	/**
1058
	 * Attaches 1 image
1059
	 */
1060
	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...
1061
		if ( false !== $v ) {
1062
			$temp_fragment = explode( '/',$v['url_fragment'] );
1063
			$url_filename = $temp_fragment[ count( $temp_fragment ) -1 ];
1064
			$url_filename = str_replace( array( '.jpg', '.png', '.jpeg' ),'',$url_filename );
1065
			$url_filename = trim( $url_filename );
1066
			$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...
1067
			$url_filename = str_replace( ' ','_',$url_filename );
1068
1069
			if ( ! isset( $this->options['image_replacing'] ) && in_array( $url_filename, $this->found_attachments ) ) {
1070
				return array_search( $url_filename,$this->found_attachments );
1071
			}
1072
1073
			$postdata = array();
1074
1075
			if ( empty( $v['label'] ) ) {
1076
				$v['label'] = '';
1077
			}
1078
1079 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...
1080
				$desc = wp_strip_all_tags( $v['description'] );
1081
				$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...
1082
					'post_excerpt' => $desc,
1083
				);
1084
			}
1085
1086 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...
1087
				$desc = wp_strip_all_tags( $v['section'] );
1088
				$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...
1089
					'post_excerpt' => $desc,
1090
				);
1091
			}
1092
1093
			$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...
1094
			//Resizor - add option to setting if required
1095
			$fragment = str_replace( ' ','%20',$v['url_fragment'] );
1096
			$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...
1097
1098
			$attach_id = $this->attach_external_image2( $url,$parent_id,'',$v['label'],$postdata );
1099
1100
			$this->found_attachments[ $attach_id ] = $url_filename;
1101
1102
			//echo($attach_id.' add image');
1103
			if ( ! empty( $attach_id ) ) {
1104
				return $attach_id;
1105
			}
1106
		}
1107
		return 	false;
1108
	}
1109
1110
	public function attach_external_image2( $url = null, $post_id = null, $thumb = null, $filename = null, $post_data = array() ) {
1111
		if ( ! $url || ! $post_id ) { return new WP_Error( 'missing', 'Need a valid URL and post ID...' ); }
1112
		$att_id = false;
1113
1114
		require_once( ABSPATH . 'wp-admin/includes/file.php' );
1115
		require_once( ABSPATH . 'wp-admin/includes/media.php' );
1116
		require_once( ABSPATH . 'wp-admin/includes/image.php' );
1117
		// Download file to temp location, returns full server path to temp file.
1118
1119
		$tmp   = tempnam( '/tmp', 'FOO' );
1120
		$image = wp_remote_get( $url );
1121
		if ( ! empty( $image ) && isset( $image['response'] ) && isset( $image['response']['code'] ) && 200 === $image['response']['code'] ) {
1122
			file_put_contents( $tmp, $image['body'] );
1123
			chmod( $tmp,'777' );
1124
1125
			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
1126
			$url_filename = basename( $matches[0] );
1127
			$url_filename = str_replace( '%20','_',$url_filename );
1128
			// extract filename from url for title
1129
			$url_type = wp_check_filetype( $url_filename );                                           // determine file type (ext and mime/type)
1130
1131
			// override filename if given, reconstruct server path.
1132
			if ( ! empty( $filename ) && ' ' != $filename ) {
1133
				$filename = sanitize_file_name( $filename );
1134
				$tmppath = pathinfo( $tmp );
1135
1136
				$extension = '';
1137
				if ( isset( $tmppath['extension'] ) ) {
1138
					$extension = $tmppath['extension'];
1139
				}
1140
1141
				$new = $tmppath['dirname'] . '/' . $filename . '.' . $extension;
1142
				rename( $tmp, $new );                                                                 // renames temp file on server
1143
				$tmp = $new;                                                                        // push new filename (in path) to be used in file array later
1144
			}
1145
1146
			// assemble file data (should be built like $_FILES since wp_handle_sideload() will be using).
1147
			$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...
1148
1149 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...
1150
				$file_array['name'] = $filename . '.' . $url_type['ext'];                           // user given filename for title, add original URL extension
1151
			} else {
1152
				$file_array['name'] = $url_filename;                                                // just use original URL filename
1153
			}
1154
1155
			// set additional wp_posts columns.
1156 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...
1157
1158
				$url_filename = str_replace( '%20',' ', $url_filename );
1159
1160
				$post_data['post_title'] = basename( $url_filename, '.' . $url_type['ext'] );         // just use the original filename (no extension)
1161
			}
1162
1163
			// make sure gets tied to parent.
1164
			if ( empty( $post_data['post_parent'] ) ) {
1165
				$post_data['post_parent'] = $post_id;
1166
			}
1167
1168
			// do the validation and storage stuff.
1169
			$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
1170
1171
			// If error storing permanently, unlink.
1172
			if ( is_wp_error( $att_id ) ) {
1173
				unlink( $file_array['tmp_name'] );
1174
				return false;
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=' . $_GET['type'];
1326
			$options[] = $_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 View Code Duplication
		} elseif ( isset( $tours['itineraries'] ) && ! empty( $tours['itineraries'] ) ) {
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...
1339
			set_transient( 'lsx_ti_tours', $tours['itineraries'], 60 * 60 * 2 );
1340
			return true;
1341
		}
1342
	}
1343
1344
	/**
1345
	 * Gets the post_id from the key
1346
	 *
1347
	 * @param boolean $wetu_id
1348
	 * @return string
1349
	 */
1350
	public function get_post_id_by_key_value( $wetu_id = false ) {
1351
		global $wpdb;
1352
		$id = false;
1353
		if ( false !== $wetu_id && '' !== $wetu_id ) {
1354
			$result = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM `$wpdb->postmeta` WHERE `meta_key` = 'lsx_wetu_id' AND `meta_value` = '%s'", array( $wetu_id ) ) );
1355
			if ( false !== $result && ! empty( $result ) ) {
1356
				$id = $result;
1357
			}
1358
		}
1359
		return $id;
1360
	}
1361
}
1362
1363
$lsx_wetu_importer = new LSX_WETU_Importer();
1364