Modificare il percorso e l'URL di upload di WordPress
In una nuova installazione, voglio spostare la cartella di upload su un sottodominio (dovrebbe velocizzare il download). Il mio sottodominio punta a una cartella chiamata static. Quindi ho:
- Home
- wp
- wp-admin
- wp-content
- wp-include
- static
- wp
Ora devo dire a WordPress dove si trova la cartella di upload e definire il suo URL. Il codex dice che dovrei modificare wp-config per definire UPLOADS relativamente ad ABSPATH. Ma se inserisco define( 'UPLOADS', '../static' );
ovviamente gli URL nelle pagine saranno come //mydomain.tld/wp/../static/image.jpg
Ho cercato in giro e ho trovato molte risposte diverse a questo problema (filtri, modifica del DB,...), alcune non più valide (da quando la pagina delle impostazioni media non permette più di cambiare la cartella di upload) e alcune chiaramente sbagliate... Voglio farlo nel modo corretto.
Sono andato nella pagina wp-admin/options.php e ho impostato upload_path = ../static
e upload_url_path = http://static.mydomain.tld
e sembra funzionare.
Ma è questo il modo in cui dovrebbe essere fatto? E se gli sviluppatori hanno rimosso queste opzioni dalla pagina delle impostazioni media, non c'è il rischio che la funzionalità venga completamente rimossa in futuro?

Sono andato nella pagina wp-admin/options.php e ho impostato... Ma è così che si dovrebbe fare?
No. Non dovresti mai modificare nulla nei file core di WordPress perché tutte le tue modifiche andranno perse durante il prossimo aggiornamento. Dovresti invece utilizzare azioni e filtri:
add_filter( 'pre_option_upload_path', function( $upload_path ) {
return '/percorso/della/cartella/static';
});
add_filter( 'pre_option_upload_url_path', function( $upload_url_path ) {
return 'http://static.esempio.org';
});

No, no, c'è un malinteso qui. Ovviamente non modificherei mai un file di WordPress. Intendevo che ho caricato la pagina wp-admin/options.php nel mio browser, ho modificato le impostazioni visualizzate e ho cliccato su salva. Ora, per i tuoi filtri, capisco come funzionano, ma da dove vengono ottenuti i valori senza filtro? C'è qualche possibilità che siano le impostazioni che ho modificato?

Capisco, scusa per aver dato per scontato che avessi modificato un file core. Quei valori sono esattamente quelli che hai modificato e il filtro pre_option_* semplicemente filtra tutte le chiamate get_option()
per quei valori, quindi il tuo approccio funzionerà comunque. Riguardo alla future-proof, dubito che queste opzioni verranno mai rimosse dal core senza fornire compatibilità all'indietro.

OK, quindi fondamentalmente entrambe le nostre soluzioni sono simili nel senso che la mia definisce nuovi valori di opzione (presumo nel database) mentre la tua li cambia al volo, giusto? Quindi immagino che questo, insieme al tuo commento riguardo alle evoluzioni future, significhi che la mia soluzione sia corretta. Grazie per l'aiuto.

Prego! Esatto, ma per chiarezza, entrambi i valori sono già definiti nel database, li stai semplicemente modificando dall'interfaccia options.php. Inoltre, non userei percorsi relativi perché a volte sono imprevedibili.

Ho appena controllato in altre due installazioni che ho. Sia upload_path che upload_url_path esistono nel database ma sono vuoti, quindi presumo che ci sia un valore predefinito definito da qualche parte. Per quanto riguarda il percorso relativo, era dovuto al suggerimento del codex che ho menzionato nel mio post iniziale. Imposterò un percorso assoluto allora, sperando che non rompa il mio sito :-)

Hai ragione, con valori vuoti i valori predefiniti vengono generati in wp_upload_dir
: https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/functions.php#L1816

Ho appena votato a favore del commento di @kovshenin riguardo al percorso relativo.
Ho verificato i valori con add_filter('upload_dir', function( $args ){ var_dump($args); });
, i risultati includono qualcosa di strano come /home/foo/bar/wordpress/../uploads/
. Quindi ho utilizzato un percorso assoluto per il campo upload_path nella pagina option.php.

Ho avuto un problema simile con il mapping dei media su un sottodominio. Domanda e risposta qui.
In breve, aggiungi al file functions.php quanto segue:
update_option('upload_url_path', '/wp-content/uploads');

Se, per qualsiasi motivo, non desideri impostare le opzioni del percorso di caricamento nel database o nel tuo functions.php
, puoi comunque impostare i filtri delle opzioni nel tuo wp-config.php
in questo modo (prima di chiamare qualsiasi file core di WordPress):
$GLOBALS['wp_filter']['pre_option_upload_path'][10][] = array(
'function' => function( $upload_path ){
return '/percorso/verso/static';
},
'accepted_args' => 1,
);
$GLOBALS['wp_filter']['pre_option_upload_url_path'][10][] = array(
'function' => function( $upload_url_path ){
return 'http://static.esempio.org';
},
'accepted_args' => 1,
);
WP_Hook::build_preinitialized_hooks
aggiornerà correttamente questi elementi dell'array al formato interno effettivamente utilizzato.
