Asetuskäyttöliittymän luominen mukautetulle WordPress-lohkon PlatoBlockchain Data Intelligencelle. Pystysuuntainen haku. Ai.

Asetuskäyttöliittymän luominen mukautetulle WordPress-lohkolle

Tähän mennessä olemme käsitelleet ulkoisen API:n tietojen käsittelyä mukautetussa WordPress-lohkossa. Kävelimme prosessin läpi noutamalla nämä tiedot etupäässä käytettäväksi WordPress-sivustosta ja miten renderöi se suoraan WordPress Block Editorissa kun sijoitat lohkon sisältöön. Tällä kertaa aiomme yhdistää nämä kaksi artikkelia kytkemällä lohkoeditorin ohjauspaneeliin luodaksemme asetuskäyttöliittymän tekemällemme lohkolle.

Työskentely ulkoisten API:iden kanssa WordPress-lohkoissa

Tiedätkö ohjauspaneelin, johon tarkoitan, eikö niin? Oikealla oleva paneeli sisältää viesti- ja estoasetukset lohkoeditorissa.

Asetuskäyttöliittymän luominen mukautetulle WordPress-lohkolle

Näetkö tuon punaisella korostetun alueen? Se on ohjauspaneeli. Kappalelohko on tällä hetkellä valittuna ja sen asetukset näkyvät paneelissa. Voimme vaihtaa tyylejä, värejä, typografiaa… monia asioita!

No, juuri sitä me teemme tällä kertaa. Aiomme luoda säätimet Football Rankings -lohkon asetuksille, joita työskentelimme kahdessa edellisessä artikkelissa. Viime kerralla teimme lohkoomme painikkeen, joka hakee ulkoiset tiedot jalkapallon rankingista. Tiesimme jo tarvitsemamme URL-osoitteen ja päätepisteet. Mutta entä jos haluamme hakea sijoituksen toiselle maalle? Tai kenties eri liiga? Entä eri kauden tiedot?

Tarvitsemme lomakehallintaa tehdäksemme sen. Voisimme hyödyntää interaktiivisia React-komponentteja - kuten Reagoi-Valitse — selata erilaisia ​​API-vaihtoehtoja, jotka ovat käytettävissä näiden tietojen jäsentämiseksi. Mutta sille ei ole tarvetta, sillä WordPressin mukana tulee joukko ydinkomponentteja, joihin liitämme suoraan!

- dokumentointi näille komponenteille - ns InspectorControls - on paranemassa WordPress Block Editorin käsikirja. Se paranee ajan myötä, mutta sillä välin meillä on myös WordPress Gutenbergin tarinakirja ja WordPressin Gutenbergin komponentit sivustoja lisäapua varten.

API-arkkitehtuuri

Ennen kuin puutumme mihinkään, on hyvä idea kartoittaa, mitä tarvitsemme. Olen kartoittanut haemme RapidAPI-tietojen rakenteen, jotta tiedämme, mitä meillä on saatavilla:

Vuokaavio, joka yhdistää haettavien mukautettujen WordPress-lohkotietojen API-päätepisteet.
Pistetilanne: API-jalkapallo

Vuodenajat ja maat ovat kaksi huipputason päätepistettä, jotka liittyvät liigan päätepisteeseen. Sieltä meillä on loput tiedoista, joita käytämme jo sijoitustaulukon täyttämiseen. Haluamme siis luoda WordPress Block Editorissa asetukset, jotka suodattavat tiedot kauden, maan ja liigan mukaan ja välittävät sitten suodatetut tiedot ranking-taulukkoon. Tämä antaa meille mahdollisuuden pudottaa lohkon millä tahansa WordPress-sivulla tai viestissä ja näyttää muunnelmia lohkon tiedoista.

Saadaksemme sijoitukset meidän on ensin saatava liigat. Ja saadaksemme liigat, meidän on ensin hankittava maat ja/tai vuodenajat. Voit tarkastella erilaisia ​​päätepisteitä RapidAPI-hallintapaneelissa.

Koko näyttö Rapid API -hallintapaneelille, joka visualisoi API-tiedot.
Asetuskäyttöliittymän luominen mukautetulle WordPress-lohkolle

