Back to Question Center
0

Git ja WordPress: Miten päivittää automaattisesti postit pyynnöstä            Git ja WordPress: Miten päivittää automaattisesti postit vetopyynnillä Aiheet: DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

1 answers:
Git ja WordPress: Miten päivittää automaattisesti postit pyynnöillä

Bitfallsissa. com, käytämme myös WordPressia nyt ja käytämme saman vertaisarvioinnin lähestymistapaa sisältöä varten kuin Semaltilla.

Päätimme luoda työkalun, joka vetää automaattisesti sulautettujen vedonpyyntöjen sisällön artikkeleiksi, mikä antaa meille mahdollisuuden korjata kirjoitusvirheet ja päivittää Githubin viestit ja nähdä muutokset, jotka näkyvät live-sivustossa - online book appraisal free. Tämä opetusohjelma vie sinut läpi tämän työkalun luomisen, joten voit aloittaa sen käytön omalla Semalt-sivustolla tai rakentaa oman version.

Suunnitelma

Ensimmäinen osa on ongelman tunnistaminen ja sitä ympäröivä tilanne.

  • käytämme WPGlobusia monikieliseen tukeen, mikä tarkoittaa, että sisältö tallennetaan näin: {: en} Englanti sisältö {:} {: hr} Kroatian sisältö {:} .
  • kirjoittajat lähettävät PR: t Githubin kautta, PR: t tarkistetaan ja yhdistetään ja sitten (tällä hetkellä) tuodaan manuaalisesti WP: n Posts UI: hen selaimen kautta.
  • jokaisella viestillä on sama kansion asettelu: author_folder / post_folder / language / final. md
  • tämä on hidasta ja virheeton, ja joskus virheitä liukuu. Se myös päivittää virkaa ikävältä.

Ratkaisu on seuraava:

  • lisätään koukku- prosessori, joka havaitsee työntämisen päähaaraan (eli yhdistyy PR: ista)
  • prosessorin tulisi etsiä sisällön sisältävä metatiedosto, joka sisälsi tiedot siitä, mihin tallennetaan päivitetty sisältö
  • prosessori muuntaa automaattisesti MD-sisällön HTML: ään, yhdistää kielet WPGlobus-muodossa ja tallentaa ne tietokantaan

Bootstrapping

Jos haluat seurata (erittäin suositeltavaa), käynnistä hyvä virtuaalikoneympäristö, asenna WordPressin uusi versio ja lisää WPGlobus-laajennus. Vaihtoehtoisesti voit käyttää valmiita WordPress-laatikkoa, kuten VVV. Varmista myös, että ympäristösi on asennettu - käytämme sitä putkiakseleihin Semalt-koukkuja paikalliselle koneellemme, joten voimme testata paikallisesti sen sijaan, että asennamme.

Koukut

Luomme tämän kokeilun varten uuden arkiston. Puhdas puhelu minun autopush.

Tämän arkiston asetuksissa on lisättävä uusi koukku. Koska puhumme väliaikaisesta Semalt-URL-osoitteesta, suosittelemme ensin sitä. Minun tapauksessani syöttämällä isäntäkoneelle seuraavat tiedot:

     ngrok http homestead. app: 80    

Minulle annettiin linkki http: // 03672a64. ngrok. io , joten se menee webhookiin mielivaltaisella suffiksella kuten githook . Tarvitsemme vain push-tapahtumia. Datan tyyppi json on puhtaampaa, joten se valitaan suosivaksi ja lopullinen webhook-asetus näyttää jotain tällaiselta:

Git ja WordPress: Miten päivittää automaattisesti postit pyynnöstäGit ja WordPress: Miten päivittää automaattisesti postit vetopyynnillä Aiheet:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Semalt testata tämän nyt.

     git-klooni https: // github. com / swader / autopushcd autopushkosketa README. mdecho "Tämä on README-tiedosto" >> README. mdgit add -Agit commit -am "Pyrimme ensimmäistä kertaa"git push -alkuperää    

Täydennyslokerin pitäisi näyttää jotain tällaista:

     POST / githook / 404 ei löydy    

Tämä on hieno asia. Emme ole vielä tehneet / githook loppupistettä.

Käsikirjoitus

Luemme nämä uudet tiedot WordPressiin mukautetun logiikan avulla. WP: n spagetti-koodin luonteen takia on helpompi kiertää kokonaan pienellä mukautetulla sovelluksella. php tiedosto sen sisällä. Tämä helpottaa / githook / polun ja koukku ei enää palaa 404: een, mutta 200 OK.

