Completed
Push — master ( 02b793...7006ed )
by Warwick
10:41 queued 02:31
created

WETU_Importer::admin_scripts()   B

Complexity

Conditions 6
Paths 4

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

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

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

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

Loading history...
252
253
			$temp_options = get_option( '_lsx-to_settings', false );
254
			if ( false !== $temp_options ) {
255
				$this->accommodation_settings = $temp_options['accommodation'];
256
				$this->tour_settings          = $temp_options['tour'];
257
				$this->destination_settings   = $temp_options['destination'];
258
			}
259
260
			$this->api_key = false;
261
262
			if ( ! defined( 'WETU_API_KEY' ) ) {
263
				if ( isset( $options['api_key'] ) && '' !== $options['api_key'] ) {
264
					$this->api_key = $options['api_key'];
265
				}
266
			} else {
267
				$this->api_key = WETU_API_KEY;
268
			}
269
270
			// Set the tab slug.
271
			if ( isset( $_GET['tab'] ) || isset( $_POST['type'] ) ) {
272
				if ( isset( $_GET['tab'] ) ) {
273
					$this->tab_slug = wp_unslash( $_GET['tab'] );
274
				} else {
275
					$this->tab_slug = wp_unslash( $_POST['type'] );
276
				}
277
278
				// If any tours were queued.
279
				$this->queued_imports = get_option( 'wetu_importer_que', array() );
280
			}
281
282
			// Set the scaling options.
283
			if ( isset( $this->options ) && isset( $this->options['image_scaling'] ) ) {
284
				$this->scale_images = true;
285
286
				$width = '1024';
287 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...
288
					$width = $this->options['width'];
289
				}
290
291
				$height = '768';
292 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...
293
					$height = $this->options['height'];
294
				}
295
296
				$cropping = 'w';
297 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...
298
					$cropping = $this->options['cropping'];
299
				}
300
301
				$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...
302
			}
303
304
			if ( isset( $this->options ) && isset( $this->options['image_limit'] ) && '' !== $this->options['image_limit'] ) {
305
				$this->image_limit = $this->options['image_limit'];
306
			}
307
		}
308
	}
309
310
	// COMPATABILITY FUNCTIONS.
311
312
	/**
313
	 * On plugin activation
314
	 *
315
	 * @since 1.0.0
316
	 */
317
	public static function register_activation_hook() {
318
		self::compatible_version_check_on_activation();
319
	}
320
321
	/**
322
	 * Check if the PHP version is compatible.
323
	 *
324
	 * @since 1.0.0
325
	 */
326
	public static function compatible_version() {
327
		if ( version_compare( PHP_VERSION, '5.6', '<' ) ) {
328
			return false;
329
		}
330
331
		return true;
332
	}
333
334
	/**
335
	 * The backup sanity check, in case the plugin is activated in a weird way,
336
	 * or the versions change after activation.
337
	 *
338
	 * @since 1.0.0
339
	 */
340
	public function compatible_version_check() {
341
		if ( ! self::compatible_version() ) {
342
			if ( is_plugin_active( plugin_basename( WETU_IMPORTER_CORE ) ) ) {
343
				deactivate_plugins( plugin_basename( WETU_IMPORTER_CORE ) );
344
				add_action( 'admin_notices', array( $this, 'compatible_version_notice' ) );
345
346
				if ( isset( $_GET['activate'] ) ) {
347
					unset( $_GET['activate'] );
348
				}
349
			}
350
		}
351
	}
352
353
	/**
354
	 * Display the notice related with the older version from PHP.
355
	 *
356
	 * @since 1.0.0
357
	 */
358
	public function compatible_version_notice() {
359
		$class = 'notice notice-error';
360
		$message = esc_html__( 'Wetu Importer Plugin requires PHP 5.6 or higher.', 'wetu-importer' );
361
		printf( '<div class="%1$s"><p>%2$s</p></div>', esc_html( $class ), esc_html( $message ) );
362
	}
363
364
	/**
365
	 * The primary sanity check, automatically disable the plugin on activation if it doesn't
366
	 * meet minimum requirements.
367
	 *
368
	 * @since 1.0.0
369
	 */
