Completed
Push — develop ( a6c8bc...e67402 )
by David
07:37
created

Wordlift_Sample_Data_Service::delete()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

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