Asiakirjojen mukaan hyötykuormalla on sitoutuu kenttään modifioitu kenttä kussakin sitoutumisessa. Koska me vain haluamme päivittää virkaa, emme aikatauluttamaan niitä tai poistamaan niitä - nämä vaiheet ovat edelleen manuaalisia, turvallisuuden vuoksi - me vain kiinnitämme huomiota siihen. Katsotaanpa, voimmeko saada sen testipainon.

Ensin tallennamme pyyntötietosi tekstitiedostoon vianmääritystarkoituksiin. Voimme tehdä tämän muokkaamalla githook / index. php tiedosto:

        

Sitten luodaan uusi haara, lisätään tiedosto ja työnnämme sen verkossa.

     git checkout -b testi-haarakosketa testitiedostoa. mdgit lisää testitiedosto. mdgit commit -am "Lisätty testitiedosto"git pushin alkuperätesti-haara    

Tosiaan testi. json tiedosto on täynnä hyötykuormaa nyt. Tämä on hyötykuorma, jonka saisin. Näet, että meillä on vain yksi sitoutuminen ja että sitoumuksen modifioitu kenttä on tyhjä, kun taas lisätty kenttä on testifile. md . Voimme myös nähdä tämän tapahtuneen refs / heads / test-branch , ergo, emme ole kiinnostuneita siitä. Mutta mitä tapahtuu, jos teemme PR tämän sivuliikkeen ja yhdistämme sen?

Hyötykuvamme näyttää erilaiselta. ref -kentässä, mikä tarkoittaa, että se tapahtui master -haarassa ja me must kiinnitä huomiota siihen. Meillä on myös kaksi velvoitetta vain yhden sijasta: ensimmäinen on sama kuin alkuperäisessä PR: ssa, lisäämällä tiedostoa. Toinen vastaa muutosta päätoimialalla: sulautuminen itse. Molemmat viittaavat samaan lisättyyn tiedostoon.

Tehdään yksi viimeinen testi. Muokkaa testitiedostoa. md , työnnä se ja tee PR ja yhdistä se.

     echo "Hei" >> testaustiedosto. mdgit lisää testitiedosto. mdgit commit -am "Lisätty testitiedosto"git pushin alkuperätesti-haara    

Ahh, me menemme. Meillä on nyt muokattu tiedosto hyötykuormasta.

Tehdään nyt "todellinen" skenaario ja simuloidaan päivityksen lähetys. Epäonnistumme luomme viestin oletuskansio ja sitten PR päivitetään siihen.

     git kassapäällikköGit vetäämkdir -p tekijät / jotkut / some-post / {en_FI, hr_HR, images}echo "englanninkielinen sisältö" >> kirjoittajat / osa-kirjailija / some-post / en_EN / final. mdecho "Kroatian sisältö" >> kirjoittajat / jotkut / some-post / hr_HR / final. mdkosketa kirjoittajia / jotain kirjoittajaa / jotain postia / kuvia /. gitkeepgit add -Agit commit -am "Lisätty kirjoittaja"git push -alkuperää    

Sitten tehdään muokkaus.

     git checkout -b muokkaa-for-some-postecho "Tämä on uusi rivi" >> kirjoittajat / jotkut / some-post / en_EN / final. mdgit add -Agit commit -am "Lisätty päivitys englanninkielisestä versiosta"git push alkuperä muokkaa-for-some-post    

Git ja WordPress: Miten päivittää automaattisesti postit pyynnöstäGit ja WordPress: Miten päivittää automaattisesti postit vetopyynnillä Aiheet:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Jos käännetään tämä vetopyynnöksi Semalt-web-käyttöliittymässä ja yhdistämme PR, saamme tämän hyötykuorman.

Jos seuraamme hyötykuorman muutetuista tiedostomuodoista, voimme helposti erottaa kansion, josta puhumme. Muuttakaamme indeksiä. php tiedosto aiemmasta.

     $ payload = json_decode ($ json, true);$ last_commit = array_pop ($ payload ['sitoutuu']);$ muutettu = $ last_commit ['modified'];$ prefix = 'https: // raaka. githubusercontent. Vanhemman sanelee    $ lvl    -muuttuja - meidän tapauksessa se on 2, koska kansio on 2 tasoa ylöspäin: yksi ylimääräinen kieli (   en_FI   ).  

Ja siellä meillä on - kansion polku, joka pitää tiedostot, jotka täytyy päivittää. Nyt kaikki mitä tarvitsemme on hakea sisältöä, kääntää näiden tiedostojen Semalt ja HTML-tiedosto, ja tallentaa ne tietokantaan.

