[wp-trac] [WordPress Trac] #58278: [Query Loop][Post Template][Custom dynamic block] Impossible to pass query loop context to a custom dynamic block as the post template context is hard coded.

WordPress Trac noreply at wordpress.org
Tue May 9 13:14:16 UTC 2023


#58278: [Query Loop][Post Template][Custom dynamic block] Impossible to pass query
loop context to a custom dynamic block as the post template context is hard
coded.
-------------------------+-----------------------------
 Reporter:  jdmweb       |      Owner:  (none)
     Type:  enhancement  |     Status:  new
 Priority:  normal       |  Milestone:  Awaiting Review
Component:  Editor       |    Version:  6.2
 Severity:  normal       |   Keywords:  dev-feedback
  Focuses:               |
-------------------------+-----------------------------
 Hello.

 **Context** :

 I'm writing a query loop variation, with post templates, then a custom
 dynamic block.

 **Problem** :

 I was trying to get the query loop id inside the custom dynamic block and
 could not, even when specifying usesContext and providesContext block.json
 configuration for my dynamic bloc of the core/post-template one.

 **Observations** :

 After some investigation, I found that the post template uses the
 `render_block_core_post_template` function as render callback inside the
 `post-template.php` file

 Line 93 of this file, we can see that the function hard codes the context
 that is then passed to the block :

 {{{#!php
                 $block_content = (
                         new WP_Block(
                                 $block_instance,
                                 array(
                                         'postType' => get_post_type(),
                                         'postId'   => get_the_ID(),
                                 )
                         )
                 )->render( array( 'dynamic' => false ) );
 }}}



 There's no filter or mechanism allowing us to provide more context here
 which is quite blocking.

 **Suggestion** :

 We could do something like this instead :





 {{{#!php
                 // Render the inner blocks of the Post Template block with
 `dynamic` set to `false` to prevent calling
                 // `render_callback` and ensure that no wrapper markup is
 included.
         $context = array(
             'postType' => get_post_type(),
             'postId'   => get_the_ID(),
         );

         //Check if additional context is provided by ancestor blocks
         if (!empty($block->block_type->provides_context)) {
             foreach ($block->block_type->provides_context as
 $context_name) {
                 if (array_key_exists($context_name, $block->context)) {
                     $context[$context_name] =
 $block->context[$context_name];
                 }
             }
         }

                 $block_content = (
                         new WP_Block(
                                 $block_instance,
                                 $context
                         )
                 )->render( array( 'dynamic' => false ) );
 }}}




 With this code, I was able to specify and get the queryId to my custom
 block.

 **Steps to reproduce** :

 - Create a query loop variation
 - In the variation, set the innerblocks setting to use a custom dynamic
 block.
 - In your custom block block.json file, we're trying to use the queryId as
 the context.
 - As it's not working, I've also specified that I wanted the core/post-
 template block to provide the queryId via providesContext.
 - Realize the core/post-template block does not provide any context
 besides the hard coded one mentioned above.

 **Expected output** :

 If we specify that the core/post-template block should specify a context,
 it should be taken into account alongside the default values that are
 `postType` and `postId`

 Thank you for your work.

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/58278>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list