So organisieren Sie die Entwicklung und UnterstĂŒtzung eines Blogs in WordPress in 2Q19 und beheben es nicht

Denken Sie im Voraus ĂŒber Skalierung nach, nutzen Sie Standard-Wordpress-Lösungen optimal, erstellen Sie ein WP-Thema mit Ihren eigenen HĂ€nden, kĂŒmmern Sie sich um die Bequemlichkeit eines Layout-Designers, konzentrieren Sie sich auf MobilitĂ€t - und aktualisieren Sie den Blog des Unternehmens, damit Leser, Redakteure und FĂŒhrungskrĂ€fte ihn lieben. Wir haben es geschafft.


PromoPult Blog


Promopults Blog ist 9 Jahre alt. WĂ€hrend dieser Zeit durchlief er mehrere Transformationen. Sergey Glazov , der Technologe unseres Blogs und anderer wichtiger Dinge im Promopult-System, spricht ĂŒber Letzteres.


Dies wird nicht mehr diskutiert, da es zur Norm geworden ist: ein schneller und einfacher Standard fĂŒr das Blog eines Unternehmens, eine Person, ein persönliches, ja, was auch immer, WordPress. Sie können argumentieren, aber die Tatsache bleibt.


Ich möchte darĂŒber sprechen, was ich in Bezug auf die Organisation des Codes, die Arbeit mit dem WordPress-Blog und dessen UnterstĂŒtzung erreicht habe. Diese Geschichte handelt von dem Prozess, da der aktuelle Status der letzte Punkt in diesem Prozess ist und es den Anschein hat, dass der aktuelle Status im Vergleich zu allen frĂŒheren Iterationen in den AnsĂ€tzen zur Organisation am erfolgreichsten ist.



Was ist bei (meinem) Start passiert - im Jahr 2016


Es ist selten, wenn ein Entwickler alles von Grund auf neu erstellt und durchdacht. HĂ€ufiger stellt sich heraus, dass bereits ( oft sogar vor langer Zeit, mit einer separaten Historie ) ein Projekt unterstĂŒtzt werden muss. Neugestaltung, Änderungen, große TK und Anforderungen. Und unter den Bedingungen des Bestehenden ist es notwendig, irgendwie schnell zu navigieren und Probleme zu lösen.


Ich habe den Blog 2016 angenommen, als er bereits eine lange Geschichte hatte und nicht alles so schön ist, wie ich wollte.


So sah der Blog von SeoPult Anfang 2016 aus.


  1. Altes Blog-Design mit einer neunjÀhrigen Geschichte.
  2. Das Fehlen einer Handy- / Tablet-Version in irgendeiner Form.
  3. Mehr als 600 BeitrÀge.
  4. Strukturelle Probleme mit Inhalten und ihrer Organisation: mehr als 20 Kategorien und mehr als neunhundert Tags (jetzt mehr, aber wir haben bereits aufgehört).
  5. Die PlĂ€ne haben bereits ein Rebranding und den Umzug in eine neue Domain. Dies gilt auch fĂŒr den Blog.
  6. Eine lange Kette von Aktionen bei der Arbeit mit Code.
  7. Arbeiten Sie ohne Versionskontrolle (.git).

Erste Aufgaben: Mobilisierung und Design


Die Hauptaufgabe bestand darin, das bestehende Thema des Blogs anpassungsfĂ€hig zu machen: Mobile Benutzer können BeitrĂ€ge lesen und die Website angemessen nutzen. Sie sprachen und schrieben immer mehr ĂŒber Mobile First , und Statistiken zeigten, dass sie das Blog von MobilgerĂ€ten aus lesen.


Statistiken in Yandex.Metrica


Parallel zu diesen Arbeiten wurde ein neues Design gezeichnet.


Als Entwickler habe ich mit dem Designer zusammengearbeitet, ohne eine unnötige Kette von Mediatoren in der Diskussion, sodass der Kommunikationsprozess schneller und lebendiger war. Die offensichtliche Tatsache natĂŒrlich, aber aus irgendeinem Grund wird sie in vielen Prozessen vernachlĂ€ssigt. Und es stellt sich heraus, dass der Designer etwas tut, das sehr von der RealitĂ€t getrennt ist. Sprechen Sie mit Ihrem Mund und besprechen Sie alle Punkte. Jeder Teilnehmer am Prozess ist daran interessiert, Gutes und Cooles zu tun. Aber nicht jeder versteht, dass der Prozess eine zusammenhĂ€ngende Kette ist. Wenn ein einzelner Darsteller an seinem Arbeitsplatz etwas verpasst oder nicht tut, wird es fĂŒr die Menschen im nĂ€chsten Prozess schwierig.


