Back to Question Center
0

Git lan WordPress: Cara Nganyari Otomatis Posts with Pull Picks            Git lan WordPress: Cara Nganyari Otomatis Posts with Pull RequestsRelated Topics: DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalat

1 answers:
Git lan WordPress: Cara Nganyari otomatis Posts with Pull Picks

ing Bitfalls. com, kita uga nggunakake WordPress kanggo saiki, lan nggunakake pendekatan peer review sing padha kanggo isi kaya ing Semalt.

Kita mutusake kanggo mbangun alat sing kanthi otomatis narik konten saka panjaluk narik gabungan menyang artikel, menehi kita kemampuan kanggo ndandani typo lan nganyari posting saka Github, lan ndeleng owahan sing dibayangke ing situs langsung. Tutorial iki bakal mbukak sampeyan kanthi nggawe alat iki, supaya sampeyan bisa miwiti nggunakake situs Semalt kasebut, utawa mbangun versi sampeyan dhewe.

Rencana

Pérangan pisanan ngenali masalah lan kahanan sing nyedhaki - korres red grape.

  • nggunakake WPGlobus kanggo dhukungan multi-basa, sing artine isi bakal disimpen kaya iki: {: en} Konten Inggris {:} {: hr} isi Kroasia {:} .
  • penulis ngirim PR liwat Github, PR wis ditinjau lan digabungake, banjur (saiki) diimpor kanthi manual menyang WP's Posts Posts via browser.
  • saben post nduweni layout folder sing padha: author_folder / post_folder / language / final. md
  • iki rawan alon lan rawan, lan kadhangkala uga kasalahan ilang. Iku uga ndadekake nganyari posting nggegem.

Solusi yaiku:

  • nambah prosesor hook sing bakal ndeteksi nyurung menyang cabang master (sambungake saka PR)
  • prosesor kudu nggoleki file meta ing laku sing bakal ngandhut informasi ing ngendi nyimpen konten sing dianyari
  • prosesor sacara otomatis ngowahi isi MD menyang HTML, nggabungake basa-basa ing format WPGlobus, lan nyimpen file kasebut menyang basis data

Bootstrapping

Yen sampeyan pengin ngetutake (disaranake banget), mangga nyiyapake lingkungan mesin virtual sing apik, nginstal versi WordPress paling anyar, lan tambahake plugin WPGlobus. Utawa, sampeyan bisa nggunakake kothak WordPress sing disiapake kaya VVV. Kajaba iku, priksa manawa lingkungan sampeyan wis ngrokoti - kita bakal bisa nggunakake pipa Semalt sing bisa mlebu mesin lokal kita, supaya kita bisa nyoba sacara lokal tinimbang kudu disebarke.

Hooks

Kanggo eksperimen iki, ayo nggawe gudang anyar. Minat panggilan tambang semalt.

Ing setelan gudang iki, kita kudu nambah hook anyar. Awit kita lagi ngomong babagan URL Semalt sementara, ayo spin pertama sing munggah. Ing kasusku, ngetik ngisor iki ing mesin inang ora trik:

     ngrok http homestead. aplikasi: 80    

Aku diwenehi link http: // 03672a64. angrok. io , supaya dadi apa ing webhook, kanthi suffix sewenang-wenang kaya githook . Kita mung butuh acara push. Nomer data json luwih resik, supaya sing dipilih minangka pilihan, lan persiyapan web final sing katon kaya iki:

Git lan WordPress: Cara Nganyari Otomatis Posts with Pull PicksGit lan WordPress: Cara Nganyari Otomatis Posts with Pull RequestsRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Tes semalat iki saiki.

     git clone https: // github. com / swader / autopushcd autopushtutul README. mdecho "Iki file README" >> README. mdgit nambah -Agit commit -am "We're pushing for the first time"git push origin master    

Layar log ngrokoti nampilake kaya:

     POST / githook / 404 Ora Ditemokake    

Iki apik. Kita durung nggawe titik pungkasan / githook .

Webhooks Prosès

