Спасибо всем, но я понял, не уверен, что это лучше, но, кажется, довольно быстро ..
В итоге я использовал комбинацию LOCATE и SUBSTRING от MySQL с кикером HAVING.
Ниже моя функция, а затем ниже это SQL, который он создает.
function db_get_users_shops_by_shopper_status($shopper_wp_id, $limit = 0, $shopper_status) {
global $wpdb;
if (!is_array($shopper_status)) {
$shopper_status = array($shopper_status);
}
$sql = "
SELECT wp_posts . *,
SUBSTRING(meta_value,
LOCATE('{s:13:\"shopper_wp_id\";s:" . strlen($shopper_wp_id) . ":\"" . $shopper_wp_id . "\";', meta_value),
LOCATE('s:15:\"shopper_answers\";', meta_value))
AS shopper_entity
FROM wp_posts, wp_postmeta
WHERE post_type='shoppertunity'
AND wp_posts.ID = wp_postmeta.post_id AND meta_key = 'shoppers'
AND meta_value LIKE '%s:13:\"shopper_wp_id\";s:" . strlen($shopper_wp_id) . ":\"" . $shopper_wp_id . "\";%'
HAVING shopper_entity LIKE ";
for ($i = 0; $i < sizeof($shopper_status); ++$i) {
if ($i > 0) {
$sql .= " OR shopper_entity LIKE ";
}
$sql .= " '%s:14:\"shopper_status\";s:" . strlen($shopper_status[$i]) . ":\"" . $shopper_status[$i] . "\";%'";
}
if ($limit != 0) {
$sql .= "LIMIT " . $limit;
}
//echo($sql ."<br/><br/>");
$results = $wpdb -> get_results($sql);
return $results;
}
Результаты SQL
SELECT
`wp_posts`.*,
SUBSTRING(`meta_value`,
LOCATE('{s:13:"shopper_wp_id";s:4:"2063";',
`meta_value`),
LOCATE('s:15:"shopper_answers";', `meta_value`)) AS `shopper_entity`
FROM
wp_posts
,
wp_postmeta
ГДЕ
post_type
= 'shoppertunity' AND wp_posts
. ID
= wp_postmeta
. post_id
AND meta_key
= 'shoppers' AND meta_value
LIKE '% s: 13: "shopper_wp_id"; s: 1: "3";%»
HAVING shopper_entity
LIKE '% s: 14: "shopper_status"; s: 9: "завершено";%' OR shopper_entity
LIKE '% s: 14: "shopper_status"; s: 4: "заплатил";%'