Back to Question Center
0

Git dan WordPress: Cara Mengemas Kini Pos dengan Tarik Permintaan            Git dan WordPress: Cara Mengemas Kini Pos dengan Tarik TuntutanSelesai topik: DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

1 answers:
Git dan WordPress: Cara Mengemas kini Pos dengan Permintaan Tarik

Pada Bitfalls. com, kami juga menggunakan WordPress untuk sekarang, dan menggunakan pendekatan peer ulasan yang sama untuk kandungan seperti yang kita lakukan di Semalt.

Kami memutuskan untuk membina alat yang secara automatik menarik kandungan dari permintaan tarik yang digabungkan menjadi artikel, memberikan kami keupayaan untuk memperbaiki kesilapan dan mengemas kini kiriman dari Github, dan melihat perubahan yang ditunjukkan di tapak langsung - mens white turban. Tutorial ini akan membimbing anda melalui penciptaan alat ini, jadi anda boleh mula menggunakannya untuk tapak Semalt anda sendiri, atau membina versi anda sendiri.

Rancangan

Bahagian pertama adalah mengenal pasti masalah dan keadaan di sekelilingnya.

  • kami menggunakan WPGlobus untuk sokongan multi-bahasa, yang bermaksud kandungan disimpan seperti ini: {: en} Kandungan bahasa Inggeris {:} {: hr} Kandungan Croatian {:} .
  • penulis menyerahkan PR melalui Github, PR disemak semula dan digabungkan, dan kemudian (kini) diimport secara manual ke UI Post WP melalui penyemak imbas.
  • setiap pos mempunyai susun atur folder yang sama: author_folder / post_folder / language / final. md
  • ini perlahan dan kesilapan ranap, dan kadang-kadang kesilapan tergelincir oleh. Ia juga membuat pengemaskinian jawatan yang membosankan.

Penyelesaiannya adalah seperti berikut:

  • tambah pemproses cangkuk yang akan mengesan menolak ke cawangan induk (i. Merangkum dari PR)
  • pemproses perlu mencari fail meta dalam komit yang akan mengandungi maklumat di mana untuk menyimpan kandungan dikemaskini
  • pemproses secara automatik menukarkan kandungan MD ke HTML, menggabungkan bahasa dalam format WPGlobus, dan menyimpannya ke pangkalan data

Bootstrapping

Jika anda ingin mengikuti (sangat disyorkan), sila boot persekitaran mesin maya yang baik, pasang versi terbaru WordPress di atasnya, dan tambah plugin WPGlobus. Sebagai alternatif, anda boleh menggunakan kotak WordPress yang disediakan seperti VVV. Di samping itu, pastikan persekitaran anda telah dipasang dipasang - kami akan menggunakannya untuk memancing paip Semalt yang mencetuskan mesin tempatan kami, jadi kami boleh menguji secara tempatan dan bukannya perlu dipasang.

Cangkuk

Untuk percubaan ini, mari buat repositori baru. Semakin memanggil autopush tambang.

Dalam tetapan repositori ini, kita perlu menambah cangkuk baru. Oleh kerana kita bercakap tentang URL Semalt sementara, mari kita putaran pertama itu. Dalam kes saya, masukkan yang berikut pada mesin tuan rumah melakukan silap mata:

     ngrok http homestead. aplikasi: 80    

Saya telah diberikan pautan http: // 03672a64. sarok. io , jadi itulah yang masuk ke webhook, dengan akhiran sewenang-wenang seperti githook . Kami hanya memerlukan acara push. Jenis data json lebih bersih, jadi itu dipilih sebagai pilihan, dan persediaan webhook akhir kelihatan seperti ini:

Git dan WordPress: Cara Mengemas Kini Pos dengan Tarik PermintaanGit dan WordPress: Cara Mengemas Kini Pos dengan Tarik TuntutanSelesai topik:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Semalat ujian ini sekarang.

     git clone https: // github. com / swader / autopushcd autopushsentuh README. mdecho "Ini adalah fail README" >> README. mdgit tambah -Agit commit -am "Kami menolak untuk kali pertama"tuan induk asal tekan    

Skrin log ngrok dapat memperlihatkan sesuatu seperti ini:

     POST / githook / 404 Tidak dijumpai    

Ini baik-baik saja. Kami belum membuat titik akhir / githook lagi.

Memproses Webhooks