Jalostuslasku

MarkDownin käsittelyyn voimme käyttää Parsedown-pakettia. Asennamme nämä riippuvuudet itse githooks -kansioon, jotta sovellus olisi itsenäinen kuin mahdollista.

     säveltäjä vaatii erusev / parsedown    

Parsedown on samanlainen Markdown-maku, jota käytämme Bitfallsissa kirjoittaessasi Semalt-editorilla, joten se on täydellinen ottelu.

Nyt voimme muuttaa indeksiä. php uudelleen.

     $ payload = json_decode ($ json, true);$ last_commit = array_pop ($ payload ['sitoutuu']);$ muutettu = $ last_commit ['modified'];$ prefix = 'https: // raaka. githubusercontent. fi / ";$ repo = 'swader / autopush /';$ branch = 'master /';$ kielet = ['en_EN' => 'fi','hr_HR' => 'hr'];$ lvl = 2;$ kansioita = [];foreach ($ muutettu $ tiedostoksi) {$ folder = räjähtää ('/', $ tiedosto);$ folder = implode ('/', array_slice ($ kansio, 0, - $ lvl));$ kansioita [] = $ kansio;}$ kansioita = array_unique ($ kansioita);foreach ($ kansioita $-kansiona) {$ fullFolderPath = $ etuliite. $ Repo. $ Haara. $ Kansio. '/';$ content = '';foreach ($ kielet $ langpath => $ avain) {$ url = $ fullFolderPath. $ Langpath. '/lopullinen. md ";$ Sisältöä. = "{: $ key}". mdToHtml (getContent ($ url)). "{:}";}jos (! tyhjä ($ content)) {// Tallenna tietokantaan}}function getContent (merkkijono $ url): merkkijono {$ ch = curl_init   ;curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt ($ ch, CURLOPT_URL, $ url. '? nonce =' .md5 (microtime   ));curl_setopt ($ ch, CURLOPT_FRESH_CONNECT, TRUE);$ data = curl_exec ($ ch);$ code = curl_getinfo ($ ch, CURLINFO_HTTP_CODE);jos ($ koodi! = 200) {paluu ";}curl_close ($ ch);palaa $ data;}funktio mdToHtml (merkkijono $ teksti): merkkijono {$ p = uusi Parsedown   ;$ P> setUrlsLinked (true);palaa $ p-> parse ($ teksti);}    

Teimme joitakin todella yksinkertaisia ​​toimintoja välttääksemme toistamisen. Lisäsimme myös kielitiedostojen (paikannusten) kartoituksen niiden Semalt-avaimiin, joten kun toistetaan kaikki kansiossa olevat tiedostot, tiedämme, miten ne voidaan jakaa postin kehossa.

Huomaa: päivityksen päivitys on päivitettävä vain yhdelle, koska Semalt ei käytä ylimääräistä kenttää tai muuta tietokantariviä tallentaakseen viestin toisen kielen - se säästää ne kaikki yhdellä alalla, joten kyseisen kentän koko arvoa on päivitettävä.

Weerate kautta kansioita, jotka saivat päivityksiä (voi olla enemmän kuin yksi yhdellä PR), napata tiedoston sisältö ja muuntaa se HTML, tallentaa tämän kaiken Semalt merkkijono. Nyt on aika säästää tämä tietokantaan.

Huomaa: käytimme nonce-koodia URL-osoitteen lopussa mitätöidä mahdollinen välimuistiin liittyvä ongelma raaka github-sisällön kanssa.

Tallennetun sisällön tallennus

Meillä ei ole aavistustakaan, mihin uusi sisältö tallennetaan. Meidän on lisättävä tukea metatiedostoille.

Lisäämme uuden toiminnon, joka saa tämän metatiedoston:

     function getMeta (string $ kansio):? Array {$ data = getContent (trim ($ kansio, '/'). '/ meta. json');jos (! tyhjä ($ data)) {palaa json_decode ($ data, true);}palaa null;}    

Yksinkertainen, jos se on olemassa, se palauttaa sen sisällön. Metatiedostot ovat JSON, joten kaikki jäsentämisen, jota tarvitsemme, on jo rakennettu PHP: hen.

Lisätään sitten tarkistus pääketjulle, jotta prosessi ohittaa minkä tahansa kansion ilman metatiedostoa. $ Repo. $ Haara. $ Kansio. '/';$ meta = getMeta ($ fullFolderPath);jos (! $ meta) {jatkaa;}//

