Search code examples
wordpresswordpress-rest-api

Why Divi shortcodes don't render in wp-json?


I'm trying to use the the_content filter to process the Divi shortcodes, but the shortcodes are still appearing. Specifically et_pb_section, et_pb_column, et_pb_text if that matters.

add_action( 'rest_api_init', function () {
    register_rest_field(
        'post',
        'content',
        array(
            'get_callback'    => 'ap3_divi_do_shortcodes',
            'update_callback' => null,
            'schema'          => null,
        )
    );

    register_rest_field(
        'post',
        'excerpt',
        array(
            'get_callback'    => 'ap3_divi_do_shortcodes',
            'update_callback' => null,
            'schema'          => null,
        )
    );
});

function ap3_divi_do_shortcodes( $object, $field_name, $request ) {

    global $post;
    $post = get_post($object['id']);

    // Set is_singular to true to avoid "read more issue"
    // Issue come from is_singular () in divi-builder.php line 73
    global $wp_query;
    $wp_query->is_singular = true;

    $output = array(
        'protected' => false
    );

    switch( $field_name ) {
        case 'content':
            $output['rendered'] =  apply_filters( 'the_content', $post->post_content );
            break;
        case 'excerpt':
            $output['rendered'] =  apply_filters( 'the_excerpt', $post->post_excerpt );
            break;
    }

    return $output;
}

Solution

  • I figured it out myself. I need to call et_builder_add_main_elements() but I also, had to make sure I only called it once.

    define('ONLY_ONCE_ap3_divi_do_shortcodes', true);
    

    Here is what I ended up with.

    <?php
    
    /**
     * Render the Divi shortcode in wp-json API
     * Placed in the wp-content/mu-plugins/ folder
     */
    
    add_action( 'rest_api_init', function () {
        register_rest_field(
            'post',
            'content',
            array(
                'get_callback'    => 'ap3_divi_do_shortcodes',
                'update_callback' => null,
                'schema'          => null,
            )
        );
    
        register_rest_field(
            'post',
            'excerpt',
            array(
                'get_callback'    => 'ap3_divi_do_shortcodes',
                'update_callback' => null,
                'schema'          => null,
            )
        );
    });
    
    function ap3_divi_do_shortcodes( $object, $field_name, $request ) {
    
        // Set is_singular to true to avoid "read more issue"
        // Issue come from is_singular () in divi-builder.php line 73
        global $wp_query;
        $wp_query->is_singular = true;
    
        // Set divi shortcode
        // The 2 function below are define in 'init' but they are call in 'wp'
        // REST Api exit after 'parse_request' hook, it's before 'wp' so divi's shortcode are not set
        if( !defined('ONLY_ONCE_ap3_divi_do_shortcodes') && function_exists('et_builder_init_global_settings') && function_exists('et_builder_add_main_elements') ) {
            define('ONLY_ONCE_ap3_divi_do_shortcodes', true);
            et_builder_add_main_elements();
        }
    
        //Define $post, if not defined, divi will not add outter_content and inner_content warper
        //Issue come from get_the_ID() in divi-builder.php line 69
        global $post;
        $post = get_post($object['id']);
    
        $output = array();
    
        //Apply the_content's filter, one of them interpret shortcodes
        switch( $field_name ) {
            case 'content':
                $output['rendered'] =  apply_filters( 'the_content', $post->post_content );
                break;
            case 'excerpt':
                $output['rendered'] =  apply_filters( 'the_excerpt', $post->post_excerpt );
                break;
        }
    
        $output['protected'] = false;
    
        return $output;
    }