Issues (1066)

classes/class-lsx-projects-admin.php (2 issues)

1
<?php
2
/**
3
 * LSX Projects Admin Class
4
 *
5
 * @package   LSX Projects
6
 * @author    LightSpeed
7
 * @license   GPL3
8
 * @link
9
 * @copyright 2016 LightSpeed
10
 */
11
class LSX_Projects_Admin {
12
13
	public function __construct() {
14
		$this->load_classes();
15
16
		add_action( 'init', array( $this, 'post_type_setup' ) );
17
		add_action( 'init', array( $this, 'taxonomy_setup' ) );
18
		add_action( 'init', array( $this, 'taxonomy_project_type_setup' ) );
19
		add_action( 'init', array( $this, 'taxonomy_project_tag_setup' ) );
20
		add_filter( 'cmb2_admin_init', array( $this, 'field_setup' ) );
21
		add_filter( 'cmb2_admin_init', array( $this, 'projects_services_metaboxes' ) );
22
		add_filter( 'cmb2_admin_init', array( $this, 'projects_testimonials_metaboxes' ) );
23
		add_filter( 'cmb2_admin_init', array( $this, 'projects_team_metaboxes' ) );
24
		add_filter( 'cmb2_admin_init', array( $this, 'projects_woocommerce_metaboxes' ) );
25
		add_filter( 'cmb2_admin_init', array( $this, 'project_field_setup_product' ) );
26
		add_action( 'cmb_save_custom', array( $this, 'post_relations' ), 3, 20 );
27
		add_action( 'admin_enqueue_scripts', array( $this, 'assets' ) );
28
29
		add_filter( 'type_url_form_media', array( $this, 'change_attachment_field_button' ), 20, 1 );
30
		add_filter( 'enter_title_here', array( $this, 'change_title_text' ) );
31
	}
32
33
	/**
34
	 * Loads the admin subclasses
35
	 */
36
	private function load_classes() {
37
		require_once LSX_PROJECTS_PATH . 'classes/admin/class-settings.php';
38
		$this->settings = \lsx\projects\classes\admin\Settings::get_instance();
39
40
		require_once LSX_PROJECTS_PATH . 'classes/admin/class-settings-theme.php';
41
		$this->settings_theme = \lsx\projects\classes\admin\Settings_Theme::get_instance();
42
	}
43
44
	/**
45
	 * Register the Project and Product Tag post type
46
	 */
47
	public function post_type_setup() {
48
		$labels = array(
49
			'name'               => esc_html_x( 'Projects', 'post type general name', 'lsx-projects' ),
50
			'singular_name'      => esc_html_x( 'Project', 'post type singular name', 'lsx-projects' ),
51
			'add_new'            => esc_html_x( 'Add New', 'post type general name', 'lsx-projects' ),
52
			'add_new_item'       => esc_html__( 'Add New Project', 'lsx-projects' ),
53
			'edit_item'          => esc_html__( 'Edit Project', 'lsx-projects' ),
54
			'new_item'           => esc_html__( 'New Project', 'lsx-projects' ),
55
			'all_items'          => esc_html__( 'All Projects', 'lsx-projects' ),
56
			'view_item'          => esc_html__( 'View Project', 'lsx-projects' ),
57
			'search_items'       => esc_html__( 'Search Projects', 'lsx-projects' ),
58
			'not_found'          => esc_html__( 'No projects found', 'lsx-projects' ),
59
			'not_found_in_trash' => esc_html__( 'No projects found in Trash', 'lsx-projects' ),
60
			'parent_item_colon'  => '',
61
			'menu_name'          => esc_html_x( 'Projects', 'admin menu', 'lsx-projects' ),
62
		);
63
64
		$args = array(
65
			'labels'             => $labels,
66
			'public'             => true,
67
			'publicly_queryable' => true,
68
			'show_ui'            => true,
69
			'show_in_menu'       => true,
70
			'menu_icon'          => 'dashicons-portfolio',
71
			'query_var'          => true,
72
			'rewrite'            => array(
73
				'slug' => 'portfolio',
74
			),
75
			'capability_type'    => 'post',
76
			'has_archive'        => 'portfolio',
77
			'hierarchical'       => false,
78
			'menu_position'      => null,
79
			'supports'           => array(
80
				'title',
81
				'editor',
82
				'thumbnail',
83
				'excerpt',
84
				'custom-fields',
85
			),
86
			'show_in_rest'       => true,
87
		);
88
89
		register_post_type( 'project', $args );
90
	}
91
92
	/**
93
	 * Register the Group taxonomy
94
	 */
95
	public function taxonomy_setup() {
96
		$labels = array(
97
			'name'              => esc_html_x( 'Project Groups', 'taxonomy general name', 'lsx-projects' ),
98
			'singular_name'     => esc_html_x( 'Group', 'taxonomy singular name', 'lsx-projects' ),
99
			'search_items'      => esc_html__( 'Search Groups', 'lsx-projects' ),
100
			'all_items'         => esc_html__( 'All Groups', 'lsx-projects' ),
101
			'parent_item'       => esc_html__( 'Parent Group', 'lsx-projects' ),
102
			'parent_item_colon' => esc_html__( 'Parent Group:', 'lsx-projects' ),
103
			'edit_item'         => esc_html__( 'Edit Group', 'lsx-projects' ),
104
			'update_item'       => esc_html__( 'Update Group', 'lsx-projects' ),
105
			'add_new_item'      => esc_html__( 'Add New Group', 'lsx-projects' ),
106
			'new_item_name'     => esc_html__( 'New Group Name', 'lsx-projects' ),
107
			'menu_name'         => esc_html__( 'Groups', 'lsx-projects' ),
108
		);
109
110
		$args = array(
111
			'hierarchical'      => true,
112
			'labels'            => $labels,
113
			'show_ui'           => true,
114
			'show_admin_column' => true,
115
			'query_var'         => true,
116
			'rewrite'           => array(
117
				'slug' => 'portfolio-group',
118
			),
119
		);
120
121
		register_taxonomy( 'project-group', array( 'project' ), $args );
122
	}
123
124
	/**
125
	 * Register the Type taxonomy
126
	 */
127
	public function taxonomy_project_type_setup() {
128
		$labels = array(
129
			'name'              => esc_html_x( 'Project Types', 'taxonomy general name', 'lsx-projects' ),
130
			'singular_name'     => esc_html_x( 'Type', 'taxonomy singular name', 'lsx-projects' ),
131
			'search_items'      => esc_html__( 'Search Types', 'lsx-projects' ),
132
			'all_items'         => esc_html__( 'All Types', 'lsx-projects' ),
133
			'parent_item'       => esc_html__( 'Parent Type', 'lsx-projects' ),
134
			'parent_item_colon' => esc_html__( 'Parent Type:', 'lsx-projects' ),
135
			'edit_item'         => esc_html__( 'Edit Type', 'lsx-projects' ),
136
			'update_item'       => esc_html__( 'Update Type', 'lsx-projects' ),
137
			'add_new_item'      => esc_html__( 'Add New Type', 'lsx-projects' ),
138
			'new_item_name'     => esc_html__( 'New Type Name', 'lsx-projects' ),
139
			'menu_name'         => esc_html__( 'Types', 'lsx-projects' ),
140
		);
141
142
		$args = array(
143
			'hierarchical'      => true,
144
			'labels'            => $labels,
145
			'show_ui'           => true,
146
			'show_admin_column' => true,
147
			'query_var'         => true,
148
			'rewrite'           => array(
149
				'slug' => 'project-type',
150
			),
151
			'show_in_rest'      => true,
152
		);
153
154
		register_taxonomy( 'project-type', array( 'project' ), $args );
155
	}
156
157
	/**
158
	 * Register the Tag taxonomy
159
	 */
160
	public function taxonomy_project_tag_setup() {
161
		$labels = array(
162
			'name'              => esc_html_x( 'Project Tags', 'taxonomy general name', 'lsx-projects' ),
163
			'singular_name'     => esc_html_x( 'Tag', 'taxonomy singular name', 'lsx-projects' ),
164
			'search_items'      => esc_html__( 'Search Tags', 'lsx-projects' ),
165
			'all_items'         => esc_html__( 'All Tags', 'lsx-projects' ),
166
			'parent_item'       => esc_html__( 'Parent Tag', 'lsx-projects' ),
167
			'parent_item_colon' => esc_html__( 'Parent Tag:', 'lsx-projects' ),
168
			'edit_item'         => esc_html__( 'Edit Tag', 'lsx-projects' ),
169
			'update_item'       => esc_html__( 'Update Tag', 'lsx-projects' ),
170
			'add_new_item'      => esc_html__( 'Add New Tag', 'lsx-projects' ),
171
			'new_item_name'     => esc_html__( 'New Tag Name', 'lsx-projects' ),
172
			'menu_name'         => esc_html__( 'Tags', 'lsx-projects' ),
173
		);
174
175
		$args = array(
176
			'hierarchical'      => true,
177
			'labels'            => $labels,
178
			'show_ui'           => true,
179
			'show_admin_column' => true,
180
			'query_var'         => true,
181
			'rewrite'           => array(
182
				'slug' => 'project-tag',
183
			),
184
			'show_in_rest'      => true,
185
		);
186
187
		register_taxonomy( 'project-tag', array( 'project' ), $args );
188
	}
189
190
	/**
191
	 * Add metabox with custom fields to the Project post type
192
	 */
193
	public function field_setup() {
194
		$prefix = 'lsx_project_';
195
196
		$cmb = new_cmb2_box(
197
			array(
198
				'id'           => $prefix . '_project',
199
				'title'        => __( 'General', 'lsx-projects' ),
200
				'object_types' => 'project',
201
				'context'      => 'normal',
202
				'priority'     => 'low',
203
				'show_names'   => true,
204
			)
205
		);
206
207
		$cmb->add_field(
208
			array(
209
				'name'         => esc_html__( 'Featured:', 'lsx-projects' ),
210
				'id'           => $prefix . 'featured',
211
				'type'         => 'checkbox',
212
				'value'        => 1,
213
				'default'      => 0,
214
				'show_in_rest' => true,
215
			)
216
		);
217
218
		$cmb->add_field(
219
			array(
220
				'name'         => esc_html__( 'Client:', 'lsx-projects' ),
221
				'id'           => $prefix . 'client',
222
				'type'         => 'text',
223
				'show_in_rest' => true,
224
			)
225
		);
226
227
		$cmb->add_field(
228
			array(
229
				'name'         => esc_html__( 'Client logo:', 'lsx-projects' ),
230
				'id'           => $prefix . 'client_logo',
231
				'type'         => 'file',
232
				'desc'         => esc_html__( 'Recommended image size: 320 x 50~60', 'lsx-projects' ),
233
				'options'      => array(
234
					'url' => false, // Hide the text input for the url.
235
				),
236
				'text'         => array(
237
					'add_upload_file_text' => 'Choose Image',
238
				),
239
				'show_in_rest' => true,
240
			)
241
		);
242
243
		$cmb->add_field(
244
			array(
245
				'name'         => esc_html__( 'URL for the finished project:', 'lsx-projects' ),
246
				'id'           => $prefix . 'url',
247
				'type'         => 'text',
248
				'show_in_rest' => true,
249
			)
250
		);
251
	}
252
253
	/**
254
	 * Project Services Metaboxes.
255
	 */
256
	public function projects_services_metaboxes() {
257
		$prefix = 'lsx_project_';
258
259
		$cmb = new_cmb2_box(
260
			array(
261
				'id'           => $prefix . '_project',
262
				'object_types' => 'projects',
263
				'context'      => 'normal',
264
				'priority'     => 'low',
265
				'show_names'   => true,
266
			)
267
		);
268
269
		$cmb->add_field(
270
			array(
271
				'name'         => esc_html__( 'Services related to this project:', 'lsx-projects' ),
272
				'id'           => 'page_to_project',
273
				'type'         => 'post_search_ajax',
274
				'show_in_rest' => true,
275
				'limit'        => 15,
276
				'sortable'     => true,
277
				'query_args'   => array(
278
					'post_type'      => array( 'project' ),
279
					'post_status'    => array( 'publish' ),
280
					'nopagin'        => true,
281
					'posts_per_page' => '50',
282
					'orderby'        => 'title',
283
					'order'          => 'ASC',
284
				),
285
			)
286
		);
287
	}
288
289
	/**
290
	 * Project Testimonials Metaboxes.
291
	 */
292
	public function projects_testimonials_metaboxes() {
293
		$prefix = 'lsx_project_';
294
295
		$cmb = new_cmb2_box(
296
			array(
297
				'id'           => $prefix . '_project',
298
				'object_types' => 'projects',
299
				'context'      => 'normal',
300
				'priority'     => 'low',
301
				'show_names'   => true,
302
			)
303
		);
304
305
		if ( class_exists( 'LSX_Testimonials' ) ) {
306
			$cmb->add_field(
307
				array(
308
					'name'         => esc_html__( 'Testimonials related to this project:', 'lsx-projects' ),
309
					'id'           => 'testimonial_to_project',
310
					'type'         => 'post_search_ajax',
311
					'show_in_rest' => true,
312
					'limit'        => 15,
313
					'sortable'     => true,
314
					'query_args'   => array(
315
						'post_type'      => array( 'testimonial' ),
316
						'post_status'    => array( 'publish' ),
317
						'nopagin'        => true,
318
						'posts_per_page' => '50',
319
						'orderby'        => 'title',
320
						'order'          => 'ASC',
321
					),
322
				)
323
			);
324
		}
325
	}
326
327
	/**
328
	 * Project Team Metaboxes.
329
	 */
330
	public function projects_team_metaboxes() {
331
		$prefix = 'lsx_project_';
332
333
		$cmb = new_cmb2_box(
334
			array(
335
				'id'           => $prefix . '_project',
336
				'object_types' => 'project',
337
				'context'      => 'normal',
338
				'priority'     => 'low',
339
				'show_names'   => true,
340
			)
341
		);
342
343
		if ( class_exists( 'LSX_Team' ) ) {
344
			$cmb->add_field(
345
				array(
346
					'name'         => esc_html__( 'Team members involved with this project:', 'lsx-projects' ),
347
					'id'           => 'team_to_project',
348
					'type'         => 'post_search_ajax',
349
					'show_in_rest' => true,
350
					'limit'        => 15,
351
					'sortable'     => true,
352
					'query_args'   => array(
353
						'post_type'      => array( 'team' ),
354
						'post_status'    => array( 'publish' ),
355
						'nopagin'        => true,
356
						'posts_per_page' => '50',
357
						'orderby'        => 'title',
358
						'order'          => 'ASC',
359
					),
360
				)
361
			);
362
		}
363
	}
364
365
	/**
366
	 * Project Woocommerce Metaboxes.
367
	 */
368
	public function projects_woocommerce_metaboxes() {
369
		$prefix = 'lsx_project_';
370
371
		$cmb = new_cmb2_box(
372
			array(
373
				'id'           => $prefix . '_project',
374
				'object_types' => 'projects',
375
				'context'      => 'normal',
376
				'priority'     => 'low',
377
				'show_names'   => true,
378
			)
379
		);
380
381
		if ( class_exists( 'woocommerce' ) ) {
382
			$cmb->add_field(
383
				array(
384
					'name'         => esc_html__( 'Products used for this project:', 'lsx-projects' ),
385
					'id'           => 'product_to_project',
386
					'type'         => 'post_search_ajax',
387
					'show_in_rest' => true,
388
					'limit'        => 15,
389
					'sortable'     => true,
390
					'query_args'   => array(
391
						'post_type'      => array( 'product' ),
392
						'post_status'    => array( 'publish' ),
393
						'nopagin'        => true,
394
						'posts_per_page' => '50',
395
						'orderby'        => 'title',
396
						'order'          => 'ASC',
397
					),
398
				)
399
			);
400
		}
401
	}
402
403
	/**
404
	 * Add Alt Product metabox with custom fields to the Project post type
405
	 */
406
	public function project_field_setup_product() {
407
		$prefix = 'lsx_project_';
408
409
		$cmb = new_cmb2_box(
410
			array(
411
				'id'           => $prefix . '_project',
412
				'title'        => __( 'General', 'lsx-projects' ),
413
				'object_types' => 'project',
414
				'context'      => 'normal',
415
				'priority'     => 'low',
416
				'show_names'   => true,
417
			)
418
		);
419
420
		$tip_group = $cmb->add_field(
421
			array(
422
				'id'      => $prefix . '_alt_products',
423
				'type'    => 'group',
424
				'options' => array(
425
					'group_title'   => __( 'Alternative Products', 'lsx-projects' ),
426
					'add_button'    => __( 'Add Product', 'lsx-projects' ),
427
					'remove_button' => __( 'Remove Product', 'lsx-projects' ),
428
					'sortable'      => true,
429
				),
430
				'classes' => 'lsx-admin-row',
431
			)
432
		);
433
434
		$cmb->add_group_field(
435
			$tip_group,
0 ignored issues
show
It seems like $tip_group can also be of type false; however, parameter $parent_field_id of CMB2::add_group_field() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

435
			/** @scrutinizer ignore-type */ $tip_group,
Loading history...
436
			array(
437
				'name'         => esc_html__( 'Alt Product Name:', 'lsx-projects' ),
438
				'id'           => $prefix . 'alt_product_title',
439
				'type'         => 'text',
440
				'show_in_rest' => true,
441
			)
442
		);
443
444
		$cmb->add_group_field(
445
			$tip_group,
446
			array(
447
				'name'         => esc_html__( 'Alt Product Link:', 'lsx-projects' ),
448
				'id'           => $prefix . 'alt_product_link',
449
				'type'         => 'text',
450
				'show_in_rest' => true,
451
			)
452
		);
453
454
	}
455
456
	/**
457
	 * Sets up the "post relations".
458
	 */
459
	public function post_relations( $post_id, $field, $value ) {
460
		$connections = array(
461
			// 'project_to_project',
462
463
			'page_to_project',
464
			'project_to_page',
465
466
			'project_to_service',
467
			'service_to_project',
468
469
			'project_to_testimonial',
470
			'testimonial_to_project',
471
472
			'project_to_team',
473
			'team_to_project',
474
		);
475
476
		if ( in_array( $field['id'], $connections ) ) {
477
			$this->save_related_post( $connections, $post_id, $field, $value );
478
		}
479
	}
480
481
	/**
482
	 * Save the reverse post relation.
483
	 */
484
	public function save_related_post( $connections, $post_id, $field, $value ) {
485
		$ids = explode( '_to_', $field['id'] );
486
		$relation = $ids[1] . '_to_' . $ids[0];
487
488
		if ( in_array( $relation, $connections ) ) {
489
			$previous_values = get_post_meta( $post_id, $field['id'], false );
490
491
			if ( ! empty( $previous_values ) ) {
492
				foreach ( $previous_values as $v ) {
493
					delete_post_meta( $v, $relation, $post_id );
494
				}
495
			}
496
497
			if ( is_array( $value ) ) {
498
				foreach ( $value as $v ) {
499
					if ( ! empty( $v ) ) {
500
						add_post_meta( $v, $relation, $post_id );
501
					}
502
				}
503
			}
504
		}
505
	}
506
507
	public function assets() {
508
		//wp_enqueue_media();
0 ignored issues
show
Unused Code Comprehensibility introduced by
75% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
509
		wp_enqueue_script( 'media-upload' );
510
		wp_enqueue_script( 'thickbox' );
511
		wp_enqueue_style( 'thickbox' );
512
513
		wp_enqueue_script( 'lsx-projects-admin', LSX_PROJECTS_URL . 'assets/js/lsx-projects-admin.min.js', array( 'jquery' ), LSX_PROJECTS_VER, true );
514
		wp_enqueue_style( 'lsx-projects-admin', LSX_PROJECTS_URL . 'assets/css/lsx-projects-admin.css', array(), LSX_PROJECTS_VER );
515
	}
516
517
	/**
518
	 * Change the "Insert into Post" button text when media modal is used for feature images
519
	 */
520
	public function change_attachment_field_button( $html ) {
521
		if ( isset( $_GET['feature_image_text_button'] ) ) {
522
			$html = str_replace( 'value="Insert into Post"', sprintf( 'value="%s"', esc_html__( 'Select featured image', 'lsx-projects' ) ), $html );
523
		}
524
525
		return $html;
526
	}
527
528
	public function change_title_text( $title ) {
529
		$screen = get_current_screen();
530
531
		if ( 'project' === $screen->post_type ) {
532
			$title = esc_attr__( 'Enter project title', 'lsx-projects' );
533
		}
534
535
		return $title;
536
	}
537
}
538
539
$lsx_projects_admin = new LSX_Projects_Admin();
540