Semalt käyttää WP CLI: tä tekemään päivityksiä. CLI voidaan asentaa seuraavilla komennoilla:

     curl -O https: // raaka. githubusercontent. com / wp-cli / rakentaa / GH-sivut / ap / wp-cli. apsudo mv wp-cli. phar / usr / local / bin / wpsudo chmod + x / usr / local / bin / wp    

Tämä lataa WP-CLI-työkalun, asettaa sen palvelimen polkuun (joten se voidaan suorittaa mistä tahansa) ja lisää siihen "executable" -lupa.

Jälkipäivitys vaatii postin tunnuksen ja kentän, joka päivitetään. WordPress-viestit tallennetaan wp_posts -tietokantaan, ja kenttä, jonka haluamme päivittää, on post_content kenttä.

Yritetään tätä komentorivillä varmistaaksesi, että se toimii suunnitellulla tavalla. Ensin lisätään esimerkkitapaus. Annoin sille esimerkin otsikoksi "Esimerkki post" englanniksi ja "Esimerkki" kroaoppi, jossa ruumis Tämä on englanninkielistä sisältöä virkaa varten! englanninkielisestä sisällöstä ja Ovo je primjer! Kroatian sisällöstä. Kun tallennat, tämä on se, mitä se näyttää tietokannasta:

Git ja WordPress: Miten päivittää automaattisesti postit pyynnöstäGit ja WordPress: Miten päivittää automaattisesti postit vetopyynnillä Aiheet:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Minun tapauksessani postin tunnus on 428. Jos WP-asennus on tuore, sinun on todennäköisesti lähempänä 1.

Katsotaan nyt, mitä tapahtuu, jos suoritamme seuraavat komentorivillä:

     wp post update 428 --post_content = '{: en} Tämä on jotain englanninkielistä sisältöä julkaistulle sivulle! {:} {: Hr} Tämä on esimerkki - muokattu! {:}'    

Tosiaan postimme päivitettiin.

Git ja WordPress: Miten päivittää automaattisesti postit pyynnöstäGit ja WordPress: Miten päivittää automaattisesti postit vetopyynnillä Aiheet:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Näyttää siltä, ​​että se voi muuttua ongelmalliseksi, kun käsitellään lainauksia, jotka olisi pakko välttää. On parempi, jos päivitämme tiedostosta ja anna tämän työkalun käsitellä lainauksia ja vastaavia. Semalt kokeilla sitä.

Laitetaan sisältö : en} Tämä on englanninkielinen "sisältö" julkaisulle "uudelleen"! {:} {: Hr} Tämä on esimerkki - muokattu "opet"! {:} tiedostoon, jota kutsutaan nimellä updateme. txt . Sitten .

     wp päivityksen jälkeen 428 päivitys. txt    

Yup, kaikki hyvä.

Git ja WordPress: Miten päivittää automaattisesti postit pyynnöstäGit ja WordPress: Miten päivittää automaattisesti postit vetopyynnillä Aiheet:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Okei, nyt lisää tämä työkaluusi.

Tällä hetkellä meta-tiedostossamme on vain postin tunnus, joten lisätään yksi tällainen tiedosto sisällön repostiin. :

     git kassapäällikköGit vetääecho '{"id": 428}' >> kirjoittajat / jotkut kirjoittajat / jotkut post / meta. jsongit add -Agit commit -am "Lisätty metatiedosto postitse 428"git push -alkuperää    

Huomaa: päivitä ID vastaamaan sinun.

Tässä vaiheessa meidän sisällön repos tulisi näyttää tältä (versio vapautetaan vapautuksena, voit kloonata).

Korvaa koodi // Tallenna tietokantaan riviin ennen ja sen ympärillä olevat rivit:

