Intereting Posts
плагин генерировал неожиданный вывод во время активации, но он пуст Как скрыть элемент статьи, так что только выведенные пользователи видят его Дефисы вместо косых черт как разделитель структуры константы Как get_queried_объект на нескольких объектах? Каков наилучший способ предоставить пользователям плагинов способ настройки стилей Вход / выход из заголовка Рабочий процесс для работы с git и WordPress Удалить категории из страницы редактирования страницы, но сохранить в боковой панели? Пользовательский тип сообщения без редактора или изменений. Уведомлять об обновлении? Справка с пользовательским запросом WordPress и расширенными настраиваемыми полями плагина Получить случайные условия Автогенерируемые сообщения не отображаются в бэкэнде (но считаются!) Как получить определенное количество изображений из сообщения WordPress? Удалите «Вы используете WordPress 3.2.1» из Right Now Dashboard Widget Помощь с AJAX модератором комментариев

Металлическое поле запроса с использованием

Я пытаюсь запросить некоторую рельефность и логичность, а затем я получаю несколько длинных чисел, и, похоже, Query не нравится.

Пусть говорит, что у меня есть данные в базе данных

Meta-key: lat Meta-value: 54.3415000 Meta-key: lng Meta-value: 10.1254100 

и выполните запрос следующим образом:

 $args['meta_query'] = array( 'relation' => 'AND', array( 'key' => 'lat', 'value' => array( '53.82659686199116', '54.946076335668714' ), 'type' => 'NUMERIC', 'compare' => 'BETWEEN', ), array( 'key' => 'lng', 'value' => array( '8.429260683593725', '11.889954042968725' ), 'type' => 'NUMERIC', 'compare' => 'BETWEEN', ) ); 

Затем он работает, НО , когда это выглядит так:

 $args['meta_query'] = array( 'relation' => 'AND', array( 'key' => 'lat', 'value' => array( '54.10933293482647', '54.66906633195788' ), 'type' => 'NUMERIC', 'compare' => 'BETWEEN', ), array( 'key' => 'lng', 'value' => array( '9.294434023437475', '11.024780703124975' ), 'type' => 'NUMERIC', 'compare' => 'BETWEEN', ) ); 

Тогда это не сработает, даже если это еще между двумя цифрами.

Кто-нибудь знает, что здесь происходит? Должен быть какой-то материал MYSQL.

РЕДАКТИРОВАТЬ:

Вот как выглядит запрос mysql:

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) WHERE 1=1 AND wp_posts.post_type = 'branchenbuch' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future' OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' OR wp_posts.post_status = 'private') AND ( (wp_postmeta.meta_key = 'lat' AND CAST(wp_postmeta.meta_value AS SIGNED) BETWEEN '54.1833340338' AND '54.4636527622')AND (mt1.meta_key = 'lng' AND CAST(mt1.meta_value AS SIGNED) BETWEEN '9.76272625977' AND '10.6278995996') ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10 

Ваша проблема заключается в следующем:

 CAST(wp_postmeta.meta_value AS SIGNED) 

Запустите простой SQL-запрос (командная строка или PhpMyAdmin, как вам нравится), например SELECT CAST('1.2' as SIGNED) и вы увидите, что возвращаемое значение равно 1 . Что вызывает то, что cast – 'type' => 'NUMERIC',

Вы можете передать meta_query в meta_query вместо NUMERIC но я не вижу способа передать параметры DECIMAL , которые фактически сделают его полезным. SELECT CAST('1.2' as DECIMAL) также равно 1 если вы также не передаете аргументы DECIMAL как этот SELECT CAST('1.2' as DECIMAL(20,10)) . Первое число – «точность» – количество десятичных знаков, используемых в математике, а второе – число возвращаемых десятичных знаков. Второй мне кажется, что второе значение должно быть как минимум на 2 меньше первого, или вы получаете нечетные вопросы округления. Очевидно, что второе должно быть больше или больше максимального десятичного знака в вашем номере.

Ваш лучший подход – использовать 'type' => 'DECIMAL', и применить фильтр:

 function add_decimal_params($sqlarr) { remove_filter('get_meta_sql','add_decimal_params'); $sqlarr['where'] = str_replace('DECIMAL','DECIMAL(20,16)',$sqlarr['where']); return $sqlarr; } add_filter('get_meta_sql','add_decimal_params'); 

Добавьте фильтр непосредственно перед запросом и удалите его.

Возможно, вы сможете заставить это работать, оставив ваши номера на одинаковой длине и не используя аргумент type вообще, но я не тестировал это.

Я использовал что-то подобное пару лет назад, я, наконец, использовал raw sql (не могу вспомнить, почему), но основное отличие, которое я вижу от вашего сырого sql и моего, – это эта строка:

 AND CAST(wp_postmeta.meta_value AS SIGNED) BETWEEN '54.1833340338' 

в моем случае он отбрасывается в DECIMEL, а значения – это числа (не строки):

 AND CAST(wp_postmeta.meta_value AS DECIMAL(20,10)) BETWEEN 54.1833340338 

и фактические lat / lng не имеют одинарных кавычек -> поэтому они являются фактическими числами.

Попробуйте запустить это:

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) WHERE 1=1 AND wp_posts.post_type = 'branchenbuch' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future' OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' OR wp_posts.post_status = 'private') AND ( (wp_postmeta.meta_key = 'lat' AND CAST(wp_postmeta.meta_value AS DECIMAL(20,10)) BETWEEN 54.1833340338 AND 54.4636527622) AND (mt1.meta_key = 'lng' AND CAST(mt1.meta_value AS DECIMAL(20,10)) BETWEEN 9.76272625977 AND 10.6278995996)) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10