*/
/*
Copyright 2016 - 2024 - Benjamin Denis (email : contact@seopress.org)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2, as
published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
// Are we being accessed directly ?
if(!defined('SITESEO_VERSION')) {
exit('Hacking Attempt !');
}
use SiteSEO\Core\Kernel;
/**
* Get a service.
*
* @since 4.3.0
*
* @param string $service
*
* @return object
*/
function siteseo_get_service($service) {
return Kernel::getContainer()->getServiceByName($service);
}
/*
* Get first key of an array if PHP < 7.3
* @since 4.2.1
* @return string
* author Softaculous
*/
function siteseo_array_key_first(array $arr) {
if (function_exists('array_key_first')) {
return array_key_first($arr);
}
foreach ($arr as $key => $unused) {
return $key;
}
return null;
}
/*
* Get last key of an array if PHP < 7.3
* @since 4.2.1
* @return string
* author Softaculous
*/
function siteseo_array_key_last(array $arr) {
if (function_exists('array_key_last')) {
return array_key_last($arr);
}
end($arr);
$key = key($arr);
return $key;
}
/**
* Get all custom fields (limit: 250).
*
* @author Softaculous
*
* @return array custom field keys
*/
function siteseo_get_custom_fields() {
$cf_keys = wp_cache_get('siteseo_get_custom_fields');
if (false === $cf_keys) {
global $wpdb;
$limit = (int) apply_filters('postmeta_form_limit', 250);
$cf_keys = $wpdb->get_col($wpdb->prepare("
SELECT DISTINCT meta_key
FROM $wpdb->postmeta
GROUP BY meta_key
HAVING meta_key NOT LIKE %s
ORDER BY meta_key
LIMIT %d", '\_%%', $limit));
if (is_plugin_active('types/wpcf.php')) {
$wpcf_fields = get_option('wpcf-fields');
if ( ! empty($wpcf_fields)) {
foreach ($wpcf_fields as $key => $value) {
$cf_keys[] = $value['meta_key'];
}
}
}
$cf_keys = apply_filters('siteseo_get_custom_fields', $cf_keys);
if ($cf_keys) {
natcasesort($cf_keys);
}
wp_cache_set('siteseo_get_custom_fields', $cf_keys);
}
return $cf_keys;
}
/**
* Check SSL for schema.org.
*
* @author Softaculous
*
* @return string correct protocol
*/
function siteseo_check_ssl() {
if (is_ssl()) {
return 'https://';
}
return 'http://';
}
/**
* Get IP address.
*
* @author Softaculous
*
* @return (string) $ip
**/
function siteseo_get_ip_address() {
foreach (['HTTP_CLIENT_IP', 'HTTP_CF_CONNECTING_IP', 'HTTP_VIA', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR'] as $key) {
if (true === array_key_exists($key, $_SERVER)) {
foreach (explode(',', sanitize_text_field(wp_unslash($_SERVER[$key]))) as $ip) {
$ip = trim($ip); // just to be safe
return apply_filters('siteseo_404_ip', $ip ? $ip : '');
}
}
}
}
/**
* Disable Query Monitor for CA.
*
* @return array
*
* author Softaculous
*
* @param mixed $url
* @param mixed $allcaps
* @param mixed $caps
* @param mixed $args
*/
function siteseo_disable_qm($allcaps, $caps, $args) {
$allcaps['view_query_monitor'] = false;
return $allcaps;
}
/**
* Clear content for CA.
*
* author Softaculous
*/
function siteseo_clean_content_analysis() {
if (current_user_can('edit_posts')) {
if (isset($_GET['no_admin_bar']) && '1' === $_GET['no_admin_bar']) {
//Remove admin bar
add_filter('show_admin_bar', '__return_false');
//Disable Query Monitor
add_filter('user_has_cap', 'siteseo_disable_qm', 10, 3);
//Disable wptexturize
add_filter('run_wptexturize', '__return_false');
//Remove Edit nofollow links from TablePress
add_filter( 'tablepress_edit_link_below_table', '__return_false');
//Oxygen compatibility
if (function_exists('ct_template_output')) {
add_action('template_redirect', 'siteseo_get_oxygen_content');
}
//Allow user to run custom action to clean content
do_action('siteseo_content_analysis_cleaning');
}
}
}
add_action('plugins_loaded', 'siteseo_clean_content_analysis');
/**
* Test if a URL is in absolute.
*
* @return bool true if absolute
*
* author Softaculous
*
* @param mixed $url
*/
function siteseo_is_absolute($url) {
$pattern = "%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu";
return (bool) preg_match($pattern, $url);
}
/**
* Manage localized links.
*
* @return string locale for documentation links
*
* author Softaculous
*/
function siteseo_get_locale() {
switch (get_user_locale(get_current_user_id())) {
case 'fr_FR':
case 'fr_BE':
case 'fr_CA':
case 'fr_LU':
case 'fr_MC':
case 'fr_CH':
$locale_link = 'fr';
break;
default:
$locale_link = '';
break;
}
return $locale_link;
}
/**
* Check empty global title template.
*
* @since 5.0
*
* @param string $type
* @param string $metadata
* @param bool $notice
*
* @return string notice with list of empty cpt titles
*
* author Softaculous
*/
function siteseo_get_empty_templates($type, $metadata, $notice = true) {
$cpt_titles_empty = [];
$templates = '';
$data = '';
$html = '';
$list = '';
if ('cpt' === $type) {
$templates = $postTypes = siteseo_get_service('WordPressData')->getPostTypes();
$notice_i18n = __('Custom Post Types', 'siteseo');
}
if ('tax' === $type) {
$templates = siteseo_get_service('WordPressData')->getTaxonomies();
$notice_i18n = __('Custom Taxonomies', 'siteseo');
}
foreach ($templates as $key => $value) {
$options = get_option('siteseo_titles_option_name');
if (!empty($options)) {
if ('cpt' === $type) {
if (!empty($options['titles_single_titles'])) {
if (!array_key_exists($key, $options['titles_single_titles'])) {
$cpt_titles_empty[] = $key;
} else {
$data = isset($options['titles_single_titles'][$key][$metadata]) ? $options['titles_single_titles'][$key][$metadata] : '';
}
}
}
if ('tax' === $type) {
if (!empty($options['titles_tax_titles'])) {
if (!array_key_exists($key, $options['titles_tax_titles'])) {
$cpt_titles_empty[] = $key;
} else {
$data = isset($options['titles_tax_titles'][$key][$metadata]) ? $options['titles_tax_titles'][$key][$metadata] : '';
}
}
}
}
if (empty($data)) {
$cpt_titles_empty[] = $key;
}
}
if ( ! empty($cpt_titles_empty)) {
$list .= '
';
foreach ($cpt_titles_empty as $cpt) {
$list .= '
';
/* translators: %s: "Custom Post Types" or "Custom Taxonomies" %s: "title" or "description" */
$html .= sprintf(__('Some %s have no meta %s set! We strongly encourage you to add one by filling in the fields below.', 'siteseo'), esc_html($notice_i18n), wp_kses_post($metadata));
$html .= '