{"id":228890,"date":"2022-11-05T16:52:00","date_gmt":"2022-11-05T13:52:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228890"},"modified":"2022-11-09T04:40:39","modified_gmt":"2022-11-09T01:40:39","slug":"wp_query-laesbarhetsfoerbaettringar-foer-underhaall","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wp_query-laesbarhetsfoerbaettringar-foer-underhaall\/","title":{"rendered":"WP_Query l\u00e4sbarhetsf\u00f6rb\u00e4ttringar (f\u00f6r underh\u00e5ll)"},"content":{"rendered":"\n<p>Att arbeta med <a href=\"https:\/\/tommcfarlin.com\/passing-variables-in-wordpress-wp-query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a>, s\u00e4rskilt n\u00e4r du g\u00f6r lite anpassat arbete utanf\u00f6r det vanliga &quot;skaffa n\u00e5gra inl\u00e4gg och visa dem p\u00e5 en mall&quot; kan vara kraftfullt. Detta g\u00e4ller s\u00e4rskilt f\u00f6r n\u00e5gra av de avancerade argumenten (som att anv\u00e4nda <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Query<\/a>, till exempel) .<\/p>\n<p>Det \u00e4r ocks\u00e5 lite trevligt att s\u00e4tta upp processen har ett standards\u00e4tt att g\u00f6ra saker p\u00e5. N\u00e4mligen:<\/p>\n<ol>\n<li>Definiera argumenten,<\/li>\n<li>Instantera WP_Query,<\/li>\n<li>Kolla om det finns inl\u00e4gg,<\/li>\n<li>G\u00e5 igenom dem,<\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=g2JNxeWO_wA\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Avsluta dem<\/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>Men om du kommer dit du g\u00f6r n\u00e5got avancerat arbete som att arbeta med en anpassad inl\u00e4ggstyp fr\u00e5n en tredjepartsl\u00f6sning, beh\u00f6va sidladda media, avg\u00f6ra om n\u00e5got finns innan du faktiskt arbetar med det, s\u00e5 kan det vara en lite mer komplicerat att arbeta med, eller hur?<\/p>\n<p>Jag har uppt\u00e4ckt att, precis som med allt inom programmering, att dela upp det i mycket mer l\u00e4sbara moduler (eller funktioner eller delar eller vad du nu skulle vilja kalla dem) kan g\u00f6ra det mycket l\u00e4ttare att arbeta med.<\/p>\n<p>S\u00e5 h\u00e4r \u00e4r ett s\u00e4tt att arbeta f\u00f6r att g\u00f6ra WP_Query l\u00e4sbarhetsf\u00f6rb\u00e4ttringar i en m\u00e4ngd av de saker jag har gjort p\u00e5 sistone.<\/p>\n<h2>WP_Query L\u00e4sbarhetsf\u00f6rb\u00e4ttringar<\/h2>\n<p>Innan du g\u00e5r igenom n\u00e5got exempel \u00e4r det v\u00e4rt att p\u00e5peka att det finns vissa saker som vi inte kan g\u00f6ra p\u00e5 s\u00e4ttet som WP_Query \u00e4r konfigurerat.<\/p>\n<p>Till exempel, n\u00e4r fr\u00e5gan v\u00e4l har instansierats kanske vi inte kan g\u00f6ra mycket mer avancerade saker med den (jag menar, att st\u00e4lla in enhetstestning som inte kr\u00e4ver WordPress-k\u00e4rna kommer att bli om\u00f6jligt).<\/p>\n<p>Det h\u00e4r \u00e4r ansiktet p\u00e5 en som inte kan f\u00f6lja din kod.<\/p>\n<p>Med det sagt, h\u00e4r \u00e4r ett exempel p\u00e5 hur det kan se ut n\u00e4r du b\u00f6rjar och sedan hur det kan omstruktureras f\u00f6r att ha mindre funktioner som var och en \u00e4r mer avsiktlig \u00e4n en l\u00e5ng metod.<\/p>\n<h3>Ett exempel<\/h3>\n<p>F\u00f6r det h\u00e4r inl\u00e4gget, l\u00e5t oss s\u00e4ga att jag beh\u00f6ver fr\u00e5ga databasen f\u00f6r alla publicerade inl\u00e4gg och inl\u00e4gg och jag vill best\u00e4lla dem efter ID.<\/p>\n<p>D\u00e4refter vill jag avg\u00f6ra om n\u00e5got tredjepartsverktyg har tilldelats vissa metadata till det som motsvarar en mall som jag senare kan tilldela programmatiskt givet ett tema som jag har.<\/p>\n<p>Kanske den ursprungliga versionen av koden kan se ut ungef\u00e4r <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-00-wp-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r<\/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>Det \u00e4r mycket kod f\u00f6r att g\u00f6ra en hel del arbete f\u00f6r en funktion. \u00c5tminstone l\u00e4gger den ut allt som beh\u00f6ver h\u00e4nda, eller hur?<\/p>\n<p>Innan du l\u00e4ser vidare, notera att mappningsarrayen bara \u00e4r ett exempel, men nycklarna representerar meta-nyckeln f\u00f6r <strong>mappning av den<\/strong>, och det hj\u00e4lper oss att kartl\u00e4gga definiera\u00a0 v\u00e4rdet <strong>_wp_page_template<\/strong> n\u00e4r det \u00e4r dags att mappa det till faktiska WordPress-mallfiler.<\/p>\n<p>S\u00e5 hur kan detta brytas ner?<\/p>\n<h3>1 Sparka ig\u00e5ng det hela<\/h3>\n<p>Det f\u00f6rsta vi vill g\u00f6ra \u00e4r att skapa en funktion som s\u00e4tter ig\u00e5ng det hela. Det finns n\u00e5gra s\u00e4tt som du kan v\u00e4lja att g\u00f6ra detta p\u00e5.<\/p>\n<p>S\u00e5 h\u00e4r har jag valt <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-01-map-page-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">att g\u00f6ra det<\/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>Enkelt uttryckt kommer den att anv\u00e4nda n\u00e5gra hj\u00e4lpfunktioner \u2013 alla som jag kommer att dokumentera nedan \u2013 och sedan tilldela vilka mallar vi har i mappningsmatrisen som definieras ovan.<\/p>\n<h3>2 Ladda inl\u00e4gg och sidor<\/h3>\n<p>Naturligtvis \u00e4r det f\u00f6rsta vi vill g\u00f6ra att st\u00e4lla in en funktion att anropa som kommer att returnera med hj\u00e4lp av resultaten av fr\u00e5gan:<\/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>Detta returnerar resultatet av fr\u00e5gan. P\u00e5 s\u00e5 s\u00e4tt kan vi avg\u00f6ra om vi beh\u00f6ver g\u00f6ra n\u00e5got ytterligare arbete som vi s\u00e4ger i huvuddraget i f\u00f6reg\u00e5ende steg:<\/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>Om inte, d\u00e5 \u00e4r vi klara. Annars forts\u00e4tter vi s\u00e5 klart.<\/p>\n<h3>3 H\u00e4mta mall-ID fr\u00e5n tredje part<\/h3>\n<p>D\u00e4refter verkar id\u00e9n att tilldela mallar \u2013 som visas i koden ovan \u2013 enkel nog men det finns n\u00e5gra saker vi m\u00e5ste g\u00f6ra f\u00f6rst:<\/p>\n<ol>\n<li>g\u00e5 igenom inl\u00e4ggen,<\/li>\n<li>ta tag i mallens tredje parts ID,<\/li>\n<li>ta tag i tredje parts mallnamn,<\/li>\n<li>tilldela mallen fr\u00e5n mappningskonstanten som definierats tidigare i klassen.<\/li>\n<\/ol>\n<p>Den initiala iterationen av funktionen kan se <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-03-assign-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut s\u00e5 h\u00e4r<\/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>Men som du kan se finns det fortfarande hj\u00e4lpfunktioner som beh\u00f6ver definitioner. Saker som m\u00f6jligheten att f\u00e5 mall-ID, mallnamn och slutligen tilldela mallen.<\/p>\n<p>Observera dock att om n\u00e5gon av hj\u00e4lpfunktionerna inte returnerar ett anv\u00e4ndbart v\u00e4rde, s\u00e5 forts\u00e4tter vi med loopen. Detta \u00e4r n\u00f6dv\u00e4ndigt om inte av n\u00e5gon annan anledning \u00e4n f\u00f6r att se till att vi inte f\u00f6rs\u00f6ker kartl\u00e4gga mallar som inte finns (men jag tycker att det ocks\u00e5 g\u00f6r det lite l\u00e4ttare att l\u00e4sa).<\/p>\n<h3>4 Hitta filen som mall-ID mappar till<\/h3>\n<p>D\u00e4refter kan en liten funktion anv\u00e4ndas f\u00f6r att titta p\u00e5 tredje parts mall-ID och avg\u00f6ra om vi kan mappa detta v\u00e4rde till sidorna som finns <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-04-get-template-id-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">i v\u00e5r databas<\/a>.<\/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>Om det inte kan, d\u00e5 kan vi returnera en tom str\u00e4ng och sedan ha funktionen som anropade just denna kontroll f\u00f6r att se om det \u00e4r v\u00e4rt att forts\u00e4tta med den loop vi har definierat.<\/p>\n<h3>5 Ta tag i mallens namn<\/h3>\n<p>Om vi \u200b\u200bantar att vi har ett giltigt inl\u00e4ggs-ID, m\u00e5ste vi nu <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-05-get-template-name-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e4mta mallens namn<\/a> fr\u00e5n mappningsmatrisen som definierats tidigare i inl\u00e4gget:<\/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>H\u00e4r \u00e4r grejen: Antingen kommer vi att returnera namnet p\u00e5 mallen, eller s\u00e5 kommer vi att returnera ett nollv\u00e4rde. \u00c5terigen, detta \u00e4r s\u00e5 att vi kan avg\u00f6ra om vi beh\u00f6ver forts\u00e4tta med slingan att tilldela mallar eller inte.<\/p>\n<h3>6 Tilldela mallen<\/h3>\n<p>Slutligen kan vi ta tag i mallens ID som tillhandah\u00e5lls av tredje part och anv\u00e4nda det f\u00f6r att <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-06-assign-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mappa till filen<\/a> vi har inkluderat i v\u00e5rt arbete som beskrivits tidigare i inl\u00e4gget:<\/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>Och det \u00e4r i slut\u00e4ndan s\u00e5 du kan skapa mycket mindre, l\u00e4ttare att l\u00e4sa och enklare att anv\u00e4nda kod och funktioner n\u00e4r du arbetar med lite mer komplicerade fr\u00e5gor.<\/p>\n<h2>Och d\u00e4rmed l\u00e4sbarhetsf\u00f6rb\u00e4ttringar<\/h2>\n<p>F\u00f6r de som \u00e4r vana vid att skriva l\u00e5nga l\u00e4smetoder eller g\u00f6ra saker p\u00e5 det s\u00e4tt som mycket av tutorials p\u00e5 webben visar hur man g\u00f6r saker i WordPress, kan det h\u00e4r se ut som mycket meningsl\u00f6s kod.<\/p>\n<p>Men t\u00e4nk p\u00e5 detta:<\/p>\n<ol>\n<li>L\u00e4ngre metoder \u00e4r sv\u00e5rare att l\u00e4sa,<\/li>\n<li>De kan vara sv\u00e5rare att fels\u00f6ka,<\/li>\n<li>Och de bryter inte ner problemet i mer hanterbara bitar.<\/li>\n<\/ol>\n<p>Visst, jag skulle \u00e4lska att dela upp det h\u00e4r i \u00e4nnu fler klasser med deras ansvar, och jag tror att det kan g\u00f6ras, men med tanke p\u00e5 WP_Querys natur skulle det kr\u00e4va lite mer arbete.<\/p>\n<p>S\u00e5 jag har f\u00f6rs\u00f6kt sl\u00e5 s\u00e5 mycket mellanv\u00e4g som m\u00f6jligt.<\/p>\n<p>Om du arbetar med \u00e4nnu lite mer avancerad anv\u00e4ndning av WP_Query, rekommenderar jag att du \u00e5tminstone \u00f6verv\u00e4ger att dela upp det i mindre bitar.<\/p>\n<p>Detta hj\u00e4lper till att ta hand om l\u00e4sbarheten, eventuellt underh\u00e5llsm\u00f6jligheter, och att skriva renare kod snarare \u00e4n en l\u00e5ng metod med f\u00f6r m\u00e5nga villkor och beroende av en m\u00e4ngd andra data.<\/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>Att arbeta med WP_Query-l\u00e4sbarheten kan vara utmanande. H\u00e4r \u00e4r ett exempel p\u00e5 hur jag bryter ner anv\u00e4ndningen av API:t i en del av mitt eget arbete.<\/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":[901,724,868],"tags":[1173],"class_list":["post-228890","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228890","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=228890"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228890\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/220946"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}