370
	public static function compatible_version_check_on_activation() {
371
		if ( ! self::compatible_version() ) {
372
			deactivate_plugins( plugin_basename( WETU_IMPORTER_CORE ) );
373
			wp_die( esc_html__( 'Wetu Importer Plugin requires PHP 5.6 or higher.', 'wetu-importer' ) );
374
		}
375
	}
376
377
	// DISPLAY FUNCTIONS.
378
379
	/**
380
	 * Load the importer class you want to use
381
	 */
382
	public function load_class() {
383
		switch ( $this->tab_slug ) {
384
			case 'accommodation':
385
				$this->current_importer = new WETU_Importer_Accommodation();
0 ignored issues
show
Documentation Bug introduced by
It seems like new \WETU_Importer_Accommodation() of type object<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...
386
				break;
387
388
			case 'destination':
389
				$this->current_importer = new WETU_Importer_Destination();
0 ignored issues
show
Documentation Bug introduced by
It seems like new \WETU_Importer_Destination() of type object<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...
390
				break;
391
392
			case 'tour':
393
				$this->current_importer = new WETU_Importer_Tours();
0 ignored issues
show
Documentation Bug introduced by
It seems like new \WETU_Importer_Tours() of type object<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...
394
				break;
395
396
			case 'settings':
397
				$this->current_importer = \wetu_importer\classes\Settings::get_instance();
0 ignored issues
show
Documentation Bug introduced by
It seems like \wetu_importer\classes\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...
398
				break;
399
400
			default:
401
				$this->current_importer = \wetu_importer\classes\Welcome::get_instance();
0 ignored issues
show
Documentation Bug introduced by
It seems like \wetu_importer\classes\Welcome::get_instance() of type object is incompatible with the declared type integer of property $current_importer.

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

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

Loading history...
402
				break;
403
		}
404
	}
405
406
	/**
407
	 * Registers the admin page which will house the importer form.
408
	 */
409
	public function register_importer_page() {
410
		add_submenu_page( 'tour-operator', esc_html__( 'Importer', 'tour-operator' ), esc_html__( 'Importer', 'tour-operator' ), 'manage_options', 'wetu-importer', array( $this, 'display_page' ) );
411
	}
412
413
	/**
414
	 * Enqueue the JS needed to contact wetu and return your result.
415
	 */
416
	public function admin_scripts() {
417
		if ( defined( 'WP_DEBUG' ) && true === WP_DEBUG ) {
418
			$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...
419
		} else {
420
			$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...
421
		}
422
423
		$min = '';
424
425
		if ( is_admin() && isset( $_GET['page'] ) && $this->plugin_slug === $_GET['page'] ) {
426
427
			wp_enqueue_style( 'wetu-importer-style', WETU_IMPORTER_URL . 'assets/css/wetu-importer.css', WETU_IMPORTER_VER, true );
428
			wp_enqueue_script( 'wetu-importers-script', WETU_IMPORTER_URL . 'assets/js/wetu-importer' . $min . '.js', array( 'jquery' ), WETU_IMPORTER_VER, true );
429
430
			wp_localize_script(
431
				'wetu-importers-script',
432
				'lsx_tour_importer_params',
433
				array(
434
					'ajax_url' => admin_url( 'admin-ajax.php' ),
435
				)
436
			);
437
		}
438
	}
439
440
	/**
441
	 * Display the importer administration screen
442
	 */
443
	public function display_page() {
444
		?>
445
		<div class="wrap">
446
			<?php
447
				$this->navigation( $this->tab_slug );
448
				if ( 'default' !== $this->tab_slug && 'settings' !== $this->tab_slug ) {	
449
					$this->wetu_status();
450
					$this->post_status_navigation();
451
				}
452
				$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...
453
			?>
454
		</div>
455
		<?php
456
	}
457
458
	/**
459
	 * Outputs the post status navigation
460
	 *
461
	 * @return void
462
	 */
