PluginProbe
Search Atlas SEO – OTTO AI SEO Automation for WordPress / 2.6.14
Search Atlas SEO – OTTO AI SEO Automation for WordPress v2.6.14
2.7.0 2.6.26 2.6.25 2.6.24 2.6.23 2.6.22 2.6.21 2.6.20 2.6.19 2.6.18 2.6.17 2.6.16 2.6.15 2.6.14 2.6.13 2.6.12 2.6.11 2.6.10 2.6.9 2.6.8 2.6.7 2.6.6 2.6.5 2.6.4 2.6.3 All 139 releases
metasync / wp-mcp-server / tools / class-mcp-tool-html-converter.php

class-mcp-tool-html-converter.php in Search Atlas SEO – OTTO AI SEO Automation for WordPress 2.6.14, at wp-mcp-server/tools/class-mcp-tool-html-converter.php

426 lines 12.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * MCP Tool: HTML to Builder Converter
4 *
5 * Provides MCP tools for converting HTML to theme builder formats
6 * (Elementor, Divi, Gutenberg) with CSS preservation.
7 *
8 * @package MetaSync
9 * @subpackage MCP_Server/Tools
10 */
11
12 if (!defined('ABSPATH')) {
13 exit;
14 }
15
16 require_once plugin_dir_path(dirname(__FILE__)) . 'class-mcp-tool-base.php';
17
18 /**
19 * Tool 1: Convert HTML to Builder Format
20 */
21 class MCP_Tool_Convert_HTML_To_Builder extends MCP_Tool_Base
22 {
23 public function get_name()
24 {
25 return 'wordpress_convert_html_to_builder';
26 }
27
28 public function get_description()
29 {
30 return 'Convert HTML content to a theme builder format (Elementor, Divi, or Gutenberg) with CSS preservation. Returns converted data and metadata without creating a page.';
31 }
32
33 public function get_input_schema()
34 {
35 return [
36 'type' => 'object',
37 'properties' => [
38 'html_content' => [
39 'type' => 'string',
40 'description' => 'HTML content to convert (required)'
41 ],
42 'builder' => [
43 'type' => 'string',
44 'description' => 'Target builder: "auto" (detect), "elementor", "divi", or "gutenberg" (default: auto)',
45 'enum' => ['auto', 'elementor', 'divi', 'gutenberg'],
46 'default' => 'auto'
47 ],
48 'preserve_css' => [
49 'type' => 'boolean',
50 'description' => 'Extract CSS from <style> tags and apply as inline styles (default: true)',
51 'default' => true
52 ],
53 'upload_images' => [
54 'type' => 'boolean',
55 'description' => 'Upload images to WordPress media library (default: true)',
56 'default' => true
57 ],
58 'extract_header_footer' => [
59 'type' => 'boolean',
60 'description' => 'Extract header and footer elements (default: true)',
61 'default' => true
62 ]
63 ],
64 'required' => ['html_content']
65 ];
66 }
67
68 public function execute($params)
69 {
70 $this->validate_params($params);
71
72 // Load converter
73 require_once plugin_dir_path(dirname(dirname(__FILE__))) . 'custom-pages/class-metasync-html-to-builder-converter.php';
74 $converter = new Metasync_HTML_To_Builder_Converter();
75
76 // Set options
77 $options = [
78 'builder' => isset($params['builder']) ? $params['builder'] : 'auto',
79 'preserve_css' => isset($params['preserve_css']) ? $params['preserve_css'] : true,
80 'upload_images' => isset($params['upload_images']) ? $params['upload_images'] : true,
81 'extract_header_footer' => isset($params['extract_header_footer']) ? $params['extract_header_footer'] : true,
82 ];
83
84 // Convert HTML
85 $result = $converter->convert($params['html_content'], $options);
86
87 // Check for errors
88 if (isset($result['error'])) {
89 return [
90 'success' => false,
91 'error' => $result['error']
92 ];
93 }
94
95 // Return conversion result
96 return [
97 'success' => true,
98 'builder' => $result['builder'],
99 'content' => $result['content'],
100 'meta_data' => $result['meta_data'],
101 'header' => $result['header'],
102 'footer' => $result['footer'],
103 'message' => 'HTML successfully converted to ' . $result['builder'] . ' format'
104 ];
105 }
106 }
107
108 /**
109 * Tool 2: Create Builder Page from HTML
110 */
111 class MCP_Tool_Create_Builder_Page_From_HTML extends MCP_Tool_Base
112 {
113 public function get_name()
114 {
115 return 'wordpress_create_builder_page_from_html';
116 }
117
118 public function get_description()
119 {
120 return 'Convert HTML to a builder format and create a WordPress page in one step. The page will be fully editable in the theme builder.';
121 }
122
123 public function get_input_schema()
124 {
125 return [
126 'type' => 'object',
127 'properties' => [
128 'title' => [
129 'type' => 'string',
130 'description' => 'Page title (required)'
131 ],
132 'html_content' => [
133 'type' => 'string',
134 'description' => 'HTML content to convert (required)'
135 ],
136 'slug' => [
137 'type' => 'string',
138 'description' => 'Page slug/URL (optional, auto-generated from title if not provided)'
139 ],
140 'builder' => [
141 'type' => 'string',
142 'description' => 'Target builder: "auto" (detect), "elementor", "divi", or "gutenberg" (default: auto)',
143 'enum' => ['auto', 'elementor', 'divi', 'gutenberg'],
144 'default' => 'auto'
145 ],
146 'preserve_css' => [
147 'type' => 'boolean',
148 'description' => 'Extract CSS from <style> tags and apply as inline styles (default: true)',
149 'default' => true
150 ],
151 'status' => [
152 'type' => 'string',
153 'description' => 'Post status (default: draft)',
154 'enum' => ['draft', 'publish', 'pending', 'private'],
155 'default' => 'draft'
156 ],
157 'upload_images' => [
158 'type' => 'boolean',
159 'description' => 'Upload images to WordPress media library (default: true)',
160 'default' => true
161 ],
162 'extract_header_footer' => [
163 'type' => 'boolean',
164 'description' => 'Extract and apply header/footer (default: true)',
165 'default' => true
166 ]
167 ],
168 'required' => ['title', 'html_content']
169 ];
170 }
171
172 public function execute($params)
173 {
174 $this->validate_params($params);
175
176 // Load converter
177 require_once plugin_dir_path(dirname(dirname(__FILE__))) . 'custom-pages/class-metasync-html-to-builder-converter.php';
178 $converter = new Metasync_HTML_To_Builder_Converter();
179
180 // Set conversion options
181 $options = [
182 'builder' => isset($params['builder']) ? $params['builder'] : 'auto',
183 'preserve_css' => isset($params['preserve_css']) ? $params['preserve_css'] : true,
184 'upload_images' => isset($params['upload_images']) ? $params['upload_images'] : true,
185 'extract_header_footer' => isset($params['extract_header_footer']) ? $params['extract_header_footer'] : true,
186 ];
187
188 // Convert HTML
189 $result = $converter->convert($params['html_content'], $options);
190
191 // Check for errors
192 if (isset($result['error'])) {
193 return [
194 'success' => false,
195 'error' => $result['error']
196 ];
197 }
198
199 // Create page
200 $post_data = [
201 'post_title' => sanitize_text_field($params['title']),
202 'post_content' => $result['content'],
203 'post_status' => isset($params['status']) ? $params['status'] : 'draft',
204 'post_type' => 'page',
205 ];
206
207 // Add slug if provided
208 if (isset($params['slug']) && !empty($params['slug'])) {
209 $post_data['post_name'] = sanitize_title($params['slug']);
210 }
211
212 // Insert page
213 $page_id = wp_insert_post($post_data, true);
214
215 if (is_wp_error($page_id)) {
216 return [
217 'success' => false,
218 'error' => 'Failed to create page: ' . $page_id->get_error_message()
219 ];
220 }
221
222 // Apply builder meta data
223 if (!empty($result['meta_data'])) {
224 foreach ($result['meta_data'] as $meta_key => $meta_value) {
225 update_post_meta($page_id, $meta_key, $meta_value);
226 }
227 }
228
229 // Store header and footer if extracted
230 if (!empty($result['header'])) {
231 update_post_meta($page_id, '_metasync_custom_header', $result['header']);
232 }
233 if (!empty($result['footer'])) {
234 update_post_meta($page_id, '_metasync_custom_footer', $result['footer']);
235 }
236
237 // Mark as builder page
238 update_post_meta($page_id, '_metasync_is_builder_page', true);
239 update_post_meta($page_id, '_metasync_builder_type', $result['builder']);
240
241 // Store custom CSS for late loading (ensures it overrides theme CSS)
242 if (!empty($result['css_content'])) {
243 update_post_meta($page_id, '_metasync_custom_css', $result['css_content']);
244 }
245
246 // Get URLs
247 $page_url = get_permalink($page_id);
248 $edit_url = '';
249
250 if ($result['builder'] === 'elementor' && class_exists('\Elementor\Plugin')) {
251 $edit_url = admin_url('post.php?post=' . $page_id . '&action=elementor');
252 } elseif ($result['builder'] === 'divi') {
253 $edit_url = admin_url('post.php?post=' . $page_id . '&action=edit&et_fb=1');
254 } else {
255 $edit_url = admin_url('post.php?post=' . $page_id . '&action=edit');
256 }
257
258 return [
259 'success' => true,
260 'page_id' => $page_id,
261 'title' => $params['title'],
262 'url' => $page_url,
263 'edit_url' => $edit_url,
264 'builder_used' => $result['builder'],
265 'status' => $post_data['post_status'],
266 'has_header' => !empty($result['header']),
267 'has_footer' => !empty($result['footer']),
268 'message' => 'Page created successfully with ' . $result['builder'] . ' builder'
269 ];
270 }
271 }
272
273 /**
274 * Tool 3: Convert Existing Custom Page to Builder
275 */
276 class MCP_Tool_Convert_Custom_Page_To_Builder extends MCP_Tool_Base
277 {
278 public function get_name()
279 {
280 return 'wordpress_convert_custom_page_to_builder';
281 }
282
283 public function get_description()
284 {
285 return 'Convert an existing custom HTML page (created with raw HTML mode) to a theme builder format. The page will become editable in the builder while preserving the design.';
286 }
287
288 public function get_input_schema()
289 {
290 return [
291 'type' => 'object',
292 'properties' => [
293 'page_id' => [
294 'type' => 'integer',
295 'description' => 'WordPress page ID to convert (required)'
296 ],
297 'builder' => [
298 'type' => 'string',
299 'description' => 'Target builder: "auto" (detect), "elementor", "divi", or "gutenberg" (default: auto)',
300 'enum' => ['auto', 'elementor', 'divi', 'gutenberg'],
301 'default' => 'auto'
302 ],
303 'preserve_css' => [
304 'type' => 'boolean',
305 'description' => 'Extract CSS from <style> tags and apply as inline styles (default: true)',
306 'default' => true
307 ],
308 'disable_raw_html' => [
309 'type' => 'boolean',
310 'description' => 'Disable raw HTML mode after conversion (default: true)',
311 'default' => true
312 ],
313 'extract_header_footer' => [
314 'type' => 'boolean',
315 'description' => 'Extract and apply header/footer (default: true)',
316 'default' => true
317 ]
318 ],
319 'required' => ['page_id']
320 ];
321 }
322
323 public function execute($params)
324 {
325 $this->validate_params($params);
326
327 $page_id = intval($params['page_id']);
328
329 // Check if page exists
330 $page = get_post($page_id);
331 if (!$page || $page->post_type !== 'page') {
332 return [
333 'success' => false,
334 'error' => 'Page not found or is not a valid page'
335 ];
336 }
337
338 // Get raw HTML content
339 $raw_html = get_post_meta($page_id, '_metasync_raw_html_content', true);
340 if (empty($raw_html)) {
341 return [
342 'success' => false,
343 'error' => 'No raw HTML content found for this page'
344 ];
345 }
346
347 // Load converter
348 require_once plugin_dir_path(dirname(dirname(__FILE__))) . 'custom-pages/class-metasync-html-to-builder-converter.php';
349 $converter = new Metasync_HTML_To_Builder_Converter();
350
351 // Set conversion options
352 $options = [
353 'builder' => isset($params['builder']) ? $params['builder'] : 'auto',
354 'preserve_css' => isset($params['preserve_css']) ? $params['preserve_css'] : true,
355 'upload_images' => true,
356 'extract_header_footer' => isset($params['extract_header_footer']) ? $params['extract_header_footer'] : true,
357 ];
358
359 // Convert HTML
360 $result = $converter->convert($raw_html, $options);
361
362 // Check for errors
363 if (isset($result['error'])) {
364 return [
365 'success' => false,
366 'error' => $result['error']
367 ];
368 }
369
370 // Update page content
371 wp_update_post([
372 'ID' => $page_id,
373 'post_content' => $result['content']
374 ]);
375
376 // Apply builder meta data
377 if (!empty($result['meta_data'])) {
378 foreach ($result['meta_data'] as $meta_key => $meta_value) {
379 update_post_meta($page_id, $meta_key, $meta_value);
380 }
381 }
382
383 // Store header and footer if extracted
384 if (!empty($result['header'])) {
385 update_post_meta($page_id, '_metasync_custom_header', $result['header']);
386 }
387 if (!empty($result['footer'])) {
388 update_post_meta($page_id, '_metasync_custom_footer', $result['footer']);
389 }
390
391 // Mark as builder page
392 update_post_meta($page_id, '_metasync_is_builder_page', true);
393 update_post_meta($page_id, '_metasync_builder_type', $result['builder']);
394
395 // Disable raw HTML mode if requested
396 if (isset($params['disable_raw_html']) && $params['disable_raw_html']) {
397 update_post_meta($page_id, '_metasync_raw_html_enabled', false);
398 }
399
400 // Get URLs
401 $page_url = get_permalink($page_id);
402 $edit_url = '';
403
404 if ($result['builder'] === 'elementor' && class_exists('\Elementor\Plugin')) {
405 $edit_url = admin_url('post.php?post=' . $page_id . '&action=elementor');
406 } elseif ($result['builder'] === 'divi') {
407 $edit_url = admin_url('post.php?post=' . $page_id . '&action=edit&et_fb=1');
408 } else {
409 $edit_url = admin_url('post.php?post=' . $page_id . '&action=edit');
410 }
411
412 return [
413 'success' => true,
414 'page_id' => $page_id,
415 'title' => $page->post_title,
416 'url' => $page_url,
417 'edit_url' => $edit_url,
418 'builder_used' => $result['builder'],
419 'raw_html_disabled' => isset($params['disable_raw_html']) ? $params['disable_raw_html'] : true,
420 'has_header' => !empty($result['header']),
421 'has_footer' => !empty($result['footer']),
422 'message' => 'Page successfully converted to ' . $result['builder'] . ' builder format'
423 ];
424 }
425 }
426