Skip to content

Commit 0a96a52

Browse files
committed
intial commit
0 parents  commit 0a96a52

File tree

5 files changed

+239
-0
lines changed

5 files changed

+239
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
vendor/

Readme.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# wp_enqueue_less
2+
3+
wp_enqueue_less provides a function to enqueue less stylesheets in WordPress.
4+
5+
## Install
6+
7+
### Composer
8+
9+
Composer is the best way to install wp_enqueue_less so you get updates in the future easily.
10+
11+
```
12+
composer require ed-itsolutions/wp_enqueue_less
13+
```
14+
15+
and then in your `functions.php` of `plugin.php`
16+
17+
```php
18+
require_once('vendor/autoload.php');
19+
```
20+
21+
### Manually
22+
23+
Download a copy of wp_enqueue_less.php and require it in your theme/plugin.
24+
25+
## Usage
26+
27+
In your normal `wp_enqueue_scripts` action simply call `wp_enqueue_less`
28+
29+
`wp_enqueue_less` takes 3 arguments.
30+
31+
- _key_ - The key name to use for this stylesheet.
32+
- _filePath_ - The on disk path to the .less file.
33+
- _variables_ - A key->value array of variables to be passed to the less compiler.
34+
35+
```php
36+
add_action('wp_enqueue_scripts', function(){
37+
wp_enqueue_style('theme-stylesheet', get_stylesheet_uri());
38+
39+
wp_enqueue_less('theme-main', get_template_directory() . '/less/main.less', array(
40+
'main-color' => '#99bbff' // becomes @main-color in your less stylesheet.
41+
));
42+
});
43+
```
44+
45+
Thats it!
46+
47+
wp_enqueue_less will:
48+
49+
- Compile this less file and write the output to `/wp-content/uploads/less/key-hash.css` (this can be changed with the filter `wp_enqueue_less_css_dir`).
50+
- Record the current hashes of all the less files used and the variables into the database.
51+
- On the next call if none of the hashes have changed it will skip parsing.
52+
- On a daily basis it will clean out its directory of everything but the current hash version of the stylesheet.

composer.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"name": "ed-itsolutions/wup-client",
3+
"description": "WordPress Update Provider client for use in plugins / themes.",
4+
"require": {
5+
"oyejorge/less.php": "v1.7.0.14"
6+
},
7+
"license": "MIT",
8+
"authors": [
9+
{
10+
"name": "Adam Laycock",
11+
"email": "[email protected]",
12+
"homepage": "https://arcath.net",
13+
"role": "Developer"
14+
}
15+
],
16+
"autoload": {
17+
"files": ["wp_enqueue_less.php"]
18+
}
19+
}

composer.lock

Lines changed: 80 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

wp_enqueue_less.php

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?php
2+
function wp_enqueue_less($key, $file, $variables){
3+
$details = get_option('wp_enqueue_less_' . $key, new StdClass);
4+
5+
if(!$details->key){
6+
$details->key = $key;
7+
$details->file = $file;
8+
$details->setting = 'wp_enqueue_less_' . $key;
9+
10+
do_action('wp_enqueue_less_compile', $details, $variables);
11+
}else{
12+
if(md5(json_encode($variables)) != $details->variablesHash){
13+
do_action('wp_enqueue_less_compile', $details, $variables);
14+
}else{
15+
$filesChanged = false;
16+
17+
foreach(array_keys($details->fileHashes) as $fileName){
18+
if(!$filesChanged && md5_file($fileName) != $details->fileHashes[$fileName]){
19+
$filesChanged = true;
20+
}
21+
}
22+
23+
if($filesChanged){
24+
do_action('wp_enqueue_less_compile', $details, $variables);
25+
}
26+
}
27+
}
28+
29+
$baseUri = apply_filters('wp_enqueue_less_css_dir', wp_upload_dir()['baseurl'] . '/less');
30+
wp_enqueue_style($key, $baseUri . '/' . $details->key . '-' . $details->hash . '.css');
31+
32+
if(!wp_next_scheduled('wp_enqueue_less_clean')){
33+
wp_schedule_event(time(), 'daily', 'wp_enqueue_less_clean');
34+
}
35+
}
36+
37+
add_action('wp_enqueue_less_compile', function($details, $variables){
38+
$parser = new Less_Parser();
39+
$parser->parseFile($details->file, get_template_directory_uri());
40+
$parser->ModifyVars($variables);
41+
$css = $parser->getCss();
42+
43+
$hash = md5($css);
44+
45+
$dir = apply_filters('wp_enqueue_less_css_dir', wp_upload_dir()['basedir'] . '/less');
46+
if(!file_exists($dir)){
47+
mkdir($dir);
48+
}
49+
50+
$file = $dir . '/' . $details->key . '-' . $hash . '.css';
51+
52+
file_put_contents($file, $css);
53+
54+
$details->hash = $hash;
55+
56+
$details->fileHashes = array();
57+
foreach($parser->allParsedFiles() as $fileName){
58+
$details->fileHashes[$fileName] = md5_file($fileName);
59+
}
60+
61+
$details->variablesHash = md5(json_encode($variables));
62+
63+
update_option($details->setting, $details);
64+
}, 10, 2);
65+
66+
add_action('wp_enqueue_less_clean', function(){
67+
$dir = apply_filters('wp_enqueue_less_css_dir', wp_upload_dir()['basedir'] . '/less');
68+
69+
$files = scandir($dir);
70+
71+
$keyDetails = array();
72+
73+
foreach($files as $file){
74+
if($file != '.' && $file != '..'){
75+
$key = substr($file, 0, -37);
76+
$hash = substr($file, -36, -4);
77+
78+
if(!isset($keyDetails[$key])){
79+
$keyDetails[$key] = get_option('wp_enqueue_less_' . $key, new StdClass);
80+
}
81+
82+
if($hash != $keyDetails[$key]->hash){
83+
unlink($dir . '/' . $file);
84+
}
85+
}
86+
}
87+
});

0 commit comments

Comments
 (0)