Holen Sie sich die Upload-URL nach Blog-ID in Multisite

11

Das Wesentliche der Frage ist, ich suche nach einer Lösung wie dieser:

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

Wo $blog_IDunterscheidet sich von der aktuellen Blog-ID. Die »WP-offensichtlichste« Lösung schlägt fehl:

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

Als wp_upload_dir () wird die Konstante verwendet, WP_CONTENT_URLdie dynamisch die URL des aktuellen Blogs festlegt, sofern die Option nicht festgelegt upload_url_pathist.

Natürlich könnte ich diese Option einstellen, aber dies würde meinen Code mit konkreten Systemeinstellungen koppeln, die viel »WTF?« - Potenzial beinhalten.

Deshalb habe ich beschlossen, diese Option virtuell hinzuzufügen:

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

Dies ist in der Tat eine teilweise Abzweigung wp_upload_dir()und beruht als solche auf Konstanten, was überhaupt keine gute Praxis ist . Außerdem ist eine Gabel immer an die ursprüngliche Implementierung gekoppelt, und wenn sich die ursprüngliche ändert, muss auch die Gabel repariert werden.

Da diese Lösung bei weitem nicht perfekt ist, frage ich mich, ob es einen besseren Weg gibt, Upload-URLs anhand von Blog-IDs abzurufen.

David
quelle
1
Es gibt eine weitere Problemumgehung für dieses Problem in der mehrsprachigen Plugin-Presse: github.com/inpsyde/multilingual-press/blob/…
David
1
Ich finde es hilfreich, dass Sie die Quelle als Antwort für andere Leser hinzufügen. Die Verbindung ist nicht stabil und liegt außerhalb der WPSE-Antwort.
Bueltge
1
@bueltge Grundsätzlich stimme ich zu. Aber mein Kommentar, der sich auf diese Problemumgehung stützte, war etwas überstürzt. Die Lösung ist ein Ansatz für dieses Problem, hat jedoch einige Einschränkungen: github.com/inpsyde/multilingual-press/issues/133 Wenn wir eine Lösung gefunden haben, werde ich sie natürlich auch hier beantworten.
David

Antworten:

1

Warum nicht einfach get_option('upload_path')nach Ihrem verwenden switch_to_blog( $blog_ID );? Tut das das?

Megan
quelle
(Erstellen Sie die vollständige URL mit get_blog_details codex.wordpress.org/WPMU_Functions/get_blog_details )
Megan
Untersuchen wp_upload_dir(): Die Option upload_pathist keine Standardoption und möglicherweise leer. Ferner könnte es durch die Option weggelassen werden upload_url_path. Eine geeignete Lösung für dieses Problem wäre jedoch, sich wp_upload_dir()vollständig zu teilen , um all diese möglichen Einstellungen und Randfälle abzudecken.
David
-1

Der Vollständigkeit halber scheint diese Lösung zu funktionieren, bis das Problem im Kern behoben ist:

add_action('switch_blog', function($new_blog, $prev_blog_id) {
    update_option( 'upload_url_path',  get_option('siteurl') . '/wp-content/uploads');
}, 10, 2);
Arbelzapf
quelle
1
Ja, das sollte in Standard-WordPress-Installationen funktionieren. Aufgrund der DB-Schreibaktion möchte ich dies jedoch nicht verwenden. Dies wird switch_to_blog()noch langsamer machen.
David
Dies setzt auch voraus, dass Ihre Inhalts-URL tatsächlich wp-content / uploads ist, was möglicherweise nicht der Fall ist.
rfair404