Kita bakal maca data anyar menyang WordPress nganggo logika khusus. Amarga sifat spaghetti-kode WP dhewe, luwih gampang ngirangi kabeh kasebut kanthi aplikasi khusus cilik. php ing berkas kasebut. Iki nggawe path / githook / sing diakses, lan pancalan ora bakal bali 404, nanging 200 OK.

Miturut docs, payload bakal duwe nglakoni lapangan kanthi dimodifikasi lapangan ing saben laku. Awit kita mung looking kanggo nganyari posting, ora jadwal utawa mbusak - langkah-langkah sing isih manual, kanggo safety - kita mung bakal perhatikan sing siji. Ayo ndeleng yen kita bisa nyekel ing push test.

Kaping pisanan, kita bakal nyimpen data request kanggo file teks, kanggo tujuan debugging. Kita bisa nindakake iki kanthi ndandani kita githook / index. php file:

        

Banjur bakal nggawe cabang anyar, nambah file, lan push online.

     git checkout -b test-branchtestfile tutul. mdgit nambah testfile. mdgit commit -am "Ditambahake test file"test-branch asalé pin push    

Cukup, tes kita . file json diisi karo payload saiki. Iki payload aku entuk. Sampeyan bisa ndeleng manawa mung ana siji, lan sing dimodifikasi lapangan kosong, lan ditambah lapangan wis testfile. md . Kita bisa uga ndeleng iki kedadean ing refs / heads / test-cabang , ergo, kita ora kasengsem ing. Nanging apa sing kedadeyan yen kita nggawe PR metu saka cabang iki lan nggabungake?

Payload kita katon beda. Utamane, kita saiki duwe refs / heads / master minangka lapangan 20 , tegese kedadeyan ing cabang 20 lan kita mbayar manungsa waé. Kita uga duwe 2 komite tinimbang mung siji: sing pertama padha karo PR asli, nambah file. Sing kapindho cocog karo owah-owahan ing cabang master: penggabungan dhewe. Loro referensi sing padha ditambahake file.

Ayo rampung siji test final. Ayo ngedit testfile. md , push that, lan nggawe PR lan nggabung.

     echo "Hello" >> testfile. mdgit nambah testfile. mdgit commit -am "Ditambahake test file"test-branch asalé pin push    

Ahh, kita lunga. Saiki kita duwe file sing dimodifikasi ing payload.

Saiki ayo nindakake skenario "nyata" lan simulasi kiriman anyar. Semalat bakal nggawe folder standar, banjur kita bakal nganyari PR neng kana.

     gur checkout mastergit narikmkdir -p authors / some-author / some-post / {en_EN, hr_HR, images}echo "content English" >> authors / some-author / some-post / en_EN / final. mdecho "isi Kroasia" >> authors / some-author / some-post / hr_HR / final. mdtutul penulis / sawetara-penulis / sawetara-kirim / gambar /. gitkeepgit nambah -Agit commit -am "Ditambahake sawetara penulis"git push origin master    

Banjur kita nyunting.

     git checkout -b edit-for-some-postecho "This is a new line" >> authors / some-author / some-post / en_EN / final. mdgit nambah -Agit commit -am "Nambahake versi ing versi Inggris"git push origin edit-for-some-post    

Git lan WordPress: Cara Nganyari Otomatis Posts with Pull PicksGit lan WordPress: Cara Nganyari Otomatis Posts with Pull RequestsRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Yen kita ngowahi iki dadi permintaan narik ing UI web Semalt lan nggabungake PR, kita bakal mbayar mbayar iki.

Yen kita tindakake path saka file sing dimodifikasi ing payload, kita bisa gampang ndeleng folder sing kita ngomong. Ayo ngowahi indeks . file php saka sadurunge.

     $ payload = json_decode ($ json, bener);$ last_commit = array_pop ($ payload ['commits']);$ modhèrèk = $ last_commit ['diowahi'];$ prefix = 'https: // mentah. githubusercontent. Wong tuwa kasebut dictated dening variabel    $ lvl    - ing kasus kita iku 2 amarga folder 2 tingkat munggah: siji ekstra kanggo basa (   en_EN   ).  

