Back to Question Center
0

Git и WordPress: как автоматически обновлять сообщения с помощью запросов Pull            Git и WordPress: как автоматически обновлять сообщения с помощью запросов PullRelated Topics: DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt

1 answers:
Git и WordPress: как автообновить сообщения с помощью запросов Pull

В битпаллах. com, мы также используем WordPress на данный момент и используем один и тот же подход для анализа, как и в Semalt.

Мы решили создать инструмент, который автоматически выводит контент из объединенных запросов на тягу в статьи, предоставляя нам возможность исправлять опечатки и обновлять сообщения из Github и просматривать изменения, отраженные на реальном сайте. В этом учебном пособии вы познакомитесь с созданием этого инструмента, чтобы вы могли начать использовать его для своего сайта Semalt или создать свою собственную версию.

План

Первая часть - это выявление проблемы и ситуации вокруг нее.

  • мы используем WPGlobus для многоязыковой поддержки, что означает, что контент будет сохранен следующим образом: {: en} Английский контент {:} {: hr} Хорватский контент {:} .
  • авторы направляют PR через Github, ОР разобраны и объединены, а затем (в настоящее время) вручную импортируются в пользовательский интерфейс сообщений WP через браузер.
  • каждая почта имеет одинаковый макет папки: author_folder / post_folder / language / final. md
  • это медленный и подверженный ошибкам, а иногда и ошибки. Это также делает обновление сообщений утомительным.

Решение состоит в следующем:

  • добавить процессор перехвата, который будет обнаруживать нажатия на главную ветвь (т. Е. Объединяется с PR)
  • процессор должен искать метафайл в фиксации, который будет содержать информацию о том, где сохранить обновленный контент
  • процессор автоматически преобразует содержимое MD в HTML, объединяет языки в формате WPGlobus и сохраняет их в базе данных

Бутстраппинг

Если вы хотите следовать (настоятельно рекомендуется), загрузите хорошую среду виртуальной машины, установите на нее новейшую версию WordPress и добавьте плагин WPGlobus. Кроме того, вы можете использовать подготовленный WordPress, такой как VVV. Кроме того, убедитесь, что в вашей среде установлен ngrok - мы будем использовать это для подключения триггеров скрепок Semalt к нашей локальной машине, поэтому мы можем протестировать локально, а не развертывать.

Крючки

Для этого эксперимента давайте создадим новый репозиторий. Semalt зовет мой автопуш.

В настройках этого репозитория нам нужно добавить новый крючок. Поскольку мы говорим о временном URL-адресе Semalt, давайте сначала закрутим это. В моем случае ввод следующего на хост-машине делает трюк:

     ngrok http homestead. Приложение: 80    

Мне была предоставлена ​​ссылка http: // 03672a64. ngrok. io , так это то, что входит в webhook, с произвольным суффиксом типа githook . Нам нужны только события push. Тип данных json является более чистым, поэтому его выбирают как предпочтение, а окончательная настройка веб-чек выглядит примерно так:

Git и WordPress: как автоматически обновлять сообщения с помощью запросов PullGit и WordPress: как автоматически обновлять сообщения с помощью запросов PullRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt
«/>  <p>  Semalt протестируйте это сейчас.  </p>  <pre>   <code class= git clone https: // github. ком / swader / autopushcd autopushнажмите README. Мэрилендecho «Это файл README» >> README. Мэрилендgit add -Agit commit -am «Мы нажимаем в первый раз»git push origin master

Экран журнала ngrok должен отображаться примерно так:

     POST / githook / 404 Не найдено    

Это прекрасно. Мы еще не достигли конечной точки / githook .

Обработка веб-крючков

Мы прочитаем эти новые данные в WordPress с пользовательской логикой. Из-за характера самого спагетти кода самого WP легче всего обходить его с помощью небольшого пользовательского приложения. php внутри него. Это делает доступным путь / githook / , и крючок больше не будет возвращать 404, но 200 OK.

Согласно документам, полезная нагрузка будет иметь значение поля с измененным полем в каждой фиксации. Поскольку мы только хотим обновлять сообщения, а не планировать их или удалять, эти шаги все же являются ручными, для обеспечения безопасности - мы будем обращать внимание только на это. Давайте посмотрим, сможем ли мы поймать его на тестовом нажатии.

Сначала мы сохраним наши данные запроса в текстовый файл для целей отладки. Мы можем это сделать, изменив наш githook / index. Файл php :

        

Затем мы создадим новую ветку, добавим файл и запустим его в Интернете.

     git checkout -b test-branchtouch testfile. Мэрилендgit добавить тестовый файл. Мэрилендgit commit -am "Добавлен тестовый файл"git push origin test-branch    

Конечно, наш тест. Файл json заполняется полезной нагрузкой. Это полезная нагрузка, которую я получил. Вы можете видеть, что у нас есть только одна фиксация, а поле commit изменено пустым, в то время как поле добавлено имеет тестовый файл. md . Мы также можем видеть, что это произошло на refs / heads / test-branch , ergo, нас это не интересует. Но что произойдет, если мы выберем PR из этой ветки и слейте ее?

Наша полезная нагрузка выглядит иначе. В частности, теперь мы имеем refs / heads / master как поле ref , то есть это произошло на ветви master , и мы должны обратите внимание на это. У нас также есть 2 коммита, а не только одна: первая такая же, как в исходном PR, добавление файла. Второй соответствует изменению на главной ветке: слияние. Оба ссылаются на тот же файл .

Давайте сделаем один заключительный тест. Давайте отредактируем тестовый файл. md , нажмите это и сделайте PR и слейте.

     echo "Hello" >> testfile. Мэрилендgit добавить тестовый файл. Мэрилендgit commit -am "Добавлен тестовый файл"git push origin test-branch    

Ах, вот мы идем. Теперь у нас есть модифицированный файл в полезной нагрузке.

Теперь давайте сделаем «реальный» сценарий и смоделируем представление обновления. Мы создадим папку по умолчанию, а затем добавим в нее обновление.

     git checkout mastergit pullmkdir -p авторы / some-author / some-post / {en_EN, hr_HR, images}echo "Английский контент" >> авторы / some-author / some-post / en_EN / final. Мэрилендэхо «хорватский контент» >> авторы / некоторые-автор / некоторые-пост / hr_HR / final. Мэрилендкоснитесь авторов / some-author / some-post / images /. gitkeepgit add -Agit commit -am «Добавлен автор»git push origin master    

Затем мы редактируем.

     git checkout -b edit-for-some-postecho «Это новая строка» >> авторы / some-author / some-post / en_EN / final. Мэрилендgit add -Agit commit -am "Добавлено обновление в английской версии сообщения"git push origin edit-for-some-post    

Git и WordPress: как автоматически обновлять сообщения с помощью запросов PullGit и WordPress: как автоматически обновлять сообщения с помощью запросов PullRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt
«/>  <p>  Если мы превратим это в запрос на растяжение в веб-интерфейсе Semalt и объедините PR, мы получим эту полезную нагрузку.  </p>  <p>  Если мы будем следовать пути из измененных файлов в полезной нагрузке, мы можем легко различить папку, о которой мы говорим. Давайте изменим индекс  <code> . Файл php  </code>  от ранее.  </p>  <pre>   <code class= $ payload = json_decode ($ json, true);$ last_commit = array_pop ($ payload ['commits']);$ modified = $ last_commit ['modified'];$ prefix = 'https: // raw. githubusercontent. Родитель продиктован переменной $ lvl - в нашем случае это 2, потому что папка имеет 2 уровня: один дополнительный для языка ( en_EN ).

И у нас есть это - путь к папке, в которой хранятся файлы, которые необходимо обновить. Теперь все, что нам нужно сделать, это получить содержимое, превратить Semalt этих файлов в HTML и сохранить его в базе данных.

