Я нашел решение самостоятельно. Большинство людей создают дополнительные таблицы с широтой и долготой. Я думаю, что это бессмысленно, потому что они уже есть в поле acf. Я не очень разбираюсь в MySQL, поэтому некоторые люди, конечно, могут сократить запрос. Я не знаю, как использовать переменные в MySQL, поэтому регулярное выражение для lat и long можно поместить в переменную:
REGEXP_REPLACE(IF(PM.meta_key = 'adress', PM.meta_value, NULL), '.+\"lat\";d:([0-9\.]+).+','\\1') AS latitude
REGEXP_REPLACE(IF(PM.meta_key = 'adress', PM.meta_value, NULL), '.+\"lng\";d:([0-9\.]+).+','\\1') AS longitude
вот теперь полный запрос для поиска по радиусу с помощью WordPress, ACF (Google Map field), где INPUTLAT, INPUTLONG, INPUTKM - это значения, которые вы доставляете:
SELECT P.ID, P.post_title, P.post_content, P.post_author,
IF(PM.meta_key = 'adress', PM.meta_value, NULL) AS adress,
REGEXP_REPLACE(IF(PM.meta_key = 'adress', PM.meta_value, NULL), '.+\"lat\";d:([0-9\.]+).+','\\1') AS latitude,
REGEXP_REPLACE(IF(PM.meta_key = 'adress', PM.meta_value, NULL), '.+\"lng\";d:([0-9\.]+).+','\\1') AS longitude
FROM wp_posts AS P
LEFT JOIN wp_postmeta AS PM on PM.post_id = P.ID
WHERE P.post_type = 'projekt' and P.post_status = 'publish' and IF(PM.meta_key = 'adress', PM.meta_value, NULL) IS NOT NULL and IF(PM.meta_key = 'adress', PM.meta_value, NULL) IS NOT NULL AND
( 6371 * acos( cos( radians(INPUTLAT) )
* cos( radians( REGEXP_REPLACE(IF(PM.meta_key = 'adress', PM.meta_value, NULL), '.+\"lat\";d:([0-9\.]+).+','\\1') ) )
* cos( radians( REGEXP_REPLACE(IF(PM.meta_key = 'adress', PM.meta_value, NULL), '.+\"lng\";d:([0-9\.]+).+','\\1') )
- radians(INPUTLONG) )
+ sin( radians(INPUTLAT) )
* sin( radians( REGEXP_REPLACE(IF(PM.meta_key = 'adress', PM.meta_value, NULL), '.+\"lat\";d:([0-9\.]+).+','\\1') ) ) ) ) <= INPUTKM
ORDER BY P.post_date DESC
Это просто работает в MariaDB или MySQL 8. MySQL 5 не знаю REGEX_REPLACE