Obtenga la URL de carga por ID de blog en varios sitios

11

La esencia de la pregunta es, estoy buscando una solución como esta:

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

Donde $blog_IDes diferente de la ID del blog actual. La solución más »obvia para WP« falla:

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

como wp_upload_dir () se basa en la constante WP_CONTENT_URLque establece dinámicamente la URL del blog actual a menos que se establezca la opción upload_url_path.

Por supuesto, podría establecer esta opción, pero esto acoplaría mi código a configuraciones concretas del sistema que incluye mucho potencial "WTF?".

Entonces decidí agregar esta opción virtualmente:

/**
 * 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;
}

que de hecho es una bifurcación parcial wp_upload_dir()y, como tal, se basa en constantes que no son una buena práctica en absoluto . Además, una bifurcación siempre está acoplada a la implementación original y, si la original cambia, también hay que arreglar la bifurcación.

Entonces, como esta solución está lejos de ser perfecta, me pregunto si hay una mejor manera de obtener URL de carga por ID de blog.

David
fuente
1
Hay otra solución para este problema en Plugin Multilingual Press: github.com/inpsyde/multilingual-press/blob/…
David
1
Creo que es útil que agregue la fuente como respuesta para otros lectores. El enlace no es estable y está fuera de la respuesta de WPSE.
bueltge
1
@bueltge Básicamente estoy de acuerdo. Pero mi comentario sobre esta solución fue un poco precipitado. La solución es un enfoque para este problema, pero tiene algunas limitaciones: github.com/inpsyde/multilingual-press/issues/133 Cuando encontremos una solución, por supuesto, también la responderé aquí.
David

Respuestas:

1

¿Por qué no solo usar get_option('upload_path')después de tu switch_to_blog( $blog_ID );? ¿Eso lo hace?

Megan
fuente
(Cree la URL completa usando get_blog_details codex.wordpress.org/WPMU_Functions/get_blog_details )
Megan
Examinar wp_upload_dir(): la opción upload_pathno es una opción predeterminada y puede estar vacía. Además, podría ser omitido por la opción upload_url_path. Sin embargo, una solución adecuada para este problema sería bifurcar wp_upload_dir()completamente para cubrir todas estas configuraciones posibles y casos extremos.
David
-1

Para completar, esta solución parece funcionar hasta que el problema se solucione en el núcleo:

add_action('switch_blog', function($new_blog, $prev_blog_id) {
    update_option( 'upload_url_path',  get_option('siteurl') . '/wp-content/uploads');
}, 10, 2);
Arbelzapf
fuente
1
Sí, eso debería funcionar en las instalaciones estándar de WordPress. Sin embargo, no me gustaría usar esto debido a la acción de escritura DB. Esto hará switch_to_blog()aún más lento.
David
Esto también supone que su url de contenido es realmente wp-content / uploads, lo que puede no ser el caso.
rfair404