{"id":231216,"date":"2023-01-01T16:48:00","date_gmt":"2023-01-01T13:48:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231216"},"modified":"2022-12-25T21:57:27","modified_gmt":"2022-12-25T18:57:27","slug":"wyszukaj-metadane-postow-w-obszarze-administracyjnym-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/wyszukaj-metadane-postow-w-obszarze-administracyjnym-wordpress\/","title":{"rendered":"Wyszukaj metadane post\u00f3w w obszarze administracyjnym WordPress"},"content":{"rendered":"\n<p>Po d\u0142u\u017cszym czasie pracy z WordPressem prawdopodobnie w pewnym stopniu pracowa\u0142e\u015b z metadanymi posta. By\u0107 mo\u017ce po prostu czyta\u0142e\u015b metadane z bazy danych, a mo\u017ce zar\u00f3wno zapisywa\u0142e\u015b, jak i czyta\u0142e\u015b z tabeli bazy danych.<\/p>\n<p>Mo\u017ce to by\u0107 naprawd\u0119 pot\u0119\u017cny interfejs API, gdy potrzebujesz powi\u0105za\u0107 okre\u015blone informacje z twoimi postami (lub, je\u015bli jeste\u015b jeszcze bardziej abstrakcyjny, z twoimi modelami).<\/p>\n<p>To powiedziawszy, co si\u0119 dzieje, gdy chcesz uwzgl\u0119dni\u0107 informacje z tabeli metadanych, ale nie masz wygody wtyczek, takich jak <a href=\"https:\/\/searchwp.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SearchWP<\/a> lub <a href=\"https:\/\/www.relevanssi.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Relevanssi<\/a>? <\/p>\n<p>Ponadto za\u0142\u00f3\u017cmy, \u017ce przypadek u\u017cycia dotyczy tylko administrator\u00f3w i dotyczy tylko obszaru administracyjnego WordPress. Oznacza to, \u017ce chcesz przeszukiwa\u0107 swoje posty z poziomu ekranu <strong>Wszystkie posty<\/strong>, ale chcesz r\u00f3wnie\u017c uwzgl\u0119dni\u0107 metadane post\u00f3w w kryteriach wyszukiwania.<\/p>\n<p>Co wtedy?<\/p>\n<h2>Wyszukaj metadane posta<\/h2>\n<p>Po wyj\u0119ciu z pude\u0142ka, za ka\u017cdym razem, gdy szukasz post\u00f3w w obszarze administracyjnym WordPress, wyszuka on fraz\u0119 w tytule posta, fragmencie posta i tre\u015bci posta, a nast\u0119pnie zwr\u00f3ci te wyniki.<\/p>\n<p>Aby wi\u0119c rozszerzy\u0107 wyszukiwanie o metadane wpisu, musimy zaktualizowa\u0107 uruchomione zapytanie tak, aby zawiera\u0142o tabele metadanych wpisu. Ale jest w tym co\u015b wi\u0119cej. W szczeg\u00f3lno\u015bci, aby uzyska\u0107 najwi\u0119ksz\u0105 elastyczno\u015b\u0107 i najlepsze wra\u017cenia u\u017cytkownika, b\u0119dziesz chcia\u0142:<\/p>\n<ul>\n<li>wstawiaj fragmenty frazy, aby nie szuka\u0142o czego\u015b dos\u0142ownie w artykule,<\/li>\n<li>i oczywi\u015bcie prawid\u0142owo obs\u0142u\u017cy\u0107 przypadek, w kt\u00f3rym nie wprowadzono \u017cadnego has\u0142a wyszukiwania, aby ekran <strong>Wszystkie posty<\/strong> nadal m\u00f3g\u0142 by\u0107 wy\u015bwietlany w standardowym formacie.<\/li>\n<\/ul>\n<p>Oznacza to, \u017ce nie tylko musimy zmodyfikowa\u0107 zapytanie wyszukiwania, aby zawiera\u0142o klucz meta i warto\u015b\u0107 meta, ale tak\u017ce musimy odpowiednio zmieni\u0107 znaczenie ca\u0142ych fraz, aby m\u00f3c u\u017cy\u0107 <code>LIKE<\/code>operacji zamiast <code>IN<\/code>operacji lub <code>=<\/code>operacji.<\/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=\"Wyszukaj metadane post\u00f3w w obszarze administracyjnym WordPress\" ><\/a><\/p>\n<p>Niekt\u00f3re z rzeczy, kt\u00f3re warto wiedzie\u0107 przed przeczytaniem reszty tego artyku\u0142u, to:<\/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>The <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/posts_where\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">posts_where<\/a> haczyk<\/li>\n<li>Hak <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/pre_get_posts\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts<\/a> _<\/li>\n<li>Wyra\u017cenia regularne z <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>Funkcje pomocnicze WordPress, a mianowicie <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>Ostatecznie b\u0119dziemy potrzebowa\u0107 dw\u00f3ch hook\u00f3w z dwoma niestandardowymi funkcjami. A poniewa\u017c nie mog\u0119 poda\u0107 pe\u0142nego przyk\u0142adu tego, jak to mo\u017ce wygl\u0105da\u0107 w twoim przypadku u\u017cycia, kod musi by\u0107 nieco uog\u00f3lniony.<\/p>\n<h3>Pod\u0142\u0105czanie do wyszukiwania<\/h3>\n<p>W poni\u017cszym skr\u00f3cie zobaczysz trzy rzeczy:<\/p>\n<ol>\n<li>Weryfikacja, \u017ce \u200b\u200bu\u017cytkownik znajduje si\u0119 w obszarze administracyjnym i znajduje si\u0119 na stronie edycji.<\/li>\n<li>U\u017cytkownik wprowadzi\u0142 wyszukiwanie.<\/li>\n<li>Wyszukiwana fraza zosta\u0142a przekonwertowana na tablic\u0119, zmieniona i dodana do w\u0142a\u015bciwo\u015bci meta zapytania wyst\u0105pienia 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\">Zobacz poni\u017cej<\/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>Zak\u0142adaj\u0105c, \u017ce wszystkie powy\u017csze s\u0105 prawdziwe, spowoduje to zaktualizowanie zapytania uruchomionego w bazie danych WordPress przed wyrenderowaniem nast\u0119pnej strony, tak aby wyniki zawiera\u0142y informacje o metadanych.<\/p>\n<h3>Aktualizacja klauzuli WHERE<\/h3>\n<p>Zanim jednak sko\u0144czymy, musimy r\u00f3wnie\u017c upewni\u0107 si\u0119, \u017ce zaktualizowali\u015bmy uruchomione zapytanie.<\/p>\n<p>Domy\u015blnie zapytanie jest budowane przy u\u017cyciu <code>AND<\/code>operacji, co uniemo\u017cliwia nam poprawne przegl\u0105danie tytu\u0142\u00f3w post\u00f3w, fragment\u00f3w, tre\u015bci i metadanych; jednak zapytanie musi zosta\u0107 zaktualizowane, aby u\u017cywa\u0142o <code>OR<\/code>operacji.<\/p>\n<p>Dos\u0142ownie oznacza to, \u017ce b\u0119dzie wygl\u0105da\u0107 w tytule, tre\u015bci, fragmencie lub metadanych.<\/p>\n<p>Zdecydowa\u0142em si\u0119 u\u017cy\u0107 wyra\u017cenia regularnego w mojej implementacji, ale Twoja implementacja mo\u017ce dzia\u0142a\u0107 z zast\u0119powaniem podci\u0105g\u00f3w. W zwi\u0105zku z tym jest troch\u0119 skomentowane, aby <a href=\"https:\/\/gist.github.com\/tommcfarlin\/4f2fa607bf002f52a7a8d1e08f75d86a#file-01-posts-where-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zapewni\u0107 najwi\u0119ksz\u0105 elastyczno\u015b\u0107<\/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>To aktualizuje <code>WHERE<\/code>klauzul\u0119, kt\u00f3ra jest uruchamiana w celu zako\u0144czenia pracy ustawionej w pocz\u0105tkowej cz\u0119\u015bci artyku\u0142u, w kt\u00f3rej dodajemy metadane.<\/p>\n<h2>S\u0105 inne sposoby<\/h2>\n<p>Zwr\u00f3\u0107 uwag\u0119, \u017ce istnieje kilka niezwykle elastycznych sposob\u00f3w pracy z WP_Query, aby uzyska\u0107 potrzebne wyniki. Twoja implementacja b\u0119dzie si\u0119 r\u00f3\u017cni\u0107 w zale\u017cno\u015bci od tego, co robisz.<\/p>\n<p>Rozwa\u017c wi\u0119c ten jeden z wielu sposob\u00f3w, kt\u00f3re mo\u017cna wykorzysta\u0107; wiedz jednak, \u017ce je\u015bli masz:<\/p>\n<ol>\n<li>jeden klucz,<\/li>\n<li>warto\u015b\u0107 (lub warto\u015b\u0107, kt\u00f3r\u0105 mo\u017cna podzieli\u0107 na tablic\u0119),<\/li>\n<li>i chcesz wyszukiwa\u0107 metadane obok tradycyjnej tre\u015bci postu<\/li>\n<\/ol>\n<p>Wtedy to zadzia\u0142a.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Poni\u017cej opisano, jak rozszerzy\u0107 wyszukiwanie o metadane wpisu. Musimy zaktualizowa\u0107 uruchomione zapytanie, aby zawiera\u0142o tabele metadanych wpisu.<\/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":[721,919,897,805,836,845,866],"tags":[1169],"class_list":["post-231216","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-kod","category-php-7","category-przewodnik-dla-poczatkujacych","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231216","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=231216"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/231216\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/236453"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=231216"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=231216"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=231216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}