On olemassa erilaisia ​​​​datayhdistelmiä, joita voimme käyttää sijoituksen täyttämiseen, ja saatat valita, mitä tietoja haluat. Tämän artikkelin vuoksi aiomme luoda seuraavat vaihtoehdot lohkoasetuspaneeliin:

  • Valitse maa
  • Valitse Liiga
  • Valitse Kausi

Sitten meillä on painike, jolla voit lähettää valinnat ja hakea tarvittavat tiedot ja siirtää ne sijoitustaulukkoon.

Lataa ja tallenna luettelo maista

Emme voi valita, mistä maasta haluamme tietoja, jos meillä ei ole luetteloa maista, joista valita. Joten ensimmäinen tehtävämme on napata luettelo maista RapidAPI:sta.

Ihanteellinen asia on noutaa luettelo maista, kun lohkoa todella käytetään sivulla tai julkaisussa. Mitään ei tarvitse hakea, jos lohko ei ole käytössä. Lähestymistapa on hyvin samanlainen kuin mitä teimme ensimmäinen artikkeli, erona on se, että käytämme eri API-päätepistettä ja eri attribuutteja palautettujen maiden luettelon tallentamiseen. On olemassa muita WordPress-tapoja hakea tietoja, kuten api-haku, mutta se ei kuulu toimintamme piiriin.

Voimme joko sisällyttää maaluettelon manuaalisesti sen jälkeen, kun se on kopioitu API-tiedoista, tai voimme käyttää erillistä sovellusliittymää tai kirjastoa maiden täyttämiseen. Mutta käyttämämme API sisältää jo luettelon maista, joten käyttäisin vain yhtä sen päätepisteistä. Varmistetaan, että alkuperäinen maaluettelo latautuu, kun lohko lisätään sivulle tai julkaistaan ​​sisältöä lohkoeditorissa:

// edit.js
const [countriesList, setCountriesList] = useState(null);

useEffect(() => {
  let countryOptions = {
    method: "GET",
    headers: {
      "X-RapidAPI-Key": "Your Rapid API key",
      "X-RapidAPI-Host": "api-football-v1.p.rapidapi.com",
    },
  };
  fetch("https://api-football-v1.p.rapidapi.com/v3/countries", countryOptions)
    .then( (response) => response.json() )
    .then( (response) => {
      let countriesArray = { ...response };
      console.log("Countries list", countriesArray.response);
      setCountriesList(countriesArray.response);
    })
  .catch((err) => console.error(err));
}, []);

Meillä on tilamuuttuja maiden luettelon tallentamiseen. Seuraavaksi tuomme komponentin tiedostosta @wordpress/block-editor nimeltään paketti InspectorControls siellä sijaitsevat kaikki komponentit, joita tarvitsemme asetusten säätimien luomiseen.

import { InspectorControls } from "@wordpress/block-editor";

Paketin GitHub repo tekee hyvää selittämistä InspectorControls. Esimerkissämme voimme käyttää sitä hallitsemaan API-tietoasetuksia, kuten maa, liiga ja kausi. Tässä on esikatselu, jotta saat käsityksen tekemästämme käyttöliittymästä:

WordPress-lohkon mukautettujen asetusten käyttöliittymä, joka näyttää mukautetun lohkon kolme asetusvaihtoehtoa ja sinisen painikkeen tietojen hakemista varten.
Asetuskäyttöliittymän luominen mukautetulle WordPress-lohkolle

Ja kun nämä valinnat on tehty lohkoasetuksissa, käytämme niitä lohkon Edit toiminto:


  { countriesList && (
    
  )}

Tässä varmistan, että käytämme ehdollista renderöintiä niin, että toiminto lataa vain komponentin jälkeen maiden luettelo on ladattu. Jos sitä ihmettelet LeagueSettings komponentti, se on mukautettu komponentti, jonka loin erillisenä components alikansio lohkossa, jotta voimme olla puhtaampia ja järjestäytyneempiä Edit toiminto satojen rivejen sijasta maatietoja käsitellä yhdessä tiedostossa.

Nykyisen tiedoston näyttävän lohkohakemiston tiedostorakenne.
Asetuskäyttöliittymän luominen mukautetulle WordPress-lohkolle

Voimme tuoda sen sisään edit.js tiedosto näin:

import { LeagueSettings } from "./components/LeagueSettings";