463
	public function post_status_navigation() {
464
		?>
465
		<ul class="subsubsub">
466
			<li class="searchform"><a class="current" href="#search"><?php esc_attr_e( 'Search', 'wetu-importer' ); ?></a> | </li>
467
			<li class="publish"><a href="#publish"><?php esc_attr_e( 'Published', 'wetu-importer' ); ?> <span class="count"> (<?php echo esc_attr( \wetu_importer\includes\helpers\get_post_count( $this->tab_slug, 'publish ' ) ); ?>)</span></a> | </li>
468
			<li class="pending"><a href="#pending"><?php esc_attr_e( 'Pending', 'wetu-importer' ); ?> <span class="count"> (<?php echo esc_attr( \wetu_importer\includes\helpers\get_post_count( $this->tab_slug, 'pending ' ) ); ?>)</span></a>| </li> 
469
			<li class="draft"><a href="#draft"><?php esc_attr_e( 'Draft', 'wetu-importer' ); ?></a> <span class="count"> (<?php echo esc_attr( \wetu_importer\includes\helpers\get_post_count( $this->tab_slug, 'draft ' ) ); ?>)</span></li>
470
471
			<?php if ( 'tour' === $this->tab_slug ) { ?>
472
				<li class="import"> | <a class="import search-toggle"  href="#import"><?php esc_attr_e( 'WETU', 'wetu-importer' ); ?> <span class="count"> (<?php echo esc_attr( \wetu_importer\includes\helpers\get_wetu_tour_count() ); ?>)</span></a></li>
473
			<?php } else if ( ! empty( $this->queued_imports ) ) { ?>
474
				<li class="import"> | <a class="import search-toggle"  href="#import"><?php esc_attr_e( 'WETU Queue', 'wetu-importer' ); ?> <span class="count"> (<?php echo esc_attr( \wetu_importer\includes\helpers\get_wetu_queue_count( $this->tab_slug ) ); ?>)</span></a></li>
475
			<?php } ?>
476
		</ul>
477
		<?php
478
	}
479
480
	/**
481
	 * Search Form
482
	 */
483
	public function search_form() {
484
		?>
485
		<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 ); ?>">
486
			<input type="hidden" name="page" value="<?php echo esc_attr( $this->tab_slug ); ?>" />
487
488
			<?php do_action( 'wetu_importer_search_form',$this ); ?>
489
490
			<div class="normal-search">
491
				<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', 'wetu-importer' ); ?>" />
492
			</div>
493
494
			<div class="advanced-search hidden" style="display:none;">
495
				<textarea rows="10" cols="40" name="bulk-keywords"></textarea>
496
				<input class="button button-primary submit" type="submit" value="<?php esc_attr_e( 'Search', 'wetu-importer' ); ?>" />
497
			</div>
498
499
			<div class="ajax-loader" style="display:none;width:100%;text-align:center;">
500
				<img style="width:64px;" src="<?php echo esc_url( WETU_IMPORTER_URL . 'assets/images/ajaxloader.gif' ); ?>" />
501
			</div>
502
503
			<div class="ajax-loader-small" style="display:none;width:100%;text-align:center;">
504
				<img style="width:32px;" src="<?php echo esc_url( WETU_IMPORTER_URL . 'assets/images/ajaxloader.gif' ); ?>" />
505
			</div>
506
507
			<a class="button advanced-search-toggle" href="#"><?php esc_html_e( 'Bulk Search', 'wetu-importer' ); ?></a>
508
		</form>
509
		<?php
510
	}
511
512
	/**
513
	 * The header of the item list
514
	 */
515
	public function table_header() {
516
		?>
517
		<thead>
518
		<tr>
519
			<th style="" class="manage-column column-cb check-column" id="cb" scope="col">
520
				<label for="cb-select-all-1" class="screen-reader-text">Select All</label>
521
				<input type="checkbox" id="cb-select-all-1">
522
			</th>
523
			<th style="" class="manage-column column-title " id="title" style="width:50%;" scope="col">Title</th>
524
			<th style="" class="manage-column column-date" id="date" scope="col">Date</th>
525
			<th style="" class="manage-column column-ssid" id="ssid" scope="col">WETU ID</th>
526
		</tr>
527
		</thead>
528
		<?php
529
	}