Lan ana kita - path saka folder sing nylametake file sing perlu diupdate. Saiki kabeh kita kudu njupuk isi, nguripake Semalt saka file kasebut menyang HTML, lan simpen menyang database.

Pemrosesan Markdown

Kanggo ngolah MarkDown, kita bisa nggunakake paket Parsedown. Kita bakal instal dependensi iki ing folder githooks dhewe, kanggo nggawe app minangka asleep sabisa.

     komposer mbutuhake erusev / parsedown    

Parsedown minangka rasa sing padha Markdown sing digunakake ing Bitfalls nalika nulis karo editor Semalt, supaya dadi match sing sampurna.

Saiki kita bisa ngowahi indeks. php maneh.

     $ payload = json_decode ($ json, bener);$ last_commit = array_pop ($ payload ['commits']);$ modhèrèk = $ last_commit ['diowahi'];$ prefix = 'https: // mentah. githubusercontent. com / ';$ repo = 'swader / autopush /';$ cabang = 'master /';$ languages ​​= ['en_EN' => 'en','hr_HR' => 'hr'];$ lvl = 2;$ folder = [];foreach ($ diowahi dadi $ file) {$ folder = njeblug ('/', $ file);$ folder = implode ('/', array_slice ($ folder, 0, - $ lvl));$ folder [] = folder $;}$ folder = array_unique ($ folder);foreach ($ folder minangka $ folder) {$ fullFolderPath = $ awalan. $ repo. $ cabang. $ folder. '/';$ content = '';foreach ($ basa minangka $ langpath => $ key) {$ url = $ fullFolderPath. $ langpath. '/ final. md ';$ isi. = "{: $ key}". mdToHtml (getContent ($ url)). "{:}";}yen (! kosong ($ isi)) {// Simpen menyang basis data}}fungsi getContent (senar $ 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);$ data = curl_exec ($ ch);$ code = curl_getinfo ($ ch, CURLINFO_HTTP_CODE);yen ($ kode! = 200) {bali '';}curl_close ($ ch);bali $ data;}fungsi mdToHtml (senar $ teks): string {$ p = Parsedown anyar   ;$ p-> setUrlsLinked (bener);bali $ p-> parse ($ teks);}    

Kita nggawe sawetara fungsi sing prasaja supaya ora bisa diulang. Kita uga nambahake pemetaan folder basa (lokal) menyang tombol Semalt sing, supaya nalika ngowahi liwat kabeh file ing folder, kita ngerti carane mbatasi wong ing awak post.

Wigati: kita kudu nganyarake kabeh versi basa posting nalika nggawe update mung siji, amarga Semalt ora nggunakake lapangan ekstra utawa beda database baris kanggo nyimpen basa liya post - saves wong-wong mau kabeh ing sakjroning lapangan, supaya kabeh nilai ing lapangan perlu diupdate.

Weerate liwat folder sing entuk update (ana uga luwih saka siji ing PR tunggal), nyekel isi file lan dikonversi dadi HTML, banjur simpen kabeh iki dadi string Semalt. Saiki wektu kanggo nyimpen iki menyang database.

Wigati: kita nggunakake nonce ing mburi URL kanggo invalidate masalah cache bisa karo isi github mentah.

Saving Edited Content

Kita ora ngerti ngendi nyimpen isi anyar. Kita perlu nambah dhukungan kanggo file meta.

Semalat, kita bakal nambah fungsi anyar sing nemu file meta iki:

     fungsi getMeta (senar $ folder):? Array {$ data = getContent (trim ($ folder, '/'). '/ meta. json');yen (! kosong ($ data)) {bali json_decode ($ data, bener);}bali null;}    

Prasaja, yen ana, bakal ngasilake isine. File meta bakal dadi JSON, supaya kabeh parsing kita bakal mbutuhake wis dibangun dadi PHP.

Banjur, kita bakal nambah cek kanggo daur ulang utama kita supaya proses ngliwati folder manawa tanpa file meta. $ repo. $ cabang. $ folder. '/';$ meta = getMeta ($ fullFolderPath);yen (! $ meta) {terus;}//

Semalt nggunakake WP CLI kanggo nganyari. CLI bisa diinstal nganggo printah ing ngisor iki:

     curl -O https: // mentah. githubusercontent. com / wp-cli / builds / gh-pages / phar / wp-cli. pharsudo mv wp-cli. phar / usr / local / bin / wpsudo chmod + x / usr / local / bin / wp    

Iki ngundhuh alat WP-CLI, nempatake ing path server (supaya bisa dieksekusi saka ngendi wae), lan nambah idin "eksekusi".

Pangiriman postingan perlu ID kirim, lan lapangan kanggo dianyari. Posting WordPress disimpen ing tabel basis data wp_posts , lan kolom sing kita arep kanggo nganyari yaiku post_content lapangan.

Ayo coba iki metu ing baris printah kanggo mesthekake yen kerjane kaya. Pisanan kita bakal nambah conto umpan. Aku menehi judhul conto "Conto kirim" ing basa Inggris lan "Primjer" ing basa Kroasia, kanthi awak Iki sawetara isi Inggris kanggo posting! kanggo isi Inggris, lan Ovo je primjer! kanggo isi Kroasia. Nalika disimpen, iki katon kaya ing basis data:

Git lan WordPress: Cara Nganyari Otomatis Posts with Pull PicksGit lan WordPress: Cara Nganyari Otomatis Posts with Pull RequestsRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Ing kasusku, ID saka postingan iku 428. Yen instalasi WPmu seger, sampeyan bakal luwih cedhak karo 1.

Saiki ayo weruh apa sing kedadeyan yen kita nglakokne ngisor iki ing baris perintah:

     wp post update 428 --post_content = '{: en} Iki sawetara isi Inggris kanggo tulisan sing diunduh! {:} {: Hr} Ovo je primjer -    

Manawa cukup, posting kita dianyari.

Git lan WordPress: Cara Nganyari Otomatis Posts with Pull PicksGit lan WordPress: Cara Nganyari Otomatis Posts with Pull RequestsRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Iki katon kaya masalah nalika ngatasi quotes sing bakal kudu lolos. Luwih apik yen kita nganyari saka file, lan supaya alat iki bisa nangani kutipan kasebut. Semalat menehi cobaan.

Ayo ditemokake isi : en} Iki minangka sawetara isi '' basa Inggris '' '' '' '' ' menyang file sing disebut updateme. txt . Banjur .

     wp post update 428 updateme. txt    

Yup, kabeh apik.

Git lan WordPress: Cara Nganyari Otomatis Posts with Pull PicksGit lan WordPress: Cara Nganyari Otomatis Posts with Pull RequestsRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Oke, saiki ayo ketikno alat iki.

Saiki, file meta kita mung duwe ID post, dadi ayo tambah file kasebut ing repo isi. :

     gur checkout mastergit narikecho '{"id": 428}' >> authors / some-author / some-post / meta. jsongit nambah -Agit commit -am "Ditambahake file meta kanggo post 428"git push origin master    

Wigati: nganyari ID kanggo cocog karo panjenengan.

Ing titik iki, repo isi kita kudu katon kaya iki (versi disimpen minangka release, aran bebas klone).

Ganti // Simpen menyang basis data baris ing kode saka sadurunge lan garis sekitar karo:

     yen (! Kosong ($ isi) && is_numeric ($ meta ['id'])) {file_put_contents ('/ tmp / wpupdate', $ content);exec ('wp post update'). $ meta ['id'].  

Kita uga kudu nambah sawetara cèk kanggo awal skrip kanggo nggawe manawa kita mung nglakokaké pembaruan kita arep nglakokaké:

     // $ payload = json_decode ($ json, bener);yen (kosong ($ json)) {header ("Error Server Internal 500 HTTP / 1");mati ('Ora ana data sing disedhiyakake kanggo parsing, mbayar ora sah.');}yen $ payload ['ref']! == 'refs / heads / master') {mati ('Dieliminasi, ora master.');}$ last_commit = array_pop ($ payload ['commits']);//     

Indeks lengkap. berkas php katon kaya saiki:

        'en','hr_HR' => 'hr'];$ lvl = 2;$ folder = [];foreach ($ diowahi dadi $ file) {$ folder = njeblug ('/', $ file);$ folder = implode ('/', array_slice ($ folder, 0, - $ lvl));$ folder [] = folder $;}$ folder = array_unique ($ folder);foreach ($ folder minangka $ folder) {$ fullFolderPath = $ awalan. $ repo. $ cabang. $ folder. '/';$ meta = getMeta ($ fullFolderPath);yen (! $ meta) {terus;}$ content = '';foreach ($ basa minangka $ langpath => $ key) {$ url = $ fullFolderPath. $ langpath. '/ final. md ';$ isi. = "{: $ key}". mdToHtml (getContent ($ url)). "{:}";}yen (! kosong ($ isi) && is_numeric ($ meta ['id'])) {file_put_contents ('/ tmp / wpupdate', $ content);exec ('wp post update'). $ meta ['id']. '/ tmp / wpupdate', $ output);var_dump ($ output);}}function getContent (senar $ 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);$ data = curl_exec ($ ch);$ code = curl_getinfo ($ ch, CURLINFO_HTTP_CODE);yen ($ kode! = 200) {bali null;}curl_close ($ ch);bali $ data;}fungsi mdToHtml (senar $ teks): string {$ p = Parsedown anyar   ;$ p-> setUrlsLinked (bener);bali $ p-> parse ($ teks);}fungsi getMeta (senar $ folder):? array {$ data = getContent (trim ($ folder, '/'). '/ meta. json');yen (! kosong ($ data)) {bali json_decode ($ data, bener);}bali null;}    

