Отправка данных поста через REST API, как разобрать шорткоды в post_content?

Вопрос или проблема

Я использую 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-запросы, а также проверяете восстановление данных на наличие каких-либо проблем с обработкой контента.

Оцените материал
Добавить комментарий

Капча загружается...