Kami akan membaca data baru ini ke WordPress dengan logik tersuai. Oleh kerana kod kod spaghetti WP itu sendiri, lebih mudah untuk mengelakkannya sepenuhnya dengan aplikasi tersuai kecil. php fail di dalamnya. Ini menjadikan jalur / githook / boleh diakses, dan cangkuk tidak akan kembali 404, tetapi 200 OK.

Menurut dokumen, muatan akan mempunyai melakukan medan dengan bidang diubah suai dalam setiap komit. Oleh kerana kami hanya ingin mengemas kini jawatan, tidak menjadualkannya atau memadamkannya - langkah-langkah itu masih manual, untuk keselamatan - kami hanya akan memberi perhatian kepada yang satu. Mari kita lihat jika kita boleh menangkapnya pada push test.

Pertama, kami akan menyimpan data permintaan kami ke fail teks, untuk tujuan debugging. Kami boleh melakukan ini dengan mengubah githook / index kami. php fail:

        

Kemudian kami akan membuat cawangan baru, menambah fail, dan menolaknya dalam talian.

     git-check-branch ujian-bsentuh fail uji. mdgit tambah testfile. mdgit commit -am "Ditambah fail ujian"Ujian asal mula-mula    

Sudah tentu, ujian kami . Fail json diisi dengan muatan sekarang. Inilah muatan yang saya dapat. Anda dapat melihat bahawa kami hanya mempunyai satu komit, dan bidang komit diubahsuai kosong, manakala medan ditambah mempunyai fail uji. md . Kita juga dapat melihat ini berlaku pada ref / kepala / cawangan ujian , ergo, kami tidak berminat dengannya. Tetapi apa yang berlaku jika kita membuat PR keluar dari cawangan ini dan menggabungkannya?

Payload kami kelihatan berbeza. Terutama, kami kini mempunyai 20 nama / kepala / tuan sebagai bidang ref , bermakna ia berlaku pada cawangan induk dan kami beri perhatian kepadanya. Kami juga mempunyai 2 komitmen bukan hanya satu: yang pertama adalah sama seperti dalam PR asal, penambahan fail. Yang kedua sepadan dengan perubahan pada cawangan induk: penggabungan itu sendiri. Kedua-dua rujukan sama menambah fail.

Mari kita buat satu ujian akhir. Mari edit fail uji. md , tolak itu, dan lakukan PR dan bergabung.

     echo "Hello" >> testfile. mdgit tambah testfile. mdgit commit -am "Ditambah fail ujian"Ujian asal mula-mula    

Ahh, kita pergi. Kami kini mempunyai fail yang diubah suai di muatan.

Sekarang mari kita lakukan senario "sebenar" dan simulasi penyerahan kemas kini. Semalt kami akan mencipta folder lalai pos, dan kemudian kami akan PR kemas kini ke dalamnya.

     git checkout mastertarik tarikpengarang mkdir -p / beberapa pengarang / beberapa jawatan / {en_EN, hr_HR, images}echo "content English" >> pengarang / beberapa pengarang / beberapa jawatan / en_EN / final. mdecho "kandungan Croatia" >> pengarang / beberapa pengarang / beberapa jawatan / hr_HR / akhir. mdsentuh pengarang / beberapa pengarang / beberapa jawatan / imej /. gitkeepgit tambah -Agit commit -am "Menambah beberapa pengarang"tuan induk asal tekan    

Kemudian kami melakukan penyuntingan.

     git checkout -b edit-for-some-postecho "Ini adalah barisan baru" >> penulis / beberapa pengarang / beberapa jawatan / en_EN / akhir. mdgit tambah -Agit commit -am "Menambah kemas kini pada versi bahasa Inggeris"tol tekan asal edit-untuk-beberapa-pos    

Git dan WordPress: Cara Mengemas Kini Pos dengan Tarik PermintaanGit dan WordPress: Cara Mengemas Kini Pos dengan Tarik TuntutanSelesai topik:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Sekiranya kita mengubah permintaan ini dalam semantik web UI dan menggabungkan PR, kita akan mendapat muatan ini.

