Automatically adding a mandatory block

Whenever a new post is created, we can use the automation features to validate and modify the content of the post.

The query in this tutorial lesson checks if a certain mandatory block is present in the post and, whenever missing, it adds it.

GraphQL query to add a missing block permalink

⚙️ Configuration alert:

For this GraphQL query to work, the Schema Configuration applied to the endpoint needs to have Nested Mutations enabled

This GraphQL query checks if the mandatory block wp:comments has already been added to the post. If missing, it is added at the bottom of the content.

Save this content as a Persisted Query, with slug insert-mandatory-comments-block-if-missing:

query CheckIfCommentsBlockExists($postId: ID!) {
filter: {
ids: [$postId]
search: "\"<!-- /wp:comments -->\""
) {
blockExists: _notEmpty(value: $__posts)
@export(as: "blockExists")

mutation MaybeInsertCommentsBlock($postId: ID!)
@depends(on: "CheckIfCommentsBlockExists")
@skip(if: $blockExists)
post(by: { id: $postId }) {
adaptedRawContent: _strAppend(
after: $__rawContent
append: """

<!-- wp:comments -->
<div class="wp-block-comments"><!-- wp:comments-title /-->

<!-- wp:comment-template -->
<!-- wp:columns -->
<div class="wp-block-columns"><!-- wp:column {"width":"40px"} -->
<div class="wp-block-column" style="flex-basis:40px"><!-- wp:avatar {"size":40,"style":{"border":{"radius":"20px"}}} /--></div>
<!-- /wp:column -->

<!-- wp:column -->
<div class="wp-block-column"><!-- wp:comment-author-name {"fontSize":"small"} /-->

<!-- wp:group {"style":{"spacing":{"margin":{"top":"0px","bottom":"0px"}}},"layout":{"type":"flex"}} -->
<div class="wp-block-group" style="margin-top:0px;margin-bottom:0px"><!-- wp:comment-date {"fontSize":"small"} /-->

<!-- wp:comment-edit-link {"fontSize":"small"} /--></div>
<!-- /wp:group -->

<!-- wp:comment-content /-->

<!-- wp:comment-reply-link {"fontSize":"small"} /--></div>
<!-- /wp:column --></div>
<!-- /wp:columns -->
<!-- /wp:comment-template -->

<!-- wp:comments-pagination -->
<!-- wp:comments-pagination-previous /-->

<!-- wp:comments-pagination-numbers /-->

<!-- wp:comments-pagination-next /-->
<!-- /wp:comments-pagination -->

<!-- wp:post-comments-form /--></div>
<!-- /wp:comments -->


update(input: {
contentAs: { html: $__adaptedRawContent },
}) {
errors {
...on ErrorPayload {
post {

Adding hook to execute Persisted Query permalink

⚙️ Configuration alert:

The Internal GraphQL Server by default applies the Schema Configuration defined in its own Settings.

Then, for this GraphQL query to work, the Schema Configuration applied to the Internal GraphQL Server needs to have Nested Mutations enabled.

This PHP code hooks into WordPress action draft_post to execute the Persisted Query (via the Internal GraphQL Server extension):

use GatoGraphQL\InternalGraphQLServer\GraphQLServer;
use WP_Post;

function (int $postID): void {
'postId' => $postID,

Extensions referenced in this tutorial permalink

  1. Field To Input permalink

    Retrieve the value of a field, manipulate it, and input it into another field or directive, all within the same operation.

  2. Internal GraphQL Server permalink

    Execute GraphQL queries directly within your application, using PHP code.

  3. Multiple Query Execution permalink

    Combine multiple queries into a single query, sharing state across them and executing them in the requested order.

  4. PHP Functions via Schema permalink

    Manipulate the field output using standard programming language functions available in PHP.