Completed
Push — develop ( 4bf684...d992ea )
by David
03:29
created

Wordlift_Sample_Data_Service::create()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 50
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 15
nc 3
nop 0
dl 0
loc 50
rs 9.3333
c 0
b 0
f 0
1
<?php
2
/**
3
 * Services: Sample Data Service.
4
 *
5
 * The Sample Data Service preloads contents on the WordPress web site in order
6
 * to showcase and test WordLift's general features.
7
 *
8
 * @since   3.12.0
9
 * @package Wordlift
10
 */
11
12
/**
13
 * Define the {@link Wordlift_Sample_Data_Service} class.
14
 *
15
 * @since   3.12.0
16
 * @package Wordlift
17
 */
18
class Wordlift_Sample_Data_Service {
19
20
	/**
21
	 * An array of sample data.
22
	 *
23
	 * @since 3.12.0
24
	 * @var array $samples An array of sample data.
25
	 */
26
	private $samples = array(
27
		array(
28
			'post'            => array(
29
				'post_name'    => 'praesent_imperdiet_odio_sed_lectus_vulputate_finibus',
30
				'post_title'   => 'Praesent imperdiet odio sed lectus vulputate finibus',
31
				'post_content' => 'Praesent imperdiet odio sed lectus vulputate finibus. Donec placerat ex arcu, eget fermentum metus ullamcorper vitae. Cras interdum libero a tellus sagittis, sed ultricies sapien tincidunt. Aliquam sit amet vehicula sem. Mauris neque nisl, pellentesque ut molestie id, laoreet nec tortor. Sed tempus ornare est, nec dapibus enim ornare eu. Cras risus ligula, blandit ut faucibus ut, vulputate id ipsum. In vel purus at orci hendrerit cursus. Aliquam interdum lorem id dui maximus volutpat. Vestibulum mi velit, efficitur nec neque eu, posuere porta risus.',
32
				'post_type'    => 'entity',
33
				'post_status'  => 'publish',
34
			),
35
			'entity_type_uri' => 'http://schema.org/Event',
36
		),
37
		array(
38
			'post'            => array(
39
				'post_name'    => 'nullam_tempor_lectus_sit_amet_tincidunt_euismod',
40
				'post_title'   => 'Nullam tempor lectus sit amet tincidunt euismod',
41
				'post_content' => 'Nullam tempor lectus sit amet tincidunt euismod. Nunc posuere libero augue, eu pretium erat interdum id. Vivamus aliquam dui in mauris tempor, vitae vestibulum odio aliquet. Proin quis bibendum diam, nec tempus dui. Pellentesque sit amet justo vitae urna ornare volutpat quis consectetur nisl. Sed hendrerit purus et magna varius, sodales tincidunt velit finibus. Donec malesuada faucibus mattis. Morbi viverra sagittis justo nec luctus. Nullam et justo sed nisi fringilla rutrum sit amet a urna. Integer elementum, risus in condimentum rhoncus, nisi velit cursus tellus, sed sagittis ante tellus hendrerit ante. Donec et semper libero, vitae imperdiet ligula. Donec eleifend iaculis nisi sed mollis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin faucibus magna ac lectus tempor iaculis quis in nisi. Mauris ac nibh lacinia, ultrices erat quis, rhoncus lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.',
42
				'post_type'    => 'entity',
43
				'post_status'  => 'publish',
44
			),
45
			'entity_type_uri' => 'http://schema.org/Place',
46
		),
47
		array(
48
			'post'            => array(
49
				'post_name'    => 'praesent_luctus_tincidunt_odio_quis_aliquam',
50
				'post_title'   => 'Praesent luctus tincidunt odio quis aliquam',
51
				'post_content' => 'Praesent luctus tincidunt odio quis aliquam. Ut pellentesque odio nec turpis placerat, at rhoncus mauris elementum. Proin vehicula lectus a dolor bibendum, ut pretium lacus volutpat. Integer luctus enim sed odio dapibus tempus. Fusce elementum purus in diam dictum, sit amet ultricies leo molestie. Etiam id nunc tincidunt sapien tristique interdum ac at purus. Nulla eget laoreet turpis. Nullam id cursus nulla.',
52
				'post_type'    => 'entity',
53
				'post_status'  => 'publish',
54
			),
55
			'entity_type_uri' => 'http://schema.org/Organization',
56
		),
57
		array(
58
			'post'            => array(
59
				'post_name'    => 'lorem_ipsum_dolor_sit_amet__consectetur_adipiscing_elit',
60
				'post_title'   => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
61
				'post_content' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',
62
				'post_type'    => 'entity',
63
				'post_status'  => 'publish',
64
			),
65
			'entity_type_uri' => 'http://schema.org/CreativeWork',
66
		),
67
		array(
68
			'post' =>
69
				array(
70
					'post_name'    => 'post_1',
71
					'post_title'   => 'Praesent imperdiet odio sed lectus vulputate finibus',
72
					'post_content' => '<span><span id="urn:enhancement-da554278-9522-2d83-76ad-8129d2292cb3" class="textannotation disambiguated wl-event" itemid="{dataset-uri}/entity/praesent_imperdiet_odio_sed_lectus_vulputate_finibus">Praesent imperdiet odio sed lectus vulputate finibus</span>. Donec placerat ex arcu, eget fermentum metus ullamcorper vitae. Cras interdum libero a tellus sagittis, sed ultricies sapien tincidunt. Aliquam sit amet vehicula sem. Mauris neque nisl, pellentesque ut molestie id, laoreet nec tortor. Sed tempus ornare est, nec dapibus enim ornare eu. Cras risus ligula, blandit ut faucibus ut, vulputate id ipsum. In vel purus at orci hendrerit cursus. Aliquam interdum lorem id dui maximus volutpat. Vestibulum mi velit, efficitur nec neque eu, posuere porta risus.</span>',
73
					'post_type'    => 'post',
74
					'post_status'  => 'publish',
75
				),
76
		),
77
		array(
78
			'post' =>
79
				array(
80
					'post_name'    => 'post_2',
81
					'post_title'   => 'Nullam tempor lectus sit amet tincidunt euismod',
82
					'post_content' => '<span><span id="urn:local-text-annotation-p8i5o4279ex3rsbwqkrx9z5mh1ox91ae" class="textannotation disambiguated wl-place" itemid="{dataset-uri}/entity/nullam_tempor_lectus_sit_amet_tincidunt_euismod">Nullam tempor lectus sit amet tincidunt euismod</span>. Nunc posuere libero augue, eu pretium erat interdum id. Vivamus aliquam dui in mauris tempor, vitae vestibulum odio aliquet. Proin quis bibendum diam, nec tempus dui. Pellentesque sit amet justo vitae urna ornare volutpat quis consectetur nisl. Sed hendrerit purus et magna varius, sodales tincidunt velit finibus. Donec malesuada faucibus mattis. Morbi viverra sagittis justo nec luctus. Nullam et justo sed nisi fringilla rutrum sit amet a urna. Integer elementum, risus in condimentum rhoncus, nisi velit cursus tellus, sed sagittis ante tellus hendrerit ante. Donec et semper libero, vitae imperdiet ligula. Donec eleifend iaculis nisi sed mollis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin faucibus magna ac lectus tempor iaculis quis in nisi. Mauris ac nibh lacinia, ultrices erat quis, rhoncus lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</span>',
83
					'post_type'    => 'post',
84
					'post_status'  => 'publish',
85
				),
86
		),
87
		array(
88
			'post' =>
89
				array(
90
					'post_name'    => 'post_3',
91
					'post_title'   => 'Praesent luctus tincidunt odio quis aliquam',
92
					'post_content' => '<span><span id="urn:enhancement-b3487a20-4696-b6d9-6c55-842445f5c263" class="textannotation disambiguated wl-organization" itemid="{dataset-uri}/entity/praesent_luctus_tincidunt_odio_quis_aliquam">Praesent luctus tincidunt odio quis aliquam</span>. Ut pellentesque odio nec turpis placerat, at rhoncus mauris elementum. Proin vehicula lectus a dolor bibendum, ut pretium lacus volutpat. Integer luctus enim sed odio dapibus tempus. Fusce elementum purus in diam dictum, sit amet ultricies leo molestie. Etiam id nunc tincidunt sapien tristique interdum ac at purus. Nulla eget laoreet turpis. Nullam id cursus nulla.</span>',
93
					'post_type'    => 'post',
94
					'post_status'  => 'publish',
95
				),
96
		),
97
		array(
98
			'post' =>
99
				array(
100
					'post_name'    => 'post_4',
101
					'post_title'   => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
102
					'post_content' => '<span><span id="urn:enhancement-4edc3bde-d275-22f9-8d50-0b707596b292" class="textannotation disambiguated wl-thing" itemid="{dataset-uri}/entity/lorem_ipsum_dolor_sit_amet__consectetur_adipiscing_elit">Lorem ipsum dolor sit amet, consectetur adipiscing elit</span>. Proin rutrum ultrices nulla ut elementum. Nunc nec lacus tortor. Curabitur bibendum imperdiet luctus. Vivamus a faucibus dolor. Donec blandit malesuada risus. Vestibulum volutpat ut tellus sed tincidunt. Sed id tincidunt velit. Integer sed felis id libero fringilla molestie vitae id orci. Ut vel purus ullamcorper, feugiat tortor non, iaculis neque. Vivamus vitae vehicula sem. Mauris fermentum, metus id vestibulum sodales, lorem lacus efficitur ante, non vestibulum ligula ligula a turpis. Vivamus quis scelerisque massa.</span>',
103
					'post_type'    => 'post',
104
					'post_status'  => 'publish',
105
				),
106
		),
107
		array(
108
			'post' => array(
109
				'post_name'    => 'post_5',
110
				'post_title'   => 'Lorem ipsum',
111
				'post_content' => "
112
					<span id=\"urn:enhancement-28cb4112-64cf-bd49-ef97-a2ee54727de7\" class=\"textannotation disambiguated wl-thing\" itemid=\"{dataset-uri}/entity/lorem_ipsum_dolor_sit_amet__consectetur_adipiscing_elit\">Lorem ipsum</span> dolor sit amet, consectetur adipiscing elit. Proin rutrum ultrices nulla ut elementum. Nunc nec lacus tortor. Curabitur bibendum imperdiet luctus. Vivamus a faucibus dolor. Donec blandit malesuada risus. Vestibulum volutpat ut tellus sed tincidunt. Sed id tincidunt velit. Integer sed felis id libero fringilla molestie vitae id orci. Ut vel purus ullamcorper, feugiat tortor non, iaculis neque. Vivamus vitae vehicula sem. Mauris fermentum, metus id vestibulum sodales, lorem lacus efficitur ante, non vestibulum ligula ligula a turpis. Vivamus quis scelerisque massa.
113
					
114
					[wl_navigator]
115
					
116
					<span id=\"urn:local-text-annotation-p4pre3y4tccnq00prifn6lzkowgcw6ip\" class=\"textannotation disambiguated wl-organization\" itemid=\"{dataset-uri}/entity/praesent_luctus_tincidunt_odio_quis_aliquam\">Praesent luctus tincidunt odio quis aliquam</span>. Ut pellentesque odio nec turpis placerat, at rhoncus mauris elementum. Proin vehicula lectus a dolor bibendum, ut pretium lacus volutpat. Integer luctus enim sed odio dapibus tempus. Fusce elementum purus in diam dictum, sit amet ultricies leo molestie. Etiam id nunc tincidunt sapien tristique interdum ac at purus. Nulla eget laoreet turpis. Nullam id cursus nulla.
117
					
118
					[wl_navigator]
119
					
120
					<span id=\"urn:local-text-annotation-th789do93h8xdgz7zquk7c6qxy4kx0jk\" class=\"textannotation disambiguated wl-place\" itemid=\"{dataset-uri}/entity/nullam_tempor_lectus_sit_amet_tincidunt_euismod\">Nullam tempor lectus sit amet tincidunt euismod</span>. Nunc posuere libero augue, eu pretium erat interdum id. Vivamus aliquam dui in mauris tempor, vitae vestibulum odio aliquet. Proin quis bibendum diam, nec tempus dui. Pellentesque sit amet justo vitae urna ornare volutpat quis consectetur nisl. Sed hendrerit purus et magna varius, sodales tincidunt velit finibus. Donec malesuada faucibus mattis. Morbi viverra sagittis justo nec luctus. Nullam et justo sed nisi fringilla rutrum sit amet a urna. Integer elementum, risus in condimentum rhoncus, nisi velit cursus tellus, sed sagittis ante tellus hendrerit ante. Donec et semper libero, vitae imperdiet ligula. Donec eleifend iaculis nisi sed mollis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin faucibus magna ac lectus tempor iaculis quis in nisi. Mauris ac nibh lacinia, ultrices erat quis, rhoncus lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
121
					
122
					[wl_navigator]\
123
					
124
					<span id=\"urn:local-text-annotation-v0kqdtx685n6cg9jrfvl67amkhm28hxh\" class=\"textannotation disambiguated wl-event\" itemid=\"{dataset-uri}/entity/praesent_imperdiet_odio_sed_lectus_vulputate_finibus\">Praesent imperdiet odio sed lectus vulputate finibus</span>. Donec placerat ex arcu, eget fermentum metus ullamcorper vitae. Cras interdum libero a tellus sagittis, sed ultricies sapien tincidunt. Aliquam sit amet vehicula sem. Mauris neque nisl, pellentesque ut molestie id, laoreet nec tortor. Sed tempus ornare est, nec dapibus enim ornare eu. Cras risus ligula, blandit ut faucibus ut, vulputate id ipsum. In vel purus at orci hendrerit cursus. Aliquam interdum lorem id dui maximus volutpat. Vestibulum mi velit, efficitur nec neque eu, posuere porta risus.
125
					",
126
				'post_type'    => 'post',
127
				'post_status'  => 'publish',
128
			),
129
		),
130
	);
131
132
	/**
133
	 * The {@link Wordlift_Entity_Type_Service} instance.
134
	 *
135
	 * @since  3.12.0
136
	 * @access private
137
	 * @var \Wordlift_Entity_Type_Service $entity_type_service The {@link Wordlift_Entity_Type_Service} instance.
138
	 */
139
	private $entity_type_service;
140
141
	/**
142
	 * The {@link Wordlift_Configuration_Service} instance.
143
	 *
144
	 * @since  3.12.0
145
	 * @access private
146
	 * @var \Wordlift_Configuration_Service $configuration_service The {@link Wordlift_Configuration_Service} instance.
147
	 */
148
	private $configuration_service;
149
150
	/**
151
	 * The {@link Wordlift_User_Service} instance.
152
	 *
153
	 * @since  3.16.0
154
	 * @access private
155
	 * @var \Wordlift_User_Service $user_service The {@link Wordlift_User_Service} instance.
156
	 */
157
	private $user_service;
158
159
	/**
160
	 * Create a {@link Wordlift_Sample_Data_Service} instance.
161
	 *
162
	 * @since 3.12.0
163
	 *
164
	 * @param \Wordlift_Entity_Type_Service   $entity_type_service   The {@link Wordlift_Entity_Type_Service} instance.
165
	 * @param \Wordlift_Configuration_Service $configuration_service The {@link Wordlift_Configuration_Service} instance.
166
	 * @param \Wordlift_User_Service          $user_service          The {@link Wordlift_User_Service} instance.
167
	 */
168
	function __construct( $entity_type_service, $configuration_service, $user_service ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
169
170
		$this->entity_type_service   = $entity_type_service;
171
		$this->configuration_service = $configuration_service;
172
		$this->user_service          = $user_service;
173
	}
174
175
	/**
176
	 * Create sample data in this WordPress instance.
177
	 *
178
	 * @since 3.12.0
179
	 */
180
	function create() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
181
182
		// Get the source image path.
183
		$source = plugin_dir_path( dirname( __FILE__ ) ) . 'images/rome.png';
184
185
		// Create an attachment with the local file.
186
		$attachment_id = $this->create_attachment_from_local_file( $source );
187
188
		// Add a flag to signal the attachment is sample data and allow easy delete
189
		// afterwards.
190
		add_post_meta( $attachment_id, '_wl_sample_data', 1, true );
191
192
		// Get the dataset URI, used for replacements in the `post_content`.
193
		$dataset_uri = $this->configuration_service->get_dataset_uri();
194
195
		// Create the author and get its id.
196
		$author_id = $this->create_author();
197
198
		// Create 4 entities.
199
		// Create 4 posts referencing each one entity.
200
		// Create 1 post referencing all the entities.
201
		foreach ( $this->samples as $sample ) {
202
203
			// Get the post data.
204
			$post = array_replace_recursive( $sample['post'], array(
205
				'post_content' => str_replace( '{dataset-uri}', $dataset_uri, $sample['post']['post_content'] ),
206
			) );
207
208
			// Set the author.
209
			$post['post_author'] = $author_id;
210
211
			// Insert the post.
212
			$post_id = wp_insert_post( $post );
213
214
			// Add a flag to signal the post is sample data and allow easy delete
215
			// afterwards.
216
			add_post_meta( $post_id, '_wl_sample_data', 1, true );
217
218
			// Set the post thumbnail.
219
			set_post_thumbnail( $post_id, $attachment_id );
220
221
			// If the `entity_type_uri` property is set, set it on the post.
222
			if ( isset( $sample['entity_type_uri'] ) ) {
223
				$this->entity_type_service->set( $post_id, $sample['entity_type_uri'] );
224
			}
225
226
		}
227
228
229
	}
