Completed
Push — master ( 5db201...585add )
by David
08:20
created

Wordlift_Sample_Data_Service   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 290
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
dl 0
loc 290
rs 10
c 0
b 0
f 0
wmc 9
lcom 1
cbo 2

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
B create() 0 42 3
A delete() 0 7 1
A delete_by_type() 0 14 2
A create_attachment_from_local_file() 0 14 1
B create_attachment() 0 28 1
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_title'   => 'Praesent imperdiet odio sed lectus vulputate finibus',
71
					'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>',
72
					'post_type'    => 'post',
73
					'post_status'  => 'publish',
74
				),
75
		),
76
		array(
77
			'post' =>
78
				array(
79
					'post_title'   => 'Nullam tempor lectus sit amet tincidunt euismod',
80
					'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>',
81
					'post_type'    => 'post',
82
					'post_status'  => 'publish',
83
				),
84
		),
85
		array(
86
			'post' =>
87
				array(
88
					'post_title'   => 'Praesent luctus tincidunt odio quis aliquam',
89
					'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>',
90
					'post_type'    => 'post',
91
					'post_status'  => 'publish',
92
				),
93
		),
94
		array(
95
			'post' =>
96
				array(
97
					'post_title'   => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
98
					'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>',
99
					'post_type'    => 'post',
100
					'post_status'  => 'publish',
101
				),
102
		),
103
		array(
104
			'post' => array(
105
				'post_title'   => 'Lorem ipsum',
106
				'post_content' => "
107
					<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.
108
					
109
					[wl_navigator]
110
					
111
					<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.
112
					
113
					[wl_navigator]
114
					
115
					<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.
116
					
117
					[wl_navigator]\
118
					
119
					<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.
120
					",
121
				'post_type'    => 'post',
122
				'post_status'  => 'publish',
123
			),
124
		),
125
	);
126
127
	/**
128
	 * The {@link Wordlift_Entity_Type_Service} instance.
129
	 *
130
	 * @since  3.12.0
131
	 * @access private
132
	 * @var \Wordlift_Entity_Type_Service $entity_type_service The {@link Wordlift_Entity_Type_Service} instance.
133
	 */
134
	private $entity_type_service;
135
136
	/**
137
	 * The {@link Wordlift_Configuration_Service} instance.
138
	 *
139
	 * @since  3.12.0
140
	 * @access private
141
	 * @var \Wordlift_Configuration_Service $configuration_service The {@link Wordlift_Configuration_Service} instance.
142
	 */
143
	private $configuration_service;
144
145
	/**
146
	 * Create a {@link Wordlift_Sample_Data_Service} instance.
147
	 *
148
	 * @since 3.12.0
149
	 *
150
	 * @param \Wordlift_Entity_Type_Service   $entity_type_service   The {@link Wordlift_Entity_Type_Service} instance.
151
	 * @param \Wordlift_Configuration_Service $configuration_service The {@link Wordlift_Configuration_Service} instance.
152
	 */
153
	function __construct( $entity_type_service, $configuration_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...
154
155
		$this->entity_type_service   = $entity_type_service;
156
		$this->configuration_service = $configuration_service;
157
	}
158
159
	/**
160
	 * Create sample data in this WordPress instance.
161
	 *
162
	 * @since 3.12.0
163
	 */
164
	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...
165
166
		// Get the source image path.
167
		$source = plugin_dir_path( dirname( __FILE__ ) ) . 'images/rome.png';
168
169
		// Create an attachment with the local file.
170
		$attachment_id = $this->create_attachment_from_local_file( $source );
171
172
		// Add a flag to signal the attachment is sample data and allow easy delete
173
		// afterwards.
174
		add_post_meta( $attachment_id, '_wl_sample_data', 1, true );
175
176
		// Get the dataset URI, used for replacements in the `post_content`.
177
		$dataset_uri = $this->configuration_service->get_dataset_uri();
178
179
		// Create 4 entities.
180
		// Create 4 posts referencing each one entity.
181
		// Create 1 post referencing all the entities.
