Я пытаюсь отобразить ответ, который получаю через WP API, внутри представления лезвия с помощью Laravel: {!! $text !!}
проблема, с которой я сталкиваюсь в данный момент, заключается в том, что ответ содержит внутренний CSS вместе с HTML, как вы можете видеть ниже. весь ответ:
"<style>.elementor-8 .elementor-element.elementor-element-0f0546d{--display:flex;--background-transition:0.3s;}.elementor-8 .elementor-element.elementor-element-5556662{--display:flex;--flex-direction:row;--container-widget-width:initial;--container-widget-height:100%;--container-widget-flex-grow:1;--container-widget-align-self:stretch;--gap:0px 0px;--background-transition:0.3s;}.elementor-8 .elementor-element.elementor-element-897f945{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--background-transition:0.3s;}.elementor-8 .elementor-element.elementor-element-cfc8ec7{--width:500px;--transition:0.3s;}.elementor-8 .elementor-element.elementor-element-68774d6{--display:flex;--flex-direction:column;--container-widget-width:100%;--container-widget-height:initial;--container-widget-flex-grow:0;--container-widget-align-self:initial;--background-transition:0.3s;}@media(min-width:768px){.elementor-8 .elementor-element.elementor-element-897f945{--width:50%;}.elementor-8 .elementor-element.elementor-element-68774d6{--width:50%;}}@media(max-width:1024px){.elementor-8 .elementor-element.elementor-element-cfc8ec7{--width:500px;}}@media(max-width:767px){.elementor-8 .elementor-element.elementor-element-cfc8ec7{--width:500px;}}</style>\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"8\" class=\"elementor elementor-8\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0f0546d e-flex e-con-boxed e-con e-parent\" data-id=\"0f0546d\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1d589be elementor-widget elementor-widget-heading\" data-id=\"1d589be\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>/*! elementor - v3.21.0 - 08-05-2024 */\n.elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-heading .elementor-heading-title[class*=elementor-size-]>a{color:inherit;font-size:inherit;line-height:inherit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-medium{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading .elementor-heading-title.elementor-size-xxl{font-size:59px}</style><h2 class=\"elementor-heading-title elementor-size-default\">Teeeeest</h2>\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t<div class=\"elementor-element elementor-element-5556662 e-flex e-con-boxed e-con e-parent\" data-id=\"5556662\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fe7bf0d elementor-widget elementor-widget-text-editor\" data-id=\"fe7bf0d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>/*! elementor - v3.21.0 - 08-05-2024 */\n.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}</style>\t\t\t\t<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.</p>\t\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t<div class=\"elementor-element elementor-element-897f945 e-con-full e-flex e-con e-child\" data-id=\"897f945\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dfb1139 elementor-widget elementor-widget-heading\" data-id=\"dfb1139\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Add Your Heading Text Here</h2>\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cfc8ec7 elementor-widget elementor-widget-text-path\" data-id=\"cfc8ec7\" data-element_type=\"widget\" data-settings=\"{"text":"Add Your Curvy Text Here","link":{"url":"","is_external":"","nofollow":"","custom_attributes":""},"start_point":{"unit":"%","size":0,"sizes":[]}}\" data-widget_type=\"text-path.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"e-text-path\" data-text=\"Add Your Curvy Text Here\" data-url=\"//cms.test/wp-content/plugins/elementor/assets/svg-paths/wave.svg\" data-link-url=\"\"></div>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t<div class=\"elementor-element elementor-element-68774d6 e-con-full e-flex e-con e-child\" data-id=\"68774d6\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c539c12 elementor-widget elementor-widget-image\" data-id=\"c539c12\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>/*! elementor - v3.21.0 - 08-05-2024 */\n.elementor-widget-image{text-align:center}.elementor-widget-image a{display:inline-block}.elementor-widget-image a img[src$=\".svg\"]{width:48px}.elementor-widget-image img{vertical-align:middle;display:inline-block}</style>\t\t\t\t\t\t\t\t\t\t<img src=\"https://cms.test/wp-content/plugins/elementor/assets/images/placeholder.png\" title=\"\" alt=\"\" loading=\"lazy\" />\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t"
HTML отображается нормально, хотя теги <style>
, похоже, не отображаются, в результате чего внешний интерфейс не отображается так, как он должен отображаться.
Внутри контроллера у меня есть этот запрос API:
$client = new Client();
$res = $client->get('https://cms.test/wp-json/test/v2/posts/8/contentElementor');
$text = json_decode($res->getBody()->getContents());
А внутри файла function.php в WordPress, чтобы получить только содержимое Elementor с внутренним CSS, я создал конечную точку:
add_action("rest_api_init", function () {
register_rest_route(
"test/v2"
, "/posts/(?P<id>\d+)/contentElementor"
, [
"methods" => "GET",
"callback" => function (\WP_REST_Request $req) {
$contentElementor = "";
if (class_exists("\\Elementor\\Plugin")) {
$post_ID = $req->get_param("id");
$pluginElementor = \Elementor\Plugin::instance();
$contentElementor = $pluginElementor->frontend->get_builder_content($post_ID, $with_css = true);
}
return $contentElementor;
},
]
);
});
Итак, в данном случае вопросов два: есть ли способ визуализировать стили, если нет, можем ли мы получить стили отдельно и каким-то образом визуализировать их внутри представления?
После небольшого исследования и размышлений я в итоге использовал две функции PHP, которые разделяют HTML и CSS внутри контроллера.
$res = $client->get('https://cms.test/wp-json/test/v2/posts/id/contentElementor');
$text = json_decode($res->getBody()->getContents());
$styles = $this->getBetween($text, '<style>', '</style>');
$text = $this->delete_all_between('<style>', '</style>', $text);
Получение между двумя строками стилей:
public function getBetween($content, $start, $end) {
$n = explode($start, $content);
$result = Array();
foreach ($n as $val) {
$pos = strpos($val, $end);
if ($pos !== false) {
$result[] = substr($val, 0, $pos);
}
}
return $result;
}
Удаление стилей между двумя строками:
function delete_all_between($beginning, $end, $content) {
$beginningPos = strpos($content, $beginning);
$endPos = strpos($content, $end);
if ($beginningPos === false || $endPos === false) {
return $content;
}
$textToDelete = substr($content, $beginningPos, ($endPos + strlen($end)) - $beginningPos);
return $this->delete_all_between($beginning, $end, str_replace($textToDelete, '', $content)); // recursion to ensure all occurrences are replaced
}
Вид лезвия изнутри:
@push('css')
<style>
@foreach($styles as $s)
{!! $s !!}
@endforeach
</style>
@endpush
Вот так мы получили HTML и CSS в отдельных переменных, готовых к использованию.