Seuraavaksi välitämme tarvittavat rekvisiitta LeagueSettings komponentti vanhemmalta Edit komponentti, jotta voimme käyttää tilamuuttujia ja attribuutteja LeagueSettings lapsikomponentti. Voimme tehdä sen myös muilla menetelmillä, kuten Konteksti-sovellusliittymä välttääksemme potkuriporauksen, mutta se, mitä meillä on tällä hetkellä, sopii täydellisesti siihen, mitä teemme.

Muut osat Edit Toiminto voidaan myös muuntaa komponenteiksi. Esimerkiksi sarjataulukon koodi voidaan laittaa erillisen komponentin sisään - kuten ehkä LeagueTable.js - ja sitten tuodaan aivan kuten toimme LeagueSettings osaksi Edit toiminto.

Sisällä LeagueSettings.js tiedosto

LeagueSettings on aivan kuin toinen Reagoi komponentti josta voimme tuhota emokomponentin rekvisiitta. Aion käyttää kolmea tilamuuttujaa ja ylimääräistä leagueID tilassa, koska aiomme poimia tunnuksen league esine:

const [country, setCountry] = useState(null);
const [league, setLeague] = useState(null);
const [season, setSeason] = useState(null);
const [leagueID, setLeagueID] = useState(null);

Ensimmäinen asia, jonka aiomme tehdä, on tuoda PanelBody komponentti @wordpress/block-editor-paketista:

import { PanelBody } from "@wordpress/block-editor";

…ja sisällytä se joukkoomme return toiminto:

On muut paneelitunnisteet ja attribuutit - On vain henkilökohtainen mieltymys käyttää näitä. Mitään muita ei vaadita… mutta katso kaikki komponentit meillä on mahdollisuus tehdä asetuspaneeli! Pidän yksinkertaisuudesta PanelBody meidän käyttötapauksellemme. Se laajenee ja kutistuu paljastaen lohkon pudotusvalikon asetukset, ja siinä kaikki.

Siitä puheen ollen, meillä on valinnanvaraa näiden valintojen osalta. Voisimme käyttää SelectControl komponentti tai a ComboBoxControl, jota asiakirjat kuvailevat "parannelluksi versioksi a SelectControl, jonka lisäksi voit etsiä vaihtoehtoja hakusyötteen avulla." Se on meille mukavaa, koska maiden luettelo voi olla melko pitkä ja käyttäjät voivat joko tehdä hakukyselyn tai valita luettelosta.

Tässä on esimerkki siitä, kuinka a ComboboxControl voisi toimia maaluettelossamme:

 handleCountryChange(value) }
  onInputChange={ (inputValue) => {
    setFilteredCountryOptions(
      setupCountrySelect.filter((option) =>
        option.label
          .toLowerCase()
          .startsWith(inputValue.toLowerCase())
      )
    );
  }}
/>

- ComboboxControl on konfiguroitavissa siinä mielessä, että voimme käyttää eri kokoja ohjausobjektin tunnisteelle ja arvoille:

{
  value: 'small',
  label: 'Small',
},

Mutta API-tietomme eivät ole tässä syntaksissa, joten voimme muuntaa countriesList taulukko, joka tulee pääkomponentista, kun lohko sisällytetään:

let setupCountrySelect;

setupCountrySelect = countriesList.map((country) => {
  return {
    label: country.name,
    value: country.name,
  };
});

Kun maa on valittu joukosta ComboboxControl, maan arvo muuttuu ja suodatamme tiedot sen mukaisesti:

function handleCountryChange(value) {
  // Set state of the country 
  setCountry(value); 

  // League code from RapidAPI
  const options = {
    method: "GET",
    headers: {
      "X-RapidAPI-Key": "Your RapidAPI key",
      "X-RapidAPI-Host": "api-football-v1.p.rapidapi.com",
    },
  };

  fetch(`https://api-football-v1.p.rapidapi.com/v3/leagues?country=${value}`, options)
    .then((response) => response.json())
    .then((response) => {
      return response.response;
    })
    .then((leagueOptions) => {
      // Set state of the league variable
      setLeague(leagueOptions);

      // Convert it as we did for Country options
      setupLeagueSelect = leagueOptions.map((league) => {
        return {
          label: league.league.name,
          value: league.league.name,
        };
      });
      setFilteredLeagueOptions(setupLeagueSelect);
    })
  .catch((err) => console.error(err));
}