530
531
	/**
532
	 * The footer of the item list
533
	 */
534
	public function table_footer() {
535
		?>
536
		<tfoot>
537
		<tr>
538
			<th style="" class="manage-column column-cb check-column" id="cb" scope="col">
539
				<label for="cb-select-all-1" class="screen-reader-text">Select All</label>
540
				<input type="checkbox" id="cb-select-all-1">
541
			</th>
542
			<th style="" class="manage-column column-title" scope="col">Title</th>
543
			<th style="" class="manage-column column-date" scope="col">Date</th>
544
			<th style="" class="manage-column column-ssid" scope="col">WETU ID</th>
545
		</tr>
546
		</tfoot>
547
		<?php
548
	}
549
550
	/**
551
	 * Displays the importers navigation.
552
	 *
553
	 * @param $tab string
554
	 */
555
	public function navigation( $tab = '' ) {
556
		$post_types = array(
557
			'tour'          => esc_attr( 'Tours', 'wetu-importer' ),
558
			'accommodation' => esc_attr( 'Accommodation', 'wetu-importer' ),
559
			'destination'   => esc_attr( 'Destinations', 'wetu-importer' ),
560
		);
561
562
		echo wp_kses_post( '<div class="wp-filter">' );
563
		echo wp_kses_post( '<ul class="filter-links">' );
564
		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', '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...
565
566
		foreach ( $post_types as $post_type => $label ) {
567
			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...
568
		}
569
570
		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', '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...
571
		echo wp_kses_post( '</ul> </div>' );
572
	}
573
574
	/**
575
	 * Wetu Status Bar.
576
	 */
577
	public function wetu_status() {
578
		$tours = get_transient( 'lsx_ti_tours' );
579
		echo '<div class="wetu-status tour-wetu-status"><h3>' . esc_html__( 'Wetu Status','wetu-importer' ) . ' - ';
580
581
		if ( '' === $tours || false === $tours || isset( $_GET['refresh_tours'] ) ) {
582
			$result = $this->update_options();
583
584
			if ( true === $result ) {
585
				echo '<span style="color:green;">' . esc_attr( 'Connected','wetu-importer' ) . '</span>';
586
				echo ' - <small><a href="#">' . esc_attr( 'Refresh','wetu-importer' ) . '</a></small>';
587
			} else {
588
				echo '<span style="color:red;">' . wp_kses_post( $result ) . '</span>';
589
			}
590
		} else {
591
			echo '<span style="color:green;">' . esc_attr( 'Connected','wetu-importer' ) . '</span> - <small><a href="#">' . esc_attr( 'Refresh','wetu-importer' ) . '</a></small>';
592
		}
593
		echo '</h3>';
594
		echo '</div>';
595
	}
596
597
	/**
598
	 * Set_taxonomy with some terms
599
	 */
600
	public function team_member_checkboxes( $selected = array() ) {
601
		if ( post_type_exists( 'team' ) ) { ?>
602
			<ul>
603
				<?php
604
					$team_args = array(
605
						'post_type'	=> 'team',
606
						'post_status' => 'publish',
607
						'nopagin' => true,
608
						'fields' => 'ids',
609
					);
610
611
					$team_members = new WP_Query( $team_args );
612
613
					if ( $team_members->have_posts() ) {
614
						foreach ( $team_members->posts as $member ) {
615
							// @codingStandardsIgnoreLine ?>
616
							<li><input class="team" <?php $this->checked( $selected, $member ); ?> type="checkbox" value="<?php echo $member; ?>" /> <?php echo get_the_title( $member ); ?></li>
0 ignored issues
show
Documentation introduced by
$selected is of type array, but the function expects a boolean.

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

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

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

function acceptsInteger($int) { }

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

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
617
						<?php }
618
					} else { ?>
619
						<li><input class="team" type="checkbox" value="0" /> <?php esc_html_e( 'None', 'wetu-importer' ); ?></li>
620
					<?php }
621
				?>
622
			</ul>
623
		<?php }
624
	}