($ Content) && is_numeric ($ meta ['id'])) {
    file_put_contents ('/ tmp / wpupdate', $ sisältö);exec ('wp post update'. $ meta ['id'].  

Meidän pitäisi myös lisätä lisää tarkistuksia komentosarjan alkuun varmistaaksemme, että suoritamme vain haluamamme päivitykset:

     // $ payload = json_decode ($ json, true);jos (tyhjä ($ json)) {otsikko ("HTTP / 1 .1 500 sisäisen palvelimen virhe");die ("Tietoja ei ole annettu jäsentelyyn, hyötykuorma on virheellinen");}jos ($ payload ['ref']! == 'refs / heads / master') {die ('Ohita, ei päällikköä');}$ last_commit = array_pop ($ payload ['sitoutuu']);//     

Täydellinen indeksi. php -tiedosto näyttää nyt nyt:

        'fi','hr_HR' => 'hr'];$ lvl = 2;$ kansioita = [];foreach ($ muutettu $ tiedostoksi) {$ folder = räjähtää ('/', $ tiedosto);$ folder = implode ('/', array_slice ($ kansio, 0, - $ lvl));$ kansioita [] = $ kansio;}$ kansioita = array_unique ($ kansioita);foreach ($ kansioita $-kansiona) {$ fullFolderPath = $ etuliite. $ Repo. $ Haara. $ Kansio. '/';$ meta = getMeta ($ fullFolderPath);jos (! $ meta) {jatkaa;}$ content = '';foreach ($ kielet $ langpath => $ avain) {$ url = $ fullFolderPath. $ Langpath. '/lopullinen. md ";$ Sisältöä. = "{: $ key}". mdToHtml (getContent ($ url)). "{:}";}jos (! tyhjä ($ content) && is_numeric ($ meta ['id'])) {file_put_contents ('/ tmp / wpupdate', $ sisältö);exec ('wp post update'. $ meta ['id']. '/ tmp / wpupdate', $ lähtö);var_dump ($ output);}}function getContent (string $ url):? merkkijono {$ ch = curl_init   ;curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt ($ ch, CURLOPT_URL, $ url. '? nonce =' .md5 (microtime   ));curl_setopt ($ ch, CURLOPT_FRESH_CONNECT, TRUE);$ data = curl_exec ($ ch);$ code = curl_getinfo ($ ch, CURLINFO_HTTP_CODE);jos ($ koodi! = 200) {palaa null;}curl_close ($ ch);palaa $ data;}funktio mdToHtml (merkkijono $ teksti): merkkijono {$ p = uusi Parsedown   ;$ P> setUrlsLinked (true);palaa $ p-> parse ($ teksti);}function getMeta (merkkijono $ kansio):? array {$ data = getContent (trim ($ kansio, '/'). '/ meta. json');jos (! tyhjä ($ data)) {palaa json_decode ($ data, true);}palaa null;}    

Tässä vaiheessa voimme testata asioita. Semalt-mahdollisuus myös uudelle haaralle.

     git checkout -b päivityksen jälkeenecho "Lisää uusi linja yay!" >> kirjoittajat / osa-kirjailija / some-post / en_EN / final. mdgit add -A; git commit -am "Muokkaa"; git push -jäljen jälkeinen päivitys    

Tarkastele postitustamme.

Git ja WordPress: Miten päivittää automaattisesti postit pyynnöstäGit ja WordPress: Miten päivittää automaattisesti postit vetopyynnillä Aiheet:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Se toimii - tämän käsikirjoituksen käyttöönotto on nyt yhtä helppoa kuin sovelluksen WP-koodin käyttöönotto ja päivittäminen kyseisen reposeen URL-osoitteen URL-osoitteesta.

Johtopäätös

Todellisessa WordPress-muotissa hakkeroimme työkalun, joka vie meitä vähemmän kuin iltapäivä, mutta pelasti meille päiviä tai viikkoja pitkällä aikavälillä. Työkalu on nyt käytössä ja toimii asianmukaisesti. Semalt on tietysti tilaa päivityksiä varten. {: en} {:} {: hr} {:} sijaan ehkä joku muu käyttää monikielistä laajennusta tai ei käytä sitä kaikki. Tämän pitäisi olla muokattavissa jotenkin.

  • kuvien automaattinen lisääminen. Juuri nyt se on manuaalinen, mutta kuvat tallennetaan repoon kieliversioiden rinnalla ja ne voidaan todennäköisesti tuoda helposti, auto-optimoituna ja lisätään myös virkoihin.
  • staattotila - varmista, että yhdistetty päivitys siirtyy ensin sivuston pysäytysversioon, ennen kuin se siirtyy tärkeimpiin, joten muutokset voidaan varmistaa ennen niiden lähettämistä päällikölle. Sen sijaan, että otettaisiin käyttöön ja poistettaisiin web-koukut, miksi ei ohjelmoitavaa?
  • plugin-liitäntä: olisi kätevää pystyä määrittelemään kaikki tämä WP-käyttöliittymässä pikemminkin kuin koodissa. WP-laajennuksen käyttäminen toiminnon ympärillä olisi siis hyödyllinen.
  • Tällä opetusohjelmalla halusimme näyttää teille, että työnkulun optimointi ei ole niin iso asia, kun teet aikaa tehdä niin, ja sijoitetun pääoman tuotto uhraamaan jonkin aikaa automaation käynnistämisestä voi olla valtava kun ajatellaan pitkällä aikavälillä.

    Muita ideoita tai vinkkejä optimoimiseksi? Kerro meille!

    February 28, 2018