¿Cómo restringir el acceso a archivos subidos?
Tengo un área restringida en un sitio web que solo puede ser accedida por usuarios registrados. Para eso creé una plantilla de página con una condición 'current_user_can()'.
Mi problema es que los documentos adjuntos a las páginas restringidas siguen siendo accesibles para cualquiera si se coloca la ruta completa en la barra de direcciones del navegador.
¿Hay alguna manera de restringir el acceso a los archivos subidos?
EDICIÓN: Quiero aclarar que los archivos deberían ser accesibles solo para usuarios que hayan iniciado sesión.

Esto no es realmente una pregunta sobre WordPress, pero puedes agregar una regla de reescritura para evitar el acceso a menos que el referente sea tu propio dominio.
[Actualización]
Necesitarás hacer 2 cosas:
Agregar una regla de reescritura (ya sea directamente con .htaccess o usando WP_rewrite (referencia del Codex). El objetivo aquí es denegar solicitudes a tus documentos que no tengan tu dominio como referente - esto evita que la gente pegue el enlace directamente en la barra de direcciones del navegador.
Envolver tus enlaces de descarga en un bloque condicional
is_user_logged_in
(referencia del Codex) - de esa manera solo aparecerán en la página si el usuario ha iniciado sesión.
Hay un ejemplo de código disponible en una pregunta relacionada:

Hola anu, el referente debe ser mi dominio + el visitante debe ser un usuario registrado y conectado. Creo que es un asunto de WP.

Hola anu, sí, eso no muestra los archivos si un usuario no ha iniciado sesión, pero ¿qué pasa si un usuario adivina el nombre del archivo? ¡Aún puede acceder a él! Y eso es lo que quiero evitar. Permíteme darte un ejemplo, digamos que tenemos un sitio web corporativo con algunos documentos públicos (report2011.pdf, report2010.pdf, etc.) y algunos documentos privados (report2009.pdf, report2008.pdf). Incluso si los documentos privados no se muestran en el sitio web público, alguien podría adivinar fácilmente algunos nombres de archivo (basándose en la estructura de los públicos) y así acceder a los documentos privados simplemente escribiendo la URL en la barra de direcciones.

¿Funcionará si no tengo un dominio como tal...? Es decir, ¿estoy accediendo a mi blog a través de una dirección IP?

Dos palabras: suplantación de referer. Tu solución no es más que 'seguridad por oscuridad': El atacante no puede acceder al archivo multimedia si conoce la URL completa del mismo. En cambio, ahora tiene que conocer una de las URLs de referer válidas. ¿Qué hemos ganado aparte de una mayor complejidad administrativa? En mi humilde opinión, nada. En el momento de escribir esto, hay "miles" de plugins para proteger páginas y posts, pero Wordpress todavía carece de una protección útil para los medios. Los desarrolladores de Wordpress (y de plugins) evitan esto, ya que conocen las consecuencias.

Puedes utilizar protección contra hot-linking usando tu servidor web preferido.
Consulta esta respuesta en StackOverflow:
https://stackoverflow.com/questions/1775582/apache-hotlink-protection-for-download-folder.
Esto utiliza el archivo .htaccess de apache2.
Básicamente, estás denegando la descarga si el usuario no proviene de una página de tu blog.

Esto funcionó para mí. Puedes prevenir el acceso a la carpeta wp-content/upload (excluyendo a los usuarios conectados) creando un archivo .htaccess y agregando la siguiente regla de reescritura:
# Deshabilitar navegación de directorios
Options -Indexes
# Redirigir usuarios no conectados a la página de inicio de sesión
RewriteEngine On
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in.*$ [NC]
RewriteRule \.(pdf|jpg)$ /wp-login.php [L,R=302]

El plugin de usuario registrado solo se asegura de que un visitante haya iniciado sesión antes de ver el contenido de tu página. El acceso a tus archivos a través de un navegador está controlado por el servidor.
Deberías probar el plugin de WP AskApache Password Protect - http://wordpress.org/extend/plugins/askapache-password-protect/
Por supuesto, esto solo funcionará si tu blog WordPress está alojado en un servidor Apache.