625
626
627
	// GENERAL FUNCTIONS.
628
629
	/**
630
	 * Checks to see if an item is checked.
631
	 *
632
	 * @param $haystack array|string
633
	 * @param $needle string
634
	 * @param $echo bool
635
	 */
636 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...
637
		$return = $this->itemd( $haystack,$needle, 'checked' );
638
639
		if ( '' !== $return ) {
640
			if ( true === $echo ) {
641
				// @codingStandardsIgnoreLine
642
				echo $return;
643
			} else {
644
				return $return;
645
			}
646
		}
647
	}
648
649
	/**
650
	 * Checks to see if an item is checked.
651
	 *
652
	 * @param $haystack array|string
653
	 * @param $needle string
654
	 * @param $echo bool
655
	 */
656 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...
657
		$return = $this->itemd( $haystack, $needle, 'selected' );
658
659
		if ( '' !== $return ) {
660
			if ( true === $echo ) {
661
				// @codingStandardsIgnoreLine
662
				echo $return;
663
			} else {
664
				return $return;
665
			}
666
		}
667
	}
668
669
	/**
670
	 * Checks to see if an item is selected. If $echo is false,  it will return the $type if conditions are true.
671
	 *
672
	 * @param $haystack array|string
673
	 * @param $needle string
674
	 * @param $type string
675
	 * @param $wrap bool
676
	 * @return $html string
0 ignored issues
show
Documentation introduced by
The doc-type $html could not be parsed: Unknown type name "$html" at position 0. (view supported doc-types)

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

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

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

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

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

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

Loading history...
772
			foreach ( $data as $k ) {
773
				if ( $id ) {
774
					// @codingStandardsIgnoreLine
775
					if ( ! $term = term_exists( trim( $k ), $tax ) ) {
776
						$term = wp_insert_term( 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...
777
778 View Code Duplication
						if ( is_wp_error( $term ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

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

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

Loading history...
779
							// @codingStandardsIgnoreLine
780
							echo $term->get_error_message();
781
						} else {
782
							wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
783
						}
784
					} else {
785
						wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
786
					}
787
				} else {
788
					$result[] = trim( $k );
789
				}
790
			}
791
		}
792
		return $result;
793
	}
794
795
	/**
796
	 * Sets the terms of the current post
797
	 *
798
	 * @param boolean $id
799
	 * @param boolean $name
800
	 * @param boolean $taxonomy
801
	 * @param boolean $parent
802
	 * @return void
803
	 */
804
	public function set_term( $id = false, $name = false, $taxonomy = false, $parent = false ) {
805
		// @codingStandardsIgnoreLine
806
		if ( ! $term = term_exists( $name, $taxonomy ) ) {
807
			if ( false !== $parent ) {
808
				$parent = array(
809
					'parent' => $parent,
810
				);
811
			}
812
813
			$term = wp_insert_term( trim( $name ), $taxonomy,$parent );
814
815 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...
816
				// @codingStandardsIgnoreLine
817
				echo $term->get_error_message();
818
			} else {
819
				wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
820
			}
821
		} else {
822
			wp_set_object_terms( $id, intval( $term['term_id'] ), $taxonomy,true );
823
		}
824
825
		return $term['term_id'];
826
	}
827
828
	/**
829
	 * set_taxonomy with some terms
830
	 */
831
	public function taxonomy_checkboxes( $taxonomy = false, $selected = array() ) {
832
		$return = '';
833
834
		if ( false !== $taxonomy ) {
835
			$return .= '<ul>';
836
			$terms = get_terms( array(
837
				'taxonomy' => $taxonomy,
838
				'hide_empty' => false,
839
			) );
840
841
			if ( ! is_wp_error( $terms ) ) {
842
				foreach ( $terms as $term ) {
843
					$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...
844
				}
845
			} else {
846
				$return .= '<li><input type="checkbox" value="" /> ' . __( 'None', 'wetu-importer' ) . '</li>';
847
			}
848
849
			$return .= '</ul>';
850
		}
851
852
		return $return;
853
	}
