Урок 17: Автоматическое добавление обязательного блока
Каждый раз при создании новой записи можно использовать функции автоматизации для проверки и изменения её содержимого.
Запрос в этом уроке проверяет, присутствует ли определённый обязательный блок в записи, и если он отсутствует — добавляет его.
GraphQL-запрос для добавления отсутствующего блока
Чтобы этот GraphQL-запрос работал, в конфигурации схемы, применённой к эндпоинту, должны быть включены вложенные мутации
Этот GraphQL-запрос проверяет, был ли уже добавлен обязательный блок wp:comments в запись. Если блок отсутствует, он добавляется в конец содержимого.
Сохраните это содержимое как Persisted Query со слагом insert-mandatory-comments-block-if-missing:
query CheckIfCommentsBlockExists($postId: ID!) {
posts(
filter: {
ids: [$postId]
search: "\"<!-- /wp:comments -->\""
}
) {
id
}
blockExists: _notEmpty(value: $__posts)
@export(as: "blockExists")
}
mutation MaybeInsertCommentsBlock($postId: ID!)
@depends(on: "CheckIfCommentsBlockExists")
@skip(if: $blockExists)
{
post(by: { id: $postId }) {
id
rawContent
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 },
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
id
rawContent
}
}
}
}Добавление хука для выполнения Persisted Query
Расширение Internal GraphQL Server по умолчанию применяет конфигурацию схемы, заданную в его собственных настройках.
Поэтому, чтобы этот GraphQL-запрос работал, в конфигурации схемы, применённой к Internal GraphQL Server, должны быть включены вложенные мутации.
Этот PHP-код подключается к действию WordPress draft_post для выполнения Persisted Query (через расширение Internal GraphQL Server):
use GatoGraphQL\InternalGraphQLServer\GraphQLServer;
use WP_Post;
add_action(
'draft_post',
function (int $postID): void {
GraphQLServer::executePersistedQuery(
'insert-mandatory-comments-block-if-missing',
[
'postId' => $postID,
],
'MaybeInsertCommentsBlock'
);
}
);