Démo Gato GraphQL + Yoast SEO + ChatGPT + MasterStudy LMS

Créer des métadonnées Yoast SEO pour les cours et leçons MasterStudy LMS avec ChatGPT

Générez et mettez à jour automatiquement les métadonnées SEO dans Yoast pour les cours et leçons MasterStudy LMS, en utilisant ChatGPT

Leonardo Losoviz
Leonardo Losoviz -
Logo
Image
Target Image
Target Image
Target Image

Nous pouvons utiliser ChatGPT pour générer et mettre à jour automatiquement les métadonnées SEO des cours et leçons de MasterStudy LMS et les stocker dans Yoast SEO, le tout avec une seule requête Gato GraphQL.

Dans cette démo, nous utilisons GraphQL pour :

  1. Récupérer les données d'un cours ou d'une leçon depuis MasterStudy LMS
  2. Appeler ChatGPT pour générer des métadonnées SEO à partir des données du cours ou de la leçon
  3. Mettre à jour les métadonnées Yoast SEO pour ce cours ou cette leçon

Nous devons fournir les variables suivantes :

  • courseOrLessonId : L'ID du cours ou de la leçon MasterStudy LMS à mettre à jour
  • openAIAPIKey : La clé API pour l'API OpenAI

Voici la requête 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")
}

Les variables ressembleraient à ceci :

{
  "courseOrLessonId": "123",
  "openAIAPIKey": "sk-..."
}

Abonnez-vous à notre newsletter

Restez au courant de toutes les nouveautés de Gato GraphQL.