WÀhrend der Arbeit an der mobilen Version habe ich die Nachteile und SchwÀchen der Organisation des Entwicklungsprozesses gesehen. Ich wollte alles beschleunigen und vereinfachen.


Wie bei der Arbeit am Code im Blog


Es gab eine DEV-Version des Blogs mit einer separaten Testdatenbank. Die Arbeit mit Dateien fand auf einem Remote-Server statt, die Tests fanden an einer separaten Adresse statt, auf die in der Außenwelt nicht zugegriffen werden konnte. Nach der Arbeit, dem Testen und der Geburt einer bestimmten Bedeutungseinheit wurde sie durch einen Aufruf an den Administrator auf dem Battle-Blog veröffentlicht. Was er tat, war eine separate Magie.


FĂŒr einen Blog, in dem sich einmal im Jahr etwas Ă€ndert, ein großartiger Prozess. Aber mit der neuen Ausgabe und ihren BedĂŒrfnissen wĂ€re ein solcher Prozess ein großer Schmerz.


Was ich bekommen wollte, wie sie sagen, "in einer idealen Welt"


Der gesamte Code liegt in. Git- Repositories. Die Kampfversion des Blogs ist der master dieses Repositorys. Alle Arbeiten mit dem Code erfolgen durch dev an einen dev oder andere Zweige, die mit einzelnen großen Aufgaben verbunden sind.


Nach Abschluss der Aufgabe wird eine Pull-Anforderung (PR) und / oder eine ZusammenfĂŒhrungsanforderung (MR) mit einer Reihe von Änderungen erstellt. Die Bedeutung in MR und PR ist gleich, aber in verschiedenen Diensten - ein anderer Name. Wir haben GitLab , also Merge Request.


Beim Erstellen von MR wird eine temporĂ€re Adresse des Formulars-git-branch-test.dev.blog.promopult.ru verfĂŒgbar, auf die nur ĂŒber IP fĂŒr die Live-ÜberprĂŒfung in der Testumgebung -git--test.dev.blog.promopult.ru werden kann.


Der Code im erstellten MR wird automatisch ĂŒberprĂŒft und ĂŒberprĂŒft (Code-Linter, bei dem ich die Syntax nach vordefinierten Regeln ĂŒberprĂŒfe) und im manuellen Modus (die vertikale Leistung im Team, der Timlid betrachtet ihn sorgfĂ€ltig mit seinem konvexen, aufmerksamen Auge). Nach bestandener ÜberprĂŒfung - ĂŒber die Browser-OberflĂ€che des .git-Repositorys wird die SchaltflĂ€che "ZusammenfĂŒhren" gedrĂŒckt und alle Änderungen werden nach einer kurzen offensichtlichen Zeitspanne im Kampfblog angezeigt.


Neugestaltung, erster Ansatz


Arbeitsplan fĂŒr die Neugestaltung des Blogs:


  1. Layout eines statischen Prototyps fĂŒr die Designlayouts aller Seiten;
  2. Das Layout in ein WordPress-Theme verwandeln ("Stretching").

Layout - eine separate Arbeitsstufe. FĂŒr die bequeme Arbeit mit Stilen (CSS), Markup und JS verwendete das Projekt eine Reihe von Plugins und Modulen, die ĂŒber die im Builder SPT (Start Project Template) beschriebenen Gulp-Aufgaben zusammengestellt werden.


Die SchlĂŒsselwörter, die im Sammler eines statischen Blog-Themas verwendet werden, sind: HTML, CSS, JS, Babel, Gulp, PostCSS, SCSS, Nunjucks.


Nach Abschluss des Layouts war die Struktur wie folgt (es werden nur Verzeichnisse der ersten Ebene angezeigt ):


  ├── Design # Design, Layouts und alles
 ├── app / # Projektquellen: separate Module
 ├── dist / # Die zusammengestellte Version des Projekts (HTML-Dateien) und die gesamte Statik
 ├── gulpfile.js / # Config Gulp.js
 └── package.json # Collector-Konfigurationsdatei: Pakete, Skripte 

Jedes einzelne visuelle semantische Element auf der Seite, beispielsweise eine Postkarte ( /components/article_card/ ), war ein Ordner, in dem es sich befand:


- Markup-Datei ( article_card.html ),


- article_card.scss ( article_card.scss ),


- JS-Datei ( article_card.js ).


Und jede Seite wurde aus solchen separaten Komponentenblöcken zusammengesetzt. Blöcke sind bequem zu bearbeiten, und Änderungen wirken sich nicht auf benachbarte Elemente aus.


Bei der Ausgabe erstellte der Collector den Ordner dist , der vorgefertigte HTML-Dateien mit Seiten zur visuellen Anzeige im Browser wĂ€hrend der Bearbeitung und Koordination sowie eine Stildatei, alle Themen und zwei JS-Dateien app.js : Eine Datei ( app.js ) beschrieb die Logik und das Verhalten Die zweite vendor.js ( vendor.js ) enthielt alle fĂŒr die Site verwendeten Bibliotheken (jQuery, fotorama, Magnific-Popup und andere).


Als nĂ€chstes mĂŒssen Sie all dies in ein WordPress-Thema verwandeln und ĂŒber die Dateistruktur nachdenken. Damit Sie bequem mit einem statischen Layout arbeiten und daneben ein WP-Thema legen können.


Liste der vom Designer erstellten Layouts. Sie sind die gleichen wie die WordPress-Blog-Themendateien:


  • Homepage ( home.php Datei).
  • single.php Post / Post-Seite ( single.php ).
  • Ansicht einer einzelnen Textseite ( page.php ).
  • Die Newsletter-Abonnementseite ( subscribe.php ).
  • Fehler 404 ( 404.php ).
  • Separate Tag-Seite ( tag.php ).
  • Separate Kategorieseite ( category.php ).
  • Suche und Suchergebnisse ( search.php ).

Ein Workflow mit diesem Ansatz und der Trennung der statischen Version und der WordPress-Version des Themas lautet wie folgt: Wenn Sie etwas im visuellen Teil korrigieren mĂŒssen, werden die Änderungen in der statischen Version vorgenommen und nach dem Test auf das Thema ĂŒbertragen. Wenn in einem nicht visuellen Teil Änderungen erforderlich sind, werden nur WP-Themendateien geĂ€ndert.


Der Blog- bsp ist bsp . Es befindet sich entlang des Pfads im Ordner mit den Themen des Blogs selbst:


  ├── wp-content / # Benutzerdefinierte WordPress-Site-Dateien
 │ ├ Themen / # Site-Themen
 / │ ├ App / # Quellen eines statischen Themas
 Ul │ │ ├ gulpfile.js / # Gulp-Aufgaben fĂŒr die Montage
 │ │ ├ dist / # Erstellen Sie ein statisches Thema
 / │ │ ├ Assets / # Ressourcen: JS, CSS und Grafiken 
 │ │ ├ bsp / # WP-PromoPult-Blog-Thema
 Assets │ │ ├ Assets / # Ressourcen: JS, CSS und Grafiken, Kopieren von `/ dist /`
 │ │ │ ├ home.php # Die Hauptseite des Blogs und andere Dateien im Stammverzeichnis des Themas 

Der Ort des WordPress-Themas ist offensichtlich und durch die Dateistruktur von WordPress selbst vorgegeben.


Es gibt keine anderen Themen im Themenverzeichnis - alles, was Standard ist, wurde gelöscht. Es gibt einen Mythos ĂŒber die Steigerung der ProduktivitĂ€t auf diese Weise, aber wir haben dies nicht bemerkt. Dies geschieht mehr fĂŒr die Bestellung im Code. Sie mĂŒssen nicht speichern, was nicht verwendet wird und wird definitiv nicht verwendet.


Ebenfalls in .git sind alle verwendeten WP-Plugins enthalten. Auf unserer Website sind dies Google XML-Sitemaps, RSS fĂŒr Yandex Turbo, RusToLat und WP-PostViews.


Der statische, kompilierte Prototyp der Blogseiten und Quelldateien wurde in das Blog-Themenverzeichnis verschoben, um bequem mit dem logischen Teil der Vorlage und mit allem zu interagieren, was fĂŒr das Erscheinungsbild und Verhalten der Elemente auf der Seite verantwortlich ist.


Eine statische Version der Projektassembly - mit der Quelle und allen AbhÀngigkeiten beim ersten Versuch, die Struktur zu organisieren - wurde im Themenverzeichnis abgelegt.


Das heißt, neben dem Haupt- bsp Thema wurde das Verzeichnis /app hinzugefĂŒgt, in dem sich der Quellcode fĂŒr das Themenlayout und den Gulp-Collector befinden. In dieser Version gab es jedoch einen schwierigen Moment: Statische Dateien wurden in einem separaten Verzeichnis generiert, und damit die Änderungen im WP-Theme vorgenommen werden konnten, mussten die statischen Stildateien und Skripte in den assets Ordner innerhalb des Themas kopiert werden.


Zweiter Ansatz: eine neue Version der Struktur



In den ersten Wochen wurde dies durch ein einfaches Konsolenskript entschieden, das die gesammelten Dateien von einem statischen Thema in ein WP-Thema kopierte. ÜbermĂ€ĂŸiges Handeln fĂŒhrt zu Fehlern. Daher bestand die Möglichkeit nur darin, die Struktur zu korrigieren.


Wir haben drei wichtige Verzeichnisse (von der Wurzel):


  1. WP-Thema: /wp-content/themes/bsp
  2. Quellen eines statischen Themas: /app
  3. Gesammeltes statisches Thema: /dist

Und darin befinden sich assets mit Stildateien, Grafiken und JS


Sie mĂŒssen alles so anordnen, dass die Dateien mit statischen Stilen und Skripten im gewĂŒnschten Ordner ( /wp-content/themes/bsp/assets ) /wp-content/themes/bsp/assets .


Die neue Version der Struktur war wie folgt:


  ├── gulpfile.js / # Gulp-Aufgaben fĂŒr die Montage
 ├── wp-content / # Benutzerdefinierte WordPress-Site-Dateien
 │ ├ Plugins / # WP-Plugins
 │ ├ Themen / # Site-Themen
 Sp │ ├ bsp / # PromoPult-Blog-Thema
 / │ │ ├ app / # Quellen eines statischen Themas
 Assets │ │ ├ Assets / # Ressourcen: JS, CSS und Grafiken (automatische Generierung)
 │ │ │ ├ home.php # Die Hauptseite des Blogs und andere Dateien im Stammverzeichnis des Themas
 ├── wp-admin / # WP-Dateien fĂŒr das Admin-Panel
 ├── wp-enthĂ€lt / # WP-Dateien des Systems 

Die Wurzel des gesamten Projekts sind Schluckaufgaben - und werden von der Wurzel aus ausgefĂŒhrt. Die Konfiguration von gulp-task beschreibt die Struktur, in der statische Dateien aus dem Verzeichnis wp-content/themes/bsp/assets wp-content/themes/bsp/app in wp-content/themes/bsp/assets ohne zusĂ€tzliche Aktionen wie Kopieren usw. wp-content/themes/bsp/assets werden.


WP-Themendateien bleiben unverĂ€ndert und die Arbeit wird gemĂ€ĂŸ dem alten Szenario fortgesetzt: Änderungen in der Statik → Übertragung in WP-Dateien. CSS- und JS-Statiken werden sofort im Themenordner generiert und alles funktioniert einfach.


MR-Beispiel fĂŒr PromoPult Blog


Bei all dem ging es um den Arbeitsprozess. Nun dazu, wie der Blog aufgebaut ist.


PromoPult Blog: Wie es funktioniert


Die Hauptmacht des Blogs ist das Team. Herausgeber, Autoren, Layouter.


Die große Aufgabe besteht darin, die Arbeit mit Blog-Inhalten im Admin-Bereich bequemer zu gestalten. Unter BerĂŒcksichtigung der Tatsache, dass das Thema unseres Blogs speziell fĂŒr Inhaltsaufgaben und redaktionelle Anfragen erstellt wurde, wurde das Admin-Panel entsprechend geĂ€ndert.


Checkliste vor Veröffentlichung


Jede Arbeit ist wichtig zu kontrollieren. Das Layout des Artikels ist ein standardisierter, formalisierter Prozess, der einfach in Form einer Checkliste dargestellt werden kann.


Die Jungs haben die Idee von EmailSoldiers gesehen . Wir haben beschlossen, es zu Hause anzuwenden.


PromoPult Blog Post Checkliste


Wenn ein Element nicht aktiviert ist, werden Sie vom System vor der Veröffentlichung gewarnt.


Durch Klicken auf die Links, unterstrichene Links im Listenelement - markieren Sie ein bestimmtes Element.


ZusÀtzliche Post-Einstellungen im Admin-Bereich


Die Checkliste wird in derselben Reihenfolge wie die zusÀtzlichen Post-Einstellungen im Admin-Bereich erstellt.


Blogpost-Einstellungen


Eng verwoben mit der oben beschriebenen Publikations-Checkliste.


Bei der Entwicklung des Themas habe ich versucht, keine Plugins zu verwenden, sondern eine einfache Lösung fĂŒr die Aufgaben des Themas zu finden. Highlights:


  • Beschreibungen fĂŒr SEO-Meta-Tags.
  • Beschreibungen fĂŒr OpenGraph-Tags, die soziale Netzwerke verwenden, um Material auszutauschen und schöne Artikelkarten zu bilden.
  • Bequeme Arbeit mit Titelbildern fĂŒr BeitrĂ€ge. Ein Bild ist erforderlich - es wird der Postkarte in der Publikationskachel hinzugefĂŒgt, die auf der Hauptseite und auf der Überschriften- oder Tag-Seite angezeigt wird.
  • ZusĂ€tzliche Themeneinstellungen: Ein Beitrag kann mit oder ohne Cover sein, es gibt einen kurzen AnkĂŒndigungstext, den wir in der Kopfzeile mit einem Cover anzeigen, und er wird auch in der Beschreibung des Artikels in der Digest-Mailingliste verwendet.

Bildschirm mit Abschnitt PromoPult-Blogpost-Einstellungen


Der Abschnitt mit den Post-Einstellungen wird ĂŒber Meta-Boxen und benutzerdefinierte Felder in WordPress implementiert.


Über das Meta-Feld wurde auch die Publikations-Checkliste hinzugefĂŒgt.


In Vorlagen ist das Arbeiten mit Feldern einfach: Wenn das Feld nicht leer und gefĂŒllt ist, erhalten wir den Wert und zeigen ihn an. So wird beispielsweise die Blockreaktion auf den Beitrag angezeigt:


 <?php if (get_post_meta($post->ID, 'postreaction', true)) { ?> <div class="article_reaction"> <div class="label-reaction"><span><?php echo get_post_meta($post->ID, 'postreaction', true); ?></span></div> </div><!-- /.article_reaction --> <?php } ?> 

Ein Beispiel fĂŒr eine Reaktionsausgabe auf einer Postkarte:


Abschluss der Reaktion auf einer Postkarte

Schöne kleine Dinge


Es gibt einige nette kleine Dinge, die vielleicht niemand sieht. Aber wenn jemand es bemerkt hat - gut.


Zum Beispiel die Veröffentlichungsdaten eines Beitrags in Karten und in einem separaten Beitrag in unserem kyrillischen Alphabet und wissen, wie man sich verbeugt. Aus irgendeinem Grund ist dies nicht in der WordPress-Box. Wenn das Veröffentlichungsdatum im aktuellen Jahr liegt, wird das Jahr bei uns nicht angezeigt. Wenn das Jahr vom aktuellen Jahr abweicht, wird das Datum zusammen mit dem Veröffentlichungsjahr angezeigt.


KommentarzĂ€hler posten. Sie argumentierten lange Zeit, dass "0 Kommentare" oder "keine Kommentare" sehr verwirrend sind. Die Lösung ist sehr einfach: Zeigen Sie den KommentarzĂ€hler ĂŒberhaupt nicht an, wenn weniger als ein Kommentar vorhanden ist.


Im Allgemeinen arbeiten wir separat an einem Kommentarsystem und möchten darĂŒber in einem separaten großen Beitrag sprechen. Wir erstellen ein einfaches und bequemes Kommentarsystem mit einfacher Autorisierung ĂŒber soziale Netzwerke.


Eigene Likes: Das Kommentieren oder Teilen von Links in sozialen Netzwerken hĂ€ngt von der Geschwindigkeit des Inhaltsverbrauchs ab. Klicken Sie jedoch auf „ GefĂ€llt mir“ und machen Sie deutlich, dass der Artikel cool ist - einfach und schnell. Wir machten unsere einfachen Likes und legten den ZĂ€hler auf die Postkarte. Und die Likes kommen ziemlich schnell an. Und da sie sich am Ende des Artikels befinden, ist dies auch ein Signal dafĂŒr, dass der Text gelesen wurde.


