{"id":228848,"date":"2022-11-03T12:40:00","date_gmt":"2022-11-03T09:40:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228848"},"modified":"2022-11-09T04:35:54","modified_gmt":"2022-11-09T01:35:54","slug":"szybkie-prototypowanie-prototypowanie-do-kodu-czesc-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/szybkie-prototypowanie-prototypowanie-do-kodu-czesc-1\/","title":{"rendered":"Szybkie prototypowanie: Prototypowanie do kodu, cz\u0119\u015b\u0107 1"},"content":{"rendered":"\n<p>Je\u015bli chodzi o szybkie prototypy i WordPress, do tej pory zrobili\u015bmy dwie rzeczy:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/szybkie-prototypowanie-z-wordpress-od-koncepcji-do-wtyczki\/\" title=\"zaplanowa\u0142 wtyczk\u0119\" >zaplanowa\u0142 wtyczk\u0119<\/a> ,<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/szybkie-prototypowanie-z-wordpress-analiza-koncepcji\/\" title=\"naszkicowa\u0142em schemat, w jaki spos\u00f3b mo\u017cna zorganizowa\u0107 kod\" >naszkicowa\u0142em schemat, w jaki spos\u00f3b mo\u017cna zorganizowa\u0107 kod<\/a><\/li>\n<\/ol>\n<p>W tym momencie wykonali\u015bmy wystarczaj\u0105co du\u017co pracy, aby uzasadni\u0107 rozpocz\u0119cie refaktoryzacji naszego kodu. Oznacza to, \u017ce zaczniemy konwertowa\u0107 prototyp na kod. Ale to jest co\u015b, co trzeba b\u0119dzie zrobi\u0107 w dw\u00f3ch fazach.<\/p>\n<p>Najpierw po prostu wprowadzimy klasy, kt\u00f3re reprezentuj\u0105 diagramy z poprzedniego postu i zawieraj\u0105 odpowiedzialno\u015b\u0107 za ka\u017cdy projekt.<\/p>\n<p>Nast\u0119pnie przyjrzymy si\u0119 organizacji kodu w przestrzenie nazw i pakiety. Zanim jednak b\u0119dziemy mogli to zrobi\u0107, musimy upewni\u0107 si\u0119, \u017ce kod jest zorientowany obiektowo i pozostaje funkcjonalny. A wi\u0119c to w\u0142a\u015bnie wydarzy si\u0119 w tym po\u015bcie.<\/p>\n<h2>Prototyp do kodu<\/h2>\n<p>Je\u015bli czyta\u0142e\u015b poprzednie posty, pami\u0119taj, \u017ce zamierzam \u015bledzi\u0107 organizacj\u0119, kt\u00f3r\u0105 naszkicowa\u0142em w ostatnim po\u015bcie. Oczywi\u015bcie nie musisz pod\u0105\u017ca\u0107 za tym konkretnym projektem.<\/p>\n<h3>S\u0142owo o kontroli \u017ar\u00f3de\u0142<\/h3>\n<p>Je\u015bli u\u017cywasz kontroli \u017ar\u00f3d\u0142a, w tym miejscu zalecam utworzenie <a href=\"https:\/\/git-scm.com\/book\/en\/v1\/Git-Branching\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ga\u0142\u0119zi<\/a> z ga\u0142\u0119zi master (je\u015bli u\u017cywasz Git), aby m\u00f3c wykonywa\u0107 swoj\u0105 prac\u0119 bez naruszania stabilnej wersji kodu.<\/p>\n<p>Jest to nieco poza zakresem serii, wi\u0119c je\u015bli nie u\u017cywasz kontroli \u017ar\u00f3d\u0142a, nie martw si\u0119. Je\u015bli tak, to wybieram <strong>rozwini\u0119cie<\/strong> jako nazw\u0119 tej ga\u0142\u0119zi. Po\u0142\u0105cz\u0119 go z powrotem w <strong>master\u00a0<\/strong>, gdy b\u0119d\u0119 pewien, \u017ce dzia\u0142a.<\/p>\n<h3>Pisanie kodu<\/h3>\n<p>Zgodnie z naszkicowan\u0105 wczoraj prac\u0105 stworz\u0119 dwie klasy:<\/p>\n<ol>\n<li>klasa meta box,<\/li>\n<li>klasa wy\u015bwietlania metabox.<\/li>\n<\/ol>\n<p>Nast\u0105pi ponowne wykorzystanie kodu z tego, co ju\u017c widzieli\u015bmy, jak zobaczysz w poni\u017cszym kodzie.<\/p>\n<h4>Kod<\/h4>\n<p>Po pierwsze, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-00-class-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nasze meta box<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Registers the Meta Box with WordPress.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Registers the Meta Box with WordPress. Defines the ID, title, display function,\n * and the post type on which it will live.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Meta_Box_Display\n     *\/\n    private $meta_box_display;\n\n    \/**\n     * Instantiates the class by setting its property equal to a reference to its display.\n     *\/\n    public function __construct() {\n        $this-&gt;meta_box_display = new Meta_Box_Display();\n    }\n\n    \/**\n     * The function responsible for hooking into the WordPress API.\n     *\/\n    public function init() {\n\n        add_meta_box(\n            'three-recent-posts',\n            'Three Recent Posts',\n            array( $this-&gt;meta_box_display, 'display' ),\n            'post',\n            'side'\n        );\n    }\n}\n<\/code><\/pre>\n<p>A nast\u0119pnie <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-01-class-meta-box-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nasz wy\u015bwietlacz<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Defines the display for the meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Defines the display for the meta box that will render the content in the\n * context of its meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box_Display {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Post_Messenger\n     *\/\n    private $messenger;\n\n    \/**\n     * Instantiates the object by setting a property equal to that of the class\n     * responsible for rendering the messages from the post query.\n     *\/\n    public function __construct() {\n        $this-&gt;messenger = new Post_Messenger( $this );\n    }\n\n    \/**\n     * If there are posts to display, renders them in the metabox. Otherwise, displays\n     * a note that there are no posts to display.\n     *\/\n    public function display( $message) {\n        $this-&gt;messenger-&gt;get_message();\n    }\n}\n<\/code><\/pre>\n<p>\u017be w kodzie meta box, w kodzie meta box jawnie tworzymy instancj\u0119 wy\u015bwietlania, aby\u015bmy w razie potrzeby mogli wywo\u0142a\u0107 jego metod\u0119 wy\u015bwietlania.<\/p>\n<p>Inn\u0105 alternatyw\u0105 by\u0142oby utworzenie oddzielnego wyst\u0105pienia dw\u00f3ch obiekt\u00f3w, a nast\u0119pnie wstrzykni\u0119cie wy\u015bwietlacza do pola meta za pomoc\u0105 wstrzykni\u0119cia konstruktora lub czego\u015b podobnego. Musia\u0142oby to zosta\u0107 zrobione w klasie innej firmy.<\/p>\n<p>Zalet\u0105 tego jest nieco wi\u0119ksze rozdzielenie obu klas. By\u0107 mo\u017ce om\u00f3wimy, jak to zrobi\u0107 w nast\u0119pnym po\u015bcie.<\/p>\n<p>Nast\u0119pnie musimy przej\u015b\u0107 dalej i zdefiniowa\u0107 klas\u0119 odpowiedzialn\u0105 za wy\u015bwietlanie wiadomo\u015bci w kontek\u015bcie Meta Box Display. Oto, co nazwiemy <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-02-class-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Messenger<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Display content for the meta box when requested.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Retrieves information from the class responsible for querying the database and\n * renders it in the context of our meta box when called via the Meta Box Display.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Messenger {\n\n    \/**\n     * A reference to the query resonsible for retrieving post information from\n     * the database.\n     *\n     * @access private\n     * @var    WP_Query\n     *\/\n    private $query;\n\n    \/**\n     * A reference to the message that's displayed in the view of the\n     * meta box.\n     *\n     * @access private\n     *\/\n    private $message;\n\n    \/**\n     * Instantiates the class by setting a reference to the query.\n     *\/\n    public function __construct() {\n        $this-&gt;query = new Post_Query();\n    }\n\n    \/**\n     * Retrieves the content to be displayed in the meta box.\n     *\/\n    public function get_message() {\n\n        $this-&gt;get_description();\n\n        if ($this-&gt;query-&gt;has_posts()) {\n            $this-&gt;get_post_message();\n        } else {\n            $this-&gt;get_no_posts_message();\n        }\n    }\n\n    \/**\n     * Displays the description of the content of the meta box.\n     *\n     * @access private\n     *\/\n    private function get_post_message() {\n        include_once 'post-list.php';\n    }\n\n    \/**\n     * Displays the description of the content of the meta box.\n     *\n     * @access private\n     *\/\n    private function get_description() {\n        include_once 'message-description.php';\n    }\n\n    \/**\n     * Displays a message of there are no recent posts.\n     *\n     * @access private\n     *\/\n    private function get_no_posts_message() {\n        include_once 'no-post-list.php';\n    }\n}\n<\/code><\/pre>\n<p>Zauwa\u017c, \u017ce Post Messenger r\u00f3wnie\u017c odwo\u0142uje si\u0119 do <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-03-post-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Query<\/a>. Jest to klasa, w kt\u00f3rej odbywa si\u0119 komunikacja z baz\u0105 danych. Do\u0142\u0105czy\u0142em r\u00f3wnie\u017c kilka funkcji pomocniczych, aby kod widoku by\u0142 nieco prostszy, jak zobaczymy za chwil\u0119.<\/p>\n<pre><code>&lt;?php\n\/**\n * Queries the database for three most recent posts.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Queries the database for three most recent posts. Returns the query to the\n * caller so that it can be interrogates for posts or not.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Query {\n\n    \/**\n     * A reference to the WP_Query this class wraps.\n     *\n     * @access private\n     * @var    WP_Query\n     *\/\n    private $query;\n\n    \/**\n     * Instantiates the class by preparing instance data and executing the\n     * query so the display can render the contents.\n     *\/\n    public function __construct() {\n\n        $this-&gt;query = null;\n        $this-&gt;get_posts();\n    }\n\n    \/**\n     * Executes the query for returning the post recent posts ordered by date.\n     *\n     * @access private\n     *\/\n    private function get_posts() {\n\n        $args = array(\n            'post_type'   =&gt; 'post',\n            'post_status' =&gt; 'publish',\n            'orderby'     =&gt; 'date',\n            'order'       =&gt; 'desc',\n        );\n        $this-&gt;query = new WP_Query( $args );\n\n        return $this-&gt;query;\n    }\n\n    \/**\n     * A helper function to determine if the query has any posts.\n     *\/\n    public function has_posts() {\n        return! $this-&gt;query-&gt;have_posts();\n    }\n\n    \/**\n     * A helper function for retrieving the next post in the list of\n     * posts\n     *\/\n    public function the_post() {\n        return $this-&gt;query-&gt;the_post();\n    }\n}\n<\/code><\/pre>\n<p>I to wszystko w przypadku klas podstawowych. Oczywi\u015bcie musimy jeszcze porozmawia\u0107 o pogl\u0105dach.<\/p>\n<h4>Widoki<\/h4>\n<p>Widoki odpowiadaj\u0105 za renderowanie kodu HTML w kontek\u015bcie pola meta. Nie lubi\u0119 pisa\u0107 HTML w kontek\u015bcie PHP (ani te\u017c lubi\u0119 miesza\u0107 PHP w kontek\u015bcie HTML, ale jest to nieuniknione w tym projekcie).<\/p>\n<p>Jest kilka \u015bwietnych projekt\u00f3w szablon\u00f3w, kt\u00f3re to u\u0142atwiaj\u0105, ale mam dygresj\u0119. W ka\u017cdym razie zauwa\u017cysz, \u017ce w\u00a0 pliku <strong>post-list.php<\/strong> znajduj\u0105 si\u0119 odniesienia do funkcji pomocniczych w klasie Post Query. Ma to na celu upewnienie si\u0119, \u017ce nie ujawniam zbyt wielu w\u0142a\u015bciwo\u015bci i nie naruszam Prawa Demeter.<\/p>\n<p>Przyjrzyjmy si\u0119 najpierw temu plikowi, poniewa\u017c <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-04-post-list-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jest najbardziej skomplikowany<\/a> :<\/p>\n<pre><code>&lt;ol&gt;\n    &lt;?php while ($this-&gt;query-&gt;has_posts()) {  ?&gt;\n        &lt;?php $this-&gt;query-&gt;the_post(); ?&gt;\n        &lt;li&gt;\n            &lt;a href=\"&lt;?php get_the_permalink(); ?&gt;\" target=\"_blank\"&gt;\n                &lt;?php echo get_the_title(); ?&gt;\n            &lt;\/a&gt;\n        &lt;\/li&gt;\n    &lt;?php } ?&gt;\n&lt;\/ol&gt;<\/code><\/pre>\n<p>Wygl\u0105da jak standardowy kod WordPressa, ale pami\u0119taj, \u017ce skoro ten plik jest wywo\u0142ywany w <strong>Post Messenger<\/strong>, b\u0119dzie odnosi\u0107 si\u0119 do zapytania jako do zapytania, kt\u00f3re jest opakowane przez t\u0119 klas\u0119.<\/p>\n<p>Ostatnie dwa pliki s\u0105 do\u015b\u0107 proste. Jeden z nich zawiera <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-06-message-description-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">opis<\/a> :<\/p>\n<pre><code>&lt;p&gt;\n    &lt;span class=\"description\"&gt;\n        Displays up to the three most recent posts.\n    &lt;\/span&gt;&lt;!-- .description --&gt;\n&lt;\/p&gt;<\/code><\/pre>\n<p>Drugi wy\u015bwietla komunikat, gdy nie ma <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-07-no-post-list-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u017cadnych post\u00f3w<\/a> :<\/p>\n<pre><code>&lt;p&gt;There are no recent posts.&lt;\/p&gt;<\/code><\/pre>\n<p>Poza tym jest wykonywana podstawowa funkcjonalno\u015b\u0107.<\/p>\n<h3>Uruchamianie wtyczki<\/h3>\n<p>Ostatni\u0105 rzecz\u0105, kt\u00f3r\u0105 musimy zrobi\u0107, to uruchomi\u0107 wtyczk\u0119. W tym celu zmieniamy kod w g\u0142\u00f3wnym pliku wtyczki tak, aby wygl\u0105da\u0142 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-08-three-recent-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Three Recent Posts\n *\n * @package     TRP\n * @author      Tom McFarlin\n * @copyright   2017 Tom McFarlin\n * @license     MIT\n *\n * @wordpress-plugin\n * Plugin Name: Three Recent Posts\n * Plugin URI:  https:\/\/tommcfarlin.com\/three-recent-posts\/\n * Description: Displays the three mot recent posts in your post editor screen.\n * Version:     0.2.0\n * Author:      Tom McFarlin\n * Author URI:  https:\/\/tommcfarlin.com\n * Text Domain: three-recent-posts\n * License:     GPL\n * License URI: http:\/\/www.gnu.org\/licenses\/gpl-3.0.txt\n *\/\n\ninclude 'class-meta-box.php';\ninclude 'class-meta-box-display.php';\ninclude 'class-post-messenger.php';\ninclude 'class-post-query.php';\n\nadd_action( 'add_meta_boxes', 'trp_start' );\n\/**\n * Starts the plugin.\n *\/\nfunction trp_start() {\n\n    $meta_box = new Meta_Box();\n    $meta_box-&gt;init();\n}\n<\/code><\/pre>\n<p>To pod\u0142\u0105czy si\u0119 do WordPressa, utworzy instancj\u0119 naszej wtyczki, a nast\u0119pnie wprawi j\u0105 w ruch. Kiedy uruchomisz go w swojej instalacji WordPressa, powinien wygl\u0105da\u0107 dok\u0142adnie tak, jak w pierwszej wersji.<\/p>\n<p>Jedyna r\u00f3\u017cnica polega na tym, \u017ce mamy teraz rzeczy zorganizowane w klasy, a nie w poszczeg\u00f3lne funkcje.<\/p>\n<h2>Uwagi<\/h2>\n<p>Po pierwsze, istniej\u0105 tutaj mo\u017cliwo\u015bci refaktoryzacji, kt\u00f3ra jeszcze bardziej zmniejszy\u0142aby rozdzielenie (takie jak r\u00f3\u017cne rodzaje <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wstrzykiwania zale\u017cno\u015bci<\/a> itp.), ale celem tej serii nie jest pokrycie tego.<\/p>\n<p>Zamiast tego jest to pomys\u0142 zobaczenia wtyczek napisanych przez wiele funkcji proceduralnych, a nast\u0119pnie rozbicie ich na bardziej konceptualne klasy, kt\u00f3re obejmuj\u0105 ich obowi\u0105zki.<\/p>\n<p>Po drugie, je\u015bli przejrzysz kod \u017ar\u00f3d\u0142owy w repozytorium dla tej wersji projektu, zobaczysz, \u017ce wprowadzi\u0142em r\u00f3wnie\u017c composer.json. Dzieje si\u0119 tak, aby podczas pisania kodu m\u00f3c korzysta\u0107 z <a href=\"https:\/\/tommcfarlin.com\/php-codesniffer-with-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP CodeSniffer<\/a> i <a href=\"https:\/\/tommcfarlin.com\/following-the-wordpress-coding-standards\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Coding Standards .<\/a><\/p>\n<p>W ostatniej cz\u0119\u015bci serii zajmiemy si\u0119 <a href=\"https:\/\/wordpress.mediadoma.com\/pl\/przestrzenie-nazw-i-automatyczne-ladowanie-w-wordpress\/\" title=\"przestrzeni\u0105 nazw\">przestrzeni\u0105 nazw<\/a> i reorganizacj\u0105 plik\u00f3w. Je\u015bli czas pozwoli, dodamy autoloader, dzi\u0119ki czemu nie b\u0119dziemy musieli r\u0119cznie umieszcza\u0107 plik\u00f3w na g\u00f3rze naszego pliku wtyczki.<\/p>\n<p>W ko\u0144cu po\u0142\u0105czy\u0142em ten kod <a href=\"https:\/\/github.com\/tommcfarlin\/three-recent-posts\/tree\/0.2.1\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">z masterem i oznaczy\u0142em go jako 0.2.1<\/a> (poniewa\u017c musia\u0142em zrobi\u0107 ma\u0142\u0105 poprawk\u0119), poniewa\u017c wci\u0105\u017c jest to bardzo w toku.<\/p>\n<h2>Posty z serii<\/h2>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/szybkie-prototypowanie-z-wordpress-od-koncepcji-do-wtyczki\/\" title=\"Szybkie prototypowanie z WordPress: od koncepcji do wtyczki\">Szybkie prototypowanie z WordPress: od koncepcji do wtyczki<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/szybkie-prototypowanie-z-wordpress-analiza-koncepcji\/\" title=\"Szybkie prototypowanie z WordPress: analiza koncepcji\">Szybkie prototypowanie z WordPress: analiza koncepcji<\/a><\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Szybkie prototypowanie: Prototypowanie do kodu, cz\u0119\u015b\u0107 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/szybkie-prototypowanie-prototypowanie-do-kodu-czesc-2\/\" title=\"Szybkie prototypowanie: Prototypowanie do kodu, cz\u0119\u015b\u0107 2\">Szybkie prototypowanie: Prototypowanie do kodu, cz\u0119\u015b\u0107 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/szybkie-prototypowanie-przedstawiamy-automatyczne-ladowanie\/\" title=\"Szybkie prototypowanie: Przedstawiamy automatyczne \u0142adowanie\">Szybkie prototypowanie: Przedstawiamy automatyczne \u0142adowanie<\/a><\/li>\n<\/ol>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tym miejscu zaczynamy konwertowa\u0107 nasz prototyp na kod. Powinno to pokaza\u0107, dlaczego warto w\u0142o\u017cy\u0107 w projekt przezorno\u015b\u0107.<\/p>\n","protected":false},"author":1,"featured_media":223902,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,919,845],"tags":[1169],"class_list":["post-228848","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-samouczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=228848"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228848\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223902"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}