0

Why do_shortcode doesn't work in a REST call ?

In the example below, do_shortcode exists, but the shortcode isn't interpreted.

Route declaration

/*
       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'
              )
       );
} );

Shortcode call

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 ?

  • You have an extra space in the do_shortcode inside the function_exists. Is that a typo in your question or is it your actual code? – RRikesh Apr 27 '16 at 13:45
  • OMG - so easy to fix ! – Jordane CURE Apr 27 '16 at 13:50
  • So i edit the question a bit because i'm stuck in the next step – Jordane CURE Apr 27 '16 at 13:54
  • 1
    Please clarify your problem. Does is it work now or is the problem still there? – flomei Apr 27 '16 at 14:14
  • @RRikesh help, but the probleme still there, do_shortcode doesn't do shortcode. – Jordane CURE Apr 27 '16 at 14:19
0

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.

  • Yep, In most cases, call the function directly is probably the best solution. But in some situation, the content could contain several and different shortcode used by users. For exemple if do_shortcode is call to parse a post content build with a builder. – Jordane CURE Apr 27 '16 at 15:09
  • Who said builder are immune to the same problems? ;) – Mark Kaplun Apr 27 '16 at 15:31
0

Solution

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;
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.