{"id":233609,"date":"2023-02-17T12:54:00","date_gmt":"2023-02-17T09:54:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233609"},"modified":"2022-11-11T00:37:22","modified_gmt":"2022-11-10T21:37:22","slug":"tworz-niestandardowe-typy-postow-i-niestandardowe-taksonomie-w-wordpress-wedlug-kodu","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/tworz-niestandardowe-typy-postow-i-niestandardowe-taksonomie-w-wordpress-wedlug-kodu\/","title":{"rendered":"Tw\u00f3rz niestandardowe typy post\u00f3w i niestandardowe taksonomie w WordPress wed\u0142ug kodu"},"content":{"rendered":"\n<p>To jest samouczek dotycz\u0105cy tworzenia niestandardowego typu postu i niestandardowej taksonomii w WordPress wed\u0142ug kodu. Przyjrzymy si\u0119 typowym pu\u0142apkom i argumentom, kt\u00f3rych nale\u017cy u\u017cy\u0107, aby stworzy\u0107 minimaln\u0105, ale wystarczaj\u0105c\u0105 kreacj\u0119. Pe\u0142ny przyk\u0142ad do\u0142\u0105czony na ko\u0144cu.<\/p>\n<h2>Gdzie doda\u0107 kod?<\/h2>\n<p>Tworzenie niestandardowych typ\u00f3w post\u00f3w (CPT) i niestandardowych taksonomii w WordPressie mo\u017cna wykona\u0107 w <code>functions.php<\/code>pliku motywu lub w wtyczce. Pami\u0119taj, \u017ce niestandardowy typ postu i niestandardowa taksonomia znikn\u0105, je\u015bli zmienisz motyw lub dezaktywujesz wtyczk\u0119. Mo\u017cna wi\u0119c tymczasowo usun\u0105\u0107 rejestracj\u0119 CPT z motywu i przenie\u015b\u0107 j\u0105 do wtyczki \u2014 o ile zachowasz ten sam niestandardowy typ postu lub identyfikator taksonomii slug\/ID.<\/p>\n<p>Do tworzenia (i modyfikowania) CPT lub taksonomii <strong>zawsze u\u017cywaj<\/strong> hooka <code>init<\/code>. Umieszczenie go w korzeniu <code>functions.php<\/code>(poza hakiem) lub innym haczyku spowoduje problemy.<\/p>\n<h2>Tworzenie niestandardowego typu postu<\/h2>\n<p>Do tworzenia niestandardowego typu posta u\u017cywasz <code>register_post_type<\/code>funkcji. Przyjmuje dwa parametry; po pierwsze identyfikator typu postu, a po drugie tablica ze wszystkimi argumentami.<\/p>\n<p>Identyfikator typu postu to nazwa wersji slugu typu posta. Na przyk\u0142ad posty i strony wbudowane w WordPress s\u0105 oznaczone jako \u201e <code>post<\/code>&quot; i \u201e <code>page<\/code>&#8222;. Identyfikator musi by\u0107 unikalny, musi by\u0107 zgodny z zestawem regu\u0142 (ma\u0142e litery, bez spacji itp.) i nie mo\u017ce by\u0107 jednym z zastrze\u017conych slug WordPressa.<\/p>\n<p>Nauczy\u0142em si\u0119 tego, \u017ce s\u0105 minimalnymi, ale ca\u0142kowicie wystarczaj\u0105cymi argumentami do zarejestrowania typu postu; bior\u0105c pod uwag\u0119, \u017ce jest to normalny publiczny CPT i chcesz zast\u0105pi\u0107 wszelkie etykiety z napisem \u201epost&#8221; lub \u201estrona&#8221; rzeczywist\u0105 nazw\u0105 CPT:<\/p>\n<pre><code>add_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],      \n    ]);\n});<\/code><\/pre>\n<h3>Przegl\u0105d argument\u00f3w<\/h3>\n<p>Pami\u0119taj, \u017ce niekt\u00f3re argumenty dziedzicz\u0105 warto\u015bci z innych argument\u00f3w. O ile nie s\u0105 wyra\u017anie ustawione, mog\u0105 domy\u015blnie przyjmowa\u0107 t\u0119 sam\u0105 warto\u015b\u0107 lub przeciwnie do innej. Kilka argument\u00f3w dziedziczy t\u0119 sam\u0105 lub przeciwn\u0105 warto\u015b\u0107 argumentu <code>public<\/code>. Przeczytaj <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/register_post_type\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentacj\u0119,<\/a> aby zobaczy\u0107, jaka jest warto\u015b\u0107 domy\u015blna dla ka\u017cdego argumentu i czy musisz j\u0105 zast\u0105pi\u0107.<\/p>\n<p>Je\u015bli nie masz nic przeciwko posiadaniu w admin tekst\u00f3w, kt\u00f3re odnosz\u0105 si\u0119 do twojego typu postu jako \u201epost&#8221; lub \u201estrona&#8221;, mo\u017cesz pomin\u0105\u0107 definiowanie argument\u00f3w etykiet. Prawdopodobnie wystarczy tylko <code>label<\/code>(nazwa w liczbie mnogiej) i tylko wewn\u0105trz <code>labels<\/code>tablicy <code>singular_name<\/code>(nazwa w liczbie pojedynczej).<\/p>\n<p>Je\u015bli nie ustawisz jawnie <code>show_in_rest<\/code>warto\u015bci true, Tw\u00f3j niestandardowy typ pozycji b\u0119dzie u\u017cywa\u0142 starego klasycznego edytora. <strong>Je\u015bli chcesz u\u017cywa\u0107 edytora Gutenberg do niestandardowego typu postu, musisz ustawi\u0107 warto\u015b\u0107 <code>show_in_rest<\/code>true<\/strong>.<\/p>\n<p>Argument <code>supports<\/code>m\u00f3wi, kt\u00f3re elementy s\u0105 dost\u0119pne podczas edycji wpisu w Twoim typie wpisu. Jako minimum prawdopodobnie potrzebujesz tytu\u0142u, edytora i polecanego obrazu posta.<\/p>\n<p>Argument <code>rewrite<\/code>z minimum elementu tablicy <code>slug<\/code>m\u00f3wi WordPressowi, aby przepisa\u0142 wszystkie pojedyncze posty Twojego typu postu, aby u\u017cy\u0107 tego przedrostka. W powy\u017cszym przyk\u0142adzie pojedynczy wpis ksi\u0105\u017cki otrzyma adres URL podobny do; \u201e <a href=\"http:\/\/example.com\/book\/i-robot\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">http:\/\/example.com\/ksi\u0105\u017cka\/i-robot\/<\/a> &#8222;. Je\u015bli interesuje Ci\u0119, jak doda\u0107 ustawienie regu\u0142y permalink w admin, aby umo\u017cliwi\u0107 u\u017cytkownikom motywu samodzielne decydowanie o tym slugu, sp\u00f3jrz na <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-add-a-custom-permalink-setting-for-your-custom-post-type\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ten post<\/a>.<\/p>\n<p>Argumentem ikony menu (<code>menu_icon<\/code>) mo\u017ce by\u0107 dowolny z nast\u0119puj\u0105cych <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Dashicons<\/a> lub mo\u017cesz pozostawi\u0107 go pustym, aby zachowa\u0107 warto\u015b\u0107 domy\u015bln\u0105. Domy\u015blnie jest to ta sama ikona co Posty. Dobrym pomys\u0142em jest jednak wyra\u017ane oddzielenie niestandardowych typ\u00f3w post\u00f3w.<\/p>\n<p>Pozycja menu (<code>menu_position<\/code>) pozwala okre\u015bli\u0107 pozycj\u0119 niestandardowego typu postu w menu administratora. Dokumentacja zawiera list\u0119 wszystkich pozycji menu administratora, dzi\u0119ki czemu mo\u017cna dostosowa\u0107; pozycja 5 znajduje si\u0119 zaraz po \u201epostach&#8221;.<\/p>\n<p>Jest jeszcze jeden argument (<code>taxonomies<\/code>) przemawiaj\u0105cy za do\u0142\u0105czeniem taksonomii do typu postu. W dalszej cz\u0119\u015bci tego postu om\u00f3wimy, jak doda\u0107 niestandardow\u0105 taksonomi\u0119. Aby doda\u0107 taksonomie do typu postu, dodaj ten argument do powy\u017cszej tablicy;<\/p>\n<pre><code>'taxonomies' =&gt; ['book_author'],<\/code><\/pre>\n<h3>Uwaga o permalinkach i b\u0142\u0119dach 404 nie znaleziono<\/h3>\n<p>Po dodaniu kodu do rejestracji niestandardowego typu posta zauwa\u017cysz, \u017ce wy\u015bwietlenie pojedynczego posta zwr\u00f3ci b\u0142\u0105d \u201e404 nie znaleziono&#8221;. Dzieje si\u0119 tak, poniewa\u017c musisz \u201eod\u015bwie\u017cy\u0107 permalinki&#8221;.<\/p>\n<p>Przejd\u017a do Ustawienia&gt; Permalinki i po prostu kliknij przycisk \u201eZapisz zmiany&#8221; (nie musisz niczego zmienia\u0107).<\/p>\n<p>Pami\u0119taj, \u017ce za ka\u017cdym razem, gdy zmienisz <code>rewrite<\/code>atrybut, b\u0119dziesz musia\u0142 ponownie od\u015bwie\u017cy\u0107 permalinki.<\/p>\n<h2>Tworzenie niestandardowej taksonomii<\/h2>\n<p>Niestandardow\u0105 taksonomi\u0119 mo\u017cna do\u0142\u0105czy\u0107 do jednego z typ\u00f3w post\u00f3w WordPress (posty, strony) lub do niestandardowego typu post\u00f3w. Mo\u017cesz r\u00f3wnie\u017c do\u0142\u0105czy\u0107 wiele taksonomii do typu posta. Kiedy rejestrujesz taksonomi\u0119, musisz poda\u0107 typ stanowiska, do kt\u00f3rego ma by\u0107 do\u0142\u0105czona.<\/p>\n<p>Taksonomia mo\u017ce by\u0107 hierarchiczna (jak kategorie post\u00f3w, w kt\u00f3rych mo\u017cna utworzy\u0107 struktur\u0119 opart\u0105 na drzewie) lub opart\u0105 na znacznikach (takich jak tagi post\u00f3w). To naprawd\u0119 jedyna kwestia, kt\u00f3r\u0105 musisz wiedzie\u0107 wcze\u015bniej, z wyj\u0105tkiem jego identyfikatora slug. Podobnie jak w przypadku CPT, identyfikator identyfikuj\u0105cy taksonomi\u0119 musi by\u0107 unikalny i zgodny z zestawem regu\u0142.<\/p>\n<p>Do rejestracji niestandardowej taksonomii s\u0142u\u017cy <code>register_taxonomy<\/code>funkcja. Akceptuje <code>register_taxonomy<\/code>unikalny identyfikator taksonomii slug jako pierwszy argument, tablic\u0119 typ\u00f3w post\u00f3w do do\u0142\u0105czenia jako drugi, a na ko\u0144cu tablic\u0119 ze wszystkimi pozosta\u0142ymi argumentami. Jest wiele argument\u00f3w, ale to, czego do\u015bwiadczy\u0142em, jest minimalnym, ale wystarczaj\u0105cym do zarejestrowania niestandardowej taksonomii (to dodaje taksonomi\u0119 typu tag\/niehierarchiczn\u0105):<\/p>\n<pre><code>add_action('init', function() {\n    register_taxonomy('book_author', ['book'], [\n        'label' =&gt; __('Authors', 'txtdomain'),\n        'hierarchical' =&gt; false,\n        'rewrite' =&gt; ['slug' =&gt; 'book-author'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Author', 'txtdomain'),\n            'all_items' =&gt; __('All Authors', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Author', 'txtdomain'),\n            'view_item' =&gt; __('View Author', 'txtdomain'),\n            'update_item' =&gt; __('Update Author', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Author', 'txtdomain'),\n            'new_item_name' =&gt; __('New Author Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Authors', 'txtdomain'),\n            'popular_items' =&gt; __('Popular Authors', 'txtdomain'),\n            'separate_items_with_commas' =&gt; __('Separate authors with comma', 'txtdomain'),\n            'choose_from_most_used' =&gt; __('Choose from most used authors', 'txtdomain'),\n            'not_found' =&gt; __('No Authors found', 'txtdomain'),\n        ]\n    ]);\n});<\/code><\/pre>\n<p>Zaleca si\u0119 dodanie wywo\u0142ania funkcji zaraz po <code>register_taxonomy<\/code>, aby upewni\u0107 si\u0119, \u017ce zostanie poprawnie \u201edo\u0142\u0105czona&#8221; do CPT: <code>register_taxonomy_for_object_type<\/code>. Zdefiniuj swoj\u0105 taksonomi\u0119 jako pierwszy argument, a CPT jako drugi:<\/p>\n<pre><code>register_taxonomy_for_object_type('book_author', 'book');<\/code><\/pre>\n<p>Podobnie jak powy\u017cszy typ post, <code>register_taxonomy<\/code>akceptuje znacznie wi\u0119cej argument\u00f3w, a wiele z nich dziedziczy lub zale\u017cy od warto\u015bci innych argument\u00f3w. Przeczytaj <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/register_taxonomy\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentacj\u0119,<\/a> aby zobaczy\u0107, jaka jest warto\u015b\u0107 domy\u015blna dla ka\u017cdego argumentu i czy musisz j\u0105 zast\u0105pi\u0107.<\/p>\n<h3>Przegl\u0105d argument\u00f3w<\/h3>\n<p>Je\u015bli nie masz nic przeciwko posiadaniu tekst\u00f3w, kt\u00f3re odnosz\u0105 si\u0119 do Twojej taksonomii jako \u201etag&#8221; (je\u015bli hierarchiczna jest fa\u0142szywa) lub \u201ekategoria&#8221; (je\u015bli hierarchiczna jest prawdziwa), prawdopodobnie mo\u017cesz pomin\u0105\u0107 ca\u0142\u0105 <code>labels<\/code>tablic\u0119 z wyj\u0105tkiem by\u0107 mo\u017ce <code>singular_name<\/code>.<\/p>\n<p>Jest <code>show_admin_column<\/code>to przydatne przy dodawaniu kolumny pokazuj\u0105cej powi\u0105zane terminy w Twojej taksonomii na ekranie administratora CPT. Podobnie jak w Postach, widzisz kolumn\u0119 pokazuj\u0105c\u0105 powi\u0105zane kategorie. Ten argument jest domy\u015blnie ustawiony na <code>false<\/code>(nie pokazuj kolumny), wi\u0119c lubi\u0119 go zast\u0105pi\u0107.<\/p>\n<p>Ustawienie <code>show_in_rest<\/code>na true jest konieczne, aby Twoja taksonomia by\u0142a widoczna w edycji postu w edytorze Gutenberg, poniewa\u017c Gutenberg opiera si\u0119 na interfejsie API REST.<\/p>\n<p>Podobnie jak w przypadku niestandardowych typ\u00f3w post\u00f3w, prawdopodobnie otrzymasz b\u0142\u0119dy \u201e404 nie znaleziono&#8221; w niestandardowej taksonomii. Przejd\u017a do Ustawienia&gt; Permalinki i po prostu kliknij przycisk &quot;Zapisz zmiany&quot;.<\/p>\n<h2>Pe\u0142ny przyk\u0142adowy kod<\/h2>\n<p>Oto pe\u0142ny przyk\u0142ad tworzenia CPT dla ksi\u0105\u017cek i do\u0142\u0105czania dw\u00f3ch niestandardowych taksonomii; gatunek (hierarchiczny) i autor ksi\u0105\u017cki (tag).<\/p>\n<pre><code>add_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'taxonomies' =&gt; ['book_author', 'book_genre'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],      \n    ]);\n\u00a0\n    register_taxonomy('book_genre', ['book'], [\n        'label' =&gt; __('Genres', 'txtdomain'),\n        'hierarchical' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book-genre'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Genre', 'txtdomain'),\n            'all_items' =&gt; __('All Genres', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Genre', 'txtdomain'),\n            'view_item' =&gt; __('View Genre', 'txtdomain'),\n            'update_item' =&gt; __('Update Genre', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Genre', 'txtdomain'),\n            'new_item_name' =&gt; __('New Genre Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Genres', 'txtdomain'),\n            'parent_item' =&gt; __('Parent Genre', 'txtdomain'),\n            'parent_item_colon' =&gt; __('Parent Genre:', 'txtdomain'),\n            'not_found' =&gt; __('No Genres found', 'txtdomain'),\n        ]\n    ]);\n    register_taxonomy_for_object_type('book_genre', 'book');\n\u00a0\n    register_taxonomy('book_author', ['book'], [\n        'label' =&gt; __('Authors', 'txtdomain'),\n        'hierarchical' =&gt; false,\n        'rewrite' =&gt; ['slug' =&gt; 'book-author'],\n        'show_admin_column' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Author', 'txtdomain'),\n            'all_items' =&gt; __('All Authors', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Author', 'txtdomain'),\n            'view_item' =&gt; __('View Author', 'txtdomain'),\n            'update_item' =&gt; __('Update Author', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Author', 'txtdomain'),\n            'new_item_name' =&gt; __('New Author Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Authors', 'txtdomain'),\n            'popular_items' =&gt; __('Popular Authors', 'txtdomain'),\n            'separate_items_with_commas' =&gt; __('Separate authors with comma', 'txtdomain'),\n            'choose_from_most_used' =&gt; __('Choose from most used Authors', 'txtdomain'),\n            'not_found' =&gt; __('No Authors found', 'txtdomain'),\n        ]\n    ]);\n    register_taxonomy_for_object_type('book_author', 'book');\n});<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Przewodnik po tworzeniu niestandardowych typ\u00f3w post\u00f3w i niestandardowych taksonomii w WordPress wed\u0142ug kodu. Obejmuje argumenty do wykorzystania w celu stworzenia minimalnej, ale wystarczaj\u0105cej kreacji.<\/p>\n","protected":false},"author":1,"featured_media":152888,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[897,721,721,919,897,919,1110,805,805,845,929,929,845,866,866],"tags":[1169],"class_list":{"0":"post-233609","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-kod","8":"category-deweloper","10":"category-inny","13":"category-n-a","14":"category-php-7","16":"category-samouczki","17":"category-tematy","20":"category-wordpress-7","22":"tag-affiai-pl"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233609","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=233609"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233609\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/152888"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233609"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}