Meta query should be an array of arrays (every array contains one condition).
So instead of
$meta_query =
array(
'key' => 'offer',
'value' => $off,
'compare' => '='
);
$query->set( 'meta_query', $meta_query );
There should be
$meta_query = array(
array(
'key' => 'offer',
'value' => $off,
'compare' => '='
)
);
$query->set( 'meta_query', $meta_query );
PS. It would be a good idea to check if preg_match
returns true – if there is no match, your code won’t make much sense, I guess 😉