Gato GraphQL + Yoast SEO + ChatGPT + MasterStudy LMS เดโม

การสร้าง Yoast SEO metadata สำหรับคอร์สและบทเรียน MasterStudy LMS ด้วย ChatGPT

สร้างและอัปเดต SEO metadata ใน Yoast สำหรับคอร์สและบทเรียน MasterStudy LMS โดยอัตโนมัติด้วย ChatGPT

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

เราสามารถใช้ ChatGPT เพื่อสร้างและอัปเดต SEO metadata สำหรับคอร์สและบทเรียนของ MasterStudy LMS โดยอัตโนมัติ และจัดเก็บ metadata ไว้ใน Yoast SEO ทั้งหมดนี้ด้วย queries เดียวของ Gato GraphQL

ในเดโมนี้ เราใช้ GraphQL เพื่อ:

  1. ดึงข้อมูลคอร์สหรือบทเรียนจาก MasterStudy LMS
  2. เรียกใช้ ChatGPT เพื่อสร้าง SEO metadata จากข้อมูลคอร์สหรือบทเรียน
  3. อัปเดต Yoast SEO metadata สำหรับคอร์สหรือบทเรียนนั้น

เราต้องระบุตัวแปรต่อไปนี้:

  • courseOrLessonId: ID ของคอร์สหรือบทเรียน MasterStudy LMS ที่ต้องการอัปเดต
  • openAIAPIKey: API key สำหรับ OpenAI API

คุณต้องเปิดใช้งานการเข้าถึงข้อมูลสำหรับ Custom Post Types ที่จำเป็นด้วย: stm-courses และ stm-lessons

นี่คือ GraphQL queries:

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")
}

ตัวแปรจะมีลักษณะดังนี้:

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

สมัครรับจดหมายข่าวของเรา

ติดตามการอัปเดตทั้งหมดของ Gato GraphQL