/** * Writes rules to file cache .htaccess * Throw exceptions * */ function write_rules_cache() { w3_require_once(W3TC_INC_DIR . '/functions/activation.php'); $path = w3_get_minify_rules_cache_path(); if (!file_exists(dirname($path))) { w3_mkdir_from(dirname($path), W3TC_CACHE_DIR); } if (file_exists($path)) { $data = @file_get_contents($path); if ($data !== false) { $data = $this->erase_rules_legacy($data); } else { w3_throw_on_read_error($path); } } else { $data = ''; } $replace_start = strpos($data, W3TC_MARKER_BEGIN_MINIFY_CACHE); $replace_end = strpos($data, W3TC_MARKER_END_MINIFY_CACHE); if ($replace_start !== false && $replace_end !== false && $replace_start < $replace_end) { $replace_length = $replace_end - $replace_start + strlen(W3TC_MARKER_END_MINIFY_CACHE) + 1; } else { $replace_start = false; $replace_length = 0; $search = array(W3TC_MARKER_BEGIN_PGCACHE_CACHE => 0, W3TC_MARKER_BEGIN_BROWSERCACHE_CACHE => 0, W3TC_MARKER_BEGIN_MINIFY_CORE => 0, W3TC_MARKER_BEGIN_PGCACHE_CORE => 0, W3TC_MARKER_BEGIN_BROWSERCACHE_NO404WP => 0, W3TC_MARKER_BEGIN_WORDPRESS => 0); foreach ($search as $string => $length) { $replace_start = strpos($data, $string); if ($replace_start !== false) { $replace_start += $length; break; } } } $rules = $this->generate_rules_cache(); if ($replace_start !== false) { $data = w3_trim_rules(substr_replace($data, $rules, $replace_start, $replace_length)); } else { $data = w3_trim_rules($data . $rules); } if (!@file_put_contents($path, $data)) { w3_throw_on_write_error($path); } }
/** * Writes no 404 by WP rules * * @return boolean */ function write_rules_no404wp() { $path = w3_get_browsercache_rules_no404wp_path(); if (file_exists($path)) { $data = @file_get_contents($path); if ($data === false) { return false; } } else { $data = ''; } $replace_start = strpos($data, W3TC_MARKER_BEGIN_BROWSERCACHE_NO404WP); $replace_end = strpos($data, W3TC_MARKER_END_BROWSERCACHE_NO404WP); if ($replace_start !== false && $replace_end !== false && $replace_start < $replace_end) { $replace_length = $replace_end - $replace_start + strlen(W3TC_MARKER_END_BROWSERCACHE_NO404WP) + 1; } else { $replace_start = false; $replace_length = 0; $search = array(W3TC_MARKER_BEGIN_WORDPRESS => 0, W3TC_MARKER_END_PGCACHE_CORE => strlen(W3TC_MARKER_END_PGCACHE_CORE) + 1, W3TC_MARKER_END_MINIFY_CORE => strlen(W3TC_MARKER_END_MINIFY_CORE) + 1, W3TC_MARKER_END_BROWSERCACHE_CACHE => strlen(W3TC_MARKER_END_BROWSERCACHE_CACHE) + 1, W3TC_MARKER_END_PGCACHE_CACHE => strlen(W3TC_MARKER_END_PGCACHE_CACHE) + 1, W3TC_MARKER_END_MINIFY_CACHE => strlen(W3TC_MARKER_END_MINIFY_CACHE) + 1); foreach ($search as $string => $length) { $replace_start = strpos($data, $string); if ($replace_start !== false) { $replace_start += $length; break; } } } $rules = $this->generate_rules_no404wp(); if ($replace_start !== false) { $data = w3_trim_rules(substr_replace($data, $rules, $replace_start, $replace_length)); } else { $data = w3_trim_rules($data . $rules); } return @file_put_contents($path, $data); }
/** * Writes directives to WP .htaccess * * @param W3_Config $config * @param SelfTestExceptions $exs * @throws FilesystemOperationException with S/FTP form if it can't get the required filesystem credentials * @throws FileOperationException */ private function rules_core_add($config, $exs) { $path = w3_get_pgcache_rules_core_path(); if ($path === false) { return; } $original_data = @file_get_contents($path); if ($original_data === false) { $original_data = ''; } $data = $original_data; $new_data = w3_erase_rules($data, W3TC_MARKER_BEGIN_PGCACHE_LEGACY, W3TC_MARKER_END_PGCACHE_LEGACY); $has_legacy = strlen($new_data) < strlen($data); $data = $new_data; $new_data = w3_erase_rules($data, W3TC_MARKER_BEGIN_PGCACHE_WPSC, W3TC_MARKER_END_PGCACHE_WPSC); $has_wpsc = strlen($new_data) < strlen($data); $data = $new_data; $rules = $this->rules_core_generate($config); $rules_missing = strstr(w3_clean_rules($data), w3_clean_rules($rules)) === false; if (!$has_legacy && !$has_wpsc && !$rules_missing) { return; } // modification of file not required $replace_start = strpos($data, W3TC_MARKER_BEGIN_PGCACHE_CORE); $replace_end = strpos($data, W3TC_MARKER_END_PGCACHE_CORE); if ($replace_start !== false && $replace_end !== false && $replace_start < $replace_end) { $replace_length = $replace_end - $replace_start + strlen(W3TC_MARKER_END_PGCACHE_CORE) + 1; } else { $replace_start = false; $replace_length = 0; $search = array(W3TC_MARKER_BEGIN_BROWSERCACHE_NO404WP => 0, W3TC_MARKER_BEGIN_WORDPRESS => 0, W3TC_MARKER_END_MINIFY_CORE => strlen(W3TC_MARKER_END_MINIFY_CORE) + 1, W3TC_MARKER_END_BROWSERCACHE_CACHE => strlen(W3TC_MARKER_END_BROWSERCACHE_CACHE) + 1, W3TC_MARKER_END_PGCACHE_CACHE => strlen(W3TC_MARKER_END_PGCACHE_CACHE) + 1, W3TC_MARKER_END_MINIFY_CACHE => strlen(W3TC_MARKER_END_MINIFY_CACHE) + 1); foreach ($search as $string => $length) { $replace_start = strpos($data, $string); if ($replace_start !== false) { $replace_start += $length; break; } } } if ($replace_start !== false) { $data = w3_trim_rules(substr_replace($data, $rules, $replace_start, $replace_length)); } else { $data = w3_trim_rules($data . $rules); } try { w3_wp_write_to_file($path, $data); } catch (FilesystemOperationException $ex) { if ($has_legacy) { $exs->push(new FilesystemModifyException($ex->getMessage(), $ex->credentials_form(), sprintf(__('Edit file <strong>%s</strong> and remove all lines between and including <strong> %s</strong> and <strong>%s</strong> markers.', 'w3-total-cache'), $path, W3TC_MARKER_BEGIN_PGCACHE_LEGACY, W3TC_MARKER_END_PGCACHE_LEGACY), $path)); } if ($has_wpsc) { $exs->push(new FilesystemModifyException($ex->getMessage(), $ex->credentials_form(), sprintf(__('Edit file <strong>%s</strong> and remove all lines between and including <strong>%s</strong> and <strong>%s</strong> markers.', 'w3-total-cache'), $path, W3TC_MARKER_BEGIN_PGCACHE_WPSC, W3TC_MARKER_END_PGCACHE_WPSC), $path)); } if ($rules_missing) { if ($replace_start !== false) { $exs->push(new FilesystemModifyException($ex->getMessage(), $ex->credentials_form(), sprintf(__('Edit file <strong>%s</strong> and replace all lines between and including <strong>%s</strong> and <strong>%s</strong> markers with:', 'w3-total-cache'), $path, W3TC_MARKER_BEGIN_PGCACHE_CORE, W3TC_MARKER_END_PGCACHE_CORE), $path, $rules)); } else { $exs->push(new FilesystemModifyException($ex->getMessage(), $ex->credentials_form(), sprintf(__('Edit file <strong>%s</strong> and add the following rules above the WordPress directives:'), $path), $path, $rules)); } } } }
/** * Erases text from start to end * * @param string $rules * @param string $start * @param string $end * @return string */ function w3_erase_rules($rules, $start, $end) { $rules = preg_replace('~' . w3_preg_quote($start) . "\n.*?" . w3_preg_quote($end) . "\n*~s", '', $rules); $rules = w3_trim_rules($rules); return $rules; }
/** * @param SelfTestExceptions $exs * @param string $path * @param string $rules * @param string $start * @param string $end * @param array $order */ function w3_add_rules($exs, $path, $rules, $start, $end, $order) { $data = @file_get_contents($path); if ($data === false) { $data = ''; } $rules_missing = !empty($rules) && strstr(w3_clean_rules($data), w3_clean_rules($rules)) === false; if (!$rules_missing) { return; } $replace_start = strpos($data, $start); $replace_end = strpos($data, $end); if ($replace_start !== false && $replace_end !== false && $replace_start < $replace_end) { $replace_length = $replace_end - $replace_start + strlen($end) + 1; } else { $replace_start = false; $replace_length = 0; $search = $order; foreach ($search as $string => $length) { $replace_start = strpos($data, $string); if ($replace_start !== false) { $replace_start += $length; break; } } } if ($replace_start !== false) { $data = w3_trim_rules(substr_replace($data, $rules, $replace_start, $replace_length)); } else { $data = w3_trim_rules($data . $rules); } if (strpos($path, W3TC_CACHE_DIR) === false || w3_is_nginx()) { try { w3_wp_write_to_file($path, $data); } catch (FilesystemOperationException $ex) { if ($replace_start !== false) { $exs->push(new FilesystemModifyException($ex->getMessage(), $ex->credentials_form(), sprintf(__('Edit file <strong>%s </strong> and replace all lines between and including <strong>%s</strong> and <strong>%s</strong> markers with:', 'w3-total-caceh'), $path, $start, $end), $path, $rules)); } else { $exs->push(new FilesystemModifyException($ex->getMessage(), $ex->credentials_form(), sprintf(__('Edit file <strong>%s</strong> and add the following rules above the WordPress directives:', 'w3-total-cache'), $path), $path, $rules)); } } } else { if (!@file_exists(dirname($path))) { w3_mkdir_from(dirname($path), W3TC_CACHE_DIR); } if (!@file_put_contents($path, $data)) { try { w3_wp_delete_folder(dirname($path), '', $_SERVER['REQUEST_URI']); } catch (FilesystemOperationException $ex) { $exs->push($ex); } } } }
/** * Writes rules to file cache .htaccess * * @return boolean */ function write_rules_core() { $path = w3_get_new_relic_rules_core_path(); if (file_exists($path)) { $data = @file_get_contents($path); } else { $data = ''; } $replace_start = strpos($data, W3TC_MARKER_BEGIN_NEW_RELIC_CORE); $replace_end = strpos($data, W3TC_MARKER_END_NEW_RELIC_CORE); if ($replace_start !== false && $replace_end !== false && $replace_start < $replace_end) { $replace_length = $replace_end - $replace_start + strlen(W3TC_MARKER_END_MINIFY_CORE) + 1; } else { $replace_start = false; $replace_length = 0; $search = array(W3TC_MARKER_BEGIN_PGCACHE_CORE => 0, W3TC_MARKER_BEGIN_BROWSERCACHE_NO404WP => 0, W3TC_MARKER_BEGIN_WORDPRESS => 0, W3TC_MARKER_END_BROWSERCACHE_CACHE => strlen(W3TC_MARKER_END_BROWSERCACHE_CACHE) + 1, W3TC_MARKER_END_PGCACHE_CACHE => strlen(W3TC_MARKER_END_PGCACHE_CACHE) + 1, W3TC_MARKER_END_MINIFY_CACHE => strlen(W3TC_MARKER_END_MINIFY_CACHE) + 1); foreach ($search as $string => $length) { $replace_start = strpos($data, $string); if ($replace_start !== false) { $replace_start += $length; break; } } } $rules = $this->generate_rules_core(); if (!$rules) { return; } if ($replace_start !== false) { $data = w3_trim_rules(substr_replace($data, $rules, $replace_start, $replace_length)); } else { $data = w3_trim_rules($data . $rules); } w3_require_once(W3TC_INC_DIR . '/functions/activation.php'); w3_wp_write_to_file($path, $data); }
/** * Writes rules to file cache .htaccess * * @return boolean */ function write_rules_cache() { $path = w3_get_minify_rules_cache_path(); if (file_exists($path)) { $data = @file_get_contents($path); if ($data !== false) { $data = $this->erase_rules_legacy($data); } else { return false; } } else { $data = ''; } $replace_start = strpos($data, W3TC_MARKER_BEGIN_MINIFY_CACHE); $replace_end = strpos($data, W3TC_MARKER_END_MINIFY_CACHE); if ($replace_start !== false && $replace_end !== false && $replace_start < $replace_end) { $replace_length = $replace_end - $replace_start + strlen(W3TC_MARKER_END_MINIFY_CACHE) + 1; } else { $replace_start = false; $replace_length = 0; $search = array(W3TC_MARKER_BEGIN_PGCACHE_CACHE => 0, W3TC_MARKER_BEGIN_BROWSERCACHE_CACHE => 0, W3TC_MARKER_BEGIN_MINIFY_CORE => 0, W3TC_MARKER_BEGIN_PGCACHE_CORE => 0, W3TC_MARKER_BEGIN_BROWSERCACHE_NO404nxt => 0, W3TC_MARKER_BEGIN_nxtclass => 0); foreach ($search as $string => $length) { $replace_start = strpos($data, $string); if ($replace_start !== false) { $replace_start += $length; break; } } } $rules = $this->generate_rules_cache(); if ($replace_start !== false) { $data = w3_trim_rules(substr_replace($data, $rules, $replace_start, $replace_length)); } else { $data = w3_trim_rules($data . $rules); } return @file_put_contents($path, $data); }