web-dev-qa-db-fra.com

Filtre de crochet pour le chemin wp_upload_dir () dans plusieurs sites

Le répertoire de téléchargement et les chemins d’URL sont stockés dans la base de données des options. Vous pouvez les changer en utilisant

update_option():

update_option( 'upload_path', ABSPATH . '/path/to/uploads' );
update_option( 'upload_path_url', site_url( '/uploads/' ) );

Cependant, s'il s'agit d'un site de blog sur un réseau multisite, la fonction _wp_upload_dir on /wp-includes/functions.php add/site/id_blog/après l'url définie sur upload_path et upload_path_url.

function _wp_upload_dir( $time = null ) {
      $siteurl = get_option( 'siteurl' );
      $upload_path = trim( get_option( 'upload_path' ) );

    if ( empty( $upload_path ) || 'wp-content/uploads' == $upload_path ) {
        $dir = WP_CONTENT_DIR . '/uploads';
    } elseif ( 0 !== strpos( $upload_path, ABSPATH ) ) {
        $dir = path_join( ABSPATH, $upload_path );
    } else {
        $dir = $upload_path;
    }

    if ( !$url = get_option( 'upload_url_path' ) ) {
        if ( empty($upload_path) || ( 'wp-content/uploads' == $upload_path ) || ( $upload_path == $dir ) )
              $url = WP_CONTENT_URL . '/uploads';
        else
            $url = trailingslashit( $siteurl ) . $upload_path;
    }

    if ( defined( 'UPLOADS' ) && ! ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) ) {
        $dir = ABSPATH . UPLOADS;
        $url = trailingslashit( $siteurl ) . UPLOADS;
    }

    // If multisite (and if not the main site in a post-MU network)
    if ( is_multisite() && ! ( is_main_network() && is_main_site() && defined( 'MULTISITE' ) ) ) {

        if ( ! get_site_option( 'ms_files_rewriting' ) ) {

              if ( defined( 'MULTISITE' ) )
                $ms_dir = '/sites/' . get_current_blog_id();
            else
                $ms_dir = '/' . get_current_blog_id();

            $dir .= $ms_dir;
            $url .= $ms_dir;

        } elseif ( defined( 'UPLOADS' ) && ! ms_is_switched() ) {
            if ( defined( 'BLOGUPLOADDIR' ) )
                $dir = untrailingslashit( BLOGUPLOADDIR );
            else
                $dir = ABSPATH . UPLOADS;
              $url = trailingslashit( $siteurl ) . 'files';
        }
    }

    $basedir = $dir;
    $baseurl = $url;

    $subdir = '';
    if ( get_option( 'uploads_use_yearmonth_folders' ) ) {
        if ( !$time )
            $time = current_time( 'mysql' );
        $y = substr( $time, 0, 4 );
        $m = substr( $time, 5, 2 );
        $subdir = "/$y/$m";
    }

    $dir .= $subdir;
    $url .= $subdir;

    return array(
        'path'    => $dir,
        'url'     => $url,
        'subdir'  => $subdir,
        'basedir' => $basedir,
        'baseurl' => $baseurl,
        'error'   => false,
    );
  }

Il me faut donc supprimer uniquement la prochaine condition:

  if ( defined( 'MULTISITE' ) )
        $ms_dir = '/sites/' . get_current_blog_id();
  else
        $ms_dir = '/' . get_current_blog_id();

Pour ça:

      $ms_dir = '/'

Mais je n'aime pas gâcher le code wordpress principal. Je voudrais le changer par un crochet de filtre si c'est possible.

Tout conseil serait utile.

2
TorryVic

Utilisez le filtre upload_dir .

add_filter( 'upload_dir', 'wpse_261931_upload_dir', 10, 1 );
function wpse_261931_upload_dir( array $uploads ) {
  if( is_multisite() ) {
    //* Do something interesting with the $uploads directory

  }
  return $uploads;
}
2
Nathan Johnson