ไลบรารี Queries
ไลบรารี Queriesนำเข้า HTML จาก URL เป็นโพสต์ใหม่ใน WordPress

นำเข้า HTML จาก URL เป็นโพสต์ใหม่ใน WordPress

query นี้นำเข้าหน้า HTML จาก URL ที่กำหนดเป็นโพสต์ใหม่ใน WordPress

จากแต่ละ URL จะดึงชื่อเรื่องจาก <title>...</title> ในส่วน meta และดึงเนื้อหาจาก <body>...</body> หรือปรับแต่งให้เจาะจงไปยังองค์ประกอบ HTML ภายในที่ต้องการได้โดยใช้ตัวแปร $contentMatchInnerRegex

ด้วย $contentMatchInnerRegex เราสามารถกำหนดได้ว่าจะจับส่วนย่อยใดของ HTML ใน <body>

ตัวอย่างเช่น หากต้องดึงเนื้อหาจาก:

<article class="main">...</article>

...เราสามารถจับได้ด้วย:

{
  "contentMatchInnerRegex": ".*?<\\s*?article\\b[^>]*>(.*?)<\\/article\\b[^>]*>.*?"
}
query GenerateURLInputs(
  $urls: [URL!]!
  $contentMatchInnerRegex: String! = "(.*?)"
) {
  urlInputs: _echo(value: $urls)
    @underEachArrayItem(
      passValueOnwardsAs: "url"
    )
      @applyField(
        name: "_echo",
        arguments: {
          value: {
            url: $url,
            method: GET
          }
        },
        setResultInResponse: true
      )
    @export(as: "urlInputs")
    @remove
  contentMatchRegex: _sprintf(
    string: "/(?:<!DOCTYPE html>)?<\\s*?html\\b[^>]*>.*?<\\s*?body\\b[^>]*>%s<\\/body\\b[^>]*>.*?<\\/html\\b[^>]*>/sim",
    values: [$contentMatchInnerRegex]
  )
    @export(as: "contentMatchRegex")
}
 
query RequestPages
  @depends(on: "GenerateURLInputs")
{
  urlContents: _sendHTTPRequests(inputs: $urlInputs, async: false) {
    statusCode
    body
      @remove
    title: _strRegexReplace(
      searchRegex: "/(?:<!DOCTYPE html>)?<\\s*?html\\b[^>]*>.*?<head\\b[^>]*>.*?<\\s*?title\\b[^>]*>(.*?)<\\/title\\b[^>]*>.*?<\\/head\\b[^>]*>(.*?)<\\/html\\b[^>]*>/sim"
      replaceWith: "$1"
      in: $__body
    )
    content: _strRegexReplace(
      searchRegex: $contentMatchRegex
      replaceWith: "$1"
      in: $__body
    )
    createPostInput: _echo(value: {
      status: publish,
      title: $__title
      contentAs: {
        html: $__content
      }
    })
      @export(as: "createPostInputs", type: LIST)
  }
}
 
mutation CreatePostsFromURLs
  @depends(on: "RequestPages")
{
  createPosts(inputs: $createPostInputs) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    post {
      id
      status
      title
      content
    }
  }
}