PluginProbe
Assistant – Every Day Productivity Apps / 1.5.5.1
Assistant – Every Day Productivity Apps v1.5.5.1
1.5.5.1 1.5.5 trunk 0.1.0 0.2.0 0.2.1 0.2.2 0.3.0 0.3.1 0.4 0.4.1 0.4.2 0.5.0 0.5.1 0.6.0 0.7.0 0.7.0.2 0.7.0.3 0.7.0.4 0.7.0.5 0.7.0.6 0.7.0.7 0.7.0.8 0.7.0.9 0.7.1 All 72 releases
← All changes | backend/src/Controllers/Cloud/Libraries/LibraryItemPostController.php +196 -79 0.7.0.2 → 1.5.5.1 View file →
@@ -31,19 +31,13 @@
31 31 */
32 32 public function register_routes() {
33 33
34 34 $this->route(
35 - '/posts/preview_library_post/(?P<item_id>\d+)',
35 + '/posts/preview_library_post/',
36 36 [
37 37 [
38 38 'methods' => \WP_REST_Server::CREATABLE,
39 39 'callback' => [ $this, 'preview_library_post' ],
40 - 'args' => [
41 - 'item_id' => [
42 - 'required' => true,
43 - 'type' => 'number',
44 - ],
45 - ],
46 40 'permission_callback' => function () {
47 41 return current_user_can( 'edit_others_posts' );
48 42 },
49 43 ],
@@ -79,13 +73,13 @@
79 73 [
80 74 'methods' => \WP_REST_Server::CREATABLE,
81 75 'callback' => [ $this, 'sync_to_library' ],
82 76 'args' => [
83 - 'id' => [
77 + 'id' => [
84 78 'required' => true,
85 79 'type' => 'number',
86 80 ],
87 - 'item_id' => [
81 + 'item_id' => [
88 82 'required' => true,
89 83 'type' => 'number',
90 84 ],
91 85 ],
@@ -96,22 +90,31 @@
96 90 ]
97 91 );
98 92
99 93 $this->route(
100 - '/posts/import_from_library/(?P<item_id>\d+)',
94 + '/posts/import_from_library/',
101 95 [
102 96 [
103 97 'methods' => \WP_REST_Server::CREATABLE,
104 98 'callback' => [ $this, 'import_from_library' ],
99 + 'permission_callback' => function () {
100 + return current_user_can( 'edit_others_posts' );
101 + },
102 + ],
103 + ]
104 + );
105 +
106 + $this->route(
107 + '/posts/import_post_thumb_from_library/(?P<post_id>\d+)',
108 + [
109 + [
110 + 'methods' => \WP_REST_Server::CREATABLE,
111 + 'callback' => [ $this, 'import_post_thumb_from_library' ],
105 112 'args' => [
106 - 'item_id' => [
113 + 'post_id' => [
107 114 'required' => true,
108 115 'type' => 'number',
109 116 ],
110 - 'import_media' => [
111 - 'type' => 'number',
112 - 'default' => 1,
113 - ],
114 117 ],
115 118 'permission_callback' => function () {
116 119 return current_user_can( 'edit_others_posts' );
117 120 },
@@ -119,26 +122,37 @@
119 122 ]
120 123 );
121 124
122 125 $this->route(
123 - '/posts/(?P<id>\d+)/sync_from_library/(?P<item_id>\d+)',
126 + '/posts/import_post_media_from_library/(?P<post_id>\d+)',
124 127 [
125 128 [
126 129 'methods' => \WP_REST_Server::CREATABLE,
127 - 'callback' => [ $this, 'sync_from_library' ],
130 + 'callback' => [ $this, 'import_post_media_from_library' ],
128 131 'args' => [
129 - 'id' => [
132 + 'post_id' => [
130 133 'required' => true,
131 134 'type' => 'number',
132 135 ],
133 - 'item_id' => [
136 + ],
137 + 'permission_callback' => function () {
138 + return current_user_can( 'edit_others_posts' );
139 + },
140 + ],
141 + ]
142 + );
143 +
144 + $this->route(
145 + '/posts/(?P<id>\d+)/sync_from_library/',
146 + [
147 + [
148 + 'methods' => \WP_REST_Server::CREATABLE,
149 + 'callback' => [ $this, 'sync_from_library' ],
150 + 'args' => [
151 + 'id' => [
134 152 'required' => true,
135 153 'type' => 'number',
136 154 ],
137 - 'import_media' => [
138 - 'type' => 'number',
139 - 'default' => 1,
140 - ],
141 155 ],
142 156 'permission_callback' => function () {
143 157 return current_user_can( 'edit_others_posts' );
144 158 },
@@ -155,16 +169,25 @@
155 169 */
156 170 public function preview_library_post( $request ) {
157 171 global $wpdb;
158 172
159 - $item_id = $request->get_param( 'item_id' );
173 + $data = $request->get_param( 'item' );
174 + $item = $data ? json_decode( $data ) : null;
160 175
176 + if ( ! $item ) {
177 + return rest_ensure_response(
178 + [
179 + 'error' => true,
180 + ]
181 + );
182 + }
183 +
161 184 $meta = $wpdb->get_row(
162 185 $wpdb->prepare(
163 186 "SELECT * FROM $wpdb->postmeta
164 187 WHERE meta_key = '_fl_asst_preview_library_item_id'
165 188 AND meta_value = %s",
166 - $item_id
189 + $item->id
167 190 )
168 191 );
169 192
170 193 if ( $meta ) {
@@ -186,10 +209,12 @@
186 209 'post_status' => 'auto-draft',
187 210 ]
188 211 );
189 212
190 - update_post_meta( $post_id, '_fl_asst_preview_library_item_id', $item_id );
213 + update_post_meta( $post_id, '_fl_asst_preview_library_item_id', $item->id );
191 214
215 + $this->replace_attachment_urls_with_cloud_urls( $item, $post_id );
216 +
192 217 return rest_ensure_response(
193 218 [
194 219 'url' => PreviewHelper::get_post_preview_url( $post_id ),
195 220 ]
@@ -203,12 +228,12 @@
203 228 * @param object $post
204 229 * @return array
205 230 */
206 231 public function get_save_data( $request, $post ) {
207 - return [
232 + $data = [
208 233 'name' => $post->post_title,
209 234 'type' => 'post',
210 - 'data' => [
235 + 'post_data' => [
211 236 'post' => [
212 237 'comment_status' => $post->comment_status,
213 238 'menu_order' => $post->menu_order,
214 239 'ping_status' => $post->ping_status,
@@ -223,13 +248,20 @@
223 248 'terms' => $this->get_post_terms( $post ),
224 249
225 250 ],
226 251 'media' => [
227 - 'thumb' => get_attached_file( get_post_thumbnail_id( $post ) ),
228 252 'attachments' => $this->get_post_image_paths( $post ),
229 253 ],
230 254 'screenshot' => $this->get_post_screenshot( $request, $post ),
231 255 ];
256 +
257 + $thumbnail = get_attached_file( get_post_thumbnail_id( $post ) );
258 +
259 + if ($thumbnail) {
260 + $data['media']['thumb'] = $thumbnail;
261 + }
262 +
263 + return $data;
232 264 }
233 265
234 266 /**
235 267 * Saves a post to a cloud library.
@@ -242,12 +274,18 @@
242 274 $library_id = $request->get_param( 'library_id' );
243 275 $post = get_post( $id );
244 276 $client = new CloudClient;
245 277
246 - return $client->libraries->create_item(
278 + $response = $client->libraries->create_item(
247 279 $library_id,
248 280 $this->get_save_data( $request, $post )
249 281 );
282 +
283 + if (isset($response->success) && $response->success === false) {
284 + return new \WP_Error( 'API Error', $response->message, [ 'status' => 400 ] );
285 + }
286 +
287 + return $response;
250 288 }
251 289
252 290 /**
253 291 * Replaces a library post with a post on this site.
@@ -259,13 +297,20 @@
259 297 $id = $request->get_param( 'id' );
260 298 $item_id = $request->get_param( 'item_id' );
261 299 $post = get_post( $id );
262 300 $client = new CloudClient;
301 + $data = $this->get_save_data( $request, $post );
263 302
264 - return $client->libraries->update_item(
303 + $response = $client->libraries->update_item(
265 304 $item_id,
266 - $this->get_save_data( $request, $post )
305 + $data
267 306 );
307 +
308 + if (isset($response->success) && $response->success === false) {
309 + return new \WP_Error( 'API Error', $response->message, [ 'status' => 400 ] );
310 + }
311 +
312 + return $response;
268 313 }
269 314
270 315 /**
271 316 * Imports a post from a library to the site.
@@ -273,14 +318,38 @@
273 318 * @param object $request
274 319 * @return array
275 320 */
276 321 public function import_from_library( $request ) {
277 - $item_id = $request->get_param( 'item_id' );
278 - $import_media = ! ! $request->get_param( 'import_media' );
322 + $data = $request->get_param( 'item' );
323 + $item = $data ? json_decode( $data ) : null;
324 +
325 + if ( ! $item ) {
326 + return rest_ensure_response(
327 + [
328 + 'error' => true,
329 + ]
330 + );
331 + }
332 +
279 333 $client = new CloudClient;
280 - $response = $client->libraries->get_item( $item_id );
281 - $post_data = $response->data->post;
334 + $item = $client->libraries->get_item( $item->id );
282 335
336 + $registered_post_types = get_post_types();
337 +
338 + if ( ! in_array( $item->data->post->post_type, $registered_post_types ) ) {
339 + return rest_ensure_response(
340 + [
341 + 'error' => true,
342 + 'error_code' => 'post_type_not_registered',
343 + 'post_type' => $item->data->post->post_type,
344 + ]
345 + );
346 + }
347 +
348 + $post_data = $item->data->post;
349 + $meta_data = $item->data->meta;
350 + $term_data = $item->data->terms;
351 +
283 352 $new_post_id = wp_insert_post(
284 353 [
285 354 'comment_status' => $post_data->comment_status,
286 355 'menu_order' => $post_data->menu_order,
@@ -287,11 +356,11 @@
287 356 'ping_status' => $post_data->ping_status,
288 357 'post_author' => wp_get_current_user()->ID,
289 358 'post_content' => $post_data->post_content ? $post_data->post_content : '',
290 359 'post_excerpt' => $post_data->post_excerpt ? $post_data->post_excerpt : '',
291 - 'post_mime_type' => $post_data->post_mime_type,
360 + 'post_mime_type' => $post_data->post_mime_type ? $post_data->post_mime_type : '',
292 361 'post_name' => $post_data->post_name,
293 - 'post_status' => 'draft',
362 + 'post_status' => 'publish',
294 363 'post_title' => $post_data->post_title,
295 364 'post_type' => $post_data->post_type,
296 365 ]
297 366 );
@@ -303,12 +372,11 @@
303 372 ]
304 373 );
305 374 }
306 375
307 - $this->import_post_meta_from_library( $new_post_id, $response->data->meta );
308 - $this->import_post_terms_from_library( $new_post_id, $response->data->terms );
309 - $this->import_post_media_from_library( $new_post_id, $response->media, $import_media );
310 - $this->regenerate_builder_cache( $response );
376 + $this->import_post_meta_from_library( $new_post_id, $meta_data );
377 + $this->import_post_terms_from_library( $new_post_id, $term_data );
378 + $this->regenerate_builder_cache( $new_post_id, $item );
311 379
312 380 return rest_ensure_response(
313 381 $this->posts->transform(
314 382 get_post( $new_post_id )
@@ -323,17 +391,29 @@
323 391 * @return array
324 392 */
325 393 public function sync_from_library( $request ) {
326 394 $post_id = $request->get_param( 'id' );
327 - $item_id = $request->get_param( 'item_id' );
328 - $import_media = ! ! $request->get_param( 'import_media' );
395 + $data = $request->get_param( 'item' );
396 + $item = $data ? json_decode( $data ) : null;
397 +
398 + if ( ! $item ) {
399 + return rest_ensure_response(
400 + [
401 + 'error' => true,
402 + ]
403 + );
404 + }
405 +
329 406 $client = new CloudClient;
330 - $response = $client->libraries->get_item( $item_id );
407 + $item = $client->libraries->get_item( $item->id );
408 + $post_data = $item->data->post;
409 + $meta_data = $item->data->meta;
410 + $term_data = $item->data->terms;
331 411
332 412 $updated = wp_update_post(
333 413 [
334 414 'ID' => $post_id,
335 - 'post_content' => $response->data->post->post_content,
415 + 'post_content' => $post_data->post_content,
336 416 ]
337 417 );
338 418
339 419 if ( is_wp_error( $updated ) ) {
@@ -343,12 +423,11 @@
343 423 ]
344 424 );
345 425 }
346 426
347 - $this->import_post_meta_from_library( $post_id, $response->data->meta );
348 - $this->import_post_terms_from_library( $post_id, $response->data->terms );
349 - $this->import_post_media_from_library( $post_id, $response->media, $import_media );
350 - $this->regenerate_builder_cache( $response );
427 + $this->import_post_meta_from_library( $post_id, $meta_data );
428 + $this->import_post_terms_from_library( $post_id, $term_data );
429 + $this->regenerate_builder_cache( $post_id, $item );
351 430
352 431 return rest_ensure_response(
353 432 $this->posts->transform(
354 433 get_post( $post_id )
@@ -369,18 +448,26 @@
369 448 if ( ! $meta || ! is_object( $meta ) ) {
370 449 return;
371 450 }
372 451
452 + if ( isset( $meta->_fl_builder_data ) ) {
453 + $meta->_fl_builder_draft = $meta->_fl_builder_data;
454 + $meta->_fl_builder_draft_settings = $meta->_fl_builder_data_settings;
455 + }
456 +
373 457 foreach ( $meta as $meta_key => $meta_value ) {
374 458 if ( metadata_exists( 'post', $post_id, $meta_key ) ) {
375 459 delete_metadata( 'post', $post_id, $meta_key );
376 460 }
377 -
378 - foreach ( $meta_value as $value ) {
379 - $value = addslashes( $value );
380 - // @codingStandardsIgnoreStart
381 - $wpdb->query( "INSERT INTO {$wpdb->postmeta} (post_id, meta_key, meta_value) values ({$post_id}, '{$meta_key}', '{$value}')" );
382 - // @codingStandardsIgnoreEnd
461 + if ( is_array( $meta_value ) && count( $meta_value ) !== 0 ) {
462 + foreach ( $meta_value as $value ) {
463 + if ( $value !== null ) {
464 + $value = addslashes( $value );
465 + }
466 + // @codingStandardsIgnoreStart
467 + $wpdb->query( "INSERT INTO {$wpdb->postmeta} (post_id, meta_key, meta_value) values ({$post_id}, '{$meta_key}', '{$value}')" );
468 + // @codingStandardsIgnoreEnd
469 + }
383 470 }
384 471 }
385 472 }
386 473
@@ -391,8 +478,10 @@
391 478 * @param array $terms
392 479 * @return void
393 480 */
394 481 public function import_post_terms_from_library( $post_id, $terms ) {
482 + $terms = is_object( $terms ) ? [ $terms ] : $terms;
483 +
395 484 if ( ! $terms || ! is_array( $terms ) || 0 === count( $terms ) ) {
396 485 return;
397 486 }
398 487
@@ -401,9 +490,9 @@
401 490
402 491 foreach ( $terms as $term ) {
403 492 if ( ! isset( $term->name ) || ! isset( $term->taxonomy ) ) {
404 493 continue;
405 - } else if ( ! taxonomy_exists( $term->taxonomy ) ) {
494 + } elseif ( ! taxonomy_exists( $term->taxonomy ) ) {
406 495 continue;
407 496 } elseif ( ! isset( $taxonomy_terms ) ) {
408 497 $taxonomy_terms[ $term->taxonomy ] = [];
409 498 }
@@ -424,9 +513,9 @@
424 513 );
425 514 $term_id = $is_hierarchical ? $new_term['term_taxonomy_id'] : $term->name;
426 515 }
427 516
428 - $taxonomy_terms[ $term->taxonomy ] = $term_id;
517 + $taxonomy_terms[ $term->taxonomy ][] = $term_id;
429 518 }
430 519
431 520 foreach ( $taxonomy_terms as $taxonomy => $terms ) {
432 521 wp_delete_object_term_relationships( $post_id, $taxonomy );
@@ -466,40 +555,65 @@
466 555 */
467 556 public function get_post_screenshot( $request, $post ) {
468 557 $url = PreviewHelper::get_post_preview_url( $post );
469 558 $url = add_query_arg( 'fl_asst_screenshot', '1', $url );
470 - return ScreenshotHelper::get_for_request( $request, $url );
559 + return ScreenshotHelper::get_for_rest_request( $request, $url );
471 560 }
472 561
473 562 /**
474 - * Imports the media for a post.
563 + * Imports the featured image for a post.
475 564 *
476 - * @param int $post_id
477 - * @param object $media
478 - * @param bool $import
479 - * @return void
565 + * @param object $request
566 + * @return array
480 567 */
481 - public function import_post_media_from_library( $post_id, $media, $import = true ) {
568 + public function import_post_thumb_from_library( $request ) {
569 + $post_id = $request->get_param( 'post_id' );
570 + $thumb = $request->get_param( 'thumb' );
482 571 $service = new MediaLibraryService();
483 572
484 - // Import post thumbnail
485 - if ( $import && isset( $media->thumb ) && 'screenshot.png' !== $media->thumb->file_name ) {
486 - $response = $service->import_cloud_media( $media->thumb, $post_id );
573 + if ( ! preg_match( '/screenshot\.(png|jpg|gif)/', $thumb['file_name'] ) ) {
574 + $response = $service->import_cloud_media( $thumb, $post_id );
487 575 set_post_thumbnail( $post_id, $response['id'] );
488 576 }
489 577
490 - // Import post attachments
491 - if ( isset( $media->attachments ) ) {
578 + return [ 'success' => true ];
579 + }
580 +
581 + /**
582 + * Imports a media item for a post.
583 + *
584 + * @param object $request
585 + * @return array
586 + */
587 + public function import_post_media_from_library( $request ) {
588 + $post_id = $request->get_param( 'post_id' );
589 + $media = $request->get_param( 'media' );
590 + $service = new MediaLibraryService();
591 +
592 + $imported = [];
593 + $response = $service->import_cloud_media( $media, $post_id );
594 + $imported[ $media['file_name'] ] = wp_get_attachment_metadata( $response['id'] );
595 + $imported[ $media['file_name'] ]['id'] = $response['id'];
596 +
597 + $this->replace_imported_attachment_urls_in_content( $post_id, $imported );
598 + $this->replace_imported_attachment_urls_in_meta( $post_id, $imported );
599 +
600 + return [ 'success' => true ];
601 + }
602 +
603 + /**
604 + * Replace attachment urls with urls from the cloud.
605 + *
606 + * @param object $item
607 + * @param int $post_id
608 + * @return void
609 + */
610 + public function replace_attachment_urls_with_cloud_urls( $item, $post_id ) {
611 + if ( isset( $item->media->attachments ) ) {
492 612 $imported = [];
493 613
494 - foreach ( $media->attachments as $attachment ) {
495 - if ( $import ) {
496 - $response = $service->import_cloud_media( $attachment, $post_id );
497 - $imported[ $attachment->file_name ] = wp_get_attachment_metadata( $response['id'] );
498 - $imported[ $attachment->file_name ]['id'] = $response['id'];
499 - } else {
500 - $imported[ $attachment->file_name ] = $attachment;
501 - }
614 + foreach ( $item->media->attachments as $attachment ) {
615 + $imported[ $attachment->file_name ] = $attachment;
502 616 }
503 617
504 618 $this->replace_imported_attachment_urls_in_content( $post_id, $imported );
505 619 $this->replace_imported_attachment_urls_in_meta( $post_id, $imported );
@@ -575,11 +689,14 @@
575 689 *
576 690 * @param object $item
577 691 * @return void
578 692 */
579 - public function regenerate_builder_cache( $item ) {
693 + public function regenerate_builder_cache( $post_id, $item ) {
580 694 $meta = (array) $item->data->meta;
581 695
696 + if ( isset( $meta['_fl_builder_data'] ) && class_exists( '\FLBuilderModel' ) ) {
697 + \FLBuilderModel::delete_all_asset_cache( $post_id );
698 + }
582 699 if ( isset( $meta['_elementor_data'] ) && class_exists( 'Elementor\Plugin' ) ) {
583 700 \Elementor\Plugin::$instance->files_manager->clear_cache();
584 701 }
585 702 }