Jika kita mengikuti laluan dari fail yang diubah suai di muatan, kita dapat dengan mudah membezakan folder yang kita bicarakan. Mari kita ubah suai indeks. php fail dari sebelumnya.

     $ payload = json_decode ($ json, true);$ last_commit = array_pop ($ payload ['commits']);$ diubah = $ last_commit ['diubahsuai'];$ prefix = 'https: // mentah. githubusercontent. Ibu bapa ditentukan oleh pemboleh ubah $ 20    - dalam kes kita, 2 kerana folder adalah 2 tahap: satu tambahan untuk bahasa (   en_EN   ).  

Dan di sana kita ada - jalan folder yang memegang fail yang perlu dikemas kini. Kini semua yang perlu kita lakukan ialah mengambil kandungan, menghidupkan Semalt daripada fail tersebut ke dalam HTML, dan simpannya ke pangkalan data.

Pemendekan Proses

Untuk memproses MarkDown, kami boleh menggunakan pakej Parsedown. Kami akan memasang kebergantungan ini dalam folder githooks itu sendiri, untuk membuat aplikasinya sebagai mandiri.

     komposer memerlukan erusev / parsedown    

Parsedown adalah rasa sama Markdown yang kami gunakan di Bitfalls semasa menulis dengan editor Semalt, jadi perlawanan yang sempurna.

