Obter URL de upload por ID do blog em vários sites


11

A essência da pergunta é: estou procurando uma solução como esta:

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

Onde $blog_IDé diferente do ID do blog atual. A solução mais »WP-óbvia« falha:

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

como wp_upload_dir () conta com a constante WP_CONTENT_URLque define dinamicamente a URL do blog atual, a menos que a opção upload_url_pathesteja definida.

É claro que eu poderia definir essa opção, mas isso associaria meu código a configurações concretas do sistema, que incluem muito potencial de »WTF?«.

Então, decidi adicionar essa opção 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 fato um garfo parcialmente wp_upload_dir()e, como tal, depende de constantes, o que não é uma boa prática . Além disso, um garfo está sempre acoplado à implementação original e, se o original mudar, também é necessário consertar o garfo.

Portanto, como essa solução está longe de ser perfeita, pergunto-me se há uma maneira melhor de obter URLs de upload por IDs de blog.


1
Há outra solução alternativa para esse problema na Imprensa multilíngue do plug-in: github.com/inpsyde/multilingual-press/blob/…
David

1
Eu acho que é útil que você adicione a fonte como resposta para outros leitores. O link não está estável e está fora da resposta WPSE.
bueltge

1
@bueltge Basicamente, eu concordo. Mas meu comentário sobre essa solução alternativa foi um pouco exagerado. A solução é uma abordagem para esse problema, mas tem algumas limitações: github.com/inpsyde/multilingual-press/issues/133 Quando encontramos uma solução, é claro que também responderei aqui.
David

Respostas:


1

Por que não usar apenas get_option('upload_path')depois do seu switch_to_blog( $blog_ID );? Isso faz?


(Construir o URL completo usando get_blog_details codex.wordpress.org/WPMU_Functions/get_blog_details )
Megan

Examinar wp_upload_dir(): A opção upload_pathnão é uma opção padrão e pode estar vazia. Além disso, poderia ser omitido pela opção upload_url_path. No entanto, uma solução adequada para esse problema seria fazer uma bifurcação wp_upload_dir()completa para cobrir todas essas configurações possíveis e casos de borda.
David David

-1

Por uma questão de integridade, esta solução parece funcionar até que o problema seja corrigido no 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);

1
Sim, isso deve funcionar em instalações padrão do WordPress. No entanto, eu não gostaria de usar isso devido à ação de gravação do banco de dados. Isso tornará switch_to_blog()ainda mais lento.
David

Isso também pressupõe que o URL do seu conteúdo seja realmente wp-content / uploads, o que pode não ser o caso.
rfair404
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.