Cambiar la ruta y URL de subida de WordPress
En una instalación nueva, quiero mover la carpeta de subidas a un subdominio (supuestamente para acelerar la descarga). Mi subdominio enlaza a una carpeta llamada static. Entonces tengo:
- Home
- wp
- wp-admin
- wp-content
- wp-include
- static
- wp
Ahora necesito decirle a WordPress dónde está la carpeta de subidas y definir su URL. El codex dice que debería editar wp-config para definir UPLOADS relativo a ABSPATH. Pero si pongo define( 'UPLOADS', '../static' );
por supuesto las URLs en las páginas son como //mydomain.tld/wp/../static/image.jpg
He buscado y encontrado muchas respuestas diferentes para esto (filtros, edición de BD,...), algunas de ellas ya no son válidas (desde que la página de configuración de medios ya no permite cambiar la carpeta de subidas) y algunas obviamente incorrectas... Quiero hacerlo de la manera correcta.
Fui a la página wp-admin/options.php y establecí upload_path = ../static
y upload_url_path = http://static.mydomain.tld
y parece funcionar.
¿Pero es así como se supone que debe hacerse? Y si los desarrolladores han eliminado estas opciones de la página de configuración de medios, ¿no existe el riesgo de que la función se elimine por completo más adelante?

Fui a la página wp-admin/options.php y configuré... ¿Pero se supone que debe hacerse así?
No. Nunca deberías modificar nada en los archivos núcleo de WordPress porque todos tus cambios se perderán durante la próxima actualización. Deberías usar actions y filters en su lugar:
add_filter( 'pre_option_upload_path', function( $upload_path ) {
return '/ruta/a/static';
});
add_filter( 'pre_option_upload_url_path', function( $upload_url_path ) {
return 'http://static.ejemplo.org';
});

No, no, hay un malentendido aquí. Por supuesto que nunca editaría un archivo de WordPress. Me refería a que cargué la página wp-admin/options.php en mi navegador, cambié los ajustes mostrados y hice clic en guardar. Ahora, para tus filtros, entiendo cómo funcionan, pero ¿de dónde se obtienen los valores sin filtro? ¿Hay alguna posibilidad de que sean los ajustes que modifiqué?

Entendido, disculpa por asumir que editaste un archivo core. Esos son exactamente los valores que modificaste y el filtro pre_option_* simplemente filtra todas las llamadas get_option()
para esos valores, así que tu enfoque también funcionará. Respecto a futuro, dudo que estas opciones sean eliminadas del core sin proporcionar compatibilidad hacia atrás.

OK, así que básicamente ambas soluciones son similares en el sentido de que la mía define nuevos valores de opción (asumo que en la base de datos) mientras que la tuya los cambia sobre la marcha, ¿correcto? Entonces supongo que esto, junto con tu comentario sobre futuras evoluciones, significa que mi solución es correcta. Gracias por tu ayuda.

¡De nada! Correcto, pero solo para aclarar, ambos valores ya están definidos en la base de datos, simplemente los estás cambiando desde la interfaz de usuario de options.php. Yo tampoco usaría rutas relativas porque a veces son impredecibles.

Acabo de verificar en otras dos instalaciones que tengo. Tanto upload_path como upload_url_path existen en la base de datos pero están vacíos, así que asumo que hay un valor predeterminado definido en algún lugar. En cuanto a la ruta relativa, eso fue debido a la sugerencia del codex que mencioné en mi publicación inicial. Configuraré una ruta absoluta entonces, con suerte eso no romperá mi sitio :-)

Tienes razón, con valores vacíos los valores predeterminados se generan en wp_upload_dir
: https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/functions.php#L1816

Acabo de votar a favor del comentario de @kovshenin sobre la ruta relativa.
Verifiqué los valores con add_filter('upload_dir', function( $args ){ var_dump($args); });
, los resultados incluyen algo extraño como /home/foo/bar/wordpress/../uploads/
. Así que usé una ruta absoluta para el campo upload_path en la página option.php.

Tuve un problema similar al mapear los medios de un subdominio. Preguntado y respondido aquí.
En resumen, agrega a functions.php lo siguiente:
update_option('upload_url_path', '/wp-content/uploads');

Si, por cualquier razón, no deseas configurar las opciones de ruta de carga en la base de datos o en tu archivo functions.php
, aún puedes establecer los filtros de opción en tu wp-config.php
de la siguiente manera (antes de llamar a cualquier archivo núcleo de WordPress):
$GLOBALS['wp_filter']['pre_option_upload_path'][10][] = array(
'function' => function( $upload_path ){
return '/ruta/a/static';
},
'accepted_args' => 1,
);
$GLOBALS['wp_filter']['pre_option_upload_url_path'][10][] = array(
'function' => function( $upload_url_path ){
return 'http://static.ejemplo.org';
},
'accepted_args' => 1,
);
WP_Hook::build_preinitialized_hooks
actualizará correctamente estos elementos del array al formato interno realmente utilizado.
