{"id":233555,"date":"2023-02-17T12:56:00","date_gmt":"2023-02-17T09:56:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233555"},"modified":"2022-11-11T00:19:18","modified_gmt":"2022-11-10T21:19:18","slug":"skapa-anpassade-inlaeggstyper-och-anpassade-taxonomier-i-wordpress-med-kod","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/skapa-anpassade-inlaeggstyper-och-anpassade-taxonomier-i-wordpress-med-kod\/","title":{"rendered":"Skapa anpassade inl\u00e4ggstyper och anpassade taxonomier i WordPress med kod"},"content":{"rendered":"\n<p>Det h\u00e4r \u00e4r en handledning i hur man skapar en anpassad inl\u00e4ggstyp och en anpassad taxonomi i WordPress med kod. Vi ska titta p\u00e5 vanliga fallgropar och vilka argument som ska anv\u00e4ndas f\u00f6r minimal men tillr\u00e4cklig skapelse. Fullst\u00e4ndigt exempel ing\u00e5r i slutet.<\/p>\n<h2>Var man l\u00e4gger till koden<\/h2>\n<p>Skapande av anpassade inl\u00e4ggstyper (CPT) och anpassade taxonomier i WordPress kan g\u00f6ras i ett temas <code>functions.php<\/code>fil eller i ett plugin. T\u00e4nk p\u00e5 att den anpassade posttypen och den anpassade taxonomin f\u00f6rsvinner om du byter tema eller inaktiverar plugin-programmet. S\u00e5 det \u00e4r s\u00e4kert att tillf\u00e4lligt ta bort CPT-registreringen fr\u00e5n temat och flytta den till ett plugin \u2013 s\u00e5 l\u00e4nge du beh\u00e5ller samma anpassade posttyp eller taxonomiidentifieringsslug\/ID.<\/p>\n<p>F\u00f6r att skapa (och modifiera) en CPT eller taxonomi, <strong>anv\u00e4nd alltid<\/strong> kroken <code>init<\/code>. Att placera den i roten av <code>functions.php<\/code>(utanf\u00f6r en krok) eller n\u00e5gon annan krok kommer att orsaka problem.<\/p>\n<h2>Skapa en anpassad inl\u00e4ggstyp<\/h2>\n<p>F\u00f6r att skapa en anpassad inl\u00e4ggstyp anv\u00e4nder du <code>register_post_type<\/code>funktionen. Den accepterar tv\u00e5 parametrar; f\u00f6rst posttypidentifieraren och sedan en array med alla argument.<\/p>\n<p>Inl\u00e4ggstypsidentifieraren \u00e4r ett versionsnamn f\u00f6r din inl\u00e4ggstyp. Till exempel WordPress&#8217; inbyggda inl\u00e4ggstyper identifieras inl\u00e4gg och sidor som &#8217; <code>post<\/code>&#8217; och &#8217; <code>page<\/code>&#8217;. Identifieraren m\u00e5ste vara unik, den m\u00e5ste f\u00f6lja en upps\u00e4ttning regler (gemener, inga mellanslag etc) och inte vara en av WordPress reserverade sniglar.<\/p>\n<p>Detta \u00e4r vad jag har l\u00e4rt mig vara minsta men fullt tillr\u00e4ckligt bra argument f\u00f6r att registrera en inl\u00e4ggstyp; med tanke p\u00e5 att det \u00e4r en vanlig offentlig CPT och du vill \u00e5sidos\u00e4tta alla etiketter som s\u00e4ger &quot;inl\u00e4gg&quot; eller &quot;sida&quot; med det faktiska namnet p\u00e5 din 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>En \u00f6versikt \u00f6ver argumenten<\/h3>\n<p>Var medveten om att vissa av argumenten \u00e4rver v\u00e4rden fr\u00e5n andra argument. Om de inte \u00e4r explicit inst\u00e4llda kan de som standard ha samma v\u00e4rde eller motsatsen som ett annat. Flera argument \u00e4rver samma eller motsatta v\u00e4rde av argumentet <code>public<\/code>. L\u00e4s <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/register_post_type\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentationen<\/a> f\u00f6r att se vad standardv\u00e4rdet \u00e4r f\u00f6r varje argument och om du beh\u00f6ver \u00e5sidos\u00e4tta det.<\/p>\n<p>Om du har det bra med att ha texter i admin som refererar till din inl\u00e4ggstyp som &quot;inl\u00e4gg&quot; eller &quot;sida&quot;, kan du hoppa \u00f6ver att definiera etikettargumenten. Du kommer f\u00f6rmodligen att klara dig med endast <code>label<\/code>(pluralnamn) och inuti <code>labels<\/code>arrayen bara <code>singular_name<\/code>(singularnamn).<\/p>\n<p>Om du inte uttryckligen st\u00e4ller in <code>show_in_rest<\/code>till sant kommer din anpassade pos-typ att anv\u00e4nda den gamla klassiska redigeraren. <strong>Om du vill anv\u00e4nda Gutenberg editor f\u00f6r din anpassade inl\u00e4ggstyp m\u00e5ste du st\u00e4lla in <code>show_in_rest<\/code>till true<\/strong>.<\/p>\n<p>Argumentet <code>supports<\/code>talar om vilka element som \u00e4r tillg\u00e4ngliga n\u00e4r du redigerar ett inl\u00e4gg i din inl\u00e4ggstyp. Som ett minimum vill du f\u00f6rmodligen ha titeln, redigeraren och den utvalda inl\u00e4ggsbilden.<\/p>\n<p>Argumentet <code>rewrite<\/code>med ett minimum av array-element <code>slug<\/code>s\u00e4ger \u00e5t WordPress att skriva om alla singul\u00e4ra inl\u00e4gg av din inl\u00e4ggstyp f\u00f6r att anv\u00e4nda denna prefix-slug. I exemplet ovan skulle ett enskilt bokinl\u00e4gg f\u00e5 en URL som; &quot; <a href=\"http:\/\/example.com\/book\/i-robot\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">http:\/\/example.com\/book\/i-robot\/<\/a> &quot;. Om du \u00e4r intresserad av hur man l\u00e4gger till en permal\u00e4nkregelinst\u00e4llning i admin f\u00f6r att till\u00e5ta temaanv\u00e4ndare att sj\u00e4lva best\u00e4mma denna snigel, ta en titt p\u00e5 <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\">det h\u00e4r inl\u00e4gget<\/a>.<\/p>\n<p>Argumentet f\u00f6r menyikonen (<code>menu_icon<\/code>) kan vara n\u00e5gon av f\u00f6ljande <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Dashicons<\/a>, eller s\u00e5 kan du l\u00e4mna den tom f\u00f6r att beh\u00e5lla standardinst\u00e4llningen. Standard \u00e4r samma ikon som Inl\u00e4gg. Det \u00e4r dock en bra id\u00e9 att tydligt separera dina anpassade inl\u00e4ggstyper.<\/p>\n<p>Menyposition (<code>menu_position<\/code>) l\u00e5ter dig best\u00e4mma positionen f\u00f6r din anpassade inl\u00e4ggstyp i admin-menyn. Dokumentationen listar alla adminmenypositioner, s\u00e5 att du kan justera; position 5 \u00e4r precis efter &quot;Inl\u00e4gg&quot;.<\/p>\n<p>Det finns ett annat argument (<code>taxonomies<\/code>) f\u00f6r att koppla en taxonomi till posttypen. Vi kommer att g\u00e5 igenom hur man l\u00e4gger till en anpassad taxonomi senare i det h\u00e4r inl\u00e4gget. F\u00f6r att l\u00e4gga till taxonomier till din inl\u00e4ggstyp, l\u00e4gg till detta argument till ovanst\u00e5ende array;<\/p>\n<pre><code>'taxonomies' =&gt; ['book_author'],<\/code><\/pre>\n<h3>En anteckning om permal\u00e4nkar och 404 inte hittade fel<\/h3>\n<p>N\u00e4r du har lagt till din kod f\u00f6r att registrera en anpassad inl\u00e4ggstyp kommer du att m\u00e4rka att om du tittar p\u00e5 ett enskilt inl\u00e4gg kommer det att returnera felet &quot;404 inte hittat&quot;. Detta beror p\u00e5 att du beh\u00f6ver &quot;uppdatera permal\u00e4nkar&quot;.<\/p>\n<p>G\u00e5 till Inst\u00e4llningar &gt; Permal\u00e4nkar och klicka bara p\u00e5 knappen &quot;Spara \u00e4ndringar&quot; (du beh\u00f6ver inte \u00e4ndra n\u00e5got).<\/p>\n<p>T\u00e4nk p\u00e5 att n\u00e4r du \u00e4ndrar <code>rewrite<\/code>attributet m\u00e5ste du uppdatera permal\u00e4nkar igen.<\/p>\n<h2>Skapa en anpassad taxonomi<\/h2>\n<p>En anpassad taxonomi kan kopplas till en av WordPress inl\u00e4ggstyper (inl\u00e4gg, sidor) eller till en anpassad inl\u00e4ggstyp. Du kan ocks\u00e5 koppla flera taxonomier till en inl\u00e4ggstyp. N\u00e4r du registrerar en taxonomi m\u00e5ste du ange den eller de inl\u00e4ggstyper du vill att den ska bifogas.<\/p>\n<p>En taxonomi kan antingen vara hierarkisk (som inl\u00e4ggskategorier d\u00e4r du kan skapa en tr\u00e4dbaserad struktur) eller taggbaserad (som posttaggar). Detta \u00e4r egentligen det enda du beh\u00f6ver k\u00e4nna till i f\u00f6rv\u00e4g, med undantag f\u00f6r dess identifierarsnigel. Precis som med CPT:er m\u00e5ste den identifierande snigeln till en taxonomi vara unik och f\u00f6lja en upps\u00e4ttning regler.<\/p>\n<p>F\u00f6r att registrera en anpassad taxonomi anv\u00e4nder du <code>register_taxonomy<\/code>funktionen. Den <code>register_taxonomy<\/code>accepterar den taxonomin unika identifierarens slug som f\u00f6rsta argument, en array av posttyper att koppla den till som andra, och slutligen en array med resten av argumenten. Det finns m\u00e5nga argument, men detta \u00e4r vad jag har upplevt vara det minsta men tillr\u00e4ckligt f\u00f6r att registrera en anpassad taxonomi (detta l\u00e4gger till en taggtyp\/icke-hierarkisk taxonomi):<\/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>Det rekommenderas att l\u00e4gga till ett funktionsanrop direkt efter <code>register_taxonomy<\/code>, f\u00f6r att se till att det blir ordentligt &quot;f\u00e4st&quot; till CPT:n <code>register_taxonomy_for_object_type<\/code>. Definiera din taxonomi som f\u00f6rsta argument och CPT som andra:<\/p>\n<pre><code>register_taxonomy_for_object_type('book_author', 'book');<\/code><\/pre>\n<p>P\u00e5 samma s\u00e4tt som posttypen ovan, <code>register_taxonomy<\/code>accepterar m\u00e5nga fler argument, och m\u00e5nga av dessa \u00e4rver eller beror p\u00e5 v\u00e4rdet av andra argument. L\u00e4s <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/register_taxonomy\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentationen<\/a> f\u00f6r att se vad standardv\u00e4rdet \u00e4r f\u00f6r varje argument och om du beh\u00f6ver \u00e5sidos\u00e4tta det.<\/p>\n<h3>En \u00f6versikt \u00f6ver argumenten<\/h3>\n<p>Om du \u00e4r bra med att ha texter som refererar till din taxonomi som &quot;tagg&quot; (om hierarkisk \u00e4r falsk) eller &quot;kategori&quot; (om hierarkisk \u00e4r sant), kan du f\u00f6rmodligen hoppa \u00f6ver hela <code>labels<\/code>arrayen med undantag f\u00f6r kanske <code>singular_name<\/code>.<\/p>\n<p>Det <code>show_admin_column<\/code>\u00e4r praktiskt f\u00f6r att l\u00e4gga till en kolumn som visar de associerade termerna i din taxonomi p\u00e5 din CPT-administrat\u00f6rssk\u00e4rm. Precis som i Inl\u00e4gg ser du en kolumn som visar associerade kategorier. Detta argument \u00e4r standardinst\u00e4llt p\u00e5 <code>false<\/code>(visa inte kolumn), s\u00e5 jag gillar att \u00e5sidos\u00e4tta det.<\/p>\n<p>Att st\u00e4lla in <code>show_in_rest<\/code>till sant \u00e4r n\u00f6dv\u00e4ndigt f\u00f6r att ha din taxonomi synlig i Postedit i Gutenberg-redigeraren, eftersom Gutenberg f\u00f6rlitar sig p\u00e5 REST API.<\/p>\n<p>P\u00e5 samma s\u00e4tt som med anpassade inl\u00e4ggstyper kommer du f\u00f6rmodligen att f\u00e5 &quot;404 not found&quot;-fel p\u00e5 din anpassade taxonomi. G\u00e5 till Inst\u00e4llningar &gt; Permal\u00e4nkar och klicka bara p\u00e5 knappen &quot;Spara \u00e4ndringar&quot;.<\/p>\n<h2>Fullst\u00e4ndig exempelkod<\/h2>\n<p>H\u00e4r \u00e4r ett fullst\u00e4ndigt exempel p\u00e5 att skapa en CPT f\u00f6r b\u00f6cker och bifoga tv\u00e5 anpassade taxonomier; genre (hierarkisk) och bokf\u00f6rfattare (tagg).<\/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\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En guide f\u00f6r att skapa anpassade inl\u00e4ggstyper och anpassade taxonomier i WordPress med kod. T\u00e4cker argument att anv\u00e4nda f\u00f6r minimal men tillr\u00e4cklig skapelse.<\/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":[932,901,724,848,901,922,1110,922,807,807,932,848,724,868,868],"tags":[1173],"class_list":{"0":"post-233555","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-aemnen","8":"category-koda","9":"category-utvecklaren","10":"category-handledningar","12":"category-oevrig","13":"category-n-a","15":"category-php-9","20":"category-wordpress-9","22":"tag-affiai-sv"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233555","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=233555"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233555\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/152888"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233555"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233555"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}