Ottieni l'URL di caricamento tramite l'ID blog in più siti


11

L'essenza della domanda è, sto cercando una soluzione come questa:

$blog_upload_dir_info = wp_upload_dir( $date, $blog_ID );
$blog_upload_url = $blog_upload_dir_info[ 'baseurl' ];

Dove $blog_IDè diverso dall'ID blog corrente. La soluzione più »ovvia WP« non riesce:

switch_to_blog( $blog_ID );
$blog_upload_dir_info = wp_upload_dir();
restore_current_blog();

poiché wp_upload_dir () si basa sulla costante WP_CONTENT_URLche viene impostata in modo dinamico l'URL del blog corrente a meno che l'opzione non upload_url_pathsia impostata.

Certo, potrei impostare questa opzione, ma questo associerebbe il mio codice a impostazioni di sistema concrete che includono molto »WTF?« - potenziale.

Quindi ho deciso di aggiungere virtualmente questa opzione:

/**
 * Apply a value to the option blog_upload_url 
 * if there's not already one 
 *
 * @wp-hook option_upload_url_path
 * @param string $upload_url
 * @return string
 */
function get_real_blog_upload_url( $upload_url ) {

    if ( '' !== trim( $upload_url ) )
        return $upload_url;

    $upload_path = trim( get_option( 'upload_path' ) );
    $siteurl = get_option( 'siteurl' );
    $wp_content_dir = $siteurl . '/wp-content';

    if ( empty( $upload_path ) || 'wp-content/uploads' == $upload_path ) {
        $dir = $wp_content_dir . '/uploads';
    } elseif ( 0 !== strpos( $upload_path, ABSPATH ) ) {
        // $dir is absolute, $upload_path is (maybe) relative to ABSPATH
        $dir = path_join( ABSPATH, $upload_path );
    } else {
        $dir = $upload_path;
    }

    if ( empty( $upload_path ) || ( 'wp-content/uploads' == $upload_path ) || ( $upload_path == $dir ) )
        $upload_path = $wp_content_dir . '/uploads';
    else
        $upload_path = trailingslashit( $siteurl ) . $upload_path;


    return $upload_path;
}

che in realtà è un fork parziale wp_upload_dir()e come tale si basa su costanti che non è affatto una buona pratica . Inoltre una forcella è sempre accoppiata all'implementazione originale e se l'originale cambia, bisogna anche riparare la forcella.

Quindi, poiché questa soluzione è ben lungi dall'essere perfetta, mi chiedo se esiste un modo migliore per ottenere gli URL di caricamento tramite ID blog.


1
C'è un'altra soluzione alternativa a questo problema nella Stampa multilingue plug-in: github.com/inpsyde/multilingual-press/blob/…
David

1
Penso che sia utile aggiungere la fonte come risposta per altri lettori. Il collegamento non è stabile e al di fuori della risposta WPSE.
fusione

1
@bueltge Fondamentalmente sono d'accordo. Ma il mio commento basandosi su questa soluzione alternativa è stato un po 'affrettato. La soluzione è un approccio a questo problema, ma presenta alcune limitazioni: github.com/inpsyde/multilingual-press/issues/133 Quando abbiamo trovato una soluzione, ovviamente risponderò anche qui.
David,

Risposte:


1

Perché non usare solo get_option('upload_path')dopo il tuo switch_to_blog( $blog_ID );? Lo fa?


(Crea l'URL completo utilizzando get_blog_details codex.wordpress.org/WPMU_Functions/get_blog_details )
Megan

Cerca in wp_upload_dir(): L'opzione upload_pathnon è un'opzione predefinita e potrebbe essere vuota. Inoltre potrebbe essere omesso dall'opzione upload_url_path. Tuttavia, una soluzione adeguata a questo problema sarebbe quella di fork wp_upload_dir()completamente per coprire tutte queste possibili impostazioni e casi limite.
David,

-1

Per completezza, questa soluzione sembra funzionare fino a quando il problema non viene risolto nel core:

add_action('switch_blog', function($new_blog, $prev_blog_id) {
    update_option( 'upload_url_path',  get_option('siteurl') . '/wp-content/uploads');
}, 10, 2);

1
Sì, dovrebbe funzionare con installazioni WordPress standard. Tuttavia, non vorrei usarlo a causa dell'azione di scrittura del DB. Questo renderà switch_to_blog()ancora più lento.
David,

Questo presuppone anche che l'URL del tuo contenuto sia effettivamente contenuto / upload wp, il che potrebbe non essere il caso.
rfair404,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.