PluginProbe
Assistant – Every Day Productivity Apps / 0.7.0.4
Assistant – Every Day Productivity Apps v0.7.0.4
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 1.0 All 71 releases
assistant / backend / src / Controllers / PostsExportController.php

PostsExportController.php in Assistant – Every Day Productivity Apps 0.7.0.4, at backend/src/Controllers/PostsExportController.php

192 lines 5.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FL\Assistant\Controllers;
4
5 use FL\Assistant\System\Contracts\ControllerAbstract;
6 use FL\Assistant\System\View;
7 use WP_REST_Server;
8
9 /**
10 * REST API logic for exporting posts.
11 */
12 class PostsExportController extends ControllerAbstract {
13
14 protected $view;
15
16 public function __construct( View $view ) {
17 $this->view = $view;
18 }
19
20 /**
21 * Register routes.
22 */
23 public function register_routes() {
24 $this->route(
25 '/posts/(?P<id>\d+)/export',
26 [
27 [
28 'methods' => WP_REST_Server::CREATABLE,
29 'callback' => [ $this, 'export_post' ],
30 'permission_callback' => function () {
31 return current_user_can( 'export' );
32 },
33 ],
34 ]
35 );
36
37 $this->route(
38 '/posts/(?P<id>\d+)/export',
39 [
40 [
41 'methods' => WP_REST_Server::DELETABLE,
42 'callback' => [ $this, 'delete_export' ],
43 'permission_callback' => function () {
44 return current_user_can( 'export' );
45 },
46 ],
47 ]
48 );
49 }
50
51 /**
52 * Export a single post.
53 */
54 public function export_post( $request ) {
55 /* Get requested post data */
56 $post_id = absint( $request->get_param( 'id' ) );
57 $post = get_post( $post_id );
58
59 /* Create temporary file */
60 $file_url = WP_CONTENT_URL . '/' . sanitize_file_name( $post->post_title ) . '_' . $post->ID . '.xml';
61 $file = WP_CONTENT_DIR . '/' . sanitize_file_name( $post->post_title ) . '_' . $post->ID . '.xml';
62 $current = '';
63
64 if ( file_exists( $file ) ) {
65 $current = file_get_contents( $file );
66 }
67
68 /* Creates taxonomies string for xml export */
69 $taxonomies = get_taxonomies( '', 'names' );
70 $terms = wp_get_object_terms( $post->ID, $taxonomies );
71
72 $taxonomies_str = '';
73 foreach ( $terms as $term ) {
74 $taxonomies_str .= '<category domain="' . $term->taxonomy . '" nicename="' . $term->slug . '">' . $this->wxr_cdata( $term->name ) . '</category>';
75 }
76
77 /* Creates comments string */
78 $comments = get_comments( [ 'post_id' => $post->ID ] );
79
80 $comment_str = '';
81
82 foreach ( $comments as $comment ) {
83
84 $comment_str .= '<wp:comment>
85 <wp:comment_id>' . $comment->comment_ID . '</wp:comment_id>
86 <wp:comment_author>' . $this->wxr_cdata( $comment->comment_author ) . '</wp:comment_author>
87 <wp:comment_author_email>' . $this->wxr_cdata( $comment->comment_author_email ) . '</wp:comment_author_email>
88 <wp:comment_author_url></wp:comment_author_url>
89 <wp:comment_author_IP>' . $this->wxr_cdata( $comment->comment_author_ip ) . '</wp:comment_author_IP>
90 <wp:comment_date>' . $this->wxr_cdata( $comment->comment_date ) . '</wp:comment_date>
91 <wp:comment_date_gmt>' . $this->wxr_cdata( $comment->comment_date_gmt ) . '</wp:comment_date_gmt>
92 <wp:comment_content>' . $this->wxr_cdata( $comment->comment_content ) . '</wp:comment_content>
93 <wp:comment_approved>' . $this->wxr_cdata( $comment->comment_approved ) . '</wp:comment_approved>
94 <wp:comment_type><![CDATA[]]></wp:comment_type>
95 <wp:comment_parent>' . $comment->comment_parent . '</wp:comment_parent>
96 <wp:comment_user_id>' . $comment->user_id . '</wp:comment_user_id>
97 </wp:comment>
98 ';
99 }
100
101 /* Creates post meta string */
102 $meta_str = '';
103 $meta_values = get_post_meta( $post->ID );
104 foreach ( $meta_values as $key => $values ) {
105 foreach ( $values as $value ) {
106 $meta_str .= '<wp:postmeta>
107 <wp:meta_key>' . $this->wxr_cdata( $key ) . '</wp:meta_key>
108 <wp:meta_value>' . $this->wxr_cdata( $value ) . '</wp:meta_value>
109 </wp:postmeta>
110 ';
111 }
112 }
113
114 /* Author data */
115
116 $author_display_name = $this->wxr_cdata( get_the_author_meta( 'display_name', $post->post_author ) );
117
118 /* Post content */
119
120 $post_content = $this->wxr_cdata( $post->post_author );
121 $post_excerpt = $this->wxr_cdata( $post->post_excerpt );
122 $post_date = $this->wxr_cdata( $post->post_date );
123 $post_date_gmt = $this->wxr_cdata( $post->post_date_gmt );
124 $comment_status = $this->wxr_cdata( $post->comment_status );
125 $ping_status = $this->wxr_cdata( $post->ping_status );
126 $post_title = $this->wxr_cdata( $post->post_title );
127 $post_status = $this->wxr_cdata( $post->post_status );
128 $post_type = $this->wxr_cdata( $post->post_type );
129
130 $export_data = $this->view->render_to_string(
131 'post-export',
132 [
133 'post' => $post,
134 'taxonomy_data' => $taxonomies_str,
135 'comment_data' => $comment_str,
136 'meta_data' => $meta_str,
137 'author_name' => $author_display_name,
138 'post_content' => $post_content,
139 'post_excerpt' => $post_excerpt,
140 'post_date' => $post_date,
141 'post_date_gmt' => $post_date_gmt,
142 'comment_status' => $comment_status,
143 'ping_status' => $ping_status,
144 'post_title' => $post_title,
145 'post_status' => $post_status,
146 'post_type' => $post_type,
147 ]
148 );
149
150 file_put_contents( $file, $current . $export_data );
151
152 return $file_url;
153 }
154
155 /**
156 * Remove temporary exported file.
157 */
158 public function delete_export( $request ) {
159
160 $post_id = absint( $request->get_param( 'id' ) );
161 $post = get_post( $post_id );
162
163 /* Remove temporary file */
164 $file = WP_CONTENT_DIR . '/' . sanitize_file_name( $post->post_title ) . '_' . $post->ID . '.xml';
165
166 if ( file_exists( $file ) ) {
167 unlink( $file );
168 return rest_ensure_response(
169 [
170 'success' => true,
171 ]
172 );
173 } else {
174 return rest_ensure_response(
175 [
176 'error' => true,
177 ]
178 );
179 }
180 }
181
182
183 function wxr_cdata( $str ) {
184 if ( ! seems_utf8( $str ) ) {
185 $str = utf8_encode( $str );
186 }
187 $str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>';
188
189 return $str;
190 }
191 }
192