Created
June 10, 2015 02:00
-
-
Save aristath/7b6eb847c9302e289583 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class Aristath_Dynamic_CSS { | |
public $stylesheet_id; | |
public function __construct() { | |
add_action( 'customize_save_after', array( $this, 'make_css' ) ); | |
} | |
/** | |
* Enqueue the dynamic CSS. | |
*/ | |
public function enqueue_dynamic_css() { | |
wp_enqueue_style( 'dynamic-css', $this->file( 'uri' ) ); | |
} | |
public function make_css() { | |
global $wp_filesystem; | |
// Initialize the Wordpress filesystem. | |
if ( empty( $wp_filesystem ) ) { | |
require_once( ABSPATH . '/wp-admin/includes/file.php' ); | |
WP_Filesystem(); | |
} | |
$content = "/********* Compiled - Do not edit *********/\n" . $this->compile_scss() ); | |
// Take care of domain mapping | |
if ( defined( 'DOMAIN_MAPPING' ) && DOMAIN_MAPPING ) { | |
if ( function_exists( 'domain_mapping_siteurl' ) && function_exists( 'get_original_url' ) ) { | |
$mapped_domain = domain_mapping_siteurl( false ); | |
$mapped_domain = str_replace( 'https://', '//', $domain_mapping ); | |
$mapped_domain = str_replace( 'http://', '//', $mapped_domain ); | |
$original_domain = get_original_url( 'siteurl' ); | |
$original_domain = str_replace( 'https://', '//', $original_domain ); | |
$original_domain = str_replace( 'http://', '//', $original_domain ); | |
$content = str_replace( $original_domain, $mapped_domain, $content ); | |
} | |
} | |
// Strip protocols | |
$content = str_replace( 'https://', '//', $content ); | |
$content = str_replace( 'http://', '//', $content ); | |
if ( is_writable( $this->file( 'path' ) ) || ( ! file_exists( $this->file( 'path' ) ) && is_writable( dirname( $this->file( 'path' ) ) ) ) ) { | |
if ( ! $wp_filesystem->put_contents( $this->file( 'path' ), $content, FS_CHMOD_FILE ) ) { | |
// Fail! | |
return false; | |
} | |
} | |
} | |
/* | |
* Determines if the CSS file is writable. | |
*/ | |
public function can_write() { | |
global $blog_id; | |
// Get the upload directory for this site. | |
$upload_dir = wp_upload_dir(); | |
// If this is a multisite installation, append the blogid to the filename | |
$blog_id = ( is_multisite() && $blog_id > 1 ) ? '_blog-' . $blog_id : null; | |
$file_name = '/dynamic-css' . $blog_id . '.css'; | |
$folder_path = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'dynamic-styles'; | |
// Does the folder exist? | |
if ( file_exists( $folder_path ) ) { | |
// Folder exists, but is the folder writable? | |
if ( ! is_writable( $folder_path ) ) { | |
// Folder is not writable. | |
// Does the file exist? | |
if ( ! file_exists( $folder_path . $file_name ) ) { | |
// File does not exist, therefore it can't be created | |
// since the parent folder is not writable. | |
return false; | |
} else { | |
// File exists, but is it writable? | |
if ( ! is_writable( $folder_path . $file_name ) ) { | |
// Nope, it's not writable. | |
return false; | |
} | |
} | |
} else { | |
// The folder is writable. | |
// Does the file exist? | |
if ( file_exists( $folder_path . $file_name ) ) { | |
// File exists. | |
// Is it writable? | |
if ( ! is_writable( $folder_path . $file_name ) ) { | |
// Nope, it's not writable | |
return false; | |
} | |
} | |
} | |
} else { | |
// Can we create the folder? | |
// returns true if yes and false if not. | |
return wp_mkdir_p( $folder_path ); | |
} | |
// all is well! | |
return true; | |
} | |
/* | |
* Gets the css path or url to the stylesheet | |
* | |
* @var string path/url | |
* | |
*/ | |
public function file( $target = 'path' ) { | |
global $blog_id; | |
// Get the upload directory for this site. | |
$upload_dir = wp_upload_dir(); | |
// If this is a multisite installation, append the blogid to the filename | |
$blog_id = ( is_multisite() && $blog_id > 1 ) ? '_blog-' . $blog_id : null; | |
$file_name = 'dynamic-css' . $blog_id . '.css'; | |
$folder_path = $upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'dynamic-styles'; | |
// The complete path to the file. | |
$file_path = $folder_path . DIRECTORY_SEPARATOR . $file_name; | |
// Get the URL directory of the stylesheet | |
$css_uri_folder = $upload_dir['baseurl']; | |
$css_uri = trailingslashit( $css_uri_folder ) . 'dynamic-styles/' . $file_name; | |
// Take care of domain mapping | |
if ( defined( 'DOMAIN_MAPPING' ) && DOMAIN_MAPPING ) { | |
if ( function_exists( 'domain_mapping_siteurl' ) && function_exists( 'get_original_url' ) ) { | |
$mapped_domain = domain_mapping_siteurl( false ); | |
$original_domain = get_original_url( 'siteurl' ); | |
$css_uri = str_replace( $original_domain, $mapped_domain, $css_uri ); | |
} | |
} | |
// Strip protocols | |
$css_uri = str_replace( 'https://', '//', $css_uri ); | |
$css_uri = str_replace( 'http://', '//', $css_uri ); | |
if ( 'path' == $target ) { | |
return $file_path; | |
} elseif ( 'url' == $target || 'uri' == $target ) { | |
$timestamp = ( file_exists( $file_path ) ) ? '?timestamp=' . filemtime( $file_path ) : ''; | |
return $css_uri . $timestamp; | |
} | |
} | |
public function compile_scss() { | |
require dirname( __FILE__ ) . '/framework/scss/wp-scss/scssphp/scss.inc.php'; | |
$scss = new scssc(); | |
$scss->setImportPaths( 'framework/scss/' ); | |
$scss->setFormatter( 'scss_formatter_compressed' ); | |
$variables = Kirki::get_variables(); | |
$vars = ''; | |
foreach ( $variables as $variable => $value ) { | |
$vars .= '$' . $variable . ':' . $value . ';'; | |
} | |
$scss_string = $vars . '@import "style.scss";'; | |
$css = $scss->compile( $scss_string ); | |
return $css; | |
} | |
} | |
$compiler = new Aristath_Dynamic_CSS | |
// Omit closing PHP tag to avoid "Headers already sent" issues. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment