Demo de Gato GraphQL + Yoast SEO + ChatGPT + MasterStudy LMS
Crear metadatos de Yoast SEO para cursos y lecciones de MasterStudy LMS usando ChatGPT
Genera y actualiza automáticamente los metadatos SEO en Yoast para cursos y lecciones de MasterStudy LMS, usando ChatGPT
Leonardo Losoviz -


Podemos usar ChatGPT para generar y actualizar automáticamente los metadatos SEO de cursos y lecciones de MasterStudy LMS y guardarlos en Yoast SEO, todo con una sola consulta de Gato GraphQL.
En esta demo, usamos GraphQL para:
- Obtener los datos de un curso o lección de MasterStudy LMS
- Llamar a ChatGPT para generar los metadatos SEO a partir de los datos del curso o lección
- Actualizar los metadatos de Yoast SEO para ese curso o lección
Debemos proporcionar las siguientes variables:
courseOrLessonId: El ID del curso o lección de MasterStudy LMS a actualizaropenAIAPIKey: La clave de API para la API de OpenAI
También debes habilitar el acceso a los datos de los Custom Post Types necesarios: stm-courses y stm-lessons.
Aquí está la consulta GraphQL:
query GetCourseOrLessonData($courseOrLessonId: ID!) {
courseOrLesson: customPost(by: { id: $courseOrLessonId }, customPostTypes: ["stm-courses", "stm-lessons"]) {
id
...on CustomPost {
title
@export(as: "title")
content
@export(as: "content")
}
...WithMetaData
}
}
query GenerateCourseSEOWithChatGPT(
$openAIAPIKey: String!
$systemMessage: String! = "You are an SEO specialist"
$promptTemplate: String! = """
I'm working on creating the SEO metadata for courses and lessons in my Learning Management System.
Please evaluate the course or lesson data, and generate the following SEO metadata:
- Title
- Excerpt
- Focus Keyword
- Open Graph Title
- Open Graph Description
- Twitter Title
- Twitter Description
The data is:
- Title: {$title}
- Content: {$content}
"""
$model: String! = "gpt-4o-mini"
)
@depends(on: "GetCourseOrLessonData")
{
prompt: _strReplaceMultiple(
search: ["{$title}", "{$content}"],
replaceWith: [$title, $content],
in: $promptTemplate
)
openAIResponse: _sendJSONObjectItemHTTPRequest(input: {
url: "https://api.openai.com/v1/chat/completions",
method: POST,
options: {
auth: {
password: $openAIAPIKey
},
json: {
model: $model,
messages: [
{
role: "system",
content: $systemMessage
},
{
role: "user",
content: $__prompt
},
],
response_format: {
type: "json_schema",
json_schema: {
name: "seo_metadata_response",
strict: true,
schema: {
type: "object",
properties: {
seoMetadata: {
type: "object",
properties: {
title: {
type: "string"
},
excerpt: {
type: "string"
},
focusKeyword: {
type: "string"
},
openGraphTitle: {
type: "string"
},
openGraphDescription: {
type: "string"
},
twitterTitle: {
type: "string"
},
twitterDescription: {
type: "string"
}
},
required: ["title", "excerpt", "focusKeyword", "openGraphTitle", "openGraphDescription", "twitterTitle", "twitterDescription"],
additionalProperties: false
}
},
required: ["seoMetadata"],
additionalProperties: false
}
}
}
}
}
})
@underJSONObjectProperty(by: { key: "choices" })
@underArrayItem(index: 0)
@underJSONObjectProperty(by: { path: "message.content" })
@export(as: "jsonEncodedSeoMetadataResponse")
}
query ExtractSeoMetadata
@depends(on: "GenerateCourseSEOWithChatGPT")
{
decodedSeoMetadataResponse: _strDecodeJSONObject(string: $jsonEncodedSeoMetadataResponse)
@underJSONObjectProperty(by: { path: "seoMetadata" })
@export(as: "seoMetadata")
}
mutation GenerateSeoMetadataAndUpdateYoast(
$courseOrLessonId: ID!
)
@depends(on: "ExtractSeoMetadata")
{
seoMetadataTitle: _objectProperty(
object: $seoMetadata,
by: { key: "title" }
)
seoMetadataExcerpt: _objectProperty(
object: $seoMetadata,
by: { key: "excerpt" }
)
seoMetadataFocusKeyword: _objectProperty(
object: $seoMetadata,
by: { key: "focusKeyword" }
)
seoMetadataOpenGraphTitle: _objectProperty(
object: $seoMetadata,
by: { key: "openGraphTitle" }
)
seoMetadataOpenGraphDescription: _objectProperty(
object: $seoMetadata,
by: { key: "openGraphDescription" }
)
seoMetadataTwitterTitle: _objectProperty(
object: $seoMetadata,
by: { key: "twitterTitle" }
)
seoMetadataTwitterDescription: _objectProperty(
object: $seoMetadata,
by: { key: "twitterDescription" }
)
updateCustomPostMetas(inputs: [
{ id: $courseOrLessonId, key: "_yoast_wpseo_title", value: $__seoMetadataTitle },
{ id: $courseOrLessonId, key: "_yoast_wpseo_metadesc", value: $__seoMetadataExcerpt },
{ id: $courseOrLessonId, key: "_yoast_wpseo_focuskw", value: $__seoMetadataFocusKeyword },
{ id: $courseOrLessonId, key: "_yoast_wpseo_opengraph-title", value: $__seoMetadataOpenGraphTitle },
{ id: $courseOrLessonId, key: "_yoast_wpseo_opengraph-description", value: $__seoMetadataOpenGraphDescription },
{ id: $courseOrLessonId, key: "_yoast_wpseo_twitter-title", value: $__seoMetadataTwitterTitle },
{ id: $courseOrLessonId, key: "_yoast_wpseo_twitter-description", value: $__seoMetadataTwitterDescription }
]) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
}
}
query GenerateAndUpdateCourseOrLessonSeoMetadataAndCheckResults($courseOrLessonId: ID!)
@depends(on: "GenerateSeoMetadataAndUpdateYoast")
{
courseOrLessonResults: customPost(by: { id: $courseOrLessonId }, customPostTypes: ["stm-courses", "stm-lessons"]) {
id
...WithMetaData
}
}
fragment WithMetaData on WithMeta {
metaTitle: metaValue(key: "_yoast_wpseo_title")
metaDesc: metaValue(key: "_yoast_wpseo_metadesc")
focusKeyword: metaValue(key: "_yoast_wpseo_focuskw")
socialFBTitle: metaValue(key: "_yoast_wpseo_opengraph-title")
socialFBDesc: metaValue(key: "_yoast_wpseo_opengraph-description")
socialTwitterTitle: metaValue(key: "_yoast_wpseo_twitter-title")
socialTwitterDesc: metaValue(key: "_yoast_wpseo_twitter-description")
}Las variables tendrían un aspecto similar a este:
{
"courseOrLessonId": "123",
"openAIAPIKey": "sk-..."
}