Back to Question Center
0

Git a WordPress: Ako automaticky aktualizovať príspevky s požiadavkami na vytiahnutie            Git a WordPress: Ako automaticky aktualizovať príspevky s vytiahnutými žiadosťami súvisiace témy: DatabaseDevelopment EnvironmentSecurityDrupalDebugging &

1 answers:
Git a WordPress: Ako automaticky aktualizovať príspevky s požiadavkami na vytiahnutie

V službe Bitfalls. com, taktiež používame WordPress a používame rovnaký prístup na porovnávanie obsahu ako v Semalt.

Rozhodli sme sa vytvoriť nástroj, ktorý automaticky pretiahne obsah z zlúčených žiadostí o stiahnutie do článkov, čo nám umožní opraviť chyby a aktualizovať príspevky od spoločnosti Github a zistiť zmeny, ktoré sa odrážajú na živom webe. Tento tutoriál vás prevedie vytvorením tohto nástroja, takže ho môžete začať používať na vlastnom webe Semalt alebo si vytvoriť vlastnú verziu.

Plán

Prvá časť identifikuje problém a situáciu, ktorá ho obklopuje.

  • používame program WPGlobus na podporu viacerých jazykov, čo znamená, že obsah sa takto ukladá takto: {: en} obsah v angličtine {:} {: hr} Chorvátsky obsah {:} - manual fotografia principiantes.
  • autori predkladajú PR cez Github, PR sú recenzované a zlúčené a následne (v súčasnosti) manuálne importované do používateľského rozhrania WP Posts prostredníctvom prehliadača.
  • každý príspevok má rovnaké rozloženie priečinka: folder_folder / post_folder / language / final. md
  • je to pomalá a náchylná k chybám, a niekedy chyby prekrývajú. Taktiež robia aktualizácie príspevkov zdĺhavými.

Riešenie je nasledovné:

  • pridať hákový procesor, ktorý detekuje tlaky na hlavnú vetvu (tj zlučuje sa s PR)
  • by mal procesor vyhľadávať súbor meta v správe, ktorý by obsahoval informácie o tom, kde sa má uložiť aktualizovaný obsah
  • procesor automaticky prevádza obsah MD do HTML, spája jazyky vo formáte WPGlobus a uloží ich do databázy

Bootstrapping

Ak by ste chceli nasledovať (odporúča sa), zavádzajte dobré prostredie virtuálneho počítača, nainštalujte najnovšiu verziu programu WordPress a pridajte doplnok WPGlobus. Prípadne môžete použiť pripravené pole WordPress ako VVV. Okrem toho sa uistite, že vaše prostredie má ngrok nainštalované - použijeme ho na potrubie Semalt háčik spúšťa do nášho lokálneho počítača, takže môžeme testovať lokálne namiesto toho, aby sme museli nasadiť.

Háčiky

V tomto experimente vytvoríme nové úložisko. Semaltom zavolajte moju autopúš.

V nastaveniach tohto úložiska musíme pridať nový háčik. Pretože hovoríme o dočasnej adrese Semalt, najprv to urobíme. V mojom prípade zadanie nasledujúcich položiek na hostiteľskom počítači robí trik:

ngrok http homestead. Aplikácia: 80

Dostal som odkaz http: // 03672a64. ngrok. io , takže to je to, čo ide do webhook, s ľubovoľnou príponou ako githook . Potrebujeme iba udalosti push. Dátový typ json je čistejší, takže je zvolený ako predvoľba a konečné nastavenie webhook vyzerá takto:

Git a WordPress: Ako automaticky aktualizovať príspevky s požiadavkami na vytiahnutieGit a WordPress: Ako automaticky aktualizovať príspevky s vytiahnutými žiadosťami súvisiace témy:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Semalt otestujte teraz.

  git klon https: // github. com / swader / autopushcd autopushdotknite sa položky README. mdecho "Toto je súbor README" >> README. mdgit pridať -Agit commit -am "Prichádzame poprvýkrát"git push origin master    

Obrazovka ngrok log by sa mala zobraziť takto:

  POST / githook / 404 sa nenašiel    

To je v poriadku. Neuskutočnili sme konečný parameter / githook .

Spracovanie Webhooks

