It's probably a problem with your brackets (or lack of)
SELECT * FROM `wm_products` WHERE gender_id = 1 AND (pro_price BETWEEN 1000 AND 2500) OR (pro_price BETWEEN 2501 AND 5000) ORDER BY `wm_products`.`gender_id` DESC
You are saying where gender_id = 1 and (ABC) or (XYZ)
so if XYZ is true then that data is included in your subset as it is independent from the AND between gender_id and ABC. You probably want something like this
where gender_id = 1 and ((ABC) or (XYZ))
so the "or" is its own comparison and the result is then ANDed with gender_id
SELECT * FROM `wm_products` WHERE gender_id = 1 AND ((pro_price BETWEEN 1000 AND 2500) OR (pro_price BETWEEN 2501 AND 5000)) ORDER BY `wm_products`.`gender_id` DESC