GefÀllt mir Post Button auf PromoPult Blog


Sie haben ein dunkles Thema fĂŒr ihren Blog erstellt - jetzt ist es in Mode. Unter BerĂŒcksichtigung des modularen Aufbaus (tatsĂ€chlich besteht die Site aus einer Reihe von Blöcken, die irgendwie untereinander kombiniert sind) und der Organisation der Stile stellte sich heraus, dass dies ziemlich schnell erledigt wurde.


Über eine interessante technische


Markup- Code , CSS und JS werden im Thema minimiert . CSS und JS werden durch Gulp-Tasks im Statics Collector komprimiert, die Minimierung des WP_HTML_Compression erfolgt jedoch ĂŒber den WordPress-Hook WP_HTML_Compression .


Und in den Kommentaren im Markup haben wir einen Werbecode fĂŒr diejenigen hinzugefĂŒgt, die daran interessiert sind, wie die Site von innen angeordnet ist, und die sich zunĂ€chst den Quellcode ansehen:


Quellcode fĂŒr PromoPult Blog


CSS- und JS-Caching. Um Stile und Skriptdateien zwischenzuspeichern, aber immer relevant zu sein, verwenden wir filemtime (), wenn wir etwas ĂŒberarbeitet haben. Viele verwenden in diesem Fall ?<?php echo time(); ?> ?<?php echo time(); ?> . Diese Option lĂ€dt jedoch die Datei herunter und stellt bei jedem Aufruf eine Anfrage.


Besser einen solchen Trick anwenden:


 <link rel="stylesheet" type="text/css" href="<?php echo get_template_directory_uri(); ?>/assets/styles/style.css?t=<?php echo filemtime(get_theme_file_path().'/assets/styles/style.css'); ?>" /> 

In diesem Fall werden die Dateien heruntergeladen, wenn sie geĂ€ndert wurden, und das Datum, an dem die Datei geĂ€ndert wurde, wird dem Anforderungsparameter hinzugefĂŒgt.


Welche Plugins verwenden wir?


Trotz der Möglichkeit und des Wunsches, in einigen FÀllen mit Ihrer Entscheidung auszukommen, verwenden wir weiterhin Plugins. Unsere Liste lautet wie folgt:



Schlussfolgerungstipps fĂŒr diejenigen, die am Blog eines Unternehmens arbeiten


  • Ich rate Ihnen zu Beginn der Projektarbeit, sofort ĂŒber eine Skalierung nachzudenken.
  • Verwenden Sie bei Ihrer Arbeit .git . FĂŒr 2019 natĂŒrlich seltsame RatschlĂ€ge, aber dieser Rat kann jemanden vor grauen Haaren bewahren und zurechtweisen, wenn etwas schief geht.
  • Es ist besser, die Entwicklung und Arbeit an einem WordPress-Thema in zwei Phasen zu unterteilen: erstens etwas Statisches erstellen und bereits etwas wie ein WordPress-Thema „ziehen“.
  • Wenn es eine Gelegenheit gibt - Zeit, Team und VerstĂ€ndnis dafĂŒr, warum Sie all dies brauchen - tun Sie es selbst, ohne vorgefertigte Optionen zu verwenden. Gewinnen Sie in Ordnung und verstehen Sie, wie alles funktioniert. Sie werden keine KrĂŒcken produzieren.
  • Verwenden Sie Standard-WordPress-Hooks und -Funktionen, wenn Ihr Blog darauf basiert. Das Anpassen und Erstellen einer bequemen Lösung ist schnell und einfach.
  • Machen Sie es dem Benutzer und den Redakteuren bequem.
  • Vergessen Sie nicht die sozialen Netzwerke und das Mikro-Layout.
  • Vergessen Sie nicht die mobilen Versionen.
  • Vergessen Sie nicht die regelmĂ€ĂŸigen Updates von Plugins und Systemen.
  • WĂ€hlen Sie nur bewĂ€hrte Plugins aus.

Die Arbeit am Blog geht weiter - bleiben Sie bei uns.

Source: https://habr.com/ru/post/de457402/


All Articles