{"id":231490,"date":"2023-01-06T12:00:00","date_gmt":"2023-01-06T09:00:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231490"},"modified":"2023-01-06T13:03:39","modified_gmt":"2023-01-06T10:03:39","slug":"laegg-till-anpassad-laenk-till-skaermen-alla-inlaegg-baserat-paa-inlaeggsmetadata","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/laegg-till-anpassad-laenk-till-skaermen-alla-inlaegg-baserat-paa-inlaeggsmetadata\/","title":{"rendered":"L\u00e4gg till anpassad l\u00e4nk till sk\u00e4rmen Alla inl\u00e4gg baserat p\u00e5 inl\u00e4ggsmetadata"},"content":{"rendered":"\n<p><strong>TL;DR<\/strong>: Den h\u00e4r artikeln beskriver koden som beh\u00f6vs f\u00f6r att l\u00e4gga till en anpassad l\u00e4nk p\u00e5 sk\u00e4rmen <strong>Alla inl\u00e4gg<\/strong> som anv\u00e4nder en anpassad del av inl\u00e4ggsmetadata.<\/p>\n<p><strong>Obs<\/strong>: F\u00f6r n\u00e5gra m\u00e5nader sedan skrev jag en artikel om <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/laegg-till-en-anpassad-vy-paa-skaermen-alla-inlaegg\/\" title=\"hur man l\u00e4gger till en anpassad vy p\u00e5 sk\u00e4rmen Alla inl\u00e4gg\">hur man l\u00e4gger till en anpassad vy p\u00e5 sk\u00e4rmen Alla inl\u00e4gg<\/a>. Den h\u00e4r artikeln \u00e4r inte alla tillsammans, men inte alla tillsammans olika. Se det som en mer detaljerad och kanske f\u00f6r mer praktisk implementering av konceptet.<\/p>\n<hr \/>\n<p>Anta att du har en standardinl\u00e4ggstyp eller en anpassad inl\u00e4ggstyp och du kommer helt enkelt att filtrera efter en rubrik som du definierar med hj\u00e4lp av en mekanism som l\u00e5ter dig spara data i <code>post_metadata<\/code>tabellen.<\/p>\n<p>L\u00e5t oss till exempel s\u00e4ga att du har ett inl\u00e4gg och det som en bit metadata med:<\/p>\n<ul>\n<li>a <code>meta_key<\/code>med v\u00e4rdet av<code>article_attribute<\/code><\/li>\n<li>a <code>meta_value<\/code>med v\u00e4rdet av<code>headline<\/code><\/li>\n<\/ul>\n<p>Och du vill anv\u00e4nda denna information f\u00f6r att l\u00e4gga till en ny <strong>rubrikl\u00e4nk<\/strong> som automatiskt filtrerar bort allt utom artiklar med den metadatan.<\/p>\n<p>S\u00e5 h\u00e4r g\u00f6r du.<\/p>\n<h2>Anpassad l\u00e4nk p\u00e5 sk\u00e4rmen Alla inl\u00e4gg<\/h2>\n<p>Innan du b\u00f6rjar \u00e4r det v\u00e4rt att notera att det finns tv\u00e5 s\u00e4tt att ta itu med det h\u00e4r problemet:<\/p>\n<ul>\n<li>Vi kan l\u00e4gga till l\u00e4nken h\u00f6gst upp p\u00e5 sidan <strong>Alla inl\u00e4gg<\/strong> f\u00f6rst och sedan l\u00e4gga till funktionaliteten f\u00f6r att filtrera data,<\/li>\n<li>Eller s\u00e5 kan vi g\u00f6ra det tv\u00e4rtom d\u00e4r vi l\u00e4gger till backend-logiken f\u00f6rst och sedan l\u00e4gger till l\u00e4nken <strong>Alla inl\u00e4gg .<\/strong><\/li>\n<\/ul>\n<p>Jag kommer att v\u00e4lja att b\u00f6rja med det andra alternativet. Det finns ingen anledning till att det m\u00e5ste g\u00f6ras p\u00e5 det h\u00e4r s\u00e4ttet. Det \u00e4r min preferens.<\/p>\n<hr \/>\n<p>F\u00f6rst m\u00e5ste jag haka i <code>[pre_get_posts](https:\/\/developer.wordpress.org\/reference\/hooks\/pre_get_posts\/)<\/code>kroken som tillhandah\u00e5lls av WordPress. Jag kommer inte att anv\u00e4nda n\u00e5gra namnavgr\u00e4nsade klasser eller prefixfunktioner i det h\u00e4r exemplet (med tanke p\u00e5 att jag har t\u00e4ckt det inneh\u00e5llet tillr\u00e4ckligt p\u00e5 den h\u00e4r webbplatsen), men jag kommer att ha en demoplugin f\u00f6r detta l\u00e4nkad l\u00e4ngst ner i inl\u00e4gget.<\/p>\n<p>Hur som helst, jag b\u00f6rjar med att l\u00e4gga till en anonym funktion kopplad till den tidigare n\u00e4mnda kroken:<\/p>\n<pre><code>add_action(\n  'pre_get_posts',\n  function (WP_Query $query) {\n\n  }\n);<\/code><\/pre>\n<p>Observera att den anonyma funktionen accepterar ett enda argument som \u00e4r en referens till den aktuella instansen av <code>WP_Query<\/code>som k\u00f6rs p\u00e5 sidan. Om du inte \u00e4r bekant med den klassen rekommenderar jag att du l\u00e4ser n\u00e5gon av <a href=\"https:\/\/tommcfarlin.com\/?s=wp_query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dessa artiklar<\/a> eller sidan f\u00f6r <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">utvecklarresurser .<\/a><\/p>\n<p>I funktionen m\u00e5ste jag kontrollera om det finns en <code>meta_value<\/code>i fr\u00e5gestr\u00e4ngen. Detta \u00e4r l\u00e4tt att g\u00f6ra tack vare <code>[filter_input](https:\/\/www.php.net\/manual\/en\/function.filter-input.php)<\/code>funktionen som tillhandah\u00e5lls av PHP.<\/p>\n<pre><code>add_action(\n  'pre_get_posts',\n  function (WP_Query $query) {\n    $meta_value = 'headline';\n\n    if (filter_input( INPUT_GET, 'meta_value') === $meta_value) {\n      $query-&gt;set( 'meta_key', 'article_attribute' );\n      $query-&gt;set( 'meta_value', $meta_value );\n    }\n  }\n);<\/code><\/pre>\n<p>Denna krok kommer att titta f\u00f6r att se om <code>headline<\/code>v\u00e4rdet \u00e4r nyckeln f\u00f6r <code>meta_value<\/code>nyckeln i fr\u00e5gestr\u00e4ngen. Om s\u00e5 \u00e4r fallet l\u00e4gger den sedan till ett <code>meta_key<\/code>och <code>meta_value<\/code>till instansen <code>WP_Query<\/code>som kommer att instruera WordPress att h\u00e4mta alla inl\u00e4gg med just den metadatan.<\/p>\n<hr \/>\n<p>Efter det m\u00e5ste jag l\u00e4gga till en l\u00e4nk h\u00f6gst upp p\u00e5 sidan <strong>Alla inl\u00e4gg<\/strong> f\u00f6r att aktivera den h\u00e4r funktionen. F\u00f6r att g\u00f6ra detta anv\u00e4nder jag <code>[views_edit-posts](https:\/\/tommcfarlin.com\/add-a-custom-view\/)<\/code>kroken. Den h\u00e4r funktionen accepterar en rad ankare som kommer att visas \u00f6verst p\u00e5 sidan.<\/p>\n<p>Jag h\u00e4nvisar till dessa som <code>$views<\/code>s\u00e5 att det \u00e4r vad funktionen kommer att acceptera n\u00e4r jag stoppar ut den:<\/p>\n<pre><code>add_action(\n  'views_edit-post',\n  function (array $views) {\n\n    return $views;\n  }\n);<\/code><\/pre>\n<p>Observera att det \u00e4r viktigt att returnera arrayen till WordPress s\u00e5 att den vet vad den ska rendera \u00e4ven om ingen \u00e4ndring g\u00f6rs.<\/p>\n<p>F\u00f6rst m\u00e5ste jag avg\u00f6ra om jag f\u00f6r n\u00e4rvarande \u00e4r p\u00e5 den anpassade sidan. Om s\u00e5 \u00e4r fallet m\u00e5ste jag l\u00e4gga till de r\u00e4tta attributen till ankaret som lagts till h\u00f6gst upp p\u00e5 sidan:<\/p>\n<pre><code>\n$attributes = 'class=\"\"';\nif (filter_input(INPUT_GET, 'meta_value') === 'headline') {\n  $attributes ='class=\"current aria-current=\"page\"';\n}<\/code><\/pre>\n<p>Efter det m\u00e5ste jag faktiskt l\u00e4gga till <strong>rubrikvyn<\/strong> p\u00e5 sidan. Detta kommer att kr\u00e4va anv\u00e4ndning av flera funktioner:<\/p>\n<ul>\n<li><code>[array_push](https:\/\/www.php.net\/manual\/en\/function.array-push.php)<\/code>f\u00f6r att l\u00e4gga till en ny l\u00e4nk till listan \u00f6ver<code>$views<\/code><\/li>\n<li><code>[sprintf](https:\/\/www.php.net\/manual\/en\/function.sprintf.php)<\/code>f\u00f6r att s\u00e4kert l\u00e4gga till en ny str\u00e4ng<\/li>\n<li><code>[add_query_arg](https:\/\/developer.wordpress.org\/reference\/functions\/add_query_arg\/)<\/code>f\u00f6r att l\u00e4gga till en upps\u00e4ttning anpassade fr\u00e5geargument till den aktuella sidan.<\/li>\n<\/ul>\n<p>N\u00e4sta avsnitt av koden kommer att se ut s\u00e5 h\u00e4r:<\/p>\n<pre><code>\narray_push(\n  $views,\n  sprintf(\n    '&lt;a href=\"%1$s\" %2$s&gt;%3$s \n      &lt;span class=\"count\"&gt;(%4$s)&lt;\/span&gt;\n     &lt;\/a&gt;\n    ',\n    add_query_arg([\n      'post_type'   =&gt; 'post',\n      'post_status' =&gt; 'all',\n      'meta_value'  =&gt; 'headline',\n    ], 'edit.php'),\n    $attributes\n    __('Headlines'),\n    count(  );\n);<\/code><\/pre>\n<p>Men jag \u00e4r inte klar \u00e4n. Observera specifikt att jag ringer ett samtal till <code>[count](https:\/\/www.php.net\/manual\/en\/function.count.php)<\/code>i slutet av funktionen. Detta f\u00f6r att jag korrekt ska kunna visa antalet inl\u00e4gg som har detta attribut.<\/p>\n<p>Jag ska skriva tv\u00e5 hj\u00e4lpfunktioner f\u00f6r detta och sedan \u00e5terkommer jag till <code>sizeof<\/code>samtalet.<\/p>\n<hr \/>\n<p>H\u00e4r \u00e4r en hj\u00e4lpfunktion f\u00f6r att hitta antalet resultat som har det angivna <code>meta_key<\/code>och <code>meta_value<\/code>som vi har f\u00f6r den h\u00e4r typen av inl\u00e4gg. L\u00e4gg m\u00e4rke till att jag anv\u00e4nder <code>[$wpdb](https:\/\/developer.wordpress.org\/reference\/classes\/wpdb\/)<\/code>f\u00f6r att g\u00f6ra ett direkt databassamtal och att jag specifikt anv\u00e4nder <code>[prepare](https:\/\/developer.wordpress.org\/reference%2Fclasses%2Fwpdb%2Fprepare%2F\/)<\/code>det f\u00f6r att se till att jag g\u00f6r det s\u00e4kert.<\/p>\n<pre><code>function get_headline_results(): array {\n  global $wpdb;\n  return $wpdb-&gt;get_results( \n    $wpdb-&gt;prepare(\n      \"\n      SELECT post_id FROM $wpdb-&gt;postmeta\n      WHERE meta_key = %s AND meta_value = %s\n      \",\n      'article_attribute',\n      'headline'\n    ),\n    ARRAY_A\n  );\n}<\/code><\/pre>\n<p>Observera att det returnerar alla resultat (inte bara siffran) eftersom detta v\u00e4rde kommer att \u00f6verf\u00f6ras till en annan funktion tillf\u00e4lligt.<\/p>\n<p>Vid det h\u00e4r laget kan vi stanna och helt enkelt titta p\u00e5 inneh\u00e5llet som returneras fr\u00e5n fr\u00e5gan, men om vi bara \u00e4r oroliga f\u00f6r <code>post<\/code>inl\u00e4ggstypen m\u00e5ste vi ta h\u00e4nsyn till det. H\u00e4r \u00e4r ett s\u00e4tt att g\u00f6ra det:<\/p>\n<pre><code>function filter_posts_from_pages( array $results ): array {\n  $post_ids = array();\n\n  foreach ($results as $result) {\n    if ('post' === get_post_type( $result['post_type'])) {\n      $post_ids[] = $result['post_id'];\n    }\n  }\n\n  return $post_ids;\n}<\/code><\/pre>\n<p>Med det kan vi returnera detta v\u00e4rde tillbaka till <code>count<\/code>funktionen ovan.<\/p>\n<hr \/>\n<p>Den slutliga versionen av blocket som vi startade ovan b\u00f6r se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<pre><code>\narray_push(\n  $views,\n  sprintf(\n    '&lt;a href=\"%1$s\" %2$s&gt;%3$s &lt;span class=\"count\"&gt;(%4$s)&lt;\/span&gt;&lt;\/a&gt;',\n    add_query_arg(\n      array(\n        'post_type'   =&gt; 'post',\n        'post_status' =&gt; 'all',\n        'meta_value'  =&gt; 'headlines', \n      ),\n      'edit.php'\n    ),\n    $attributes,\n    __( 'Headlines' ),\n    count(\n      filter_posts_from_pages( get_headline_results()) )) );<\/code><\/pre>\n<p>Vilket inneb\u00e4r att den fullst\u00e4ndiga versionen av funktionen f\u00f6r att l\u00e4gga till en ny rubrik ser ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<pre><code>add_action(\n  'views_edit-post',\n  function (array $views) {\n\n    $attributes = 'class=\"\"';\n    if (filter_input( INPUT_GET, 'meta_value') === 'headline') {\n      $attributes = 'class=\"current aria-current=\"page\"';\n    }\n\n    array_push(\n      $views,\n      sprintf(\n        '&lt;a href=\"%1$s\" %2$s&gt;%3$s &lt;span class=\"count\"&gt;(%4$s)&lt;\/span&gt;&lt;\/a&gt;',\n        add_query_arg(\n          array(\n            'post_type'   =&gt; 'post',\n            'post_status' =&gt; 'all',\n            'meta_value'  =&gt; 'headline', \n          ),\n          'edit.php'\n        ),\n        $attributes,\n        __( 'Headlines' ),\n        count(\n          filter_posts_from_pages( get_headline_results()) )) );\n\n    return $views;\n  }\n);<\/code><\/pre>\n<p>Och, som n\u00e4mnts fr\u00e5n b\u00f6rjan, \u00e4r denna plugin inte namnavgr\u00e4nsad eller organiserad p\u00e5 ett s\u00e4tt som jag normalt skriver kod. Ist\u00e4llet \u00e4r det t\u00e4nkt att visa ett s\u00e4tt att uppn\u00e5 n\u00e5got snabbt \u2013 en prototyp av slag.<\/p>\n<p>S\u00e5 om du \u00e4r intresserad av att se n\u00e5got s\u00e5dant h\u00e4r i aktion, kan du kolla in arkivet p\u00e5 GitHub. L\u00e4gg m\u00e4rke till att det \u00e4r <strong><a href=\"https:\/\/github.com\/tommcfarlin\/custom-metadata-filter\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">utvecklingsgrenen<\/a><\/strong> f\u00f6r tillf\u00e4llet. Kom ih\u00e5g att titta p\u00e5 <code>[README](https:\/\/github.com\/tommcfarlin\/custom-metadata-filter\/blob\/develop\/README.md)<\/code>eftersom det kommer att ge instruktioner om hur du l\u00e4gger till data till databasen f\u00f6r inl\u00e4gg s\u00e5 att <strong>rubrikankaret<\/strong> faktiskt fungerar snarare \u00e4n att villkorsl\u00f6st visar ett nollv\u00e4rde.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Den h\u00e4r artikeln beskriver koden som beh\u00f6vs f\u00f6r att l\u00e4gga till en anpassad l\u00e4nk p\u00e5 sk\u00e4rmen Alla inl\u00e4gg som anv\u00e4nder en anpassad del av inl\u00e4ggsmetadata.<\/p>\n","protected":false},"author":1,"featured_media":158583,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[838,848,901,922,807,724,868],"tags":[1173],"class_list":["post-231490","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-foer-nyboerjare","category-handledningar","category-koda","category-oevrig","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/231490","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=231490"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/231490\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/158583"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=231490"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=231490"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=231490"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}