{"id":231492,"date":"2023-01-06T12:15:00","date_gmt":"2023-01-06T09:15:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231492"},"modified":"2023-01-06T12:48:25","modified_gmt":"2023-01-06T09:48:25","slug":"lisage-postituste-metaandmete-pohjal-kohandatud-link-koigi-postituste-ekraanile","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/lisage-postituste-metaandmete-pohjal-kohandatud-link-koigi-postituste-ekraanile\/","title":{"rendered":"Lisage postituste metaandmete p\u00f5hjal kohandatud link k\u00f5igi postituste ekraanile"},"content":{"rendered":"\n<p><strong>TL;DR<\/strong>: selles artiklis kirjeldatakse koodi, mis on vajalik kohandatud lingi lisamiseks ekraanile <strong>K\u00f5ik postitused<\/strong>, mis kasutab kohandatud postituse metaandmeid.<\/p>\n<p><strong>M\u00e4rkus<\/strong>: paar kuud tagasi kirjutasin artikli selle kohta, <a href=\"https:\/\/wordpress.mediadoma.com\/et\/lisage-kohandatud-vaade-koigi-postituste-ekraanile\/\" title=\"kuidas lisada kohandatud vaadet ekraanile K\u00f5ik postitused\">kuidas lisada kohandatud vaadet ekraanile K\u00f5ik postitused<\/a>. See artikkel ei ole k\u00f5ik koos sama, kuid mitte k\u00f5ik koos erinevad. M\u00f5elge sellele kui kontseptsiooni \u00fcksikasjalikumale ja v\u00f5ib-olla praktilisemale rakendamisele.<\/p>\n<hr \/>\n<p>Oletagem, et teil on standardne postituse t\u00fc\u00fcp v\u00f5i kohandatud postituse t\u00fc\u00fcp ja te filtreerite lihtsalt pealkirja j\u00e4rgi, mille m\u00e4\u00e4rate mehhanismi abil, mis v\u00f5imaldab teil <code>post_metadata<\/code>tabelisse andmeid salvestada.<\/p>\n<p>Oletame n\u00e4iteks, et teil on postitus ja see on metaandmete osa koos:<\/p>\n<ul>\n<li>a <code>meta_key<\/code>v\u00e4\u00e4rtusega<code>article_attribute<\/code><\/li>\n<li>a <code>meta_value<\/code>v\u00e4\u00e4rtusega<code>headline<\/code><\/li>\n<\/ul>\n<p>Ja soovite seda teavet kasutada uue <strong>pealkirjade<\/strong> lingi lisamiseks, mis filtreerib automaatselt v\u00e4lja k\u00f5ik, v\u00e4lja arvatud nende metaandmetega artiklid.<\/p>\n<p>Siin on, kuidas seda teha.<\/p>\n<h2>Kohandatud link k\u00f5igi postituste ekraanil<\/h2>\n<p>Enne alustamist tasub m\u00e4rkida, et selle probleemi lahendamiseks on kaks v\u00f5imalust.<\/p>\n<ul>\n<li>V\u00f5iksime esmalt lisada lingi lehe <strong>K\u00f5ik postitused<\/strong> \u00fclaossa ja seej\u00e4rel lisada andmete filtreerimise funktsiooni,<\/li>\n<li>V\u00f5i v\u00f5ime seda teha ka teistpidi, lisades esmalt taustaloogika ja seej\u00e4rel lehe <strong>K\u00f5ik postitused<\/strong> lingi.<\/li>\n<\/ul>\n<p>Ma otsustan alustada teise variandiga. Pole mingit p\u00f5hjust, miks seda niimoodi tegema peab. See on minu eelistus.<\/p>\n<hr \/>\n<p>Esiteks pean haakuma <code>[pre_get_posts](https:\/\/developer.wordpress.org\/reference\/hooks\/pre_get_posts\/)<\/code>WordPressi pakutava konksu k\u00fclge. Ma ei kasuta selles n\u00e4ites \u00fchtegi nimeruumiga klasse ega eesliitega funktsioone (arvestades, et olen sellel saidil seda sisu piisavalt k\u00e4sitlenud), kuid selle jaoks on postituse allosas lingitud demoplugin.<\/p>\n<p>Igatahes alustan sellest, et lisan eelmainitud konksu k\u00fclge anon\u00fc\u00fcmse funktsiooni:<\/p>\n<pre><code>add_action(\n  'pre_get_posts',\n  function (WP_Query $query) {\n\n  }\n);<\/code><\/pre>\n<p>Pange t\u00e4hele, et anon\u00fc\u00fcmne funktsioon aktsepteerib \u00fche argumendi, mis on viide <code>WP_Query<\/code>lehel t\u00f6\u00f6tavale eksemplarile. Kui te pole selle klassiga tuttav, soovitan lugeda m\u00f5nda <a href=\"https:\/\/tommcfarlin.com\/?s=wp_query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">neist artiklitest<\/a> v\u00f5i <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">arendajaressursside<\/a> lehte.<\/p>\n<p>Funktsioonis pean kontrollima a olemasolu <code>meta_value<\/code>p\u00e4ringustringis. Seda on lihtne teha t\u00e4nu <code>[filter_input](https:\/\/www.php.net\/manual\/en\/function.filter-input.php)<\/code>PHP pakutavale funktsioonile.<\/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>See konks vaatab, kas <code>headline<\/code>v\u00e4\u00e4rtus on <code>meta_value<\/code>p\u00e4ringustringis oleva v\u00f5tme v\u00f5ti. Kui jah, lisab see eksemplarile ja, <code>meta_key<\/code>mis annab WordPressile korralduse tuua k\u00f5ik postitused ainult nende metaandmetega.<code>meta_value``WP_Query<\/code><\/p>\n<hr \/>\n<p>P\u00e4rast seda pean selle funktsiooni k\u00e4ivitamiseks lisama lehe <strong>K\u00f5ik postitused<\/strong> \u00fclaossa lingi. Selleks kasutan <code>[views_edit-posts](https:\/\/tommcfarlin.com\/add-a-custom-view\/)<\/code>konksu. See funktsioon aktsepteerib hulga ankruid, mis kuvatakse lehe \u00fclaosas.<\/p>\n<p>Nimetan neid <code>$views<\/code>nii, et funktsioon v\u00f5tab selle vastu, kui ma selle v\u00e4lja l\u00fclitan:<\/p>\n<pre><code>add_action(\n  'views_edit-post',\n  function (array $views) {\n\n    return $views;\n  }\n);<\/code><\/pre>\n<p>Pange t\u00e4hele, et massiiv on oluline WordPressile tagasi saata, et see teaks, mida renderdada, isegi kui muudatusi ei tehta.<\/p>\n<p>Esiteks pean kindlaks tegema, kas olen praegu kohandatud lehel. Kui jah, siis pean lehe \u00fclaossa lisatud ankrule lisama \u00f5iged atribuudid:<\/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>P\u00e4rast seda pean tegelikult lehele lisama <strong>pealkirjade<\/strong> vaate. See n\u00f5uab mitme funktsiooni kasutamist:<\/p>\n<ul>\n<li><code>[array_push](https:\/\/www.php.net\/manual\/en\/function.array-push.php)<\/code>uue lingi lisamiseks loendisse<code>$views<\/code><\/li>\n<li><code>[sprintf](https:\/\/www.php.net\/manual\/en\/function.sprintf.php)<\/code>uue stringi turvaliseks lisamiseks<\/li>\n<li><code>[add_query_arg](https:\/\/developer.wordpress.org\/reference\/functions\/add_query_arg\/)<\/code>kohandatud p\u00e4ringuargumentide komplekti lisamiseks praegusele lehele.<\/li>\n<\/ul>\n<p>J\u00e4rgmine koodiosa n\u00e4eb v\u00e4lja selline:<\/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>Aga ma pole veel l\u00f5petanud. <code>[count](https:\/\/www.php.net\/manual\/en\/function.count.php)<\/code>Pange t\u00e4hele, et funktsiooni l\u00f5pus helistan numbrile. Seda selleks, et saaksin \u00f5igesti kuvada selle atribuudiga postituste arvu.<\/p>\n<p>Kirjutan selle jaoks kaks abifunktsiooni ja siis p\u00f6\u00f6rdun tagasi <code>sizeof<\/code>k\u00f5ne juurde.<\/p>\n<hr \/>\n<p>Siin on abifunktsioon, mille abil saate leida tulemuste arvu, millel on m\u00e4\u00e4ratud <code>meta_key<\/code>ja <code>meta_value<\/code>mis meil seda t\u00fc\u00fcpi postituste jaoks on. Pange t\u00e4hele, et ma kasutan <code>[$wpdb](https:\/\/developer.wordpress.org\/reference\/classes\/wpdb\/)<\/code>otse andmebaasik\u00f5ne tegemiseks ja kasutan seda spetsiaalselt selleks <code>[prepare](https:\/\/developer.wordpress.org\/reference%2Fclasses%2Fwpdb%2Fprepare%2F\/)<\/code>, et teha seda ohutult.<\/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>Pange t\u00e4hele, et see tagastab k\u00f5ik tulemused (mitte ainult arvu), kuna see v\u00e4\u00e4rtus edastatakse hetkega teise funktsiooni.<\/p>\n<p>Siinkohal v\u00f5iksime peatuda ja lihtsalt vaadata p\u00e4ringust tagastatud sisu, kuid kui oleme mures ainult <code>post<\/code>postituse t\u00fc\u00fcbi p\u00e4rast, siis peame sellega arvestama. Siin on \u00fcks viis seda teha.<\/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>Sellega saame selle v\u00e4\u00e4rtuse tagasi <code>count<\/code>\u00fclaltoodud funktsioonile.<\/p>\n<hr \/>\n<p>Eespool alustatud ploki l\u00f5plik versioon peaks v\u00e4lja n\u00e4gema umbes selline:<\/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>Mis t\u00e4hendab, et uue pealkirja lisamise funktsiooni t\u00e4ielik versioon n\u00e4eb v\u00e4lja umbes selline:<\/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 nagu algusest peale mainitud, pole sellel pistikprogrammil nimeruumid ega korraldatud nii, nagu ma tavaliselt koodi kirjutan. Selle asemel on see m\u00f5eldud selleks, et demonstreerida viisi, kuidas midagi kiiresti saavutada \u2013 omamoodi protot\u00fc\u00fcpi.<\/p>\n<p>Nii et kui soovite midagi sellist tegevuses n\u00e4ha, v\u00f5ite vaadata GitHubi hoidlat. Pange t\u00e4hele, et see on hetkel arendusharu <strong><a href=\"https:\/\/github.com\/tommcfarlin\/custom-metadata-filter\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">.<\/a><\/strong> \u00c4rge unustage vaadata, <code>[README](https:\/\/github.com\/tommcfarlin\/custom-metadata-filter\/blob\/develop\/README.md)<\/code>kuna see annab juhiseid postituste andmebaasi andmete lisamiseks, et <strong>pealkirjade<\/strong> ankur tegelikult t\u00f6\u00f6taks, mitte ei n\u00e4itaks tingimusteta nullv\u00e4\u00e4rtust.<\/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>Selles artiklis kirjeldatakse koodi, mis on vajalik kohandatud lingi lisamiseks ekraanile K\u00f5ik postitused, mis kasutab kohandatud postituse metaandmeid.<\/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":[718,833,894,916,842,802,863],"tags":[1165],"class_list":["post-231492","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-juhend-algajatele","category-kood","category-muud","category-opetused","category-php-4","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/231492","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=231492"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/231492\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/158583"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=231492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=231492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=231492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}