Это - потому что "корневая" директива соответствует, прежде чем "отклонять" директива может быть подобрана. Инвертируйте порядок своих директив, и он должен работать:
...
location /testdir {
deny all;
return 404;
}
location ~* ^.+\.(jpg|txt)$ {
root /var/www/site;
}
...
Я бы попробовал плагин WordPress Active Directory .
Я собираюсь использовать его в проекте, и я думаю, что это выглядит многообещающим.