{"id":230271,"date":"2022-12-08T18:13:00","date_gmt":"2022-12-08T15:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230271"},"modified":"2022-12-07T11:57:29","modified_gmt":"2022-12-07T08:57:29","slug":"niestandardowa-strona-edycji-kategorii-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/niestandardowa-strona-edycji-kategorii-wordpress\/","title":{"rendered":"Niestandardowa strona edycji kategorii WordPress"},"content":{"rendered":"\n<p>Dodawanie do WordPressa dodatkowych meta p\u00f3l, p\u00f3l i innych informacji jest \u0142atwe, je\u015bli znasz odpowiednie haki i odpowiednie interfejsy API. Ale co, je\u015bli chcesz doda\u0107 informacje do strony taksonomii WordPress?<\/p>\n<p>Za\u0142\u00f3\u017cmy na przyk\u0142ad, \u017ce chcesz utworzy\u0107 niestandardow\u0105 stron\u0119 edycji kategorii WordPress lub przynajmniej doda\u0107 niestandardowe informacje do strony taksonomii?<\/p>\n<p>Nadal mo\u017cna to zrobi\u0107 i nadal jest to stosunkowo \u0142atwe, ale znowu musisz zna\u0107 odpowiednie hooki do u\u017cycia, a tak\u017ce zale\u017cy to od tego, czy pracujesz z wbudowanymi taksonomiami, czy z niestandardow\u0105 taksonomi\u0105.<\/p>\n<p>W tym po\u015bcie poka\u017c\u0119, jak to zrobi\u0107, u\u017cywaj\u0105c niestandardowej, hierarchicznej taksonomii (lub, pro\u015bciej, niestandardowej kategorii).<\/p>\n<h2>Niestandardowa strona edycji kategorii WordPress<\/h2>\n<p>Po pierwsze, je\u015bli zdecydujesz si\u0119 pracowa\u0107 ze standardow\u0105 stron\u0105 kategorii, prawdopodobnie zobaczysz co\u015b takiego:<\/p>\n<p>A dwa haki, z kt\u00f3rymi musisz pracowa\u0107 to:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/edit_category_form\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">edit_category_form<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/category_edit_form\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">category_edit_form<\/a><\/strong><\/li>\n<\/ul>\n<p>Je\u015bli klikn\u0105\u0142e\u015b kt\u00f3ry\u015b z link\u00f3w, zauwa\u017cysz, \u017ce ten drugi nie zawiera \u017cadnych informacji, ale pierwszy brzmi:<\/p>\n<blockquote>\n<p>Akcja\/hak edit_category_form mo\u017ce by\u0107 wykorzystana do wykonania dodatkowych akcji na ekranie edycji kategorii. Na przyk\u0142ad mo\u017cesz doda\u0107 pola formularza, aby zapisa\u0107 dodatkowe informacje dla okre\u015blonej kategorii.<\/p>\n<\/blockquote>\n<p>W tym celu generalnie decyduj\u0119 si\u0119 na u\u017cycie tego haka, poniewa\u017c jest on dobrze zdefiniowany w Kodeksie. Jednak w tym po\u015bcie zajmuj\u0119 si\u0119 tylko renderowaniem informacji \u2013 a nie dodawaniem dodatkowych p\u00f3l, kt\u00f3re trzeba zapisa\u0107.<\/p>\n<h3>Pod\u0142\u0105czanie rzeczy<\/h3>\n<p>W najprostszej formie najlepszym sposobem na rozpocz\u0119cie dodawania niestandardowych informacji do tego typu strony jest utworzenie funkcji i do\u0142\u0105czenie jej do haka wymienionego powy\u017cej. W swojej najbardziej podstawowej formie wygl\u0105da to mniej wi\u0119cej <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-00-acme-display-object-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nadd_action('edit_category_form', 'acme_display_object_ids');\n\/**\n * Displays an ordered list of all of the object IDs for a given\n * taxonomy.\n *\/\nfunction acme_display_object_ids()\n{\n  \/\/ Code for displaying the Object IDs goes here.\n}<\/code><\/pre>\n<p>Je\u015bli jednak p\u00f3jdziesz \u015bcie\u017ck\u0105 zorientowan\u0105 obiektowo, mo\u017cesz zdecydowa\u0107 si\u0119 na klas\u0119, kt\u00f3ra akceptuje przechwycenie jako argument w konstruktorze i nas\u0142uchuje tego zdarzenia. Je\u015bli tak jest, Tw\u00f3j kod mo\u017ce wygl\u0105da\u0107 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-01-object-id-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nclass ObjectIdSubscriber\n{\n    \/**\n     * @var string the hook to which this class subscribes\n     *\/\n    private $hook;\n\n    \/**\n     * @param string $hook the hook to which this class is registered with WordPress\n     *\/\n    public function __construct(string $hook)\n    {\n      $this-&gt;hook = $hook;\n    }\n\n    \/**\n     * Renders all of the information for the object IDs.\n     *\/\n    public function load()\n    {\n        \/\/ Code for displaying the Object IDs goes here.\n    }\n}<\/code><\/pre>\n<p>Niezale\u017cnie od tego, chodzi o to, \u017ce musisz mie\u0107 klas\u0119 lub funkcj\u0119, kt\u00f3ra jest pod\u0142\u0105czona do hooka, kt\u00f3ry b\u0119dzie renderowa\u0142 informacje, gdy wy\u015bwietlany jest ekran.<\/p>\n<h3>Wy\u015bwietlanie informacji<\/h3>\n<p>St\u0105d b\u0119dziesz potrzebowa\u0142 czego\u015b do renderowania. Jestem fanem oddzielenia mojej logiki, wi\u0119c zwykle tworz\u0119 katalog <strong>View<\/strong>, a nast\u0119pnie umieszczam cz\u0119\u015bciowe pliki dla widok\u00f3w w tym katalogu.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162303-61e73af3dd69a.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162303-61e73af3dd69a.png\" alt=\"Niestandardowa strona edycji kategorii WordPress\" ><\/a><\/p>\n<p>Oczywi\u015bcie zawsze mo\u017cesz zbudowa\u0107 ci\u0105g znak\u00f3w HTML w funkcji PHP (ale upewnij si\u0119, \u017ce oczy\u015bci\u0142e\u015b dane wyj\u015bciowe za pomoc\u0105 czego\u015b takiego jak <strong><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_kses\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_kses<\/a><\/strong> ).<\/p>\n<p>W tym przyk\u0142adzie zamierzam to upro\u015bci\u0107: po prostu chc\u0119 pobra\u0107 list\u0119 wszystkich post\u00f3w (lub obiekt\u00f3w, jak zobaczysz za chwil\u0119) z bazy danych i wy\u015bwietli\u0107 informacje na stronie. Aby to zrobi\u0107, potrzebuj\u0119 kilku zapyta\u0144 do bazy danych, a nast\u0119pnie b\u0119d\u0119 m\u00f3g\u0142 przegl\u0105da\u0107 list\u0119 wynik\u00f3w.<\/p>\n<p>Najpierw potrzebuj\u0119 zapytania, kt\u00f3re pobierze <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-02-term-taxonomy-id-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">term_taxonomy_id<\/a><\/strong> z danej kategorii:<\/p>\n<pre><code>&lt;?php\n\n\/\/ This will retrieve all of the term relationships from where we can get post IDs.\nglobal $wpdb;\n$termTaxonomyId = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT DISTINCT term_taxonomy_id\n        FROM $wpdb-&gt;term_taxonomy\n        WHERE term_id = %s\n        \",\n        $tagId\n    ),\n    ARRAY_A\n);\n$termTaxonomyId = isset($termTaxonomyId[0])? $termTaxonomyId[0]: null;\nif (null === $termTaxonomyId) {\n    return null;\n}<\/code><\/pre>\n<p>Nast\u0119pnie musz\u0119 pobra\u0107 list\u0119 wszystkich <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-03-object-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">identyfikator\u00f3w obiekt\u00f3w<\/a><\/strong>, kt\u00f3re s\u0105 powi\u0105zane z tym <strong>term_taxonomy_id<\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ This will retrieve all of the post IDs.\n$postIds = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT object_id\n        FROM $wpdb-&gt;term_relationships\n        WHERE term_taxonomy_id = %s\n        \",\n        $termTaxonomyId\n    ),\n    ARRAY_A\n);\nif (empty($postIds)) {\n    return null;\n}<\/code><\/pre>\n<p>St\u0105d mog\u0119 u\u017cy\u0107 oryginalnej funkcji (lub klasy), kt\u00f3r\u0105 stworzy\u0142em wcze\u015bniej, aby <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-04-render-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">renderowa\u0107 informacje<\/a><\/strong> :<\/p>\n<pre><code>&lt;ul&gt;\n&lt;?php foreach ($postIds as $postId): ?&gt;\n  &lt;li&gt;&lt;?php echo $postId; ?&gt;&lt;\/li&gt;\n&lt;?php endforeach; ?&gt;\n&lt;\/ul&gt;<\/code><\/pre>\n<p>Ale jest wiele dodatkowych rzeczy, kt\u00f3re mo\u017cesz tam zrobi\u0107.<\/p>\n<h2>Jest wi\u0119cej<\/h2>\n<p>Jak wspomniano, zwraca to identyfikatory obiekt\u00f3w, kt\u00f3re s\u0105 zasadniczo identyfikatorami post\u00f3w (lub identyfikatorami stron lub niestandardowymi identyfikatorami typu post\u00f3w lub czymkolwiek z tabeli <strong>wp_posts<\/strong> ).<\/p>\n<p>Po uzyskaniu tych informacji mo\u017cesz pobra\u0107 dowolne informacje, takie jak tytu\u0142, tre\u015b\u0107, metadane, r\u00f3\u017cne informacje o dacie i tak dalej.<\/p>\n<p>Celem postu nie jest jednak pokazanie, jakie informacje nale\u017cy pobra\u0107, ale jak pobra\u0107 informacje dla danej taksonomii, a nast\u0119pnie wy\u015bwietli\u0107 je na niestandardowej stronie kategorii WordPress. I to jest prosty spos\u00f3b na zrobienie dok\u0142adnie tego.<\/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>Celem postu nie jest jednak pokazanie, jakie informacje nale\u017cy pobra\u0107, ale jak pobra\u0107 informacje dla danej taksonomii, a nast\u0119pnie wy\u015bwietli\u0107 je na niestandardowej stronie kategorii WordPress.<\/p>\n","protected":false},"author":1,"featured_media":235442,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,805,866],"tags":[1169],"class_list":["post-230271","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-php-7","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230271","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=230271"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230271\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/235442"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}