Passed
Push — master ( b8c4be...2248f7 )
by Warwick
02:08
created

LSX_WETU_Importer::set_team_member()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

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