Completed
Push — develop ( 59e2bf...fbc84e )
by David
04:58 queued 01:14
created
src/includes/class-wordlift-entity-service.php 2 patches
Indentation   +780 added lines, -780 removed lines patch added patch discarded remove patch
@@ -7,789 +7,789 @@
 block discarded – undo
7 7
  */
8 8
 class Wordlift_Entity_Service {
9 9
 
10
-	/**
11
-	 * The Log service.
12
-	 *
13
-	 * @since 3.2.0
14
-	 * @access private
15
-	 * @var \Wordlift_Log_Service $log_service The Log service.
16
-	 */
17
-	private $log_service;
18
-
19
-	/**
20
-	 * The UI service.
21
-	 *
22
-	 * @since 3.2.0
23
-	 * @access private
24
-	 * @var \Wordlift_UI_Service $ui_service The UI service.
25
-	 */
26
-	private $ui_service;
27
-
28
-	/**
29
-	 * The Schema service.
30
-	 *
31
-	 * @since 3.3.0
32
-	 * @access private
33
-	 * @var \Wordlift_Schema_Service $schema_service The Schema service.
34
-	 */
35
-	private $schema_service;
36
-
37
-	/**
38
-	 * The Notice service.
39
-	 *
40
-	 * @since 3.3.0
41
-	 * @access private
42
-	 * @var \Wordlift_Notice_Service $notice_service The Notice service.
43
-	 */
44
-	private $notice_service;
45
-
46
-	/**
47
-	 * The entity post type name.
48
-	 *
49
-	 * @since 3.1.0
50
-	 */
51
-	const TYPE_NAME = 'entity';
52
-
53
-	/**
54
-	 * Entity rating max.
55
-	 *
56
-	 * @since 3.3.0
57
-	 */
58
-	const RATING_MAX = 7;
59
-
60
-	/**
61
-	 * Entity rating score meta key.
62
-	 *
63
-	 * @since 3.3.0
64
-	 */
65
-	const RATING_RAW_SCORE_META_KEY = '_wl_entity_rating_raw_score';
66
-
67
-	/**
68
-	 * Entity rating warnings meta key.
69
-	 *
70
-	 * @since 3.3.0
71
-	 */
72
-	const RATING_WARNINGS_META_KEY = '_wl_entity_rating_warnings';
73
-
74
-	/**
75
-	 * Entity warning has related post identifier.
76
-	 *
77
-	 * @since 3.3.0
78
-	 */
79
-	const RATING_WARNING_HAS_RELATED_POSTS = 'There are no related posts for the current entity.';
80
-
81
-	/**
82
-	 * Entity warning has content post identifier.
83
-	 *
84
-	 * @since 3.3.0
85
-	 */
86
-	const RATING_WARNING_HAS_CONTENT_POST = 'This entity has not description.';
87
-
88
-	/**
89
-	 * Entity warning has related entities identifier.
90
-	 *
91
-	 * @since 3.3.0
92
-	 */
93
-	const RATING_WARNING_HAS_RELATED_ENTITIES = 'There are no related entities for the current entity.';
94
-
95
-	/**
96
-	 * Entity warning is published identifier.
97
-	 *
98
-	 * @since 3.3.0
99
-	 */
100
-	const RATING_WARNING_IS_PUBLISHED = 'This entity is not published. It will not appear within analysis results.';
101
-
102
-	/**
103
-	 * Entity warning has thumbnail identifier.
104
-	 *
105
-	 * @since 3.3.0
106
-	 */
107
-	const RATING_WARNING_HAS_THUMBNAIL = 'This entity has no featured image yet.';
108
-
109
-	/**
110
-	 * Entity warning has same as identifier.
111
-	 *
112
-	 * @since 3.3.0
113
-	 */
114
-	const RATING_WARNING_HAS_SAME_AS = 'There are no sameAs configured for this entity.';
115
-
116
-	/**
117
-	 * Entity warning has completed metadata identifier.
118
-	 *
119
-	 * @since 3.3.0
120
-	 */
121
-	const RATING_WARNING_HAS_COMPLETED_METADATA = 'Schema.org metadata for this entity are not completed.';
122
-
123
-	/**
124
-	 * The alternative label meta key.
125
-	 *
126
-	 * @since 3.2.0
127
-	 */
128
-	const ALTERNATIVE_LABEL_META_KEY = '_wl_alt_label';
129
-
130
-	/**
131
-	 * The alternative label input template.
132
-	 *
133
-	 * @since 3.2.0
134
-	 */
135
-	// TODO: this should be moved to a class that deals with HTML code.
136
-	const ALTERNATIVE_LABEL_INPUT_TEMPLATE = '<div class="wl-alternative-label">
10
+    /**
11
+     * The Log service.
12
+     *
13
+     * @since 3.2.0
14
+     * @access private
15
+     * @var \Wordlift_Log_Service $log_service The Log service.
16
+     */
17
+    private $log_service;
18
+
19
+    /**
20
+     * The UI service.
21
+     *
22
+     * @since 3.2.0
23
+     * @access private
24
+     * @var \Wordlift_UI_Service $ui_service The UI service.
25
+     */
26
+    private $ui_service;
27
+
28
+    /**
29
+     * The Schema service.
30
+     *
31
+     * @since 3.3.0
32
+     * @access private
33
+     * @var \Wordlift_Schema_Service $schema_service The Schema service.
34
+     */
35
+    private $schema_service;
36
+
37
+    /**
38
+     * The Notice service.
39
+     *
40
+     * @since 3.3.0
41
+     * @access private
42
+     * @var \Wordlift_Notice_Service $notice_service The Notice service.
43
+     */
44
+    private $notice_service;
45
+
46
+    /**
47
+     * The entity post type name.
48
+     *
49
+     * @since 3.1.0
50
+     */
51
+    const TYPE_NAME = 'entity';
52
+
53
+    /**
54
+     * Entity rating max.
55
+     *
56
+     * @since 3.3.0
57
+     */
58
+    const RATING_MAX = 7;
59
+
60
+    /**
61
+     * Entity rating score meta key.
62
+     *
63
+     * @since 3.3.0
64
+     */
65
+    const RATING_RAW_SCORE_META_KEY = '_wl_entity_rating_raw_score';
66
+
67
+    /**
68
+     * Entity rating warnings meta key.
69
+     *
70
+     * @since 3.3.0
71
+     */
72
+    const RATING_WARNINGS_META_KEY = '_wl_entity_rating_warnings';
73
+
74
+    /**
75
+     * Entity warning has related post identifier.
76
+     *
77
+     * @since 3.3.0
78
+     */
79
+    const RATING_WARNING_HAS_RELATED_POSTS = 'There are no related posts for the current entity.';
80
+
81
+    /**
82
+     * Entity warning has content post identifier.
83
+     *
84
+     * @since 3.3.0
85
+     */
86
+    const RATING_WARNING_HAS_CONTENT_POST = 'This entity has not description.';
87
+
88
+    /**
89
+     * Entity warning has related entities identifier.
90
+     *
91
+     * @since 3.3.0
92
+     */
93
+    const RATING_WARNING_HAS_RELATED_ENTITIES = 'There are no related entities for the current entity.';
94
+
95
+    /**
96
+     * Entity warning is published identifier.
97
+     *
98
+     * @since 3.3.0
99
+     */
100
+    const RATING_WARNING_IS_PUBLISHED = 'This entity is not published. It will not appear within analysis results.';
101
+
102
+    /**
103
+     * Entity warning has thumbnail identifier.
104
+     *
105
+     * @since 3.3.0
106
+     */
107
+    const RATING_WARNING_HAS_THUMBNAIL = 'This entity has no featured image yet.';
108
+
109
+    /**
110
+     * Entity warning has same as identifier.
111
+     *
112
+     * @since 3.3.0
113
+     */
114
+    const RATING_WARNING_HAS_SAME_AS = 'There are no sameAs configured for this entity.';
115
+
116
+    /**
117
+     * Entity warning has completed metadata identifier.
118
+     *
119
+     * @since 3.3.0
120
+     */
121
+    const RATING_WARNING_HAS_COMPLETED_METADATA = 'Schema.org metadata for this entity are not completed.';
122
+
123
+    /**
124
+     * The alternative label meta key.
125
+     *
126
+     * @since 3.2.0
127
+     */
128
+    const ALTERNATIVE_LABEL_META_KEY = '_wl_alt_label';
129
+
130
+    /**
131
+     * The alternative label input template.
132
+     *
133
+     * @since 3.2.0
134
+     */
135
+    // TODO: this should be moved to a class that deals with HTML code.
136
+    const ALTERNATIVE_LABEL_INPUT_TEMPLATE = '<div class="wl-alternative-label">
137 137
                 <label class="screen-reader-text" id="wl-alternative-label-prompt-text" for="wl-alternative-label">Enter alternative label here</label>
138 138
                 <input name="wl_alternative_label[]" size="30" value="%s" id="wl-alternative-label" type="text">
139 139
                 <button class="button wl-delete-button">%s</button>
140 140
                 </div>';
141 141
 
142
-	/**
143
-	 * A singleton instance of the Entity service.
144
-	 *
145
-	 * @since 3.2.0
146
-	 * @access private
147
-	 * @var \Wordlift_Entity_Service $instance A singleton instance of the Entity service.
148
-	 */
149
-	private static $instance;
150
-
151
-	/**
152
-	 * Create a Wordlift_Entity_Service instance.
153
-	 *
154
-	 * @since 3.2.0
155
-	 *
156
-	 * @param \Wordlift_UI_Service $ui_service The UI service.
157
-	 */
158
-	public function __construct( $ui_service, $schema_service, $notice_service ) {
159
-
160
-		$this->log_service = Wordlift_Log_Service::get_logger( 'Wordlift_Entity_Service' );
161
-
162
-		// Set the UI service.
163
-		$this->ui_service = $ui_service;
164
-
165
-		// Set the Schema service.
166
-		$this->schema_service = $schema_service;
167
-
168
-		// Set the Schema service.
169
-		$this->notice_service = $notice_service;
170
-
171
-		// Set the singleton instance.
172
-		self::$instance = $this;
173
-
174
-	}
175
-
176
-	/**
177
-	 * Get the singleton instance of the Entity service.
178
-	 *
179
-	 * @since 3.2.0
180
-	 * @return \Wordlift_Entity_Service The singleton instance of the Entity service.
181
-	 */
182
-	public static function get_instance() {
183
-
184
-		return self::$instance;
185
-	}
186
-
187
-	/**
188
-	 * Get rating max
189
-	 *
190
-	 * @since 3.3.0
191
-	 *
192
-	 * @return int Max rating according to performed checks.
193
-	 */
194
-	public static function get_rating_max() {
195
-		return self::RATING_MAX;
196
-	}
197
-
198
-	/**
199
-	 * Get the entities related to the last 50 posts published on this blog (we're keeping a long function name due to
200
-	 * its specific function).
201
-	 *
202
-	 * @since 3.1.0
203
-	 *
204
-	 * @return array An array of post IDs.
205
-	 */
206
-	public function get_all_related_to_last_50_published_posts() {
207
-
208
-		// Global timeline. Get entities from the latest posts.
209
-		$latest_posts_ids = get_posts( array(
210
-			'numberposts' => 50,
211
-			'fields'      => 'ids', //only get post IDs
212
-			'post_type'   => 'post',
213
-			'post_status' => 'publish'
214
-		) );
215
-
216
-		if ( empty( $latest_posts_ids ) ) {
217
-			// There are no posts.
218
-			return array();
219
-		}
220
-
221
-		// Collect entities related to latest posts
222
-		$entity_ids = array();
223
-		foreach ( $latest_posts_ids as $id ) {
224
-			$entity_ids = array_merge( $entity_ids, wl_core_get_related_entity_ids( $id, array(
225
-				'status' => 'publish'
226
-			) ) );
227
-		}
228
-
229
-		return $entity_ids;
230
-	}
231
-
232
-	/**
233
-	 * Determines whether a post is an entity or not.
234
-	 *
235
-	 * @since 3.1.0
236
-	 *
237
-	 * @param int $post_id A post id.
238
-	 *
239
-	 * @return bool Return true if the post is an entity otherwise false.
240
-	 */
241
-	public function is_entity( $post_id ) {
242
-
243
-		return ( self::TYPE_NAME === get_post_type( $post_id ) );
244
-	}
245
-
246
-	/**
247
-	 * Get the proper classification scope for a given entity post
248
-	 *
249
-	 * @since 3.5.0
250
-	 *
251
-	 * @param integer $post_id An entity post id.
252
-	 *
253
-	 * @return string Returns an uri.
254
-	 */
255
-	public function get_classification_scope_for( $post_id ) {
256
-
257
-		if ( FALSE === $this->is_entity( $post_id ) ) {
258
-			return NULL;
259
-		}
260
-		// Retrieve the entity type
261
-		$entity_type_arr = wl_entity_type_taxonomy_get_type( $post_id );
262
-		$entity_type     = str_replace( 'wl-', '', $entity_type_arr['css_class'] );
263
-		// Retrieve classification boxes configuration
264
-		$classification_boxes = unserialize( WL_CORE_POST_CLASSIFICATION_BOXES );
265
-		foreach ( $classification_boxes as $cb ) {
266
-			if ( in_array( $entity_type, $cb['registeredTypes'] ) ) {
267
-				return $cb['id'];
268
-			}
269
-		}
270
-
271
-		// or null
272
-		return NULL;
273
-
274
-	}
275
-
276
-	/**
277
-	 * Build an entity uri for a given title
278
-	 * The uri is composed using a given post_type and a title
279
-	 * If already exists an entity e2 with a given uri a numeric suffix is added
280
-	 * If a schema type is given entities with same label and same type are overridden
281
-	 *
282
-	 * @since 3.5.0
283
-	 *
284
-	 * @param string $title A post title.
285
-	 * @param string $post_type A post type. Default value is 'entity'
286
-	 * @param string $schema_type A schema org type.
287
-	 * @param integer $increment_digit A digit used to call recursively the same function.
288
-	 *
289
-	 * @return string Returns an uri.
290
-	 */
291
-	public function build_uri( $title, $post_type, $schema_type = NULL, $increment_digit = 0 ) {
292
-
293
-		// Get the entity slug suffix digit
294
-		$suffix_digit = $increment_digit + 1;
295
-		// Get a sanitized uri for a given title
296
-		$entity_slug = ( 0 == $increment_digit ) ?
297
-			wl_sanitize_uri_path( $title ) :
298
-			wl_sanitize_uri_path( $title . '_' . $suffix_digit );
299
-
300
-		// Compose a candidated uri
301
-		$new_entity_uri = sprintf( '%s/%s/%s',
302
-			wl_configuration_get_redlink_dataset_uri(),
303
-			$post_type,
304
-			$entity_slug
305
-		);
306
-
307
-		$this->log_service->trace( "Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]" );
308
-
309
-		global $wpdb;
310
-		// Check if the candidated uri already is used
311
-		$stmt = $wpdb->prepare(
312
-			"SELECT post_id FROM $wpdb->postmeta WHERE meta_key = %s AND meta_value = %s LIMIT 1",
313
-			WL_ENTITY_URL_META_NAME,
314
-			$new_entity_uri
315
-		);
316
-
317
-		// Perform the query
318
-		$post_id = $wpdb->get_var( $stmt );
319
-
320
-		// If the post does not exist, then the new uri is returned 	
321
-		if ( ! is_numeric( $post_id ) ) {
322
-			$this->log_service->trace( "Going to return uri [ new_entity_uri :: $new_entity_uri ]" );
323
-
324
-			return $new_entity_uri;
325
-		}
326
-		// If schema_type is equal to schema org type of post x, then the new uri is returned 
327
-		$schema_post_type = wl_entity_type_taxonomy_get_type( $post_id );
328
-
329
-		if ( $schema_type === $schema_post_type['css_class'] ) {
330
-			$this->log_service->trace( "An entity with the same title and type already exists! Return uri [ new_entity_uri :: $new_entity_uri ]" );
331
-
332
-			return $new_entity_uri;
333
-		}
334
-
335
-		// Otherwise the same function is called recorsively
336
-		return $this->build_uri( $title, $post_type, $schema_type, ++ $increment_digit );
337
-	}
338
-
339
-	public function is_used( $post_id ) {
340
-
341
-		if ( FALSE === $this->is_entity( $post_id ) ) {
342
-			return NULL;
343
-		}
344
-		// Retrieve the post
345
-		$entity = get_post( $post_id );
346
-
347
-		global $wpdb;
348
-		// Retrieve Wordlift relation instances table name
349
-		$table_name = wl_core_get_relation_instances_table_name();
350
-
351
-		// Check is it's referenced / related to another post / entity
352
-		$stmt = $wpdb->prepare(
353
-			"SELECT COUNT(*) FROM $table_name WHERE  object_id = %d",
354
-			$entity->ID
355
-		);
356
-
357
-		// Perform the query
358
-		$relation_instances = (int) $wpdb->get_var( $stmt );
359
-		// If there is at least one relation instance for the current entity, then it's used
360
-		if ( 0 < $relation_instances ) {
361
-			return TRUE;
362
-		}
363
-
364
-		// Check if the entity uri is used as meta_value
365
-		$stmt = $wpdb->prepare(
366
-			"SELECT COUNT(*) FROM $wpdb->postmeta WHERE post_id != %d AND meta_value = %s",
367
-			$entity->ID,
368
-			wl_get_entity_uri( $entity->ID )
369
-		);
370
-		// Perform the query
371
-		$meta_instances = (int) $wpdb->get_var( $stmt );
372
-
373
-		// If there is at least one meta that refers the current entity uri, then current entity is used
374
-		if ( 0 < $meta_instances ) {
375
-			return TRUE;
376
-		}
377
-
378
-		// If we are here, it means the current entity is not used at the moment
379
-		return FALSE;
380
-	}
381
-
382
-	/**
383
-	 * Determines whether a given uri is an internal uri or not.
384
-	 *
385
-	 * @since 3.3.2
386
-	 *
387
-	 * @param int $uri An uri.
388
-	 *
389
-	 * @return true if the uri internal to the current dataset otherwise false.
390
-	 */
391
-	public function is_internal_uri( $uri ) {
392
-
393
-		return ( 0 === strrpos( $uri, wl_configuration_get_redlink_dataset_uri() ) );
394
-	}
395
-
396
-	/**
397
-	 * Find entity posts by the entity URI. Entity as searched by their entity URI or same as.
398
-	 *
399
-	 * @since 3.2.0
400
-	 *
401
-	 * @param string $uri The entity URI.
402
-	 *
403
-	 * @return WP_Post|null A WP_Post instance or null if not found.
404
-	 */
405
-	public function get_entity_post_by_uri( $uri ) {
406
-
407
-		// Check if we've been provided with a value otherwise return null.
408
-		if ( empty( $uri ) ) {
409
-			return NULL;
410
-		}
411
-
412
-		$query_args = array(
413
-			'posts_per_page' => 1,
414
-			'post_status'    => 'any',
415
-			'post_type'      => self::TYPE_NAME,
416
-			'meta_query'     => array(
417
-				array(
418
-					'key'     => WL_ENTITY_URL_META_NAME,
419
-					'value'   => $uri,
420
-					'compare' => '='
421
-				)
422
-			)
423
-		);
424
-
425
-		// Only if the current uri is not an internal uri 
426
-		// entity search is performed also looking at sameAs values
427
-		// This solve issues like https://github.com/insideout10/wordlift-plugin/issues/237
428
-		if ( ! $this->is_internal_uri( $uri ) ) {
429
-
430
-			$query_args['meta_query']['relation'] = 'OR';
431
-			$query_args['meta_query'][]           = array(
432
-				'key'     => Wordlift_Schema_Service::FIELD_SAME_AS,
433
-				'value'   => $uri,
434
-				'compare' => '='
435
-			);
436
-		}
437
-
438
-		$query = new WP_Query( $query_args );
439
-
440
-		// Get the matching entity posts.
441
-		$posts = $query->get_posts();
442
-
443
-		// Return null if no post is found.
444
-		if ( 0 === count( $posts ) ) {
445
-			return NULL;
446
-		}
447
-
448
-		// Return the found post.
449
-		return $posts[0];
450
-	}
451
-
452
-	/**
453
-	 * Fires once a post has been saved.
454
-	 *
455
-	 * @since 3.2.0
456
-	 *
457
-	 * @param int $post_id Post ID.
458
-	 * @param WP_Post $post Post object.
459
-	 * @param bool $update Whether this is an existing post being updated or not.
460
-	 */
461
-	public function save_post( $post_id, $post, $update ) {
462
-
463
-		// If it's not an entity, return.
464
-		if ( ! $this->is_entity( $post_id ) ) {
465
-			return;
466
-		}
467
-
468
-		// Get the alt labels from the request (or empty array).
469
-		$alt_labels = isset( $_REQUEST['wl_alternative_label'] ) ? $_REQUEST['wl_alternative_label'] : array();
470
-
471
-		// Set the alternative labels.
472
-		$this->set_alternative_labels( $post_id, $alt_labels );
473
-
474
-	}
475
-
476
-	/**
477
-	 * Set the alternative labels.
478
-	 *
479
-	 * @since 3.2.0
480
-	 *
481
-	 * @param int $post_id The post id.
482
-	 * @param array $alt_labels An array of labels.
483
-	 */
484
-	public function set_alternative_labels( $post_id, $alt_labels ) {
485
-
486
-		// Force $alt_labels to be an array
487
-		if ( ! is_array( $alt_labels ) ) {
488
-			$alt_labels = array( $alt_labels );
489
-		}
490
-
491
-		$this->log_service->debug( "Setting alternative labels [ post id :: $post_id ][ alt labels :: " . implode( ',', $alt_labels ) . " ]" );
492
-
493
-		// Delete all the existing alternate labels.
494
-		delete_post_meta( $post_id, self::ALTERNATIVE_LABEL_META_KEY );
495
-
496
-		// Set the alternative labels.
497
-		foreach ( $alt_labels as $alt_label ) {
498
-			if ( ! empty( $alt_label ) ) {
499
-				add_post_meta( $post_id, self::ALTERNATIVE_LABEL_META_KEY, $alt_label );
500
-			}
501
-		}
502
-
503
-	}
504
-
505
-	/**
506
-	 * Retrieve the alternate labels.
507
-	 *
508
-	 * @since 3.2.0
509
-	 *
510
-	 * @param int $post_id Post id.
511
-	 *
512
-	 * @return mixed An array  of alternative labels.
513
-	 */
514
-	public function get_alternative_labels( $post_id ) {
515
-
516
-		return get_post_meta( $post_id, self::ALTERNATIVE_LABEL_META_KEY );
517
-	}
518
-
519
-	/**
520
-	 * Fires before the permalink field in the edit form (this event is available in WP from 4.1.0).
521
-	 *
522
-	 * @since 3.2.0
523
-	 *
524
-	 * @param WP_Post $post Post object.
525
-	 */
526
-	public function edit_form_before_permalink( $post ) {
527
-
528
-		// If it's not an entity, return.
529
-		if ( ! $this->is_entity( $post->ID ) ) {
530
-			return;
531
-		}
532
-
533
-		// Print the input template.
534
-		$this->ui_service->print_template( 'wl-tmpl-alternative-label-input', $this->get_alternative_label_input() );
535
-
536
-		// Print all the currently set alternative labels.
537
-		foreach ( $this->get_alternative_labels( $post->ID ) as $alt_label ) {
538
-
539
-			echo $this->get_alternative_label_input( $alt_label );
540
-
541
-		};
542
-
543
-		// Print the button.
544
-		$this->ui_service->print_button( 'wl-add-alternative-labels-button', __( 'Add more titles', 'wordlift' ) );
545
-
546
-	}
547
-
548
-	/**
549
-	 * Add admin notices for the current entity depending on the current rating.
550
-	 *
551
-	 * @since 3.3.0
552
-	 *
553
-	 * @param WP_Post $post Post object.
554
-	 */
555
-	public function in_admin_header() {
556
-
557
-		// Return safely if get_current_screen() is not defined (yet)
558
-		if ( FALSE === function_exists( 'get_current_screen' ) ) {
559
-			return;
560
-		}
561
-
562
-		$screen = get_current_screen();
563
-		// If there is any valid screen nothing to do
564
-		if ( NULL === $screen ) {
565
-			return $clauses;
566
-		}
567
-
568
-		// If you're not in the entity post edit page, return.
569
-		if ( self::TYPE_NAME !== $screen->id ) {
570
-			return;
571
-		}
572
-		// Retrieve the current global post
573
-		global $post;
574
-		// If it's not an entity, return.
575
-		if ( ! $this->is_entity( $post->ID ) ) {
576
-			return;
577
-		}
578
-		// Retrieve an updated rating for the current entity
579
-		$rating = $this->get_rating_for( $post->ID, TRUE );
580
-		// If there is at least 1 warning
581
-		if ( isset( $rating['warnings'] ) && 0 < count( $rating['warnings'] ) ) {
582
-			// TODO - Pass Wordlift_Notice_Service trough the service constructor 
583
-			$this->notice_service->add_suggestion( $rating['warnings'] );
584
-		}
585
-
586
-	}
587
-
588
-	/**
589
-	 * Set rating for a given entity
590
-	 *
591
-	 * @since 3.3.0
592
-	 *
593
-	 * @param int $post_id The entity post id.
594
-	 *
595
-	 * @return int An array representing the rating obj.
596
-	 */
597
-	public function set_rating_for( $post_id ) {
598
-
599
-		// Calculate rating for the given post
600
-		$rating = $this->calculate_rating_for( $post_id );
601
-		// Store the rating on db as post meta
602
-		// Please notice that RATING_RAW_SCORE_META_KEY 
603
-		// is saved on a different meta to allow score sorting
604
-		// Both meta are managed as unique
605
-		// https://codex.wordpress.org/Function_Reference/update_post_meta
606
-		update_post_meta( $post_id, self::RATING_RAW_SCORE_META_KEY, $rating['raw_score'] );
607
-		update_post_meta( $post_id, self::RATING_WARNINGS_META_KEY, $rating['warnings'] );
608
-
609
-		$this->log_service->trace( sprintf( "Rating set for [ post_id :: $post_id ] [ rating :: %s ]", $rating['raw_score'] ) );
610
-
611
-		// Finally returns the rating 
612
-		return $rating;
613
-	}
614
-
615
-	/**
616
-	 * Get or calculate rating for a given entity
617
-	 *
618
-	 * @since 3.3.0
619
-	 *
620
-	 * @param int $post_id The entity post id.
621
-	 * @param $force_reload $warnings_needed If true, detailed warnings collection is provided with the rating obj.
622
-	 *
623
-	 * @return int An array representing the rating obj.
624
-	 */
625
-	public function get_rating_for( $post_id, $force_reload = FALSE ) {
626
-
627
-		// If forced reload is required or rating is missing ..
628
-		if ( $force_reload ) {
629
-			$this->log_service->trace( "Force rating reload [ post_id :: $post_id ]" );
630
-
631
-			return $this->set_rating_for( $post_id );
632
-		}
633
-
634
-		$current_raw_score = get_post_meta( $post_id, self::RATING_RAW_SCORE_META_KEY, TRUE );
635
-
636
-		if ( ! is_numeric( $current_raw_score ) ) {
637
-			$this->log_service->trace( "Rating missing for [ post_id :: $post_id ] [ current_raw_score :: $current_raw_score ]" );
638
-
639
-			return $this->set_rating_for( $post_id );
640
-		}
641
-		$current_warnings = get_post_meta( $post_id, self::RATING_WARNINGS_META_KEY, TRUE );
642
-
643
-		// Finally return score and warnings
644
-		return array(
645
-			'raw_score'           => $current_raw_score,
646
-			'traffic_light_score' => $this->convert_raw_score_to_traffic_light( $current_raw_score ),
647
-			'percentage_score'    => $this->convert_raw_score_to_percentage( $current_raw_score ),
648
-			'warnings'            => $current_warnings,
649
-		);
650
-
651
-	}
652
-
653
-	/**
654
-	 * Calculate rating for a given entity
655
-	 * Rating depends from following criteria
656
-	 *
657
-	 * 1. Is the current entity related to at least 1 post?
658
-	 * 2. Is the current entity content post not empty?
659
-	 * 3. Is the current entity related to at least 1 entity?
660
-	 * 4. Is the entity published?
661
-	 * 5. There is a a thumbnail associated to the entity?
662
-	 * 6. Has the entity a sameas defined?
663
-	 * 7. Are all schema.org required metadata compiled?
664
-	 *
665
-	 * Each positive check means +1 in terms of rating score
666
-	 *
667
-	 * @since 3.3.0
668
-	 *
669
-	 * @param int $post_id The entity post id.
670
-	 *
671
-	 * @return int An array representing the rating obj.
672
-	 */
673
-	public function calculate_rating_for( $post_id ) {
674
-
675
-		// If it's not an entity, return.
676
-		if ( ! $this->is_entity( $post_id ) ) {
677
-			return;
678
-		}
679
-		// Retrieve the post object
680
-		$post = get_post( $post_id );
681
-		// Rating value
682
-		$score = 0;
683
-		// Store warning messages
684
-		$warnings = array();
685
-
686
-		// Is the current entity related to at least 1 post?
687
-		( 0 < count( wl_core_get_related_post_ids( $post->ID ) ) ) ?
688
-			$score ++ :
689
-			array_push( $warnings, __( self::RATING_WARNING_HAS_RELATED_POSTS, 'wordlift' ) );
690
-
691
-		// Is the post content not empty?
692
-		( ! empty( $post->post_content ) ) ?
693
-			$score ++ :
694
-			array_push( $warnings, __( self::RATING_WARNING_HAS_CONTENT_POST, 'wordlift' ) );
695
-
696
-		// Is the current entity related to at least 1 entity?
697
-		// Was the current entity already disambiguated?
698
-		( 0 < count( wl_core_get_related_entity_ids( $post->ID ) ) ) ?
699
-			$score ++ :
700
-			array_push( $warnings, __( self::RATING_WARNING_HAS_RELATED_ENTITIES, 'wordlift' ) );
701
-
702
-		// Is the entity published?
703
-		( 'publish' === get_post_status( $post->ID ) ) ?
704
-			$score ++ :
705
-			array_push( $warnings, __( self::RATING_WARNING_IS_PUBLISHED, 'wordlift' ) );
706
-
707
-		// Has a thumbnail?
708
-		( has_post_thumbnail( $post->ID ) ) ?
709
-			$score ++ :
710
-			array_push( $warnings, __( self::RATING_WARNING_HAS_THUMBNAIL, 'wordlift' ) );
711
-
712
-		// Get all post meta keys for the current post		
713
-		global $wpdb;
714
-		$query = $wpdb->prepare(
715
-			"SELECT DISTINCT(meta_key) FROM $wpdb->postmeta  WHERE post_id = %d", $post->ID
716
-		);
717
-
718
-		// Check intersection between available meta keys 
719
-		// and expected ones arrays to detect missing values
720
-		$available_meta_keys = $wpdb->get_col( $query );
721
-
722
-		// If each expected key is contained in available keys array ...
723
-		( in_array( Wordlift_Schema_Service::FIELD_SAME_AS, $available_meta_keys ) ) ?
724
-			$score ++ :
725
-			array_push( $warnings, __( self::RATING_WARNING_HAS_SAME_AS, 'wordlift' ) );
726
-
727
-		$schema = wl_entity_type_taxonomy_get_type( $post_id );
728
-
729
-		$expected_meta_keys = ( NULL === $schema['custom_fields'] ) ?
730
-			array() :
731
-			array_keys( $schema['custom_fields'] );
732
-
733
-		$intersection = array_intersect( $expected_meta_keys, $available_meta_keys );
734
-		// If each expected key is contained in available keys array ...
735
-		( count( $intersection ) === count( $expected_meta_keys ) ) ?
736
-			$score ++ :
737
-			array_push( $warnings, __( self::RATING_WARNING_HAS_COMPLETED_METADATA, 'wordlift' ) );
738
-
739
-		// Finally return score and warnings
740
-		return array(
741
-			'raw_score'           => $score,
742
-			'traffic_light_score' => $this->convert_raw_score_to_traffic_light( $score ),
743
-			'percentage_score'    => $this->convert_raw_score_to_percentage( $score ),
744
-			'warnings'            => $warnings,
745
-		);
746
-
747
-	}
748
-
749
-	/**
750
-	 * Get as rating as input and convert in a traffic-light rating
751
-	 *
752
-	 * @since 3.3.0
753
-	 *
754
-	 * @param int $score The rating score for a given entity.
755
-	 *
756
-	 * @return string The input HTML code.
757
-	 */
758
-	private function convert_raw_score_to_traffic_light( $score ) {
759
-		// RATING_MAX : $score = 3 : x 
760
-		// See http://php.net/manual/en/function.round.php
761
-		$rating = round( ( $score * 3 ) / self::get_rating_max(), 0, PHP_ROUND_HALF_UP );
762
-
763
-		// If rating is 0, return 1, otherwise return rating
764
-		return ( 0 == $rating ) ? 1 : $rating;
765
-
766
-	}
767
-
768
-	/**
769
-	 * Get as rating as input and convert in a traffic-light rating
770
-	 *
771
-	 * @since 3.3.0
772
-	 *
773
-	 * @param int $score The rating score for a given entity.
774
-	 *
775
-	 * @return string The input HTML code.
776
-	 */
777
-	public function convert_raw_score_to_percentage( $score ) {
778
-		// RATING_MAX : $score = 100 : x 
779
-		return round( ( $score * 100 ) / self::get_rating_max(), 0, PHP_ROUND_HALF_UP );
780
-	}
781
-
782
-	/**
783
-	 * Get the alternative label input HTML code.
784
-	 *
785
-	 * @since 3.2.0
786
-	 *
787
-	 * @param string $value The input value.
788
-	 *
789
-	 * @return string The input HTML code.
790
-	 */
791
-	private function get_alternative_label_input( $value = '' ) {
792
-
793
-		return sprintf( self::ALTERNATIVE_LABEL_INPUT_TEMPLATE, esc_attr( $value ), __( 'Delete', 'wordlift' ) );
794
-	}
142
+    /**
143
+     * A singleton instance of the Entity service.
144
+     *
145
+     * @since 3.2.0
146
+     * @access private
147
+     * @var \Wordlift_Entity_Service $instance A singleton instance of the Entity service.
148
+     */
149
+    private static $instance;
150
+
151
+    /**
152
+     * Create a Wordlift_Entity_Service instance.
153
+     *
154
+     * @since 3.2.0
155
+     *
156
+     * @param \Wordlift_UI_Service $ui_service The UI service.
157
+     */
158
+    public function __construct( $ui_service, $schema_service, $notice_service ) {
159
+
160
+        $this->log_service = Wordlift_Log_Service::get_logger( 'Wordlift_Entity_Service' );
161
+
162
+        // Set the UI service.
163
+        $this->ui_service = $ui_service;
164
+
165
+        // Set the Schema service.
166
+        $this->schema_service = $schema_service;
167
+
168
+        // Set the Schema service.
169
+        $this->notice_service = $notice_service;
170
+
171
+        // Set the singleton instance.
172
+        self::$instance = $this;
173
+
174
+    }
175
+
176
+    /**
177
+     * Get the singleton instance of the Entity service.
178
+     *
179
+     * @since 3.2.0
180
+     * @return \Wordlift_Entity_Service The singleton instance of the Entity service.
181
+     */
182
+    public static function get_instance() {
183
+
184
+        return self::$instance;
185
+    }
186
+
187
+    /**
188
+     * Get rating max
189
+     *
190
+     * @since 3.3.0
191
+     *
192
+     * @return int Max rating according to performed checks.
193
+     */
194
+    public static function get_rating_max() {
195
+        return self::RATING_MAX;
196
+    }
197
+
198
+    /**
199
+     * Get the entities related to the last 50 posts published on this blog (we're keeping a long function name due to
200
+     * its specific function).
201
+     *
202
+     * @since 3.1.0
203
+     *
204
+     * @return array An array of post IDs.
205
+     */
206
+    public function get_all_related_to_last_50_published_posts() {
207
+
208
+        // Global timeline. Get entities from the latest posts.
209
+        $latest_posts_ids = get_posts( array(
210
+            'numberposts' => 50,
211
+            'fields'      => 'ids', //only get post IDs
212
+            'post_type'   => 'post',
213
+            'post_status' => 'publish'
214
+        ) );
215
+
216
+        if ( empty( $latest_posts_ids ) ) {
217
+            // There are no posts.
218
+            return array();
219
+        }
220
+
221
+        // Collect entities related to latest posts
222
+        $entity_ids = array();
223
+        foreach ( $latest_posts_ids as $id ) {
224
+            $entity_ids = array_merge( $entity_ids, wl_core_get_related_entity_ids( $id, array(
225
+                'status' => 'publish'
226
+            ) ) );
227
+        }
228
+
229
+        return $entity_ids;
230
+    }
231
+
232
+    /**
233
+     * Determines whether a post is an entity or not.
234
+     *
235
+     * @since 3.1.0
236
+     *
237
+     * @param int $post_id A post id.
238
+     *
239
+     * @return bool Return true if the post is an entity otherwise false.
240
+     */
241
+    public function is_entity( $post_id ) {
242
+
243
+        return ( self::TYPE_NAME === get_post_type( $post_id ) );
244
+    }
245
+
246
+    /**
247
+     * Get the proper classification scope for a given entity post
248
+     *
249
+     * @since 3.5.0
250
+     *
251
+     * @param integer $post_id An entity post id.
252
+     *
253
+     * @return string Returns an uri.
254
+     */
255
+    public function get_classification_scope_for( $post_id ) {
256
+
257
+        if ( FALSE === $this->is_entity( $post_id ) ) {
258
+            return NULL;
259
+        }
260
+        // Retrieve the entity type
261
+        $entity_type_arr = wl_entity_type_taxonomy_get_type( $post_id );
262
+        $entity_type     = str_replace( 'wl-', '', $entity_type_arr['css_class'] );
263
+        // Retrieve classification boxes configuration
264
+        $classification_boxes = unserialize( WL_CORE_POST_CLASSIFICATION_BOXES );
265
+        foreach ( $classification_boxes as $cb ) {
266
+            if ( in_array( $entity_type, $cb['registeredTypes'] ) ) {
267
+                return $cb['id'];
268
+            }
269
+        }
270
+
271
+        // or null
272
+        return NULL;
273
+
274
+    }
275
+
276
+    /**
277
+     * Build an entity uri for a given title
278
+     * The uri is composed using a given post_type and a title
279
+     * If already exists an entity e2 with a given uri a numeric suffix is added
280
+     * If a schema type is given entities with same label and same type are overridden
281
+     *
282
+     * @since 3.5.0
283
+     *
284
+     * @param string $title A post title.
285
+     * @param string $post_type A post type. Default value is 'entity'
286
+     * @param string $schema_type A schema org type.
287
+     * @param integer $increment_digit A digit used to call recursively the same function.
288
+     *
289
+     * @return string Returns an uri.
290
+     */
291
+    public function build_uri( $title, $post_type, $schema_type = NULL, $increment_digit = 0 ) {
292
+
293
+        // Get the entity slug suffix digit
294
+        $suffix_digit = $increment_digit + 1;
295
+        // Get a sanitized uri for a given title
296
+        $entity_slug = ( 0 == $increment_digit ) ?
297
+            wl_sanitize_uri_path( $title ) :
298
+            wl_sanitize_uri_path( $title . '_' . $suffix_digit );
299
+
300
+        // Compose a candidated uri
301
+        $new_entity_uri = sprintf( '%s/%s/%s',
302
+            wl_configuration_get_redlink_dataset_uri(),
303
+            $post_type,
304
+            $entity_slug
305
+        );
306
+
307
+        $this->log_service->trace( "Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]" );
308
+
309
+        global $wpdb;
310
+        // Check if the candidated uri already is used
311
+        $stmt = $wpdb->prepare(
312
+            "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = %s AND meta_value = %s LIMIT 1",
313
+            WL_ENTITY_URL_META_NAME,
314
+            $new_entity_uri
315
+        );
316
+
317
+        // Perform the query
318
+        $post_id = $wpdb->get_var( $stmt );
319
+
320
+        // If the post does not exist, then the new uri is returned 	
321
+        if ( ! is_numeric( $post_id ) ) {
322
+            $this->log_service->trace( "Going to return uri [ new_entity_uri :: $new_entity_uri ]" );
323
+
324
+            return $new_entity_uri;
325
+        }
326
+        // If schema_type is equal to schema org type of post x, then the new uri is returned 
327
+        $schema_post_type = wl_entity_type_taxonomy_get_type( $post_id );
328
+
329
+        if ( $schema_type === $schema_post_type['css_class'] ) {
330
+            $this->log_service->trace( "An entity with the same title and type already exists! Return uri [ new_entity_uri :: $new_entity_uri ]" );
331
+
332
+            return $new_entity_uri;
333
+        }
334
+
335
+        // Otherwise the same function is called recorsively
336
+        return $this->build_uri( $title, $post_type, $schema_type, ++ $increment_digit );
337
+    }
338
+
339
+    public function is_used( $post_id ) {
340
+
341
+        if ( FALSE === $this->is_entity( $post_id ) ) {
342
+            return NULL;
343
+        }
344
+        // Retrieve the post
345
+        $entity = get_post( $post_id );
346
+
347
+        global $wpdb;
348
+        // Retrieve Wordlift relation instances table name
349
+        $table_name = wl_core_get_relation_instances_table_name();
350
+
351
+        // Check is it's referenced / related to another post / entity
352
+        $stmt = $wpdb->prepare(
353
+            "SELECT COUNT(*) FROM $table_name WHERE  object_id = %d",
354
+            $entity->ID
355
+        );
356
+
357
+        // Perform the query
358
+        $relation_instances = (int) $wpdb->get_var( $stmt );
359
+        // If there is at least one relation instance for the current entity, then it's used
360
+        if ( 0 < $relation_instances ) {
361
+            return TRUE;
362
+        }
363
+
364
+        // Check if the entity uri is used as meta_value
365
+        $stmt = $wpdb->prepare(
366
+            "SELECT COUNT(*) FROM $wpdb->postmeta WHERE post_id != %d AND meta_value = %s",
367
+            $entity->ID,
368
+            wl_get_entity_uri( $entity->ID )
369
+        );
370
+        // Perform the query
371
+        $meta_instances = (int) $wpdb->get_var( $stmt );
372
+
373
+        // If there is at least one meta that refers the current entity uri, then current entity is used
374
+        if ( 0 < $meta_instances ) {
375
+            return TRUE;
376
+        }
377
+
378
+        // If we are here, it means the current entity is not used at the moment
379
+        return FALSE;
380
+    }
381
+
382
+    /**
383
+     * Determines whether a given uri is an internal uri or not.
384
+     *
385
+     * @since 3.3.2
386
+     *
387
+     * @param int $uri An uri.
388
+     *
389
+     * @return true if the uri internal to the current dataset otherwise false.
390
+     */
391
+    public function is_internal_uri( $uri ) {
392
+
393
+        return ( 0 === strrpos( $uri, wl_configuration_get_redlink_dataset_uri() ) );
394
+    }
395
+
396
+    /**
397
+     * Find entity posts by the entity URI. Entity as searched by their entity URI or same as.
398
+     *
399
+     * @since 3.2.0
400
+     *
401
+     * @param string $uri The entity URI.
402
+     *
403
+     * @return WP_Post|null A WP_Post instance or null if not found.
404
+     */
405
+    public function get_entity_post_by_uri( $uri ) {
406
+
407
+        // Check if we've been provided with a value otherwise return null.
408
+        if ( empty( $uri ) ) {
409
+            return NULL;
410
+        }
411
+
412
+        $query_args = array(
413
+            'posts_per_page' => 1,
414
+            'post_status'    => 'any',
415
+            'post_type'      => self::TYPE_NAME,
416
+            'meta_query'     => array(
417
+                array(
418
+                    'key'     => WL_ENTITY_URL_META_NAME,
419
+                    'value'   => $uri,
420
+                    'compare' => '='
421
+                )
422
+            )
423
+        );
424
+
425
+        // Only if the current uri is not an internal uri 
426
+        // entity search is performed also looking at sameAs values
427
+        // This solve issues like https://github.com/insideout10/wordlift-plugin/issues/237
428
+        if ( ! $this->is_internal_uri( $uri ) ) {
429
+
430
+            $query_args['meta_query']['relation'] = 'OR';
431
+            $query_args['meta_query'][]           = array(
432
+                'key'     => Wordlift_Schema_Service::FIELD_SAME_AS,
433
+                'value'   => $uri,
434
+                'compare' => '='
435
+            );
436
+        }
437
+
438
+        $query = new WP_Query( $query_args );
439
+
440
+        // Get the matching entity posts.
441
+        $posts = $query->get_posts();
442
+
443
+        // Return null if no post is found.
444
+        if ( 0 === count( $posts ) ) {
445
+            return NULL;
446
+        }
447
+
448
+        // Return the found post.
449
+        return $posts[0];
450
+    }
451
+
452
+    /**
453
+     * Fires once a post has been saved.
454
+     *
455
+     * @since 3.2.0
456
+     *
457
+     * @param int $post_id Post ID.
458
+     * @param WP_Post $post Post object.
459
+     * @param bool $update Whether this is an existing post being updated or not.
460
+     */
461
+    public function save_post( $post_id, $post, $update ) {
462
+
463
+        // If it's not an entity, return.
464
+        if ( ! $this->is_entity( $post_id ) ) {
465
+            return;
466
+        }
467
+
468
+        // Get the alt labels from the request (or empty array).
469
+        $alt_labels = isset( $_REQUEST['wl_alternative_label'] ) ? $_REQUEST['wl_alternative_label'] : array();
470
+
471
+        // Set the alternative labels.
472
+        $this->set_alternative_labels( $post_id, $alt_labels );
473
+
474
+    }
475
+
476
+    /**
477
+     * Set the alternative labels.
478
+     *
479
+     * @since 3.2.0
480
+     *
481
+     * @param int $post_id The post id.
482
+     * @param array $alt_labels An array of labels.
483
+     */
484
+    public function set_alternative_labels( $post_id, $alt_labels ) {
485
+
486
+        // Force $alt_labels to be an array
487
+        if ( ! is_array( $alt_labels ) ) {
488
+            $alt_labels = array( $alt_labels );
489
+        }
490
+
491
+        $this->log_service->debug( "Setting alternative labels [ post id :: $post_id ][ alt labels :: " . implode( ',', $alt_labels ) . " ]" );
492
+
493
+        // Delete all the existing alternate labels.
494
+        delete_post_meta( $post_id, self::ALTERNATIVE_LABEL_META_KEY );
495
+
496
+        // Set the alternative labels.
497
+        foreach ( $alt_labels as $alt_label ) {
498
+            if ( ! empty( $alt_label ) ) {
499
+                add_post_meta( $post_id, self::ALTERNATIVE_LABEL_META_KEY, $alt_label );
500
+            }
501
+        }
502
+
503
+    }
504
+
505
+    /**
506
+     * Retrieve the alternate labels.
507
+     *
508
+     * @since 3.2.0
509
+     *
510
+     * @param int $post_id Post id.
511
+     *
512
+     * @return mixed An array  of alternative labels.
513
+     */
514
+    public function get_alternative_labels( $post_id ) {
515
+
516
+        return get_post_meta( $post_id, self::ALTERNATIVE_LABEL_META_KEY );
517
+    }
518
+
519
+    /**
520
+     * Fires before the permalink field in the edit form (this event is available in WP from 4.1.0).
521
+     *
522
+     * @since 3.2.0
523
+     *
524
+     * @param WP_Post $post Post object.
525
+     */
526
+    public function edit_form_before_permalink( $post ) {
527
+
528
+        // If it's not an entity, return.
529
+        if ( ! $this->is_entity( $post->ID ) ) {
530
+            return;
531
+        }
532
+
533
+        // Print the input template.
534
+        $this->ui_service->print_template( 'wl-tmpl-alternative-label-input', $this->get_alternative_label_input() );
535
+
536
+        // Print all the currently set alternative labels.
537
+        foreach ( $this->get_alternative_labels( $post->ID ) as $alt_label ) {
538
+
539
+            echo $this->get_alternative_label_input( $alt_label );
540
+
541
+        };
542
+
543
+        // Print the button.
544
+        $this->ui_service->print_button( 'wl-add-alternative-labels-button', __( 'Add more titles', 'wordlift' ) );
545
+
546
+    }
547
+
548
+    /**
549
+     * Add admin notices for the current entity depending on the current rating.
550
+     *
551
+     * @since 3.3.0
552
+     *
553
+     * @param WP_Post $post Post object.
554
+     */
555
+    public function in_admin_header() {
556
+
557
+        // Return safely if get_current_screen() is not defined (yet)
558
+        if ( FALSE === function_exists( 'get_current_screen' ) ) {
559
+            return;
560
+        }
561
+
562
+        $screen = get_current_screen();
563
+        // If there is any valid screen nothing to do
564
+        if ( NULL === $screen ) {
565
+            return $clauses;
566
+        }
567
+
568
+        // If you're not in the entity post edit page, return.
569
+        if ( self::TYPE_NAME !== $screen->id ) {
570
+            return;
571
+        }
572
+        // Retrieve the current global post
573
+        global $post;
574
+        // If it's not an entity, return.
575
+        if ( ! $this->is_entity( $post->ID ) ) {
576
+            return;
577
+        }
578
+        // Retrieve an updated rating for the current entity
579
+        $rating = $this->get_rating_for( $post->ID, TRUE );
580
+        // If there is at least 1 warning
581
+        if ( isset( $rating['warnings'] ) && 0 < count( $rating['warnings'] ) ) {
582
+            // TODO - Pass Wordlift_Notice_Service trough the service constructor 
583
+            $this->notice_service->add_suggestion( $rating['warnings'] );
584
+        }
585
+
586
+    }
587
+
588
+    /**
589
+     * Set rating for a given entity
590
+     *
591
+     * @since 3.3.0
592
+     *
593
+     * @param int $post_id The entity post id.
594
+     *
595
+     * @return int An array representing the rating obj.
596
+     */
597
+    public function set_rating_for( $post_id ) {
598
+
599
+        // Calculate rating for the given post
600
+        $rating = $this->calculate_rating_for( $post_id );
601
+        // Store the rating on db as post meta
602
+        // Please notice that RATING_RAW_SCORE_META_KEY 
603
+        // is saved on a different meta to allow score sorting
604
+        // Both meta are managed as unique
605
+        // https://codex.wordpress.org/Function_Reference/update_post_meta
606
+        update_post_meta( $post_id, self::RATING_RAW_SCORE_META_KEY, $rating['raw_score'] );
607
+        update_post_meta( $post_id, self::RATING_WARNINGS_META_KEY, $rating['warnings'] );
608
+
609
+        $this->log_service->trace( sprintf( "Rating set for [ post_id :: $post_id ] [ rating :: %s ]", $rating['raw_score'] ) );
610
+
611
+        // Finally returns the rating 
612
+        return $rating;
613
+    }
614
+
615
+    /**
616
+     * Get or calculate rating for a given entity
617
+     *
618
+     * @since 3.3.0
619
+     *
620
+     * @param int $post_id The entity post id.
621
+     * @param $force_reload $warnings_needed If true, detailed warnings collection is provided with the rating obj.
622
+     *
623
+     * @return int An array representing the rating obj.
624
+     */
625
+    public function get_rating_for( $post_id, $force_reload = FALSE ) {
626
+
627
+        // If forced reload is required or rating is missing ..
628
+        if ( $force_reload ) {
629
+            $this->log_service->trace( "Force rating reload [ post_id :: $post_id ]" );
630
+
631
+            return $this->set_rating_for( $post_id );
632
+        }
633
+
634
+        $current_raw_score = get_post_meta( $post_id, self::RATING_RAW_SCORE_META_KEY, TRUE );
635
+
636
+        if ( ! is_numeric( $current_raw_score ) ) {
637
+            $this->log_service->trace( "Rating missing for [ post_id :: $post_id ] [ current_raw_score :: $current_raw_score ]" );
638
+
639
+            return $this->set_rating_for( $post_id );
640
+        }
641
+        $current_warnings = get_post_meta( $post_id, self::RATING_WARNINGS_META_KEY, TRUE );
642
+
643
+        // Finally return score and warnings
644
+        return array(
645
+            'raw_score'           => $current_raw_score,
646
+            'traffic_light_score' => $this->convert_raw_score_to_traffic_light( $current_raw_score ),
647
+            'percentage_score'    => $this->convert_raw_score_to_percentage( $current_raw_score ),
648
+            'warnings'            => $current_warnings,
649
+        );
650
+
651
+    }
652
+
653
+    /**
654
+     * Calculate rating for a given entity
655
+     * Rating depends from following criteria
656
+     *
657
+     * 1. Is the current entity related to at least 1 post?
658
+     * 2. Is the current entity content post not empty?
659
+     * 3. Is the current entity related to at least 1 entity?
660
+     * 4. Is the entity published?
661
+     * 5. There is a a thumbnail associated to the entity?
662
+     * 6. Has the entity a sameas defined?
663
+     * 7. Are all schema.org required metadata compiled?
664
+     *
665
+     * Each positive check means +1 in terms of rating score
666
+     *
667
+     * @since 3.3.0
668
+     *
669
+     * @param int $post_id The entity post id.
670
+     *
671
+     * @return int An array representing the rating obj.
672
+     */
673
+    public function calculate_rating_for( $post_id ) {
674
+
675
+        // If it's not an entity, return.
676
+        if ( ! $this->is_entity( $post_id ) ) {
677
+            return;
678
+        }
679
+        // Retrieve the post object
680
+        $post = get_post( $post_id );
681
+        // Rating value
682
+        $score = 0;
683
+        // Store warning messages
684
+        $warnings = array();
685
+
686
+        // Is the current entity related to at least 1 post?
687
+        ( 0 < count( wl_core_get_related_post_ids( $post->ID ) ) ) ?
688
+            $score ++ :
689
+            array_push( $warnings, __( self::RATING_WARNING_HAS_RELATED_POSTS, 'wordlift' ) );
690
+
691
+        // Is the post content not empty?
692
+        ( ! empty( $post->post_content ) ) ?
693
+            $score ++ :
694
+            array_push( $warnings, __( self::RATING_WARNING_HAS_CONTENT_POST, 'wordlift' ) );
695
+
696
+        // Is the current entity related to at least 1 entity?
697
+        // Was the current entity already disambiguated?
698
+        ( 0 < count( wl_core_get_related_entity_ids( $post->ID ) ) ) ?
699
+            $score ++ :
700
+            array_push( $warnings, __( self::RATING_WARNING_HAS_RELATED_ENTITIES, 'wordlift' ) );
701
+
702
+        // Is the entity published?
703
+        ( 'publish' === get_post_status( $post->ID ) ) ?
704
+            $score ++ :
705
+            array_push( $warnings, __( self::RATING_WARNING_IS_PUBLISHED, 'wordlift' ) );
706
+
707
+        // Has a thumbnail?
708
+        ( has_post_thumbnail( $post->ID ) ) ?
709
+            $score ++ :
710
+            array_push( $warnings, __( self::RATING_WARNING_HAS_THUMBNAIL, 'wordlift' ) );
711
+
712
+        // Get all post meta keys for the current post		
713
+        global $wpdb;
714
+        $query = $wpdb->prepare(
715
+            "SELECT DISTINCT(meta_key) FROM $wpdb->postmeta  WHERE post_id = %d", $post->ID
716
+        );
717
+
718
+        // Check intersection between available meta keys 
719
+        // and expected ones arrays to detect missing values
720
+        $available_meta_keys = $wpdb->get_col( $query );
721
+
722
+        // If each expected key is contained in available keys array ...
723
+        ( in_array( Wordlift_Schema_Service::FIELD_SAME_AS, $available_meta_keys ) ) ?
724
+            $score ++ :
725
+            array_push( $warnings, __( self::RATING_WARNING_HAS_SAME_AS, 'wordlift' ) );
726
+
727
+        $schema = wl_entity_type_taxonomy_get_type( $post_id );
728
+
729
+        $expected_meta_keys = ( NULL === $schema['custom_fields'] ) ?
730
+            array() :
731
+            array_keys( $schema['custom_fields'] );
732
+
733
+        $intersection = array_intersect( $expected_meta_keys, $available_meta_keys );
734
+        // If each expected key is contained in available keys array ...
735
+        ( count( $intersection ) === count( $expected_meta_keys ) ) ?
736
+            $score ++ :
737
+            array_push( $warnings, __( self::RATING_WARNING_HAS_COMPLETED_METADATA, 'wordlift' ) );
738
+
739
+        // Finally return score and warnings
740
+        return array(
741
+            'raw_score'           => $score,
742
+            'traffic_light_score' => $this->convert_raw_score_to_traffic_light( $score ),
743
+            'percentage_score'    => $this->convert_raw_score_to_percentage( $score ),
744
+            'warnings'            => $warnings,
745
+        );
746
+
747
+    }
748
+
749
+    /**
750
+     * Get as rating as input and convert in a traffic-light rating
751
+     *
752
+     * @since 3.3.0
753
+     *
754
+     * @param int $score The rating score for a given entity.
755
+     *
756
+     * @return string The input HTML code.
757
+     */
758
+    private function convert_raw_score_to_traffic_light( $score ) {
759
+        // RATING_MAX : $score = 3 : x 
760
+        // See http://php.net/manual/en/function.round.php
761
+        $rating = round( ( $score * 3 ) / self::get_rating_max(), 0, PHP_ROUND_HALF_UP );
762
+
763
+        // If rating is 0, return 1, otherwise return rating
764
+        return ( 0 == $rating ) ? 1 : $rating;
765
+
766
+    }
767
+
768
+    /**
769
+     * Get as rating as input and convert in a traffic-light rating
770
+     *
771
+     * @since 3.3.0
772
+     *
773
+     * @param int $score The rating score for a given entity.
774
+     *
775
+     * @return string The input HTML code.
776
+     */
777
+    public function convert_raw_score_to_percentage( $score ) {
778
+        // RATING_MAX : $score = 100 : x 
779
+        return round( ( $score * 100 ) / self::get_rating_max(), 0, PHP_ROUND_HALF_UP );
780
+    }
781
+
782
+    /**
783
+     * Get the alternative label input HTML code.
784
+     *
785
+     * @since 3.2.0
786
+     *
787
+     * @param string $value The input value.
788
+     *
789
+     * @return string The input HTML code.
790
+     */
791
+    private function get_alternative_label_input( $value = '' ) {
792
+
793
+        return sprintf( self::ALTERNATIVE_LABEL_INPUT_TEMPLATE, esc_attr( $value ), __( 'Delete', 'wordlift' ) );
794
+    }
795 795
 }