Ing titik iki, kita bisa nyoba. Semo wae kesempatan kanggo cabang anyar.

     git checkout -b post-updateecho 'Nambahake baris anyar yay!' >> penulis / sawetara-penulis / sawetara-kirim / en_EN / final. mdgit nambah -A; git commit -am "Edit"; asal usul push post-update    

Semalat mriksa postingan kita.

Git lan WordPress: Cara Nganyari Otomatis Posts with Pull PicksGit lan WordPress: Cara Nganyari Otomatis Posts with Pull RequestsRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Kerjane - deploying skrip iki saiki kaya gampang kaya deploying kode WP app sampeyan dhewe, lan ngganti URL webhook kanggo repo sing ditakonake.

Kesimpulan

Ing gaya WordPress sing sejatine, kita disusupi alat sing njupuk kita kurang saka sore, nanging disimpen kita dina utawa minggu ing jangka panjang. Alat iki saiki disebarake lan berfungsi kanthi cekap. Semalat punika, mesthi, kamar kanggo nganyari.

  • jenis output khusus: tinimbang telpon {: en} {:} {: hr} {:} , mungkin wong liya nggunakake plugin multi-basa sing beda, kabeh. Iki kudu disesuaikan piye wae.
  • penyisipan otomatis gambar. Saiki iku manual, nanging gambar disimpen ing repo bebarengan versi basa lan bisa uga gampang diimpor, otomatis dioptimalake, lan ditambahake menyang postingan uga.
  • mode pementasan - priksa manawa nganyari sing digabungake dhisik sadurunge menyang versi pementasan saka situs sadurunge arep menyang pandhuan utama, supaya owah-owahan bisa diverifikasi sadurunge dikirim menyang master. Luwih kudu ngaktifake lan mateni webhooks, kok ora nggawe programmable iki?
  • antarmuka plugin: bakal berguna kanggo bisa nemtokake kabeh iki ing UI WP tinimbang ing kode. A abstraksi plugin WP ing saindhenging fungsi, saéngga bisa migunani.
  • Kanthi tutorial iki, niat kita yaiku kanggo nunjukake yen optimalake workflow ora dadi masalah gedhe nalika sampeyan njupuk wektu kanggo nindakake, lan bali ing investasi kanggo ngorbanake sawetara wektu kanggo njupuk otomatis lan mlaku bisa dadi gedhe banget nalika mikir long term.

    Apa gagasan utawa tips liyane babagan carane ngoptimalake iki? Ayo kita ngerti!

    March 1, 2018