Huomaa, että käytän kolmea muuta tilamuuttujaa muutosten käsittelemiseen, kun maan valinta muuttuu:

const [filteredCountryOptions, setFilteredCountryOptions] = useState(setupCountrySelect);
const [filteredLeagueOptions, setFilteredLeagueOptions] = useState(null);
const [filteredSeasonOptions, setFilteredSeasonOptions] = useState(null);

Entä muut asetusvaihtoehdot?

Näytän koodin, jota käytin muissa asetuksissa, mutta se vain ottaa normaalit tapaukset huomioon määritellessään virheitä erikoistapauksille. Esimerkiksi joissakin maissa ja liigoissa on virheitä, koska:

  • joissakin liigoissa ei ole sijoituksia, ja
  • joillakin liigoilla on sijoitukset, mutta ne eivät ole yhdessä taulukossa.

Tämä ei ole JavaScript- tai React-opetusohjelma, joten annan sinun käsitellä erikoistapauksia API:lle, jota aiot käyttää:

function handleLeagueChange(value) {
  setLeague(value);
  if (league) {
    const selectedLeague = league.filter((el) => {
      if (el.league.name === value) {
        return el;
      }
    });

    if (selectedLeague) {
      setLeague(selectedLeague[0].league.name);
      setLeagueID(selectedLeague[0].league.id);
      setupSeasonSelect = selectedLeague[0].seasons.map((season) => {
        return {
          label: season.year,
          value: season.year,
        };
      });
      setFilteredSeasonOptions(setupSeasonSelect);
    }
  } else {
    return;
  }
}

function handleSeasonChange(value) {
  setSeason(value);
}

Asetusten valintojen lähettäminen

In viimeinen artikkeli, teimme lohkoeditoriin painikkeen, joka hakee tuoretta dataa API:sta. Sitä ei enää tarvita nyt, kun meillä on asetukset. No, me tarvitsemme sitä – vain emme siellä, missä se tällä hetkellä on. Sen sijaan, että se olisi suoraan lohkoeditorissa hahmonnetussa lohkossa, siirrämme sen PanelBody komponenttia asetusten valintojen lähettämiseen.

Eli takaisin sisään LeagueSettings.js:

// When countriesList is loaded, show the country combo box
{ countriesList && (
   handleCountryChange(value)}
    onInputChange={(inputValue) => {
      setFilteredCountryOptions(
        setupCountrySelect.filter((option) =>
          option.label
            .toLowerCase()
            .startsWith(inputValue.toLowerCase())
        )
      );
    }}
  />
)}

// When filteredLeagueOptions is set through handleCountryChange, show league combobox
{ filteredLeagueOptions && (
   handleLeagueChange(value)}
    onInputChange={(inputValue) => {
      setFilteredLeagueOptions(
        setupLeagueSelect.filter((option) =>
          option.label
            .toLowerCase()
            .startsWith(inputValue.toLowerCase())
        )
      );
    }}
  />
)}

// When filteredSeasonOptions is set through handleLeagueChange, show season combobox
{ filteredSeasonOptions && (
  
     handleSeasonChange(value)}
      onInputChange={
          (inputValue) => {
            setFilteredSeasonOptions(
              setupSeasonSelect.filter((option) =>
              option.label
              .toLowerCase()
              .startsWith(inputValue.toLowerCase()
            )
          );
        }
      }
    />

    // When season is set through handleSeasonChange, show the "Fetch data" button
    {
      season && (
        
      )
    }
    
  
)}

Tässä tulos!

Olemme lohkomme kanssa erittäin hyvässä paikassa. Voimme renderoida sen lohkoeditorissa ja sivuston etuosassa. Voimme hakea tietoja ulkoisesta API:sta luomiemme asetusten perusteella, jotka suodattavat tiedot. Se on ihan hirveän toimiva!

Mutta on toinen asia, johon meidän on puututtava. Juuri nyt, kun tallennamme lohkon sisältävän sivun tai viestin, estolle valitsemamme asetukset nollataan. Toisin sanoen niitä valintoja ei tallenneta minnekään. Näistä valinnoista on vielä vähän työtä. Sinne aiomme mennä seuraavassa artikkelissa, joten pysy kuulolla.

Aikaleima:

Lisää aiheesta CSS-temppuja