{"id":12981,"date":"2026-09-12T18:25:00","date_gmt":"2026-09-12T16:25:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=12981"},"modified":"2026-09-09T17:26:02","modified_gmt":"2026-09-09T15:26:02","slug":"tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/","title":{"rendered":"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii"},"content":{"rendered":"<p>Filtr napisany jako <code>meta_query<\/code> wygl\u0105da w PHP niewinnie. Trzy warunki, ka\u017cdy jako tablica, a mi\u0119dzy nimi powi\u0105zanie. To, co dociera do MySQL, jest czym\u015b zupe\u0142nie innym: trzy dodatkowe z\u0142\u0105czenia na tabeli zawieraj\u0105cej ka\u017cde pole dodatkowe ka\u017cdego wpisu w instalacji, kt\u00f3rej rozstrzygaj\u0105ca kolumna nie ma \u017cadnego indeksu.<\/p>\n<p>Poni\u017csza przebudowa ma cztery kroki &#8211; odczyta\u0107 SQL, zmierzy\u0107 go, przenie\u015b\u0107 filtr do taksonomii, jednorazowo przenie\u015b\u0107 warto\u015bci. Op\u0142aca si\u0119 dok\u0142adnie dla jednego rodzaju pola, a ostatni rozdzia\u0142 m\u00f3wi, dla kt\u00f3rego.<\/p>\n<figure class=\"lw-diagram\">\n<img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/metaquery-umbauen-pl.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Por\u00f3wnanie dw\u00f3ch \u0142a\u0144cuch\u00f3w z\u0142\u0105cze\u0144: u g\u00f3ry trzy z\u0142\u0105czenia postmeta z oko\u0142o 480 000 przegl\u0105danych wierszy, u do\u0142u dwa z\u0142\u0105czenia taksonomii z oko\u0142o 2 100 przegl\u0105danych wierszy\"><figcaption>Ten sam filtr, dwa modele danych. Zmienia si\u0119 nie liczba z\u0142\u0105cze\u0144, lecz to, co MySQL potrafi osi\u0105gn\u0105\u0107 przez indeks.<\/figcaption><\/figure>\n<h2>Co WP_Query buduje z tablicy<\/h2>\n<p>Zapytanie z trzema warunkami na polach dodatkowych pisze si\u0119 kr\u00f3tko, a wykonuje d\u0142ugo.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>$q = new WP_Query( [\n    'post_type'  =&gt; 'produkt',\n    'meta_query' =&gt; [\n        'relation' =&gt; 'AND',\n        [ 'key' =&gt; 'farbe',     'value' =&gt; 'blau' ],\n        [ 'key' =&gt; 'material',  'value' =&gt; 'eiche' ],\n        [ 'key' =&gt; 'verfuegbar','value' =&gt; '1' ],\n    ],\n] );<\/code><\/pre>\n<p>Ka\u017cda klauzula staje si\u0119 osobnym z\u0142\u0105czeniem z w\u0142asnym aliasem, bo pojedynczy wiersz <code>wp_postmeta<\/code> niesie zawsze tylko jeden klucz. Trzy warunki potrzebuj\u0105 wi\u0119c trzech kopii tabeli.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>SELECT wp_posts.ID FROM wp_posts\n  INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id\n  INNER JOIN wp_postmeta AS mt1 ON wp_posts.ID = mt1.post_id\n  INNER JOIN wp_postmeta AS mt2 ON wp_posts.ID = mt2.post_id\nWHERE wp_posts.post_type = 'produkt'\n  AND ( wp_postmeta.meta_key = 'farbe'      AND wp_postmeta.meta_value = 'blau' )\n  AND ( mt1.meta_key        = 'material'    AND mt1.meta_value        = 'eiche' )\n  AND ( mt2.meta_key        = 'verfuegbar'  AND mt2.meta_value        = '1' )\nGROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC<\/code><\/pre>\n<p>Rozstrzygaj\u0105ce stoi w ostatniej linii ka\u017cdego warunku. <code>wp_postmeta<\/code> przynosi indeks na <code>post_id<\/code> oraz na <code>meta_key<\/code>, ale \u017cadnego na <code>meta_value<\/code> &#8211; kolumna jest typu <code>LONGTEXT<\/code> i nie da si\u0119 jej zaindeksowa\u0107 w ca\u0142o\u015bci. MySQL znajduje wi\u0119c szybko wszystkie wiersze z kluczem <code>farbe<\/code>, a potem musi obejrze\u0107 ka\u017cdy z nich, aby sprawdzi\u0107 warto\u015b\u0107 <code>blau<\/code>.<\/p>\n<p>Jak drogie to b\u0119dzie, zale\u017cy od liczby, kt\u00f3rej nikt nie obserwuje: ile wierszy dzieli ten sam klucz. Pole obecne przy ka\u017cdym produkcie ma tyle wierszy, ile jest produkt\u00f3w &#8211; a trzy takie pola mno\u017c\u0105 si\u0119 w z\u0142\u0105czeniu.<\/p>\n<h2>Znalezienie zapytania zamiast zgadywania<\/h2>\n<p>Zanim cokolwiek zostanie przebudowane, zapytanie musi le\u017ce\u0107 na stole. Dwie linie w <code>wp-config.php<\/code> ka\u017c\u0105 WordPressowi zapisywa\u0107 ka\u017cd\u0105 wys\u0142an\u0105 instrukcj\u0119.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>define( 'SAVEQUERIES', true );<\/code><\/pre>\n<p>Potem da si\u0119 wypisa\u0107 najwolniejsze instrukcje jednego wywo\u0142ania strony &#8211; wraz ze \u015bcie\u017ck\u0105 wywo\u0142a\u0144, kt\u00f3ra je stworzy\u0142a, a to zwykle ciekawsza po\u0142owa.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>add_action( 'shutdown', function () {\n    global $wpdb;\n    if ( ! defined( 'SAVEQUERIES' ) || ! SAVEQUERIES ) { return; }\n    $langsam = array_filter( $wpdb-&gt;queries, fn( $q ) =&gt; $q[1] &gt; 0.05 );\n    usort( $langsam, fn( $a, $b ) =&gt; $b[1] &lt;=&gt; $a[1] );\n    foreach ( array_slice( $langsam, 0, 5 ) as $q ) {\n        error_log( sprintf( \"%.3f s  %s\\n   %s\", $q[1], $q[2], substr( $q[0], 0, 400 ) ) );\n    }\n} );<\/code><\/pre>\n<p>Na dzia\u0142aj\u0105cej witrynie t\u0119 sam\u0105 informacj\u0119 daje dziennik wolnych zapyta\u0144, ca\u0142kiem bez ingerencji w kod &#8211; i to lepsze \u017ar\u00f3d\u0142o, bo obejmuje tak\u017ce wywo\u0142ania, kt\u00f3rych nikt nie obserwuje.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>SET GLOBAL slow_query_log = 'ON';\nSET GLOBAL long_query_time = 0.2;\nSET GLOBAL log_queries_not_using_indexes = 'ON';<\/code><\/pre>\n<h2>Odczyt wyniku EXPLAIN<\/h2>\n<p>Gdy instrukcja jest ju\u017c znana, jedno polecenie m\u00f3wi, co MySQL zamierza z ni\u0105 zrobi\u0107.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>EXPLAIN SELECT wp_posts.ID FROM wp_posts\n  INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id\n  ...<\/code><\/pre>\n<p>Wynik nios\u0105 trzy kolumny. <code>rows<\/code> szacuje, ile wierszy zostaje obejrzanych w ka\u017cdej tabeli, a iloczyn po wszystkich tabelach to z grubsza nak\u0142ad pracy. <code>key<\/code> podaje u\u017cyty indeks &#8211; tutaj <code>meta_key<\/code>, nigdy <code>meta_value<\/code>. A w <code>Extra<\/code> stoj\u0105 dwie uwagi warte reakcji: <code>Using temporary<\/code> i <code>Using filesort<\/code>.<\/p>\n<p>Druga z nich ma w\u0142asn\u0105 przyczyn\u0119. Sortowanie po polu dodatkowym zamienia sortowanie w por\u00f3wnanie tekstu na kolumnie bez indeksu &#8211; dlatego dodane <code>'orderby' =&gt; 'meta_value_num'<\/code> kosztuje cz\u0119sto wi\u0119cej ni\u017c wszystkie trzy filtry razem.<\/p>\n<table style=\"width:100%;border-collapse:collapse\">\n<thead>\n<tr>\n<th style=\"white-space:nowrap;vertical-align:top\">Obserwacja<\/th>\n<th style=\"vertical-align:top\">Znaczenie<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\">key = meta_key<\/td>\n<td>Klucz zostaje znaleziony przez indeks, warto\u015b\u0107 nie<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\">rows w dziesi\u0105tkach tysi\u0119cy<\/td>\n<td>Pole wisi przy niemal ka\u017cdym wpisie &#8211; filtr niczego nie zaw\u0119\u017ca<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\">Using filesort<\/td>\n<td>Sortowanie nast\u0119puje po z\u0142\u0105czeniu, na ca\u0142ym wyniku<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\">Using temporary<\/td>\n<td>GROUP BY wymaga tabeli tymczasowej, zwykle z powodu wielu z\u0142\u0105cze\u0144<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Przeniesienie filtra do taksonomii<\/h2>\n<p>To, \u017ce taksonomia jest szybsza, nie bierze si\u0119 z jakiej\u015b szczeg\u00f3lnej przemy\u015blno\u015bci WordPressa. Bierze si\u0119 st\u0105d, \u017ce <code>wp_term_relationships<\/code> przechowuje w wierszu dwie liczby ca\u0142kowite i ma klucz g\u0142\u00f3wny w\u0142a\u015bnie po tych dw\u00f3ch kolumnach &#8211; z\u0142\u0105czenie biegnie wi\u0119c z obu stron przez indeks.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>add_action( 'init', function () {\n    register_taxonomy( 'farbe', 'produkt', [\n        'hierarchical'      =&gt; false,\n        'public'            =&gt; false,\n        'show_ui'           =&gt; true,\n        'show_admin_column' =&gt; true,\n        'query_var'         =&gt; false,\n        'rewrite'           =&gt; false,\n    ] );\n} );<\/code><\/pre>\n<p>Dwa ustawienia zas\u0142uguj\u0105 na chwil\u0119 uwagi. <code>public =&gt; false<\/code> trzyma strony archiwum i adresy poza witryn\u0105, a w\u0142a\u015bnie tego chce czysta cecha filtruj\u0105ca. A <code>show_admin_column<\/code> nic nie kosztuje i pokazuje warto\u015bci na li\u015bcie wpis\u00f3w &#8211; tam nieudane przeniesienie rzuca si\u0119 w oczy najwcze\u015bniej.<\/p>\n<p>Zapytanie po zmianie opisuje ten sam filtr innym s\u0142ownictwem.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>$q = new WP_Query( [\n    'post_type' =&gt; 'produkt',\n    'tax_query' =&gt; [\n        'relation' =&gt; 'AND',\n        [ 'taxonomy' =&gt; 'farbe',    'field' =&gt; 'slug', 'terms' =&gt; 'blau' ],\n        [ 'taxonomy' =&gt; 'material', 'field' =&gt; 'slug', 'terms' =&gt; 'eiche' ],\n    ],\n] );<\/code><\/pre>\n<p>S\u0142owo o trzecim warunku pierwotnego zapytania: pole typu tak-nie, jak <code>verfuegbar<\/code>, r\u00f3wnie\u017c nie nale\u017cy do taksonomii. Dwa terminy na dziesi\u0119\u0107 tysi\u0119cy produkt\u00f3w oznaczaj\u0105, \u017ce jeden termin niesie dziewi\u0119\u0107 tysi\u0119cy przypisa\u0144, a indeks na kolumnie o dw\u00f3ch r\u00f3\u017cnych warto\u015bciach jest niemal bezwarto\u015bciowy. Taki znacznik lepiej mie\u015bci si\u0119 w <code>post_status<\/code>, w osobnej taksonomii stan\u00f3w obok innych stan\u00f3w &#8211; albo zostaje w postmeta jako jedyna pozosta\u0142a klauzula: jedno z\u0142\u0105czenie nie jest problemem, trzy s\u0105.<\/p>\n<h2>Jednorazowe przeniesienie istniej\u0105cych warto\u015bci<\/h2>\n<p>Taksonomia istnieje, wpisy nic o niej jeszcze nie wiedz\u0105. Jednorazowy przebieg przez WP-CLI przenosi warto\u015bci i daje si\u0119 wcze\u015bniej sprawdzi\u0107.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>wp eval '\n$ids = get_posts( [ \"post_type\" =&gt; \"produkt\", \"posts_per_page\" =&gt; -1,\n                    \"fields\" =&gt; \"ids\", \"post_status\" =&gt; \"any\" ] );\n$n = 0;\nforeach ( $ids as $id ) {\n    $wert = get_post_meta( $id, \"farbe\", true );\n    if ( $wert === \"\" ) { continue; }\n    wp_set_object_terms( $id, sanitize_title( $wert ), \"farbe\", false );\n    $n++;\n}\necho \"$n wpisow\\n\";\n'<\/code><\/pre>\n<p>O powtarzalno\u015bci tego przebiegu rozstrzygaj\u0105 trzy szczeg\u00f3\u0142y. <code>post_status =&gt; any<\/code> obejmuje tak\u017ce szkice i wpisy zaplanowane &#8211; w\u0142a\u015bnie te, kt\u00f3rych brak ujawnia si\u0119 p\u00f3\u017aniej. <code>false<\/code> w <code>wp_set_object_terms<\/code> zast\u0119puje przypisanie, zamiast je uzupe\u0142nia\u0107, dzi\u0119ki czemu drugi przebieg daje ten sam stan, a nie rosn\u0105c\u0105 list\u0119. A <code>sanitize_title<\/code> sprawia, \u017ce termin zostaje znaleziony po slugu, wi\u0119c z <code>Blau<\/code> i <code>blau<\/code> powstaje jeden termin, a nie dwa.<\/p>\n<p>Wiersze postmeta najlepiej zostawi\u0107 jeszcze na jaki\u015b czas. Gdy nowa droga podzia\u0142a kilka tygodni, znikn\u0105 jedn\u0105 instrukcj\u0105 &#8211; i dopiero wtedy, bo ten krok nie ma drogi powrotnej.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>wp post meta delete --all --keys=farbe --dry-run<\/code><\/pre>\n<h2>Kiedy taksonomia jest z\u0142\u0105 odpowiedzi\u0105<\/h2>\n<p>Przebudowa op\u0142aca si\u0119 przy polach o niewielu r\u00f3\u017cnych warto\u015bciach, s\u0142u\u017c\u0105cych jako filtr. Dla trzech innych przypadk\u00f3w jest chwytem b\u0142\u0119dnym, a ka\u017cdy z nich ma w\u0142asn\u0105 lepsz\u0105 odpowied\u017a.<\/p>\n<p>Najwyra\u017aniejsze s\u0105 zakresy liczbowe. Cena, data, waga &#8211; wszystko, o co pyta si\u0119 przez <code>BETWEEN<\/code> albo por\u00f3wnanie, nie ma godnych uwagi termin\u00f3w, a taksonomia z o\u015bmioma tysi\u0105cami termin\u00f3w jest gorsza od zast\u0105pionego postmeta. Takie pole nale\u017cy do w\u0142asnej kolumny, we w\u0142asnej tabeli z indeksem po dok\u0142adnie tej odpytywanej kombinacji.<\/p>\n<p>Drugim przypadkiem jest wyszukiwanie pe\u0142notekstowe. Terminy trafiaj\u0105 dok\u0142adnie albo wcale; szukanie cz\u0119\u015bci s\u0142owa wymaga indeksu <code>FULLTEXT<\/code> albo osobnego indeksu wyszukiwania, a \u017cadne z nich nie jest taksonomi\u0105.<\/p>\n<p>Trzecim przypadkiem s\u0105 warto\u015bci wisz\u0105ce tylko przy garstce wpis\u00f3w. Pole przy dwudziestu z czterdziestu tysi\u0119cy produkt\u00f3w jest wystarczaj\u0105co rozr\u00f3\u017cniaj\u0105ce ju\u017c przez sam <code>meta_key<\/code>, a zapytanie dzia\u0142a szybko bez \u017cadnej zmiany. Narz\u0119dziem tej decyzji jest jedno zliczenie, wykonane przed ka\u017cd\u0105 przebudow\u0105.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>SELECT meta_key, COUNT(*) AS zeilen, COUNT(DISTINCT meta_value) AS werte\nFROM wp_postmeta GROUP BY meta_key ORDER BY zeilen DESC LIMIT 20;<\/code><\/pre>\n<p>Wiele wierszy i ma\u0142o r\u00f3\u017cnych warto\u015bci &#8211; to przypadek, dla kt\u00f3rego taksonomia powsta\u0142a. Wiele wierszy i prawie tyle samo r\u00f3\u017cnych warto\u015bci domaga si\u0119 kolumny. Ma\u0142o wierszy oznacza, \u017ce nie musi si\u0119 dzia\u0107 nic.<\/p>\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener noreferrer\">WP_Query reference<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Trzy klauzule meta_query zamieniaj\u0105 si\u0119 w trzy z\u0142\u0105czenia INNER JOIN na tabeli, kt\u00f3rej por\u00f3wnywana kolumna nie ma indeksu. Zmierzenie tego i przeniesienie filtra do taksonomii kosztuje jedno popo\u0142udnie, a z sekundy robi kilkana\u015bcie milisekund.<\/p>\n","protected":false},"author":1,"featured_media":13543,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92646],"tags":[92262,92280,92238,92283,92286],"class_list":["post-12981","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl-wordpress-plugins-tricks-pl","tag-mysql-pl","tag-php-pl","tag-tutorial-pl","tag-web-performance-pl","tag-wordpress-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii - Lukas Wojcik - Blog<\/title>\n<meta name=\"description\" content=\"Odczyt SQL budowanego przez WP_Query, pomiar przez EXPLAIN i przeniesienie filtra z wp_postmeta do taksonomii, kt\u00f3r\u0105 MySQL potrafi indeksowa\u0107.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Odczyt SQL budowanego przez WP_Query, pomiar przez EXPLAIN i przeniesienie filtra z wp_postmeta do taksonomii, kt\u00f3r\u0105 MySQL potrafi indeksowa\u0107.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-12T16:25:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-12981-tutorial-jak-znalezc-wolne-meta-quer-r.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"luky\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"luky\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/\"},\"author\":{\"name\":\"luky\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii\",\"datePublished\":\"2026-09-12T16:25:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/\"},\"wordCount\":1053,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-12981-tutorial-jak-znalezc-wolne-meta-quer-r.png\",\"keywords\":[\"MySQL\",\"PHP\",\"Tutorial\",\"Web Performance\",\"WordPress\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/\",\"name\":\"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-12981-tutorial-jak-znalezc-wolne-meta-quer-r.png\",\"datePublished\":\"2026-09-12T16:25:00+00:00\",\"description\":\"Odczyt SQL budowanego przez WP_Query, pomiar przez EXPLAIN i przeniesienie filtra z wp_postmeta do taksonomii, kt\u00f3r\u0105 MySQL potrafi indeksowa\u0107.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-12981-tutorial-jak-znalezc-wolne-meta-quer-r.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-12981-tutorial-jak-znalezc-wolne-meta-quer-r.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/wordpress-plugins-tricks-pl\\\/tutorials-pl-wordpress-plugins-tricks-pl\\\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"],\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/author\\\/luky\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii - Lukas Wojcik - Blog","description":"Odczyt SQL budowanego przez WP_Query, pomiar przez EXPLAIN i przeniesienie filtra z wp_postmeta do taksonomii, kt\u00f3r\u0105 MySQL potrafi indeksowa\u0107.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii - Lukas Wojcik - Blog","og_description":"Odczyt SQL budowanego przez WP_Query, pomiar przez EXPLAIN i przeniesienie filtra z wp_postmeta do taksonomii, kt\u00f3r\u0105 MySQL potrafi indeksowa\u0107.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-12T16:25:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-12981-tutorial-jak-znalezc-wolne-meta-quer-r.png","type":"image\/png"}],"author":"luky","twitter_card":"summary_large_image","twitter_misc":{"Written by":"luky","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/"},"author":{"name":"luky","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii","datePublished":"2026-09-12T16:25:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/"},"wordCount":1053,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-12981-tutorial-jak-znalezc-wolne-meta-quer-r.png","keywords":["MySQL","PHP","Tutorial","Web Performance","WordPress"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/","name":"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-12981-tutorial-jak-znalezc-wolne-meta-quer-r.png","datePublished":"2026-09-12T16:25:00+00:00","description":"Odczyt SQL budowanego przez WP_Query, pomiar przez EXPLAIN i przeniesienie filtra z wp_postmeta do taksonomii, kt\u00f3r\u0105 MySQL potrafi indeksowa\u0107.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-12981-tutorial-jak-znalezc-wolne-meta-quer-r.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-12981-tutorial-jak-znalezc-wolne-meta-quer-r.png","width":1200,"height":630,"caption":"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/wordpress-plugins-tricks-pl\/tutorials-pl-wordpress-plugins-tricks-pl\/tutorial-jak-znalezc-wolne-meta_query-i-przepisac-je-na-filtr-taksonomii\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Jak znale\u017a\u0107 wolne meta_query i przepisa\u0107 je na filtr taksonomii"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"],"url":"https:\/\/www.lukaswojcik.com\/blog\/author\/luky\/"}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/12981","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=12981"}],"version-history":[{"count":2,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/12981\/revisions"}],"predecessor-version":[{"id":17680,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/12981\/revisions\/17680"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13543"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=12981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=12981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=12981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}