Lekcja 10: Pobieranie danych strukturalnych z bloków
Możemy iterować bloki (Gutenberg) w poście i wyodrębniać atrybuty z głębi struktury bloków, udostępniając te atrybuty dowolnej funkcjonalności naszej witryny.
Na przykład, wyodrębniając wszystkie adresy URL obrazków zawarte w blokach core/image w poście, możemy utworzyć karuzelę obrazków ze wszystkimi tymi zdjęciami.
Ponadto, ponieważ atrybuty bloku stają się teraz powszechnie dostępne (poza edytorem bloków), możemy traktować je jako prawdziwie ustrukturyzowaną treść i udostępniać je przez API, aby zasilać wszystkie nasze aplikacje (takie jak aplikacja mobilna czy newsletter).
Pozwala nam to traktować bloki jako jedyne źródło prawdy dla całej naszej treści i dystrybuować ją za pośrednictwem różnych mediów i aplikacji zgodnie ze strategią COPE ("Create Once, Publish Everywhere").
Ta lekcja tutorialu demonstruje, jak pobrać adresy URL obrazków ze wszystkich bloków core/image w poście.
Wyodrębnianie adresów URL obrazków ze wszystkich bloków core/image w poście
Ta query GraphQL używa pola blockFlattenedDataItems, aby pobrać wszystkie bloki w poście (w tym bloki wewnętrzne), filtrując je według typu core/image. Następnie iteruje wszystkie wpisy, wyodrębnia właściwość attributes.url z każdego z nich i używa jej do nadpisania wartości pola. Na końcu usuwa zduplikowane adresy URL (na wypadek, gdy dwa bloki core/image używają tego samego obrazka) za pomocą @arrayUnique:
query GetImageBlockImageURLs($postID: ID!) {
post(by: { id: $postID } ) {
coreImageURLs: blockFlattenedDataItems(
filterBy: { include: "core/image" }
)
@underEachArrayItem(
passValueOnwardsAs: "blockDataItem"
)
@applyField(
name: "_objectProperty"
arguments: {
object: $blockDataItem,
by: {
path: "attributes.url"
}
}
setResultInResponse: true
)
@arrayUnique
}
}Odpowiedź to:
{
"data": {
"post": {
"coreImageURLs": [
"https://d.pr/i/fW6V3V+",
"https://gatographql.lndo.site/wp-content/uploads/2022/05/GatoGraphQL-logo-1024x622.jpg",
"https://gatographql.lndo.site/wp-content/uploads/2022/05/GatoGraphQL-logo-suki-1024x598.webp"
]
}
}
}@underEachArrayItem (dostarczany przez rozszerzenie Field Value Iteration and Manipulation) jest dyrektywą kompozycyjną (lub „meta-dyrektywą", czyli dyrektywą, która może zawierać zagnieżdżone dyrektywy), która iteruje po tablicy elementów i stosuje swoją zagnieżdżoną dyrektywę do każdego z nich.
@underEachArrayItem pomaga łączyć typy GraphQL, ponieważ może sprawić, że pole zwracające wartość [String] będzie mogło przyjąć dyrektywę, która oczekuje wartości String jako wejścia (lub inne kombinacje).
Na przykład w poniższej query:
- Pole
User.capabilitieszwraca[String] - Dyrektywa
@strUpperCaseprzyjmujeString
Dzięki @underEachArrayItem możemy przekonwertować wszystkie elementy capabilities na wielkie litery:
{
user(by: { id: 3 }) {
capabilities
@underEachArrayItem
@strUpperCase
}
}...dając wynik:
{
"data": {
"user": {
"capabilities": [
"LEVEL_0",
"READ",
"READ_PRIVATE_EVENTS",
"READ_PRIVATE_LOCATIONS"
]
}
}
}