182
		foreach ( $this->samples as $sample ) {
183
184
			// Get the post data.
185
			$post = array_replace_recursive( $sample['post'], array( 'post_content' => str_replace( '{dataset-uri}', $dataset_uri, $sample['post']['post_content'] ) ) );
186
187
			// Insert the post.
188
			$post_id = wp_insert_post( $post );
189
190
			// Add a flag to signal the post is sample data and allow easy delete
191
			// afterwards.
192
			add_post_meta( $post_id, '_wl_sample_data', 1, true );
193
194
			// Set the psot thumbnail.
195
			set_post_thumbnail( $post_id, $attachment_id );
196
197
			// If the `entity_type_uri` property is set, set it on the post.
198
			if ( isset( $sample['entity_type_uri'] ) ) {
199
				$this->entity_type_service->set( $post_id, $sample['entity_type_uri'] );
200
			}
201
202
		}
203
204
205
	}
206
207
	/**
208
	 * Remove the sample data from this WordPress instance.
209
	 *
210
	 * @since 3.12.0
211
	 */
212
	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...
213
214
		$this->delete_by_type( 'post' );
215
		$this->delete_by_type( 'entity' );
216
		$this->delete_by_type( 'attachment' );
217
218
	}
219
220
	/**
221
	 * Remove the sample data of the specified type (e.g. `post`, `entity`, `attachment`)
222
	 * from the local WordPress instance.
223
	 *
224
	 * @since 3.12.0
225
	 *
226
	 * @param string $type WordPress {@link WP_Post}'s type, e.g. `post`, `entity`, `attachment`.
227
	 */
228
	private function delete_by_type( $type ) {
229
230
		$posts = get_posts( array(
231
			'meta_key'    => '_wl_sample_data',
232
			'meta_value'  => 1,
233
			'post_status' => 'any',
234
			'post_type'   => $type,
235
		) );
236
237
		foreach ( $posts as $post ) {
238
			wp_delete_post( $post->ID, true );
239
		}
240
241
	}
242
243
	/**
244
	 * Create a WordPress' attachment using the specified file.
245
	 *
246
	 * @since 3.12.0
247
	 *
248
	 * @param string $source The source file path.
249
	 *
250
	 * @return int WordPress' attachment's id.
251
	 */
252
	private function create_attachment_from_local_file( $source ) {
253
254
		// Get the path to the upload directory.
255
		$upload_dir  = wp_upload_dir();
256
		$upload_path = $upload_dir['path'];
257
258
		// Get the destination image path.
259
		$destination = $upload_path . '/wl-sample-data.png';
260
261
		// Copy the source file to the destination.
262
		@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...
263
264
		return $this->create_attachment( $destination );
265
	}
266
267
	/**
268
	 * Create a WordPress attachment using the specified file in the upload folder.
269
	 *
270
	 * @see   https://codex.wordpress.org/Function_Reference/wp_insert_attachment
271
	 *
272
	 * @since 3.12.0
273
	 *
274
	 * @param string $filename The image filename.
275
	 *
276
	 * @return int The attachment id.
277
	 */
278
	private function create_attachment( $filename ) {
279
280
		// Check the type of file. We'll use this as the 'post_mime_type'.
281
		$filetype = wp_check_filetype( basename( $filename ), null );
282
283
		// Get the path to the upload directory.
284
		$wp_upload_dir = wp_upload_dir();
285
286
		// Prepare an array of post data for the attachment.
287
		$attachment = array(
288
			'guid'           => $wp_upload_dir['url'] . '/' . basename( $filename ),
289
			'post_mime_type' => $filetype['type'],
290
			'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
291
			'post_content'   => '',
292
			'post_status'    => 'inherit',
293
		);
294
295
		// Insert the attachment.
296
		$attachment_id = wp_insert_attachment( $attachment, $filename );
297
298
		// Generate the metadata for the attachment, and update the database record.
299
		$attachment_data = wp_generate_attachment_metadata( $attachment_id, $filename );
300
301
		// Update the attachment metadata.
302
		wp_update_attachment_metadata( $attachment_id, $attachment_data );
303
304
		return $attachment_id;
305
	}
306
307
}
308