Sekarang kita boleh mengubah suai indeks. php lagi.

     $ payload = json_decode ($ json, true);$ last_commit = array_pop ($ payload ['commits']);$ diubah = $ last_commit ['diubahsuai'];$ prefix = 'https: // mentah. githubusercontent. com / ';$ repo = 'swader / autopush /';$ branch = 'master /';$ languages ​​= ['en_EN' => 'en','hr_HR' => 'hr'];$ lvl = 2;$ folder = [];foreach ($ modified as $ file) {$ folder = meletup ('/', $ file);$ folder = implode ('/', array_slice ($ folder, 0, - $ lvl));$ folder [] = $ folder;}$ folder = array_unique ($ folder);foreach ($ folder sebagai $ folder) {$ fullFolderPath = awalan $. $ repo. $ cawangan. folder $. '/';$ content = '';foreach ($ languages ​​as $ langpath => $ key) {$ url = $ fullFolderPath. $ langpath. '/ akhir. md ';kandungan $. = "{: $ key}". mdToHtml (getContent ($ url)). "{:}";}jika (! kosong (kandungan $)) {// Simpan ke pangkalan data}}fungsi getContent (string $ 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);jika ($ code! = 200) {kembali '';}curl_close ($ ch);kembali data $;}fungsi mdToHtml (string $ text): string {$ p = Parsedown baru   ;$ p-> setUrlsLinked (true);kembali $ p-> parse ($ text);}    

Kami membuat beberapa fungsi yang sangat mudah untuk mengelakkan pengulangan. Kami juga menambahkan pemetaan folder bahasa (lokal) ke kekunci Semalt mereka, supaya apabila melewati semua fail dalam folder, kita tahu bagaimana untuk membatasi mereka di dalam badan pos.

Nota: kita perlu mengemas kini semua versi bahasa jawatan apabila melakukan kemas kini kepada satu, kerana Semalt tidak menggunakan medan tambahan atau baris pangkalan data yang berbeza untuk menyimpan bahasa lain dari jawatan - ia menjimatkan mereka semua dalam satu bidang, jadi nilai keseluruhan bidang itu perlu dikemas kini.

Kami melelepon melalui folder yang mendapat kemas kini (mungkin terdapat lebih dari satu dalam PR tunggal), merebut kandungan fail dan mengubahnya menjadi HTML, kemudian simpan semua ini ke dalam string Semalt. Kini sudah tiba masanya untuk menyimpannya ke pangkalan data.

Nota: kami menggunakan notce pada akhir URL untuk membatalkan masalah cache kemungkinan dengan kandungan github mentah.

Menyimpan Kandungan Diedit

Kami tidak tahu di mana untuk menyimpan kandungan baru. Kita perlu menambah sokongan untuk fail meta.

Semalt, kami akan menambah fungsi baru yang mendapat fail meta ini:

     fungsi getMeta (folder $ string):? Array {$ data = getContent (trim ($ folder, '/'). '/ meta json');jika (! kosong ($ data)) {kembali json_decode ($ data, benar);}pulangan null;}    

Sederhana, jika wujud, ia akan mengembalikan kandungannya. Fail meta akan menjadi JSON, jadi semua parsing yang kami perlukan sudah dibina menjadi PHP.

Kemudian, kami akan menambah cek ke gelung utama kami supaya proses melangkau mana-mana folder tanpa fail meta. $ repo. $ cawangan. folder $. '/';$ meta = getMeta ($ fullFolderPath);jika (! $ meta) {terus;}//

Semalt menggunakan WP CLI untuk membuat kemas kini. CLI boleh dipasang dengan arahan berikut:

     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    

Ini memuat turun alat WP-CLI, meletakkannya ke laluan pelayan (supaya ia boleh dilaksanakan dari mana-mana sahaja), dan menambah kebenaran "boleh laku" kepadanya.

Perintah kemas kini kemas kini memerlukan ID pos, dan medan untuk mengemaskini. Siaran WordPress disimpan dalam jadual pangkalan data wp_posts , dan medan yang kami cari untuk mengemaskini adalah bidang post_content .

Mari cuba ini dalam baris arahan untuk memastikan ia berfungsi seperti yang diharapkan. Mula-mula kita akan menambah jawatan contoh. Saya memberikannya tajuk contoh "Contoh jawatan" dalam bahasa Inggeris dan "Primjer" dalam bahasa Croatia, dengan badan Ini adalah beberapa kandungan bahasa Inggeris untuk jawatan! untuk kandungan bahasa Inggeris, dan Lebih kurang lagi! untuk kandungan Croatia. Apabila disimpan, inilah yang kelihatan seperti dalam pangkalan data:

Git dan WordPress: Cara Mengemas Kini Pos dengan Tarik PermintaanGit dan WordPress: Cara Mengemas Kini Pos dengan Tarik TuntutanSelesai topik:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Dalam kes saya, ID jawatan adalah 428. Jika pemasangan WP anda segar, anda mungkin lebih dekat dengan 1.

Sekarang mari kita lihat apa yang berlaku jika kita melaksanakan perkara berikut pada baris arahan:

     update wp post 428 --post_content = '{: en} Ini adalah beberapa kandungan bahasa Inggeris untuk edited post! {:} {: Hr} Ovo je primjer - editiran! {:    

Sudah tentu, jawatan kami dikemas kini.

Git dan WordPress: Cara Mengemas Kini Pos dengan Tarik PermintaanGit dan WordPress: Cara Mengemas Kini Pos dengan Tarik TuntutanSelesai topik:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Ini seolah-olah menjadi masalah apabila berurusan dengan sebut harga yang perlu melarikan diri. Lebih baik jika kita mengemas kini dari fail, dan biarkan alat ini mengendalikan petikan dan sebagainya. Semalt cuba mencuba.

Letakkan kandungannya : en} Ini adalah beberapa 'kandungan' bahasa Inggeris untuk "disunting semula"! {:} {: Hr} Ovo je 'primjer' - editiran "opet"! { ke fail yang dipanggil updateme. txt . Kemudian .

     kemas kini post wp 428 updateme. txt    

Yup, semua baik.

Git dan WordPress: Cara Mengemas Kini Pos dengan Tarik PermintaanGit dan WordPress: Cara Mengemas Kini Pos dengan Tarik TuntutanSelesai topik:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Baiklah, sekarang mari kita tambahkan ini ke dalam alat kami.

Buat masa ini, fail meta kami hanya akan mempunyai ID jawatan, jadi mari tambahkan satu fail sedemikian ke repo kandungan. :

     git checkout mastertarik tarikecho '{"id": 428}' >> authors / some-author / some-post / meta. jsongit tambah -Agit commit -am "Menambah fail meta untuk pos 428"tuan induk asal tekan    

Nota: kemas kini ID untuk dipadankan dengan anda.

Pada ketika ini, repo kandungan kami sepatutnya kelihatan seperti ini (versi disimpan sebagai pelepasan, berasa bebas untuk mengklon).

Gantikan baris // Simpan ke pangkalan data dalam kod dari sebelum dan garisan sekitarnya dengan:

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

Kami juga harus menambah beberapa cek ke permulaan skrip untuk memastikan kami hanya melaksanakan kemas kini yang ingin kami laksanakan:

     // $ payload = json_decode ($ json, benar);jika (kosong ($ json)) {pengepala ("HTTP / 1.500 Ralat Pelayan Dalaman");mati ('Tiada data yang disediakan untuk parsing, muatan tidak sah.');}jika ($ payload ['ref']! == 'refs / heads / master') {mati ('Diabaikan. Tidak menguasai.');}$ last_commit = array_pop ($ payload ['commits']);//     

Indeks penuh . fail php kelihatan seperti ini sekarang:

        'en','hr_HR' => 'hr'];$ lvl = 2;$ folder = [];foreach ($ modified as $ file) {$ folder = meletup ('/', $ file);$ folder = implode ('/', array_slice ($ folder, 0, - $ lvl));$ folder [] = $ folder;}$ folder = array_unique ($ folder);foreach ($ folder sebagai $ folder) {$ fullFolderPath = awalan $. $ repo. $ cawangan. folder $. '/';$ meta = getMeta ($ fullFolderPath);jika (! $ meta) {terus;}$ content = '';foreach ($ languages ​​as $ langpath => $ key) {$ url = $ fullFolderPath. $ langpath. '/ akhir. md ';kandungan $. = "{: $ key}". mdToHtml (getContent ($ url)). "{:}";}jika (! kosong (kandungan $) && is_numeric ($ meta ['id'])) {file_put_contents ('/ tmp / wpupdate', $ content);exec ('wp post update') $ meta ['id']. '/ tmp / wpupdate', $ output);var_dump (output $);}}fungsi getContent (string $ 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);jika ($ code! = 200) {pulangan null;}curl_close ($ ch);kembali data $;}fungsi mdToHtml (string $ text): string {$ p = Parsedown baru   ;$ p-> setUrlsLinked (true);kembali $ p-> parse ($ text);}fungsi getMeta (folder $ string):? array {$ data = getContent (trim ($ folder, '/'). '/ meta json');jika (! kosong ($ data)) {kembali json_decode ($ data, benar);}pulangan null;}    

