Вопрос или проблема
Я использую REST API для публикации сообщений вне WordPress и столкнулся с проблемой, когда не все мои шорткоды обрабатываются. В частности, большинство шорткодов моих плагинов обрабатываются, но ничего из Visual Composer не преобразуется в HTML. Я заметил, что если я использую var_dump для функции данных поста REST API на фронтенде самого сайта WordPress (пустая тема, тема буквально ‘var_dump эта функция’), шорткоды для VC обрабатываются.
Я не уверен, что я делаю не так, но вот мой код для возврата REST API:
function return_page_single( WP_REST_Request $request ) {
$page_id = $request->get_param( 'page' );
$args = array(
'id' => $page_id,
'post_type' => 'page',
'posts_per_page' => 1
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
$page = $query->posts;
$page_content = $page[0]->post_content;
$page_content = apply_filters( 'the_content', $page_content );
$page_content = do_shortcode( $page_content );
$page[0]->post_content = $page_content;
$query_return['page'] = $page;
$query_return['query'] = $query->query;
}
wp_reset_postdata();
return $query_return;
}
Если я выведу содержимое результата моего REST API, я получаю шорткоды для VC, но все остальное обрабатывается.
Если я размещаю следующее в своей теме:
var_dump( return_page_single( $request ) );
Я получаю полностью обработанный контент поста.
У меня нет живого примера, так как это разрабатывается внутренне, но если это поможет в отладке, я могу, вероятно, что-то настроить.
Я предполагаю, что Visual Composer не работает в пространстве Rest API, вероятно, лучше всего обратиться в поддержку этого плагина.
В любом случае, вы можете посмотреть, можете ли вы вызвать метод плагина Visual Composer, используемый для шорткода, и запустить его в своем коде.
Наконец, я нашел ответ после изменения моей стратегии в Google, добавление этого в мою функцию ‘get’ вызывает выполнение шорткодов VC:
if(class_exists('WPBMap') && method_exists('WPBMap', 'addAllMappedShortcodes')) {
WPBMap::addAllMappedShortcodes();
};
Ответ или решение
Когда вы работаете с REST API WordPress для отправки данных постов, важно понимать, как обрабатываются шорткоды, особенно если речь идет о плагинах, таких как Visual Composer (VC). В вашем случае, вы заметили, что шорткоды от Visual Composer не обрабатываются должным образом при получении данных через API, тогда как шорткоды других плагинов работают без проблем. В этой статье мы рассмотрим решение данной проблемы.
Проблема с обработкой шорткодов
При использовании функции apply_filters( 'the_content', $page_content )
и do_shortcode( $page_content )
, вы ожидаете, что все шорткоды будут обработаны. Однако, как показывает ваша ситуация, некоторые шорткоды (в частности, от VC) не срабатывают. Это связано с тем, что Visual Composer может не загружать необходимые ресурсы или инициализации в контексте REST API, поскольку это другой контекст выполнения, чем тот, который используется в вашем шаблоне темы.
Решение проблемы
Вы нашли рабочее решение, добавив следующий код в функцию обработки запроса:
if(class_exists('WPBMap') && method_exists('WPBMap', 'addAllMappedShortcodes')) {
WPBMap::addAllMappedShortcodes();
}
Эта команда инициализирует все шорткоды, зарегистрированные в Visual Composer. Это делается для того, чтобы убедиться, что все шорткоды, которые используются в контенте, зарегистрированы и доступны для обработки.
Полный пример функции
Исходя из вашего кода, вот как может выглядеть окончательная функция для обработки страницы с шорткодами от VC:
function return_page_single( WP_REST_Request $request ) {
$page_id = $request->get_param( 'page' );
$args = array(
'id' => $page_id,
'post_type' => 'page',
'posts_per_page' => 1
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
$page = $query->posts;
$page_content = $page[0]->post_content;
// Инициализация шорткодов Visual Composer
if(class_exists('WPBMap') && method_exists('WPBMap', 'addAllMappedShortcodes')) {
WPBMap::addAllMappedShortcodes();
}
// Применение фильтров и шорткодов
$page_content = apply_filters( 'the_content', $page_content );
$page_content = do_shortcode( $page_content );
// Обновляем содержимое поста
$page[0]->post_content = $page_content;
$query_return['page'] = $page;
$query_return['query'] = $query->query;
}
wp_reset_postdata();
return $query_return;
}
Заключение
Работа с REST API в WordPress является мощным инструментом для взаимодействия с содержимым вашего сайта. Однако, когда вы используете плагины, такие как Visual Composer, нужно помнить о том, что их функции могут не работать вне стандартного контекста WordPress. Инициализация шорткодов критична и требует дополнительной настройки в ваших функциях. Убедитесь, что вы тестируете свои API-запросы, а также проверяете восстановление данных на наличие каких-либо проблем с обработкой контента.