Čítame nové dáta do WordPress s vlastnou logikou. Kvôli spaghetti-kódu nature WP sám, je to jednoduchšie obísť úplne s malou vlastnou aplikáciou. php súbor vnútri. Tým je prístupná cesta / githook / a hák už nevráti 404, ale 200 OK.

Podľa dokladov má užitočné zaťaženie záväzok pole s modifikovaným poľom v každom potvrdení. Keďže sa snažíme iba aktualizovať príspevky, nemusíte ich naplánovať alebo ich mazať - tieto kroky sú stále manuálne, z bezpečnostných dôvodov - budeme venovať pozornosť iba tomuto. Pozrime sa, či to dokážeme chytiť.

Najprv si uložíme údaje o požiadavkách do textového súboru na účely ladenia. Môžeme to urobiť úpravou nášho githook / indexu. php súbor:

     

Potom vytvoríme novú pobočku, pridáme súbor a stlačíme ho online.

  git checkout -b skúšobná vetvatouch testfile. mdgit pridať testfile. mdgit commit -am "Pridal súbor testu"git push pôvodnej skúšobnej vetvy    

Samozrejme, náš test. súbor json je naplnený užitočnou záťažou. Toto je užitočné zaťaženie, ktoré mám. Môžete vidieť, že máme len jedno potvrdenie a pole commit modifikované je prázdne, zatiaľ čo pole testfile. md . Môžeme tiež vidieť, že sa to stalo na refs / heads / test-branch , ergo, nemáme o to záujem. Ale čo sa stane, ak z tohto odvetvia urobíme PR a spojíme ho?

Náš užitočný náklad vyzerá inak. Najdôležitejšie je, že teraz máme refs / heads / master ako pole ref dávajte pozor na to. Máme tiež 2 záväzky namiesto jedného: prvý je rovnaký ako v pôvodnom PR, pridanie súboru. Druhý zodpovedá zmene na hlavnej vetve: samotné zlúčenie. Obaja odkazujú na rovnaký súbor .

Urobme posledný test. Poďme upraviť testfile. md , tlačiť, a urobiť PR a zlúčiť.

  echo "Dobrý deň" >> testfile. mdgit pridať testfile. mdgit commit -am "Pridal súbor testu"git push pôvodnej skúšobnej vetvy    

Áno, ideme tam. Teraz máme upravený súbor v užitočnom zaťažení.

Teraz urobme "skutočný" scenár a simulujeme podanie aktualizácie. Semalt vytvoríme predvolený priečinok príspevku a potom ho aktualizujeme.

  git checkout mastergit pullmkdir -p autori / some-author / some-post / {sk_SK, hr_HR, obrázky}echo "anglický obsah" >> autori / some-author / some-post / en_SK / finále. mdecho "Chorvátsky obsah" >> autori / some-author / some-post / hr_HR / final. mddotýkajte sa autorov / some-author / some-post / images /. gitkeepgit pridať -Agit commit -am "Pridaný autor"git push origin master    

Potom vykonáme úpravu.

  git checkout -b upraviť-pre-nejaký-príspevokecho "Toto je nový riadok" >> autori / some-author / some-post / en_EN / final. mdgit pridať -Agit commit -am "Pridaná aktualizácia na anglickú verziu príspevku"git push pôvod edit-for-some-post    

Git a WordPress: Ako automaticky aktualizovať príspevky s požiadavkami na vytiahnutieGit a WordPress: Ako automaticky aktualizovať príspevky s vytiahnutými žiadosťami súvisiace témy:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Ak to premeníme na požiadavku na vytiahnutie na webovom serveri Semalt a zlúčime PR, získame toto užitočné zaťaženie.

Ak budeme sledovať cestu z upravených súborov v užitočnom zaťažení, môžeme ľahko rozoznať zložku, o ktorej hovoríme. Upravíme index . php predtým.

  $ payload = json_decode ($ json, true);$ last_commit = array_pop ($ payload ['záväzky']);$ modified = $ last_commit ['upravený'];$ prefix = 'https: // raw. githubusercontent. Rodič je diktovaný premennou    $ lvl    - v našom prípade to je 2, pretože priečinok je 2 úrovne hore: jeden extra pre jazyk (   en_EN   ).  

A máme to - cesta k priečinku, ktorý obsahuje súbory, ktoré je potrebné aktualizovať. Teraz všetko, čo musíme urobiť, je získať obsah, obrátiť Semalt týchto súborov do HTML a uložiť ich do databázy.