854
855
	// MAP FUNCTIONS
856
857
	/**
858
	 * Saves the longitude and lattitude, as well as sets the map marker.
859
	 */
860
	public function set_map_data( $data, $id, $zoom = '10' ) {
861
		$longitude = false;
862
		$latitude = false;
863
		$address = false;
864
865
		if ( isset( $data[0]['position'] ) ) {
866 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...
867
				$latitude = $data[0]['position']['driving_latitude'];
868
			} elseif ( isset( $data[0]['position']['latitude'] ) ) {
869
				$latitude = $data[0]['position']['latitude'];
870
			}
871
872 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...
873
				$longitude = $data[0]['position']['driving_longitude'];
874
			} elseif ( isset( $data[0]['position']['longitude'] ) ) {
875
				$longitude = $data[0]['position']['longitude'];
876
			}
877
		}
878
879
		if ( isset( $data[0]['content'] ) && isset( $data[0]['content']['contact_information'] ) ) {
880
			if ( isset( $data[0]['content']['contact_information']['address'] ) ) {
881
				$address = strip_tags( $data[0]['content']['contact_information']['address'] );
882
				$address = explode( "\n", $address );
883
884
				foreach ( $address as $bitkey => $bit ) {
885
					$bit = ltrim( rtrim( $bit ) );
886
887
					if ( false === $bit || '' === $bit || null === $bit || empty( $bit ) ) {
888
						unset( $address[ $bitkey ] );
889
					}
890
				}
891
892
				$address = implode( ', ',$address );
893
				$address = str_replace( ', , ', ', ', $address );
894
			}
895
		}
896
897
		if ( false !== $longitude ) {
898
			$location_data = array(
899
				'address'	=> (string) $address,
900
				'lat'		=> (string) $latitude,
901
				'long'		=> (string) $longitude,
902
				'zoom'		=> (string) $zoom,
903
				'elevation'	=> '',
904
			);
905
906 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...
907
				$prev = get_post_meta( $id,'location',true );
908
				update_post_meta( $id,'location',$location_data,$prev );
909
			} else {
910
				add_post_meta( $id,'location',$location_data,true );
911
			}
912
		}
913
	}
914
915
	// IMAGE FUNCTIONS
916
917
	/**
918
	 * Creates the main gallery data
919
	 */
920
	public function set_featured_image( $data, $id ) {
921
		if ( is_array( $data[0]['content']['images'] ) && ! empty( $data[0]['content']['images'] ) ) {
922
			$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...
923
				'width' => '800',
924
				'height' => '600',
925
				'cropping' => 'h',
926
			) );
927
928
			if ( false !== $this->featured_image ) {
929
				delete_post_meta( $id,'_thumbnail_id' );
930
				add_post_meta( $id,'_thumbnail_id',$this->featured_image,true );
931
			}
932
		}
933
	}
934
935
	/**
936
	 * Sets a banner image
937
	 */
938
	public function set_banner_image( $data, $id, $content = array( 'none' ) ) {
939
		if ( is_array( $data[0]['content']['images'] ) && ! empty( $data[0]['content']['images'] ) ) {
940
			if ( in_array( 'unique_banner_image', $content ) && isset( $data[0]['destination_image'] ) && is_array( $data[0]['destination_image'] ) ) {
941
				$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...
942
					'width' => '1920',
943
					'height' => '600',
944
					'cropping' => 'c',
945
				));
946
			} else {
947
				$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...
948
					'width' => '1920',
949
					'height' => '600',
950
					'cropping' => 'c',
951
				));
952
			}
953
954 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...
955
				$this->banner_image = $temp_banner;
956
957
				delete_post_meta( $id,'image_group' );
958
959
				$new_banner = array(
960
					'banner_image' => array(
961
						'cmb-field-0' => $this->banner_image,
962
					),
963
				);
964
965
				add_post_meta( $id,'image_group',$new_banner,true );
966
			}
967
		}
968
	}
969
970
	/**
971
	 * Creates the main gallery data
972
	 */
