{"id":229582,"date":"2022-11-05T17:07:00","date_gmt":"2022-11-05T14:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229582"},"modified":"2022-11-09T08:34:07","modified_gmt":"2022-11-09T05:34:07","slug":"wp_kyselyn-luettavuuden-parannukset-yllaepitoa-varten","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/wp_kyselyn-luettavuuden-parannukset-yllaepitoa-varten\/","title":{"rendered":"WP_Kyselyn luettavuuden parannukset (yll\u00e4pitoa varten)"},"content":{"rendered":"\n<p><a href=\"https:\/\/tommcfarlin.com\/passing-variables-in-wordpress-wp-query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Queryn<\/a> kanssa ty\u00f6skentely, varsinkin kun teet mukautettuja t\u00f6it\u00e4 tavanomaisen &quot;hae joitain viestej\u00e4 ja n\u00e4yt\u00e4 ne mallissa&quot; ulkopuolella, voi olla tehokasta. T\u00e4m\u00e4 p\u00e4tee erityisesti joihinkin edistyneisiin argumentteihin (kuten <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Queryn<\/a> k\u00e4ytt\u00e4minen). .<\/p>\n<p>On my\u00f6s mukavaa, ett\u00e4 prosessin asettamisessa on tavallinen tapa tehd\u00e4 asioita. Nimitt\u00e4in:<\/p>\n<ol>\n<li>M\u00e4\u00e4rittele argumentit,<\/li>\n<li>Luo WP_Query,<\/li>\n<li>Tarkista, onko viestej\u00e4,<\/li>\n<li>Kierr\u00e4 niiden l\u00e4pi,<\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=g2JNxeWO_wA\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Viimeistele Ne<\/a>.<\/li>\n<\/ol>\n<div class=\"sds-iframe-wrapper fitvidsignore\" style=\"position:relative;padding-top:56.25%;max-width:100%;\"><iframe allowfullscreen style=\"position:absolute;top:0;left:0;width:100%;height:100%;\" src=\"\/\/www.youtube.com\/embed\/g2JNxeWO_wA\" frameborder=\"0\"><\/iframe><\/div>\n<p>Mutta jos p\u00e4\u00e4set sinne, miss\u00e4 teet edistyneit\u00e4 t\u00f6it\u00e4, kuten ty\u00f6skennell\u00e4ksesi mukautetun viestityypin kanssa kolmannen osapuolen ratkaisusta, joudut lataamaan mediaa sivulta, selvitt\u00e4m\u00e4\u00e4n, onko jotain olemassa ennen kuin teet sen kanssa mit\u00e4\u00e4n, se voi olla hieman monimutkaisempi ty\u00f6skentely, eik\u00f6?<\/p>\n<p>Olen huomannut, ett\u00e4 kuten kaiken ohjelmoinnin kohdalla, sen jakaminen paljon luettavammiksi moduuleiksi (tai funktioiksi tai osiksi tai miksi tahansa niit\u00e4 kutsutaan) voi helpottaa ty\u00f6skentely\u00e4.<\/p>\n<p>Joten t\u00e4ss\u00e4 on yksi tapa, jolla pyrin parantamaan WP_Queryn luettavuutta useissa viime aikoina tekemisiss\u00e4ni.<\/p>\n<h2>WP_Kyselyn luettavuuden parannukset<\/h2>\n<p>Ennen kuin k\u00e4yt l\u00e4pi mit\u00e4\u00e4n esimerkki\u00e4, on syyt\u00e4 huomauttaa, ett\u00e4 WP_Queryn asetuksissa on joitain asioita, joita emme voi tehd\u00e4.<\/p>\n<p>Esimerkiksi, kun kysely on luotu, emme v\u00e4ltt\u00e4m\u00e4tt\u00e4 pysty tekem\u00e4\u00e4n sen kanssa paljon edistyneempi\u00e4 asioita (tarkoitan, ett\u00e4 mink\u00e4 tahansa yksikk\u00f6testauksen m\u00e4\u00e4ritt\u00e4minen, joka ei vaadi WordPress-ydint\u00e4, on mahdotonta).<\/p>\n<p>N\u00e4m\u00e4 ovat sellaisen henkil\u00f6n kasvot, joka ei voi seurata koodiasi.<\/p>\n<p>T\u00e4ss\u00e4 on esimerkki siit\u00e4, milt\u00e4 se voi n\u00e4ytt\u00e4\u00e4, kun aloitat, ja kuinka se voidaan sitten muuttaa pienemmiksi funktioiksi, joista jokainen on tarkoituksellisempi kuin yksi pitk\u00e4 menetelm\u00e4.<\/p>\n<h3>Esimerkki<\/h3>\n<p>Oletetaan, ett\u00e4 t\u00e4t\u00e4 viesti\u00e4 varten minun t\u00e4ytyy tiedustella tietokannasta kaikkia julkaistuja viestej\u00e4 ja viestej\u00e4 ja haluan tilata ne tunnuksella.<\/p>\n<p>Seuraavaksi haluan m\u00e4\u00e4ritt\u00e4\u00e4, onko jollekin kolmannen osapuolen ty\u00f6kalulle m\u00e4\u00e4ritetty metatietoja, jotka vastaavat mallia, jonka voin my\u00f6hemmin m\u00e4\u00e4ritt\u00e4\u00e4 ohjelmallisesti tietylle teemalle, joka minulla on.<\/p>\n<p>Ehk\u00e4 koodin alkuper\u00e4inen versio saattaa n\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-00-wp-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Assume this is defined within the context of a class.\nconst MAPPING = [\n        'employers'       =&gt; 'page-past-word.php',\n        'biography'       =&gt; 'page-biography.php',\n        'accomplishments' =&gt; 'page-csv.php',\n    ];\n\n\/* Snip the rest of the class for brevity *\/\n\npublic function map_templates() {\n\n  $args = [\n    'post_type'      =&gt; array( 'post', 'page' ),\n    'post_status'    =&gt; 'publish',\n    'orderby'        =&gt; 'ID',\n    'order'          =&gt; 'ASC',\n    'posts_per_page' =&gt; -1,\n  ];\n  $template_query = new WP_Query( $args );\n\n    if ($template_query-&gt;have_posts()) {\n        while ($template_query-&gt;have_posts()) {\n            $template_query-&gt;the_post();\n\n            $template_id = get_post_meta( $post_id, 'third_party_template_id', true );\n            if ('' === $template_id) {\n                continue;\n            }\n\n                \/\/ The third-party's template post name can be used to map our custom template.\n            $template_info = get_post( $template_id );\n            $template_name = $template_info-&gt;post_name;\n\n            if (isset( self::MAPPING[ $template_name ])) {\n\n                $template_file = self::MAPPING[ $template_name ];\n                update_post_meta( $post_id, '_wp_page_template', $template_file );\n            }\n        }\n    }\n}\n<\/code><\/pre>\n<p>Se on paljon koodia, joka tekee melko v\u00e4h\u00e4n ty\u00f6t\u00e4 yhdelle toiminnolle. Ainakin siin\u00e4 esitet\u00e4\u00e4n kaikki, mit\u00e4 tarvitsee tapahtua, eik\u00f6 niin?<\/p>\n<p>Ennen kuin jatkat lukemista, huomaa, ett\u00e4 kartoitustaulukko on vain esimerkki, mutta avaimet edustavat sen <strong>yhdist\u00e4misen<\/strong> metaavainta, mik\u00e4 auttaa meit\u00e4 m\u00e4\u00e4ritt\u00e4m\u00e4\u00e4n <strong>_wp_page_template-<\/strong> arvon, kun on aika yhdist\u00e4\u00e4 se todellisiin WordPress-mallitiedostoihin.<\/p>\n<p>Joten miten t\u00e4m\u00e4 voidaan hajottaa?<\/p>\n<h3>1 Aloita koko asia<\/h3>\n<p>Ensimm\u00e4inen asia, jonka haluamme tehd\u00e4, on luoda toiminto, joka saa koko asian liikkeelle. Voit tehd\u00e4 t\u00e4m\u00e4n tietyill\u00e4 tavoilla.<\/p>\n<p>N\u00e4in olen valinnut <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-01-map-page-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sen<\/a> :<\/p>\n<pre><code>&lt;?php\n\npublic function map_page_templates() {\n\n  $posts = $this-&gt;load_posts_and_pages();\n  if ($posts-&gt;have_posts()) {\n    $this-&gt;assign_templates( $posts );\n  }\n}<\/code><\/pre>\n<p>Yksinkertaisesti sanottuna se k\u00e4ytt\u00e4\u00e4 muutamia aputoimintoja \u2013 jotka kaikki dokumentoidaan alla \u2013 ja m\u00e4\u00e4ritt\u00e4\u00e4 sitten kaikki mallit, jotka meill\u00e4 on yll\u00e4 m\u00e4\u00e4ritellyss\u00e4 kartoitustaulukossa.<\/p>\n<h3>2 Lataa viestit ja sivut<\/h3>\n<p>Luonnollisesti ensimm\u00e4inen asia, jonka haluamme tehd\u00e4, on asettaa kutsumaan funktio, joka palauttaa kyselyn tuloksia k\u00e4ytt\u00e4en:<\/p>\n<pre><code>&lt;?php\n\nprivate function load_posts_and_pages() {\n\n  $args = [\n    'post_type'      =&gt; array( 'post', 'page' ),\n    'post_status'    =&gt; 'publish',\n    'orderby'        =&gt; 'ID',\n    'order'          =&gt; 'ASC',\n    'posts_per_page' =&gt; -1,\n  ];\n  $posts = new WP_Query( $args );\n\n  return $posts;\n}\n<\/code><\/pre>\n<p>T\u00e4m\u00e4 palauttaa kyselyn tulokset. T\u00e4ll\u00e4 tavalla voimme m\u00e4\u00e4ritt\u00e4\u00e4, tarvitseeko meid\u00e4n tehd\u00e4 lis\u00e4t\u00f6it\u00e4, jotka sanomme edellisess\u00e4 vaiheessa:<\/p>\n<pre><code>&lt;?php\n\npublic function map_page_templates() {\n\n  $posts = $this-&gt;load_posts_and_pages();\n  if ($posts-&gt;have_posts()) {\n    $this-&gt;assign_templates( $posts );\n  }\n}<\/code><\/pre>\n<p>Jos ei, niin sitten olemme valmiit. Muuten tietysti jatkamme.<\/p>\n<h3>3 Hae kolmannen osapuolen mallin tunnus<\/h3>\n<p>Seuraavaksi idea mallien m\u00e4\u00e4ritt\u00e4misest\u00e4 &#8211; kuten yll\u00e4 olevassa koodissa n\u00e4kyy &#8211; n\u00e4ytt\u00e4\u00e4 riitt\u00e4v\u00e4n yksinkertaiselta, mutta meid\u00e4n on ensin teht\u00e4v\u00e4 muutamia asioita:<\/p>\n<ol>\n<li>iteroida viestej\u00e4 l\u00e4pi,<\/li>\n<li>nappaa mallin kolmannen osapuolen tunnus,<\/li>\n<li>nappaa kolmannen osapuolen mallin nimi,<\/li>\n<li>m\u00e4\u00e4rit\u00e4 malli luokassa aiemmin m\u00e4\u00e4ritetyst\u00e4 kartoitusvakiosta.<\/li>\n<\/ol>\n<p>Toiminnon alkuper\u00e4inen iteraatio voi n\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-03-assign-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/a> :<\/p>\n<pre><code>&lt;?php\n\nprivate function assign_templates( WP_Query $posts) {\n\n  while ($posts-&gt;have_posts()) {\n    $posts-&gt;the_post();\n\n    $template_id = $this-&gt;get_template_id( get_the_ID() );\n    if ('' === $template_id) {\n      continue;\n    }\n\n    $template_name = $this-&gt;get_template_name( $template_id );\n    if (null === $template_name) {\n      continue;\n    }\n\n    $this-&gt;assign_template( get_the_ID(), $template_name );\n  }\n  wp_reset_postdata();\n}\n<\/code><\/pre>\n<p>Mutta kuten n\u00e4et, on edelleen aputoimintoja, jotka tarvitsevat m\u00e4\u00e4ritelmi\u00e4. Asiat, kuten mahdollisuus saada mallin tunnus, mallin nimi ja lopulta m\u00e4\u00e4ritt\u00e4\u00e4 malli.<\/p>\n<p>Huomaa kuitenkin, ett\u00e4 jos jokin apufunktioista ei palauta hy\u00f6dyllist\u00e4 arvoa, jatkamme silmukalla. T\u00e4m\u00e4 on tarpeen ellei muusta syyst\u00e4 kuin sen varmistamiseksi, ett\u00e4 emme yrit\u00e4 kartoittaa malleja, joita ei ole olemassa (mutta mielest\u00e4ni se my\u00f6s helpottaa lukemista).<\/p>\n<h3>4 Etsi tiedosto, johon mallin tunnus liittyy<\/h3>\n<p>Seuraavaksi pienell\u00e4 funktiolla voidaan tarkastella kolmannen osapuolen mallin tunnusta ja m\u00e4\u00e4ritt\u00e4\u00e4, voimmeko yhdist\u00e4\u00e4 t\u00e4m\u00e4n arvon <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-04-get-template-id-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tietokannassamme<\/a> oleviin sivuihin .<\/p>\n<pre><code>&lt;?php\n\nprivate function get_template_id( $post_id) {\n\n  $template_id = get_post_meta( $post_id, 'third_party_template_id', true );\n  return $template_id;\n}\n<\/code><\/pre>\n<p>Jos se ei onnistu, voimme palauttaa tyhj\u00e4n merkkijonon ja antaa t\u00e4m\u00e4n tietyn kutsuneen funktion tarkistaa, kannattaako jatkaa m\u00e4\u00e4ritt\u00e4m\u00e4\u00e4mme silmukkaa.<\/p>\n<h3>5 Tartu mallin nimeen<\/h3>\n<p>Olettaen, ett\u00e4 meill\u00e4 on kelvollinen viestitunnus, meid\u00e4n on nyt <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-05-get-template-name-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">noudettava mallin nimi<\/a> aiemmin viestiss\u00e4 m\u00e4\u00e4ritetyst\u00e4 kartoitustaulukosta:<\/p>\n<pre><code>&lt;?php\n\nprivate function get_template_name( $template_id) {\n\n  $template_info = get_post( $template_id );\n  $template_name = $template_info-&gt;post_name;\n\n  if (isset( self::MAPPING[ $template_name ])) {\n    return $template_name;\n  } else {\n    return null;\n  }\n}\n<\/code><\/pre>\n<p>Asia on t\u00e4ss\u00e4: Palautamme joko mallin nimen tai nolla-arvon. T\u00e4m\u00e4 on j\u00e4lleen, jotta voimme m\u00e4\u00e4ritt\u00e4\u00e4, tarvitseeko meid\u00e4n jatkaa mallien m\u00e4\u00e4ritt\u00e4mist\u00e4 vai ei.<\/p>\n<h3>6 M\u00e4\u00e4rit\u00e4 malli<\/h3>\n<p>Lopuksi voimme napata kolmannen osapuolen toimittaman mallin tunnuksen ja k\u00e4ytt\u00e4\u00e4 sit\u00e4 yhdist\u00e4m\u00e4\u00e4n <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-06-assign-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tiedostoon,<\/a> jonka olemme sis\u00e4llytt\u00e4neet ty\u00f6h\u00f6n, kuten aiemmin viestiss\u00e4 on kuvattu:<\/p>\n<pre><code>&lt;?php\n\nprivate function assign_template( $post_id, $template_name) {\n\n  $template_file = self::MAPPING[ $template_name ];\n  update_post_meta( $post_id, '_wp_page_template', $template_file );\n}\n<\/code><\/pre>\n<p>Ja n\u00e4in voit viime k\u00e4dess\u00e4 luoda paljon pienempi\u00e4, helpompi lukea ja helpompi k\u00e4ytt\u00e4\u00e4 koodia ja toimintoja, kun ty\u00f6skentelet hieman monimutkaisempien kyselyiden kanssa.<\/p>\n<h2>Ja siten luettavuuden parannuksia<\/h2>\n<p>Niille, jotka ovat tottuneet lukemaan pitki\u00e4 menetelmi\u00e4 tai tekem\u00e4\u00e4n asioita tavalla, jolla useimmat verkon opetusohjelmat osoittavat, kuinka asioita tehd\u00e4\u00e4n WordPressiss\u00e4, t\u00e4m\u00e4 voi n\u00e4ytt\u00e4\u00e4 turhalta koodilta.<\/p>\n<p>Mutta harkitse t\u00e4t\u00e4:<\/p>\n<ol>\n<li>Pidempi\u00e4 menetelmi\u00e4 on vaikea lukea,<\/li>\n<li>Niit\u00e4 voi olla vaikeampi korjata,<\/li>\n<li>Eiv\u00e4tk\u00e4 ne hajoa ongelmaa paremmin hallittavissa oleviin osiin.<\/li>\n<\/ol>\n<p>Toki haluaisin jakaa t\u00e4m\u00e4n viel\u00e4 useampaan luokkiin heid\u00e4n vastuullaan, ja uskon, ett\u00e4 se voidaan tehd\u00e4, mutta WP_Queryn luonteen vuoksi se vaatisi hieman enemm\u00e4n ty\u00f6t\u00e4.<\/p>\n<p>Joten olen yritt\u00e4nyt l\u00f6yt\u00e4\u00e4 mahdollisimman paljon keskitiet\u00e4.<\/p>\n<p>Jos ty\u00f6skentelet WP_Queryn jopa hieman edistyneemmill\u00e4 k\u00e4ytt\u00f6tavoilla, suosittelen ainakin harkitsemaan sen jakamista pienempiin osiin.<\/p>\n<p>T\u00e4m\u00e4 auttaa huolehtimaan luettavuudesta, mahdollisesti kaikesta yll\u00e4pidett\u00e4vyydest\u00e4 ja kirjoittamaan puhtaampaa koodia yhden pitk\u00e4n menetelm\u00e4n sijaan, jossa on liikaa ehtoja ja riippuvainen monista muista tiedoista.<\/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>WP_Queryn luettavuuden kanssa ty\u00f6skentely voi olla haastavaa. T\u00e4ss\u00e4 on esimerkki siit\u00e4, kuinka hajaan API:n k\u00e4ytt\u00f6\u00e4 joissakin omassa ty\u00f6ss\u00e4ni.<\/p>\n","protected":false},"author":1,"featured_media":220946,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,864],"tags":[1166],"class_list":["post-229582","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229582","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=229582"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229582\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/220946"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=229582"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=229582"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=229582"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}