| 1 |
<?php |
| 2 |
/** |
| 3 |
* Plugin Name: Metricool |
| 4 |
* Plugin URI: https://metricool.com/ |
| 5 |
* Version: 1.27 |
| 6 |
* Author: Metricool |
| 7 |
* Author URI: https://www.metricool.com/ |
| 8 |
* Description: Allows you to track your users and readers using metricool.com |
| 9 |
* License: GPL2 |
| 10 |
*/ |
| 11 |
|
| 12 |
/* Copyright 2021 Metricool |
| 13 |
|
| 14 |
This program is free software; you can redistribute it and/or modify |
| 15 |
it under the terms of the GNU General Public License, version 2, as |
| 16 |
published by the Free Software Foundation. |
| 17 |
|
| 18 |
This program is distributed in the hope that it will be useful, |
| 19 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 20 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 21 |
GNU General Public License for more details. |
| 22 |
|
| 23 |
You should have received a copy of the GNU General Public License |
| 24 |
along with this program; if not, write to the Free Software |
| 25 |
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| 26 |
*/ |
| 27 |
|
| 28 |
class metricool { |
| 29 |
|
| 30 |
public $plugin; |
| 31 |
|
| 32 |
/** |
| 33 |
* Constructor |
| 34 |
*/ |
| 35 |
public function __construct() { |
| 36 |
// Plugin Details |
| 37 |
$this->plugin = new stdClass; |
| 38 |
$this->plugin->name = 'metricool'; // Plugin Folder |
| 39 |
$this->plugin->displayName = 'Metricool'; // Plugin Name |
| 40 |
$this->plugin->version = '1.18'; |
| 41 |
$this->plugin->folder = WP_PLUGIN_DIR.'/'.$this->plugin->name; // Full Path to Plugin Folder |
| 42 |
$this->plugin->url = WP_PLUGIN_URL.'/'.str_replace(basename( __FILE__),"",plugin_basename(__FILE__)); |
| 43 |
|
| 44 |
// Hooks |
| 45 |
add_action('admin_init', array(&$this, 'registerSettings')); |
| 46 |
add_action('admin_menu', array(&$this, 'adminPanelsAndMetaBoxes')); |
| 47 |
add_action('admin_bar_menu', array(&$this, 'adminCustomMenu'), 1000); |
| 48 |
|
| 49 |
// Frontend Hooks |
| 50 |
add_action('wp_footer', array(&$this, 'frontendFooter')); |
| 51 |
} |
| 52 |
|
| 53 |
/** |
| 54 |
* Register Settings |
| 55 |
*/ |
| 56 |
function registerSettings() { |
| 57 |
register_setting($this->plugin->name, 'metricool_profile_id', 'trim'); |
| 58 |
} |
| 59 |
|
| 60 |
/** |
| 61 |
* Register the plugin settings panel |
| 62 |
*/ |
| 63 |
function adminPanelsAndMetaBoxes() { |
| 64 |
add_submenu_page('options-general.php', $this->plugin->displayName, $this->plugin->displayName, 'manage_options', $this->plugin->name, array(&$this, 'adminPanel')); |
| 65 |
} |
| 66 |
|
| 67 |
/** |
| 68 |
* Output the Administration Panel |
| 69 |
* Save POSTed data from the Administration Panel into a WordPress option |
| 70 |
*/ |
| 71 |
function adminPanel() |
| 72 |
{ |
| 73 |
// Save Settings |
| 74 |
if (isset($_POST['submit'])) { |
| 75 |
// Check nonce |
| 76 |
if (!isset($_POST[$this->plugin->name . '_nonce'])) { |
| 77 |
// Missing nonce |
| 78 |
$this->errorMessage = __('nonce field is missing. Settings NOT saved.', $this->plugin->name); |
| 79 |
} elseif (!wp_verify_nonce($_POST[$this->plugin->name . '_nonce'], $this->plugin->name)) { |
| 80 |
// Invalid nonce |
| 81 |
$this->errorMessage = __('Invalid nonce specified. Settings NOT saved.', $this->plugin->name); |
| 82 |
} elseif (!preg_match('/^[a-z0-9]+$/',$_POST['metricool_profile_id'])) { |
| 83 |
// Invalid nonce |
| 84 |
$this->errorMessage = __('Invalid site TOKEN. Settings NOT saved.', $this->plugin->name); |
| 85 |
} |
| 86 |
else { |
| 87 |
// Save |
| 88 |
update_option('metricool_profile_id', $_POST['metricool_profile_id']); |
| 89 |
$this->message = __('Settings Saved.', $this->plugin->name); |
| 90 |
} |
| 91 |
} |
| 92 |
|
| 93 |
// Get latest settings |
| 94 |
$this->settings = array( |
| 95 |
'metricool_profile_id' => get_option('metricool_profile_id') |
| 96 |
); |
| 97 |
|
| 98 |
// Load Settings Form |
| 99 |
include_once(WP_PLUGIN_DIR . '/' . $this->plugin->name . '/views/settings.php'); |
| 100 |
} |
| 101 |
|
| 102 |
/** |
| 103 |
* Loads plugin textdomain |
| 104 |
*/ |
| 105 |
function loadLanguageFiles() { |
| 106 |
load_plugin_textdomain($this->plugin->name, false, $this->plugin->name.'/languages/'); |
| 107 |
} |
| 108 |
|
| 109 |
/** |
| 110 |
* Outputs script / CSS to the frontend footer |
| 111 |
*/ |
| 112 |
function frontendFooter() { |
| 113 |
$this->output('metricool_profile_id'); |
| 114 |
} |
| 115 |
|
| 116 |
/** |
| 117 |
* Outputs the given setting, if conditions are met |
| 118 |
* |
| 119 |
* @param string $setting Setting Name |
| 120 |
* @return output |
| 121 |
*/ |
| 122 |
function output($setting) |
| 123 |
{ |
| 124 |
// Ignore admin, feed, robots or trackbacks |
| 125 |
if (is_admin() or is_feed() or is_robots() or is_trackback()) { |
| 126 |
return; |
| 127 |
} |
| 128 |
|
| 129 |
// Get meta |
| 130 |
$meta = get_option($setting); |
| 131 |
if (empty($meta)) { |
| 132 |
return; |
| 133 |
} |
| 134 |
if (trim($meta) == '') { |
| 135 |
return; |
| 136 |
} |
| 137 |
|
| 138 |
if (!preg_match('/^[a-z0-9]+$/',$meta)) { |
| 139 |
return; |
| 140 |
} |
| 141 |
|
| 142 |
// Output |
| 143 |
echo stripslashes("<script>function loadScript(a){var b=document.getElementsByTagName(\"head\")[0],c=document.createElement(\"script\");c.type=\"text/javascript\",c.src=\"https://tracker.metricool.com/app/resources/be.js\",c.onreadystatechange=a,c.onload=a,b.appendChild(c)}loadScript(function(){beTracker.t({hash:'" . $meta . "'})})</script>"); |
| 144 |
} |
| 145 |
|
| 146 |
|
| 147 |
function adminCustomMenu(){ |
| 148 |
global $wp_admin_bar; |
| 149 |
|
| 150 |
if(!is_super_admin() || !is_admin_bar_showing()) return; |
| 151 |
|
| 152 |
$menu_id = "metricool_menu"; |
| 153 |
$argsParent = array( |
| 154 |
"id" => $menu_id, |
| 155 |
"title" => "Metricool", |
| 156 |
"href" => "https://metricool.com/" |
| 157 |
); |
| 158 |
$wp_admin_bar->add_menu($argsParent); |
| 159 |
|
| 160 |
$argsSub1 = array( |
| 161 |
"id" => $menu_id, |
| 162 |
"parent" => $menu_id, |
| 163 |
"title" => "Evolution stats", |
| 164 |
"href" => "https://app.metricool.com/evolution", |
| 165 |
"meta" => array("target" => "_blank") |
| 166 |
); |
| 167 |
$wp_admin_bar->add_menu($argsSub1); |
| 168 |
|
| 169 |
$argsSub2 = array( |
| 170 |
"id" => $menu_id, |
| 171 |
"parent" => $menu_id, |
| 172 |
"title" => "Real time", |
| 173 |
"href" => "https://app.metricool.com/real-time", |
| 174 |
"meta" => array("target" => "_blank") |
| 175 |
); |
| 176 |
$wp_admin_bar->add_menu($argsSub2); |
| 177 |
|
| 178 |
$argsSub3 = array( |
| 179 |
"id" => $menu_id, |
| 180 |
"parent" => $menu_id, |
| 181 |
"title" => "Planner", |
| 182 |
"href" => "https://app.metricool.com/actions", |
| 183 |
"meta" => array("target" => "_blank") |
| 184 |
); |
| 185 |
$wp_admin_bar->add_menu($argsSub3); |
| 186 |
|
| 187 |
} |
| 188 |
|
| 189 |
|
| 190 |
} |
| 191 |
|
| 192 |
$metricool = new metricool(); |
| 193 |
|
| 194 |
add_filter('plugin_action_links_'.plugin_basename(__FILE__), 'metricool_add_plugin_page_settings_link'); |
| 195 |
function metricool_add_plugin_page_settings_link( $links ) { |
| 196 |
$links[] = '<a href="' . |
| 197 |
admin_url( 'options-general.php?page=metricool' ) . |
| 198 |
'">' . __('Settings') . '</a>'; |
| 199 |
return $links; |
| 200 |
} |
| 201 |
|