Please login to merge, or discard this patch.
Spacing   +119 added lines, -128 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 // Define the default entity type slug if it's not defined already. The entity type slug is used in permalinks.
4
-defined( 'WL_ENTITY_TYPE_SLUG' ) || define( 'WL_ENTITY_TYPE_SLUG', Wordlift_Entity_Service::TYPE_NAME );
4
+defined('WL_ENTITY_TYPE_SLUG') || define('WL_ENTITY_TYPE_SLUG', Wordlift_Entity_Service::TYPE_NAME);
5 5
 
6 6
 /**
7 7
  * Provide entity-related services.
@@ -158,9 +158,9 @@  discard block
 block discarded – undo
158 158
 	 *
159 159
 	 * @param \Wordlift_UI_Service $ui_service The UI service.
160 160
 	 */
161
-	public function __construct( $ui_service, $schema_service, $notice_service ) {
161
+	public function __construct($ui_service, $schema_service, $notice_service) {
162 162
 
163
-		$this->log_service = Wordlift_Log_Service::get_logger( 'Wordlift_Entity_Service' );
163
+		$this->log_service = Wordlift_Log_Service::get_logger('Wordlift_Entity_Service');
164 164
 
165 165
 		// Set the UI service.
166 166
 		$this->ui_service = $ui_service;
@@ -209,24 +209,24 @@  discard block
 block discarded – undo
209 209
 	public function get_all_related_to_last_50_published_posts() {
210 210
 
211 211
 		// Global timeline. Get entities from the latest posts.
212
-		$latest_posts_ids = get_posts( array(
212
+		$latest_posts_ids = get_posts(array(
213 213
 			'numberposts' => 50,
214 214
 			'fields'      => 'ids', //only get post IDs
215 215
 			'post_type'   => 'post',
216 216
 			'post_status' => 'publish'
217
-		) );
217
+		));
218 218
 
219
-		if ( empty( $latest_posts_ids ) ) {
219
+		if (empty($latest_posts_ids)) {
220 220
 			// There are no posts.
221 221
 			return array();
222 222
 		}
223 223
 
224 224
 		// Collect entities related to latest posts
225 225
 		$entity_ids = array();
226
-		foreach ( $latest_posts_ids as $id ) {
227
-			$entity_ids = array_merge( $entity_ids, wl_core_get_related_entity_ids( $id, array(
226
+		foreach ($latest_posts_ids as $id) {
227
+			$entity_ids = array_merge($entity_ids, wl_core_get_related_entity_ids($id, array(
228 228
 				'status' => 'publish'
229
-			) ) );
229
+			)));
230 230
 		}
231 231
 
232 232
 		return $entity_ids;
@@ -241,9 +241,9 @@  discard block
 block discarded – undo
241 241
 	 *
242 242
 	 * @return bool Return true if the post is an entity otherwise false.
243 243
 	 */
244
-	public function is_entity( $post_id ) {
244
+	public function is_entity($post_id) {
245 245
 
246
-		return ( self::TYPE_NAME === get_post_type( $post_id ) );
246
+		return (self::TYPE_NAME === get_post_type($post_id));
247 247
 	}
248 248
 
249 249
 	/**
@@ -255,18 +255,18 @@  discard block
 block discarded – undo
255 255
 	 *
256 256
 	 * @return string Returns an uri.
257 257
 	 */
258
-	public function get_classification_scope_for( $post_id ) {
258
+	public function get_classification_scope_for($post_id) {
259 259
 
260
-		if ( FALSE === $this->is_entity( $post_id ) ) {
260
+		if (FALSE === $this->is_entity($post_id)) {
261 261
 			return NULL;
262 262
 		}
263 263
 		// Retrieve the entity type
264
-		$entity_type_arr = wl_entity_type_taxonomy_get_type( $post_id );
265
-		$entity_type     = str_replace( 'wl-', '', $entity_type_arr['css_class'] );
264
+		$entity_type_arr = wl_entity_type_taxonomy_get_type($post_id);
265
+		$entity_type     = str_replace('wl-', '', $entity_type_arr['css_class']);
266 266
 		// Retrieve classification boxes configuration
267
-		$classification_boxes = unserialize( WL_CORE_POST_CLASSIFICATION_BOXES );
268
-		foreach ( $classification_boxes as $cb ) {
269
-			if ( in_array( $entity_type, $cb['registeredTypes'] ) ) {
267
+		$classification_boxes = unserialize(WL_CORE_POST_CLASSIFICATION_BOXES);
268
+		foreach ($classification_boxes as $cb) {
269
+			if (in_array($entity_type, $cb['registeredTypes'])) {
270 270
 				return $cb['id'];
271 271
 			}
272 272
 		}
@@ -291,23 +291,22 @@  discard block
 block discarded – undo
291 291
 	 *
292 292
 	 * @return string Returns an uri.
293 293
 	 */
294
-	public function build_uri( $title, $post_type, $schema_type = NULL, $increment_digit = 0 ) {
294
+	public function build_uri($title, $post_type, $schema_type = NULL, $increment_digit = 0) {
295 295
 
296 296
 		// Get the entity slug suffix digit
297 297
 		$suffix_digit = $increment_digit + 1;
298 298
 		// Get a sanitized uri for a given title
299
-		$entity_slug = ( 0 == $increment_digit ) ?
300
-			wl_sanitize_uri_path( $title ) :
301
-			wl_sanitize_uri_path( $title . '_' . $suffix_digit );
299
+		$entity_slug = (0 == $increment_digit) ?
300
+			wl_sanitize_uri_path($title) : wl_sanitize_uri_path($title.'_'.$suffix_digit);
302 301
 
303 302
 		// Compose a candidated uri
304
-		$new_entity_uri = sprintf( '%s/%s/%s',
303
+		$new_entity_uri = sprintf('%s/%s/%s',
305 304
 			wl_configuration_get_redlink_dataset_uri(),
306 305
 			$post_type,
307 306
 			$entity_slug
308 307
 		);
309 308
 
310
-		$this->log_service->trace( "Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]" );
309
+		$this->log_service->trace("Going to check if uri is used [ new_entity_uri :: $new_entity_uri ] [ increment_digit :: $increment_digit ]");
311 310
 
312 311
 		global $wpdb;
313 312
 		// Check if the candidated uri already is used
@@ -318,34 +317,34 @@  discard block
 block discarded – undo
318 317
 		);
319 318
 
320 319
 		// Perform the query
321
-		$post_id = $wpdb->get_var( $stmt );
320
+		$post_id = $wpdb->get_var($stmt);
322 321
 
323 322
 		// If the post does not exist, then the new uri is returned 	
324
-		if ( ! is_numeric( $post_id ) ) {
325
-			$this->log_service->trace( "Going to return uri [ new_entity_uri :: $new_entity_uri ]" );
323
+		if ( ! is_numeric($post_id)) {
324
+			$this->log_service->trace("Going to return uri [ new_entity_uri :: $new_entity_uri ]");
326 325
 
327 326
 			return $new_entity_uri;
328 327
 		}
329 328
 		// If schema_type is equal to schema org type of post x, then the new uri is returned 
330
-		$schema_post_type = wl_entity_type_taxonomy_get_type( $post_id );
329
+		$schema_post_type = wl_entity_type_taxonomy_get_type($post_id);
331 330
 
332
-		if ( $schema_type === $schema_post_type['css_class'] ) {
333
-			$this->log_service->trace( "An entity with the same title and type already exists! Return uri [ new_entity_uri :: $new_entity_uri ]" );
331
+		if ($schema_type === $schema_post_type['css_class']) {
332
+			$this->log_service->trace("An entity with the same title and type already exists! Return uri [ new_entity_uri :: $new_entity_uri ]");
334 333
 
335 334
 			return $new_entity_uri;
336 335
 		}
337 336
 
338 337
 		// Otherwise the same function is called recorsively
339
-		return $this->build_uri( $title, $post_type, $schema_type, ++ $increment_digit );
338
+		return $this->build_uri($title, $post_type, $schema_type, ++ $increment_digit);
340 339
 	}
341 340
 
342
-	public function is_used( $post_id ) {
341
+	public function is_used($post_id) {
343 342
 
344
-		if ( FALSE === $this->is_entity( $post_id ) ) {
343
+		if (FALSE === $this->is_entity($post_id)) {
345 344
 			return NULL;
346 345
 		}
347 346
 		// Retrieve the post
348
-		$entity = get_post( $post_id );
347
+		$entity = get_post($post_id);
349 348
 
350 349
 		global $wpdb;
351 350
 		// Retrieve Wordlift relation instances table name
@@ -358,9 +357,9 @@  discard block
 block discarded – undo
358 357
 		);
359 358
 
360 359
 		// Perform the query
361
-		$relation_instances = (int) $wpdb->get_var( $stmt );
360
+		$relation_instances = (int) $wpdb->get_var($stmt);
362 361
 		// If there is at least one relation instance for the current entity, then it's used
363
-		if ( 0 < $relation_instances ) {
362
+		if (0 < $relation_instances) {
364 363
 			return TRUE;
365 364
 		}
366 365
 
@@ -368,13 +367,13 @@  discard block
 block discarded – undo
368 367
 		$stmt = $wpdb->prepare(
369 368
 			"SELECT COUNT(*) FROM $wpdb->postmeta WHERE post_id != %d AND meta_value = %s",
370 369
 			$entity->ID,
371
-			wl_get_entity_uri( $entity->ID )
370
+			wl_get_entity_uri($entity->ID)
372 371
 		);
373 372
 		// Perform the query
374
-		$meta_instances = (int) $wpdb->get_var( $stmt );
373
+		$meta_instances = (int) $wpdb->get_var($stmt);
375 374
 
376 375
 		// If there is at least one meta that refers the current entity uri, then current entity is used
377
-		if ( 0 < $meta_instances ) {
376
+		if (0 < $meta_instances) {
378 377
 			return TRUE;
379 378
 		}
380 379
 
@@ -391,9 +390,9 @@  discard block
 block discarded – undo
391 390
 	 *
392 391
 	 * @return true if the uri internal to the current dataset otherwise false.
393 392
 	 */
394
-	public function is_internal_uri( $uri ) {
393
+	public function is_internal_uri($uri) {
395 394
 
396
-		return ( 0 === strrpos( $uri, wl_configuration_get_redlink_dataset_uri() ) );
395
+		return (0 === strrpos($uri, wl_configuration_get_redlink_dataset_uri()));
397 396
 	}
398 397
 
399 398
 	/**
@@ -405,10 +404,10 @@  discard block
 block discarded – undo
405 404
 	 *
406 405
 	 * @return WP_Post|null A WP_Post instance or null if not found.
407 406
 	 */
408
-	public function get_entity_post_by_uri( $uri ) {
407
+	public function get_entity_post_by_uri($uri) {
409 408
 
410 409
 		// Check if we've been provided with a value otherwise return null.
411
-		if ( empty( $uri ) ) {
410
+		if (empty($uri)) {
412 411
 			return NULL;
413 412
 		}
414 413
 
@@ -428,7 +427,7 @@  discard block
 block discarded – undo
428 427
 		// Only if the current uri is not an internal uri 
429 428
 		// entity search is performed also looking at sameAs values
430 429
 		// This solve issues like https://github.com/insideout10/wordlift-plugin/issues/237
431
-		if ( ! $this->is_internal_uri( $uri ) ) {
430
+		if ( ! $this->is_internal_uri($uri)) {
432 431
 
433 432
 			$query_args['meta_query']['relation'] = 'OR';
434 433
 			$query_args['meta_query'][]           = array(
@@ -438,13 +437,13 @@  discard block
 block discarded – undo
438 437
 			);
439 438
 		}
440 439
 
441
-		$query = new WP_Query( $query_args );
440
+		$query = new WP_Query($query_args);
442 441
 
443 442
 		// Get the matching entity posts.
444 443
 		$posts = $query->get_posts();
445 444
 
446 445
 		// Return null if no post is found.
447
-		if ( 0 === count( $posts ) ) {
446
+		if (0 === count($posts)) {
448 447
 			return NULL;
449 448
 		}
450 449
 
@@ -461,18 +460,18 @@  discard block
 block discarded – undo
461 460
 	 * @param WP_Post $post Post object.
462 461
 	 * @param bool $update Whether this is an existing post being updated or not.
463 462
 	 */
464
-	public function save_post( $post_id, $post, $update ) {
463
+	public function save_post($post_id, $post, $update) {
465 464
 
466 465
 		// If it's not an entity, return.
467
-		if ( ! $this->is_entity( $post_id ) ) {
466
+		if ( ! $this->is_entity($post_id)) {
468 467
 			return;
469 468
 		}
470 469
 
471 470
 		// Get the alt labels from the request (or empty array).
472
-		$alt_labels = isset( $_REQUEST['wl_alternative_label'] ) ? $_REQUEST['wl_alternative_label'] : array();
471
+		$alt_labels = isset($_REQUEST['wl_alternative_label']) ? $_REQUEST['wl_alternative_label'] : array();
473 472
 
474 473
 		// Set the alternative labels.
475
-		$this->set_alternative_labels( $post_id, $alt_labels );
474
+		$this->set_alternative_labels($post_id, $alt_labels);
476 475
 
477 476
 	}
478 477
 
@@ -484,22 +483,22 @@  discard block
 block discarded – undo
484 483
 	 * @param int $post_id The post id.
485 484
 	 * @param array $alt_labels An array of labels.
486 485
 	 */
487
-	public function set_alternative_labels( $post_id, $alt_labels ) {
486
+	public function set_alternative_labels($post_id, $alt_labels) {
488 487
 
489 488
 		// Force $alt_labels to be an array
490
-		if ( ! is_array( $alt_labels ) ) {
491
-			$alt_labels = array( $alt_labels );
489
+		if ( ! is_array($alt_labels)) {
490
+			$alt_labels = array($alt_labels);
492 491
 		}
493 492
 
494
-		$this->log_service->debug( "Setting alternative labels [ post id :: $post_id ][ alt labels :: " . implode( ',', $alt_labels ) . " ]" );
493
+		$this->log_service->debug("Setting alternative labels [ post id :: $post_id ][ alt labels :: ".implode(',', $alt_labels)." ]");
495 494
 
496 495
 		// Delete all the existing alternate labels.
497
-		delete_post_meta( $post_id, self::ALTERNATIVE_LABEL_META_KEY );
496
+		delete_post_meta($post_id, self::ALTERNATIVE_LABEL_META_KEY);
498 497
 
499 498
 		// Set the alternative labels.
500
-		foreach ( $alt_labels as $alt_label ) {
501
-			if ( ! empty( $alt_label ) ) {
502
-				add_post_meta( $post_id, self::ALTERNATIVE_LABEL_META_KEY, $alt_label );
499
+		foreach ($alt_labels as $alt_label) {
500
+			if ( ! empty($alt_label)) {
501
+				add_post_meta($post_id, self::ALTERNATIVE_LABEL_META_KEY, $alt_label);
503 502
 			}
504 503
 		}
505 504
 
@@ -514,9 +513,9 @@  discard block
 block discarded – undo
514 513
 	 *
515 514
 	 * @return mixed An array  of alternative labels.
516 515
 	 */
517
-	public function get_alternative_labels( $post_id ) {
516
+	public function get_alternative_labels($post_id) {
518 517
 
519
-		return get_post_meta( $post_id, self::ALTERNATIVE_LABEL_META_KEY );
518
+		return get_post_meta($post_id, self::ALTERNATIVE_LABEL_META_KEY);
520 519
 	}
521 520
 
522 521
 	/**
@@ -526,25 +525,25 @@  discard block
 block discarded – undo
526 525
 	 *
527 526
 	 * @param WP_Post $post Post object.
528 527
 	 */
529
-	public function edit_form_before_permalink( $post ) {
528
+	public function edit_form_before_permalink($post) {
530 529
 
531 530
 		// If it's not an entity, return.
532
-		if ( ! $this->is_entity( $post->ID ) ) {
531
+		if ( ! $this->is_entity($post->ID)) {
533 532
 			return;
534 533
 		}
535 534
 
536 535
 		// Print the input template.
537
-		$this->ui_service->print_template( 'wl-tmpl-alternative-label-input', $this->get_alternative_label_input() );
536
+		$this->ui_service->print_template('wl-tmpl-alternative-label-input', $this->get_alternative_label_input());
538 537
 
539 538
 		// Print all the currently set alternative labels.
540
-		foreach ( $this->get_alternative_labels( $post->ID ) as $alt_label ) {
539
+		foreach ($this->get_alternative_labels($post->ID) as $alt_label) {
541 540
 
542
-			echo $this->get_alternative_label_input( $alt_label );
541
+			echo $this->get_alternative_label_input($alt_label);
543 542
 
544 543
 		};
545 544
 
546 545
 		// Print the button.
547
-		$this->ui_service->print_button( 'wl-add-alternative-labels-button', __( 'Add more titles', 'wordlift' ) );
546
+		$this->ui_service->print_button('wl-add-alternative-labels-button', __('Add more titles', 'wordlift'));
548 547
 
549 548
 	}
550 549
 
@@ -558,32 +557,32 @@  discard block
 block discarded – undo
558 557
 	public function in_admin_header() {
559 558
 
560 559
 		// Return safely if get_current_screen() is not defined (yet)
561
-		if ( FALSE === function_exists( 'get_current_screen' ) ) {
560
+		if (FALSE === function_exists('get_current_screen')) {
562 561
 			return;
563 562
 		}
564 563
 
565 564
 		$screen = get_current_screen();
566 565
 		// If there is any valid screen nothing to do
567
-		if ( NULL === $screen ) {
566
+		if (NULL === $screen) {
568 567
 			return $clauses;
569 568
 		}
570 569
 
571 570
 		// If you're not in the entity post edit page, return.
572
-		if ( self::TYPE_NAME !== $screen->id ) {
571
+		if (self::TYPE_NAME !== $screen->id) {
573 572
 			return;
574 573
 		}
575 574
 		// Retrieve the current global post
576 575
 		global $post;
577 576
 		// If it's not an entity, return.
578
-		if ( ! $this->is_entity( $post->ID ) ) {
577
+		if ( ! $this->is_entity($post->ID)) {
579 578
 			return;
580 579
 		}
581 580
 		// Retrieve an updated rating for the current entity
582
-		$rating = $this->get_rating_for( $post->ID, TRUE );
581
+		$rating = $this->get_rating_for($post->ID, TRUE);
583 582
 		// If there is at least 1 warning
584
-		if ( isset( $rating['warnings'] ) && 0 < count( $rating['warnings'] ) ) {
583
+		if (isset($rating['warnings']) && 0 < count($rating['warnings'])) {
585 584
 			// TODO - Pass Wordlift_Notice_Service trough the service constructor 
586
-			$this->notice_service->add_suggestion( $rating['warnings'] );
585
+			$this->notice_service->add_suggestion($rating['warnings']);
587 586
 		}
588 587
 
589 588
 	}
@@ -597,19 +596,19 @@  discard block
 block discarded – undo
597 596
 	 *
598 597
 	 * @return int An array representing the rating obj.
599 598
 	 */
600
-	public function set_rating_for( $post_id ) {
599
+	public function set_rating_for($post_id) {
601 600
 
602 601
 		// Calculate rating for the given post
603
-		$rating = $this->calculate_rating_for( $post_id );
602
+		$rating = $this->calculate_rating_for($post_id);
604 603
 		// Store the rating on db as post meta
605 604
 		// Please notice that RATING_RAW_SCORE_META_KEY 
606 605
 		// is saved on a different meta to allow score sorting
607 606
 		// Both meta are managed as unique
608 607
 		// https://codex.wordpress.org/Function_Reference/update_post_meta
609
-		update_post_meta( $post_id, self::RATING_RAW_SCORE_META_KEY, $rating['raw_score'] );
610
-		update_post_meta( $post_id, self::RATING_WARNINGS_META_KEY, $rating['warnings'] );
608
+		update_post_meta($post_id, self::RATING_RAW_SCORE_META_KEY, $rating['raw_score']);
609
+		update_post_meta($post_id, self::RATING_WARNINGS_META_KEY, $rating['warnings']);
611 610
 
612
-		$this->log_service->trace( sprintf( "Rating set for [ post_id :: $post_id ] [ rating :: %s ]", $rating['raw_score'] ) );
611
+		$this->log_service->trace(sprintf("Rating set for [ post_id :: $post_id ] [ rating :: %s ]", $rating['raw_score']));
613 612
 
614 613
 		// Finally returns the rating 
615 614
 		return $rating;
@@ -625,29 +624,29 @@  discard block
 block discarded – undo
625 624
 	 *
626 625
 	 * @return int An array representing the rating obj.
627 626
 	 */
628
-	public function get_rating_for( $post_id, $force_reload = FALSE ) {
627
+	public function get_rating_for($post_id, $force_reload = FALSE) {
629 628
 
630 629
 		// If forced reload is required or rating is missing ..
631
-		if ( $force_reload ) {
632
-			$this->log_service->trace( "Force rating reload [ post_id :: $post_id ]" );
630
+		if ($force_reload) {
631
+			$this->log_service->trace("Force rating reload [ post_id :: $post_id ]");
633 632
 
634
-			return $this->set_rating_for( $post_id );
633
+			return $this->set_rating_for($post_id);
635 634
 		}
636 635
 
637
-		$current_raw_score = get_post_meta( $post_id, self::RATING_RAW_SCORE_META_KEY, TRUE );
636
+		$current_raw_score = get_post_meta($post_id, self::RATING_RAW_SCORE_META_KEY, TRUE);
638 637
 
639
-		if ( ! is_numeric( $current_raw_score ) ) {
640
-			$this->log_service->trace( "Rating missing for [ post_id :: $post_id ] [ current_raw_score :: $current_raw_score ]" );
638
+		if ( ! is_numeric($current_raw_score)) {
639
+			$this->log_service->trace("Rating missing for [ post_id :: $post_id ] [ current_raw_score :: $current_raw_score ]");
641 640
 
642
-			return $this->set_rating_for( $post_id );
641
+			return $this->set_rating_for($post_id);
643 642
 		}
644
-		$current_warnings = get_post_meta( $post_id, self::RATING_WARNINGS_META_KEY, TRUE );
643
+		$current_warnings = get_post_meta($post_id, self::RATING_WARNINGS_META_KEY, TRUE);
645 644
 
646 645
 		// Finally return score and warnings
647 646
 		return array(
648 647
 			'raw_score'           => $current_raw_score,
649
-			'traffic_light_score' => $this->convert_raw_score_to_traffic_light( $current_raw_score ),
650
-			'percentage_score'    => $this->convert_raw_score_to_percentage( $current_raw_score ),
648
+			'traffic_light_score' => $this->convert_raw_score_to_traffic_light($current_raw_score),
649
+			'percentage_score'    => $this->convert_raw_score_to_percentage($current_raw_score),
651 650
 			'warnings'            => $current_warnings,
652 651
 		);
653 652
 
@@ -673,44 +672,39 @@  discard block
 block discarded – undo
673 672
 	 *
674 673
 	 * @return int An array representing the rating obj.
675 674
 	 */
676
-	public function calculate_rating_for( $post_id ) {
675
+	public function calculate_rating_for($post_id) {
677 676
 
678 677
 		// If it's not an entity, return.
679
-		if ( ! $this->is_entity( $post_id ) ) {
678
+		if ( ! $this->is_entity($post_id)) {
680 679
 			return;
681 680
 		}
682 681
 		// Retrieve the post object
683
-		$post = get_post( $post_id );
682
+		$post = get_post($post_id);
684 683
 		// Rating value
685 684
 		$score = 0;
686 685
 		// Store warning messages
687 686
 		$warnings = array();
688 687
 
689 688
 		// Is the current entity related to at least 1 post?
690
-		( 0 < count( wl_core_get_related_post_ids( $post->ID ) ) ) ?
691
-			$score ++ :
692
-			array_push( $warnings, __( self::RATING_WARNING_HAS_RELATED_POSTS, 'wordlift' ) );
689
+		(0 < count(wl_core_get_related_post_ids($post->ID))) ?
690
+			$score++ : array_push($warnings, __(self::RATING_WARNING_HAS_RELATED_POSTS, 'wordlift'));
693 691
 
694 692
 		// Is the post content not empty?
695
-		( ! empty( $post->post_content ) ) ?
696
-			$score ++ :
697
-			array_push( $warnings, __( self::RATING_WARNING_HAS_CONTENT_POST, 'wordlift' ) );
693
+		( ! empty($post->post_content)) ?
694
+			$score++ : array_push($warnings, __(self::RATING_WARNING_HAS_CONTENT_POST, 'wordlift'));
698 695
 
699 696
 		// Is the current entity related to at least 1 entity?
700 697
 		// Was the current entity already disambiguated?
701
-		( 0 < count( wl_core_get_related_entity_ids( $post->ID ) ) ) ?
702
-			$score ++ :
703
-			array_push( $warnings, __( self::RATING_WARNING_HAS_RELATED_ENTITIES, 'wordlift' ) );
698
+		(0 < count(wl_core_get_related_entity_ids($post->ID))) ?
699
+			$score++ : array_push($warnings, __(self::RATING_WARNING_HAS_RELATED_ENTITIES, 'wordlift'));
704 700
 
705 701
 		// Is the entity published?
706
-		( 'publish' === get_post_status( $post->ID ) ) ?
707
-			$score ++ :
708
-			array_push( $warnings, __( self::RATING_WARNING_IS_PUBLISHED, 'wordlift' ) );
702
+		('publish' === get_post_status($post->ID)) ?
703
+			$score++ : array_push($warnings, __(self::RATING_WARNING_IS_PUBLISHED, 'wordlift'));
709 704
 
710 705
 		// Has a thumbnail?
711
-		( has_post_thumbnail( $post->ID ) ) ?
712
-			$score ++ :
713
-			array_push( $warnings, __( self::RATING_WARNING_HAS_THUMBNAIL, 'wordlift' ) );
706
+		(has_post_thumbnail($post->ID)) ?
707
+			$score++ : array_push($warnings, __(self::RATING_WARNING_HAS_THUMBNAIL, 'wordlift'));
714 708
 
715 709
 		// Get all post meta keys for the current post		
716 710
 		global $wpdb;
@@ -720,30 +714,27 @@  discard block
 block discarded – undo
720 714
 
721 715
 		// Check intersection between available meta keys 
722 716
 		// and expected ones arrays to detect missing values
723
-		$available_meta_keys = $wpdb->get_col( $query );
717
+		$available_meta_keys = $wpdb->get_col($query);
724 718
 
725 719
 		// If each expected key is contained in available keys array ...
726
-		( in_array( Wordlift_Schema_Service::FIELD_SAME_AS, $available_meta_keys ) ) ?
727
-			$score ++ :
728
-			array_push( $warnings, __( self::RATING_WARNING_HAS_SAME_AS, 'wordlift' ) );
720
+		(in_array(Wordlift_Schema_Service::FIELD_SAME_AS, $available_meta_keys)) ?
721
+			$score++ : array_push($warnings, __(self::RATING_WARNING_HAS_SAME_AS, 'wordlift'));
729 722
 
730
-		$schema = wl_entity_type_taxonomy_get_type( $post_id );
723
+		$schema = wl_entity_type_taxonomy_get_type($post_id);
731 724
 
732
-		$expected_meta_keys = ( NULL === $schema['custom_fields'] ) ?
733
-			array() :
734
-			array_keys( $schema['custom_fields'] );
725
+		$expected_meta_keys = (NULL === $schema['custom_fields']) ?
726
+			array() : array_keys($schema['custom_fields']);
735 727
 
736
-		$intersection = array_intersect( $expected_meta_keys, $available_meta_keys );
728
+		$intersection = array_intersect($expected_meta_keys, $available_meta_keys);
737 729
 		// If each expected key is contained in available keys array ...
738
-		( count( $intersection ) === count( $expected_meta_keys ) ) ?
739
-			$score ++ :
740
-			array_push( $warnings, __( self::RATING_WARNING_HAS_COMPLETED_METADATA, 'wordlift' ) );
730
+		(count($intersection) === count($expected_meta_keys)) ?
731
+			$score++ : array_push($warnings, __(self::RATING_WARNING_HAS_COMPLETED_METADATA, 'wordlift'));
741 732
 
742 733
 		// Finally return score and warnings
743 734
 		return array(
744 735
 			'raw_score'           => $score,
745
-			'traffic_light_score' => $this->convert_raw_score_to_traffic_light( $score ),
746
-			'percentage_score'    => $this->convert_raw_score_to_percentage( $score ),
736
+			'traffic_light_score' => $this->convert_raw_score_to_traffic_light($score),
737
+			'percentage_score'    => $this->convert_raw_score_to_percentage($score),
747 738
 			'warnings'            => $warnings,
748 739
 		);
749 740
 
@@ -758,13 +749,13 @@  discard block
 block discarded – undo
758 749
 	 *
759 750
 	 * @return string The input HTML code.
760 751
 	 */
761
-	private function convert_raw_score_to_traffic_light( $score ) {
752
+	private function convert_raw_score_to_traffic_light($score) {
762 753
 		// RATING_MAX : $score = 3 : x 
763 754
 		// See http://php.net/manual/en/function.round.php
764
-		$rating = round( ( $score * 3 ) / self::get_rating_max(), 0, PHP_ROUND_HALF_UP );
755
+		$rating = round(($score * 3) / self::get_rating_max(), 0, PHP_ROUND_HALF_UP);
765 756
 
766 757
 		// If rating is 0, return 1, otherwise return rating
767
-		return ( 0 == $rating ) ? 1 : $rating;
758
+		return (0 == $rating) ? 1 : $rating;
768 759
 
769 760
 	}
770 761
 
@@ -777,9 +768,9 @@  discard block
 block discarded – undo
777 768
 	 *
778 769
 	 * @return string The input HTML code.
779 770
 	 */
780
-	public function convert_raw_score_to_percentage( $score ) {
771
+	public function convert_raw_score_to_percentage($score) {
781 772
 		// RATING_MAX : $score = 100 : x 
782
-		return round( ( $score * 100 ) / self::get_rating_max(), 0, PHP_ROUND_HALF_UP );
773
+		return round(($score * 100) / self::get_rating_max(), 0, PHP_ROUND_HALF_UP);
783 774
 	}
784 775
 
785 776
 	/**
@@ -791,8 +782,8 @@  discard block
 block discarded – undo
791 782
 	 *
792 783
 	 * @return string The input HTML code.
793 784
 	 */
794
-	private function get_alternative_label_input( $value = '' ) {
785
+	private function get_alternative_label_input($value = '') {
795 786
 
796
-		return sprintf( self::ALTERNATIVE_LABEL_INPUT_TEMPLATE, esc_attr( $value ), __( 'Delete', 'wordlift' ) );
787
+		return sprintf(self::ALTERNATIVE_LABEL_INPUT_TEMPLATE, esc_attr($value), __('Delete', 'wordlift'));
797 788
 	}
798 789
 }
Please login to merge, or discard this patch.
src/admin/WL_Metabox/WL_Metabox_Field_uri.php 2 patches
Indentation   +101 added lines, -101 removed lines patch added patch discarded remove patch
@@ -3,105 +3,105 @@  discard block
 block discarded – undo
3 3
 
4 4
 class WL_Metabox_Field_uri extends WL_Metabox_Field {
5 5
 
6
-	/**
7
-	 * Only accept URIs or local entity IDs.
8
-	 * Build new entity if the user inputted a name that is not present in DB.
9
-	 */
10
-	public function sanitize_data_filter( $value ) {
11
-
12
-		if ( empty( $value ) ) {
13
-			return NULL;
14
-		}
15
-
16
-		// Check that the inserted URI, ID or name does not point to a saved entity.
17
-		if ( is_numeric( $value ) ) {
18
-			$absent_from_db = is_null( get_post( $value ) );                           // search by ID
19
-		} else {
20
-			$absent_from_db =
21
-				is_null( Wordlift_Entity_Service::get_instance()
22
-				                                ->get_entity_post_by_uri( $value ) ) &&                      // search by uri
23
-				is_null( get_page_by_title( $value, OBJECT, Wordlift_Entity_Service::TYPE_NAME ) );   // search by name
24
-		}
25
-
26
-		// Is it an URI?
27
-		$name_is_uri = strpos( $value, 'http' ) === 0;
28
-
29
-		// We create a new entity only if the entity is not present in the DB.
30
-		// In the case of an external uri, we just save the uri.
31
-		if ( $absent_from_db && ! $name_is_uri ) {
32
-
33
-			// ...we create a new entity!
34
-			$new_entity_id = wp_insert_post( array(
35
-				'post_status' => 'publish',
36
-				'post_type'   => Wordlift_Entity_Service::TYPE_NAME,
37
-				'post_title'  => $value
38
-			) );
39
-			$new_entity    = get_post( $new_entity_id );
40
-
41
-			$type = 'http://schema.org/' . ( isset( $this->expected_uri_type ) ? $this->expected_uri_type[0] : 'Thing' );
42
-
43
-			wl_set_entity_main_type( $new_entity_id, $type );
44
-
45
-			// Build uri for this entity
46
-			$new_uri = wl_build_entity_uri( $new_entity_id );
47
-			wl_set_entity_uri( $new_entity_id, $new_uri );
48
-
49
-			wl_push_entity_post_to_redlink( $new_entity );
50
-
51
-			// Update the value that will be saved as meta
52
-			$value = $new_entity_id;
53
-		}
54
-
55
-		return $value;
56
-	}
57
-
58
-	public function html_wrapper_open() {
59
-
60
-		// The containing <div> contains info on cardinality and expected types
61
-		$html = "<div class='wl-field' data-cardinality='$this->cardinality'";
62
-
63
-		if ( isset( $this->expected_uri_type ) && ! is_null( $this->expected_uri_type ) ) {
64
-
65
-			if ( is_array( $this->expected_uri_type ) ) {
66
-				$html .= " data-expected-types='" . implode( ',', $this->expected_uri_type ) . "'";
67
-			} else {
68
-				$html .= " data-expected-types='$this->expected_uri_type'";
69
-			}
70
-		}
71
-
72
-		$html .= '>';
73
-
74
-		return $html;
75
-	}
76
-
77
-	public function html_input( $default_entity_identifier ) {
78
-
79
-		if ( empty( $default_entity_identifier ) ) {
80
-			$entity = NULL;
81
-		} elseif ( is_numeric( $default_entity_identifier ) ) {
82
-			$entity = get_post( $default_entity_identifier );
83
-		} else {
84
-			// @todo: we cannot be so sure this is a URI.
85
-			// It is an URI
86
-			$entity = Wordlift_Entity_Service::get_instance()
87
-			                                 ->get_entity_post_by_uri( $default_entity_identifier );
88
-		}
89
-
90
-		if ( ! is_null( $entity ) ) {
91
-			$label = $entity->post_title;
92
-			$value = $entity->ID;
93
-		} else {
94
-			// No ID and no internal uri. Just leave as is.
95
-			$label = $default_entity_identifier;
96
-			$value = $default_entity_identifier;
97
-		}
98
-
99
-		// Write saved value in page
100
-		// The <input> tags host the meta value.
101
-		// The visible <input> has the human readable value (i.e. entity name or uri)
102
-		// and is accompained by an hidden <input> tag, passed to the server,
103
-		// that contains the raw value (i.e. the uri or entity id).
104
-		$html = <<<EOF
6
+    /**
7
+     * Only accept URIs or local entity IDs.
8
+     * Build new entity if the user inputted a name that is not present in DB.
9
+     */
10
+    public function sanitize_data_filter( $value ) {
11
+
12
+        if ( empty( $value ) ) {
13
+            return NULL;
14
+        }
15
+
16
+        // Check that the inserted URI, ID or name does not point to a saved entity.
17
+        if ( is_numeric( $value ) ) {
18
+            $absent_from_db = is_null( get_post( $value ) );                           // search by ID
19
+        } else {
20
+            $absent_from_db =
21
+                is_null( Wordlift_Entity_Service::get_instance()
22
+                                                ->get_entity_post_by_uri( $value ) ) &&                      // search by uri
23
+                is_null( get_page_by_title( $value, OBJECT, Wordlift_Entity_Service::TYPE_NAME ) );   // search by name
24
+        }
25
+
26
+        // Is it an URI?
27
+        $name_is_uri = strpos( $value, 'http' ) === 0;
28
+
29
+        // We create a new entity only if the entity is not present in the DB.
30
+        // In the case of an external uri, we just save the uri.
31
+        if ( $absent_from_db && ! $name_is_uri ) {
32
+
33
+            // ...we create a new entity!
34
+            $new_entity_id = wp_insert_post( array(
35
+                'post_status' => 'publish',
36
+                'post_type'   => Wordlift_Entity_Service::TYPE_NAME,
37
+                'post_title'  => $value
38
+            ) );
39
+            $new_entity    = get_post( $new_entity_id );
40
+
41
+            $type = 'http://schema.org/' . ( isset( $this->expected_uri_type ) ? $this->expected_uri_type[0] : 'Thing' );
42
+
43
+            wl_set_entity_main_type( $new_entity_id, $type );
44
+
45
+            // Build uri for this entity
46
+            $new_uri = wl_build_entity_uri( $new_entity_id );
47
+            wl_set_entity_uri( $new_entity_id, $new_uri );
48
+
49
+            wl_push_entity_post_to_redlink( $new_entity );
50
+
51
+            // Update the value that will be saved as meta
52
+            $value = $new_entity_id;
53
+        }
54
+
55
+        return $value;
56
+    }
57
+
58
+    public function html_wrapper_open() {
59
+
60
+        // The containing <div> contains info on cardinality and expected types
61
+        $html = "<div class='wl-field' data-cardinality='$this->cardinality'";
62
+
63
+        if ( isset( $this->expected_uri_type ) && ! is_null( $this->expected_uri_type ) ) {
64
+
65
+            if ( is_array( $this->expected_uri_type ) ) {
66
+                $html .= " data-expected-types='" . implode( ',', $this->expected_uri_type ) . "'";
67
+            } else {
68
+                $html .= " data-expected-types='$this->expected_uri_type'";
69
+            }
70
+        }
71
+
72
+        $html .= '>';
73
+
74
+        return $html;
75
+    }
76
+
77
+    public function html_input( $default_entity_identifier ) {
78
+
79
+        if ( empty( $default_entity_identifier ) ) {
80
+            $entity = NULL;
81
+        } elseif ( is_numeric( $default_entity_identifier ) ) {
82
+            $entity = get_post( $default_entity_identifier );
83
+        } else {
84
+            // @todo: we cannot be so sure this is a URI.
85
+            // It is an URI
86
+            $entity = Wordlift_Entity_Service::get_instance()
87
+                                                ->get_entity_post_by_uri( $default_entity_identifier );
88
+        }
89
+
90
+        if ( ! is_null( $entity ) ) {
91
+            $label = $entity->post_title;
92
+            $value = $entity->ID;
93
+        } else {
94
+            // No ID and no internal uri. Just leave as is.
95
+            $label = $default_entity_identifier;
96
+            $value = $default_entity_identifier;
97
+        }
98
+
99
+        // Write saved value in page
100
+        // The <input> tags host the meta value.
101
+        // The visible <input> has the human readable value (i.e. entity name or uri)
102
+        // and is accompained by an hidden <input> tag, passed to the server,
103
+        // that contains the raw value (i.e. the uri or entity id).
104
+        $html = <<<EOF
105 105
 			<div class="wl-input-wrapper wl-autocomplete-wrapper">
106 106
 				<input type="text" class="$this->meta_name wl-autocomplete" value="$label" style="width:88%" />
107 107
 				<input type="hidden" class="$this->meta_name" name="wl_metaboxes[$this->meta_name][]" value="$value" />
@@ -110,7 +110,7 @@  discard block
 block discarded – undo
110 110
 			</div>		
111 111
 EOF;
112 112
 
113
-		return $html;
114
-	}
113
+        return $html;
114
+    }
115 115
 }
116 116
 
Please login to merge, or discard this patch.
Spacing   +26 added lines, -26 removed lines patch added patch discarded remove patch
@@ -7,46 +7,46 @@  discard block
 block discarded – undo
7 7
 	 * Only accept URIs or local entity IDs.
8 8
 	 * Build new entity if the user inputted a name that is not present in DB.
9 9
 	 */
10
-	public function sanitize_data_filter( $value ) {
10
+	public function sanitize_data_filter($value) {
11 11
 
12
-		if ( empty( $value ) ) {
12
+		if (empty($value)) {
13 13
 			return NULL;
14 14
 		}
15 15
 
16 16
 		// Check that the inserted URI, ID or name does not point to a saved entity.
17
-		if ( is_numeric( $value ) ) {
18
-			$absent_from_db = is_null( get_post( $value ) );                           // search by ID
17
+		if (is_numeric($value)) {
18
+			$absent_from_db = is_null(get_post($value)); // search by ID
19 19
 		} else {
20 20
 			$absent_from_db =
21
-				is_null( Wordlift_Entity_Service::get_instance()
22
-				                                ->get_entity_post_by_uri( $value ) ) &&                      // search by uri
23
-				is_null( get_page_by_title( $value, OBJECT, Wordlift_Entity_Service::TYPE_NAME ) );   // search by name
21
+				is_null(Wordlift_Entity_Service::get_instance()
22
+				                                ->get_entity_post_by_uri($value)) && // search by uri
23
+				is_null(get_page_by_title($value, OBJECT, Wordlift_Entity_Service::TYPE_NAME)); // search by name
24 24
 		}
25 25
 
26 26
 		// Is it an URI?
27
-		$name_is_uri = strpos( $value, 'http' ) === 0;
27
+		$name_is_uri = strpos($value, 'http') === 0;
28 28
 
29 29
 		// We create a new entity only if the entity is not present in the DB.
30 30
 		// In the case of an external uri, we just save the uri.
31
-		if ( $absent_from_db && ! $name_is_uri ) {
31
+		if ($absent_from_db && ! $name_is_uri) {
32 32
 
33 33
 			// ...we create a new entity!
34
-			$new_entity_id = wp_insert_post( array(
34
+			$new_entity_id = wp_insert_post(array(
35 35
 				'post_status' => 'publish',
36 36
 				'post_type'   => Wordlift_Entity_Service::TYPE_NAME,
37 37
 				'post_title'  => $value
38
-			) );
39
-			$new_entity    = get_post( $new_entity_id );
38
+			));
39
+			$new_entity = get_post($new_entity_id);
40 40
 
41
-			$type = 'http://schema.org/' . ( isset( $this->expected_uri_type ) ? $this->expected_uri_type[0] : 'Thing' );
41
+			$type = 'http://schema.org/'.(isset($this->expected_uri_type) ? $this->expected_uri_type[0] : 'Thing');
42 42
 
43
-			wl_set_entity_main_type( $new_entity_id, $type );
43
+			wl_set_entity_main_type($new_entity_id, $type);
44 44
 
45 45
 			// Build uri for this entity
46
-			$new_uri = wl_build_entity_uri( $new_entity_id );
47
-			wl_set_entity_uri( $new_entity_id, $new_uri );
46
+			$new_uri = wl_build_entity_uri($new_entity_id);
47
+			wl_set_entity_uri($new_entity_id, $new_uri);
48 48
 
49
-			wl_push_entity_post_to_redlink( $new_entity );
49
+			wl_push_entity_post_to_redlink($new_entity);
50 50
 
51 51
 			// Update the value that will be saved as meta
52 52
 			$value = $new_entity_id;
@@ -60,10 +60,10 @@  discard block
 block discarded – undo
60 60
 		// The containing <div> contains info on cardinality and expected types
61 61
 		$html = "<div class='wl-field' data-cardinality='$this->cardinality'";
62 62
 
63
-		if ( isset( $this->expected_uri_type ) && ! is_null( $this->expected_uri_type ) ) {
63
+		if (isset($this->expected_uri_type) && ! is_null($this->expected_uri_type)) {
64 64
 
65
-			if ( is_array( $this->expected_uri_type ) ) {
66
-				$html .= " data-expected-types='" . implode( ',', $this->expected_uri_type ) . "'";
65
+			if (is_array($this->expected_uri_type)) {
66
+				$html .= " data-expected-types='".implode(',', $this->expected_uri_type)."'";
67 67
 			} else {
68 68
 				$html .= " data-expected-types='$this->expected_uri_type'";
69 69
 			}
@@ -74,20 +74,20 @@  discard block
 block discarded – undo
74 74
 		return $html;
75 75
 	}
76 76
 
77
-	public function html_input( $default_entity_identifier ) {
77
+	public function html_input($default_entity_identifier) {
78 78
 
79
-		if ( empty( $default_entity_identifier ) ) {
79
+		if (empty($default_entity_identifier)) {
80 80
 			$entity = NULL;
81
-		} elseif ( is_numeric( $default_entity_identifier ) ) {
82
-			$entity = get_post( $default_entity_identifier );
81
+		} elseif (is_numeric($default_entity_identifier)) {
82
+			$entity = get_post($default_entity_identifier);
83 83
 		} else {
84 84
 			// @todo: we cannot be so sure this is a URI.
85 85
 			// It is an URI
86 86
 			$entity = Wordlift_Entity_Service::get_instance()
87
-			                                 ->get_entity_post_by_uri( $default_entity_identifier );
87
+			                                 ->get_entity_post_by_uri($default_entity_identifier);
88 88
 		}
89 89
 
90
-		if ( ! is_null( $entity ) ) {
90
+		if ( ! is_null($entity)) {
91 91
 			$label = $entity->post_title;
92 92
 			$value = $entity->ID;
93 93
 		} else {
Please login to merge, or discard this patch.