230
231
	/**
232
	 * Create an author to bind to posts.
233
	 *
234
	 * @since 3.16.0
235
	 *
236
	 * @return int The {@link WP_User}'s id.
237
	 */
238
	private function create_author() {
239
240
		$user_id   = wp_create_user( 'wl-sample-data', wp_generate_password() );
241
		$author_post_id = wp_insert_post( array(
242
			'post_type'  => 'entity',
243
			'post_title' => 'WordLift Sample Data Person',
244
		) );
245
		// Add a flag to signal the attachment is sample data and allow easy delete
246
		// afterwards.
247
		add_post_meta( $author_post_id, '_wl_sample_data', 1, true );
248
249
		$this->entity_type_service->set( $author_post_id, 'http://schema.org/Person' );
250
		$this->user_service->set_entity( $user_id, $author_post_id );
251
252
		return $user_id;
253
	}
254
255
	/**
256
	 * Remove the sample data from this WordPress instance.
257
	 *
258
	 * @since 3.12.0
259
	 */
260
	function delete() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
261
262
		$this->delete_by_type( 'post' );
263
		$this->delete_by_type( 'entity' );
264
		$this->delete_by_type( 'attachment' );
265
266
		// Get and delete the user.
267
		$user = get_user_by( 'login', 'wl-sample-data' );