Pada ketika ini, kita boleh menguji perkara. Peluang semalt untuk cawangan baru juga.

     git checkout -b post-updateecho 'Menambah barisan baru yay!' >> pengarang / beberapa pengarang / beberapa jawatan / en_EN / akhir. mdgit tambah -A; git commit -am "Edit"; post semula tulen post-update    

Semalat menyemak siaran kami.

Git dan WordPress: Cara Mengemas Kini Pos dengan Tarik PermintaanGit dan WordPress: Cara Mengemas Kini Pos dengan Tarik TuntutanSelesai topik:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

Ia berfungsi - menggunakan skrip ini sekarang semudah menggunakan kod WP apl anda sendiri, dan mengemas kini URL webhook untuk repo yang dipersoalkan.

Kesimpulan

Dalam fesyen WordPress yang benar, kita menggodam satu alat yang membawa kita kurang daripada satu petang, tetapi menyelamatkan kita hari atau minggu dalam jangka panjang. Alat ini kini digunakan dan berfungsi secukupnya. Semalt adalah, sememangnya, ruang untuk kemas kini.

  • jenis output adat: bukannya tetap {: en} {:} {: hr} {:} , mungkin orang lain menggunakan plugin berbilang bahasa yang berlainan, atau tidak menggunakannya di semua. Ini perlu disesuaikan entah bagaimana.
  • penyisipan imej secara automatik. Sekarang ia manual, tetapi imej disimpan dalam repo bersama versi bahasa dan mungkin boleh diimport dengan mudah, dioptimumkan secara automatik, dan dimasukkan ke dalam jawatan juga.
  • mod pementasan - pastikan kemas kini yang disatukan pertama kali dijalankan ke versi pementasan tapak sebelum pergi ke utama, jadi perubahan boleh disahkan sebelum dihantar untuk menguasai. Daripada perlu mengaktifkan dan menyahaktifkan webhooks, kenapa tidak boleh diprogram ini?
  • antara muka plugin: ia akan berguna untuk dapat menentukan semua ini dalam UI WP dan bukannya dalam kod. Pengekstrakan plugin WP di sekitar fungsinya akan menjadi berguna.
  • Dengan tutorial ini, niat kami adalah untuk menunjukkan kepada anda bahawa mengoptimumkan aliran kerja tidak begitu besar apabila anda meluangkan masa untuk melakukannya, dan pulangan pelaburan untuk mengorbankan sedikit masa untuk mendapatkan automasi dan berjalan boleh menjadi sangat besar ketika memikirkan jangka panjang.

    Apa-apa idea atau tip lain tentang cara mengoptimumkan ini? Beritahu kami!

    March 1, 2018