config = $config;
}
/**
* Runs User Experience Remove CSS/JS Mutator.
*
* @since 2.7.0
*
* @param string $buffer Buffer string containing browser output.
*
* @return string
*/
public function run( $buffer ) {
$r = apply_filters(
'w3tc_remove_cssjs_mutator_before',
array(
'buffer' => $buffer,
)
);
$buffer = $r['buffer'];
// Sets includes whose matches will be stripped site-wide.
$this->includes = $this->config->get_array(
array(
'user-experience-remove-cssjs',
'includes',
)
);
// Sets singles includes data whose matches will be removed on mated pages.
$this->singles_includes = $this->config->get_array( 'user-experience-remove-cssjs-singles' );
$buffer = preg_replace_callback(
'~()|()~is',
array( $this, 'remove_content' ),
$buffer
);
return $buffer;
}
/**
* Removes matched link/script tag from HTML content.
*
* @since 2.7.0
*
* @param array $matches array of matched CSS/JS entries.
*
* @return string
*/
public function remove_content( $matches ) {
$content = $matches[0];
if ( is_main_query() && $this->is_content_included( $content ) ) {
return '';
}
return $content;
}
/**
* Checks if content has already been removed.
*
* @since 2.7.0
*
* @param string $content script tag string.
*
* @return boolean
*/
private function is_content_included( $content ) {
global $wp;
// Always removes matched CSS/JS for home page.
if ( is_front_page() ) {
foreach ( $this->includes as $include ) {
if ( ! empty( $include ) ) {
if ( strpos( $content, $include ) !== false ) {
return true;
}
}
}
}
// Build array of possible current page relative/absolute URLs.
$current_pages = array(
$wp->request,
trailingslashit( $wp->request ),
home_url( $wp->request ),
trailingslashit( home_url( $wp->request ) ),
);
// Only removes matched CSS/JS on matching pages.
foreach ( $this->singles_includes as $include => $pages ) {
if (
! empty( $pages )
// Check if the given single CSS/JS remove rule URL is present in HTML content.
&& strpos( $content, $include ) !== false
// Check if current page matches defined pages for given single CSS/JS remove rule.
&& array_intersect(
$current_pages,
// Remove leading / value from included page value(s) as the $wp->request excludes them.
array_map(
function ( $value ) {
return ltrim( $value, '/' );
},
$pages['includes']
)
)
) {
return true;
}
}
return false;
}
}