973
	public function create_main_gallery( $data, $id ) {
974
		if ( is_array( $data[0]['content']['images'] ) && ! empty( $data[0]['content']['images'] ) ) {
975
			if ( isset( $this->options['image_replacing'] ) && 'on' === $this->options['image_replacing'] ) {
976
				$current_gallery = get_post_meta( $id, 'gallery', false );
977
978
				if ( false !== $current_gallery && ! empty( $current_gallery ) ) {
979
					foreach ( $current_gallery as $g ) {
980
						delete_post_meta( $id,'gallery', $g );
981
982
						if ( 'attachment' === get_post_type( $g ) ) {
983
							wp_delete_attachment( $g, true );
984
						}
985
					}
986
				}
987
			}
988
989
			$counter = 0;
990
991
			foreach ( $data[0]['content']['images'] as $image_data ) {
992
				if ( ( 0 === $counter && false !== $this->featured_image ) || ( 1 === $counter && false !== $this->banner_image ) ) {
993
					$counter++;
994
995
					if ( false !== $this->image_limit && false !== $this->image_limit ) {
996
						$this->image_limit++;
997
					}
998
999
					continue;
1000
				}
1001
1002
				if ( false !== $this->image_limit && $counter >= $this->image_limit ) {
1003
					continue;
1004
				}
1005
1006
				$this->gallery_meta[] = $this->attach_image( $image_data,$id );
1007
				$counter++;
1008
			}
1009
1010
			if ( ! empty( $this->gallery_meta ) ) {
1011
				delete_post_meta( $id,'gallery' );
1012
				$this->gallery_meta = array_unique( $this->gallery_meta );
1013
1014
				foreach ( $this->gallery_meta as $gallery_id ) {
1015
					if ( false !== $gallery_id && '' !== $gallery_id && ! is_array( $gallery_id ) ) {
1016
						add_post_meta( $id,'gallery',$gallery_id,false );
1017
					}
1018
				}
1019
			}
1020
		}
1021
	}
1022
1023
	/**
1024
	 * search_form
1025
	 */
1026
	public function get_scaling_url( $args = array() ) {
1027
		$defaults = array(
1028
			'width' => '1024',
1029
			'height' => '768',
1030
			//'cropping' => 'w',
1031
			'cropping' => 'h',
1032
		);
1033
1034
		if ( false !== $this->options ) {
1035 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...
1036
				$defaults['width'] = $this->options['width'];
1037
			}
1038
1039 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...
1040
				$defaults['height'] = $this->options['height'];
1041
			}
1042
1043 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...
1044
				$defaults['cropping'] = $this->options['cropping'];
1045
			}
1046
		}
1047
1048
		$args = wp_parse_args( $args, $defaults );
1049
		$cropping = $args['cropping'];
1050
		$width = $args['width'];
1051
		$height = $args['height'];
1052
1053
		return 'https://wetu.com/ImageHandler/' . $cropping . $width . 'x' . $height . '/';
1054
	}
1055
1056
	/**
1057
	 * Attaches 1 image
1058
	 */
1059
	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...
1060
		if ( false !== $v ) {
1061
			$temp_fragment = explode( '/',$v['url_fragment'] );
1062
			$url_filename = $temp_fragment[ count( $temp_fragment ) -1 ];
1063
			$url_filename = str_replace( array( '.jpg', '.png', '.jpeg' ),'',$url_filename );
1064
			$url_filename = trim( $url_filename );
1065
			$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...
1066
			$url_filename = str_replace( ' ','_',$url_filename );
1067
1068
			if ( ! isset( $this->options['image_replacing'] ) && in_array( $url_filename, $this->found_attachments ) ) {
1069
				return array_search( $url_filename,$this->found_attachments );
1070
			}
1071
1072
			$postdata = array();
1073
1074
			if ( empty( $v['label'] ) ) {
1075
				$v['label'] = '';
1076
			}
1077
1078 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...
1079
				$desc = wp_strip_all_tags( $v['description'] );
1080
				$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...
1081
					'post_excerpt' => $desc,
1082
				);
