Demo Gato GraphQL + Yoast SEO + ChatGPT + MasterStudy LMS
Yoast SEO-Metadaten für MasterStudy LMS-Kurse und -Lektionen mit ChatGPT erstellen
SEO-Metadaten in Yoast für MasterStudy LMS-Kurse und -Lektionen automatisch generieren und aktualisieren, mit ChatGPT
Leonardo Losoviz -


Wir können ChatGPT verwenden, um SEO-Metadaten für MasterStudy LMS-Kurse und -Lektionen automatisch zu generieren und zu aktualisieren und die Metadaten in Yoast SEO zu speichern – alles mit einer einzigen Gato GraphQL-Query.
In dieser Demo verwenden wir GraphQL, um:
- Daten eines Kurses oder einer Lektion aus MasterStudy LMS abzurufen
- ChatGPT aufzurufen, um SEO-Metadaten basierend auf den Kurs- oder Lektionsdaten zu generieren
- Die Yoast SEO-Metadaten für diesen Kurs oder diese Lektion zu aktualisieren
Wir müssen die folgenden Variablen angeben:
courseOrLessonId: Die ID des MasterStudy LMS-Kurses oder der Lektion, die aktualisiert werden sollopenAIAPIKey: Der API-Schlüssel für die OpenAI API
Du musst außerdem den Zugriff auf Daten für die erforderlichen Custom Post Types aktivieren: stm-courses und stm-lessons.
Hier ist die GraphQL-Query:
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")
}Die Variablen würden so aussehen:
{
"courseOrLessonId": "123",
"openAIAPIKey": "sk-..."
}