Why do_shortcode
doesn't work in a REST call ?
In the example below, do_shortcode
exists, but the shortcode isn't interpreted.
/*
Adding a route with callback is interpret_shortcode function
*/
add_action( 'rest_api_init', function ()
{
register_rest_route(
'test',
'/someContent',
array(
'methods' => 'GET',
'callback' => 'interpret_shortcode'
)
);
} );
function interpret_shortcode( $data )
{
$content;
if ( function_exists( 'do_shortcode' ) )
{
$content = do_shortcode("[et_pb_text] abc [/et_pb_text]");
}
else {
$content = "do_shortcode is missing";
}
return array('content'=>$content); //Output "[et_pb_text] abc [/et_pb_text]"
}
In a REST call, are we in the same situation as the one describe here about Ajax request ?
Why do_shortcode
doesn't work in a REST call ?
In the example below, do_shortcode
exists, but the shortcode isn't interpreted.
/*
Adding a route with callback is interpret_shortcode function
*/
add_action( 'rest_api_init', function ()
{
register_rest_route(
'test',
'/someContent',
array(
'methods' => 'GET',
'callback' => 'interpret_shortcode'
)
);
} );
function interpret_shortcode( $data )
{
$content;
if ( function_exists( 'do_shortcode' ) )
{
$content = do_shortcode("[et_pb_text] abc [/et_pb_text]");
}
else {
$content = "do_shortcode is missing";
}
return array('content'=>$content); //Output "[et_pb_text] abc [/et_pb_text]"
}
In a REST call, are we in the same situation as the one describe here about Ajax request ?
I find a workaround for this issue. I post it for posterity.
This is an issue, several issue, between divi and REST Api.
In the exemple bellow, register_rest_field
is used instead of register_rest_route
, but the fix is valid for both method.
This solution could not be very futureproof. But, at least, their is no modification inside Divi Builder or Rest API.
/*
Edit Rest call
*/
add_action( 'rest_api_init', function ()
{
register_rest_field(
'page',
'content',
array(
'get_callback' => 'duo_get_divi_content',
'update_callback' => null,
'schema' => null,
)
);
});
function duo_get_divi_content( $object, $field_name, $request )
{
//Set is_singular to true to ovoid "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 bellow 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
et_builder_init_global_settings ();
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']);
//Apply the_content's filter, one of them interpret shortcodes
$output = apply_filters( 'the_content', $post->post_content );
return $output;
}
Availability of shortcodes defined by plugins at any point of the code is undefined expect for (and even that is a maybe) singular content.
In most cases outside of that context you better call the function implementing it with the applicable parameters instead of "parsing" the shortcode.
do_shortcode
inside thefunction_exists
. Is that a typo in your question or is it your actual code? – RRikesh Commented Apr 27, 2016 at 13:45do_shortcode
doesn't do shortcode. – Jordane CURE Commented Apr 27, 2016 at 14:19