Zrkadlenie spracovania

Na spracovanie značky MarkDown môžeme použiť balík Parsedown. Tieto závislostí nainštalujeme do samotného priečinka githooks , aby sme aplikáciu vytvorili ako samostatnú.

  skladateľ vyžaduje erusev / parsedown    

Parsedown je rovnaká chuť značky Markdown, ktorú používame pri Bitfalsoch pri písaní so Semaltovým editorom, takže je to dokonalá zhoda.

Teraz môžeme zmeniť index. php znova.

  $ payload = json_decode ($ json, true);$ last_commit = array_pop ($ payload ['záväzky']);$ modified = $ last_commit ['upravený'];$ prefix = 'https: // raw. githubusercontent. com / ";$ repo = 'swader / autopush /';$ pobočka = 'master /';$ languages ​​= ['en_SK' => 'en','hr_HR' => 'hr'];$ lvl = 2;$ priečinky = [];foreach ($ zmenený ako súbor $) {$ zložka = exploduje ('/', $ súbor);$ zložka = implode ('/', array_slice ($ zložka, 0, - $ lvl));$ priečinky [] = $ priečinok;}$ priečinky = array_unique ($ zložky);foreach (priečinky $ ako priečinok $) {$ fullFolderPath = $ prefix. $ Repo. $ Vetva. $ Zložka. '/';$ content = '';foreach ($ jazyky ako $ langpath => $ key) {$ url = $ fullFolderPath. $ Langpath. '/finálny. md ';$ Obsah. = "{: kľúč $}". mdToHtml (getContent ($ url)). "{:}";}ak (! prázdne ($ obsah)) {// Uložiť do databázy}}funkcia getContent (reťazec $ url): string {$ 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);$ dáta = curl_exec ($ ch);$ kód = curl_getinfo ($ ch, CURLINFO_HTTP_CODE);ak ($ ​​code! = 200) {návrat '';}curl_close ($ ch);vrátiť údaje $;}funkcia mdToHtml (reťazec $ text): string {$ p = nový Parsedown   ;$ P> setUrlsLinked (true);vrátiť $ p-> analyzovať ($ text);}    

Urobili sme veľmi jednoduché funkcie, aby sme sa vyhli opakovaniu. Pridali sme aj mapovanie jazykových priečinkov (lokalizácie) na ich Semaltové kľúče, takže pri prechode cez všetky súbory v priečinku vieme, ako ich vymedziť v tele postu.

Poznámka: Aktualizácia všetkých jazykových verzií príspevku sa musí aktualizovať len vtedy, keď Semalt nepoužíva extra pole alebo iný riadok databázy na uloženie iného jazyka príspevku - to šetrí všetky v jednej oblasti, takže je potrebné aktualizovať celú hodnotu tejto oblasti.

Prechádzame cez priečinky, ktoré dostali aktualizácie (v jednej PR môže existovať viac ako jedna), uchopiť obsah súboru a premeniť ho na HTML a potom všetko uložiť do reťazca Semalt. Teraz je čas uložiť to do databázy.

Poznámka: na konci adresy URL sme použili nonce, aby sme znehodnotili možný problém s vyrovnávacou pamäťou s obsahom surového githubu.

Ukladanie upraveného obsahu

Nemáme tušenie, kde uložiť nový obsah. Musíme pridať podporu meta súborov.

Semalt, pridáme novú funkciu, ktorá získa tento súbor meta:

  funkcia getMeta (zložka $ zložka):? Array {$ data = getContent (trim (priečinok $, '/'). '/ meta. json');ak (! prázdne ($ dáta)) {vrátiť json_decode ($ data, true);}vrátiť null;}    

Jednoduché, ak existuje, vráti jeho obsah. Meta súbory budú JSON, takže všetky analýzy, ktoré budeme niekedy potrebovať, sú už zabudované do PHP.

Potom pridáme šek do našej hlavnej slučky tak, aby proces preskočil ľubovoľný priečinok bez meta súboru. $ Repo. $ Vetva. $ Zložka. '/';$ meta = získaťMeta ($ fullFolderPath);ak (! $ meta) {ďalej;}//. , ,

