Obtenir l'URL de téléchargement par ID de blog sur plusieurs sites

11

L'essence de la question est que je cherche une solution comme celle-ci:

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

$blog_IDest différent de l'ID de blog actuel. La solution la plus «WP-évidente» échoue:

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

car wp_upload_dir () repose sur la constante WP_CONTENT_URLqui définit dynamiquement l'URL du blog actuel, sauf si l'option upload_url_pathest définie.

Bien sûr, je pouvais définir cette option, mais cela couplerait mon code à des paramètres système concrets qui incluent beaucoup de potentiel »WTF?«.

J'ai donc décidé d'ajouter virtuellement cette option:

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

qui est en fait un fork de wp_upload_dir()et en tant que tel s'appuie sur des constantes, ce qui n'est pas du tout une bonne pratique . De plus, une fourche est toujours couplée à l'implémentation d'origine et si l'original change, il faut également fixer la fourche.

Donc, comme cette solution est loin d'être parfaite, je me demande s'il existe un meilleur moyen d'obtenir des URL de téléchargement par ID de blog.

David
la source
1
Il existe une autre solution à ce problème dans la presse multilingue du plugin: github.com/inpsyde/multilingual-press/blob/…
David
1
Je pense qu'il est utile que vous ajoutiez la source comme réponse pour les autres lecteurs. Le lien n'est pas stable et en dehors de la réponse WPSE.
bueltge
1
@bueltge Fondamentalement, je suis d'accord. Mais mon commentaire s'appuyant sur cette solution de contournement était un peu exagéré. La solution est une approche pour ce problème, mais elle a certaines limites: github.com/inpsyde/multilingual-press/issues/133 Lorsque nous avons trouvé une solution, je vais bien sûr y répondre ici aussi.
David

Réponses:

1

Pourquoi ne pas simplement l'utiliser get_option('upload_path')après votre switch_to_blog( $blog_ID );? Est-ce que ça le fait?

Megan
la source
(Créez l'URL complète en utilisant get_blog_details codex.wordpress.org/WPMU_Functions/get_blog_details )
Megan
Examinez wp_upload_dir(): l'option upload_pathn'est pas une option par défaut et peut être vide. De plus, cette option pourrait être omise upload_url_path. Cependant, une solution appropriée à ce problème serait de bifurquer wp_upload_dir()complètement pour couvrir tous ces paramètres possibles et les cas de bord.
David
-1

Par souci d'exhaustivité, cette solution semble fonctionner jusqu'à ce que le problème soit résolu dans le noyau:

add_action('switch_blog', function($new_blog, $prev_blog_id) {
    update_option( 'upload_url_path',  get_option('siteurl') . '/wp-content/uploads');
}, 10, 2);
Arbelzapf
la source
1
Oui, cela devrait fonctionner dans les installations WordPress standard. Cependant, je ne voudrais pas l'utiliser en raison de l'action d'écriture de la base de données. Cela rendra switch_to_blog()encore plus lent.
David
Cela suppose également que votre URL de contenu est en fait wp-content / uploads, ce qui peut ne pas être le cas.
rfair404