142 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Smush\Core;
 | 
						|
 | 
						|
class Upload_Dir {
 | 
						|
	private $wp_upload_dir;
 | 
						|
 | 
						|
	private $root_path;
 | 
						|
 | 
						|
	private $upload_path;
 | 
						|
 | 
						|
	private $upload_rel_path;
 | 
						|
 | 
						|
	private $upload_url;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return array
 | 
						|
	 */
 | 
						|
	private function get_wp_upload_dir() {
 | 
						|
		if ( is_null( $this->wp_upload_dir ) ) {
 | 
						|
			$this->wp_upload_dir = $this->prepare_wp_upload_dir();
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->wp_upload_dir;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return mixed
 | 
						|
	 */
 | 
						|
	private function get_root_path() {
 | 
						|
		if ( is_null( $this->root_path ) ) {
 | 
						|
			$this->root_path = $this->prepare_root_path();
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->root_path;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return mixed
 | 
						|
	 */
 | 
						|
	public function get_upload_path() {
 | 
						|
		if ( is_null( $this->upload_path ) ) {
 | 
						|
			$this->upload_path = $this->prepare_upload_path();
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->upload_path;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	public function get_upload_rel_path() {
 | 
						|
		if ( is_null( $this->upload_rel_path ) ) {
 | 
						|
			$this->upload_rel_path = $this->prepare_upload_rel_path();
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->upload_rel_path;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	public function get_upload_url() {
 | 
						|
		if ( is_null( $this->upload_url ) ) {
 | 
						|
			$this->upload_url = $this->prepare_upload_url();
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->upload_url;
 | 
						|
	}
 | 
						|
 | 
						|
	private function prepare_upload_path() {
 | 
						|
		$upload = $this->get_wp_upload_dir();
 | 
						|
 | 
						|
		return untrailingslashit( $upload['basedir'] );
 | 
						|
	}
 | 
						|
 | 
						|
	private function prepare_upload_rel_path() {
 | 
						|
		$root_path = $this->get_root_path();
 | 
						|
 | 
						|
		return str_replace( $root_path, '', $this->get_upload_path() );
 | 
						|
	}
 | 
						|
 | 
						|
	private function prepare_upload_url() {
 | 
						|
		$upload = $this->get_wp_upload_dir();
 | 
						|
 | 
						|
		return untrailingslashit( $upload['baseurl'] );
 | 
						|
	}
 | 
						|
 | 
						|
	private function prepare_wp_upload_dir() {
 | 
						|
		if ( ! is_multisite() || is_main_site() ) {
 | 
						|
			$upload = wp_upload_dir();
 | 
						|
		} else {
 | 
						|
			// Use the main site's upload directory for all subsite's webp converted images.
 | 
						|
			// This makes it easier to have a single rule on the server configs for serving webp in mu.
 | 
						|
			$blog_id = get_main_site_id();
 | 
						|
			switch_to_blog( $blog_id );
 | 
						|
			$upload = wp_upload_dir();
 | 
						|
			restore_current_blog();
 | 
						|
		}
 | 
						|
 | 
						|
		return $upload;
 | 
						|
	}
 | 
						|
 | 
						|
	protected function prepare_root_path() {
 | 
						|
		// Is it possible that none of the following conditions are met?
 | 
						|
		$root_path = '';
 | 
						|
 | 
						|
		// Get the Document root path. There must be a better way to do this.
 | 
						|
		// For example, /srv/www/site/public_html for /srv/www/site/public_html/wp-content/uploads.
 | 
						|
		if ( 0 === strpos( $this->get_upload_path(), ABSPATH ) ) {
 | 
						|
			// Environments like Flywheel have an ABSPATH that's not used in the paths.
 | 
						|
			$root_path = ABSPATH;
 | 
						|
		} elseif ( ! empty( $_SERVER['DOCUMENT_ROOT'] ) && 0 === strpos( $this->get_upload_path(), wp_unslash( $_SERVER['DOCUMENT_ROOT'] ) ) ) {
 | 
						|
			/**
 | 
						|
			 * This gets called when scanning for uncompressed images.
 | 
						|
			 * When ran from certain contexts, $_SERVER['DOCUMENT_ROOT'] might not be set.
 | 
						|
			 *
 | 
						|
			 * We are removing this part from the path later on.
 | 
						|
			 */
 | 
						|
			$root_path = realpath( wp_unslash( $_SERVER['DOCUMENT_ROOT'] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
 | 
						|
		} elseif ( 0 === strpos( $this->get_upload_path(), dirname( WP_CONTENT_DIR ) ) ) {
 | 
						|
			// We're assuming WP_CONTENT_DIR is only one level deep into the document root.
 | 
						|
			// This might not be true in customized sites. A bit edgy.
 | 
						|
			$root_path = dirname( WP_CONTENT_DIR );
 | 
						|
		}
 | 
						|
 | 
						|
		$root_path = untrailingslashit( $root_path );
 | 
						|
 | 
						|
		/**
 | 
						|
		 * Filters the Document root path used to get relative paths for webp rules.
 | 
						|
		 * Hopefully of help for debugging and SLS.
 | 
						|
		 *
 | 
						|
		 * @since 3.9.0
 | 
						|
		 */
 | 
						|
		return apply_filters( 'smush_webp_rules_root_path_base', $root_path );
 | 
						|
	}
 | 
						|
 | 
						|
	public function get_human_readable_path( $full_path ) {
 | 
						|
		return str_replace( WP_CONTENT_DIR, '', $full_path );
 | 
						|
	}
 | 
						|
}
 |