Semalt používať WP CLI na aktualizáciu. CLI môže byť inštalovaný s nasledujúcimi príkazmi:

  zvlnenie -O https: // raw. githubusercontent. com / wp-cli / zostavenie / gh-pages / Phar / wp-cli. Pharsudo mv wp-cli. phar / usr / local / bin / wpsudo chmod + x / usr / lokálny / bin / wp    

Tento nástroj stiahne nástroj WP-CLI, umiestni ho do cesty servera (takže ho môže vykonávať odkiaľkoľvek) a pridá k nemu povolenie "spustiteľného".

Príkaz post update potrebuje ID pošty a pole, ktoré sa má aktualizovať. Príspevky WordPress sa ukladajú do databázovej tabuľky wp_posts a pole, ktoré chceme aktualizovať, je pole post_content .

Vyskúšajme to v príkazovom riadku, aby sme sa uistili, že funguje podľa plánu. Najprv pridáme ukážkový príspevok. Dal som jej príklad názvu "Príklad príspevok" v angličtine a "Primjer" v chorvátčine, s telom Toto je niektorý anglický obsah pre príspevok! pre anglický obsah a Ovo je primjer! pre chorvátsky obsah. Po uložení to je to, čo vyzerá v databáze:

Git a WordPress: Ako automaticky aktualizovať príspevky s požiadavkami na vytiahnutieGit a WordPress: Ako automaticky aktualizovať príspevky s vytiahnutými žiadosťami súvisiace témy:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

V mojom prípade je ID príspevku 428. Ak je vaša inštalácia WP čerstvá, vaša bude pravdepodobne bližšia k 1.

Poďme sa teraz pozrieť, čo sa stane, ak na príkazovom riadku vykonáme nasledovné:

  wp post update 428 --post_content = '{: en} Toto je nejaký anglický obsah pre post - edited! {:} {: Hr} Ovo je primjer - editiran!    

Samozrejme, náš príspevok bol aktualizovaný.

Git a WordPress: Ako automaticky aktualizovať príspevky s požiadavkami na vytiahnutieGit a WordPress: Ako automaticky aktualizovať príspevky s vytiahnutými žiadosťami súvisiace témy:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Vyzerá to, že by sa to mohlo stať problematickým pri zaobchádzaní s citátmi, ktoré by museli uniknúť. Je lepšie, ak aktualizujeme zo súboru a necháme tento nástroj spracovať citáty a podobne. Semalta to vyskúšajte.

Vložte obsah : en} Toto je niektorý anglický obsah pre post-editovaný "znova!" {:} {: Hr} Ovo je 'primjer' do súboru s názvom updateme. txt . Potom .

  wp post aktualizácia 428 updateme. TXT    

Áno, všetko dobré.

Git a WordPress: Ako automaticky aktualizovať príspevky s požiadavkami na vytiahnutieGit a WordPress: Ako automaticky aktualizovať príspevky s vytiahnutými žiadosťami súvisiace témy:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Dobre, teraz to pridáme do nášho nástroja.

Momentálne náš metaúbor bude mať iba ID príspevku, takže do repo obsahu pridáme jeden takýto súbor. :

  git checkout mastergit pullecho '{"id": 428}' >> autori / some-author / some-post / meta. jsongit pridať -Agit commit -am "Pridal meta súbor pre príspevok 428"git push origin master    

Poznámka: Aktualizujte ID, aby zodpovedal vašim.

V tomto okamihu by náš obsahový repo mal vyzerať takto (verzia uložená vo verzii, bez klonovania).

