{"id":231265,"date":"2023-01-01T17:00:00","date_gmt":"2023-01-01T14:00:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231265"},"modified":"2022-12-25T21:57:28","modified_gmt":"2022-12-25T18:57:28","slug":"soek-inlaeggsmetadata-i-wordpress-admin-area","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/soek-inlaeggsmetadata-i-wordpress-admin-area\/","title":{"rendered":"S\u00f6k inl\u00e4ggsmetadata i WordPress Admin Area"},"content":{"rendered":"\n<p>Efter att du har arbetat med WordPress under en l\u00e4ngre tid \u00e4r det troligt att du har arbetat med inl\u00e4ggsmetadata i viss kapacitet. Kanske har du helt enkelt l\u00e4st metadata fr\u00e5n databasen, eller kanske har du b\u00e5de skrivit till och l\u00e4st fr\u00e5n databastabellen ocks\u00e5.<\/p>\n<p>Det kan vara ett riktigt kraftfullt API n\u00e4rhelst du beh\u00f6ver associera viss information med dina inl\u00e4gg (eller, om du gillar att abstrahera saker \u00e4nnu mer, till dina modeller).<\/p>\n<p>Som sagt, vad h\u00e4nder n\u00e4r du vill inkludera information fr\u00e5n metadatatabellen men inte har bekv\u00e4mligheten med plugins som <a href=\"https:\/\/searchwp.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SearchWP<\/a> eller <a href=\"https:\/\/www.relevanssi.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Relevanssi<\/a>? <\/p>\n<p>Anta dessutom att anv\u00e4ndningsfallet bara \u00e4r f\u00f6r administrat\u00f6rer och att det bara \u00e4r f\u00f6r administrationsomr\u00e5det f\u00f6r WordPress. Det vill s\u00e4ga att du vill s\u00f6ka i dina inl\u00e4gg fr\u00e5n sk\u00e4rmen <strong>Alla inl\u00e4gg<\/strong> men du vill ocks\u00e5 inkludera inl\u00e4ggets metadata i s\u00f6kkriterierna.<\/p>\n<p>Vad h\u00e4nder d\u00e5?<\/p>\n<h2>S\u00f6k inl\u00e4ggsmetadata<\/h2>\n<p>N\u00e4r du s\u00f6ker efter inl\u00e4gg i WordPress-administrationsomr\u00e5det, kommer den att leta efter en fras i inl\u00e4ggets titel, inl\u00e4ggsutdrag och inl\u00e4ggsinneh\u00e5ll och returnerar sedan dessa resultat.<\/p>\n<p>S\u00e5 f\u00f6r att ut\u00f6ka s\u00f6kningen till att inkludera postmetadata m\u00e5ste vi uppdatera fr\u00e5gan som k\u00f6rs s\u00e5 att den inneh\u00e5ller postmetadatatabellerna. Men det \u00e4r mer \u00e4n s\u00e5. Specifikt, f\u00f6r st\u00f6rsta m\u00f6jliga flexibilitet och b\u00e4sta anv\u00e4ndarupplevelse, vill du:<\/p>\n<ul>\n<li>inkludera delar av en fras s\u00e5 att den inte bara letar efter n\u00e5got ordagrant i artikeln,<\/li>\n<li>och naturligtvis hantera fallet om ingen s\u00f6kterm anges s\u00e5 att sk\u00e4rmen <strong>Alla inl\u00e4gg<\/strong> fortfarande kan ses i sitt standardformat.<\/li>\n<\/ul>\n<p>Det betyder att vi inte bara beh\u00f6ver modifiera s\u00f6kfr\u00e5gan s\u00e5 att den inkluderar en meta-nyckel och ett metav\u00e4rde, utan vi m\u00e5ste undvika hela fraser p\u00e5 r\u00e4tt s\u00e4tt s\u00e5 att vi kan anv\u00e4nda en <code>LIKE<\/code>operation snarare \u00e4n en <code>IN<\/code>operation eller <code>=<\/code>operation.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159257-61e6f01916b5c.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159257-61e6f01916b5c.png\" alt=\"S\u00f6k inl\u00e4ggsmetadata i WordPress Admin Area\" ><\/a><\/p>\n<p>N\u00e5gra av de saker som \u00e4r viktiga att veta innan du l\u00e4ser resten av den h\u00e4r artikeln \u00e4r:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a><\/li>\n<li>Inl\u00e4ggen<em>d\u00e4r krok [<\/em>](<a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/posts_where\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/developer.wordpress.org\/reference\/hooks\/posts_where\/<\/a>)<\/li>\n<li>Pre_get_posts <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/pre_get_posts\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">&#8211;<\/a> kroken<\/li>\n<li>Regulj\u00e4ra uttryck med <a href=\"https:\/\/www.php.net\/manual\/en\/function.preg-replace.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">preg_replace<\/a><\/li>\n<li>WordPress hj\u00e4lpfunktioner, n\u00e4mligen <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/esc_sql\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esc_sql<\/a>.<\/li>\n<\/ul>\n<p>I slut\u00e4ndan kommer vi att beh\u00f6va anv\u00e4nda tv\u00e5 krokar med tv\u00e5 anpassade funktioner. Och eftersom jag inte kan ge ett komplett exempel p\u00e5 hur detta kan se ut i ditt anv\u00e4ndningsfall, m\u00e5ste koden vara lite generaliserad.<\/p>\n<h3>Hakar p\u00e5 S\u00f6k<\/h3>\n<p>I f\u00f6ljande sammanfattning kommer du att se tre saker:<\/p>\n<ol>\n<li>Verifiering att anv\u00e4ndaren \u00e4r p\u00e5 administrationsomr\u00e5det och att de finns p\u00e5 redigeringssidan.<\/li>\n<li>Anv\u00e4ndaren har gjort en s\u00f6kning.<\/li>\n<li>S\u00f6kfrasen har konverterats till en array, escaped och lagts till i meta-fr\u00e5geegenskapen f\u00f6r instansen av WP_Query.<\/li>\n<\/ol>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/4f2fa607bf002f52a7a8d1e08f75d86a#file-00-pre-get-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Se nedan<\/a> :<\/p>\n<pre><code>&lt;?php\nadd_filter('pre_get_posts', function ($query) {\n\n    \/\/ Make sure we're in the admin, an administrator, and on the edit page.\n    if (!is_admin() || !current_user_can('manage_options') || 'edit' !== get_current_screen()-&gt;base) {\n        return;\n    }\n\n    \/\/ Determine if the user is running a search.\n    $search = filter_input(INPUT_GET, 's', FILTER_SANITIZE_STRING);\n    if (empty($search)) {\n        return;\n    }\n\n    $query-&gt;set(\n        'meta_query',\n        [\n            [\n                'key'     =&gt; 'headline_notes',\n                'value'   =&gt; esc_sql(preg_replace('\/s+?\/', '%', $search)), \/\/ For flexible search, make sure to replace all white space with % for LIKE.\n                'compare' =&gt; 'LIKE',\n            ],\n        ]\n    );\n});<\/code><\/pre>\n<p>F\u00f6rutsatt att allt ovan \u00e4r sant kommer detta att uppdatera fr\u00e5gan som k\u00f6rs mot WordPress-databasen innan n\u00e4sta sida renderas s\u00e5 att resultat som inkluderar metadatainformationen.<\/p>\n<h3>Uppdatering av WHERE-klausulen<\/h3>\n<p>Innan vi \u00e4r klara m\u00e5ste vi dock ocks\u00e5 se till att vi har uppdaterat fr\u00e5gan som k\u00f6rs.<\/p>\n<p>Som standard \u00e4r fr\u00e5gan byggd med hj\u00e4lp av en <code>AND<\/code>operation och som hindrar oss fr\u00e5n att titta ordentligt igenom inl\u00e4ggstitlar, utdrag, inneh\u00e5ll och metadata; fr\u00e5gan m\u00e5ste dock uppdateras s\u00e5 att den anv\u00e4nder en <code>OR<\/code>operation.<\/p>\n<p>Helt bokstavligen betyder det att det kommer att se ut i titeln, inneh\u00e5llet, utdraget eller metadata.<\/p>\n<p>Jag har valt att anv\u00e4nda ett regulj\u00e4rt uttryck i min implementering, men din implementering kan fungera med att ers\u00e4tta delstr\u00e4ngar. D\u00e4rf\u00f6r \u00e4r det lite kommenterat f\u00f6r att <a href=\"https:\/\/gist.github.com\/tommcfarlin\/4f2fa607bf002f52a7a8d1e08f75d86a#file-01-posts-where-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ge dig mest flexibilitet<\/a>.<\/p>\n<pre><code>&lt;?php\nadd_filter( 'posts_where', function($where, $query) {\n\n    \/\/ Determine if 'headline_notes' appears in the WHERE clause.\n    $position = strpos($where, 'acme_meta_key');\n    if (false === $position) {\n        return $where;\n    }\n\n    \/\/ Look for the 'AND' clasue and replace it with 'OR' in the WHERE clause.\n    $regularExpress = '\/\/mi'; \/\/ Your regular expression.\n    $replacement = ''; \/\/ Your string to replace.\n\n    return preg_replace(\n        $regularExpression,\n        $replacement,\n        $where\n    );\n}, 10, 2);<\/code><\/pre>\n<p>Detta uppdaterar <code>WHERE<\/code>klausulen som aktiveras f\u00f6r att slutf\u00f6ra arbetsupps\u00e4ttningen i den inledande delen av artikeln d\u00e4r vi l\u00e4gger till metadata.<\/p>\n<h2>Det finns andra s\u00e4tt<\/h2>\n<p>Observera att det finns n\u00e5gra otroligt flexibla s\u00e4tt att arbeta med WP_Query f\u00f6r att f\u00e5 de resultat du beh\u00f6ver. Och din implementering kommer att variera beroende p\u00e5 vad det \u00e4r du g\u00f6r.<\/p>\n<p>S\u00e5 betrakta detta som ett av m\u00e5nga s\u00e4tt som kan anv\u00e4ndas; vet dock att om du har:<\/p>\n<ol>\n<li>en enda nyckel,<\/li>\n<li>ett v\u00e4rde (eller ett v\u00e4rde som kan delas upp i en matris),<\/li>\n<li>och du vill s\u00f6ka efter metadata vid sidan av det traditionella inl\u00e4ggsinneh\u00e5llet<\/li>\n<\/ol>\n<p>D\u00e5 kommer detta att fungera.<\/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>S\u00e5 h\u00e4r ut\u00f6kar du s\u00f6kningen till att inkludera postmetadata, vi m\u00e5ste uppdatera fr\u00e5gan som k\u00f6rs s\u00e5 att den inneh\u00e5ller postmetadatatabellerna.<\/p>\n","protected":false},"author":1,"featured_media":236453,"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-231265","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\/231265","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=231265"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/231265\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236453"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=231265"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=231265"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=231265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}