268
		wp_delete_user( $user->ID );
269
270
	}
271
272
	/**
273
	 * Remove the sample data of the specified type (e.g. `post`, `entity`, `attachment`)
274
	 * from the local WordPress instance.
275
	 *
276
	 * @since 3.12.0
277
	 *
278
	 * @param string $type WordPress {@link WP_Post}'s type, e.g. `post`, `entity`, `attachment`.
279
	 */
280
	private function delete_by_type( $type ) {
281
282
		$posts = get_posts( array(
283
			'meta_key'    => '_wl_sample_data',
284
			'meta_value'  => 1,
285
			'post_status' => 'any',
286
			'post_type'   => $type,
287
		) );
288
289
		foreach ( $posts as $post ) {
290
			wp_delete_post( $post->ID, true );
291
		}
292
293
	}
294
295
	/**
296
	 * Create a WordPress' attachment using the specified file.
297
	 *
298
	 * @since 3.12.0
299
	 *
300
	 * @param string $source The source file path.
301
	 *
302
	 * @return int WordPress' attachment's id.
303
	 */
304
	private function create_attachment_from_local_file( $source ) {
305
306
		// Get the path to the upload directory.
307
		$upload_dir  = wp_upload_dir();
308
		$upload_path = $upload_dir['path'];
309
310
		// Get the destination image path.
311
		$destination = $upload_path . '/wl-sample-data.png';
312
313
		// Copy the source file to the destination.
314
		@copy( $source, $destination );
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
315
316
		return $this->create_attachment( $destination );
317
	}