1083
			}
1084
1085 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...
1086
				$desc = wp_strip_all_tags( $v['section'] );
1087
				$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...
1088
					'post_excerpt' => $desc,
1089
				);
1090
			}
1091
1092
			$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...
1093
			//Resizor - add option to setting if required
1094
			$fragment = str_replace( ' ','%20',$v['url_fragment'] );
1095
			$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...
1096
1097
			$attach_id = $this->attach_external_image2( $url,$parent_id,'',$v['label'],$postdata );
1098
1099
			$this->found_attachments[ $attach_id ] = $url_filename;
1100
1101
			//echo($attach_id.' add image');
1102
			if ( ! empty( $attach_id ) ) {
1103
				return $attach_id;
1104
			}
1105
		}
1106
		return 	false;
1107
	}
1108
1109
	public function attach_external_image2( $url = null, $post_id = null, $thumb = null, $filename = null, $post_data = array() ) {
1110
		if ( ! $url || ! $post_id ) { return new WP_Error( 'missing', 'Need a valid URL and post ID...' ); }
1111
1112
		require_once( ABSPATH . 'wp-admin/includes/file.php' );
1113
		require_once( ABSPATH . 'wp-admin/includes/media.php' );
1114
		require_once( ABSPATH . 'wp-admin/includes/image.php' );
1115
		// Download file to temp location, returns full server path to temp file
1116
		//$tmp = download_url( $url );
1117
1118
		//var_dump($tmp);
1119
		$tmp = tempnam( '/tmp', 'FOO' );
1120
1121
		$image = file_get_contents( $url );
1122
		file_put_contents( $tmp, $image );
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
		// required libraries for media_handle_sideload
1169
1170
		// do the validation and storage stuff
1171
		$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
1172
1173
		// If error storing permanently, unlink
1174
		if ( is_wp_error( $att_id ) ) {
1175
			unlink( $file_array['tmp_name'] );   // clean up
1176
			return false; // output wp_error
1177
			//return $att_id; // output wp_error
1178
		}
1179
1180
		return $att_id;
1181
	}
1182
1183
1184
	// AJAX FUNCTIONS
1185
	/**
1186
	 * Run through the accommodation grabbed from the DB.
1187
	 */
1188
	public function process_ajax_search() {
1189
		$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...
1190
		die();
1191
	}
1192
1193
	/**
1194
	 * Connect to wetu
1195
	 */
1196
	public function process_ajax_import() {
1197
		$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...
1198
		die();
1199
	}
1200
1201
	/**
1202
	 * Formats the row for the completed list.
1203
	 */
1204
	public function format_completed_row( $response ) {
1205
		// @codingStandardsIgnoreLine
1206
		echo '<li class="post-' . $response . '"><span class="dashicons dashicons-yes"></span> <a target="_blank" href="' . get_permalink( $response ) . '">' . get_the_title( $response ) . '</a></li>';
1207
	}
1208
1209
	/**
1210
	 * Formats the error.
1211
	 */
1212
	public function format_error( $response ) {
1213
		// @codingStandardsIgnoreLine
1214
		echo '<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=' . implode( '', $_GET['type'] );
1332
			$options[] = implode( '', $_GET['type'] );
1333
		}
1334
1335
		$this->current_importer->url_qs .= '&results=2000';
1336
1337
		add_option( 'lsx_ti_tours_api_options', $options );
1338
1339
		$data = wp_remote_get( $this->current_importer->url . '/V8/List?' . $this->current_importer->url_qs );
1340
		$tours = json_decode( wp_remote_retrieve_body( $data ), true );
1341
1342
		if ( isset( $tours['error'] ) ) {
1343
			return $tours['error'];
1344
		} elseif ( isset( $tours['itineraries'] ) && ! empty( $tours['itineraries'] ) ) {
1345
			set_transient( 'lsx_ti_tours', $tours['itineraries'], 60 * 60 * 2 );
1346
			return true;
1347
		}
1348
	}	
1349
}
1350
1351
$wetu_importer = new WETU_Importer();
1352