Запросить все сообщения, в которых отсутствует мета-ключ
-
-
Какую версию WordPress вы используете?What version of WordPress are you using?
- 0
- 2013-01-12
- s_ha_dum
-
Привет,извините за упущение.Я использую v3.5Hi,sorry for the omission. I am using v3.5
- 0
- 2013-01-12
- JordanBel
-
Похоже,что этот тип запроса (с параметром сравнения НЕ СУЩЕСТВУЕТ) был добавлен в 3.5,поэтому,насколько я могу судить,он должен работать как есть.Хотя это было бы легко сделать с помощью специального запроса SELECT ...It seems as though that type of query (with compare set to NOT EXISTS) was added in 3.5, so it should work as it is, as far as I can see. It would be easy to do it via custom SELECT query, though...
- 0
- 2013-01-12
- Tomas Buteler
-
Спасибо,попробую использовать select.Я должен узнать,перед какими таблицами запрашивать и как согласовать запрос :(Thanks I will try using select. I must learn before which tables to query and how to conform the query though :(
- 0
- 2013-01-12
- JordanBel
-
Очень странный.Я не могу обнаружить проблему с этим кодом,а вы используете 3.5+,поэтому я спросил.Вы действительно просматривали базу данных,чтобы убедиться,что ваши данные вставляются так,как вы думаете?Very strange. I can't spot a problem with that code and you are using 3.5+, which is why I asked. Have you actually looked at the database to confirm that your data is being inserted the way you think it is?
- 0
- 2013-01-13
- s_ha_dum
-
Вы пробовали EXISTS?Вы упомянули «EXIST»,но я считаю,что compare принимает только «EXISTS» с буквой «S» на конце.Have you tried 'EXISTS'? You mentioned 'EXIST' but I believe compare only accepts 'EXISTS' with an 'S' on the end.
- 0
- 2013-01-13
- mikegertrudes
-
Привет спасибо.К сожалению,EXISTS тоже не работал.Думаю,я перейду к варианту запроса.Hi, thanks. Unfortunately EXISTS didn't work either. I will go to the query option I think.
- 0
- 2013-01-14
- JordanBel
-
3 ответ
- голосов
-
- 2013-01-16
Я провел еще несколько тестов и,честно говоря,не могу найти причину,по которой это не сработает (если только приведенный выше код не является просто фрагментом,а реальный код не подходит для моих примеров ниже). Однако я обнаружил несколько вещей,которые могут привести вас в правильном направлении.
1) Сам по себе этот мета-запрос является эквивалентом «colors IS NULL»,т.е. он вернет сообщения,для которых этот ключ не задан в таблицеpostmeta. Это тот случай,который показан выше,и он должен был сработать.
'meta_query' => array( array( 'key' => 'colors', 'compare' => 'NOT EXISTS' // this should work... ), )
2) До WordPress 3.9 установка индекса «отношения» к «ИЛИ» изменяла это условие. Он возвращает обратное. Не спрашивайте меня почему. Это особенно важно при выполнении нескольких мета-запросов. Это означает,что изначально невозможно выполнить запрос для сообщений,для которых ключ «цвета» установлен на «синий» (или что-то еще) или вообще не установлен. Приведенный ниже запрос игнорирует первое условие и возвращает только те,которые соответствуют второму условию.
'meta_query' => array( 'relation' => 'OR', array( 'key' => 'colors', 'compare' => 'NOT EXISTS' // doesn't work ), array( 'key' => 'colors', 'value' => 'blue' ) )
3) Однако мы можем обмануть WordPress,заставив его использовать первое условие,если установим «значение». Ему не нужно релевантное значение (насколько я знаю,оно игнорируется),но его необходимо установить ,чтобы условие
NOT EXISTS
имело какое-либо действие. .'meta_query' => array( 'relation' => 'OR', array( 'key' => 'colors', 'compare' => 'NOT EXISTS', // works! 'value' => '' // This is ignored, but is necessary... ), array( 'key' => 'colors', 'value' => 'blue' ) )
Так было до WordPress 3.9. Если вы все еще используете старую версию,это жизнеспособный обходной путь.
I did some more testing with this, and honestly can't find a reason it wouldn't work (unless the code above is just a snippet and the real code fits on my examples below). I did, however, discover a couple of things that might lead you in the right direction.
1) By itself, this meta query is the equivalent of "colors IS NULL", i.e. it'll return the posts which don't have that key set in the postmeta table. This is the case shown above, and it should've worked.
'meta_query' => array( array( 'key' => 'colors', 'compare' => 'NOT EXISTS' // this should work... ), )
2) Prior to WordPress 3.9, establishing the 'relation' index to 'OR' changes this condition. It returns the opposite. Don't ask me why. This is especially important when doing multiple meta queries. That means that is not initially possible to do a query for posts that have 'colors' key set to 'blue' (or whatever) or not set at all. The query below will ignore the first condition and return only those that match the second condition.
'meta_query' => array( 'relation' => 'OR', array( 'key' => 'colors', 'compare' => 'NOT EXISTS' // doesn't work ), array( 'key' => 'colors', 'value' => 'blue' ) )
3) However, we can fool WordPress into using the first condition if we set the 'value'. It doesn't need a relevant value (it's ignored, as far as I know), but it needs to be set in order for the
NOT EXISTS
condition to have any effect.'meta_query' => array( 'relation' => 'OR', array( 'key' => 'colors', 'compare' => 'NOT EXISTS', // works! 'value' => '' // This is ignored, but is necessary... ), array( 'key' => 'colors', 'value' => 'blue' ) )
This was true up until WordPress 3.9. If you're still using an older version, this is a viable workaround.
-
Благодаря!И извините за задержку.В итоге я использовал запрос,но я буду тестировать ваше решение в следующие часы,чтобы я мог вернуться к нему и,возможно,если эта работа поможет,мы сможем помочь другим.Я дам вам знать,как только смогу это проверить.еще раз спасибоThanks! And sorry for the delay. I ended up using a query, but I will be testing your solution in the following hours so I can switch back and maybe if this work we can help some other. I will let you know as soon as I can check it. Thanks again
- 0
- 2013-01-17
- JordanBel
-
Хорошо написано и подтверждено,что добавление пустого значения возвращает ожидаемые результаты.Я бы сказал,что это непреднамеренно,возможно,стоит взглянуть наtrac.wordpress.org,чтобы узнать,есть ли уже билет,если нет,то его можно воспроизвести.Well written and confirmed that adding an empty value returns expected results. I'd say it's unintentional, may be worth a look at trac.wordpress.org to see if there's already a ticket, if not, this is reproducible.
- 0
- 2013-03-06
- Taylor Dewey
-
Спасибо за отличное объяснение и решение,чтобы обмануть WP :) Мне потребовалось некоторое время,чтобы добраться сюда,но теперь я хочу нажать на голосование хотя бы 10 раз (если бы я только мог;))Thanks for the great explanation and solution to trick WP :) Did take some time to get here - but now I want to click upvote for at least 10 times (if only I could ;))
- 0
- 2013-03-21
- lorem monkey
-
Если я использую compare EXISTS,значение,к сожалению,не игнорируется в более новых версиях WP (проверено в 4.2.2)If I use compare EXISTS, value is unfortunately not ignored in newer versions of WP (tested in 4.2.2)
- 0
- 2015-07-01
- Igor Jerosimić
-
Обратите внимание на `orderbymeta_key`,который также может быть в вашем запросе!Wordpress также жестко закодирует WHEREmeta_key=value для мета-порядка!Be aware of an `orderby meta_key` that may also be in your query! Wordpress will hardcode `WHERE meta_key = value` for a meta orderby as well!
- 0
- 2016-04-08
- Chizzle
-
«Ошибка» EXISTS и NOT EXISTS,требующая указания значения,была исправлена в WP 3.9.The `EXISTS` and `NOT EXISTS` "bug" which required you to specify a value, was fixed in WP 3.9
- 11
- 2016-04-15
- trex005
-
trex005 прав: "(Примечание: из-за ошибки № 23268 для корректной работы НЕ СУЩЕСТВУЮЩИХ сравнений до 3.9 требуется значение. Вы должны указать некоторую строку для параметра значения. Пустая строка или NULL НЕ будут работать. Однако любыедругая строка сделает свое дело и НЕ будет отображаться в вашем SQL при использовании NOT EXISTS. Нужно вдохновение? Как насчет 'bug # 23268'.) "trex005 is right: "(Note: Due to bug #23268, value is required for NOT EXISTS comparisons to work correctly prior to 3.9. You must supply some string for the value parameter. An empty string or NULL will NOT work. However, any other string will do the trick and will NOT show up in your SQL when using NOT EXISTS. Need inspiration? How about 'bug #23268'.)"
- 0
- 2017-04-29
- jave.web
-
- 2015-01-09
При использовании специального запроса у меня сработало:
SELECT * FROM wp_posts as posts WHERE posts.post_type = 'post' AND NOT EXISTS ( SELECT * FROM `wp_postmeta` WHERE `wp_postmeta`.`meta_key` = "your_meta_key" AND `wp_postmeta`.`post_id`=posts.ID )
Using a custom query, this worked for me:
SELECT * FROM wp_posts as posts WHERE posts.post_type = 'post' AND NOT EXISTS ( SELECT * FROM `wp_postmeta` WHERE `wp_postmeta`.`meta_key` = "your_meta_key" AND `wp_postmeta`.`post_id`=posts.ID )
-
- 2020-01-09
У меня это сработало.
'meta_query' => array( 'relation' => 'OR', array( 'key' => 'colors', 'compare' => 'NOT EXISTS' // doesn't work ), array( 'key' => 'colors', 'value' => 'blue' ) )
This worked for me.
'meta_query' => array( 'relation' => 'OR', array( 'key' => 'colors', 'compare' => 'NOT EXISTS' // doesn't work ), array( 'key' => 'colors', 'value' => 'blue' ) )
Я пытаюсь получить запрос на получение всех сообщений,в которых не существует определенного
meta_key
,а затем создать его.Мне не удается найти эти сообщения,поскольку проверяемый мной запрос не работает.
Вот код,который я использую,чтобы попытаться получить эти сообщения:
Это ничего не возвращает,если нет сообщений с ключом
colors
,но возвращает ихids
сообщений с ключомcolors
всякий раз,когда это ключ присутствует (противоположно тому,что мне нужно). Вместо этого я попробовал использоватьEXIST
,но безуспешно.Если кто-то может посоветовать мне правильный способ создания запроса,подобного тому,который мне нужен,я буду признателен.
Спасибо!