318
319
	/**
320
	 * Create a WordPress attachment using the specified file in the upload folder.
321
	 *
322
	 * @see   https://codex.wordpress.org/Function_Reference/wp_insert_attachment
323
	 *
324
	 * @since 3.12.0
325
	 *
326
	 * @param string $filename The image filename.
327
	 *
328
	 * @return int The attachment id.
329
	 */
330
	private function create_attachment( $filename ) {
331
332
		// Check the type of file. We'll use this as the 'post_mime_type'.
333
		$filetype = wp_check_filetype( basename( $filename ), null );
334
335
		// Get the path to the upload directory.
336
		$wp_upload_dir = wp_upload_dir();
337
338
		// Prepare an array of post data for the attachment.
339
		$attachment = array(
340
			'guid'           => $wp_upload_dir['url'] . '/' . basename( $filename ),
341
			'post_mime_type' => $filetype['type'],
342
			'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
343
			'post_content'   => '',
344
			'post_status'    => 'inherit',
345
		);
346
347
		// Insert the attachment.
348
		$attachment_id = wp_insert_attachment( $attachment, $filename );
349
350
		// Generate the metadata for the attachment, and update the database record.
351
		$attachment_data = wp_generate_attachment_metadata( $attachment_id, $filename );
352
353
		// Update the attachment metadata.
354
		wp_update_attachment_metadata( $attachment_id, $attachment_data );
355
356
		return $attachment_id;
357
	}
358
359
}
360