{"id":228673,"date":"2022-10-30T13:42:00","date_gmt":"2022-10-30T10:42:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228673"},"modified":"2022-11-09T03:44:11","modified_gmt":"2022-11-09T00:44:11","slug":"interfejsy-wtyczek-wordpress-praca-z-zasobami","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/interfejsy-wtyczek-wordpress-praca-z-zasobami\/","title":{"rendered":"Interfejsy wtyczek WordPress: praca z zasobami"},"content":{"rendered":"\n<p>Jedn\u0105 z zalet pracy z programowaniem obiektowym jest mo\u017cliwo\u015b\u0107 definiowania interfejs\u00f3w tak, aby klasy implementuj\u0105ce te interfejsy mia\u0142y \u015bcis\u0142y zestaw funkcji, kt\u00f3re te klasy musz\u0105 implementowa\u0107.<\/p>\n<p>W ka\u017cdym razie jest <a href=\"https:\/\/stackoverflow.com\/a\/1022066\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">to definicja<\/a> interfejsu klasowego:<\/p>\n<blockquote>\n<p>Interfejs to kontrakt okre\u015blaj\u0105cy zestaw metod, p\u00f3l i w\u0142a\u015bciwo\u015bci, kt\u00f3re b\u0119d\u0105 dost\u0119pne na dowolnym obiekcie implementuj\u0105cym<\/p>\n<\/blockquote>\n<p>Ale jak to mo\u017ce wygl\u0105da\u0107, je\u015bli naszym celem jest stworzenie rozwi\u0105zania z przestrzeni\u0105 nazw do do\u0142\u0105czania interfejs\u00f3w wtyczek WordPress (lub interfejsu) dla klasy, kt\u00f3ra mo\u017ce by\u0107 u\u017cywana do kolejkowania arkuszy styl\u00f3w lub plik\u00f3w JavaScript?<\/p>\n<h2>Interfejsy wtyczek WordPress: zasoby<\/h2>\n<p>Na potrzeby tego posta za\u0142\u00f3\u017cmy, \u017ce definiujemy interfejs, kt\u00f3ry b\u0119dzie u\u017cywany w obszarze administracyjnym WordPressa. Oznacza to, \u017ce stworzymy interfejs, kt\u00f3ry b\u0119dzie u\u017cywany do kolejkowania arkuszy styl\u00f3w i plik\u00f3w JavaScript.<\/p>\n<p>Musimy uwzgl\u0119dni\u0107 nast\u0119puj\u0105ce elementy:<\/p>\n<ul>\n<li>przestrze\u0144 nazw, kt\u00f3r\u0105 mo\u017cna wykorzysta\u0107 w ca\u0142ym projekcie,<\/li>\n<li>funkcja do inicjalizacji klasy,<\/li>\n<li>funkcja do faktycznego kolejkowania aktyw\u00f3w.<\/li>\n<\/ul>\n<p>A poniewa\u017c jest to na tyle og\u00f3lne, \u017ce mo\u017ce by\u0107 u\u017cywane w JavaScript i arkuszach styl\u00f3w, zdecydowa\u0142em si\u0119 po prostu nazwa\u0107 go <strong>Asset<\/strong>.<\/p>\n<p>Wynik ko\u0144cowy mo\u017ce wygl\u0105da\u0107 mniej wi\u0119cej <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-00-interface-asset-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeAdminInterfaces;\n\ninterface Asset {\n\n    public function init();\n    public function enqueue();\n}\n<\/code><\/pre>\n<p>Nast\u0119pnie musimy faktycznie <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-01-javascript-asset-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zaimplementowa\u0107 interfejs<\/a> z klas\u0105. Powinno to by\u0107 stosunkowo proste, poniewa\u017c ustalili\u015bmy metody, kt\u00f3re musz\u0105 zosta\u0107 zaimplementowane.<\/p>\n<p>Zauwa\u017c jednak, \u017ce udost\u0119pniam kilka w\u0142a\u015bciwo\u015bci, kt\u00f3re s\u0105 ustawiane w konstruktorze klasy. S\u0105 one specyficzne dla tej klasy i sprawiaj\u0105, \u017ce czynno\u015b\u0107 faktycznego zakolejkowania pliku jest nieco \u0142atwiejsza.<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeAdmin;\nuse AcmeAdminInterfaces;\n\nclass JavaScript_Assets implements InterfacesAsset {\n\n    private $assets_dir;\n\n    private $js_dir;\n\n    public function __construct() {\n\n        $this-&gt;assets_dir = trailingslashit(\n            plugin_dir_url( __FILE__ ). 'assets'\n        );\n\n        $this-&gt;js_dir = trailingslashit( $this-&gt;assets_dir. 'js' );\n    }\n\n    public function init() {\n\n        add_action(\n            'admin_enqueue_scripts',\n            array( $this, 'enqueue') );\n    }\n\n    public function enqueue() {\n\n        wp_enqueue_script(\n            'toggle-admin-notices',\n            $this-&gt;js_dir. 'admin.js',\n            array( 'jquery' ),\n            false\n        );\n    }\n}\n<\/code><\/pre>\n<p>Kilka rzeczy do zapami\u0119tania na temat powy\u017cszego kodu:<\/p>\n<ul>\n<li>u\u017cywa\u00a0 s\u0142owa kluczowego <strong>use<\/strong>, aby PHP wiedzia\u0142o, \u017ce b\u0119dziemy pracowa\u0107 z interfejsem <strong>Asset ,<\/strong><\/li>\n<li>Poprzedzi\u0142em nazw\u0119 <strong>JavaScriptem<\/strong>, aby by\u0142o jasne, z jakim typem zasobu pracuj\u0119.<\/li>\n<\/ul>\n<p>Na koniec, aby utworzy\u0107 instancj\u0119 klasy, kt\u00f3ra implementuje interfejs, po prostu <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-02-class-instantiation-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zr\u00f3b to<\/a> :<\/p>\n<pre><code>&lt;?php\n\n$assets = new AdminJavaScript_Assets();\n$assets-&gt;init();\n<\/code><\/pre>\n<p>Jasne, ten konkretny przyk\u0142ad jest prosty i pomin\u0105\u0142em zwyk\u0142e komentarze do kodu, ale generalnie chodzi o czytelno\u015b\u0107. Je\u015bli chcesz zobaczy\u0107 co\u015b takiego w akcji, przejrzyj kod \u017ar\u00f3d\u0142owy dla<\/p>\n<p>Je\u015bli chcesz zobaczy\u0107 co\u015b takiego w dzia\u0142aniu, przejrzyj kod \u017ar\u00f3d\u0142owy <a href=\"https:\/\/github.com\/tommcfarlin\/toggle-admin-notices\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tej konkretnej wtyczki<\/a>.<\/p>\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>Jak to mo\u017ce wygl\u0105da\u0107, je\u015bli naszym celem jest stworzenie rozwi\u0105zania dla interfejs\u00f3w wtyczek WordPress dla klasy, kt\u00f3ra mo\u017ce by\u0107 u\u017cywana do kolejkowania zasob\u00f3w?<\/p>\n","protected":false},"author":1,"featured_media":220968,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,919,897,845,866],"tags":[1169],"class_list":["post-228673","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-kod","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228673","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=228673"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228673\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/220968"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}