You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
388 lines
10 KiB
388 lines
10 KiB
<?php
|
|
|
|
/**
|
|
* Helpers functions
|
|
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
|
* @copyright (c) 2017 Webraftic Ltd
|
|
* @version 1.0
|
|
*/
|
|
|
|
// Exit if accessed directly
|
|
if( !defined('ABSPATH') ) {
|
|
exit;
|
|
}
|
|
|
|
class WCL_Helper extends WBCR\Factory_Templates_127\Helpers {
|
|
|
|
public static function array_merge_insert(array $arr, array $inserted, $position = 'bottom', $key = null)
|
|
{
|
|
return self::arrayMergeInsert($arr, $inserted, $position, $key);
|
|
}
|
|
|
|
/**
|
|
* Flushes as many page cache plugin's caches as possible.
|
|
*/
|
|
public static function flush_cache()
|
|
{
|
|
// Flush cache for all cache plugins
|
|
self::flushPageCache();
|
|
}
|
|
|
|
/**
|
|
* Should show a page about the plugin or not.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function is_need_show_setup_page()
|
|
{
|
|
$need_show_about = (int)get_option(WCL_Plugin::app()->getOptionName('setup_wizard'));
|
|
|
|
$is_ajax = self::doing_ajax();
|
|
$is_cron = self::doing_cron();
|
|
$is_rest = self::doing_rest_api();
|
|
|
|
if( $need_show_about && !$is_ajax && !$is_cron && !$is_rest ) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Checks if the current request is a WP REST API request.
|
|
*
|
|
* Case #1: After WP_REST_Request initialisation
|
|
* Case #2: Support "plain" permalink settings
|
|
* Case #3: URL Path begins with wp-json/ (your REST prefix)
|
|
* Also supports WP installations in subfolders
|
|
*
|
|
* @author matzeeable https://wordpress.stackexchange.com/questions/221202/does-something-like-is-rest-exist
|
|
* @since 2.1.0
|
|
* @return boolean
|
|
*/
|
|
public static function doing_rest_api()
|
|
{
|
|
$prefix = rest_get_url_prefix();
|
|
$rest_route = WCL_Plugin::app()->request->get('rest_route', null);
|
|
if( defined('REST_REQUEST') && REST_REQUEST // (#1)
|
|
|| !is_null($rest_route) // (#2)
|
|
&& strpos(trim($rest_route, '\\/'), $prefix, 0) === 0 ) {
|
|
return true;
|
|
}
|
|
|
|
// (#3)
|
|
$rest_url = wp_parse_url(site_url($prefix));
|
|
$current_url = wp_parse_url(add_query_arg([]));
|
|
|
|
return (!empty($current_url['path']) && !empty($rest_url['path'])) && strpos($current_url['path'], $rest_url['path'], 0) === 0;
|
|
}
|
|
|
|
/**
|
|
* @return bool
|
|
* @since 2.1.0
|
|
*/
|
|
public static function doing_ajax()
|
|
{
|
|
if( function_exists('wp_doing_ajax') ) {
|
|
return wp_doing_ajax();
|
|
}
|
|
|
|
return defined('DOING_AJAX') && DOING_AJAX;
|
|
}
|
|
|
|
/**
|
|
* @return bool
|
|
* @since 2.1.0
|
|
*/
|
|
public static function doing_cron()
|
|
{
|
|
if( function_exists('wp_doing_cron') ) {
|
|
return wp_doing_cron();
|
|
}
|
|
|
|
return defined('DOING_CRON') && DOING_CRON;
|
|
}
|
|
|
|
/**
|
|
* Allows you to get the base path to the plugin in the directory wp-content/plugins/
|
|
*
|
|
* @param $slug - slug for example "clearfy", "hide-login-page"
|
|
* @return int|null|string - "clearfy/clearfy.php"
|
|
*/
|
|
public static function getPluginBasePathBySlug($slug)
|
|
{
|
|
// Check if the function get_plugins() is registered. It is necessary for the front-end
|
|
// usually get_plugins() only works in the admin panel.
|
|
if( !function_exists('get_plugins') ) {
|
|
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
|
}
|
|
|
|
$plugins = get_plugins();
|
|
|
|
foreach($plugins as $base_path => $plugin) {
|
|
if( strpos($base_path, rtrim(trim($slug))) !== false ) {
|
|
return $base_path;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Static method will check whether the plugin is activated or not. You can check whether the plugin exists
|
|
* by using its slug or the base path.
|
|
*
|
|
* @param string $slug - slug for example "clearfy", "hide-login-page" or base path "clearfy/clearfy.php"
|
|
* @return bool
|
|
*/
|
|
public static function isPluginActivated($slug)
|
|
{
|
|
if( strpos(rtrim(trim($slug)), '/') === false ) {
|
|
$plugin_base_path = self::getPluginBasePathBySlug($slug);
|
|
|
|
if( empty($plugin_base_path) ) {
|
|
return false;
|
|
}
|
|
} else {
|
|
$plugin_base_path = $slug;
|
|
}
|
|
|
|
require_once ABSPATH . '/wp-admin/includes/plugin.php';
|
|
|
|
return is_plugin_active($plugin_base_path);
|
|
}
|
|
|
|
/**
|
|
* Static method will check whether the plugin is installed or not. You can check whether the plugin exists
|
|
* by using its slug or the base path.
|
|
*
|
|
* @param string $slug - slug "clearfy" or base_path "clearfy/clearfy.php"
|
|
* @return bool
|
|
*/
|
|
public static function isPluginInstalled($slug)
|
|
{
|
|
if( strpos(rtrim(trim($slug)), '/') === false ) {
|
|
$plugin_base_path = self::getPluginBasePathBySlug($slug);
|
|
|
|
if( !empty($plugin_base_path) ) {
|
|
return true;
|
|
}
|
|
} else {
|
|
|
|
// Check if the function get_plugins() is registered. It is necessary for the front-end
|
|
// usually get_plugins() only works in the admin panel.
|
|
if( !function_exists('get_plugins') ) {
|
|
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
|
}
|
|
|
|
$plugins = get_plugins();
|
|
|
|
if( isset($plugins[$slug]) ) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Is permalink enabled?
|
|
* @return bool
|
|
* @since 1.0.0
|
|
* @global WP_Rewrite $wp_rewrite
|
|
*/
|
|
public static function isPermalink()
|
|
{
|
|
global $wp_rewrite;
|
|
|
|
if( !isset($wp_rewrite) || !is_object($wp_rewrite) || !$wp_rewrite->using_permalinks() ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Получает и возвращает все опции разрешенные для экспорта
|
|
*
|
|
* @param string $return
|
|
* @return array|string
|
|
*/
|
|
public static function getExportOptions($return = 'json')
|
|
{
|
|
global $wpdb;
|
|
|
|
$export_options = array();
|
|
|
|
$options = WCL_Option::getAllOptions();
|
|
|
|
$allow_export_options = array();
|
|
|
|
foreach((array)$options as $option_class) {
|
|
$option_name = $option_class->getName();
|
|
$allow_export_options[] = WCL_Plugin::app()->getOptionName($option_name);
|
|
}
|
|
|
|
if( WCL_Plugin::app()->isNetworkActive() ) {
|
|
$network_id = get_current_network_id();
|
|
|
|
$request = $wpdb->get_results($wpdb->prepare("
|
|
SELECT meta_key, meta_value
|
|
FROM {$wpdb->sitemeta}
|
|
WHERE site_id = '%d' AND meta_key
|
|
LIKE '%s'", $network_id, WCL_Plugin::app()->getPrefix() . "%"));
|
|
} else {
|
|
$request = $wpdb->get_results($wpdb->prepare("
|
|
SELECT option_name, option_value
|
|
FROM {$wpdb->options}
|
|
WHERE option_name
|
|
LIKE '%s'", WCL_Plugin::app()->getPrefix() . "_%"));
|
|
}
|
|
|
|
if( !empty($request) && !empty($allow_export_options) ) {
|
|
foreach($request as $option) {
|
|
if( WCL_Plugin::app()->isNetworkActive() ) {
|
|
$option_name = $option->meta_key;
|
|
$option_value = $option->meta_value;
|
|
} else {
|
|
$option_name = $option->option_name;
|
|
$option_value = $option->option_value;
|
|
}
|
|
if( in_array($option_name, $allow_export_options) ) {
|
|
$export_options[$option_name] = $option_value;
|
|
}
|
|
}
|
|
}
|
|
|
|
if( $return == 'array' ) {
|
|
return $export_options;
|
|
}
|
|
|
|
return WCL_Helper::getEscapeJson($export_options);
|
|
}
|
|
|
|
/**
|
|
* Try to get variable from JSON-encoded post variable
|
|
*
|
|
* Note: we pass some params via json-encoded variables, as via pure post some data (ex empty array) will be absent
|
|
*
|
|
* @param string $name $_POST's variable name
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function maybeGetPostJson($name)
|
|
{
|
|
if( isset($_POST[$name]) and is_string($_POST[$name]) ) {
|
|
$result = json_decode(stripslashes($_POST[$name]), true);
|
|
if( !is_array($result) ) {
|
|
$result = array();
|
|
}
|
|
|
|
return $result;
|
|
} else {
|
|
return array();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Escape json data
|
|
* @param array $data
|
|
* @return string escaped json string
|
|
*/
|
|
public static function getEscapeJson(array $data)
|
|
{
|
|
return htmlspecialchars(json_encode($data), ENT_QUOTES, 'UTF-8');
|
|
}
|
|
|
|
/**
|
|
* Componate content for robot.txt
|
|
* @return string
|
|
*/
|
|
public static function getRightRobotTxt()
|
|
{
|
|
$cache_output = WCL_Plugin::app()->getPopulateOption('robots_txt_text_cache');
|
|
|
|
if( $cache_output ) {
|
|
return $cache_output;
|
|
}
|
|
|
|
$site_url = get_home_url();
|
|
$dir_host = preg_replace("(^https?://)", "", $site_url);
|
|
|
|
if( is_ssl() ) {
|
|
$dir_host = 'https://' . $dir_host;
|
|
}
|
|
|
|
$file_path = WCL_PLUGIN_DIR . '/templates/robots.txt';
|
|
$file = fopen($file_path, 'r');
|
|
$robot_default_content = fread($file, filesize($file_path));
|
|
fclose($file);
|
|
|
|
$output = $robot_default_content;
|
|
$output .= 'Host: ' . $dir_host . PHP_EOL;
|
|
|
|
$headers = @get_headers($site_url . '/sitemap.xml', 1);
|
|
|
|
if( strpos($headers[0], '200 OK') !== false ) {
|
|
$output .= 'Sitemap: ' . $site_url . '/sitemap.xml' . PHP_EOL;
|
|
} else if( isset($headers['Location']) && !empty($headers['Location']) ) {
|
|
$output .= 'Sitemap: ' . $headers['Location'] . PHP_EOL;
|
|
}
|
|
|
|
WCL_Plugin::app()->updatePopulateOption('robots_txt_text_cache', $output);
|
|
|
|
return $output;
|
|
}
|
|
|
|
public static function fetch_google_page_speed_audit()
|
|
{
|
|
$site_url = get_home_url();
|
|
|
|
// Check if plugin is installed in localhost
|
|
if( substr($_SERVER['REMOTE_ADDR'], 0, 4) == '127.' || $_SERVER['REMOTE_ADDR'] == '::1' ) {
|
|
$site_url = 'https://cm-wp.com/';
|
|
}
|
|
|
|
$results = [];
|
|
$strategy_arr = array(1 => 'desktop', 2 => 'mobile');
|
|
|
|
foreach($strategy_arr as $strategy_id => $strategy_text) {
|
|
$google_page_speed_call = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=" . $site_url . "&key=AIzaSyD85-8Tmp_Ixc43AgqyeLpNZNlGP150LbA&strategy=" . $strategy_text;
|
|
|
|
//Fetch data from Google PageSpeed API
|
|
$response = wp_remote_get($google_page_speed_call, array('timeout' => 30));
|
|
$response_code = wp_remote_retrieve_response_code($response);
|
|
$response_error = null;
|
|
if( is_wp_error($response) ) {
|
|
$response_error = $response->get_error_message();
|
|
} elseif( 200 !== $response_code ) {
|
|
$response_error = new WP_Error('api-error', /* translators: %d: Numeric HTTP status code, e.g. 400, 403, 500, 504, etc. */ sprintf(__('Invalid API response code (%d).'), $response_code));
|
|
}
|
|
|
|
$google_ps = json_decode(wp_remote_retrieve_body($response), true);
|
|
|
|
if( isset($google_ps['error']) ) {
|
|
wp_send_json_error([
|
|
'error' => $google_ps['error']['message'],
|
|
'code' => $google_ps['error']['code']
|
|
]);
|
|
}
|
|
|
|
if( is_wp_error($response_error) ) {
|
|
wp_send_json_error([
|
|
'error' => $response_error->get_error_message(),
|
|
'code' => $response_error->get_error_code()
|
|
]);
|
|
}
|
|
|
|
$results[$strategy_text] = [
|
|
'performance_score' => ($google_ps['lighthouseResult']['categories']['performance']['score'] * 100),
|
|
'first_contentful_paint' => $google_ps['lighthouseResult']['audits']['first-contentful-paint']['displayValue'],
|
|
'speed_index' => $google_ps['lighthouseResult']['audits']['speed-index']['displayValue'],
|
|
'interactive' => $google_ps['lighthouseResult']['audits']['interactive']['displayValue']
|
|
];
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
}
|
|
|