{"id":232051,"date":"2023-01-06T11:47:00","date_gmt":"2023-01-06T08:47:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232051"},"modified":"2023-01-06T12:13:24","modified_gmt":"2023-01-06T09:13:24","slug":"lisaeae-mukautettu-linkki-kaikki-viestit-naeyttoeoen-viestin-metatietojen-perusteella","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/lisaeae-mukautettu-linkki-kaikki-viestit-naeyttoeoen-viestin-metatietojen-perusteella\/","title":{"rendered":"Lis\u00e4\u00e4 mukautettu linkki Kaikki viestit -n\u00e4ytt\u00f6\u00f6n viestin metatietojen perusteella"},"content":{"rendered":"\n<p><strong>TL;DR<\/strong>: T\u00e4ss\u00e4 artikkelissa kuvataan koodi, joka tarvitaan mukautetun linkin lis\u00e4\u00e4miseen <strong>Kaikki viestit<\/strong> -n\u00e4yt\u00f6lle, joka k\u00e4ytt\u00e4\u00e4 mukautettua tekstin metatietoa.<\/p>\n<p><strong>Huomautus<\/strong>: Muutama kuukausi sitten kirjoitin artikkelin <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/lisaeae-mukautettu-naekymae-kaikki-viestit-naeyttoeoen\/\" title=\"mukautetun n\u00e4kym\u00e4n lis\u00e4\u00e4misest\u00e4 Kaikki viestit -n\u00e4ytt\u00f6\u00f6n\">mukautetun n\u00e4kym\u00e4n lis\u00e4\u00e4misest\u00e4 Kaikki viestit -n\u00e4ytt\u00f6\u00f6n<\/a>. T\u00e4m\u00e4 artikkeli ei ole kaikki yhdess\u00e4 sama, mutta eiv\u00e4t kaikki yhdess\u00e4 erilaisia. Ajattele sit\u00e4 yksityiskohtaisempana ja kenties konseptin k\u00e4yt\u00e4nn\u00f6n toteutuksena.<\/p>\n<hr \/>\n<p>Oletetaan, ett\u00e4 sinulla on vakioviestityyppi tai mukautettu viestityyppi ja aiot yksinkertaisesti suodattaa otsikon perusteella, jonka m\u00e4\u00e4rit\u00e4t k\u00e4ytt\u00e4m\u00e4ll\u00e4 mekanismia, jonka avulla voit tallentaa tietoja <code>post_metadata<\/code>taulukkoon.<\/p>\n<p>Oletetaan esimerkiksi, ett\u00e4 sinulla on viesti ja se metatietona, jossa on:<\/p>\n<ul>\n<li>a <code>meta_key<\/code>arvolla<code>article_attribute<\/code><\/li>\n<li>a <code>meta_value<\/code>arvolla<code>headline<\/code><\/li>\n<\/ul>\n<p>Ja haluat k\u00e4ytt\u00e4\u00e4 n\u00e4it\u00e4 tietoja lis\u00e4t\u00e4ksesi uuden <strong>Otsikot<\/strong> &#8211; linkin, joka suodattaa automaattisesti kaiken paitsi artikkelit, joissa on kyseisi\u00e4 metatietoja.<\/p>\n<p>N\u00e4in se tehd\u00e4\u00e4n.<\/p>\n<h2>Mukautettu linkki Kaikki viestit -n\u00e4yt\u00f6ss\u00e4<\/h2>\n<p>Ennen kuin aloitat, on syyt\u00e4 huomata, ett\u00e4 ongelman ratkaisemiseksi on kaksi tapaa:<\/p>\n<ul>\n<li>Voisimme lis\u00e4t\u00e4 linkin ensin <strong>Kaikki viestit<\/strong> -sivun yl\u00e4osaan ja sitten lis\u00e4t\u00e4 tietojen suodatustoiminnon,<\/li>\n<li>Tai voimme tehd\u00e4 sen toisin p\u00e4in, jolloin lis\u00e4\u00e4mme ensin taustalogiikan ja lis\u00e4\u00e4mme sitten <strong>Kaikki viestit<\/strong> -sivun linkin.<\/li>\n<\/ul>\n<p>P\u00e4\u00e4t\u00e4n aloittaa toisesta vaihtoehdosta. Ei ole mit\u00e4\u00e4n syyt\u00e4, miksi se pit\u00e4isi tehd\u00e4 t\u00e4ll\u00e4 tavalla. Se on minun suosikkini.<\/p>\n<hr \/>\n<p>Ensin minun on tartuttava <code>[pre_get_posts](https:\/\/developer.wordpress.org\/reference\/hooks\/pre_get_posts\/)<\/code>WordPressin tarjoamaan koukkuun. En aio k\u00e4ytt\u00e4\u00e4 t\u00e4ss\u00e4 esimerkiss\u00e4 mit\u00e4\u00e4n nimiavaroituja luokkia tai etuliitteit\u00e4 (koska olen k\u00e4sitellyt t\u00e4t\u00e4 sis\u00e4lt\u00f6\u00e4 riitt\u00e4v\u00e4sti t\u00e4ll\u00e4 sivustolla), mutta minulla on t\u00e4m\u00e4n esittelylaajennus linkitettyn\u00e4 viestin alareunaan.<\/p>\n<p>Joka tapauksessa aloitan lis\u00e4\u00e4m\u00e4ll\u00e4 nimett\u00f6m\u00e4n toiminnon, joka on liitetty edell\u00e4 mainittuun koukkuun:<\/p>\n<pre><code>add_action(\n  'pre_get_posts',\n  function (WP_Query $query) {\n\n  }\n);<\/code><\/pre>\n<p>Huomaa, ett\u00e4 anonyymi funktio hyv\u00e4ksyy yhden argumentin, joka on viittaus <code>WP_Query<\/code>sivulla k\u00e4ynniss\u00e4 olevaan nykyiseen esiintym\u00e4\u00e4n. Jos et ole perehtynyt kyseiseen luokkaan, suosittelen lukemaan jonkin <a href=\"https:\/\/tommcfarlin.com\/?s=wp_query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4ist\u00e4 artikkeleista<\/a> tai <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Kehitt\u00e4j\u00e4resurssit<\/a> &#8211; sivun.<\/p>\n<p>Funktiossa minun on tarkistettava a:n l\u00e4sn\u00e4olo <code>meta_value<\/code>kyselymerkkijonossa. T\u00e4m\u00e4 on helppo tehd\u00e4 <code>[filter_input](https:\/\/www.php.net\/manual\/en\/function.filter-input.php)<\/code>PHP:n tarjoaman toiminnon ansiosta.<\/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>T\u00e4m\u00e4 koukku tarkistaa, onko <code>headline<\/code>arvo <code>meta_value<\/code>kyselymerkkijonon avaimen avain. Jos n\u00e4in on, se lis\u00e4\u00e4 sitten ilmentym\u00e4\u00e4n ja, <code>meta_key<\/code>joka kehottaa WordPressi\u00e4 hakemaan kaikki viestit vain kyseisill\u00e4 metatiedoilla.<code>meta_value``WP_Query<\/code><\/p>\n<hr \/>\n<p>Sen j\u00e4lkeen minun on lis\u00e4tt\u00e4v\u00e4 linkki <strong>Kaikki viestit<\/strong> -sivun yl\u00e4osaan k\u00e4ynnist\u00e4\u00e4kseni t\u00e4m\u00e4n toiminnon. T\u00e4t\u00e4 varten k\u00e4yt\u00e4n <code>[views_edit-posts](https:\/\/tommcfarlin.com\/add-a-custom-view\/)<\/code>koukkua. T\u00e4m\u00e4 toiminto hyv\u00e4ksyy joukon ankkureita, jotka n\u00e4kyv\u00e4t sivun yl\u00e4osassa.<\/p>\n<p>Viittaan n\u00e4ihin <code>$views<\/code>niin, ett\u00e4 toiminto hyv\u00e4ksyy sen, kun poistan sen:<\/p>\n<pre><code>add_action(\n  'views_edit-post',\n  function (array $views) {\n\n    return $views;\n  }\n);<\/code><\/pre>\n<p>Huomaa, ett\u00e4 on t\u00e4rke\u00e4\u00e4 palauttaa taulukko takaisin WordPressiin, jotta se tiet\u00e4\u00e4 mit\u00e4 hahmontaa, vaikka muutoksia ei tehd\u00e4.<\/p>\n<p>Ensin minun on m\u00e4\u00e4ritett\u00e4v\u00e4, olenko t\u00e4ll\u00e4 hetkell\u00e4 mukautetulla sivulla. Jos n\u00e4in on, minun on lis\u00e4tt\u00e4v\u00e4 oikeat attribuutit sivun yl\u00e4osaan lis\u00e4ttyyn ankkuriin:<\/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>Sen j\u00e4lkeen minun on lis\u00e4tt\u00e4v\u00e4 sivulle <strong>Otsikot<\/strong> -n\u00e4kym\u00e4. T\u00e4m\u00e4 edellytt\u00e4\u00e4 useiden toimintojen k\u00e4ytt\u00f6\u00e4:<\/p>\n<ul>\n<li><code>[array_push](https:\/\/www.php.net\/manual\/en\/function.array-push.php)<\/code>uuden linkin lis\u00e4\u00e4miseksi luetteloon<code>$views<\/code><\/li>\n<li><code>[sprintf](https:\/\/www.php.net\/manual\/en\/function.sprintf.php)<\/code>uuden merkkijonon turvalliseen lis\u00e4\u00e4miseen<\/li>\n<li><code>[add_query_arg](https:\/\/developer.wordpress.org\/reference\/functions\/add_query_arg\/)<\/code>lis\u00e4t\u00e4ksesi joukon mukautettuja kyselyargumentteja nykyiselle sivulle.<\/li>\n<\/ul>\n<p>Seuraava koodin osa n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/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>Mutta en ole viel\u00e4 valmis. Huomaa erityisesti, ett\u00e4 soitan <code>[count](https:\/\/www.php.net\/manual\/en\/function.count.php)<\/code>toiminnon lopussa. T\u00e4m\u00e4 on, jotta voin n\u00e4ytt\u00e4\u00e4 oikein t\u00e4m\u00e4n m\u00e4\u00e4ritteen sis\u00e4lt\u00e4vien viestien m\u00e4\u00e4r\u00e4n.<\/p>\n<p>Kirjoitan t\u00e4h\u00e4n kaksi apufunktiota ja palaan sitten takaisin <code>sizeof<\/code>puheluun.<\/p>\n<hr \/>\n<p>T\u00e4ss\u00e4 on aputoiminto, jonka avulla voit l\u00f6yt\u00e4\u00e4 tulosten m\u00e4\u00e4r\u00e4n, joilla on m\u00e4\u00e4ritetty <code>meta_key<\/code>ja <code>meta_value<\/code>joka meill\u00e4 on t\u00e4m\u00e4n tyyppisille viesteille. Huomaa, ett\u00e4 k\u00e4yt\u00e4n <code>[$wpdb](https:\/\/developer.wordpress.org\/reference\/classes\/wpdb\/)<\/code>suoraa tietokantapuhelua ja k\u00e4yt\u00e4n sit\u00e4 erityisesti <code>[prepare](https:\/\/developer.wordpress.org\/reference%2Fclasses%2Fwpdb%2Fprepare%2F\/)<\/code>varmistaakseni, ett\u00e4 teen sen turvallisesti.<\/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>Huomaa, ett\u00e4 se palauttaa kaikki tulokset (ei vain numeroa), koska t\u00e4m\u00e4 arvo v\u00e4litet\u00e4\u00e4n hetkellisesti toiseen funktioon.<\/p>\n<p>T\u00e4ss\u00e4 vaiheessa voisimme pys\u00e4hty\u00e4 ja yksinkertaisesti katsoa kyselyst\u00e4 palautettua sis\u00e4lt\u00f6\u00e4, mutta jos olemme huolissamme vain viestityypist\u00e4 <code>post<\/code>, meid\u00e4n on otettava se huomioon. T\u00e4ss\u00e4 on yksi tapa tehd\u00e4 se:<\/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>Sen avulla voimme palauttaa t\u00e4m\u00e4n arvon takaisin <code>count<\/code>yll\u00e4 olevaan funktioon.<\/p>\n<hr \/>\n<p>Edell\u00e4 aloittamamme lohkon lopullisen version pit\u00e4isi n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/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>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 uuden otsikon lis\u00e4\u00e4mistoiminnon t\u00e4ydellinen versio n\u00e4ytt\u00e4\u00e4 suunnilleen t\u00e4lt\u00e4:<\/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>Ja kuten alusta alkaen mainittiin, t\u00e4m\u00e4 laajennus ei ole nimiavaroitunut tai j\u00e4rjestetty tavalla, jolla kirjoitan normaalisti koodia. Sen sijaan se on tarkoitettu osoittamaan tapa saavuttaa jotain nopeasti \u2013 er\u00e4\u00e4nlainen prototyyppi.<\/p>\n<p>Joten jos olet kiinnostunut n\u00e4kem\u00e4\u00e4n jotain t\u00e4llaista toiminnassa, voit tutustua GitHubin arkistoon. Huomaa, ett\u00e4 se on t\u00e4ll\u00e4 hetkell\u00e4 kehityshaara <strong><a href=\"https:\/\/github.com\/tommcfarlin\/custom-metadata-filter\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">.<\/a><\/strong> Muista tarkastella, <code>[README](https:\/\/github.com\/tommcfarlin\/custom-metadata-filter\/blob\/develop\/README.md)<\/code>koska se antaa ohjeet tietojen lis\u00e4\u00e4miseen viestien tietokantaan, jotta <strong>Otsikot<\/strong> &#8211; ankkuri todella toimii sen sijaan, ett\u00e4 se n\u00e4ytt\u00e4isi ehdoitta nolla-arvoa.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4ss\u00e4 artikkelissa kuvataan koodi, joka tarvitaan mukautetun linkin lis\u00e4\u00e4miseen Kaikki viestit -n\u00e4yt\u00f6lle, joka k\u00e4ytt\u00e4\u00e4 mukautettua tekstin metatietoa.<\/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":[719,895,917,834,843,803,864],"tags":[1166],"class_list":["post-232051","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-muut","category-opas-aloittelijoille","category-opetusohjelmia","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/232051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=232051"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/232051\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/158583"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=232051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=232051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=232051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}