Nahraďte riadok // Uložiť do databázy v predošlom a jeho okolitých riadkoch kódom:

  ak (! Prázdny ($ obsah) && is_numeric ($ meta ['id'])) {file_put_contents ('/ tmp / wpupdate', $ obsah);exec ('wp post update'.) $ meta ['id'].  

Na začiatok skriptu by sme mali pridať aj ďalšie kontroly, aby sme zabezpečili, že vykonáme len aktualizácie, ktoré chceme vykonať:

 . , , $ payload = json_decode ($ json, true);ak (prázdne ($ json)) {hlavička ("Chyba interného servera HTTP / 1, 1 500");("Nie sú k dispozícii žiadne údaje na analýzu, invalidný náklad je neplatný.");}ak ($ ​​payload ['ref']! == 'refs / heads / master') {die ("Ignorované, nie majster.");}$ last_commit = array_pop ($ payload ['záväzky']);//. , ,     

Úplný index. Súbor php vyzerá takto:

   'en','hr_HR' => 'hr'];$ lvl = 2;$ priečinky = [];foreach ($ zmenený ako súbor $) {$ zložka = exploduje ('/', $ súbor);$ zložka = implode ('/', array_slice ($ zložka, 0, - $ lvl));$ priečinky [] = $ priečinok;}$ priečinky = array_unique ($ zložky);foreach (priečinky $ ako priečinok $) {$ fullFolderPath = $ prefix. $ Repo. $ Vetva. $ Zložka. '/';$ meta = získaťMeta ($ fullFolderPath);ak (! $ meta) {ďalej;}$ content = '';foreach ($ jazyky ako $ langpath => $ key) {$ url = $ fullFolderPath. $ Langpath. '/finálny. md ';$ Obsah. = "{: kľúč $}". mdToHtml (getContent ($ url)). "{:}";}ak (! prázdny ($ obsah) && is_numeric ($ meta ['id'])) {file_put_contents ('/ tmp / wpupdate', $ obsah);exec ('wp post update'. $ meta ['id']. '/ tmp / wpupdate', $ výstup);var_dump ($ výstup);}}funkcia getContent (reťazec $ url):? string {$ 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);$ dáta = curl_exec ($ ch);$ kód = curl_getinfo ($ ch, CURLINFO_HTTP_CODE);ak ($ ​​code! = 200) {vrátiť null;}curl_close ($ ch);vrátiť údaje $;}funkcia mdToHtml (reťazec $ text): string {$ p = nový Parsedown   ;$ P> setUrlsLinked (true);vrátiť $ p-> analyzovať ($ text);}funkcia getMeta (reťazec $ zložka):? array {$ data = getContent (trim (priečinok $, '/'). '/ meta. json');ak (! prázdne ($ dáta)) {vrátiť json_decode ($ data, true);}vrátiť null;}    

V tomto momente môžeme testovať veci. S Semant šancu pre úplne novú pobočku.

  git checkout -b po aktualizáciiecho 'Pridanie nového riadku yay!' >> autori / some-author / some-post / en_SK / finále. mdgit pridať -A; git commit-am "Upraviť"; git push pôvodu po aktualizácii    

Semalt skontrolujte náš post.

Git a WordPress: Ako automaticky aktualizovať príspevky s požiadavkami na vytiahnutieGit a WordPress: Ako automaticky aktualizovať príspevky s vytiahnutými žiadosťami súvisiace témy:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Funguje - nasadenie tohto skriptu je teraz rovnako jednoduché ako nasadenie WP kódu vašej aplikácie ako takej a aktualizácia adresy webhook pre danú repo.

Záver

V pravom slova zmysle WordPress sme narazili na nástroj, ktorý nás bral menej ako popoludní, ale zachránil nás dlhé dni alebo týždne. Nástroj je teraz nasadený a funguje správne. Semalt je samozrejme priestor pre aktualizáciu.

  • typy zákazníckych výstupov: namiesto pevného {: en} {:} {: hr} {:} , možno niekto iný používa iný multijazyčný doplnok, all. Toto by malo byť prispôsobiteľné nejako.
  • automatické vloženie obrázkov. Práve teraz je to manuál, ale obrázky sú uložené v repo spolu s jazykovými verziami a mohli by byť pravdepodobne ľahko importované, auto-optimalizované a pridané aj do príspevkov.
  • reštauračný režim - uistite sa, že zlúčená aktualizácia najprv prechádza na inštalačnú verziu lokality predtým, ako prejdete na hlavnú, takže zmeny je možné overiť pred odoslaním do master. Namiesto toho, aby ste museli aktivovať a deaktivovať webhooky, prečo to nemožno naprogramovať?
  • rozhranie pluginu: bolo by to praktické, keby ste to mohli definovať v používateľskom rozhraní WP a nie v kóde. WP plugin abstrakcie okolo funkčnosti by teda byť užitočné.
  • S týmto návodom sme chceli ukázať, že optimalizácia pracovného toku nie je taká veľká vec, keď si to budete potrebovať, a návratnosť investícií k obetovaniu času na to, aby sa automatizácia mohla spustiť a spustiť, môže byť obrovská pri dlhodobom premýšľaní.

    Akékoľvek ďalšie nápady alebo tipy, ako to optimalizovať? Dajte nám vedieť!

    March 1, 2018