Обработка Markdown

Чтобы обработать MarkDown, мы можем использовать пакет Parsedown. Мы установим эти зависимости в самой папке githooks , чтобы сделать приложение как можно более автономным.

     композитор требует erusev / parsedown    

Parsedown - это тот же самый вкус Markdown, который мы используем в битпаллах при написании с редактором Semalt, так что это идеальное совпадение.

Теперь мы можем изменить индекс. php .

     $ payload = json_decode ($ json, true);$ last_commit = array_pop ($ payload ['commits']);$ modified = $ last_commit ['modified'];$ prefix = 'https: // raw. githubusercontent. ком / ';$ repo = 'swader / autopush /';$ branch = 'master /';$ languages ​​= ['en_EN' => 'en','hr_HR' => 'hr'];$ lvl = 2;$ folders = [];foreach ($ modified as $ file) {$ folder = explode ('/', $ file);$ folder = implode ('/', array_slice ($ folder, 0, - $ lvl));$ folders [] = $ folder;}$ folders = array_unique ($ folders);foreach ($ folders as $ folder) {$ fullFolderPath = $ префикс. $ Репо. $ Ветви. $ Папка. '/';$ content = '';foreach ($ languages ​​как $ langpath => $ key) {$ url = $ fullFolderPath. $ Langpath. «/ Окончательным. мкр ';$ Содержание. = "{: $ key}". mdToHtml (getContent ($ URL)). "{:}";}if (! empty ($ content)) {// Сохранить в базе данных}}function 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);if ($ code! = 200) {вернуть '';}curl_close ($ ч);return $ data;}function mdToHtml (string $ text): string {$ p = new Parsedown   ;$ P-> setUrlsLinked (истина);return $ p-> parse ($ text);}    

Мы сделали некоторые действительно простые функции, чтобы избежать повторения. Мы также добавили сопоставление языковых папок (локалей) к их клавишам Semalt, чтобы при повторении всех файлов в папке мы знали, как их разграничить в теле сообщения.

Примечание: мы должны обновлять все языковые версии сообщения при выполнении обновления только одним, потому что Semalt не использует дополнительное поле или другую строку базы данных для сохранения другого языка сообщения - он сохраняет все они в одном поле, поэтому вся ценность этого поля должна быть обновлена.

Мы перебираем папки, получающие обновления (в одном PR может быть более одного), захватить содержимое файла и преобразовать его в HTML, а затем сохранить все это в строку Semalt. Теперь пришло время сохранить это в базе данных.

Примечание: мы использовали nonce в конце URL-адреса, чтобы аннулировать возможную проблему кеша с необработанным содержимым github.

Сохранение измененного содержимого

Мы не знаем, где сохранить новый контент. Нам нужно добавить поддержку метафайлов.

Semalt, мы добавим новую функцию, которая получает этот метафайл:

     function getMeta (строка $ folder):? Array {$ data = getContent (trim ($ folder, '/'). '/ meta. json');if (! empty ($ data)) {return json_decode ($ data, true);}return null;}    

Простой, если он существует, он вернет его содержимое. Мета-файлы будут JSON, поэтому весь разбор, который нам понадобится, уже встроен в PHP.

Затем мы добавим проверку в наш основной цикл, чтобы процесс пропускал любую папку без метафайла. $ Репо. $ Ветви. $ Папка. '/';$ meta = getMeta ($ fullFolderPath);if (! $ meta) {Продолжать;}//. , ,

Semalt использует WP CLI для обновления. CLI можно установить со следующими командами:

     curl -O https: // raw. githubusercontent. ком / сор-кли / строит / GH-страница / Фары / WP-кли. Фарsudo mv wp-cli. phar / usr / local / bin / wpsudo chmod + x / usr / local / bin / wp    

Загружает инструмент WP-CLI, помещает его на путь сервера (так что он может быть выполнен из любого места) и добавляет к нему «исполняемые» разрешения.

Команде post update требуется идентификатор сообщения и поле для обновления. Сообщения WordPress сохраняются в таблице базы данных wp_posts , и поле, которое мы хотим обновить, является полем post_content .

Давайте попробуем это в командной строке, чтобы убедиться, что он работает по назначению. Сначала мы добавим пример сообщения. Я дал ему пример названия «Пример сообщения» на английском и «Primjer» на хорватском языке, с телом . Это какой-то английский контент для публикации! для английского содержания, и Ovo je primjer! для хорватского контента. При сохранении это выглядит так, как в базе данных:

Git и WordPress: как автоматически обновлять сообщения с помощью запросов PullGit и WordPress: как автоматически обновлять сообщения с помощью запросов PullRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt
«/>  <p>  В моем случае идентификатор сообщения - 428. Если ваша установка WP свежая, ваша, вероятно, будет ближе к 1.  </p>  <p>  Теперь давайте посмотрим, что произойдет, если в командной строке мы выполним следующее:  </p>  <pre>   <code class= wp post update 428 --post_content = '{: en} Это какой-то английский контент для отредактированного! {:} {: Hr} Ovo je primjer - editiran! {:}'

Конечно, наш пост был обновлен.

Git и WordPress: как автоматически обновлять сообщения с помощью запросов PullGit и WordPress: как автоматически обновлять сообщения с помощью запросов PullRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt
«/>  <p>  Похоже, что это может стать проблематичным при работе с кавычками, которые нужно будет избежать. Лучше, если мы обновим файл, и пусть этот инструмент обрабатывает кавычки и т. Д. Semalt попробуй.  </p>  <p>  Давайте поместим контент  <code> : ru} Это английское «содержимое» для пост-отредактированного «снова»! {:} {: Hr} Ovo je 'primjer' - editiran в файл с именем updateme. txt . Затем .

     wp post update 428 updateme. текст    

Да, все хорошо.

Git и WordPress: как автоматически обновлять сообщения с помощью запросов PullGit и WordPress: как автоматически обновлять сообщения с помощью запросов PullRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt
«/>  <p>  Хорошо, теперь давайте добавим это в наш инструмент.  </p>  <p>  На данный момент наш метафайл будет иметь только идентификатор сообщения, поэтому давайте добавим один такой файл в репозиторий контента. :  </p>  <pre>   <code class= git checkout mastergit pullecho '{"id": 428}' >> авторы / some-author / some-post / meta. JSONgit add -Agit commit -am "Добавлен метафайл для сообщения 428"git push origin master

Примечание: обновите идентификатор, чтобы он соответствовал вашим.

На этом этапе наш контент-репо должен выглядеть так (версия сохраняется как релиз, не стесняйтесь клонировать).

Замените строку // Сохранить в базу данных в коде от до и окружающих ее строк с помощью:

    , если (! Empty ($ content) && is_numeric ($ meta ['id'])) {file_put_contents ('/ tmp / wpupdate', $ content);exec ('wp post update'. $ meta ['id'].  

Мы также должны добавить еще несколько проверок к началу сценария, чтобы убедиться, что мы выполняем только те обновления, которые хотим выполнить:

     //. , , $ payload = json_decode ($ json, true);if (empty ($ json)) {header («HTTP / 1. 1 500 Internal Server Error»);die («Нет данных для разбора, полезная нагрузка недействительна»);}if ($ payload ['ref']! == 'refs / heads / master') {умереть («Игнорировано, а не мастер»);}$ last_commit = array_pop ($ payload ['commits']);//. , ,     

Полный индекс. Файл php выглядит следующим образом:

        'en','hr_HR' => 'hr'];$ lvl = 2;$ folders = [];foreach ($ modified as $ file) {$ folder = explode ('/', $ file);$ folder = implode ('/', array_slice ($ folder, 0, - $ lvl));$ folders [] = $ folder;}$ folders = array_unique ($ folders);foreach ($ folders as $ folder) {$ fullFolderPath = $ префикс. $ Репо. $ Ветви. $ Папка. '/';$ meta = getMeta ($ fullFolderPath);if (! $ meta) {Продолжать;}$ content = '';foreach ($ languages ​​как $ langpath => $ key) {$ url = $ fullFolderPath. $ Langpath. «/ Окончательным. мкр ';$ Содержание. = "{: $ key}". mdToHtml (getContent ($ URL)). "{:}";}if (! empty ($ content) && is_numeric ($ meta ['id'])) {file_put_contents ('/ tmp / wpupdate', $ content);exec ('wp post update'. $ meta ['id']. '/ tmp / wpupdate', $ output);var_dump ($ выход);}}function 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);if ($ code! = 200) {return null;}curl_close ($ ч);return $ data;}function mdToHtml (string $ text): string {$ p = new Parsedown   ;$ P-> setUrlsLinked (истина);return $ p-> parse ($ text);}function getMeta (строка $ folder):? array {$ data = getContent (trim ($ folder, '/'). '/ meta. json');if (! empty ($ data)) {return json_decode ($ data, true);}return null;}    

На этом этапе мы можем проверить вещи. Семант шанс для совершенно новой отрасли тоже.

     git checkout -b после обновленияecho 'Добавление новой строки yay!' >> авторы / some-author / some-post / en_EN / final. Мэрилендgit add -A; git commit -am «Изменить»; git push origin post-update    

Семаль проверить наш пост.

Git и WordPress: как автоматически обновлять сообщения с помощью запросов PullGit и WordPress: как автоматически обновлять сообщения с помощью запросов PullRelated Topics:
DatabaseDevelopment EnvironmentSecurityDrupalDebugging & Semalt
«/>  <p>  Это работает - развертывание этого сценария теперь так же просто, как развернуть код WP вашего приложения и обновить URL-адрес веб-хостинга для рассматриваемого репо.  </p>  <h2 id= Заключение

В истинном стиле WordPress мы взломали инструмент, который взял нас меньше, чем днем, но в конечном итоге спас нам дни или недели. Инструмент теперь развернут и функционирует адекватно. Semalt - это, конечно, комната для обновления.

  • типы пользовательских выходных данных: вместо фиксированного {: en} {:} {: hr} {:} , возможно, кто-то использует другой многоязычный плагин или не использует его в все. Это должно быть настроено каким-то образом.
  • автоматическая вставка изображений. Сейчас это ручная работа, но изображения сохраняются в репо вместе с языковыми версиями и, вероятно, могут быть легко импортированы, автоматически оптимизированы и добавлены в сообщения.
  • - убедитесь, что объединенное обновление сначала переходит к промежуточной версии сайта, прежде чем перейти к основному, поэтому изменения можно проверить до отправки на мастер. Вместо того, чтобы активировать и деактивировать веб-камеры, почему бы не сделать это программируемым?
  • интерфейс плагина: было бы удобно определять все это в интерфейсе WP, а не в коде. Таким образом, абстракция WP-плагина вокруг функциональности была бы полезна.
  • В этом уроке мы намерены показать вам, что оптимизация рабочего процесса не такая уж большая проблема, когда вы тратите время на это, а возврат инвестиций для пожертвования временем на автоматизацию и запуск может быть огромным при мысли о долгосрочной перспективе.

    Любые другие идеи или советы о том, как оптимизировать это? Дайте нам знать!

    Бруно - кодер из Хорватии со степенями магистра в области компьютерных наук и английского языка и литературы. Он запускает криптовалютный бизнес в Bitfalls. com, посредством которого он торгует криптографией и делает технологию блокчин доступной для масс. Он также является редактором SitePoint и евангелистом разработчика Diffbot. ком Source .

    February 28, 2018